summaryrefslogtreecommitdiff
path: root/graphics/pstricks/contrib/pst-barcode/doc/images/swissqrcode-1.eps
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/pstricks/contrib/pst-barcode/doc/images/swissqrcode-1.eps')
-rw-r--r--graphics/pstricks/contrib/pst-barcode/doc/images/swissqrcode-1.eps1834
1 files changed, 1834 insertions, 0 deletions
diff --git a/graphics/pstricks/contrib/pst-barcode/doc/images/swissqrcode-1.eps b/graphics/pstricks/contrib/pst-barcode/doc/images/swissqrcode-1.eps
new file mode 100644
index 0000000000..c5055dac79
--- /dev/null
+++ b/graphics/pstricks/contrib/pst-barcode/doc/images/swissqrcode-1.eps
@@ -0,0 +1,1834 @@
+%!PS-Adobe-3.0 EPSF-3.0
+%%BoundingBox: 0 0 262 262
+%%Creator: https://www.terryburton.co.uk/barcodewriter/generator/
+%%Copyright: Barcode Writer in Pure PostScript
+%%Pages: 1
+%%LanguageLevel: 2
+%%DocumentData: Clean7Bit
+%%EndComments
+%%BeginProlog
+%%BeginResource: Category uk.co.terryburton.bwipp 0.0 2020040100 29629 32838
+%%BeginData: 6 ASCII Lines
+currentglobal
+true setglobal
+/Generic /Category findresource dup length 1 add dict copy dup
+/InstanceType /setpacking where {pop /packedarraytype} {/arraytype} ifelse put
+/uk.co.terryburton.bwipp exch /Category defineresource pop
+setglobal
+%%EndData
+%%EndResource
+
+%%BeginResource: uk.co.terryburton.bwipp raiseerror 0.0 2020040100 39041 38872
+%%BeginData: 15 ASCII Lines
+/setpacking where {pop currentpacking true setpacking} if
+1 dict
+begin
+/raiseerror {
+ $error exch /errorinfo exch put
+ $error exch /errorname exch put
+ $error /command null put
+ $error /newerror true put
+ stop
+}
+[/barcode] {null def} forall
+bind def
+/raiseerror dup load /uk.co.terryburton.bwipp defineresource pop
+end
+/setpacking where {pop setpacking} if
+%%EndData
+%%EndResource
+
+%%BeginResource: uk.co.terryburton.bwipp renmatrix 0.0 2020040100 90671 89701
+%%BeginData: 306 ASCII Lines
+/setpacking where {pop currentpacking true setpacking} if
+1 dict
+dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
+begin
+/renmatrix {
+
+ 20 dict begin
+
+ /args exch def
+
+ % Default options
+ /width 1 def
+ /height 1 def
+ /barcolor (unset) def
+ /backgroundcolor (unset) def
+ /colormap (unset) def
+ /dotty false def
+ /inkspread 0 def
+ /inkspreadh 0 def
+ /inkspreadv 0 def
+ /includetext false def
+ /txt [] 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
+
+ % Apply the renderer options and the user options
+ args {def} forall
+ opt {def} forall
+
+ /width width cvr def
+ /height height cvr def
+ /barcolor barcolor cvlit def
+ /backgroundcolor backgroundcolor cvlit def
+ /inkspread inkspread cvr def
+ /inkspreadh inkspreadh cvr def
+ /inkspreadv inkspreadv cvr 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
+
+ inkspread 0 ne {/inkspreadh inkspread def} if
+ inkspread 0 ne {/inkspreadv inkspread def} if
+
+ /xyget { pixx mul add pixs exch get} bind def
+ /cget { pixx mul add cache exch get and} bind def
+ /cput { % Optimise by only storing "stem" corners
+ dup 4 mod 0 eq { % dir is up or left
+ 3 1 roll pixx mul add cache exch 2 copy get 4 -1 roll or put
+ } {
+ pop pop pop
+ } ifelse
+ } bind def
+
+ /abcd {
+ 4 string 0 [
+ 5 -2 roll
+ pixx mul add dup
+ pixs exch 2 getinterval aload pop 3 -1 roll % A B
+ pixs exch pixx add 2 getinterval aload pop % C D
+ ] {3 copy 48 add put pop 1 add} forall pop
+ } bind def
+
+ /right {dir 1 ne {x y dir cput [x y]} if /x x 1 add def /dir 1 def} bind def
+ /down {dir 2 ne {x y dir cput [x y]} if /y y 1 add def /dir 2 def} bind def
+ /left {dir 4 ne {x y dir cput [x y]} if /x x 1 sub def /dir 4 def} bind def
+ /up {dir 8 ne {x y dir cput [x y]} if /y y 1 sub def /dir 8 def} bind def
+
+ /trace {
+ % Walk the outline of a region emitting edge coordinates of the path
+ /y exch def /x exch def
+ % dir 1:right 2:down 4:left 8:up
+ /dir x 1 add y 1 add xyget 1 eq {8} {4} ifelse def
+ /sx x def /sy y def /sdir dir def
+
+ % A B
+ % C D
+ mark {
+ x y abcd
+ 1 { % Common exit
+ dup dup (0001) eq exch dup (0011) eq exch (1011) eq or or {pop right exit} if
+ dup dup (0010) eq exch dup (1010) eq exch (1110) eq or or {pop down exit} if
+ dup dup (1000) eq exch dup (1100) eq exch (1101) eq or or {pop left exit} if
+ dup dup (0100) eq exch dup (0101) eq exch (0111) eq or or {pop up exit} if
+ dup (1001) eq {
+ dir 2 eq {pop left exit} {pop right exit} ifelse
+ } { % 0110
+ dir 1 eq {pop down exit} {pop up exit} ifelse
+ } ifelse
+ } repeat
+ x sx eq y sy eq and dir sdir eq and {exit} if
+ } loop
+ counttomark array astore exch pop
+
+ } bind def
+
+ % 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
+
+ % Plot a layer of single colour
+ /drawlayer {
+
+ /pixsorig pixs def
+ /pixs exch def
+
+ % Pad the bitmap on all sides
+ /pixs [
+ pixx 2 add {0} repeat
+ 0 pixx pixs length 1 sub {
+ 0 exch
+ pixs exch pixx getinterval aload pop
+ 0
+ } for
+ pixx 2 add {0} repeat
+ ] def
+ /pixx pixx 2 add def
+ /pixy pixy 2 add def
+
+ % Cache of visited corners for each direction
+ /cache [ pixs length {0} repeat ] def
+
+ % Construct paths by tracing regions avoiding duplication by using the cache
+ /paths [
+ 0 1 pixy 2 sub {
+ /j exch def
+ 0 1 pixx 2 sub {
+ /i exch def
+ /k i j abcd def
+ k (0001) eq k (1001) eq or { % Black region stem corners
+ 8 i j cget 0 eq {
+ i j trace
+ } if
+ } if
+ k (1110) eq { % White region stem corner
+ 4 i j cget 0 eq {
+ i j trace
+ } if
+ } if
+ } for
+ } for
+ ] def
+
+ % Revert the bitmap size
+ /pixx pixx 2 sub def
+ /pixy pixy 2 sub def
+
+ % Draw the image
+ newpath
+ paths {
+ /p exch def
+ /len p length def
+ p len 1 sub get aload pop
+ p 0 get aload pop
+ 0 1 len 1 sub { % x1 y1 x2 y2
+ /i exch def
+ p i 1 add len mod get aload pop 6 -2 roll % x3 y3 x1 y1 x2 y2
+ 5 index inkspreadh
+ 4 index 4 -1 roll lt {add} {sub} ifelse % y3<y1 ? x2+i : x2-i
+ 4 1 roll
+ 4 index inkspreadv
+ 4 index 4 -1 roll gt {add} {sub} ifelse % x3>x1 ? y2+i : y2-i
+ 4 -1 roll exch pixy exch sub
+ i 0 eq {moveto} {lineto} ifelse
+ } for % x2 y2 x3 y3
+ closepath
+ pop pop pop pop
+ } forall
+ fill
+
+ /pixs pixsorig def
+
+ } bind def
+
+ /drawlayerdots {
+
+ /pixsorig pixs def
+ /pixs exch def
+
+ newpath
+ 0 1 pixs length 1 sub {
+ dup pixx mod /x exch def
+ pixx idiv /y exch def
+ x y xyget 1 eq {
+ x 0.5 add pixy y sub 0.5 sub moveto
+ x 0.5 add pixy y sub 0.5 sub 0.5 inkspread sub 0 360 arc
+ } if
+ } for
+ fill
+
+ /pixs pixsorig def
+
+ } bind def
+
+ gsave
+
+ % Draw the image
+ /inkspread inkspread 2 div def
+ /inkspreadh inkspreadh 2 div def
+ /inkspreadv inkspreadv 2 div def
+ currentpoint translate
+ width pixx div 72 mul height pixy div 72 mul scale
+ 0 0 moveto pixx 0 lineto pixx pixy lineto 0 pixy lineto closepath
+ backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if
+
+ colormap (unset) eq {
+ /colormap << 1 barcolor >> def
+ } if
+
+ colormap {
+ setanycolor
+ /key exch def
+ [
+ pixs { key eq {1} {0} ifelse } forall
+ ] dotty {drawlayerdots} {drawlayer} ifelse
+ } forall
+
+ % 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 /fn () def
+ txt {
+ {} forall
+ 2 copy s ne exch fn ne or {
+ 2 copy /s exch def /fn exch def
+ selectfont
+ } {
+ pop pop
+ } ifelse
+ moveto show
+ } forall
+ } {
+ textfont textsize selectfont
+ 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 pixy add 1 add def } if
+ textyalign (center) eq { /textypos textyoffset pixy textascent sub 2 div add def } if
+ textxpos textypos moveto textgaps 0 tstr ashow
+ } ifelse
+ } if
+
+ grestore
+
+ end
+
+}
+[/barcode] {null def} forall
+bind def
+/renmatrix dup load /uk.co.terryburton.bwipp defineresource pop
+end
+/setpacking where {pop setpacking} if
+%%EndData
+%%EndResource
+
+%%BeginResource: uk.co.terryburton.bwipp qrcode 0.0 2020040100 303640 335045
+%%BeginData: 1292 ASCII Lines
+/setpacking where {pop currentpacking true setpacking} if
+1 dict
+dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
+dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
+begin
+/qrcode {
+
+ 20 dict begin
+
+ /options exch def
+ /barcode exch def
+
+ /dontdraw false def
+ /format (unset) def % full or micro. rMQR symbols are specified using version
+ /version (unset) def % 1-40 or M1-M4 or R7x43, etc
+ /eclevel (unset) def % full: L, M, Q, H; micro: L, M, Q; rmqr: M, H
+ /parse false def
+ /parsefnc false def
+ /mask -1 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
+
+ /mask mask cvi def
+
+ % If version is supplied and format is not given then set format to correspond
+ version (unset) ne {
+ format (unset) eq {
+ (full)
+ version 0 1 getinterval (M) eq { pop (micro) } if
+ version 0 1 getinterval (R) eq { pop (rmqr) } if
+ /format exch def
+ } if
+ } {
+ format (unset) eq { /format (full) def } if % Default to full
+ } ifelse
+
+ % Parse ordinals of the form ^NNN to ASCII
+ parse {
+ /msg barcode length string def
+ /j 0 def
+ barcode
+ { % loop
+ (^) search {
+ dup msg exch j exch putinterval
+ length j add 1 add /j exch def
+ pop
+ dup 0 3 getinterval cvi msg exch j 1 sub exch put
+ dup length 3 sub 3 exch getinterval
+ } {
+ dup msg exch j exch putinterval
+ length j add /j exch def
+ /barcode msg 0 j getinterval def
+ exit
+ } ifelse
+ } loop
+ } if
+
+ /barlen barcode length def
+
+ % Convert input into bytes accounting for FNC characters
+ /fn1 -1 def
+ /fncvals <<
+ (FNC1) fn1
+ >> def
+ /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
+
+ % If FNC1 in first position then escape % as %%
+ /fnc1first false def
+ msglen 0 gt {
+ msg 0 get fn1 eq {
+ /fnc1first true def
+ /msg [ msg 1 msglen 1 sub getinterval { dup 37 eq {dup} if } forall ] def
+ /msglen msg length def
+ } if
+ } if
+
+ % Default error correction level
+ eclevel (unset) eq {/eclevel format (micro) ne {(M)} {(L)} ifelse def} if
+
+ % Enumerate vergrps
+ [
+ /v1to9 /v10to26 /v27to40
+ /vM1 /vM2 /vM3 /vM4
+ /vR7x43 /vR7x59 /vR7x77 /vR7x99 /vR7x139
+ /vR9x43 /vR9x59 /vR9x77 /vR9x99 /vR9x139
+ /vR11x27 /vR11x43 /vR11x59 /vR11x77 /vR11x99 /vR11x139
+ /vR13x27 /vR13x43 /vR13x59 /vR13x77 /vR13x99 /vR13x139
+ /vR15x43 /vR15x59 /vR15x77 /vR15x99 /vR15x139
+ /vR17x43 /vR17x59 /vR17x77 /vR17x99 /vR17x139
+ ] 0 exch {1 index def 1 add} forall pop
+
+ % Convert from input into message bitstream
+ /N 0 def /A 1 def /B 2 def /K 3 def
+
+ /Nexcl <<
+ [
+ 16#30 1 16#39 {} for
+ ] {-1} forall
+ >> def
+
+ /Aexcl <<
+ [
+ 16#20 16#24 16#25 16#2A 16#2B 16#2D 16#2E 16#2F 16#3A
+ 16#41 1 16#5A {} for
+ fn1
+ ] {-1} forall
+ >> def
+
+ /Bexcl <<
+ [
+ 16#00 1 16#1F {} for
+ 16#21 16#22 16#23 16#26 16#27 16#28 16#29 16#2C
+ 16#3B 1 16#40 {} for
+ 16#5B 1 16#7F {} for
+ 16#A0 1 16#DF {} for
+ ] {-1} forall
+ >> def
+
+ /Kexcl <<
+ [
+ 16#81 1 16#9F {} for
+ 16#E0 1 16#EB {} for
+ ] {-1} forall
+ >> def
+
+ /mids [ % N A B K
+ [ (0001) (0010) (0100) (1000) ] % v1to9
+ [ (0001) (0010) (0100) (1000) ] % v10to26
+ [ (0001) (0010) (0100) (1000) ] % v27to40
+ [ () -1 -1 -1 ] % vM1
+ [ (0) (1) -1 -1 ] % vM2
+ [ (00) (01) (10) (11) ] % vM3
+ [ (000) (001) (010) (011) ] % vM4
+ 32 {
+ [ (001) (010) (011) (100) ] % rMQR
+ } repeat
+ ] def
+
+ /cclens [ % N A B K
+ [ 10 9 8 8 ] % v1to9
+ [ 12 11 16 10 ] % v10to26
+ [ 14 13 16 12 ] % v27to40
+ [ 3 -1 -1 -1 ] % vM1
+ [ 4 3 -1 -1 ] % vM2
+ [ 5 4 4 3 ] % vM3
+ [ 6 5 5 4 ] % vM4
+ [ 4 3 3 2 ] % vR7x43
+ [ 5 5 4 3 ] % vR7x59
+ [ 6 5 5 4 ] % vR7x77
+ [ 7 6 5 5 ] % vR7x99
+ [ 7 6 6 5 ] % vR7x139
+ [ 5 5 4 3 ] % vR9x43
+ [ 6 5 5 4 ] % vR9x59
+ [ 7 6 5 5 ] % vR9x77
+ [ 7 6 6 5 ] % vR9x99
+ [ 8 7 6 6 ] % vR9x139
+ [ 4 4 3 2 ] % vR11x27
+ [ 6 5 5 4 ] % vR11x43
+ [ 7 6 5 5 ] % vR11x59
+ [ 7 6 6 5 ] % vR11x77
+ [ 8 7 6 6 ] % vR11x99
+ [ 8 7 7 6 ] % vR11x139
+ [ 5 5 4 3 ] % vR13x27
+ [ 6 6 5 5 ] % vR13x43
+ [ 7 6 6 5 ] % vR13x59
+ [ 8 7 6 6 ] % vR13x77
+ [ 8 7 7 6 ] % vR13x99
+ [ 8 8 7 7 ] % vR13x139
+ [ 7 6 6 5 ] % vR15x43
+ [ 7 7 6 5 ] % vR15x59
+ [ 8 7 7 6 ] % vR15x77
+ [ 8 7 7 6 ] % vR15x99
+ [ 9 8 7 7 ] % vR15x139
+ [ 7 6 6 5 ] % vR17x43
+ [ 8 7 6 6 ] % vR17x59
+ [ 8 7 7 6 ] % vR17x77
+ [ 8 8 7 6 ] % vR17x99
+ [ 9 8 8 7 ] % vR17x139
+ ] def
+
+ /termlens [
+ 3 {
+ 4 % Full
+ } repeat
+ 3 % vM1
+ 5 % vM2
+ 7 % vM3
+ 9 % vM4
+ 32 {
+ 3 % rMQR
+ } repeat
+ ] def
+
+ % Encoding functions
+ /tobin {
+ string dup length 1 sub 0 exch 1 exch {1 index exch 48 put} for
+ dup 3 -1 roll 2 2 index length string cvrs dup length 2 index length exch sub exch putinterval
+ } bind def
+
+ % Alphanumeric character to value map
+ /charmap (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ $%*+-./:) def
+ /charvals 44 dict def
+ 0 1 44 {dup charmap exch get exch charvals 3 1 roll put} for
+
+ /encA {
+ /in exch def
+ fnc1first { % FNC1 as %
+ /in [ in { dup -1 eq {pop 37} if } forall ] def
+ } if
+ /out in length 11 mul 2 idiv 1 add string def
+ /k 0 def /m 0 def {
+ k in length eq {exit} if
+ k in length 1 sub lt {
+ charvals in k get get 45 mul charvals in k 1 add get get add 11 tobin
+ /k k 2 add def
+ } { % Final character
+ charvals in k get get 6 tobin
+ /k k 1 add def
+ } ifelse
+ dup out exch m exch putinterval
+ length m add /m exch def
+ } loop
+ out 0 m getinterval
+ } bind def
+
+ /encN {
+ /in exch def
+ /out in length 10 mul 3 idiv 1 add string def
+ /k 0 def /m 0 def {
+ k in length eq {exit} if
+ k in length 2 sub lt {
+ in k 3 getinterval 0 exch {exch 10 mul 48 sub add} forall 10 tobin
+ /k k 3 add def
+ } {
+ k in length 2 sub eq { % Two final digits
+ in k 2 getinterval 0 exch {exch 10 mul 48 sub add} forall 7 tobin
+ /k k 2 add def
+ } { % One final digit
+ in k 1 getinterval 0 exch {exch 10 mul 48 sub add} forall 4 tobin
+ /k k 1 add def
+ } ifelse
+ } ifelse
+ dup out exch m exch putinterval
+ length m add /m exch def
+ } loop
+ out 0 m getinterval
+ } bind def
+
+ /encB {
+ /in exch def
+ fnc1first { % FNC1 as GS
+ /in [ in { dup -1 eq {pop 29} if } forall ] def
+ } if
+ /out in length 8 mul string def
+ 0 1 in length 1 sub {
+ /k exch def
+ in k get cvi 8 tobin
+ out k 8 mul 3 -1 roll putinterval
+ } for
+ out
+ } bind def
+
+ /encK {
+ /in exch def
+ /out in length 2 idiv 13 mul string def
+ /k 0 def /m 0 def {
+ k in length eq {exit} if
+ in k get 256 mul in k 1 add get add
+ dup 16#E040 lt {16#8140} {16#C140} ifelse sub
+ dup -8 bitshift 16#C0 mul exch 16#00FF and add
+ 13 tobin dup out exch m exch putinterval
+ length m add /m exch def
+ /k k 2 add def
+ } loop
+ out
+ } bind def
+
+ /encfuncs [ /encN /encA /encB /encK ] def
+
+ /addtobits {
+ dup bits j 3 -1 roll putinterval
+ length j add /j exch def
+ } bind def
+
+ /numNs [ msglen {0} repeat 0 ] def
+ /numAs [ msglen {0} repeat 0 ] def
+ /numBs [ msglen {0} repeat 0 ] def
+ /numKs [ msglen {0} repeat -1 ] def
+ /nextNs [ msglen {0} repeat 9999 ] def
+ /nextBs [ msglen {0} repeat 9999 ] def
+ /nextAs [ msglen {0} repeat 9999 ] def
+ /nextKs [ msglen {0} repeat 9999 ] def
+ msglen 1 sub -1 0 {
+ /i exch def
+ /barchar msg i get def
+ Kexcl barchar known {
+ nextKs i 0 put
+ numKs i numKs i 1 add get 1 add put
+ } {
+ nextKs i nextKs i 1 add get 1 add put
+ } ifelse
+ Nexcl barchar known {
+ nextNs i 0 put
+ numNs i numNs i 1 add get 1 add put
+ } {
+ nextNs i nextNs i 1 add get 1 add put
+ } ifelse
+ Bexcl barchar known {
+ nextBs i 0 put
+ numBs i numBs i 1 add get 1 add put
+ } {
+ nextBs i nextBs i 1 add get 1 add put
+ } ifelse
+ Aexcl barchar known {
+ nextAs i 0 put
+ numAs i numAs i 1 add get 1 add put
+ } {
+ nextAs i nextAs i 1 add get 1 add put
+ } ifelse
+ } for
+ /numKs [ numKs {1 add 2 idiv} forall ] def
+
+ /KbeforeB {numK exch ver get ge nextBs numK 2 mul i add get 0 eq and} bind def
+ /KbeforeA {numK exch ver get ge nextAs numK 2 mul i add get 0 eq and} bind def
+ /KbeforeN {numK exch ver get ge nextNs numK 2 mul i add get 0 eq and} bind def
+ /KbeforeE {numK exch ver get ge numK 2 mul i add msglen eq and} bind def
+ /AbeforeK {numA exch ver get ge nextKs numA i add get 0 eq and} bind def
+ /AbeforeB {numA exch ver get ge nextBs numA i add get 0 eq and} bind def
+ /AbeforeN {numA exch ver get ge nextNs numA i add get 0 eq and} bind def
+ /AbeforeE {numA exch ver get ge numA i add msglen eq and} bind def
+ /NbeforeK {numN exch ver get ge nextKs numN i add get 0 eq and} bind def
+ /NbeforeB {numN exch ver get ge nextBs numN i add get 0 eq and} bind def
+ /NbeforeA {numN exch ver get ge nextAs numN i add get 0 eq and} bind def
+ /NbeforeE {numN exch ver get ge numN i add msglen eq and} bind def
+
+ % Elements of the encoded message have differing lengths based on the
+ % resulting symbol size. The symbol sizes with different element lengths
+ % are batched into vergrps. To pick the smallest symbol that holds our
+ % content we encode the message according to each available vergrp, based
+ % on the format of symbol.
+
+ % Determine which groups we need to encode
+ version (unset) ne {
+ % A specific version of symbol is given so encode in just the corresponding vergrp
+ /verset <<
+ % Full
+ 0 1 9 { 10 2 string cvrs v1to9 } for
+ 10 1 26 { 10 2 string cvrs v10to26 } for
+ 27 1 40 { 10 2 string cvrs v27to40 } for
+
+ % Micro
+ (M1) vM1 (M2) vM2 (M3) vM3 (M4) vM4
+
+ % rMQR
+ (R7x43) vR7x43 (R7x59) vR7x59 (R7x77) vR7x77 (R7x99) vR7x99 (R7x139) vR7x139
+ (R9x43) vR9x43 (R9x59) vR9x59 (R9x77) vR9x77 (R9x99) vR9x99 (R9x139) vR9x139
+ (R11x27) vR11x27 (R11x43) vR11x43 (R11x59) vR11x59 (R11x77) vR11x77 (R11x99) vR11x99 (R11x139) vR11x139
+ (R13x27) vR13x27 (R13x43) vR13x43 (R13x59) vR13x59 (R13x77) vR13x77 (R13x99) vR13x99 (R13x139) vR13x139
+ (R15x43) vR15x43 (R15x59) vR15x59 (R15x77) vR15x77 (R15x99) vR15x99 (R15x139) vR15x139
+ (R17x43) vR17x43 (R17x59) vR17x59 (R17x77) vR17x77 (R17x99) vR17x99 (R17x139) vR17x139
+ >> version get [ exch ] def
+ } {
+ % Just the format is specified so encode in each vergrp for the type of symbol
+ format (full) eq { /verset [v1to9 v10to26 v27to40] def } if
+ format (micro) eq { /verset [vM1 vM2 vM3 vM4] def } if
+ % rMQR symbols are accessed with an explicit version
+ } ifelse
+
+ % Encode unterminated bitsream for each compatible vergrp separately
+ /msgbits [ 39 {-1} repeat ] def
+ /e 10000 def
+ verset {
+ /ver exch def
+
+ % Derive optimal sequence
+ /mode -1 def /seq [] def /i 0 def {
+ i msglen ge {exit} if
+ /numK numKs i get def
+ /numB numBs i get def
+ /numA numAs i get def
+ /numN numNs i get def
+ ver vM1 eq numA 1 ge and {/seq -1 def exit} if
+ ver vM1 eq numB 1 ge and {/seq -1 def exit} if
+ ver vM1 eq numK 1 ge and {/seq -1 def exit} if
+ ver vM2 eq numB 1 ge and {/seq -1 def exit} if
+ ver vM2 eq numK 1 ge and {/seq -1 def exit} if
+ { % common exit
+ ver vR7x43 ge { % TODO rMQR is binary only for now
+ B exit
+ } if
+ mode -1 eq { % Set initial mode
+ [ 1 1 1 e e 1 1] KbeforeA {K exit} if
+ [ 1 1 1 e e 1 1] KbeforeN {K exit} if
+ [ 5 5 6 e e 2 3] KbeforeB {K exit} if
+ [ 1 1 1 e e 1 1] KbeforeE {K exit} if
+ numK 1 ge {B exit} if
+ [ 6 7 8 e e 3 4] AbeforeB {A exit} if
+ [ 1 1 1 e 1 1 1] AbeforeE {A exit} if
+ numA 1 ge {
+ ver vM2 ne {B} {A} ifelse exit
+ } if
+ [ 4 4 5 e e 2 3] NbeforeB {N exit} if
+ [ 1 1 1 e e 1 1] NbeforeB {B exit} if
+ [ 7 8 9 e 3 4 5] NbeforeA {N exit} if
+ [ 1 1 1 e 1 1 1] NbeforeA {A exit} if
+ numN 1 ge {N exit} if
+ B exit
+ } if
+ mode B eq {
+ [ 9 12 13 e e 4 5] KbeforeB {K exit} if
+ [ 9 10 12 e e 4 5] KbeforeA {K exit} if
+ [ 9 10 11 e e 5 6] KbeforeN {K exit} if
+ [ 4 5 6 e e 2 3] KbeforeE {K exit} if
+ [11 12 14 e e 5 7] AbeforeK {A exit} if
+ [11 15 16 e e 6 7] AbeforeB {A exit} if
+ [12 13 15 e e 6 8] AbeforeN {A exit} if
+ [ 6 7 8 e e 3 4] AbeforeE {A exit} if
+ [ 6 7 8 e e 3 4] NbeforeK {N exit} if
+ [ 6 8 9 e e 3 4] NbeforeB {N exit} if
+ [ 6 7 8 e e 3 4] NbeforeA {N exit} if
+ [ 3 4 5 e e 2 3] NbeforeE {N exit} if
+ B exit
+ } if
+ mode A eq {
+ numK 1 ge {K exit} if
+ numB 1 ge {B exit} if
+ [13 15 17 e 5 7 9] NbeforeA {N exit} if
+ [13 17 18 e e 7 9] NbeforeB {N exit} if
+ [ 7 8 9 e 3 4 5] NbeforeE {N exit} if
+ numA 1 ge numN 1 ge or {A exit} if
+ B exit
+ } if
+ mode N eq {
+ numK 1 ge {K exit} if
+ numB 1 ge {B exit} if
+ numA 1 ge {A exit} if
+ numN 1 ge {N exit} if
+ B exit
+ } if
+ mode K eq {
+ numB 1 ge {B exit} if
+ numA 1 ge {A exit} if
+ numN 1 ge {N exit} if
+ numK 1 ge {K exit} if
+ B exit
+ } if
+ } loop
+ dup K eq fnc1first and {pop B} if % No kanji with fnc1first
+ dup mode eq { % Same mode encode directly
+ pop
+ /dat msg i mode K eq {2} {1} ifelse getinterval def
+ /seq [
+ seq aload pop
+ [ exch aload pop dat aload pop ]
+ ] def
+ } { % Change mode
+ /mode exch def
+ mode K eq {K msg i numK 2 mul getinterval} if
+ mode B eq {B msg i numB getinterval} if
+ mode A eq {A msg i numA getinterval} if
+ mode N eq {N msg i numN getinterval} if
+ /dat exch def /sw exch def
+ /seq [ seq aload pop sw dat ] def
+ } ifelse
+ /i i dat length add def
+ } loop
+
+ % Encode the sequence
+ { % common exit
+ seq -1 eq {exit} if % Sequence not available
+ /bits 23648 string def
+ /j 0 def
+ fnc1first {
+ ver vR7x43 lt { (0101) } { (101) } ifelse addtobits
+ } if
+ /abort false def
+ 0 2 seq length 1 sub {
+ /i exch def
+ /mode seq i get def
+ mids ver get mode get addtobits
+ /cclen cclens ver get mode get def
+ /chars seq i 1 add get def
+ chars length 2 cclen exp cvi ge { % Too many characters for cc indicator
+ /abort true def exit
+ } if
+ chars length mode K eq {2 idiv} if cclen tobin addtobits
+ chars encfuncs mode get load exec addtobits
+ } for
+ abort {exit} if
+ /bits bits 0 j getinterval def
+ msgbits ver bits put
+ exit
+ } loop
+ } forall
+
+ % Lookup the most appropriate symbol specification
+ /metrics [
+ % format vers vergrp rows cols align modules error codewords error correction blocks
+ % L M Q H L1 L2 M1 M2 Q1 Q2 H1 H2
+ [ (micro) (M1) vM1 11 11 98 99 36 [ 2 99 99 99 ] [ 1 0 -1 -1 -1 -1 -1 -1 ] ]
+ [ (micro) (M2) vM2 13 13 98 99 80 [ 5 6 99 99 ] [ 1 0 1 0 -1 -1 -1 -1 ] ]
+ [ (micro) (M3) vM3 15 15 98 99 132 [ 6 8 99 99 ] [ 1 0 1 0 -1 -1 -1 -1 ] ]
+ [ (micro) (M4) vM4 17 17 98 99 192 [ 8 10 14 99 ] [ 1 0 1 0 1 0 -1 -1 ] ]
+ [ (full) (1) v1to9 21 21 98 99 208 [ 7 10 13 17 ] [ 1 0 1 0 1 0 1 0 ] ]
+ [ (full) (2) v1to9 25 25 18 99 359 [ 10 16 22 28 ] [ 1 0 1 0 1 0 1 0 ] ]
+ [ (full) (3) v1to9 29 29 22 99 567 [ 15 26 36 44 ] [ 1 0 1 0 2 0 2 0 ] ]
+ [ (full) (4) v1to9 33 33 26 99 807 [ 20 36 52 64 ] [ 1 0 2 0 2 0 4 0 ] ]
+ [ (full) (5) v1to9 37 37 30 99 1079 [ 26 48 72 88 ] [ 1 0 2 0 2 2 2 2 ] ]
+ [ (full) (6) v1to9 41 41 34 99 1383 [ 36 64 96 112 ] [ 2 0 4 0 4 0 4 0 ] ]
+ [ (full) (7) v1to9 45 45 22 38 1568 [ 40 72 108 130 ] [ 2 0 4 0 2 4 4 1 ] ]
+ [ (full) (8) v1to9 49 49 24 42 1936 [ 48 88 132 156 ] [ 2 0 2 2 4 2 4 2 ] ]
+ [ (full) (9) v1to9 53 53 26 46 2336 [ 60 110 160 192 ] [ 2 0 3 2 4 4 4 4 ] ]
+ [ (full) (10) v10to26 57 57 28 50 2768 [ 72 130 192 224 ] [ 2 2 4 1 6 2 6 2 ] ]
+ [ (full) (11) v10to26 61 61 30 54 3232 [ 80 150 224 264 ] [ 4 0 1 4 4 4 3 8 ] ]
+ [ (full) (12) v10to26 65 65 32 58 3728 [ 96 176 260 308 ] [ 2 2 6 2 4 6 7 4 ] ]
+ [ (full) (13) v10to26 69 69 34 62 4256 [ 104 198 288 352 ] [ 4 0 8 1 8 4 12 4 ] ]
+ [ (full) (14) v10to26 73 73 26 46 4651 [ 120 216 320 384 ] [ 3 1 4 5 11 5 11 5 ] ]
+ [ (full) (15) v10to26 77 77 26 48 5243 [ 132 240 360 432 ] [ 5 1 5 5 5 7 11 7 ] ]
+ [ (full) (16) v10to26 81 81 26 50 5867 [ 144 280 408 480 ] [ 5 1 7 3 15 2 3 13 ] ]
+ [ (full) (17) v10to26 85 85 30 54 6523 [ 168 308 448 532 ] [ 1 5 10 1 1 15 2 17 ] ]
+ [ (full) (18) v10to26 89 89 30 56 7211 [ 180 338 504 588 ] [ 5 1 9 4 17 1 2 19 ] ]
+ [ (full) (19) v10to26 93 93 30 58 7931 [ 196 364 546 650 ] [ 3 4 3 11 17 4 9 16 ] ]
+ [ (full) (20) v10to26 97 97 34 62 8683 [ 224 416 600 700 ] [ 3 5 3 13 15 5 15 10 ] ]
+ [ (full) (21) v10to26 101 101 28 50 9252 [ 224 442 644 750 ] [ 4 4 17 0 17 6 19 6 ] ]
+ [ (full) (22) v10to26 105 105 26 50 10068 [ 252 476 690 816 ] [ 2 7 17 0 7 16 34 0 ] ]
+ [ (full) (23) v10to26 109 109 30 54 10916 [ 270 504 750 900 ] [ 4 5 4 14 11 14 16 14 ] ]
+ [ (full) (24) v10to26 113 113 28 54 11796 [ 300 560 810 960 ] [ 6 4 6 14 11 16 30 2 ] ]
+ [ (full) (25) v10to26 117 117 32 58 12708 [ 312 588 870 1050 ] [ 8 4 8 13 7 22 22 13 ] ]
+ [ (full) (26) v10to26 121 121 30 58 13652 [ 336 644 952 1110 ] [ 10 2 19 4 28 6 33 4 ] ]
+ [ (full) (27) v27to40 125 125 34 62 14628 [ 360 700 1020 1200 ] [ 8 4 22 3 8 26 12 28 ] ]
+ [ (full) (28) v27to40 129 129 26 50 15371 [ 390 728 1050 1260 ] [ 3 10 3 23 4 31 11 31 ] ]
+ [ (full) (29) v27to40 133 133 30 54 16411 [ 420 784 1140 1350 ] [ 7 7 21 7 1 37 19 26 ] ]
+ [ (full) (30) v27to40 137 137 26 52 17483 [ 450 812 1200 1440 ] [ 5 10 19 10 15 25 23 25 ] ]
+ [ (full) (31) v27to40 141 141 30 56 18587 [ 480 868 1290 1530 ] [ 13 3 2 29 42 1 23 28 ] ]
+ [ (full) (32) v27to40 145 145 34 60 19723 [ 510 924 1350 1620 ] [ 17 0 10 23 10 35 19 35 ] ]
+ [ (full) (33) v27to40 149 149 30 58 20891 [ 540 980 1440 1710 ] [ 17 1 14 21 29 19 11 46 ] ]
+ [ (full) (34) v27to40 153 153 34 62 22091 [ 570 1036 1530 1800 ] [ 13 6 14 23 44 7 59 1 ] ]
+ [ (full) (35) v27to40 157 157 30 54 23008 [ 570 1064 1590 1890 ] [ 12 7 12 26 39 14 22 41 ] ]
+ [ (full) (36) v27to40 161 161 24 50 24272 [ 600 1120 1680 1980 ] [ 6 14 6 34 46 10 2 64 ] ]
+ [ (full) (37) v27to40 165 165 28 54 25568 [ 630 1204 1770 2100 ] [ 17 4 29 14 49 10 24 46 ] ]
+ [ (full) (38) v27to40 169 169 32 58 26896 [ 660 1260 1860 2220 ] [ 4 18 13 32 48 14 42 32 ] ]
+ [ (full) (39) v27to40 173 173 26 54 28256 [ 720 1316 1950 2310 ] [ 20 4 40 7 43 22 10 67 ] ]
+ [ (full) (40) v27to40 177 177 30 58 29648 [ 750 1372 2040 2430 ] [ 19 6 18 31 34 34 20 61 ] ]
+ [ (rmqr) (R7x43) vR7x43 7 43 22 99 104 [ 99 7 99 10 ] [ -1 -1 1 0 -1 -1 1 0 ] ]
+ [ (rmqr) (R7x59) vR7x59 7 59 20 40 171 [ 99 9 99 14 ] [ -1 -1 1 0 -1 -1 1 0 ] ]
+ [ (rmqr) (R7x77) vR7x77 7 77 26 52 261 [ 99 12 99 22 ] [ -1 -1 1 0 -1 -1 1 0 ] ]
+ [ (rmqr) (R7x99) vR7x99 7 99 24 50 358 [ 99 16 99 30 ] [ -1 -1 1 0 -1 -1 1 0 ] ]
+ [ (rmqr) (R7x139) vR7x139 7 139 28 56 545 [ 99 24 99 44 ] [ -1 -1 1 0 -1 -1 2 0 ] ]
+ [ (rmqr) (R9x43) vR9x43 9 43 22 99 170 [ 99 9 99 14 ] [ -1 -1 1 0 -1 -1 1 0 ] ]
+ [ (rmqr) (R9x59) vR9x59 9 59 20 40 267 [ 99 12 99 22 ] [ -1 -1 1 0 -1 -1 1 0 ] ]
+ [ (rmqr) (R9x77) vR9x77 9 77 26 52 393 [ 99 18 99 32 ] [ -1 -1 1 0 -1 -1 1 1 ] ]
+ [ (rmqr) (R9x99) vR9x99 9 99 24 50 532 [ 99 24 99 44 ] [ -1 -1 1 0 -1 -1 2 0 ] ]
+ [ (rmqr) (R9x139) vR9x139 9 139 28 56 797 [ 99 36 99 66 ] [ -1 -1 1 1 -1 -1 3 0 ] ]
+ [ (rmqr) (R11x27) vR11x27 11 27 98 99 122 [ 99 8 99 10 ] [ -1 -1 1 0 -1 -1 1 0 ] ]
+ [ (rmqr) (R11x43) vR11x43 11 43 22 99 249 [ 99 12 99 20 ] [ -1 -1 1 0 -1 -1 1 0 ] ]
+ [ (rmqr) (R11x59) vR11x59 11 59 20 40 376 [ 99 16 99 32 ] [ -1 -1 1 0 -1 -1 1 1 ] ]
+ [ (rmqr) (R11x77) vR11x77 11 77 26 52 538 [ 99 24 99 44 ] [ -1 -1 1 0 -1 -1 1 1 ] ]
+ [ (rmqr) (R11x99) vR11x99 11 99 24 50 719 [ 99 32 99 60 ] [ -1 -1 1 1 -1 -1 1 1 ] ]
+ [ (rmqr) (R11x139) vR11x139 11 139 28 56 1062 [ 99 48 99 90 ] [ -1 -1 2 0 -1 -1 3 0 ] ]
+ [ (rmqr) (R13x27) vR13x27 13 27 98 99 172 [ 99 9 99 14 ] [ -1 -1 1 0 -1 -1 1 0 ] ]
+ [ (rmqr) (R13x43) vR13x43 13 43 22 99 329 [ 99 14 99 28 ] [ -1 -1 1 0 -1 -1 1 0 ] ]
+ [ (rmqr) (R13x59) vR13x59 13 59 20 40 486 [ 99 22 99 40 ] [ -1 -1 1 0 -1 -1 2 0 ] ]
+ [ (rmqr) (R13x77) vR13x77 13 77 26 52 684 [ 99 32 99 56 ] [ -1 -1 1 1 -1 -1 1 1 ] ]
+ [ (rmqr) (R13x99) vR13x99 13 99 24 50 907 [ 99 40 99 78 ] [ -1 -1 1 1 -1 -1 1 2 ] ]
+ [ (rmqr) (R13x139) vR13x139 13 139 28 56 1328 [ 99 60 99 112 ] [ -1 -1 2 1 -1 -1 2 2 ] ]
+ [ (rmqr) (R15x43) vR15x43 15 43 22 99 409 [ 99 18 99 36 ] [ -1 -1 1 0 -1 -1 1 1 ] ]
+ [ (rmqr) (R15x59) vR15x59 15 59 20 40 596 [ 99 26 99 48 ] [ -1 -1 1 0 -1 -1 2 0 ] ]
+ [ (rmqr) (R15x77) vR15x77 15 77 26 52 830 [ 99 36 99 72 ] [ -1 -1 1 1 -1 -1 2 1 ] ]
+ [ (rmqr) (R15x99) vR15x99 15 99 24 50 1095 [ 99 48 99 88 ] [ -1 -1 2 0 -1 -1 4 0 ] ]
+ [ (rmqr) (R15x139) vR15x139 15 139 28 56 1594 [ 99 72 99 130 ] [ -1 -1 2 1 -1 -1 1 4 ] ]
+ [ (rmqr) (R17x43) vR17x43 17 43 22 99 489 [ 99 22 99 40 ] [ -1 -1 1 0 -1 -1 1 1 ] ]
+ [ (rmqr) (R17x59) vR17x59 17 59 20 40 706 [ 99 32 99 60 ] [ -1 -1 2 0 -1 -1 2 0 ] ]
+ [ (rmqr) (R17x77) vR17x77 17 77 26 52 976 [ 99 44 99 84 ] [ -1 -1 2 0 -1 -1 1 2 ] ]
+ [ (rmqr) (R17x99) vR17x99 17 99 24 50 1283 [ 99 60 99 104 ] [ -1 -1 2 1 -1 -1 4 0 ] ]
+ [ (rmqr) (R17x139) vR17x139 17 139 28 56 1860 [ 99 80 99 156 ] [ -1 -1 4 0 -1 -1 2 4 ] ]
+ ] def
+ /eclval (LMQH) eclevel search pop length exch pop exch pop def
+ 0 1 metrics length 1 sub {
+ /i exch def
+ /m metrics i get def
+ /frmt m 0 get def % Format of the symbol
+ /vers m 1 get def % Version of symbol
+ /vergrp m 2 get def % Version group
+ /verind i 44 sub def % Version indicator for rMQR format info
+ /rows m 3 get def % Length of side
+ /cols m 4 get def % Length of side
+ /asp2 m 5 get def % Position of second alignment symbol
+ /asp3 m 6 get def % Position of third alignment symbol
+ /nmod m 7 get def % Number of modules
+ /ncws nmod 8 idiv def % Total number of codewords
+ /rbit nmod 8 mod def % Number of remainder bits
+ /lc4b false def % Last data codeword is 4 bits long
+ vers (M1) eq vers (M3) eq or { % Adjustments for M1 and M3 symbols
+ /ncws ncws 1 add def
+ /rbit 0 def
+ /lc4b true def
+ } if
+ /ecws m 8 get eclval get def % Number of error correction codewords
+ /dcws ncws ecws sub def % Number of data codewords
+ /dmod dcws 8 mul lc4b {4} {0} ifelse sub def % Number of data modules
+ /ecb1 m 9 get eclval 2 mul get def % First error correction blocks
+ /ecb2 m 9 get eclval 2 mul 1 add get def % Second error correction blocks
+ /okay true def
+ format frmt ne {/okay false def} if % The format must match that supplied
+ frmt (micro) eq fnc1first and {/okay false def} if % FNC1 mode is only available in full and rmqr
+ version (unset) ne version vers ne and {/okay false def} if % The version must match that supplied
+ ecb1 -1 eq ecb2 -1 eq or {/okay false def} if % Error correction level must be valid
+ /verbits msgbits vergrp get def
+ verbits -1 eq { % Bitstream must be available
+ /okay false def
+ } {
+ verbits length dmod gt {/okay false def} if % and fit into data modules
+ } ifelse
+ /term (000000000) 0 termlens vergrp get getinterval def
+ okay {exit} if
+ } for
+
+ okay not {
+ /bwipp.qrcodeNoValidSymbol (No valid symbol available) //raiseerror exec
+ } if
+
+ /format frmt def
+ /version vers def
+ /msgbits verbits def
+ /dcpb dcws ecb1 ecb2 add idiv def % Base data codewords per block
+ /ecpb ncws ecb1 ecb2 add idiv dcpb sub def % Error correction codewords per block
+
+ % Complete the message bits by adding the terminator, truncated if neccessary
+ /term term 0 dmod msgbits length sub term length 2 copy gt {exch} if pop getinterval def
+ msgbits length term length add string
+ dup 0 msgbits putinterval
+ dup msgbits length term putinterval
+ /msgbits exch def
+
+ % Expand the message bits by adding padding as necessary
+ /pad dmod string def
+ 0 1 pad length 1 sub {pad exch 48 put} for
+ pad 0 msgbits putinterval
+ /padstrs [ (11101100) (00010001) ] def
+ /padnum 0 def
+ msgbits length 8 div ceiling 8 mul cvi 8 dmod lc4b {5} {1} ifelse sub {
+ pad exch padstrs padnum get putinterval
+ /padnum padnum 1 add 2 mod def
+ } for
+
+ % Evaluate the padded message into codewords
+ /cws dcws array def
+ 0 1 cws length 1 sub {
+ /c exch def
+ /bpcw 8 def
+ lc4b c cws length 1 sub eq and {/bpcw 4 def} if
+ /cwb pad c 8 mul bpcw getinterval def
+ /cw 0 def
+ 0 1 bpcw 1 sub {
+ /i exch def
+ /cw cw 2 bpcw i sub 1 sub exp cvi cwb i get 48 sub mul add def
+ } for
+ cws c cw put
+ } for
+
+ % Short final data byte in M1 and M3 symbols has high-order value
+ lc4b {cws cws length 1 sub 2 copy get 4 bitshift put} if
+
+ % Calculate the log and anti-log tables
+ /rsalog [ 1 255 { dup 2 mul dup 256 ge {285 xor} if } repeat ] def
+ /rslog 256 array def
+ 1 1 255 {dup rsalog exch get exch rslog 3 1 roll put} for
+
+ % Function to calculate the product in the field
+ /rsprod {
+ 2 copy 0 ne exch 0 ne and {
+ rslog exch get exch rslog exch get add 255 mod rsalog exch get
+ } {
+ pop pop 0
+ } ifelse
+ } bind def
+
+ % Generate the coefficients for the Reed-Solomon algorithm
+ /coeffs [ 1 ecpb {0} repeat ] def
+ 0 1 ecpb 1 sub {
+ /i exch def
+ coeffs i 1 add coeffs i get put
+ i -1 1 {
+ /j exch def
+ coeffs j coeffs j 1 sub get coeffs j get rsalog i get rsprod xor put
+ } for
+ coeffs 0 coeffs 0 get rsalog i get rsprod put
+ } for
+ /coeffs coeffs 0 coeffs length 1 sub getinterval def
+
+ % Reed-Solomon algorithm to derive the error correction codewords
+ /rscodes {
+ /rscws exch def
+ /rsnd rscws length def
+ /rscws [ rscws {} forall ecpb {0} repeat ] def
+ 0 1 rsnd 1 sub {
+ /m exch def
+ /k rscws m get def
+ 0 1 ecpb 1 sub {
+ /j exch def
+ rscws m j add 1 add coeffs ecpb j sub 1 sub get k rsprod rscws m j add 1 add get xor put
+ } for
+ } for
+ rscws rsnd ecpb getinterval
+ } bind def
+
+ % Divide codewords into two groups of blocks and calculate the error correction codewords
+ /dcwsb ecb1 ecb2 add array def
+ /ecwsb ecb1 ecb2 add array def
+ 0 1 ecb1 1 sub { % First group of blocks has smaller number of data codewords
+ /i exch def
+ dcwsb i cws i dcpb mul dcpb getinterval put
+ ecwsb i dcwsb i get rscodes put
+ } for
+ 0 1 ecb2 1 sub { % Second group of blocks has larger number of data codewords
+ /i exch def
+ dcwsb ecb1 i add cws ecb1 dcpb mul i dcpb 1 add mul add dcpb 1 add getinterval put
+ ecwsb ecb1 i add dcwsb ecb1 i add get rscodes put
+ } for
+
+ % Reassemble the codewords
+ /cws ncws array def
+ /cw 0 def
+ 0 1 dcpb { % Interleave the data codeword blocks
+ /i exch def
+ 0 1 ecb1 ecb2 add 1 sub {
+ /j exch def
+ i dcwsb j get length lt { % Ignore the end of short blocks
+ cws cw dcwsb j get i get put
+ /cw cw 1 add def
+ } if
+ } for
+ } for
+ 0 1 ecpb 1 sub { % Interleave the error codeword blocks
+ /i exch def
+ 0 1 ecb1 ecb2 add 1 sub {
+ /j exch def
+ cws cw ecwsb j get i get put
+ /cw cw 1 add def
+ } for
+ } for
+
+ % Extend codewords by one if there are remainder bits
+ rbit 0 gt {
+ /pad cws length 1 add array def
+ pad 0 cws putinterval
+ pad pad length 1 sub 0 put
+ /cws pad def
+ } if
+
+ % Fixups for the short final data byte in M1 and M3 symbols
+ lc4b {
+ cws dcws 1 sub 2 copy get -4 bitshift put
+ dcws 1 sub 1 ncws 2 sub {
+ /i exch def
+ cws i cws i get 15 and 4 bitshift put
+ cws i cws i 1 add get -4 bitshift 15 and cws i get or put
+ } for
+ cws ncws 1 sub cws ncws 1 sub get 15 and 4 bitshift put
+ } if
+
+ % Create the bitmap
+ /pixs [ rows cols mul {-1} repeat ] def
+ /qmv {cols mul add} bind def
+
+ % Timing patterns
+ format (full) eq {
+ 8 1 cols 9 sub {
+ /i exch def
+ pixs i 6 qmv i 1 add 2 mod put
+ pixs 6 i qmv i 1 add 2 mod put
+ } for
+ } if
+ format (micro) eq {
+ 8 1 cols 1 sub {
+ /i exch def
+ pixs i 0 qmv i 1 add 2 mod put
+ pixs 0 i qmv i 1 add 2 mod put
+ } for
+ } if
+ format (rmqr) eq {
+ 3 1 cols 4 sub { % Along top and bottom
+ /i exch def
+ pixs i 0 qmv i 1 add 2 mod put
+ pixs i rows 1 sub qmv i 1 add 2 mod put
+ } for
+ 3 1 rows 4 sub { % Along left and right
+ /i exch def
+ pixs 0 i qmv i 1 add 2 mod put
+ pixs cols 1 sub i qmv i 1 add 2 mod put
+ } for
+ asp2 1 sub asp3 asp2 sub cols 13 sub { % Down interior
+ /i exch def
+ 3 1 rows 4 sub {
+ /j exch def
+ pixs i j qmv j 1 add 2 mod put
+ } for
+ } for
+ } if
+
+ % Finder patterns
+ /fpat [
+ [ 1 1 1 1 1 1 1 0 ]
+ [ 1 0 0 0 0 0 1 0 ]
+ [ 1 0 1 1 1 0 1 0 ]
+ [ 1 0 1 1 1 0 1 0 ]
+ [ 1 0 1 1 1 0 1 0 ]
+ [ 1 0 0 0 0 0 1 0 ]
+ [ 1 1 1 1 1 1 1 0 ]
+ [ 0 0 0 0 0 0 0 0 ]
+ ] def
+ /fsubpat [
+ [ 1 1 1 1 1 9 9 9 ]
+ [ 1 0 0 0 1 9 9 9 ]
+ [ 1 0 1 0 1 9 9 9 ]
+ [ 1 0 0 0 1 9 9 9 ]
+ [ 1 1 1 1 1 9 9 9 ]
+ [ 9 9 9 9 9 9 9 9 ]
+ [ 9 9 9 9 9 9 9 9 ]
+ [ 9 9 9 9 9 9 9 9 ]
+ ] def
+ /fcorpat [
+ [ 1 1 1 9 9 9 9 9 ]
+ [ 1 0 9 9 9 9 9 9 ]
+ [ 1 9 9 9 9 9 9 9 ]
+ [ 9 9 9 9 9 9 9 9 ]
+ [ 9 9 9 9 9 9 9 9 ]
+ [ 9 9 9 9 9 9 9 9 ]
+ [ 9 9 9 9 9 9 9 9 ]
+ [ 9 9 9 9 9 9 9 9 ]
+ ] def
+ /fnullpat [
+ [ 9 9 9 9 9 9 9 9 ]
+ [ 9 9 9 9 9 9 9 9 ]
+ [ 9 9 9 9 9 9 9 9 ]
+ [ 9 9 9 9 9 9 9 9 ]
+ [ 9 9 9 9 9 9 9 9 ]
+ [ 9 9 9 9 9 9 9 9 ]
+ [ 9 9 9 9 9 9 9 9 ]
+ [ 9 9 9 9 9 9 9 9 ]
+ ] def
+ /fpats <<
+ % TL TR BL BR
+ (full) [ fpat fpat fpat fnullpat ]
+ (micro) [ fpat fnullpat fnullpat fnullpat ]
+ (rmqr) [ fpat fcorpat fcorpat fsubpat ]
+ >> format get def
+ 0 1 7 {
+ /y exch def
+ 0 1 7 {
+ /x exch def
+ /fpb0 fpats 0 get y get x get def
+ /fpb1 fpats 1 get y get x get def
+ /fpb2 fpats 2 get y get x get def
+ /fpb3 fpats 3 get y get x get def
+ fpb0 9 ne y rows lt and {pixs x y qmv fpb0 put} if
+ fpb1 9 ne {pixs cols x sub 1 sub y qmv fpb1 put} if
+ fpb2 9 ne {pixs x rows y sub 1 sub qmv fpb2 put} if
+ fpb3 9 ne {pixs cols x sub 1 sub rows y sub 1 sub qmv fpb3 put} if
+ } for
+ } for
+
+ % Alignment patterns
+ /putalgnpat {
+ /py exch def
+ /px exch def
+ 0 1 4 {
+ /pb exch def
+ 0 1 4 {
+ /pa exch def
+ /algnb algnpat pb get pa get def
+ algnb 9 ne {
+ pixs px pa add py pb add qmv algnb put
+ } if
+ } for
+ } for
+ } bind def
+ format (full) eq {
+ /algnpat [
+ [ 1 1 1 1 1 ]
+ [ 1 0 0 0 1 ]
+ [ 1 0 1 0 1 ]
+ [ 1 0 0 0 1 ]
+ [ 1 1 1 1 1 ]
+ ] def
+ asp2 2 sub asp3 asp2 sub cols 13 sub {
+ /i exch def
+ i 4 putalgnpat
+ 4 i putalgnpat
+ } for
+ asp2 2 sub asp3 asp2 sub cols 9 sub {
+ /x exch def
+ asp2 2 sub asp3 asp2 sub rows 9 sub {
+ /y exch def
+ x y putalgnpat
+ } for
+ } for
+ } if
+ format (rmqr) eq {
+ /algnpat [
+ [ 1 1 1 9 9 ]
+ [ 1 0 1 9 9 ]
+ [ 1 1 1 9 9 ]
+ [ 9 9 9 9 9 ]
+ [ 9 9 9 9 9 ]
+ ] def
+ asp2 2 sub asp3 asp2 sub cols 13 sub {
+ /i exch def
+ i 0 putalgnpat
+ i rows 3 sub putalgnpat
+ } for
+ } if
+
+ % Format information modules
+ /formatmap <<
+ (full) [
+ [ [ 0 8 ] [ 8 cols 1 sub ] ] [ [ 1 8 ] [ 8 cols 2 sub ] ] [ [ 2 8 ] [ 8 cols 3 sub ] ]
+ [ [ 3 8 ] [ 8 cols 4 sub ] ] [ [ 4 8 ] [ 8 cols 5 sub ] ] [ [ 5 8 ] [ 8 cols 6 sub ] ]
+ [ [ 7 8 ] [ 8 cols 7 sub ] ] [ [ 8 8 ] [ cols 8 sub 8 ] ] [ [ 8 7 ] [ cols 7 sub 8 ] ]
+ [ [ 8 5 ] [ cols 6 sub 8 ] ] [ [ 8 4 ] [ cols 5 sub 8 ] ] [ [ 8 3 ] [ cols 4 sub 8 ] ]
+ [ [ 8 2 ] [ cols 3 sub 8 ] ] [ [ 8 1 ] [ cols 2 sub 8 ] ] [ [ 8 0 ] [ cols 1 sub 8 ] ]
+ ]
+ (micro) [
+ [ [ 1 8 ] ] [ [ 2 8 ] ] [ [ 3 8 ] ] [ [ 4 8 ] ] [ [ 5 8 ] ]
+ [ [ 6 8 ] ] [ [ 7 8 ] ] [ [ 8 8 ] ] [ [ 8 7 ] ] [ [ 8 6 ] ]
+ [ [ 8 5 ] ] [ [ 8 4 ] ] [ [ 8 3 ] ] [ [ 8 2 ] ] [ [ 8 1 ] ]
+ ]
+ (rmqr) [
+ [ [ 11 3 ] [ cols 3 sub rows 6 sub ] ] [ [ 11 2 ] [ cols 4 sub rows 6 sub ] ] [ [ 11 1 ] [ cols 5 sub rows 6 sub ] ]
+ [ [ 10 5 ] [ cols 6 sub rows 2 sub ] ] [ [ 10 4 ] [ cols 6 sub rows 3 sub ] ] [ [ 10 3 ] [ cols 6 sub rows 4 sub ] ]
+ [ [ 10 2 ] [ cols 6 sub rows 5 sub ] ] [ [ 10 1 ] [ cols 6 sub rows 6 sub ] ] [ [ 9 5 ] [ cols 7 sub rows 2 sub ] ]
+ [ [ 9 4 ] [ cols 7 sub rows 3 sub ] ] [ [ 9 3 ] [ cols 7 sub rows 4 sub ] ] [ [ 9 2 ] [ cols 7 sub rows 5 sub ] ]
+ [ [ 9 1 ] [ cols 7 sub rows 6 sub ] ] [ [ 8 5 ] [ cols 8 sub rows 2 sub ] ] [ [ 8 4 ] [ cols 8 sub rows 3 sub ] ]
+ [ [ 8 3 ] [ cols 8 sub rows 4 sub ] ] [ [ 8 2 ] [ cols 8 sub rows 5 sub ] ] [ [ 8 1 ] [ cols 8 sub rows 6 sub ] ]
+ ]
+ >> format get def
+ formatmap {
+ { {} forall qmv pixs exch 1 put } forall
+ } forall
+
+ % Version information modules
+ format (full) eq cols 45 ge and {
+ /versionmap [
+ [ [ cols 9 sub 5 ] [ 5 cols 9 sub ] ] [ [ cols 10 sub 5 ] [ 5 cols 10 sub ] ]
+ [ [ cols 11 sub 5 ] [ 5 cols 11 sub ] ] [ [ cols 9 sub 4 ] [ 4 cols 9 sub ] ]
+ [ [ cols 10 sub 4 ] [ 4 cols 10 sub ] ] [ [ cols 11 sub 4 ] [ 4 cols 11 sub ] ]
+ [ [ cols 9 sub 3 ] [ 3 cols 9 sub ] ] [ [ cols 10 sub 3 ] [ 3 cols 10 sub ] ]
+ [ [ cols 11 sub 3 ] [ 3 cols 11 sub ] ] [ [ cols 9 sub 2 ] [ 2 cols 9 sub ] ]
+ [ [ cols 10 sub 2 ] [ 2 cols 10 sub ] ] [ [ cols 11 sub 2 ] [ 2 cols 11 sub ] ]
+ [ [ cols 9 sub 1 ] [ 1 cols 9 sub ] ] [ [ cols 10 sub 1 ] [ 1 cols 10 sub ] ]
+ [ [ cols 11 sub 1 ] [ 1 cols 11 sub ] ] [ [ cols 9 sub 0 ] [ 0 cols 9 sub ] ]
+ [ [ cols 10 sub 0 ] [ 0 cols 10 sub ] ] [ [ cols 11 sub 0 ] [ 0 cols 11 sub ] ]
+ ] def
+ } {
+ /versionmap [] def
+ } ifelse
+ versionmap {
+ { {} forall qmv pixs exch 0 put } forall
+ } forall
+
+ % Reserve the solitary dark module in full symbols
+ format (full) eq {
+ pixs 8 rows 8 sub qmv 0 put
+ } if
+
+ % Calculate the mask patterns
+ /maskfuncs <<
+ (full) [
+ {add 2 mod}
+ {exch pop 2 mod}
+ {pop 3 mod}
+ {add 3 mod}
+ {2 idiv exch 3 idiv add 2 mod}
+ {mul dup 2 mod exch 3 mod add}
+ {mul dup 2 mod exch 3 mod add 2 mod}
+ {2 copy mul 3 mod 3 1 roll add 2 mod add 2 mod}
+ ]
+ (micro) [
+ {exch pop 2 mod}
+ {2 idiv exch 3 idiv add 2 mod}
+ {mul dup 2 mod exch 3 mod add 2 mod}
+ {2 copy mul 3 mod 3 1 roll add 2 mod add 2 mod}
+ ]
+ (rmqr) [
+ {2 idiv exch 3 idiv add 2 mod}
+ ]
+ >> format get def
+ mask -1 ne { % User specifies a mask
+ /maskfuncs [maskfuncs mask 1 sub get] def
+ /bestmaskval mask 1 sub def
+ } if
+ /masks maskfuncs length array def
+ 0 1 masks length 1 sub {
+ /m exch def
+ /mask rows cols mul array def
+ 0 1 rows 1 sub {
+ /j exch def
+ 0 1 cols 1 sub {
+ /i exch def
+ i j maskfuncs m get exec 0 eq
+ pixs i j qmv get -1 eq and {1} {0} ifelse
+ mask i j qmv 3 -1 roll put
+ } for
+ } for
+ masks m mask put
+ } for
+
+ % Walk the symbol placing the bitstream
+ /posx cols format (rmqr) ne {1} {2} ifelse sub def
+ /posy rows 1 sub def
+ /dir -1 def % -1 is upwards, 1 is downwards
+ /col 1 def % 0 is left bit, 1 is right bit
+ /num 0 def
+ { % loop
+ posx 0 lt {exit} if
+ pixs posx posy qmv get -1 eq {
+ cws num 8 idiv get 7 num 8 mod sub neg bitshift 1 and
+ pixs posx posy qmv 3 -1 roll put
+ /num num 1 add def
+ } if
+ col 1 eq {
+ /col 0 def
+ /posx posx 1 sub def
+ } {
+ /col 1 def
+ /posx posx 1 add def
+ /posy posy dir add def
+ posy 0 lt posy rows ge or { % Turn around at top and bottom
+ /dir dir -1 mul def
+ /posy posy dir add def
+ /posx posx 2 sub def
+ % Hop over the timing pattern in full size symbols
+ format (full) eq posx 6 eq and {/posx posx 1 sub def} if
+ } if
+ } ifelse
+ } loop
+
+ % Evaluate runlength encoded rows or columns in full symbols
+ /evalfulln1n3 {
+ /scrle exch def
+ % Detect runs of 5 or more like modules
+ /scr1 0 scrle { dup 5 ge {add 2 sub dup} if pop } forall def
+ % Detect 1:1:3:1:1 ratio next to 4 modules of whitespace
+ /scr3 0 def
+ 3 2 scrle length 3 sub { % Scan odd (dark) runs within bounds
+ /j exch def
+ scrle j get 3 mod 0 eq { % Multiple of 3 black modules
+ /fact scrle j get 3 idiv def
+ scrle j 2 sub 5 getinterval {fact eq} forall and exch pop and and {
+ j 3 eq j 4 add scrle length ge or { % At either extent of run
+ /scr3 scr3 40 add def
+ } { % Bounded by dark modules
+ scrle j 3 sub get 4 ge scrle j 3 add get 4 ge or {
+ /scr3 scr3 40 add def
+ } if
+ } ifelse
+ } if
+ } if
+ } for
+ scr1 scr3
+ } bind def
+
+ % Evaluation algorithm for full symbols
+ /evalfull {
+ /sym exch def
+
+ /n1 0 def /n2 0 def /n3 0 def
+ /rle cols 1 add array def
+ /lastpairs cols array def
+ /thispairs cols array def
+ /colsadd1 cols 1 add def
+ 0 1 cols 1 sub {
+ /i exch def
+
+ % Runlength encode (light, dark, light, ...) and evaluate each column
+ mark 0 0
+ i cols dup dup mul 1 sub {
+ sym exch get exch 1 index eq {exch 1 add exch} {1 exch} ifelse
+ } for
+ pop
+ rle 0 counttomark 2 sub getinterval astore
+ evalfulln1n3 n3 add /n3 exch def n1 add /n1 exch def
+ pop
+
+ % Runlength encode (light, dark, light, ...) and evaluate each row
+ /symrow sym i cols mul cols getinterval def
+ mark 0 0
+ symrow {
+ exch 1 index eq {exch 1 add exch} {1 exch} ifelse
+ } forall
+ pop
+ rle 0 counttomark 2 sub getinterval astore
+ evalfulln1n3 n3 add /n3 exch def n1 add /n1 exch def
+ pop
+
+ % Count and score same coloured blocks
+ /lastpairs thispairs /thispairs lastpairs def def
+ symrow 0 get 1 eq {0} {1} ifelse
+ symrow {exch 1 index add exch} forall
+ pop
+ thispairs astore pop
+ i 0 gt {
+ mark
+ lastpairs aload pop thispairs aload pop
+ n2 cols { exch colsadd1 index add 3 and 0 eq {3 add} if } repeat
+ /n2 exch def
+ cleartomark
+ } if
+
+ } for
+
+ % Score dark/light imbalance
+ /dark 0 sym {add} forall def
+ /n4 dark 100 mul cols dup mul div 50 sub abs 5 div cvi 10 mul def
+
+ n1 n2 add n3 add n4 add
+ } bind def
+
+ % Evaluation algorithm for micro symbols
+ /evalmicro {
+ /sym exch def
+ /dkrhs 0 def /dkbot 0 def
+ 1 1 cols 1 sub {
+ /i exch def
+ /dkrhs dkrhs sym cols 1 sub i qmv get add def
+ /dkbot dkbot sym i cols 1 sub qmv get add def
+ } for
+ dkrhs dkbot le {
+ dkrhs 16 mul dkbot add neg
+ } {
+ dkbot 16 mul dkrhs add neg
+ } ifelse
+ } bind def
+
+ % Evaluate the masked symbols to find the most suitable
+ /bestscore 999999999 def
+ 0 1 masks length 1 sub {
+ /m exch def
+ /masksym rows cols mul array def
+ 0 1 rows cols mul 1 sub {
+ /i exch def
+ masksym i pixs i get masks m get i get xor put
+ } for
+ masks length 1 ne { % Not rMQR nor user-specified mask
+ format (full) eq {
+ masksym evalfull /score exch def
+ } {
+ masksym evalmicro /score exch def
+ } ifelse
+ score bestscore lt {
+ /bestsym masksym def
+ /bestmaskval m def
+ /bestscore score def
+ } if
+ } {
+ /bestsym masksym def
+ } ifelse
+ } for
+ /pixs bestsym def
+
+ % Set the solitary dark module in full symbols
+ format (full) eq {
+ pixs 8 cols 8 sub qmv 1 put
+ } if
+
+ % Add the format information
+ format (full) eq {
+ /fmtvals [
+ 16#5412 16#5125 16#5e7c 16#5b4b 16#45f9 16#40ce 16#4f97 16#4aa0
+ 16#77c4 16#72f3 16#7daa 16#789d 16#662f 16#6318 16#6c41 16#6976
+ 16#1689 16#13be 16#1ce7 16#19d0 16#0762 16#0255 16#0d0c 16#083b
+ 16#355f 16#3068 16#3f31 16#3a06 16#24b4 16#2183 16#2eda 16#2bed
+ ] def
+ /ecid (MLHQ) eclevel search pop length exch pop exch pop def
+ /fmtval fmtvals ecid 3 bitshift bestmaskval add get def
+ 0 1 formatmap length 1 sub {
+ /i exch def
+ formatmap i get {
+ pixs exch aload pop qmv fmtval 14 i sub neg bitshift 1 and put
+ } forall
+ } for
+ } if
+ format (micro) eq {
+ /fmtvals [
+ 16#4445 16#4172 16#4e2b 16#4b1c 16#55ae 16#5099 16#5fc0 16#5af7
+ 16#6793 16#62a4 16#6dfd 16#68ca 16#7678 16#734f 16#7c16 16#7921
+ 16#06de 16#03e9 16#0cb0 16#0987 16#1735 16#1202 16#1d5b 16#186c
+ 16#2508 16#203f 16#2f66 16#2a51 16#34e3 16#31d4 16#3e8d 16#3bba
+ ] def
+ /symid [ [0] [1 2] [3 4] [5 6 7] ] cols 11 sub 2 idiv get eclval get def
+ /fmtval fmtvals symid 2 bitshift bestmaskval add get def
+ 0 1 formatmap length 1 sub {
+ /i exch def
+ pixs formatmap i get 0 get aload pop qmv fmtval 14 i sub neg bitshift 1 and put
+ } for
+ } if
+ format (rmqr) eq {
+ /fmtvals1 [
+ 16#1fab2 16#1e597 16#1dbdd 16#1c4f8 16#1b86c 16#1a749 16#19903 16#18626
+ 16#17f0e 16#1602b 16#15e61 16#14144 16#13dd0 16#122f5 16#11cbf 16#1039a
+ 16#0f1ca 16#0eeef 16#0d0a5 16#0cf80 16#0b314 16#0ac31 16#0927b 16#08d5e
+ 16#07476 16#06b53 16#05519 16#04a3c 16#036a8 16#0298d 16#017c7 16#008e2
+ 16#3f367 16#3ec42 16#3d208 16#3cd2d 16#3b1b9 16#3ae9c 16#390d6 16#38ff3
+ 16#376db 16#369fe 16#357b4 16#34891 16#33405 16#32b20 16#3156a 16#30a4f
+ 16#2f81f 16#2e73a 16#2d970 16#2c655 16#2bac1 16#2a5e4 16#29bae 16#2848b
+ 16#27da3 16#26286 16#25ccc 16#243e9 16#23f7d 16#22058 16#21e12 16#20137
+ ] def
+ /fmtvals2 [
+ 16#20a7b 16#2155e 16#22b14 16#23431 16#248a5 16#25780 16#269ca 16#276ef
+ 16#28fc7 16#290e2 16#2aea8 16#2b18d 16#2cd19 16#2d23c 16#2ec76 16#2f353
+ 16#30103 16#31e26 16#3206c 16#33f49 16#343dd 16#35cf8 16#362b2 16#37d97
+ 16#384bf 16#39b9a 16#3a5d0 16#3baf5 16#3c661 16#3d944 16#3e70e 16#3f82b
+ 16#003ae 16#01c8b 16#022c1 16#03de4 16#04170 16#05e55 16#0601f 16#07f3a
+ 16#08612 16#09937 16#0a77d 16#0b858 16#0c4cc 16#0dbe9 16#0e5a3 16#0fa86
+ 16#108d6 16#117f3 16#129b9 16#1369c 16#14a08 16#1552d 16#16b67 16#17442
+ 16#18d6a 16#1924f 16#1ac05 16#1b320 16#1cfb4 16#1d091 16#1eedb 16#1f1fe
+ ] def
+ /fmtvalu (MH) eclevel search pop length exch pop exch pop 5 bitshift verind add def
+ /fmtval1 fmtvals1 fmtvalu get def
+ /fmtval2 fmtvals2 fmtvalu get def
+ 0 1 formatmap length 1 sub {
+ /i exch def
+ pixs formatmap i get 0 get aload pop qmv fmtval1 17 i sub neg bitshift 1 and put
+ pixs formatmap i get 1 get aload pop qmv fmtval2 17 i sub neg bitshift 1 and put
+ } for
+ } if
+
+ % Add the version information
+ format (full) eq cols 45 ge and {
+ /vervals [
+ 16#07c94 16#085bc 16#09a99 16#0a4d3 16#0bbf6 16#0c762 16#0d847
+ 16#0e60d 16#0f928 16#10b78 16#1145d 16#12a17 16#13532 16#149a6
+ 16#15683 16#168c9 16#177ec 16#18ec4 16#191e1 16#1afab 16#1b08e
+ 16#1cc1a 16#1d33f 16#1ed75 16#1f250 16#209d5 16#216fd 16#228ba
+ 16#2379f 16#24b0b 16#2542e 16#26a64 16#27541 16#28c69
+ ] def
+ /verval vervals cols 17 sub 4 idiv 7 sub get def
+ 0 1 versionmap length 1 sub {
+ /i exch def
+ versionmap i get {
+ pixs exch {} forall qmv verval 17 i sub neg bitshift 1 and put
+ } forall
+ } for
+ } if
+
+ % Return the arguments
+ <<
+ /ren //renmatrix
+ /pixs pixs
+ /pixx cols
+ /pixy rows
+ /height rows 2 mul 72 div
+ /width cols 2 mul 72 div
+ /opt options
+ >>
+
+ dontdraw not //renmatrix if
+
+ end
+
+}
+[/barcode] {null def} forall
+bind def
+/qrcode dup load /uk.co.terryburton.bwipp defineresource pop
+end
+/setpacking where {pop setpacking} if
+%%EndData
+%%EndResource
+
+%%BeginResource: uk.co.terryburton.bwipp swissqrcode 0.0 2020040100 57786 57647
+%%BeginData: 126 ASCII Lines
+/setpacking where {pop currentpacking true setpacking} if
+1 dict
+dup /raiseerror dup /uk.co.terryburton.bwipp findresource put
+dup /renmatrix dup /uk.co.terryburton.bwipp findresource put
+dup /qrcode dup /uk.co.terryburton.bwipp findresource put
+begin
+/swissqrcode {
+
+ 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
+
+ /parse 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
+
+ % Parse ordinals of the form ^NNN to ASCII
+ parse {
+ /msg barcode length string def
+ /j 0 def
+ barcode
+ { % loop
+ (^) search {
+ dup msg exch j exch putinterval
+ length j add 1 add /j exch def
+ pop
+ dup 0 3 getinterval cvi msg exch j 1 sub exch put
+ dup length 3 sub 3 exch getinterval
+ } {
+ dup msg exch j exch putinterval
+ length j add /j exch def
+ /barcode msg 0 j getinterval def
+ exit
+ } ifelse
+ } loop
+ } if
+
+ /barlen barcode length def
+
+ % Validate the input length
+ barcode length 997 gt {
+ /bwipp.swissqrcodeBadLength (Swiss QR Code input must not exceed 997 digits) //raiseerror exec
+ } if
+
+ % Get the result of encoding with qrcode
+ options (dontdraw) true put
+ /args barcode options //qrcode exec def
+
+ args (opt) options put
+ args
+
+ % The 7mm-wide Swiss Cross is defined by the specification as being an
+ % overlaid image, i.e. not made out of "modules", so very likely a
+ % different pitch. It cannot therefore be represented by our standard image
+ % dictionary and would be a nightmare to gridfit. The application assumes a
+ % sufficient high-resolution print process that such issues do not matter.
+ %
+ % So for now we simply do as we're told and paint over the top of the
+ % barcode image that has been scaled to 46mm, user be damned!
+ %
+ dontdraw not {
+
+ gsave
+ currentpoint translate
+ 72 25.4 div dup scale % pt to mm
+
+ % Clipping path with 7mm hole for the Swiss Cross
+ gsave
+ newpath
+ 0 0 moveto
+ 46 0 lineto
+ 46 46 lineto
+ 0 46 lineto
+ closepath
+ 19.5 19.5 moveto
+ 19.5 26.5 lineto
+ 26.5 26.5 lineto
+ 26.5 19.5 lineto
+ closepath
+ clip
+
+ % Scale the QR Code to fit within 46mm
+ gsave
+ 0 0 moveto
+ 46 args (pixx) get div 2 div dup scale
+ //renmatrix exec
+ grestore
+
+ grestore % Clipping
+
+ % Draw Swiss Cross
+ 19.5 dup translate
+ 7 83 div dup scale
+
+ newpath
+ 6 6 moveto
+ 6 77 lineto
+ 77 77 lineto
+ 77 6 lineto
+ closepath
+ 49 18 moveto
+ 49 34 lineto
+ 65 34 lineto
+ 65 49 lineto
+ 49 49 lineto
+ 49 65 lineto
+ 34 65 lineto
+ 34 49 lineto
+ 18 49 lineto
+ 18 34 lineto
+ 34 34 lineto
+ 34 18 lineto
+ closepath
+ 0 0 0 setrgbcolor fill
+
+ grestore
+
+ } if
+
+ end
+
+}
+[/barcode] {null def} forall
+bind def
+/swissqrcode dup load /uk.co.terryburton.bwipp defineresource pop
+end
+/setpacking where {pop setpacking} if
+%%EndData
+%%EndResource
+%%EndProlog
+%%Page: 1 1
+gsave
+1 1 translate
+2 2 scale
+0 0 moveto
+(SPC
+0200
+1
+CH5800791123000889012
+S
+Robert Schneider AG
+Rue du Lac
+1268
+2501
+Biel
+CH
+
+
+
+
+
+
+
+199.95
+CHF
+K
+Pia-Maria Rutschmann-Schnyder
+Grosse Marktgasse 28
+9400 Rorschach
+
+
+CH
+SCOR
+RF18539007547034
+
+EPD)
+<>
+/swissqrcode /uk.co.terryburton.bwipp findresource exec
+grestore
+showpage
+%%Trailer
+%%EOF