From 9ccdb10e34599bc3be138c1fbc67344cbde8ccd7 Mon Sep 17 00:00:00 2001 From: Florian Streibelt Date: Wed, 12 Oct 2011 00:49:35 +0200 Subject: [PATCH 1/7] Userspace daemon that creates a FIFO and opens the serial port to talk to an EPSON display attached to a serial port. Implemented in C. Initial Commit of a rcs-free development. --- display-daemon/Makefile | 4 + display-daemon/ser.c | 320 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 324 insertions(+) create mode 100644 display-daemon/Makefile create mode 100644 display-daemon/ser.c diff --git a/display-daemon/Makefile b/display-daemon/Makefile new file mode 100644 index 0000000..d242e59 --- /dev/null +++ b/display-daemon/Makefile @@ -0,0 +1,4 @@ +CFLAGS=-g -Wall +ser: ser.c + gcc -ggdb -Wall ser.c -o ser -lpthread + #mipsel-linux-uclibc-gcc -o ser.mips ser.c -lpthread diff --git a/display-daemon/ser.c b/display-daemon/ser.c new file mode 100644 index 0000000..f9d6725 --- /dev/null +++ b/display-daemon/ser.c @@ -0,0 +1,320 @@ +#include /* Standard input/output definitions */ +#include /* String function definitions */ +#include /* UNIX standard function definitions */ +#include /* File control definitions */ +#include /* Error number definitions */ +#include /* POSIX terminal control definitions */ + +#include +#include +#include +#include /* Posix 1003.1c threads */ +#include +#include + + +int fd; +int screensaver; +int brightness = 4; +char *fifo; +pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; +pthread_t thread1; + +int +initport (int fd) +{ + struct termios options; + // Get the current options for the port... + tcgetattr (fd, &options); + // Set the baud rates to 9600... + cfsetispeed (&options, B9600); + cfsetospeed (&options, B9600); + // Enable the receiver and set local mode... + options.c_cflag |= (CLOCAL | CREAD); + + options.c_cflag &= ~PARENB; + options.c_cflag &= ~CSTOPB; + options.c_cflag &= ~CSIZE; + options.c_cflag |= CS8; + + // Set the new options for the port... + tcsetattr (fd, TCSANOW, &options); + return 1; +} + + +char display_init[] = { 0x1b, 0x40 }; +char display_showtime[] = { 0x1F, 0x54 }; +char display_cursor_off[] = { 0x1f, 0x43, 0x0 }; +char display_cursor_on[] = { 0x1f, 0x43, 0x1 }; + +char display_on[] = { 0x1f, 0x45, 0x0 }; +char display_off[] = { 0x1f, 0x45, 0xff }; + +char display_overwrite[] = { 0x1f, 0x01 }; +char display_vscroll[] = { 0x1f, 0x02 }; +char display_hscroll[] = { 0x1f, 0x03 }; + +char display_clear_screen[] = { 0x0c }; + +char display_time[] = {0x1f,0x55}; + +#define DWC(c) display_write(c,sizeof(c)) +#define SEND_TEXT(t) display_write(t,strlen(t)) + +#define SEND_DISPLAY_INIT DWC(display_init) +#define SEND_CURSOR_OFF DWC(display_cursor_off) +#define SEND_CURSOR_ON DWC(display_cursor_on) +#define SEND_DEFINE_TIMER DWC(display_showtime) +#define SEND_SHOW_TIMER DWC(display_time) +#define SEND_MODE_OVERWRITE DWC(display_overwrite) +#define SEND_MODE_VSCROLL DWC(display_vscroll) +#define SEND_MODE_HSCROLL DWC(display_hscroll) +#define SEND_DISPLAY_OFF DWC(display_off) +#define SEND_DISPLAY_ON DWC(display_on) +#define SEND_CLEAR DWC(display_clear_screen); + +#define TIME_BASE 200000 +#define TB_TO_SECS(x) (x*1000000/TIME_BASE) + +#define TIME_CLOCK TB_TO_SECS(5) +#define TIME_DIM TB_TO_SECS(30) +#define TIME_OFF TB_TO_SECS(120) + +#define DEVICE "/dev/ttyUSB0" + +#define PAUSEMSG "Hallo, bitte melde Dich am Barcodereader an, um das Kassensystem zu benutzen *** Angebot: Die Mate heute nur 0.75 *** " + +#define LINELEN 20 + +void +display_write (const void *buf, size_t count) +{ + pthread_mutex_lock (&mutex1); + write (fd, buf, count); + pthread_mutex_unlock (&mutex1); + +} + + +void +display_putstring (char *s) +{ + screensaver = 0; + SEND_TEXT(s); +} + + +void +showtime (void) +{ + + SEND_CURSOR_OFF; + + char c[5] = { 0x1F, 0x54, 0x00, 0x00 }; + time_t timer; // Define the timer + struct tm *tblock; // Define a structure for time block + + timer = time (NULL); + tblock = localtime (&timer); + c[2] = tblock->tm_hour; + c[3] = tblock->tm_min; + + display_write (&c, 4); + + SEND_MODE_HSCROLL; + char *msg = "Freitagsrunde 4!"; + display_write (msg, strlen (msg)); +} + +void +display_dim (short i) +{ + // return; + if (i == brightness) + { + + //printf ("display_dim: would not change brightness. abort.\n"); + + return; + } + if (i > 0 && i < 5) + { + int l = 0; + char *d; + if (brightness == 0) + { + SEND_CURSOR_OFF; + // turn display on again + SEND_DISPLAY_ON; + SEND_MODE_OVERWRITE; + char c[4] = { 0x1f, 0x58, 0x04, 0x00 }; + l = 6; + //c[5]=i; + d = c; + } + else + { + //set brightness directly: + char c[4] = { 0x1f, 0x58, 0x01, 0x00 }; + l = 3; + c[2] = i; + d = c; + //printf ("command mode: %x \n", c[2]); + } + display_write (d, l); + brightness = i; + } + else if (i == 0) + { + //turn off + SEND_DISPLAY_OFF; + brightness = i; + } +} + +void * +rthread (void *args) +{ + + int pipe; + char pc = ' '; + char c = ' '; + while (1) + { + pipe = open ("/tmp/display", O_RDONLY); + int r; + while ((r = read (pipe, &c, 1)) > 0) + { + + screensaver = 0; + + if (pc == '\n') + { + display_write (&pc, 1); + } + if (c != '\n') + { + display_write (&c, 1); + } + pc = c; + display_dim (4); + } + close (pipe); + } +} + +void +sighandler (int sig) +{ + pthread_kill (thread1, 0); + + SEND_DISPLAY_INIT; + SEND_MODE_OVERWRITE; + SEND_CURSOR_OFF; + SEND_DISPLAY_OFF; + + close (fd); + if (fifo) {unlink(fifo);} + exit (0); + //signal(sig, sighandler); +} + + +int +main (int argc, char **argv) +{ + char *devnode ; + + //TODO: arg parser! + fifo=strdup("/tmp/display"); + + if (argc != 2) + { + devnode=strdup(DEVICE); + printf ("no device specified, using default %s\n",devnode); + }else{ + devnode=strdup(argv[1]); + } + fd = open (devnode, O_RDWR | O_NOCTTY | O_NDELAY); + if (fd == -1) + { + perror (devnode); + return 1; + } + else + { + fcntl (fd, F_SETFL, 0); + } + + initport (fd); + + //init display, set, vertical scroll, cursor off + SEND_DISPLAY_INIT; + SEND_MODE_OVERWRITE; + SEND_CURSOR_OFF; + + pthread_create (&thread1, NULL, rthread, NULL); + signal (SIGINT, sighandler); + + if (mkfifo (fifo, S_IRWXU | S_IRWXG | S_IRWXO)) + { + perror (fifo); + if (errno != EEXIST && errno != ESPIPE) + { + return (1); + } + } + + + //showtime(); + display_putstring ("Display initialized "); + display_putstring (fifo); + sleep (3); + + screensaver = 0; + + while (1) + { + usleep(TIME_BASE); + //printf ("screensaver = %05d brightness: %d\n", screensaver, brightness); + if (screensaver < 10000) + { + screensaver++; + } + + if (screensaver == TIME_CLOCK) + { + showtime (); + } + if (screensaver == TIME_OFF) + { + display_dim (0); + } + + + //show a scroll text while the screensaver is active... + if ((screensaver > (TIME_CLOCK+10)) && (screensaver < TIME_OFF)){ + char *message = calloc(LINELEN+1,sizeof(char)); + strncpy(message,PAUSEMSG+((screensaver-TIME_CLOCK-1)%strlen(PAUSEMSG)),LINELEN); + int l = strlen(message); + if (l TIME_DIM) && (brightness > 1)) + { + //printf ("dimming\n"); + display_dim (brightness - 1); + } + } + + //you'll never get here + close (fd); + return 0; +} From 83c4e1441d803cbcee02f35f1ce00968701a8bd5 Mon Sep 17 00:00:00 2001 From: Florian Streibelt Date: Wed, 12 Oct 2011 01:35:07 +0200 Subject: [PATCH 2/7] one typo and one bugfix for user unknown on login --- client-barcode/freitagskasse.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/client-barcode/freitagskasse.py b/client-barcode/freitagskasse.py index 17a3b84..f053109 100644 --- a/client-barcode/freitagskasse.py +++ b/client-barcode/freitagskasse.py @@ -70,7 +70,7 @@ def delay(what, seconds): def warn_balance(): - print('Kontostrand im Minus, bitte Geld aufladen.') + print('Kontostand im Minus, bitte Geld aufladen.') def error_page(message): @@ -353,7 +353,10 @@ def handle(line, status): try: status.login(line) except urllib2.URLError as e: - error_page('FEHLER bei Kommunikation mit Server "%s"' % str(e)) + if e.code == 404: # URL not found == user unknown + error_page('FEHLER: Benutzer "%s" nicht bekannt' % line) + else: + error_page('FEHLER bei Kommunikation mit Server "%s"' % str(e)) def main(): From 8d6ff280e3b9c72c5ce834b2eb8ddeb245729872 Mon Sep 17 00:00:00 2001 From: Florian Streibelt Date: Wed, 12 Oct 2011 02:14:03 +0200 Subject: [PATCH 3/7] fix for exception handlibg if not an HTTP but URLError --- client-barcode/freitagskasse.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/client-barcode/freitagskasse.py b/client-barcode/freitagskasse.py index f053109..1f4a5c5 100644 --- a/client-barcode/freitagskasse.py +++ b/client-barcode/freitagskasse.py @@ -352,11 +352,13 @@ def handle(line, status): else: try: status.login(line) - except urllib2.URLError as e: + except urllib2.HTTPError as e: if e.code == 404: # URL not found == user unknown error_page('FEHLER: Benutzer "%s" nicht bekannt' % line) else: error_page('FEHLER bei Kommunikation mit Server "%s"' % str(e)) + except urllib2.URLError as e: + error_page('FEHLER bei Kommunikation mit Server "%s"' % str(e)) def main(): From 356c2584dbad722bebb9ebbed0947e1e26fad745 Mon Sep 17 00:00:00 2001 From: Sebastian Pipping Date: Wed, 12 Oct 2011 05:51:04 +0200 Subject: [PATCH 4/7] client-barcode: Resolve class ToGoCommand, make UNDO delete commodity/deposity combined --- client-barcode/freitagskasse.py | 133 ++++++++++--------------- client-barcode/freitagslib/commands.py | 82 +++++++++------ 2 files changed, 101 insertions(+), 114 deletions(-) diff --git a/client-barcode/freitagskasse.py b/client-barcode/freitagskasse.py index 1f4a5c5..edc2045 100644 --- a/client-barcode/freitagskasse.py +++ b/client-barcode/freitagskasse.py @@ -6,7 +6,7 @@ from __future__ import print_function import freitagslib.network as net -from freitagslib.commands import BuyCommand, DepositCommand, ToGoCommand +from freitagslib.commands import BuyCommand, DepositCommand import colorama from colorama import Fore, Style @@ -98,22 +98,14 @@ class Status: def color(amount): return COLOR_WITHDRAW if amount < 0 else COLOR_DEPOSIT - def color_command(command): - diff = command.difference() - if diff >= 0: - return COLOR_DEPOSIT - return COLOR_TO_GO if isinstance(command, ToGoCommand) else COLOR_WITHDRAW - def show_total(balance, plus=' '): print('%3s %-40s %s%c %6.2f Euro%s' \ % ('', '', color(balance), sign(balance, plus), abs(balance), COLOR_RESET)) - def show_item(position, command): - diff = command.difference() - label = command.label() + def show_item(position, diff, label, color): print('%2d) %-40s %s%c %6.2f Euro%s' \ - % (position, label, color_command(command), sign(diff), + % (position, label, color, sign(diff), abs(diff), COLOR_RESET)) def show_bar(): @@ -127,8 +119,18 @@ class Status: print('Geplante Änderungen:') show_total(initial_balance) - for i, (command, balance_backup) in enumerate(self.transfers): - show_item(i + 1, command) + i = 1 + for command, dummy in self.transfers: + if isinstance(command, BuyCommand): + if (command.includes_commodity()): + show_item(i, -command.commodity_value(), command.commodity_label(), COLOR_WITHDRAW) + i += 1 + if (command.includes_deposit()): + show_item(i, -command.deposit_value(), command.deposit_label(), COLOR_TO_GO) + i += 1 + else: + show_item(i, command.difference(), command.label(), COLOR_DEPOSIT) + i += 1 show_bar() if len(self.transfers) > 1: show_total(self.balance - initial_balance, plus='+') @@ -215,109 +217,78 @@ class Status: if scope == TO_GO_ALL: """ - Adds a ToGoCommands for each BuyCommands with deposit > 0 lacking a pair + Makes all BuyCommands with deposit > 0 include deposit + ...and updates future balance accordingly. """ - after = list() dummy, initial_balance = self.transfers[0] balance_before = initial_balance - def body(prev, command, balance_before): - if isinstance(prev, BuyCommand) \ - and prev.deposit() > 0 \ - and (not isinstance(command, ToGoCommand) \ - or (isinstance(command, ToGoCommand) \ - and prev.item() != command.item())): - to_go = ToGoCommand(prev.item()) - prev.set_to_go(True) - after.append((to_go, balance_before)) - balance_before += to_go.difference() - if command is not None: - after.append((command, balance_before)) - balance_before += command.difference() - return balance_before - - prev = None - for command, dummy in list(self.transfers): - balance_before = body(prev, command, balance_before) - prev = command - balance_before = body(prev, None, balance_before) + for command, dummy in self.transfers: + if isinstance(command, BuyCommand) \ + and not command.includes_deposit() \ + and command.deposit_value() > 0: + command.include_deposit(True) + balance_before += command.difference() self.balance = balance_before - self.transfers = after elif scope == TO_GO_NONE: """ - Deletes all ToGoCommands + Makes all BuyCommands that include commodity + not include deposit any more + ...and updates future balance accordingly. """ - after = list() first_command, initial_balance = self.transfers[0] balance_before = initial_balance - for command, dummy in list(self.transfers): + for command, dummy in self.transfers: if isinstance(command, BuyCommand) \ - and command.is_to_go(): - command.set_to_go(False) - elif isinstance(command, ToGoCommand): - continue - after.append((command, balance_before)) + and command.includes_commodity(): + command.include_deposit(False) balance_before += command.difference() self.balance = balance_before - self.transfers = after elif scope == TO_GO_PREV: """ - Adds a ToGoCommand after previous BuyCommand + Makes the last BuyCommand include deposit + ...and updates future balance accordingly. """ prev, balance_backup = self.transfers[-1] if not isinstance(prev, BuyCommand): error_page(_PRODUCT_FIRST) return - to_go = ToGoCommand(prev.item()) - prev.set_to_go(True) - self.transfers.append((to_go, self.balance)) - self.balance += to_go.difference() + if prev.includes_deposit(): + error_page('FEHLER: Pfand für Produkt "%s" bereits aktiviert' % prev.item_name()) + return + if prev.deposit_value() <= 0: + error_page('FEHLER: Produkt "%s" hat kein Pfand' % prev.item_name()) + return + before = prev.difference() + prev.include_deposit(True) + after = prev.difference() + self.balance += (after - before) elif scope == TO_GO_ONLY: """ - Replace all BuyCommands with deposit > 0 by - a ToGoCommand. Resolve ToGoCommand duplicates. + Makes all BuyCommand that include commodity + be deposit only + ...and updates future balance accordingly. """ - after = list() - first_command, initial_balance = self.transfers[0] + dummy, initial_balance = self.transfers[0] balance_before = initial_balance - for command, dummy in list(self.transfers): - if isinstance(command, ToGoCommand) \ - and prev_item is not None \ - and command.item() == prev_item: - """ - Skip this very duplicate - """ - prev_item = None - continue - elif isinstance(command, BuyCommand) \ - and command.deposit() > 0: - """ - Replace by ToGoCommand - """ - item = command.item() - command = ToGoCommand(item) - prev_item = item - else: - prev_item = None - after.append((command, balance_before)) + for command, dummy in self.transfers: + if isinstance(command, BuyCommand) \ + and command.deposit_value() > 0 \ + and command.includes_commodity(): + command.include_commodity(False) + command.include_deposit(True) balance_before += command.difference() self.balance = balance_before - self.transfers = after def undo(self): assert(self.logged_in()) if self.transfers: - (last_command, balance_backup) = self.transfers[-1] - if isinstance(last_command, ToGoCommand) \ - and self.transfers: - second_last_command = self.transfers[-2] - if isinstance(second_last_command, BuyCommand): - second_last_command.set_to_go(False) + dummy, balance_backup = self.transfers[-1] self.transfers.pop() self.balance = balance_backup else: diff --git a/client-barcode/freitagslib/commands.py b/client-barcode/freitagslib/commands.py index 48f0934..333ead8 100644 --- a/client-barcode/freitagslib/commands.py +++ b/client-barcode/freitagslib/commands.py @@ -5,18 +5,16 @@ # Licensed under GPL v3 or later import freitagslib.network as net -from freitagslib.network import ITEM_ONLY, DEPOSIT_ONLY +from freitagslib.network import ITEM_ONLY, DEPOSIT_ONLY, ITEM_AND_DEPOSIT -class Command(object): - def difference(self): - return self._difference - - -class DepositCommand(Command): +class DepositCommand(object): def __init__(self, amount): self._difference = amount + def difference(self): + self._difference + def run(self, user_name): net.deposit(self._difference, net.DEPOSIT_CASH, user_name) @@ -24,43 +22,61 @@ class DepositCommand(Command): return '%.2f Euro einzahlen' % self._difference -class _ItemBasedCommand(Command): +class BuyCommand(object): def __init__(self, item): self._item = item + self._commodity = True + self._deposit = False + + def _what_to_buy(self): + if self._deposit and self._commodity: + return ITEM_AND_DEPOSIT + elif self._deposit: + return DEPOSIT_ONLY + elif self._commodity: + return ITEM_ONLY + else: + raise ValueError("BuyCommand in illegal state") - def item(self): - return self._item - - -class BuyCommand(_ItemBasedCommand): - def __init__(self, item): - super(BuyCommand, self).__init__(item) - self._difference = -item.price - self._to_go = False ## TODO session state, instead? + def difference(self): + if self._deposit and self._commodity: + return -(self._item.price + self._item.deposit) + elif self._deposit: + return -(self._item.deposit) + elif self._commodity: + return -(self._item.price) + else: + raise ValueError("BuyCommand in illegal state") def run(self, user_name): - net.buy_item(self._item.id, what_about_it=ITEM_ONLY, user_name=user_name) + net.buy_item(self._item.id, what_about_it=self._what_to_buy(), user_name=user_name) - def label(self): + def item_name(self): return self._item.name - def is_to_go(self): - return self._to_go + def commodity_label(self): + if self._deposit: + return self._item.name + else: + return "%s (exkl. Pfand)" % self._item.name - def set_to_go(self, to_go): - self._to_go = to_go + def deposit_label(self): + return '%s Pfand' % self._item.name - def deposit(self): - return self._item.deposit + def includes_commodity(self): + return self._commodity + def includes_deposit(self): + return self._deposit -class ToGoCommand(_ItemBasedCommand): - def __init__(self, item): - super(ToGoCommand, self).__init__(item) - self._difference = -item.deposit + def include_commodity(self, commodity): + self._commodity = commodity - def run(self, user_name): - net.buy_item(self._item.id, what_about_it=DEPOSIT_ONLY, user_name=user_name) + def include_deposit(self, deposit): + self._deposit = deposit - def label(self): - return '%s Pfand' % self._item.name + def commodity_value(self): + return self._item.price + + def deposit_value(self): + return self._item.deposit From 9a0206da97e887d699083a233211a91a6ad45d6e Mon Sep 17 00:00:00 2001 From: Sebastian Pipping Date: Wed, 12 Oct 2011 16:02:08 +0200 Subject: [PATCH 5/7] Remove unused COLOR_WARN --- client-barcode/freitagskasse.py | 1 - 1 file changed, 1 deletion(-) diff --git a/client-barcode/freitagskasse.py b/client-barcode/freitagskasse.py index edc2045..f18b08a 100644 --- a/client-barcode/freitagskasse.py +++ b/client-barcode/freitagskasse.py @@ -19,7 +19,6 @@ import time import urllib2 -COLOR_WARN = Fore.YELLOW COLOR_ERROR = Fore.RED COLOR_DEPOSIT = Fore.GREEN + Style.BRIGHT COLOR_TO_GO = Fore.MAGENTA + Style.BRIGHT From 255c08d6c33d7d4340802a0094445562b21c9717 Mon Sep 17 00:00:00 2001 From: Sebastian Pipping Date: Wed, 12 Oct 2011 16:06:03 +0200 Subject: [PATCH 6/7] Show hint on Plugin permissions if user unknown --- client-barcode/freitagskasse.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/client-barcode/freitagskasse.py b/client-barcode/freitagskasse.py index f18b08a..0d16bf5 100644 --- a/client-barcode/freitagskasse.py +++ b/client-barcode/freitagskasse.py @@ -19,6 +19,7 @@ import time import urllib2 +COLOR_HINT = Fore.YELLOW + Style.BRIGHT COLOR_ERROR = Fore.RED COLOR_DEPOSIT = Fore.GREEN + Style.BRIGHT COLOR_TO_GO = Fore.MAGENTA + Style.BRIGHT @@ -72,11 +73,16 @@ def warn_balance(): print('Kontostand im Minus, bitte Geld aufladen.') -def error_page(message): +def error_page(error_message, hint_message=None): clear() - print(COLOR_ERROR + message + COLOR_RESET) + print(COLOR_ERROR + error_message + COLOR_RESET) print() - delay('Weiter', 3) + delay_seconds = 3 + if hint_message is not None: + print(COLOR_HINT + hint_message + COLOR_RESET) + print() + delay_seconds += 3 + delay('Weiter', delay_seconds) class Status: @@ -324,7 +330,10 @@ def handle(line, status): status.login(line) except urllib2.HTTPError as e: if e.code == 404: # URL not found == user unknown - error_page('FEHLER: Benutzer "%s" nicht bekannt' % line) + error_page('FEHLER: Benutzer "%s" nicht bekannt' % line, + hint_message='Ist in der WebApp unter "Einstellungen" ' \ + 'für Ihren Account Plugin "BarcodePlugin" ' \ + 'als erlaubt markiert?') else: error_page('FEHLER bei Kommunikation mit Server "%s"' % str(e)) except urllib2.URLError as e: From f5f1b25bc06e2e639f3bf636a28f2a52efed27cd Mon Sep 17 00:00:00 2001 From: Sebastian Pipping Date: Wed, 12 Oct 2011 16:50:37 +0200 Subject: [PATCH 7/7] client-barcode: Update howto sheet to include to-go codes --- client-barcode/doc/codes/code93-to-go-all.eps | 409 +++ .../doc/codes/code93-to-go-none.eps | 409 +++ .../doc/codes/code93-to-go-only.eps | 409 +++ .../doc/codes/code93-to-go-prev.eps | 409 +++ client-barcode/doc/freitagskasse.svg | 2320 ++++++++--------- 5 files changed, 2732 insertions(+), 1224 deletions(-) create mode 100644 client-barcode/doc/codes/code93-to-go-all.eps create mode 100644 client-barcode/doc/codes/code93-to-go-none.eps create mode 100644 client-barcode/doc/codes/code93-to-go-only.eps create mode 100644 client-barcode/doc/codes/code93-to-go-prev.eps diff --git a/client-barcode/doc/codes/code93-to-go-all.eps b/client-barcode/doc/codes/code93-to-go-all.eps new file mode 100644 index 0000000..5741033 --- /dev/null +++ b/client-barcode/doc/codes/code93-to-go-all.eps @@ -0,0 +1,409 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Creator: Terry Burton +%%BoundingBox: 50 40 168 122 +%%EndComments +%%EndProlog + +currentglobal +true setglobal +/Generic /Category findresource +dup length 1 add dict copy +dup /InstanceType /packedarraytype put +/uk.co.terryburton.bwipp exch /Category defineresource pop +setglobal + +/setpacking where {pop currentpacking true setpacking} if +1 dict +begin +/renlinear { + + 20 dict begin % Confine variables to local scope + + /args exch def % We are given some arguments + + % Default options + /sbs [] def + /bhs [] def + /bbs [] def + /txt [] def + /barcolor (unset) def + /includetext false def + /textcolor (unset) def + /textxalign (unset) def + /textyalign (unset) def + /textfont (Courier) def + /textsize 10 def + /textxoffset 0 def + /textyoffset 0 def + /textgaps 0 def + /alttext () def + /bordercolor (unset) def + /backgroundcolor (unset) def + /inkspread 0.15 def + /width 0 def + /barratio 1 def + /spaceratio 1 def + /showborder false def + /borderleft 10 def + /borderright 10 def + /bordertop 1 def + /borderbottom 1 def + /borderwidth 0.5 def + /guardwhitespace false def + /guardleftpos 0 def + /guardleftypos 0 def + /guardrightpos 0 def + /guardrightypos 0 def + /guardwidth 6 def + /guardheight 7 def + + % Apply the renderer options and the user options + args {def} forall + opt {def} forall + + /barcolor barcolor cvlit def + /textcolor textcolor cvlit def + /textxalign textxalign cvlit def + /textyalign textyalign cvlit def + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /textgaps textgaps cvr def + /alttext alttext cvlit def + /bordercolor bordercolor cvlit def + /backgroundcolor backgroundcolor cvlit def + /inkspread inkspread cvr def + /width width cvr def + /barratio barratio cvr def + /spaceratio spaceratio cvr def + /borderleft borderleft cvr def + /borderright borderright cvr def + /bordertop bordertop cvr def + /borderbottom borderbottom cvr def + /borderwidth borderwidth cvr def + /guardleftpos guardleftpos cvr def + /guardleftypos guardleftypos cvr def + /guardrightpos guardrightpos cvr def + /guardrightypos guardrightypos cvr def + /guardwidth guardwidth cvr def + /guardheight guardheight cvr def + + % Create bar elements and put them into the bars array + /bars sbs length 1 add 2 idiv array def + /x 0.00 def /maxh 0 def + 0 1 sbs length 1 add 2 idiv 2 mul 2 sub { + /i exch def + i 2 mod 0 eq { % i is even + /d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1 + sbs i get 0 ne { + /h bhs i 2 idiv get 72 mul def % Height from bhs + /c d 2 div x add def % Centre of the bar = x + d/2 + /y bbs i 2 idiv get 72 mul def % Baseline from bbs + /w d inkspread sub def % bar width = digit - inkspread + bars i 2 idiv [h c y w] put % Add the bar entry + h y add maxh gt {/maxh h y add def} if + } { + bars i 2 idiv -1 put % Dummy entry + } ifelse + } { + /d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1 + } ifelse + /x x d add def % x+=d + } for + + gsave + + currentpoint translate + + % Force symbol to given width + width 0 ne { + width 72 mul x div 1 scale + } if + + % Set RGB or CMYK color depending on length of given hex string + /setanycolor { + /anycolor exch def + anycolor length 6 eq { + (< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor + } if + anycolor length 8 eq { + (< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor + } if + } bind def + + % Display the border and background + newpath + borderleft neg borderbottom neg moveto + x borderleft add borderright add 0 rlineto + 0 maxh borderbottom add bordertop add rlineto + x borderleft add borderright add neg 0 rlineto + 0 maxh borderbottom add bordertop add neg rlineto + closepath + backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if + showborder { + gsave + bordercolor (unset) ne { bordercolor setanycolor } if + borderwidth setlinewidth stroke + grestore + } if + + % Display the bars for elements in the bars array + gsave + 0 setlinecap + barcolor (unset) ne { barcolor setanycolor } if + bars { + dup -1 ne { + aload pop newpath setlinewidth moveto 0 exch rlineto stroke + } { + pop + } ifelse + } forall + grestore + + % Display the text for elements in the text array + textcolor (unset) ne { textcolor setanycolor } if + includetext { + textxalign (unset) eq textyalign (unset) eq and alttext () eq and { + /s 0 def /f () def + txt { + {} forall + 2 copy s ne exch f ne or { + 2 copy /s exch def /f exch def + exch findfont exch scalefont setfont + } { + pop pop + } ifelse + moveto show + } forall + } { + textfont findfont textsize scalefont setfont + alttext () eq { + /txt [ txt { 0 get {} forall } forall ] def + /tstr txt length string def + 0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for + } { + /tstr alttext def + } ifelse + + % Find true ascent of font + tstr length 0 eq { + 0 + } { + gsave + newpath 0 0 moveto (0) false charpath pathbbox + 4 1 roll pop pop pop + grestore + currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse + currentfont /StrokeWidth known and { + currentfont /StrokeWidth get 2 div 0 exch + currentfont /FontMatrix get dtransform + dup mul exch dup mul add sqrt + add + } if + } ifelse + /textascent exch def + /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def + + /textxpos textxoffset x textwidth sub 2 div add def + textxalign (left) eq { /textxpos textxoffset def } if + textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if + textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if + textxalign (offright) eq { /textxpos x textxoffset add def } if + textxalign (justify) eq textwidth x lt and { + /textxpos 0 def + /textgaps x textwidth sub tstr length 1 sub div def + } if + /textypos textyoffset textascent add 1 add neg def + textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if + textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if + textxpos textypos moveto textgaps 0 tstr ashow + } ifelse + } if + + % Display the guard elements + guardwhitespace { + 0.75 setlinewidth + guardleftpos 0 ne { + newpath + guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto + guardwidth neg guardheight -2 div rlineto + guardwidth guardheight -2 div rlineto + stroke + } if + guardrightpos 0 ne { + newpath + guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto + guardwidth guardheight -2 div rlineto + guardwidth neg guardheight -2 div rlineto + stroke + } if + } if + + grestore + + end + +} bind def +/renlinear dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +% --DESC: Code 93 +% --EXAM: THIS IS CODE 93 +% --EXOP: includetext includecheck +% --RNDR: renlinear +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/code93 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includecheck false def % Enable/disable checkdigit + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + /parsefnc false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + /encs + [ (131112) (111213) (111312) (111411) (121113) + (121212) (121311) (111114) (131211) (141111) + (211113) (211212) (211311) (221112) (221211) + (231111) (112113) (112212) (112311) (122112) + (132111) (111123) (111222) (111321) (121122) + (131121) (212112) (212211) (211122) (211221) + (221121) (222111) (112122) (112221) (122121) + (123111) (121131) (311112) (311211) (321111) + (112131) (113121) (211131) (121221) (312111) + (311121) (122211) (111141) (1111411) + ] def + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def + + /barlen barcode length def + + % Special function characters + /sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def + /fncvals << + (SFT$) sft1 + (SFT%) sft2 + (SFT/) sft3 + (SFT+) sft4 + >> def + + % Convert input into bytes accounting for shift characters + /msg barlen array def + /i 0 def /j 0 def { + i barlen eq {exit} if + /char barcode i get def + parsefnc char 94 eq and i barlen 4 sub lt and { + barcode i 1 add get 94 ne { + /char fncvals barcode i 1 add 4 getinterval get def + /i i 4 add def + } { + /i i 1 add def + } ifelse + } if + msg j char put + /i i 1 add def + /j j 1 add def + } loop + /msg msg 0 j getinterval def + /msglen msg length def + + includecheck { + /sbs msglen 6 mul 25 add string def + } { + /sbs msglen 6 mul 13 add string def + } ifelse + /txt msglen array def + + % Put the start character + sbs 0 encs 47 get putinterval + + /checksum1 0 def /checksum2 0 def + 0 1 msglen 1 sub { + /i exch def + % Lookup the encoding for the each barcode character + msg i get dup 0 lt { + 42 exch sub /indx exch def + /char ( ) def + } { + 1 string dup 0 4 -1 roll put /char exch def + barchars char search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + } ifelse + /enc encs indx get def % Get the indxth encoding + sbs i 6 mul 6 add enc putinterval % Put encoded digit into sbs + txt i [char i 9 mul 9 add textyoffset textfont textsize] put + /checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def + /checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def + } for + + includecheck { + % Put the first checksum character + /checksum1 checksum1 47 mod def + /checksum2 checksum2 checksum1 add 47 mod def + sbs msglen 6 mul 6 add encs checksum1 get putinterval + sbs msglen 6 mul 12 add encs checksum2 get putinterval + % Put the end character + sbs msglen 6 mul 18 add encs 48 get putinterval + } { + % Put the end character + sbs msglen 6 mul 6 add encs 48 get putinterval + } ifelse + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/code93 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +gsave +50 50 translate +0 0 moveto <544f20474f20414c4c> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec +grestore + +showpage diff --git a/client-barcode/doc/codes/code93-to-go-none.eps b/client-barcode/doc/codes/code93-to-go-none.eps new file mode 100644 index 0000000..473b138 --- /dev/null +++ b/client-barcode/doc/codes/code93-to-go-none.eps @@ -0,0 +1,409 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Creator: Terry Burton +%%BoundingBox: 50 40 177 122 +%%EndComments +%%EndProlog + +currentglobal +true setglobal +/Generic /Category findresource +dup length 1 add dict copy +dup /InstanceType /packedarraytype put +/uk.co.terryburton.bwipp exch /Category defineresource pop +setglobal + +/setpacking where {pop currentpacking true setpacking} if +1 dict +begin +/renlinear { + + 20 dict begin % Confine variables to local scope + + /args exch def % We are given some arguments + + % Default options + /sbs [] def + /bhs [] def + /bbs [] def + /txt [] def + /barcolor (unset) def + /includetext false def + /textcolor (unset) def + /textxalign (unset) def + /textyalign (unset) def + /textfont (Courier) def + /textsize 10 def + /textxoffset 0 def + /textyoffset 0 def + /textgaps 0 def + /alttext () def + /bordercolor (unset) def + /backgroundcolor (unset) def + /inkspread 0.15 def + /width 0 def + /barratio 1 def + /spaceratio 1 def + /showborder false def + /borderleft 10 def + /borderright 10 def + /bordertop 1 def + /borderbottom 1 def + /borderwidth 0.5 def + /guardwhitespace false def + /guardleftpos 0 def + /guardleftypos 0 def + /guardrightpos 0 def + /guardrightypos 0 def + /guardwidth 6 def + /guardheight 7 def + + % Apply the renderer options and the user options + args {def} forall + opt {def} forall + + /barcolor barcolor cvlit def + /textcolor textcolor cvlit def + /textxalign textxalign cvlit def + /textyalign textyalign cvlit def + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /textgaps textgaps cvr def + /alttext alttext cvlit def + /bordercolor bordercolor cvlit def + /backgroundcolor backgroundcolor cvlit def + /inkspread inkspread cvr def + /width width cvr def + /barratio barratio cvr def + /spaceratio spaceratio cvr def + /borderleft borderleft cvr def + /borderright borderright cvr def + /bordertop bordertop cvr def + /borderbottom borderbottom cvr def + /borderwidth borderwidth cvr def + /guardleftpos guardleftpos cvr def + /guardleftypos guardleftypos cvr def + /guardrightpos guardrightpos cvr def + /guardrightypos guardrightypos cvr def + /guardwidth guardwidth cvr def + /guardheight guardheight cvr def + + % Create bar elements and put them into the bars array + /bars sbs length 1 add 2 idiv array def + /x 0.00 def /maxh 0 def + 0 1 sbs length 1 add 2 idiv 2 mul 2 sub { + /i exch def + i 2 mod 0 eq { % i is even + /d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1 + sbs i get 0 ne { + /h bhs i 2 idiv get 72 mul def % Height from bhs + /c d 2 div x add def % Centre of the bar = x + d/2 + /y bbs i 2 idiv get 72 mul def % Baseline from bbs + /w d inkspread sub def % bar width = digit - inkspread + bars i 2 idiv [h c y w] put % Add the bar entry + h y add maxh gt {/maxh h y add def} if + } { + bars i 2 idiv -1 put % Dummy entry + } ifelse + } { + /d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1 + } ifelse + /x x d add def % x+=d + } for + + gsave + + currentpoint translate + + % Force symbol to given width + width 0 ne { + width 72 mul x div 1 scale + } if + + % Set RGB or CMYK color depending on length of given hex string + /setanycolor { + /anycolor exch def + anycolor length 6 eq { + (< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor + } if + anycolor length 8 eq { + (< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor + } if + } bind def + + % Display the border and background + newpath + borderleft neg borderbottom neg moveto + x borderleft add borderright add 0 rlineto + 0 maxh borderbottom add bordertop add rlineto + x borderleft add borderright add neg 0 rlineto + 0 maxh borderbottom add bordertop add neg rlineto + closepath + backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if + showborder { + gsave + bordercolor (unset) ne { bordercolor setanycolor } if + borderwidth setlinewidth stroke + grestore + } if + + % Display the bars for elements in the bars array + gsave + 0 setlinecap + barcolor (unset) ne { barcolor setanycolor } if + bars { + dup -1 ne { + aload pop newpath setlinewidth moveto 0 exch rlineto stroke + } { + pop + } ifelse + } forall + grestore + + % Display the text for elements in the text array + textcolor (unset) ne { textcolor setanycolor } if + includetext { + textxalign (unset) eq textyalign (unset) eq and alttext () eq and { + /s 0 def /f () def + txt { + {} forall + 2 copy s ne exch f ne or { + 2 copy /s exch def /f exch def + exch findfont exch scalefont setfont + } { + pop pop + } ifelse + moveto show + } forall + } { + textfont findfont textsize scalefont setfont + alttext () eq { + /txt [ txt { 0 get {} forall } forall ] def + /tstr txt length string def + 0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for + } { + /tstr alttext def + } ifelse + + % Find true ascent of font + tstr length 0 eq { + 0 + } { + gsave + newpath 0 0 moveto (0) false charpath pathbbox + 4 1 roll pop pop pop + grestore + currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse + currentfont /StrokeWidth known and { + currentfont /StrokeWidth get 2 div 0 exch + currentfont /FontMatrix get dtransform + dup mul exch dup mul add sqrt + add + } if + } ifelse + /textascent exch def + /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def + + /textxpos textxoffset x textwidth sub 2 div add def + textxalign (left) eq { /textxpos textxoffset def } if + textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if + textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if + textxalign (offright) eq { /textxpos x textxoffset add def } if + textxalign (justify) eq textwidth x lt and { + /textxpos 0 def + /textgaps x textwidth sub tstr length 1 sub div def + } if + /textypos textyoffset textascent add 1 add neg def + textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if + textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if + textxpos textypos moveto textgaps 0 tstr ashow + } ifelse + } if + + % Display the guard elements + guardwhitespace { + 0.75 setlinewidth + guardleftpos 0 ne { + newpath + guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto + guardwidth neg guardheight -2 div rlineto + guardwidth guardheight -2 div rlineto + stroke + } if + guardrightpos 0 ne { + newpath + guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto + guardwidth guardheight -2 div rlineto + guardwidth neg guardheight -2 div rlineto + stroke + } if + } if + + grestore + + end + +} bind def +/renlinear dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +% --DESC: Code 93 +% --EXAM: THIS IS CODE 93 +% --EXOP: includetext includecheck +% --RNDR: renlinear +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/code93 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includecheck false def % Enable/disable checkdigit + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + /parsefnc false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + /encs + [ (131112) (111213) (111312) (111411) (121113) + (121212) (121311) (111114) (131211) (141111) + (211113) (211212) (211311) (221112) (221211) + (231111) (112113) (112212) (112311) (122112) + (132111) (111123) (111222) (111321) (121122) + (131121) (212112) (212211) (211122) (211221) + (221121) (222111) (112122) (112221) (122121) + (123111) (121131) (311112) (311211) (321111) + (112131) (113121) (211131) (121221) (312111) + (311121) (122211) (111141) (1111411) + ] def + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def + + /barlen barcode length def + + % Special function characters + /sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def + /fncvals << + (SFT$) sft1 + (SFT%) sft2 + (SFT/) sft3 + (SFT+) sft4 + >> def + + % Convert input into bytes accounting for shift characters + /msg barlen array def + /i 0 def /j 0 def { + i barlen eq {exit} if + /char barcode i get def + parsefnc char 94 eq and i barlen 4 sub lt and { + barcode i 1 add get 94 ne { + /char fncvals barcode i 1 add 4 getinterval get def + /i i 4 add def + } { + /i i 1 add def + } ifelse + } if + msg j char put + /i i 1 add def + /j j 1 add def + } loop + /msg msg 0 j getinterval def + /msglen msg length def + + includecheck { + /sbs msglen 6 mul 25 add string def + } { + /sbs msglen 6 mul 13 add string def + } ifelse + /txt msglen array def + + % Put the start character + sbs 0 encs 47 get putinterval + + /checksum1 0 def /checksum2 0 def + 0 1 msglen 1 sub { + /i exch def + % Lookup the encoding for the each barcode character + msg i get dup 0 lt { + 42 exch sub /indx exch def + /char ( ) def + } { + 1 string dup 0 4 -1 roll put /char exch def + barchars char search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + } ifelse + /enc encs indx get def % Get the indxth encoding + sbs i 6 mul 6 add enc putinterval % Put encoded digit into sbs + txt i [char i 9 mul 9 add textyoffset textfont textsize] put + /checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def + /checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def + } for + + includecheck { + % Put the first checksum character + /checksum1 checksum1 47 mod def + /checksum2 checksum2 checksum1 add 47 mod def + sbs msglen 6 mul 6 add encs checksum1 get putinterval + sbs msglen 6 mul 12 add encs checksum2 get putinterval + % Put the end character + sbs msglen 6 mul 18 add encs 48 get putinterval + } { + % Put the end character + sbs msglen 6 mul 6 add encs 48 get putinterval + } ifelse + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/code93 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +gsave +50 50 translate +0 0 moveto <544f20474f204e4f4e45> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec +grestore + +showpage diff --git a/client-barcode/doc/codes/code93-to-go-only.eps b/client-barcode/doc/codes/code93-to-go-only.eps new file mode 100644 index 0000000..fba752c --- /dev/null +++ b/client-barcode/doc/codes/code93-to-go-only.eps @@ -0,0 +1,409 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Creator: Terry Burton +%%BoundingBox: 50 40 177 122 +%%EndComments +%%EndProlog + +currentglobal +true setglobal +/Generic /Category findresource +dup length 1 add dict copy +dup /InstanceType /packedarraytype put +/uk.co.terryburton.bwipp exch /Category defineresource pop +setglobal + +/setpacking where {pop currentpacking true setpacking} if +1 dict +begin +/renlinear { + + 20 dict begin % Confine variables to local scope + + /args exch def % We are given some arguments + + % Default options + /sbs [] def + /bhs [] def + /bbs [] def + /txt [] def + /barcolor (unset) def + /includetext false def + /textcolor (unset) def + /textxalign (unset) def + /textyalign (unset) def + /textfont (Courier) def + /textsize 10 def + /textxoffset 0 def + /textyoffset 0 def + /textgaps 0 def + /alttext () def + /bordercolor (unset) def + /backgroundcolor (unset) def + /inkspread 0.15 def + /width 0 def + /barratio 1 def + /spaceratio 1 def + /showborder false def + /borderleft 10 def + /borderright 10 def + /bordertop 1 def + /borderbottom 1 def + /borderwidth 0.5 def + /guardwhitespace false def + /guardleftpos 0 def + /guardleftypos 0 def + /guardrightpos 0 def + /guardrightypos 0 def + /guardwidth 6 def + /guardheight 7 def + + % Apply the renderer options and the user options + args {def} forall + opt {def} forall + + /barcolor barcolor cvlit def + /textcolor textcolor cvlit def + /textxalign textxalign cvlit def + /textyalign textyalign cvlit def + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /textgaps textgaps cvr def + /alttext alttext cvlit def + /bordercolor bordercolor cvlit def + /backgroundcolor backgroundcolor cvlit def + /inkspread inkspread cvr def + /width width cvr def + /barratio barratio cvr def + /spaceratio spaceratio cvr def + /borderleft borderleft cvr def + /borderright borderright cvr def + /bordertop bordertop cvr def + /borderbottom borderbottom cvr def + /borderwidth borderwidth cvr def + /guardleftpos guardleftpos cvr def + /guardleftypos guardleftypos cvr def + /guardrightpos guardrightpos cvr def + /guardrightypos guardrightypos cvr def + /guardwidth guardwidth cvr def + /guardheight guardheight cvr def + + % Create bar elements and put them into the bars array + /bars sbs length 1 add 2 idiv array def + /x 0.00 def /maxh 0 def + 0 1 sbs length 1 add 2 idiv 2 mul 2 sub { + /i exch def + i 2 mod 0 eq { % i is even + /d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1 + sbs i get 0 ne { + /h bhs i 2 idiv get 72 mul def % Height from bhs + /c d 2 div x add def % Centre of the bar = x + d/2 + /y bbs i 2 idiv get 72 mul def % Baseline from bbs + /w d inkspread sub def % bar width = digit - inkspread + bars i 2 idiv [h c y w] put % Add the bar entry + h y add maxh gt {/maxh h y add def} if + } { + bars i 2 idiv -1 put % Dummy entry + } ifelse + } { + /d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1 + } ifelse + /x x d add def % x+=d + } for + + gsave + + currentpoint translate + + % Force symbol to given width + width 0 ne { + width 72 mul x div 1 scale + } if + + % Set RGB or CMYK color depending on length of given hex string + /setanycolor { + /anycolor exch def + anycolor length 6 eq { + (< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor + } if + anycolor length 8 eq { + (< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor + } if + } bind def + + % Display the border and background + newpath + borderleft neg borderbottom neg moveto + x borderleft add borderright add 0 rlineto + 0 maxh borderbottom add bordertop add rlineto + x borderleft add borderright add neg 0 rlineto + 0 maxh borderbottom add bordertop add neg rlineto + closepath + backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if + showborder { + gsave + bordercolor (unset) ne { bordercolor setanycolor } if + borderwidth setlinewidth stroke + grestore + } if + + % Display the bars for elements in the bars array + gsave + 0 setlinecap + barcolor (unset) ne { barcolor setanycolor } if + bars { + dup -1 ne { + aload pop newpath setlinewidth moveto 0 exch rlineto stroke + } { + pop + } ifelse + } forall + grestore + + % Display the text for elements in the text array + textcolor (unset) ne { textcolor setanycolor } if + includetext { + textxalign (unset) eq textyalign (unset) eq and alttext () eq and { + /s 0 def /f () def + txt { + {} forall + 2 copy s ne exch f ne or { + 2 copy /s exch def /f exch def + exch findfont exch scalefont setfont + } { + pop pop + } ifelse + moveto show + } forall + } { + textfont findfont textsize scalefont setfont + alttext () eq { + /txt [ txt { 0 get {} forall } forall ] def + /tstr txt length string def + 0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for + } { + /tstr alttext def + } ifelse + + % Find true ascent of font + tstr length 0 eq { + 0 + } { + gsave + newpath 0 0 moveto (0) false charpath pathbbox + 4 1 roll pop pop pop + grestore + currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse + currentfont /StrokeWidth known and { + currentfont /StrokeWidth get 2 div 0 exch + currentfont /FontMatrix get dtransform + dup mul exch dup mul add sqrt + add + } if + } ifelse + /textascent exch def + /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def + + /textxpos textxoffset x textwidth sub 2 div add def + textxalign (left) eq { /textxpos textxoffset def } if + textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if + textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if + textxalign (offright) eq { /textxpos x textxoffset add def } if + textxalign (justify) eq textwidth x lt and { + /textxpos 0 def + /textgaps x textwidth sub tstr length 1 sub div def + } if + /textypos textyoffset textascent add 1 add neg def + textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if + textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if + textxpos textypos moveto textgaps 0 tstr ashow + } ifelse + } if + + % Display the guard elements + guardwhitespace { + 0.75 setlinewidth + guardleftpos 0 ne { + newpath + guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto + guardwidth neg guardheight -2 div rlineto + guardwidth guardheight -2 div rlineto + stroke + } if + guardrightpos 0 ne { + newpath + guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto + guardwidth guardheight -2 div rlineto + guardwidth neg guardheight -2 div rlineto + stroke + } if + } if + + grestore + + end + +} bind def +/renlinear dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +% --DESC: Code 93 +% --EXAM: THIS IS CODE 93 +% --EXOP: includetext includecheck +% --RNDR: renlinear +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/code93 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includecheck false def % Enable/disable checkdigit + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + /parsefnc false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + /encs + [ (131112) (111213) (111312) (111411) (121113) + (121212) (121311) (111114) (131211) (141111) + (211113) (211212) (211311) (221112) (221211) + (231111) (112113) (112212) (112311) (122112) + (132111) (111123) (111222) (111321) (121122) + (131121) (212112) (212211) (211122) (211221) + (221121) (222111) (112122) (112221) (122121) + (123111) (121131) (311112) (311211) (321111) + (112131) (113121) (211131) (121221) (312111) + (311121) (122211) (111141) (1111411) + ] def + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def + + /barlen barcode length def + + % Special function characters + /sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def + /fncvals << + (SFT$) sft1 + (SFT%) sft2 + (SFT/) sft3 + (SFT+) sft4 + >> def + + % Convert input into bytes accounting for shift characters + /msg barlen array def + /i 0 def /j 0 def { + i barlen eq {exit} if + /char barcode i get def + parsefnc char 94 eq and i barlen 4 sub lt and { + barcode i 1 add get 94 ne { + /char fncvals barcode i 1 add 4 getinterval get def + /i i 4 add def + } { + /i i 1 add def + } ifelse + } if + msg j char put + /i i 1 add def + /j j 1 add def + } loop + /msg msg 0 j getinterval def + /msglen msg length def + + includecheck { + /sbs msglen 6 mul 25 add string def + } { + /sbs msglen 6 mul 13 add string def + } ifelse + /txt msglen array def + + % Put the start character + sbs 0 encs 47 get putinterval + + /checksum1 0 def /checksum2 0 def + 0 1 msglen 1 sub { + /i exch def + % Lookup the encoding for the each barcode character + msg i get dup 0 lt { + 42 exch sub /indx exch def + /char ( ) def + } { + 1 string dup 0 4 -1 roll put /char exch def + barchars char search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + } ifelse + /enc encs indx get def % Get the indxth encoding + sbs i 6 mul 6 add enc putinterval % Put encoded digit into sbs + txt i [char i 9 mul 9 add textyoffset textfont textsize] put + /checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def + /checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def + } for + + includecheck { + % Put the first checksum character + /checksum1 checksum1 47 mod def + /checksum2 checksum2 checksum1 add 47 mod def + sbs msglen 6 mul 6 add encs checksum1 get putinterval + sbs msglen 6 mul 12 add encs checksum2 get putinterval + % Put the end character + sbs msglen 6 mul 18 add encs 48 get putinterval + } { + % Put the end character + sbs msglen 6 mul 6 add encs 48 get putinterval + } ifelse + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/code93 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +gsave +50 50 translate +0 0 moveto <544f20474f204f4e4c59> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec +grestore + +showpage diff --git a/client-barcode/doc/codes/code93-to-go-prev.eps b/client-barcode/doc/codes/code93-to-go-prev.eps new file mode 100644 index 0000000..90028b4 --- /dev/null +++ b/client-barcode/doc/codes/code93-to-go-prev.eps @@ -0,0 +1,409 @@ +%!PS-Adobe-2.0 EPSF-2.0 +%%Creator: Terry Burton +%%BoundingBox: 50 40 177 122 +%%EndComments +%%EndProlog + +currentglobal +true setglobal +/Generic /Category findresource +dup length 1 add dict copy +dup /InstanceType /packedarraytype put +/uk.co.terryburton.bwipp exch /Category defineresource pop +setglobal + +/setpacking where {pop currentpacking true setpacking} if +1 dict +begin +/renlinear { + + 20 dict begin % Confine variables to local scope + + /args exch def % We are given some arguments + + % Default options + /sbs [] def + /bhs [] def + /bbs [] def + /txt [] def + /barcolor (unset) def + /includetext false def + /textcolor (unset) def + /textxalign (unset) def + /textyalign (unset) def + /textfont (Courier) def + /textsize 10 def + /textxoffset 0 def + /textyoffset 0 def + /textgaps 0 def + /alttext () def + /bordercolor (unset) def + /backgroundcolor (unset) def + /inkspread 0.15 def + /width 0 def + /barratio 1 def + /spaceratio 1 def + /showborder false def + /borderleft 10 def + /borderright 10 def + /bordertop 1 def + /borderbottom 1 def + /borderwidth 0.5 def + /guardwhitespace false def + /guardleftpos 0 def + /guardleftypos 0 def + /guardrightpos 0 def + /guardrightypos 0 def + /guardwidth 6 def + /guardheight 7 def + + % Apply the renderer options and the user options + args {def} forall + opt {def} forall + + /barcolor barcolor cvlit def + /textcolor textcolor cvlit def + /textxalign textxalign cvlit def + /textyalign textyalign cvlit def + /textfont textfont cvlit def + /textsize textsize cvr def + /textxoffset textxoffset cvr def + /textyoffset textyoffset cvr def + /textgaps textgaps cvr def + /alttext alttext cvlit def + /bordercolor bordercolor cvlit def + /backgroundcolor backgroundcolor cvlit def + /inkspread inkspread cvr def + /width width cvr def + /barratio barratio cvr def + /spaceratio spaceratio cvr def + /borderleft borderleft cvr def + /borderright borderright cvr def + /bordertop bordertop cvr def + /borderbottom borderbottom cvr def + /borderwidth borderwidth cvr def + /guardleftpos guardleftpos cvr def + /guardleftypos guardleftypos cvr def + /guardrightpos guardrightpos cvr def + /guardrightypos guardrightypos cvr def + /guardwidth guardwidth cvr def + /guardheight guardheight cvr def + + % Create bar elements and put them into the bars array + /bars sbs length 1 add 2 idiv array def + /x 0.00 def /maxh 0 def + 0 1 sbs length 1 add 2 idiv 2 mul 2 sub { + /i exch def + i 2 mod 0 eq { % i is even + /d sbs i get barratio mul barratio sub 1 add def % d=digit*r-r+1 + sbs i get 0 ne { + /h bhs i 2 idiv get 72 mul def % Height from bhs + /c d 2 div x add def % Centre of the bar = x + d/2 + /y bbs i 2 idiv get 72 mul def % Baseline from bbs + /w d inkspread sub def % bar width = digit - inkspread + bars i 2 idiv [h c y w] put % Add the bar entry + h y add maxh gt {/maxh h y add def} if + } { + bars i 2 idiv -1 put % Dummy entry + } ifelse + } { + /d sbs i get spaceratio mul spaceratio sub 1 add def % d=digit*r-r+1 + } ifelse + /x x d add def % x+=d + } for + + gsave + + currentpoint translate + + % Force symbol to given width + width 0 ne { + width 72 mul x div 1 scale + } if + + % Set RGB or CMYK color depending on length of given hex string + /setanycolor { + /anycolor exch def + anycolor length 6 eq { + (< >) 8 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setrgbcolor + } if + anycolor length 8 eq { + (< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor + } if + } bind def + + % Display the border and background + newpath + borderleft neg borderbottom neg moveto + x borderleft add borderright add 0 rlineto + 0 maxh borderbottom add bordertop add rlineto + x borderleft add borderright add neg 0 rlineto + 0 maxh borderbottom add bordertop add neg rlineto + closepath + backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if + showborder { + gsave + bordercolor (unset) ne { bordercolor setanycolor } if + borderwidth setlinewidth stroke + grestore + } if + + % Display the bars for elements in the bars array + gsave + 0 setlinecap + barcolor (unset) ne { barcolor setanycolor } if + bars { + dup -1 ne { + aload pop newpath setlinewidth moveto 0 exch rlineto stroke + } { + pop + } ifelse + } forall + grestore + + % Display the text for elements in the text array + textcolor (unset) ne { textcolor setanycolor } if + includetext { + textxalign (unset) eq textyalign (unset) eq and alttext () eq and { + /s 0 def /f () def + txt { + {} forall + 2 copy s ne exch f ne or { + 2 copy /s exch def /f exch def + exch findfont exch scalefont setfont + } { + pop pop + } ifelse + moveto show + } forall + } { + textfont findfont textsize scalefont setfont + alttext () eq { + /txt [ txt { 0 get {} forall } forall ] def + /tstr txt length string def + 0 1 txt length 1 sub { dup txt exch get tstr 3 1 roll put } for + } { + /tstr alttext def + } ifelse + + % Find true ascent of font + tstr length 0 eq { + 0 + } { + gsave + newpath 0 0 moveto (0) false charpath pathbbox + 4 1 roll pop pop pop + grestore + currentfont /PaintType known {currentfont /PaintType get 2 eq} {false} ifelse + currentfont /StrokeWidth known and { + currentfont /StrokeWidth get 2 div 0 exch + currentfont /FontMatrix get dtransform + dup mul exch dup mul add sqrt + add + } if + } ifelse + /textascent exch def + /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def + + /textxpos textxoffset x textwidth sub 2 div add def + textxalign (left) eq { /textxpos textxoffset def } if + textxalign (right) eq { /textxpos x textxoffset sub textwidth sub def } if + textxalign (offleft) eq { /textxpos textwidth textxoffset add neg def } if + textxalign (offright) eq { /textxpos x textxoffset add def } if + textxalign (justify) eq textwidth x lt and { + /textxpos 0 def + /textgaps x textwidth sub tstr length 1 sub div def + } if + /textypos textyoffset textascent add 1 add neg def + textyalign (above) eq { /textypos textyoffset maxh add 1 add def } if + textyalign (center) eq { /textypos textyoffset maxh textascent sub 2 div add def } if + textxpos textypos moveto textgaps 0 tstr ashow + } ifelse + } if + + % Display the guard elements + guardwhitespace { + 0.75 setlinewidth + guardleftpos 0 ne { + newpath + guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto + guardwidth neg guardheight -2 div rlineto + guardwidth guardheight -2 div rlineto + stroke + } if + guardrightpos 0 ne { + newpath + guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto + guardwidth guardheight -2 div rlineto + guardwidth neg guardheight -2 div rlineto + stroke + } if + } if + + grestore + + end + +} bind def +/renlinear dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +% --DESC: Code 93 +% --EXAM: THIS IS CODE 93 +% --EXOP: includetext includecheck +% --RNDR: renlinear +/setpacking where {pop currentpacking true setpacking} if +1 dict +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +begin +/code93 { + + 20 dict begin % Confine variables to local scope + + /options exch def % We are given an option string + /barcode exch def % We are given a barcode string + + /dontdraw false def + /includecheck false def % Enable/disable checkdigit + /includetext false def % Enable/disable text + /textfont /Courier def + /textsize 10 def + /textyoffset -7 def + /height 1 def + /parsefnc false def + + % Parse the input options + options type /stringtype eq { + 1 dict begin + options { + token false eq {exit} if dup length string cvs (=) search + true eq {cvlit exch pop exch def} {cvlit true def} ifelse + } loop + currentdict end /options exch def + } if + options {def} forall + + /textfont textfont cvlit def + /textsize textsize cvr def + /textyoffset textyoffset cvr def + /height height cvr def + + /encs + [ (131112) (111213) (111312) (111411) (121113) + (121212) (121311) (111114) (131211) (141111) + (211113) (211212) (211311) (221112) (221211) + (231111) (112113) (112212) (112311) (122112) + (132111) (111123) (111222) (111321) (121122) + (131121) (212112) (212211) (211122) (211221) + (221121) (222111) (112122) (112221) (122121) + (123111) (121131) (311112) (311211) (321111) + (112131) (113121) (211131) (121221) (312111) + (311121) (122211) (111141) (1111411) + ] def + + % Create a string of the available characters + /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def + + /barlen barcode length def + + % Special function characters + /sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def + /fncvals << + (SFT$) sft1 + (SFT%) sft2 + (SFT/) sft3 + (SFT+) sft4 + >> def + + % Convert input into bytes accounting for shift characters + /msg barlen array def + /i 0 def /j 0 def { + i barlen eq {exit} if + /char barcode i get def + parsefnc char 94 eq and i barlen 4 sub lt and { + barcode i 1 add get 94 ne { + /char fncvals barcode i 1 add 4 getinterval get def + /i i 4 add def + } { + /i i 1 add def + } ifelse + } if + msg j char put + /i i 1 add def + /j j 1 add def + } loop + /msg msg 0 j getinterval def + /msglen msg length def + + includecheck { + /sbs msglen 6 mul 25 add string def + } { + /sbs msglen 6 mul 13 add string def + } ifelse + /txt msglen array def + + % Put the start character + sbs 0 encs 47 get putinterval + + /checksum1 0 def /checksum2 0 def + 0 1 msglen 1 sub { + /i exch def + % Lookup the encoding for the each barcode character + msg i get dup 0 lt { + 42 exch sub /indx exch def + /char ( ) def + } { + 1 string dup 0 4 -1 roll put /char exch def + barchars char search + pop % Discard true leaving pre + length /indx exch def % indx is the length of pre + pop pop % Discard seek and post + } ifelse + /enc encs indx get def % Get the indxth encoding + sbs i 6 mul 6 add enc putinterval % Put encoded digit into sbs + txt i [char i 9 mul 9 add textyoffset textfont textsize] put + /checksum1 checksum1 msglen i sub 1 sub 20 mod 1 add indx mul add def + /checksum2 checksum2 msglen i sub 15 mod 1 add indx mul add def + } for + + includecheck { + % Put the first checksum character + /checksum1 checksum1 47 mod def + /checksum2 checksum2 checksum1 add 47 mod def + sbs msglen 6 mul 6 add encs checksum1 get putinterval + sbs msglen 6 mul 12 add encs checksum2 get putinterval + % Put the end character + sbs msglen 6 mul 18 add encs 48 get putinterval + } { + % Put the end character + sbs msglen 6 mul 6 add encs 48 get putinterval + } ifelse + + % Return the arguments + << + /ren //renlinear + /sbs [sbs {48 sub} forall] + /bhs [sbs length 1 add 2 idiv {height} repeat] + /bbs [sbs length 1 add 2 idiv {0} repeat] + includetext { + /txt txt + } if + /opt options + >> + + dontdraw not //renlinear if + + end + +} bind def +/code93 dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if + +gsave +50 50 translate +0 0 moveto <544f20474f2050524556> <696e636c7564657465787420696e636c756465636865636b> /code93 /uk.co.terryburton.bwipp findresource exec +grestore + +showpage diff --git a/client-barcode/doc/freitagskasse.svg b/client-barcode/doc/freitagskasse.svg index 66e3302..12e412b 100644 --- a/client-barcode/doc/freitagskasse.svg +++ b/client-barcode/doc/freitagskasse.svg @@ -16,7 +16,7 @@ inkscape:version="0.48.2 r9819" sodipodi:docname="freitagskasse.svg"> HOWTO Freitagskasse v2 + id="title3609">HOWTO Freitagskasse v3 + inkscape:window-maximized="1" + borderlayer="true" /> @@ -72,7 +73,7 @@ image/svg+xml - HOWTO Freitagskasse v2 + HOWTO Freitagskasse v3 Sebastian Pipping <sebastian@pipping.org> @@ -103,6 +104,11 @@ inkscape:groupmode="layer" id="layer1" transform="translate(0,-308.2677)"> + @@ -123,7 +129,7 @@ xml:space="preserve" id="flowRoot6039" style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" - transform="translate(40.001329,318.21825)">HOWTO Freitagskasse + transform="translate(-12.91979,-2.0000225)"> @@ -161,7 +167,7 @@ xml:space="preserve" id="flowRoot6047" style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" - transform="translate(-171.79164,178.34453)">(3) Code COMMIT scannen - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DEPOSIT 0.01 - - - - - 1 Cent - + id="g6275"> + transform="matrix(1.25,0,0,-1.25,556.40087,541.52356)"> @@ -754,7 +476,7 @@ 5 Cent + id="g6215" + transform="translate(0,2.8183594e-5)"> + transform="matrix(1.25,0,0,-1.25,556.40087,702.75931)"> @@ -1037,7 +759,7 @@ 10 Cent + id="g6155" + transform="translate(0,1.6474609e-5)"> + transform="matrix(1.25,0,0,-1.25,556.40087,863.99507)"> + id="path4061" /> + id="path4063" /> + id="path4065" /> + id="path4067" /> + id="path4069" /> + id="path4071" /> + id="path4073" /> + id="path4075" /> + id="path4077" /> + id="path4079" /> + id="path4081" /> + id="path4083" /> + id="path4085" /> + id="path4087" /> + id="path4089" /> + id="path4091" /> + id="path4093" /> + id="path4095" /> + id="path4097" /> + id="path4099" /> + id="path4101" /> + id="path4103" /> + id="path4105" /> + id="path4107" /> + id="path4109" /> + id="path4111" /> + id="path4113" /> + id="path4115" /> + id="path4117" /> + id="path4119" /> + id="path4121" /> + id="path4123" /> + id="path4125" /> + id="path4127" /> + id="path4129" /> + id="path4131" /> + id="path4133" /> + id="path4135" /> + id="path4137" /> + d="m 1175,100 0,720" + style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path4139" /> + id="path4141" /> + id="path4143" /> + id="path4145" /> + id="path4147" /> + d="m 1335,100 0,720" + style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path4149" /> + id="path4151" /> + id="path4153" /> + id="path4155" /> + id="path4157" /> + id="text4161"> DEPOSIT 0.50 + id="tspan4163">DEPOSIT 1.00 50 Cent + id="rect3535-9" />1 Euro + id="g6092"> + transform="matrix(1.25,0,0,-1.25,545.15088,1025.2309)"> + id="path4401" /> + id="path4403" /> + id="path4405" /> + id="path4407" /> + id="path4409" /> + id="path4411" /> + id="path4413" /> + id="path4415" /> + id="path4417" /> + id="path4419" /> + id="path4421" /> + id="path4423" /> + id="path4425" /> + id="path4427" /> + id="path4429" /> + id="path4431" /> + id="path4433" /> + id="path4435" /> + id="path4437" /> + id="path4439" /> + id="path4441" /> + id="path4443" /> + id="path4445" /> + id="path4447" /> + id="path4449" /> + id="path4451" /> + id="path4453" /> + id="path4455" /> + id="path4457" /> + id="path4459" /> + d="m 905,100 0,720" + style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path4461" /> + id="path4463" /> + id="path4465" /> + d="m 1005,100 0,720" + style="fill:none;stroke:#000000;stroke-width:28.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path4467" /> + id="path4469" /> + id="path4471" /> + id="path4473" /> + id="path4475" /> + id="path4477" /> + id="path4479" /> + id="path4481" /> + id="path4483" /> + id="path4485" /> + id="path4487" /> + id="path4489" /> + + id="path4493" /> + id="path4495" /> + + + id="path4501" /> + id="path4503" /> + id="text4507"> DEPOSIT 1.00 + id="tspan4509">DEPOSIT 10.00 1 Euro + id="rect3535-9-1" />10 Euro + id="g8994" + transform="translate(-4,0)"> + transform="matrix(1.25,0,0,-1.25,59.552105,1022.7308)"> + id="path3265" /> + id="path3267" /> + id="path3269" /> + id="path3271" /> + id="path3273" /> + id="path3275" /> + d="m 185,80 0,720" + style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path3277" /> + id="path3279" /> + d="m 240,80 0,720" + style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path3281" /> + id="path3283" /> + id="path3285" /> + id="path3287" /> + id="path3289" /> + id="path3291" /> + id="path3293" /> + d="m 455,80 0,720" + style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path3295" /> - - - + id="path3297" /> + id="path3299" /> + id="path3301" /> + id="path3303" /> - - - - - + id="path3305" /> + id="path3307" /> - - - - - - - + id="path3309" /> + id="path3311" /> + id="path3313" /> - - + id="path3315" /> - + id="path3317" /> + id="path3319" /> + id="path3321" /> + id="path3323" /> + id="path3325" /> + transform="matrix(1,0,0,-1,9,1)" + id="text3329"> DEPOSIT 5.00 + id="tspan3331">COMMIT 5 Euro + id="rect3535-9-1-4" />COMMIT + id="g8958" + transform="translate(-4,0)"> + transform="matrix(1.25,0,0,-1.25,319.6015,1022.7308)"> + id="path3167" /> + id="path3169" /> + id="path3171" /> - + id="path3173" /> + id="path3175" /> - + id="path3177" /> + id="path3179" /> + id="path3181" /> + d="m 250,80 0,720" + style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path3183" /> + id="path3185" /> + id="path3187" /> - + id="path3189" /> + d="m 365,80 0,720" + style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path3191" /> + id="path3193" /> + id="path3195" /> - + id="path3197" /> + id="path3199" /> + d="m 505,80 0,720" + style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path3201" /> + id="path3203" /> + d="m 575,80 0,720" + style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path3205" /> + d="m 595,80 0,720" + style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path3207" /> + id="path3209" /> + id="path3211" /> + + id="path3215" /> + + + UNDO + + + + + UNDO + + + + + + + + 1 1 2 3 4 2 3 + ... für nichts + + id="path4067-7" /> + id="path4069-4" /> + + + id="path4075-2" /> + + id="path4079-0" /> + id="path4081-3" /> + + id="path4085-0" /> + id="path4087-0" /> + id="path4089-3" /> + id="path4091-4" /> + d="m 390,100 0,720" + style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path4093-9" /> + id="path4095-2" /> + id="path4097-7" /> + id="path4099-4" /> + + + id="path4105-2" /> + id="path4107-4" /> + id="path4109-4" /> + id="path4111-3" /> + id="path4113-8" /> + id="path4115-6" /> + id="path4117-0" /> + + id="path4121-9" /> + id="path4123-2" /> + d="m 880,100 0,720" + style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path4125-2" /> - - - DEPOSIT 10.00 - - - - - 10 Euro - - - + d="m 910,100 0,720" + style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path4127-3" /> + id="path4129-1" /> + id="path4131-8" /> + d="m 995,100 0,720" + style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path4133-3" /> + d="m 1015,100 0,720" + style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path4135-4" /> + d="m 1060,100 0,720" + style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path4137-2" /> + id="path4139-2" /> + id="path4141-4" /> + id="path4143-5" /> + id="path4145-1" /> + id="path4147-7" /> + d="m 1230,100 0,720" + style="fill:none;stroke:#000000;stroke-width:38.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path4149-5" /> + d="m 1265,100 0,720" + style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path4151-7" /> + + + TO GO NONE + + + + + + + ... allein + + id="path4219" /> + id="path4221" /> + d="m 60,100 0,720" + style="fill:none;stroke:#000000;stroke-width:38.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path4223" /> + id="path4225" /> + id="path4227" /> + id="path4229" /> + id="path4231-9" /> + + id="path4235-1" /> + + id="path4239-8" /> + d="m 345,100 0,720" + style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path4241-9" /> + id="path4243-6" /> + id="path4245-7" /> + d="m 415,100 0,720" + style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path4247-7" /> + id="path4249-3" /> + id="path4251-7" /> + d="m 510,100 0,720" + style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path4253-1" /> + d="m 555,100 0,720" + style="fill:none;stroke:#000000;stroke-width:28.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path4255-2" /> + id="path4257-2" /> + id="path4259-1" /> + id="path4261-5" /> + id="path4263-0" /> + d="m 690,100 0,720" + style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path4265-9" /> + id="path4267-0" /> + id="path4269-4" /> + d="m 790,100 0,720" + style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path4271-0" /> + id="path4273-1" /> + id="path4275-3" /> + d="m 860,100 0,720" + style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path4277-7" /> + id="path4279-4" /> + d="m 940,100 0,720" + style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path4281-1" /> + id="path4283-1" /> + id="path4285-3" /> + id="path4287-0" /> + d="m 1055,100 0,720" + style="fill:none;stroke:#000000;stroke-width:28.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path4289-3" /> + id="path4291-2" /> + id="path4293-1" /> + + id="path4297-5" /> + id="path4299-6" /> + id="path4301-5" /> + id="path4303-4" /> + id="text4307"> DEPOSIT 50.00 + id="tspan4309">TO GO ONLY + + 50 Euro - - ... für davor + transform="matrix(1.25,0,0,-1.25,860.81975,1025.2309)"> + id="path4371" /> + id="path4373" /> + id="path4375" /> + id="path4377" /> + id="path4379" /> + d="m 160,100 0,720" + style="fill:none;stroke:#000000;stroke-width:18.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path4381" /> + id="path4383" /> + id="path4385" /> + id="path4387" /> + + id="path4391" /> + id="path4393" /> + + id="path4397" /> + id="path4399" /> + id="path4401-0" /> + + id="path4405-1" /> + + id="path4409-6" /> + + + + id="path4417-3" /> + + + id="path4423-6" /> + id="path4425-0" /> + id="path4427-2" /> + + id="path4431-8" /> + + id="path4435-5" /> + id="path4437-0" /> + id="path4439-6" /> + id="path4441-0" /> + + id="path4445-3" /> + id="path4447-7" /> + id="path4449-8" /> + id="path4451-2" /> + id="path4453-1" /> + id="path4455-0" /> + transform="matrix(1,0,0,-1,9,3)" + id="text4459"> COMMIT + id="tspan4461">TO GO PREV - COMMIT + + + id="g5879"> + transform="matrix(1.25,0,0,-1.25,872.06975,541.52356)"> + + + + + id="path3932" /> + + id="path3936" /> + d="m 215,100 0,720" + style="fill:none;stroke:#000000;stroke-width:8.5;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:10;stroke-opacity:1;stroke-dasharray:none" + id="path3938" /> + id="path3940" /> + + id="path3944" /> + + + id="path3950" /> + id="path3952" /> + id="path3954" /> + + id="path3958" /> + + + + id="path3966" /> + id="path3968" /> + id="path3970" /> + id="path3972" /> + id="path3974" /> + id="path3976" /> + id="path3978" /> + id="path3980" /> + + id="path3984" /> + id="path3986" /> + id="path3988" /> + id="path3990" /> + id="path3992" /> + + id="path3996" /> + + id="path4000" /> + id="path4002" /> + transform="matrix(1,0,0,-1,9,3)" + id="text4006"> UNDO + id="tspan4008">TO GO ALL UNDO - - - - - - - + height="47.142883" + width="279.99997" + id="rect3535-6-0" />... für alles 1 1 2 3 4 2 3 + id="flowRoot6039-5" + style="font-size:40px;font-style:normal;font-weight:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;font-family:Sans" + transform="translate(787.40737,319.07285)">Pfand