diff --git a/CMakeLists.txt b/CMakeLists.txt index 38f01feb..851d3f43 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ # Copyright (C) 2008 by BogDan Vatra < bogdan@licentia.eu > -# Copyright (C) 2009-2021 Robin Stuart +# Copyright (C) 2009-2022 Robin Stuart # vim: set ts=4 sw=4 et : cmake_minimum_required(VERSION 3.5) diff --git a/backend/tests/tools/bwipp_dump-barcode.ps.cat b/backend/tests/tools/bwipp_dump-barcode.ps.cat new file mode 100644 index 00000000..4466edc1 --- /dev/null +++ b/backend/tests/tools/bwipp_dump-barcode.ps.cat @@ -0,0 +1,190 @@ +%!PS + +% Append to BWIPP barcode.ps: cat /build/monolithic/barcode.ps bwipp_dump-barcode.ps.cat > bwipp_dump.ps +% +% To compress: tar cv bwipp_dump.ps | xz -e9 > bwipp_dump.ps.tar.xz + +% Dumps BWIPP barcode binary to stdout. If `-sn` given, appends a newline after each symbol row, otherwise doesn't. +% +% To run e.g. gs -dNOPAUSE -dBATCH -dNODISPLAY -q -sb=databarexpanded -sd='(01)98898765432106' -so='includetext segments=6' bwipp_dump.ps +% where +% `-sb=` is the BWIPP barcode routine name +% `-sd=` is the data (`sd2=` is also available for overspill data > 2K to get around Ghostscript arg_str_max) +% `-so=` are options (as space separated key=val pairs (or just key if boolean true)) + +% For debugging the barcode can be rendered by leaving out `-dBATCH -dNODISPLAY`. Scaling can be specified by `-ss=` (default 2). + +% Command line "-s" options put into system dictionary as strings +/n systemdict /n known def + +% Append d2 to d if given +systemdict /d2 known { + /d d length d2 length add string dup dup 0 d putinterval d length d2 putinterval def +} if + +% Strip start/end parens from data if any +d 0 1 getinterval (\() eq d d length 1 sub 1 getinterval (\)) eq and { + /d d 1 d length 2 sub getinterval d length 2 sub string copy def +} if + +% Options +systemdict /o known { + o type /stringtype eq o length 0 gt and { + o length 2 ge { + % Strip start/end parens from options if any + o 0 1 getinterval (\() eq o o length 1 sub 1 getinterval (\)) eq and { + /o o 1 o length 2 sub getinterval o length 2 sub string copy def + } if + } if + 3 dict begin + o { + token not {exit} if + dup length string cvs (=) search { + cvlit exch pop exch def + } { + cvlit true def + } ifelse + } loop + currentdict end /o exch def + } { + /o 1 dict def + } ifelse +} { + /o 1 dict def +} ifelse + +o (dontdraw) true put + +/ret d o b cvn /uk.co.terryburton.bwipp findresource exec def + +% pixs is renmatrix input +ret /pixs known { + b (maxicode) eq { + /pixs 990 array def + 0 1 989 { pixs exch 0 put } for + ret /pixs get { pixs exch 1 put } forall + } { + /pixs ret /pixs get def + } ifelse + + /xs systemdict /xs known { systemdict /xs get cvi } { 0 } ifelse def + /xe systemdict /xe known { systemdict /xe get cvi } { 0 } ifelse def + + n xs 0 ne or xe 0 ne or ret /pixx known and { % If newlines or start/end indexes requested and have row width + /pixx ret /pixx get def + xs pixx pixs length 1 sub xe sub { % For i = xs; i < pixs length - xe; i += pixx + pixs exch pixx xs sub xe sub getinterval { % For j = i; j < i + pixx - xs -xe; j++ + 1 string cvs print + } forall + n { (\n) print } if + } for + } { % Else dump the whole thing, no newlines + pixs { 1 string cvs print } forall + } ifelse +} { + % sbs is renlinear input + ret /sbs known { + /sbs ret /sbs get def + + % Check if given preprocessor override + systemdict /p known { + /p systemdict /p get cvx def + } { + /p { false } def + } ifelse + + % Check if given ratio arg to adjust width of bars/spaces (e.g. "0.6" reduces 3 -> 2, "1.3" increases 2 -> 3) + systemdict /r known { + /r systemdict /r get cvr def + systemdict /c known { % Apply ceiling ratio beforehand + /c systemdict /c get cvr def + /f { c mul ceiling cvi r mul round cvi } def + } { + /f { r mul round cvi } def + } ifelse + } { + /f {} def + } ifelse + + % If should begin with space + systemdict /bs known { (0) print } if + + % If should end sbs loop on bar (i.e. ignore last index of even-length sbs) + /limit systemdict /elb known { + sbs length 1 add 2 idiv 2 mul 2 sub + } { + sbs length 1 sub + } ifelse def + + % If should use bhs/bbs to emulate rows (DAFT/pharmacode2) (hacky) + /nosbs false def + /minh 999999 def + /midh 0 def + /maxh 0 def + /maxb 0 def + systemdict /hs known ret /bhs known and ret /bbs known and { + /bhs ret /bhs get def + /bbs ret /bbs get def + 0 1 bhs length 1 sub { + /i exch def + /h bhs i get def + /b bbs i get def + h minh lt { /minh h def } if + h maxh gt { /maxh h def } if + h minh ne h maxh ne and { /midh h def } if + b maxb gt { /maxb b def } if + } for + 0 1 limit { + /i exch def + i 2 mod 0 eq { % i is even + /h bhs i 2 idiv get def + /b bbs i 2 idiv get def + h maxh eq h midh eq b maxb eq and or maxb 0 ne b maxb eq and midh 0 eq and h minh eq and or { (1) } { (0) } ifelse print % Yeah, me too + } { + (0) print + } ifelse + } for + n { (\n) print } if + maxb 0 ne midh 0 eq and maxb 0 eq minh maxh eq and or { /nosbs true def } if % No tracker (pharmacode2) + } if + + % Process sbs + nosbs not { + 0 1 limit { + /i exch def + p not { % If not preprocessed + i 2 mod 0 eq { % i is even + sbs i get f cvi { (1) print } repeat + } { + sbs i get f cvi { (0) print } repeat + } ifelse + } if + } for + n { (\n) print } if + } if + + % Third row if DAFT, second row if no tracker (pharmacode2) + maxb 0 ne midh 0 ne or minh maxh eq or { + 0 1 limit { + /i exch def + i 2 mod 0 eq { % i is even + /b bbs i 2 idiv get def + b 0 eq { (1) } { (0) } ifelse print + } { + (0) print + } ifelse + } for + n { (\n) print } if + } if + } if +} ifelse + +% If have renderer +ret /ren known { + % Scale + /s systemdict /s known { systemdict /s get cvi } { 2 } ifelse def + % If not -dNODISPLAY then render for debugging + currentpagedevice /Name get (nullpage) ne { s s scale 10 10 moveto ret ret /ren get exec } if +} if + +% vim: set ts=4 sw=4 et : diff --git a/backend/tests/tools/bwipp_dump-barcode.ps.diff b/backend/tests/tools/bwipp_dump-barcode.ps.diff deleted file mode 100644 index f3120e9c..00000000 --- a/backend/tests/tools/bwipp_dump-barcode.ps.diff +++ /dev/null @@ -1,839 +0,0 @@ ---- /home/mburke/code/gitlost/postscriptbarcode/build/monolithic/barcode.ps 2022-08-21 02:09:58.212358116 +0100 -+++ backend/tests/tools/bwipp_dump.ps 2022-08-21 02:18:52.142394720 +0100 -@@ -29000,7 +29000,7 @@ - pop - } ifelse - -- gsave -+ dontdraw not { gsave } if - - options (lintype) (databaromni) put - options (linkage) true put -@@ -29018,7 +29018,7 @@ - linear options //databaromni exec - dup (sbs) get /linsbs exch def - dup (bhs) get 0 get 72 mul /linheight exch def -- //renlinear exec -+ dontdraw not { //renlinear exec } { pop } ifelse - - % Plot the separator - /sepfinder { -@@ -29049,20 +29049,66 @@ - sep 0 [0 0 0] putinterval - sep sep length 4 sub [0 0 0 0] putinterval - 18 sepfinder 64 sepfinder -- 0 linheight rmoveto << -- /ren //renmatrix -- /pixs sep -- /pixx sep length -- /pixy 1 -- /height 1 72 div -- /width sep length 72 div -- /opt options -- >> //renmatrix exec -+ dontdraw not { -+ 0 linheight rmoveto << -+ /ren //renmatrix -+ /pixs sep -+ /pixx sep length -+ /pixy 1 -+ /height 1 72 div -+ /width sep length 72 div -+ /opt options -+ >> //renmatrix exec - -- % Plot the 2D part -- -5 1 rmoveto comp options //gs1-cc exec //renmatrix exec -+ % Plot the 2D part -+ -5 1 rmoveto comp options //gs1-cc exec //renmatrix exec - -- grestore -+ grestore -+ } { -+ /compsym comp options //gs1-cc exec def -+ /ccpixs compsym /pixs get def -+ /ccpixx compsym /pixx get def -+ -+ /linpixs [ 0 % Begin with left guard space -+ linsbs { cvi 1 index 0 eq {{1}} {{0}} ifelse repeat } forall % Alternates x 1/0's -+ ] def -+ /sep [ 0 sep aload pop ] def % Pad with left guard space -+ -+ /linheight linheight cvi def -+ /diff linpixs length ccpixx sub def -+ diff 0 gt { % Centre align composite, doubling up rows -+ /ccpad [ diff 2 idiv {0} repeat ] def -+ /pixs [ -+ 0 ccpixx ccpixs length 1 sub { -+ /i exch def -+ 2 { ccpad aload pop ccpixs i ccpixx getinterval aload pop ccpad aload pop } repeat -+ } for -+ sep aload pop linheight { linpixs aload pop } repeat -+ ] def -+ /pixx linpixs length def -+ } { % Right pad composite, doubling up rows, and left pad (right align) separator/linear -+ /linpad [ diff neg 1 add {0} repeat ] def -+ /pixs [ -+ 0 ccpixx ccpixs length 1 sub { % Right pad composite with 1 space -+ /i exch def -+ 2 { ccpixs i ccpixx getinterval aload pop 0 } repeat -+ } for -+ linpad aload pop sep aload pop linheight { linpad aload pop linpixs aload pop } repeat -+ ] def -+ /pixx ccpixx 1 add def -+ } ifelse -+ -+ /pixy pixs length pixx idiv def -+ << -+ /ren //renmatrix -+ /pixs pixs -+ /pixx pixx -+ /pixy pixy -+ /height pixy 72 div -+ /width pixx 72 div -+ /opt options -+ >> -+ } ifelse - - end - -@@ -29125,7 +29171,7 @@ - pop - } ifelse - -- gsave -+ dontdraw not { gsave } if - - options (lintype) (databarstacked) put - options (linkage) true put -@@ -29143,7 +29189,7 @@ - linear options //databarstacked exec - dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def - dup (pixy) get /linheight exch def -- //renmatrix exec -+ dontdraw not { //renmatrix exec } { /pixs get /linpixs exch def } ifelse - - % Plot the separator - /sepfinder { -@@ -29171,20 +29217,52 @@ - sep 0 [ 0 0 0 0 ] putinterval - sep sep length 4 sub [ 0 0 0 0 ] putinterval - 18 sepfinder -- 0 linheight rmoveto << -- /ren //renmatrix -- /pixs sep -- /pixx sep length -- /pixy 1 -- /height 1 72 div -- /width sep length 72 div -- /opt options -- >> //renmatrix exec -+ dontdraw not { -+ 0 linheight rmoveto << -+ /ren //renmatrix -+ /pixs sep -+ /pixx sep length -+ /pixy 1 -+ /height 1 72 div -+ /width sep length 72 div -+ /opt options -+ >> //renmatrix exec - -- % Plot the 2D part -- 1 1 rmoveto comp options //gs1-cc exec //renmatrix exec -+ % Plot the 2D part -+ 1 1 rmoveto comp options //gs1-cc exec //renmatrix exec - -- grestore -+ grestore -+ } { -+ /compsym comp options //gs1-cc exec def -+ /ccpixs compsym /pixs get def -+ /ccpixx compsym /pixx get def -+ -+ /linwidth sep length def -+ /pixx ccpixx 1 add def -+ /linpad [ pixx linwidth sub {0} repeat ] def -+ /pixs [ -+ 0 ccpixx ccpixs length 1 sub { % Left pad composite with 1 space, doubling up rows -+ /i exch def -+ 2 { 0 ccpixs i ccpixx getinterval aload pop } repeat -+ } for -+ sep aload pop linpad aload pop -+ 0 linwidth linpixs length 1 sub { % Right pad linear -+ /i exch def -+ linpixs i linwidth getinterval aload pop linpad aload pop -+ } for -+ ] def -+ -+ /pixy pixs length pixx idiv def -+ << -+ /ren //renmatrix -+ /pixs pixs -+ /pixx pixx -+ /pixy pixy -+ /height pixy 72 div -+ /width pixx 72 div -+ /opt options -+ >> -+ } ifelse - - end - -@@ -29247,7 +29325,7 @@ - pop - } ifelse - -- gsave -+ dontdraw not { gsave } if - - options (lintype) (databarstackedomni) put - options (linkage) true put -@@ -29265,7 +29343,7 @@ - linear options //databarstackedomni exec - dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def - dup (pixy) get /linheight exch def -- //renmatrix exec -+ dontdraw not { //renmatrix exec } { /pixs get /linpixs exch def } ifelse - - % Plot the separator - /sepfinder { -@@ -29293,20 +29371,52 @@ - sep 0 [ 0 0 0 0 ] putinterval - sep sep length 4 sub [ 0 0 0 0 ] putinterval - 18 sepfinder -- 0 linheight rmoveto << -- /ren //renmatrix -- /pixs sep -- /pixx sep length -- /pixy 1 -- /height 1 72 div -- /width sep length 72 div -- /opt options -- >> //renmatrix exec -+ dontdraw not { -+ 0 linheight rmoveto << -+ /ren //renmatrix -+ /pixs sep -+ /pixx sep length -+ /pixy 1 -+ /height 1 72 div -+ /width sep length 72 div -+ /opt options -+ >> //renmatrix exec - -- % Plot the 2D part -- 1 1 rmoveto comp options //gs1-cc exec //renmatrix exec -+ % Plot the 2D part -+ 1 1 rmoveto comp options //gs1-cc exec //renmatrix exec - -- grestore -+ grestore -+ } { -+ /compsym comp options //gs1-cc exec def -+ /ccpixs compsym /pixs get def -+ /ccpixx compsym /pixx get def -+ -+ /linwidth sep length def -+ /pixx ccpixx 1 add def -+ /linpad [ pixx linwidth sub {0} repeat ] def -+ /pixs [ -+ 0 ccpixx ccpixs length 1 sub { % Left pad composite with 1 space, doubling up rows -+ /i exch def -+ 2 { 0 ccpixs i ccpixx getinterval aload pop } repeat -+ } for -+ sep aload pop linpad aload pop -+ 0 linwidth linpixs length 1 sub { % Right pad linear -+ /i exch def -+ linpixs i linwidth getinterval aload pop linpad aload pop -+ } for -+ ] def -+ -+ /pixy pixs length pixx idiv def -+ << -+ /ren //renmatrix -+ /pixs pixs -+ /pixx pixx -+ /pixy pixy -+ /height pixy 72 div -+ /width pixx 72 div -+ /opt options -+ >> -+ } ifelse - - end - -@@ -29496,7 +29606,7 @@ - pop - } ifelse - -- gsave -+ dontdraw not { gsave } if - - options (lintype) (databarlimited) put - options (linkage) true put -@@ -29514,7 +29624,7 @@ - linear options //databarlimited exec - dup (sbs) get /linsbs exch def - dup (bhs) get 0 get 72 mul /linheight exch def -- //renlinear exec -+ dontdraw not { //renlinear exec } { pop } ifelse - - % Plot the separator - mark -@@ -29522,22 +29632,68 @@ - counttomark 1 sub array astore /sep exch def pop pop - sep 0 [0 0 0] putinterval - sep sep length 9 sub [0 0 0 0 0 0 0 0 0] putinterval % 4 + 5 right guard spaces -- 0 linheight rmoveto << -- /ren //renmatrix -- /pixs sep -- /pixx sep length -- /pixy 1 -- /height 1 72 div -- /width sep length 72 div -- /opt options -- >> //renmatrix exec -+ dontdraw not { -+ 0 linheight rmoveto << -+ /ren //renmatrix -+ /pixs sep -+ /pixx sep length -+ /pixy 1 -+ /height 1 72 div -+ /width sep length 72 div -+ /opt options -+ >> //renmatrix exec -+ -+ % Plot the 2D part -+ comp options //gs1-cc exec -+ dup (pixx) get 72 exch sub 1 rmoveto -+ //renmatrix exec - -- % Plot the 2D part -- comp options //gs1-cc exec -- dup (pixx) get 72 exch sub 1 rmoveto -- //renmatrix exec -+ grestore -+ } { -+ /compsym comp options //gs1-cc exec def -+ /ccpixs compsym /pixs get def -+ /ccpixx compsym /pixx get def -+ -+ /linpixs [ 0 % Begin with left guard space -+ linsbs { cvi 1 index 0 eq {{1}} {{0}} ifelse repeat } forall % Alternates x 1/0's -+ ] def -+ /sep [ 0 sep aload pop ] def % Offset by 1 -+ -+ /linheight linheight cvi def -+ /diff linpixs length 5 sub ccpixx sub def % Adding 5 right guard spaces below so subtract 5 -+ diff 0 gt { % 2 column - centre align -+ /ccpad [ diff 2 idiv {0} repeat ] def -+ /pixs [ -+ 0 ccpixx ccpixs length 1 sub { -+ /i exch def -+ 2 { ccpad aload pop ccpixs i ccpixx getinterval aload pop 0 0 0 0 0 ccpad aload pop } repeat -+ } for -+ sep aload pop linheight { linpixs aload pop } repeat -+ ] def -+ /pixx linpixs length def -+ } { % 3/4 column - right pad 1 and right align separator/linear -+ /linpad [ diff neg 1 add {0} repeat ] def -+ /pixs [ -+ 0 ccpixx ccpixs length 1 sub { % Right pad composite with 1 space + 5 right guard spaces -+ /i exch def -+ 2 { ccpixs i ccpixx getinterval aload pop 0 0 0 0 0 0 } repeat -+ } for -+ linpad aload pop sep aload pop linheight { linpad aload pop linpixs aload pop } repeat -+ ] def -+ /pixx ccpixx 1 add def -+ } ifelse - -- grestore -+ /pixy pixs length pixx idiv def -+ << -+ /ren //renmatrix -+ /pixs pixs -+ /pixx pixx -+ /pixy pixy -+ /height pixy 72 div -+ /width pixx 72 div -+ /opt options -+ >> -+ } ifelse - - end - -@@ -29601,7 +29757,7 @@ - pop - } ifelse - -- gsave -+ dontdraw not { gsave } if - - options (lintype) (databarexpanded) put - options (linkage) true put -@@ -29619,7 +29775,7 @@ - linear options //databarexpanded exec - dup (sbs) get /linsbs exch def - dup (bhs) get 0 get 72 mul /linheight exch def -- //renlinear exec -+ dontdraw not { //renlinear exec } { pop } ifelse - - % Plot the separator - /sepfinder { -@@ -29648,20 +29804,60 @@ - 18 98 bot length 13 sub {} for - 69 98 bot length 13 sub {} for - ] {sepfinder} forall -- 0 linheight rmoveto << -- /ren //renmatrix -- /pixs sep -- /pixx sep length -- /pixy 1 -- /height 1 72 div -- /width sep length 72 div -- /opt options -- >> //renmatrix exec -+ dontdraw not { -+ 0 linheight rmoveto << -+ /ren //renmatrix -+ /pixs sep -+ /pixx sep length -+ /pixy 1 -+ /height 1 72 div -+ /width sep length 72 div -+ /opt options -+ >> //renmatrix exec - -- % Plot the 2D part -- 1 1 rmoveto comp options //gs1-cc exec //renmatrix exec -+ % Plot the 2D part -+ 1 1 rmoveto comp options //gs1-cc exec //renmatrix exec - -- grestore -+ grestore -+ } { -+ /compsym comp options //gs1-cc exec def -+ /ccpixs compsym /pixs get def -+ /ccpixx compsym /pixx get def -+ -+ /linpixs [ 0 % Begin with left guard space -+ linsbs { cvi 1 index 0 eq {{1}} {{0}} ifelse repeat } forall % Alternates x 1/0's -+ ] def -+ /sep [ 0 sep aload pop ] def % Offset by 1 -+ -+ /linheight linheight cvi def -+ /diff linpixs length ccpixx sub def -+ diff 2 ge { -+ /cclpad [ 0 0 ] def -+ /ccrpad [ diff 2 sub {0} repeat ] def -+ } { -+ /cclpad [ diff {0} repeat ] def -+ /ccrpad 0 array def -+ } ifelse -+ /pixs [ -+ 0 ccpixx ccpixs length 1 sub { -+ /i exch def -+ 2 { cclpad aload pop ccpixs i ccpixx getinterval aload pop ccrpad aload pop } repeat -+ } for -+ sep aload pop linheight { linpixs aload pop } repeat -+ ] def -+ -+ /pixx linpixs length def -+ /pixy pixs length pixx idiv def -+ << -+ /ren //renmatrix -+ /pixs pixs -+ /pixx pixx -+ /pixy pixy -+ /height pixy 72 div -+ /width pixx 72 div -+ /opt options -+ >> -+ } ifelse - - end - -@@ -29724,7 +29920,7 @@ - pop - } ifelse - -- gsave -+ dontdraw not { gsave } if - - options (lintype) (databarexpandedstacked) put - options (linkage) true put -@@ -29742,7 +29938,7 @@ - linear options //databarexpandedstacked exec - dup (pixs) get 0 2 index (pixx) get getinterval /bot exch def - dup (pixy) get /linheight exch def -- //renmatrix exec -+ dontdraw not { //renmatrix exec } { /pixs get /linpixs exch def } ifelse - - % Plot the separator - /sepfinder { -@@ -29768,21 +29964,49 @@ - 19 98 bot length 13 sub {} for - 70 98 bot length 13 sub {} for - ] {sepfinder} forall -- 0 linheight rmoveto << -- /ren //renmatrix -- /pixs sep -- /pixx sep length -- /pixy 1 -- /height 1 72 div -- /width sep length 72 div -- /opt options -- >> //renmatrix exec -+ dontdraw not { -+ 0 linheight rmoveto << -+ /ren //renmatrix -+ /pixs sep -+ /pixx sep length -+ /pixy 1 -+ /height 1 72 div -+ /width sep length 72 div -+ /opt options -+ >> //renmatrix exec -+ -+ % Plot the 2D part -+ bot 0 get 0 eq {2} {0} ifelse 1 rmoveto -+ comp options //gs1-cc exec //renmatrix exec - -- % Plot the 2D part -- bot 0 get 0 eq {2} {0} ifelse 1 rmoveto -- comp options //gs1-cc exec //renmatrix exec -+ grestore -+ } { -+ /compsym comp options //gs1-cc exec def -+ /ccpixs compsym /pixs get def -+ /ccpixx compsym /pixx get def -+ -+ /pixx sep length def -+ /cclpad [ pixx ccpixx sub 1 add 2 idiv {0} repeat ] def % Add 1 to allow for odd difference -+ /ccrpad [ pixx ccpixx sub 2 idiv {0} repeat ] def -+ /pixs [ -+ 0 ccpixx ccpixs length 1 sub { % Centre align composite -+ /i exch def -+ 2 { cclpad aload pop ccpixs i ccpixx getinterval aload pop ccrpad aload pop } repeat -+ } for -+ sep aload pop linpixs aload pop -+ ] def - -- grestore -+ /pixy pixs length pixx idiv def -+ << -+ /ren //renmatrix -+ /pixs pixs -+ /pixx pixx -+ /pixy pixy -+ /height pixy 72 div -+ /width pixx 72 div -+ /opt options -+ >> -+ } ifelse - - end - -@@ -29846,7 +30070,7 @@ - pop - } ifelse - -- gsave -+ dontdraw not { gsave } if - - options (inkspread) (0) put - options (dontdraw) true put -@@ -29880,35 +30104,87 @@ - linear << options {} forall >> //gs1-128 exec - dup (sbs) get /linsbs exch def - dup (bhs) get 0 get 72 mul /linheight exch def -- //renlinear exec -+ dontdraw not { //renlinear exec } { pop } ifelse - - % Plot the separator - mark - 1 linsbs {1 index 0 eq {{1}} {{0}} ifelse repeat} forall - counttomark 1 sub array astore /sep exch def pop pop -- 0 linheight rmoveto << -- /ren //renmatrix -- /pixs sep -- /pixx sep length -- /pixy 1 -- /height 1 72 div -- /width sep length 72 div -- /opt options -- >> //renmatrix exec -+ dontdraw not { -+ 0 linheight rmoveto << -+ /ren //renmatrix -+ /pixs sep -+ /pixx sep length -+ /pixy 1 -+ /height 1 72 div -+ /width sep length 72 div -+ /opt options -+ >> //renmatrix exec -+ } if - - % Plot the 2D part - linktype (a) eq { - /s linwidth 2 sub 11 idiv def - /p s 9 sub 2 idiv def - /x s p sub 1 sub 11 mul 10 add p 0 eq {2 add} if 99 sub def -- x 1 rmoveto -+ dontdraw not { x 1 rmoveto } if - } { -- -7 1 rmoveto -+ dontdraw not { -7 1 rmoveto } { /x -7 def } ifelse - } ifelse - -- compsym //renmatrix exec -+ dontdraw not { -+ compsym //renmatrix exec - -- grestore -+ grestore -+ } { -+ /ccpixs compsym /pixs get def -+ /ccpixx compsym /pixx get def -+ -+ /linpixs [ -+ linsbs { cvi 1 index 1 eq {{0}} {{1}} ifelse repeat } forall % Alternates x 1/0's -+ ] def -+ -+ x 0 gt { % Left pad composite -+ /cclpad [ x {0} repeat ] def -+ /linlpad 0 array def -+ /diff linwidth ccpixx x add sub def -+ } { % Left pad linear -+ /cclpad 0 array def -+ /linlpad [ x neg {0} repeat ] def -+ /diff linwidth x sub ccpixx sub def -+ } ifelse -+ -+ diff 0 gt { % Right pad composite -+ /ccrpad [ diff {0} repeat ] def -+ /linrpad 0 array def -+ } { % Right pad linear -+ /ccrpad 0 array def -+ /linrpad [ diff neg {0} repeat ] def -+ } ifelse -+ -+ /linheight linheight cvi def -+ /ccrepeat linktype (a) eq {2} {3} ifelse def -+ /pixs [ -+ 0 ccpixx ccpixs length 1 sub { -+ /i exch def -+ ccrepeat { cclpad aload pop ccpixs i ccpixx getinterval aload pop ccrpad aload pop } repeat -+ } for -+ linlpad aload pop sep aload pop linrpad aload pop -+ linheight { linlpad aload pop linpixs aload pop linrpad aload pop } repeat -+ ] def -+ -+ /pixx cclpad length ccpixx add ccrpad length add def -+ /pixy pixs length pixx idiv def -+ << -+ /ren //renmatrix -+ /pixs pixs -+ /pixx pixx -+ /pixy pixy -+ /height pixy 72 div -+ /width pixx 72 div -+ /opt options -+ >> -+ } ifelse - - end - -@@ -31392,3 +31668,189 @@ - % --END ENCODER hibcazteccode-- - - % --END TEMPLATE-- -+%!PS -+ -+% To compress: tar cv bwipp_dump.ps | xz -e9 > bwipp_dump.ps.tar.xz -+ -+% Dumps bwipp barcode binary to stdout. If `-sn` given, appends a newline after each symbol row, otherwise doesn't. -+% -+% To run e.g. gs -dNOPAUSE -dBATCH -dNODISPLAY -q -sb=databarexpanded -sd='(01)98898765432106' -so='includetext segments=6' bwipp_dump.ps -+% where -+% `-sb=` is the bwipp barcode routine name -+% `-sd=` is the data (`sd2=` is also available for overspill data > 2K to get around Ghostscript arg_str_max) -+% `-so=` are options (as space separated key=val pairs (or just key if boolean true)) -+ -+% Command line "-s" options put into system dictionary as strings -+/n systemdict /n known def -+ -+% Append d2 to d if given -+systemdict /d2 known { -+ /d d length d2 length add string dup dup 0 d putinterval d length d2 putinterval def -+} if -+ -+% Strip start/end parens from data if any -+d 0 1 getinterval (\() eq d d length 1 sub 1 getinterval (\)) eq and { -+ /d d 1 d length 2 sub getinterval d length 2 sub string copy def -+} if -+ -+% Options -+systemdict /o known { -+ o type /stringtype eq o length 0 gt and { -+ o length 2 ge { -+ % Strip start/end parens from options if any -+ o 0 1 getinterval (\() eq o o length 1 sub 1 getinterval (\)) eq and { -+ /o o 1 o length 2 sub getinterval o length 2 sub string copy def -+ } if -+ } if -+ 3 dict begin -+ o { -+ token not {exit} if -+ dup length string cvs (=) search { -+ cvlit exch pop exch def -+ } { -+ cvlit true def -+ } ifelse -+ } loop -+ currentdict end /o exch def -+ } { -+ /o 1 dict def -+ } ifelse -+} { -+ /o 1 dict def -+} ifelse -+ -+o (dontdraw) true put -+ -+/ret d o b cvn /uk.co.terryburton.bwipp findresource exec def -+ -+% pixs is renmatrix input -+ret /pixs known { -+ b (maxicode) eq { -+ /pixs 990 array def -+ 0 1 989 { pixs exch 0 put } for -+ ret /pixs get { pixs exch 1 put } forall -+ } { -+ /pixs ret /pixs get def -+ } ifelse -+ -+ /xs systemdict /xs known { systemdict /xs get cvi } { 0 } ifelse def -+ /xe systemdict /xe known { systemdict /xe get cvi } { 0 } ifelse def -+ -+ n xs 0 ne or xe 0 ne or ret /pixx known and { % If newlines or start/end indexes requested and have row width -+ /pixx ret /pixx get def -+ xs pixx pixs length 1 sub xe sub { % For i = xs; i < pixs length - xe; i += pixx -+ pixs exch pixx xs sub xe sub getinterval { % For j = i; j < i + pixx - xs -xe; j++ -+ 1 string cvs print -+ } forall -+ n { (\n) print } if -+ } for -+ } { % Else dump the whole thing, no newlines -+ pixs { 1 string cvs print } forall -+ } ifelse -+} { -+ % sbs is renlinear input -+ ret /sbs known { -+ /sbs ret /sbs get def -+ -+ % Check if given preprocessor override -+ systemdict /p known { -+ /p systemdict /p get cvx def -+ } { -+ /p { false } def -+ } ifelse -+ -+ % Check if given ratio arg to adjust width of bars/spaces (e.g. "0.6" reduces 3 -> 2, "1.3" increases 2 -> 3) -+ systemdict /r known { -+ /r systemdict /r get cvr def -+ systemdict /c known { % Apply ceiling ratio beforehand -+ /c systemdict /c get cvr def -+ /f { c mul ceiling cvi r mul round cvi } def -+ } { -+ /f { r mul round cvi } def -+ } ifelse -+ } { -+ /f {} def -+ } ifelse -+ -+ % If should begin with space -+ systemdict /bs known { (0) print } if -+ -+ % If should end sbs loop on bar (i.e. ignore last index of even-length sbs) -+ /limit systemdict /elb known { -+ sbs length 1 add 2 idiv 2 mul 2 sub -+ } { -+ sbs length 1 sub -+ } ifelse def -+ -+ % If should use bhs/bbs to emulate rows (DAFT/pharmacode2) (hacky) -+ /nosbs false def -+ /minh 999999 def -+ /midh 0 def -+ /maxh 0 def -+ /maxb 0 def -+ systemdict /hs known ret /bhs known and ret /bbs known and { -+ /bhs ret /bhs get def -+ /bbs ret /bbs get def -+ 0 1 bhs length 1 sub { -+ /i exch def -+ /h bhs i get def -+ /b bbs i get def -+ h minh lt { /minh h def } if -+ h maxh gt { /maxh h def } if -+ h minh ne h maxh ne and { /midh h def } if -+ b maxb gt { /maxb b def } if -+ } for -+ 0 1 limit { -+ /i exch def -+ i 2 mod 0 eq { % i is even -+ /h bhs i 2 idiv get def -+ /b bbs i 2 idiv get def -+ h maxh eq h midh eq b maxb eq and or maxb 0 ne b maxb eq and midh 0 eq and h minh eq and or { (1) } { (0) } ifelse print % Yeah, me too -+ } { -+ (0) print -+ } ifelse -+ } for -+ n { (\n) print } if -+ maxb 0 ne midh 0 eq and maxb 0 eq minh maxh eq and or { /nosbs true def } if % No tracker (pharmacode2) -+ } if -+ -+ % Process sbs -+ nosbs not { -+ 0 1 limit { -+ /i exch def -+ p not { % If not preprocessed -+ i 2 mod 0 eq { % i is even -+ sbs i get f cvi { (1) print } repeat -+ } { -+ sbs i get f cvi { (0) print } repeat -+ } ifelse -+ } if -+ } for -+ n { (\n) print } if -+ } if -+ -+ % Third row if DAFT, second row if no tracker (pharmacode2) -+ maxb 0 ne midh 0 ne or minh maxh eq or { -+ 0 1 limit { -+ /i exch def -+ i 2 mod 0 eq { % i is even -+ /b bbs i 2 idiv get def -+ b 0 eq { (1) } { (0) } ifelse print -+ } { -+ (0) print -+ } ifelse -+ } for -+ n { (\n) print } if -+ } if -+ } if -+} ifelse -+ -+% If have renderer -+ret /ren known { -+ % Scale -+ /s systemdict /s known { systemdict /s get cvi } { 2 } ifelse def -+ % If not -dNODISPLAY then render for debugging -+ currentpagedevice /Name get (nullpage) ne { s s scale 10 10 moveto ret ret /ren get exec } if -+} if -+ -+% vim: set ts=4 sw=4 et : diff --git a/backend/tests/tools/bwipp_dump.ps.tar.xz b/backend/tests/tools/bwipp_dump.ps.tar.xz index ea5ad102..8eafff7b 100644 Binary files a/backend/tests/tools/bwipp_dump.ps.tar.xz and b/backend/tests/tools/bwipp_dump.ps.tar.xz differ diff --git a/docs/manual.pmd b/docs/manual.pmd index 3291b8b8..f37505d7 100644 --- a/docs/manual.pmd +++ b/docs/manual.pmd @@ -869,8 +869,8 @@ zint -r -d "This Text" ``` gives an inverted Code 128 symbol. This is not practical for most symbologies -but white-on-black is allowed by the Aztec Code, Data Matrix, Han Xin Code, Grid -Matrix and QR Code symbology specifications. +but white-on-black is allowed by the Aztec Code, Data Matrix, DotCode, Han Xin +Code, Grid Matrix and QR Code symbology specifications. For more specific needs the foreground (ink) and background (paper) colours can be specified using the `--fg` and `--bg` options followed by a number in RRGGBB diff --git a/docs/manual.txt b/docs/manual.txt index d22bbbfe..f999ad8f 100644 --- a/docs/manual.txt +++ b/docs/manual.txt @@ -980,8 +980,8 @@ to be inverted so that a white symbol is shown on a black background (known as zint -r -d "This Text" gives an inverted Code 128 symbol. This is not practical for most symbologies -but white-on-black is allowed by the Aztec Code, Data Matrix, Han Xin Code, Grid -Matrix and QR Code symbology specifications. +but white-on-black is allowed by the Aztec Code, Data Matrix, DotCode, Han Xin +Code, Grid Matrix and QR Code symbology specifications. For more specific needs the foreground (ink) and background (paper) colours can be specified using the --fg and --bg options followed by a number in RRGGBB