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 | 149 ++++++++++--------------- client-barcode/freitagslib/commands.py | 88 +++++++++------ 2 files changed, 112 insertions(+), 125 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) - - self.balance = balance_before - self.transfers = after - elif scope == TO_GO_NONE: - """ - Deletes all ToGoCommands - """ - 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 not command.includes_deposit() \ + and command.deposit_value() > 0: + command.include_deposit(True) + balance_before += command.difference() + + self.balance = balance_before + elif scope == TO_GO_NONE: + """ + Makes all BuyCommands that include commodity + not include deposit any more + ...and updates future balance accordingly. + """ + first_command, initial_balance = self.transfers[0] + balance_before = initial_balance + + for command, dummy in self.transfers: + if isinstance(command, BuyCommand) \ + 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 item(self): - return self._item + 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") - -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(self): - return self._item.deposit - - -class ToGoCommand(_ItemBasedCommand): - def __init__(self, item): - super(ToGoCommand, self).__init__(item) - self._difference = -item.deposit - - def run(self, user_name): - net.buy_item(self._item.id, what_about_it=DEPOSIT_ONLY, user_name=user_name) - - def label(self): + def deposit_label(self): return '%s Pfand' % self._item.name + + def includes_commodity(self): + return self._commodity + + def includes_deposit(self): + return self._deposit + + def include_commodity(self, commodity): + self._commodity = commodity + + def include_deposit(self, deposit): + self._deposit = deposit + + 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 | 2270 ++++++++--------- 5 files changed, 2707 insertions(+), 1199 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DEPOSIT 0.50 - - - - - 50 Cent - + id="g6155" + transform="translate(0,1.6474609e-5)"> + transform="matrix(1.25,0,0,-1.25,556.40087,863.99507)"> @@ -1603,7 +1042,7 @@ 1 Euro - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DEPOSIT 5.00 - - - - - 5 Euro - + id="g6092"> + transform="matrix(1.25,0,0,-1.25,545.15088,1025.2309)"> @@ -2183,7 +1339,7 @@ 10 Euro - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - DEPOSIT 50.00 - - - - - 50 Euro - + id="g8994" + transform="translate(-4,0)"> COMMIT + id="g8958" + transform="translate(-4,0)"> + d="m -100.22934,-88.048378 a 14.770664,14.770664 0 1 1 -29.54132,0 14.770664,14.770664 0 1 1 29.54132,0 z" + transform="translate(188.15166,537.71419)" /> + d="m -100.22934,-88.048378 a 14.770664,14.770664 0 1 1 -29.54132,0 14.770664,14.770664 0 1 1 29.54132,0 z" + transform="translate(188.15166,600.26767)" /> + d="m -100.22934,-88.048378 a 14.770664,14.770664 0 1 1 -29.54132,0 14.770664,14.770664 0 1 1 29.54132,0 z" + transform="translate(188.15166,631.83909)" /> + d="m -100.22934,-88.048378 a 14.770664,14.770664 0 1 1 -29.54132,0 14.770664,14.770664 0 1 1 29.54132,0 z" + transform="translate(188.15166,725.05339)" /> + d="m -100.22934,-88.048378 a 14.770664,14.770664 0 1 1 -29.54132,0 14.770664,14.770664 0 1 1 29.54132,0 z" + transform="translate(188.15166,787.91053)" /> + d="m -100.22934,-88.048378 a 14.770664,14.770664 0 1 1 -29.54132,0 14.770664,14.770664 0 1 1 29.54132,0 z" + transform="translate(188.15166,850.19626)" /> + d="m -100.22934,-88.048378 a 14.770664,14.770664 0 1 1 -29.54132,0 14.770664,14.770664 0 1 1 29.54132,0 z" + transform="translate(188.15166,912.33911)" /> 3 + style="font-size:25px;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-align:start;line-height:125%;writing-mode:lr-tb;text-anchor:start;fill:#ffffff;font-family:Sans;-inkscape-font-specification:Sans">3 + ... für nichts + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TO GO NONE + + + + + + + ... allein + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TO GO ONLY + + + + + + + ... für davor + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TO GO PREV + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + TO GO ALL + + + + + ... für alles + Pfand