diff options
author | Karl Berry <karl@freefriends.org> | 2022-08-23 20:12:06 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2022-08-23 20:12:06 +0000 |
commit | 363c7f7c9597348addc3264cc2cfd69eadfe57f3 (patch) | |
tree | 28d968562b53ae3a91786fe8c9bcbb757537d47c /Master/texmf-dist/dvips | |
parent | ed7b23797cf7ee9f0635e8b076528b88f81337e0 (diff) |
pst-barcode (23aug22)
git-svn-id: svn://tug.org/texlive/trunk@64173 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/dvips')
-rw-r--r-- | Master/texmf-dist/dvips/pst-barcode/pst-barcode.pro | 16527 |
1 files changed, 12191 insertions, 4336 deletions
diff --git a/Master/texmf-dist/dvips/pst-barcode/pst-barcode.pro b/Master/texmf-dist/dvips/pst-barcode/pst-barcode.pro index 0e654a165b7..6a6c95c9779 100644 --- a/Master/texmf-dist/dvips/pst-barcode/pst-barcode.pro +++ b/Master/texmf-dist/dvips/pst-barcode/pst-barcode.pro @@ -1,9 +1,10 @@ %!PS -%% $Id: pst-barcode.pro 519 2017-08-22 07:47:55Z herbert $ -% Barcode Writer in Pure PostScript - Version 2017-04-04 -% http://bwipp.terryburton.co.uk +%% $Id: pst-barcode.pro 588 2022-08-23 16:49:51Z herbert $ + +% Barcode Writer in Pure PostScript - Version 2022-08-21 +% https://bwipp.terryburton.co.uk % -% Copyright (c) 2004-2017 Terry Burton +% Copyright (c) 2004-2022 Terry Burton % % Permission is hereby granted, free of charge, to any % person obtaining a copy of this software and associated @@ -28,9 +29,11 @@ % CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN % CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS % IN THE SOFTWARE. + % --BEGIN TEMPLATE-- + % --BEGIN RESOURCE preamble-- -%%BeginResource: Category uk.co.terryburton.bwipp 0.0 2017040400 29725 32822 +%%BeginResource: Category uk.co.terryburton.bwipp 0.0 2022082100 29733 32838 %%BeginData: 6 ASCII Lines currentglobal true setglobal @@ -42,20 +45,77 @@ setglobal %%EndResource % --END RESOURCE preamble-- -% --BEGIN RESOURCE raiseerror-- +% --BEGIN RESOURCE loadctx-- % --REQUIRES preamble-- -%%BeginResource: uk.co.terryburton.bwipp raiseerror 0.0 2017040400 153316 39839 -%%BeginData: 13 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp loadctx 0.0 2022082100 40205 39999 +%%BeginData: 25 ASCII Lines /setpacking where {pop currentpacking true setpacking} if 1 dict begin +/loadctx { + % Place a context dictionary just below the current dictionary, which can + % be populated with static data on the first run and then carried between + % invocations of the encoder + /ctxname exch def + ctx null ne { + ctx ctxname known not { + ctx ctxname 10 dict put + /ctxdef {ctx ctxname get begin exec end} def + } { + /ctxdef {pop} def % No need to redefine within the existing context + } ifelse + currentdict ctx ctxname get end begin begin + } { + /ctxdef {exec} def % No context provided, so define ephemerally + } ifelse +} +[/barcode] {null def} forall +bind def +/loadctx dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END RESOURCE loadctx-- + +% --BEGIN RESOURCE unloadctx-- +% --REQUIRES preamble-- +%%BeginResource: uk.co.terryburton.bwipp unloadctx 0.0 2022082100 38856 38677 +%%BeginData: 14 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +1 dict +begin +/unloadctx { + % Remove the context which is expected to be just underneath currentdict + ctx null ne { + currentdict end end begin + } if +} +[/barcode] {null def} forall +bind def +/unloadctx dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END RESOURCE unloadctx-- + +% --BEGIN RESOURCE raiseerror-- +% --REQUIRES preamble-- +%%BeginResource: uk.co.terryburton.bwipp raiseerror 0.0 2022082100 39029 38860 +%%BeginData: 15 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +10 dict +begin /raiseerror { - $error exch /errorinfo exch put - $error exch /errorname exch put - $error /command null put - $error /newerror true put - stop -} bind def + $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 @@ -63,12 +123,3111 @@ end %%EndResource % --END RESOURCE raiseerror-- +% --BEGIN RESOURCE parseinput-- +% --REQUIRES preamble loadctx unloadctx raiseerror-- +%%BeginResource: uk.co.terryburton.bwipp parseinput 0.0 2022082100 73377 69190 +%%BeginData: 174 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +begin +/parseinput { + + 20 dict begin + + /parseinput //loadctx exec + + /fncvals exch def + /barcode exch def + + /parse dup dup fncvals exch get def fncvals exch undef + /parsefnc dup dup fncvals exch get def fncvals exch undef + /parseonly dup dup fncvals exch known def fncvals exch undef + /eci dup dup fncvals exch known def fncvals exch undef + + % Control character names to ordinals +{ + << + [ + /NUL /SOH /STX /ETX /EOT /ENQ /ACK /BEL + /BS /TAB /LF /VT /FF /CR () () % SO and SI prefix clash with SOH + /DLE /DC1 /DC2 /DC3 /DC4 /NAK /SYN /ETB + /CAN /EM /SUB /ESC /FS /GS /RS /US + ] + 0 exch { + 1 index 1 add 3 1 roll exch 3 -1 roll + } forall pop + >> /ctrl exch def +} ctxdef + + /msg barcode length array def + /j 0 def + barcode { % loop + (^) search exch + % Copy characters up to a "^" + dup length exch + msg exch j exch [ exch {} forall ] putinterval + j add /j exch def + { % Found a "^" escape character + pop + 1 { % common exit + + parse not parsefnc not and { % "^" as is + msg j 94 put + /j j 1 add def + exit + } if + + % Encode "^" to start with + msg j 94 put + /j j 1 add def + + % parse + parse { + dup length 3 ge { % "^XXX" byte + dup 0 3 getinterval ctrl exch + 2 copy known { + /j j 1 sub def % Replace "^" with ordinal + get msg exch j exch put + /j j 1 add def + dup length 3 sub 3 exch getinterval + exit + } { + pop pop + } ifelse + } if + dup length 2 ge { % "^XX" to byte + dup 0 2 getinterval ctrl exch + 2 copy known { + /j j 1 sub def % Replace "^" with ordinal + get msg exch j exch put + /j j 1 add def + dup length 2 sub 2 exch getinterval + exit + } { + pop pop + } ifelse + } if + dup length 3 ge { % "^NNN" to byte + dup 0 3 getinterval true exch { + dup 48 lt exch 57 gt or { pop false } if + } forall + { + dup 0 3 getinterval cvi dup 255 gt { + pop pop + /bwipp.invalidOrdinal (Ordinal must be 000 to 255) //raiseerror exec + } if + /j j 1 sub def % Replace "^" with ordinal + msg exch j exch put + /j j 1 add def + dup length 3 sub 3 exch getinterval + } if + } if + } if + + parseonly + parsefnc not or + msg j 1 sub get 94 ne % Carat was substituted away + or {exit} if + + % parsefnc + /j j 1 sub def + dup length 3 lt { + pop + /bwipp.truncatedFNC (Function character truncated) //raiseerror exec + } if + dup 0 get 94 eq { % "^^" -> "^" + msg j 94 put + /j j 1 add def + dup length 1 sub 1 exch getinterval + exit + } if + dup 0 3 getinterval (ECI) eq eci and { % "^ECInnnnnn" -> -1nnnnnn + dup length 9 lt { + pop + /bwipp.truncatedECI (ECI truncated) //raiseerror exec + } if + dup 3 6 getinterval + dup { + dup 48 lt exch 57 gt or { + pop pop + /bwipp.invalidECI (ECI must be 000000 to 999999) //raiseerror exec + } if + } forall + 0 exch {48 sub sub 10 mul} forall 10 idiv 1000000 sub + msg exch j exch put + /j j 1 add def + dup length 9 sub 9 exch getinterval + exit + } if + dup length 4 lt { % "^FNCx" -> fncvals{FNCx} + pop + /bwipp.truncatedFNC (Function character truncated) //raiseerror exec + } if + dup 0 4 getinterval dup fncvals exch known not { + dup length 28 add string dup 28 4 -1 roll putinterval + dup 0 (Unknown function character: ) putinterval + exch pop + /bwipp.unknownFNC exch //raiseerror exec + } if + fncvals exch get + msg exch j exch put + /j j 1 add def + dup length 4 sub 4 exch getinterval + exit + + } repeat + } { % No more "^" characters + exit + } ifelse + } loop + + parseonly not { + msg 0 j getinterval + } { + j string + 0 1 j 1 sub { 1 index exch dup msg exch get put } for + } ifelse + + //unloadctx exec + + end + +} +[/barcode] {null def} forall +bind def +/parseinput dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END RESOURCE parseinput-- + +% --BEGIN RESOURCE gs1process-- +% --REQUIRES preamble loadctx unloadctx parseinput raiseerror-- +%%BeginResource: uk.co.terryburton.bwipp gs1process 0.0 2022082100 526019 593612 +%%BeginData: 2909 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put +dup /parseinput dup /uk.co.terryburton.bwipp findresource put +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +begin +/gs1process { + + 20 dict begin + + /gs1process //loadctx exec + +{ + % Extracted from the GS1 Syntax Dictionary + /gs1syntax << + + << + /parts [ + << /cset /N /min 18 /max 18 /opt false /linters [ /lintcsum /lintkey ] >> + ] + /dlpkey [ ] + >> + (00) exch dup + pop + + << + /parts [ + << /cset /N /min 14 /max 14 /opt false /linters [ /lintcsum /lintkey ] >> + ] + /ex [ (02) (255) (37) ] + /dlpkey [ [ (22) (10) (21) ] [ (235) ] ] + >> + (01) exch dup + pop + + << + /parts [ + << /cset /N /min 14 /max 14 /opt false /linters [ /lintcsum /lintkey ] >> + ] + /req [ [ (37) ] ] + >> + (02) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 20 /opt false /linters [] >> + ] + /req [ [ (01) (02) (8006) (8026) ] ] + >> + (10) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [ /lintyymmd0 ] >> + ] + /req [ [ (01) (02) (8006) (8026) ] ] + >> + (11) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [ /lintyymmd0 ] >> + ] + /req [ [ (8020) ] ] + >> + (12) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [ /lintyymmd0 ] >> + ] + /req [ [ (01) (02) (8006) (8026) ] ] + >> + (13) exch dup + (15) exch dup + (16) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [ /lintyymmd0 ] >> + ] + /req [ [ (01) (02) (255) (8006) (8026) ] ] + >> + (17) exch dup + pop + + << + /parts [ + << /cset /N /min 2 /max 2 /opt false /linters [] >> + ] + /req [ [ (01) (02) (8006) (8026) ] ] + >> + (20) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 20 /opt false /linters [] >> + ] + /ex [ (235) ] + /req [ [ (01) (8006) ] ] + >> + (21) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 20 /opt false /linters [] >> + ] + /req [ [ (01) ] ] + >> + (22) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 28 /opt false /linters [] >> + ] + /req [ [ (01) ] ] + >> + (235) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 30 /opt false /linters [] >> + ] + /req [ [ (01) (02) (8006) (8026) ] ] + >> + (240) exch dup + (241) exch dup + pop + + << + /parts [ + << /cset /N /min 1 /max 6 /opt false /linters [] >> + ] + /req [ [ (01) (02) (8006) (8026) ] ] + >> + (242) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 20 /opt false /linters [] >> + ] + /req [ [ (01) ] ] + >> + (243) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 30 /opt false /linters [] >> + ] + /req [ [ (01) (8006) ] [ (21) ] ] + >> + (250) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 30 /opt false /linters [] >> + ] + /req [ [ (01) (8006) ] ] + >> + (251) exch dup + pop + + << + /parts [ + << /cset /N /min 13 /max 13 /opt false /linters [ /lintcsum /lintkey ] >> + << /cset /X /min 1 /max 17 /opt true /linters [] >> + ] + /dlpkey [ ] + >> + (253) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 20 /opt false /linters [] >> + ] + /req [ [ (414) ] ] + >> + (254) exch dup + pop + + << + /parts [ + << /cset /N /min 13 /max 13 /opt false /linters [ /lintcsum /lintkey ] >> + << /cset /N /min 1 /max 12 /opt true /linters [] >> + ] + /ex [ (01) (02) (415) (8006) (8020) (8026) ] + /dlpkey [ ] + >> + (255) exch dup + pop + + << + /parts [ + << /cset /N /min 1 /max 8 /opt false /linters [] >> + ] + /req [ [ (01) (02) ] ] + >> + (30) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (310n) ] + /req [ [ (01) (02) ] ] + >> + (3100) exch dup + (3101) exch dup + (3102) exch dup + (3103) exch dup + (3104) exch dup + (3105) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (311n) ] + /req [ [ (01) (02) ] ] + >> + (3110) exch dup + (3111) exch dup + (3112) exch dup + (3113) exch dup + (3114) exch dup + (3115) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (312n) ] + /req [ [ (01) (02) ] ] + >> + (3120) exch dup + (3121) exch dup + (3122) exch dup + (3123) exch dup + (3124) exch dup + (3125) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (313n) ] + /req [ [ (01) (02) ] ] + >> + (3130) exch dup + (3131) exch dup + (3132) exch dup + (3133) exch dup + (3134) exch dup + (3135) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (314n) ] + /req [ [ (01) (02) ] ] + >> + (3140) exch dup + (3141) exch dup + (3142) exch dup + (3143) exch dup + (3144) exch dup + (3145) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (315n) ] + /req [ [ (01) (02) ] ] + >> + (3150) exch dup + (3151) exch dup + (3152) exch dup + (3153) exch dup + (3154) exch dup + (3155) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (316n) ] + /req [ [ (01) (02) ] ] + >> + (3160) exch dup + (3161) exch dup + (3162) exch dup + (3163) exch dup + (3164) exch dup + (3165) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (320n) ] + /req [ [ (01) (02) ] ] + >> + (3200) exch dup + (3201) exch dup + (3202) exch dup + (3203) exch dup + (3204) exch dup + (3205) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (321n) ] + /req [ [ (01) (02) ] ] + >> + (3210) exch dup + (3211) exch dup + (3212) exch dup + (3213) exch dup + (3214) exch dup + (3215) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (322n) ] + /req [ [ (01) (02) ] ] + >> + (3220) exch dup + (3221) exch dup + (3222) exch dup + (3223) exch dup + (3224) exch dup + (3225) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (323n) ] + /req [ [ (01) (02) ] ] + >> + (3230) exch dup + (3231) exch dup + (3232) exch dup + (3233) exch dup + (3234) exch dup + (3235) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (324n) ] + /req [ [ (01) (02) ] ] + >> + (3240) exch dup + (3241) exch dup + (3242) exch dup + (3243) exch dup + (3244) exch dup + (3245) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (325n) ] + /req [ [ (01) (02) ] ] + >> + (3250) exch dup + (3251) exch dup + (3252) exch dup + (3253) exch dup + (3254) exch dup + (3255) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (326n) ] + /req [ [ (01) (02) ] ] + >> + (3260) exch dup + (3261) exch dup + (3262) exch dup + (3263) exch dup + (3264) exch dup + (3265) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (327n) ] + /req [ [ (01) (02) ] ] + >> + (3270) exch dup + (3271) exch dup + (3272) exch dup + (3273) exch dup + (3274) exch dup + (3275) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (328n) ] + /req [ [ (01) (02) ] ] + >> + (3280) exch dup + (3281) exch dup + (3282) exch dup + (3283) exch dup + (3284) exch dup + (3285) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (329n) ] + /req [ [ (01) (02) ] ] + >> + (3290) exch dup + (3291) exch dup + (3292) exch dup + (3293) exch dup + (3294) exch dup + (3295) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (330n) ] + /req [ [ (00) (01) ] ] + >> + (3300) exch dup + (3301) exch dup + (3302) exch dup + (3303) exch dup + (3304) exch dup + (3305) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (331n) ] + /req [ [ (00) (01) ] ] + >> + (3310) exch dup + (3311) exch dup + (3312) exch dup + (3313) exch dup + (3314) exch dup + (3315) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (332n) ] + /req [ [ (00) (01) ] ] + >> + (3320) exch dup + (3321) exch dup + (3322) exch dup + (3323) exch dup + (3324) exch dup + (3325) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (333n) ] + /req [ [ (00) (01) ] ] + >> + (3330) exch dup + (3331) exch dup + (3332) exch dup + (3333) exch dup + (3334) exch dup + (3335) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (334n) ] + /req [ [ (00) (01) ] ] + >> + (3340) exch dup + (3341) exch dup + (3342) exch dup + (3343) exch dup + (3344) exch dup + (3345) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (335n) ] + /req [ [ (00) (01) ] ] + >> + (3350) exch dup + (3351) exch dup + (3352) exch dup + (3353) exch dup + (3354) exch dup + (3355) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (336n) ] + /req [ [ (00) (01) ] ] + >> + (3360) exch dup + (3361) exch dup + (3362) exch dup + (3363) exch dup + (3364) exch dup + (3365) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (337n) ] + /req [ [ (01) ] ] + >> + (3370) exch dup + (3371) exch dup + (3372) exch dup + (3373) exch dup + (3374) exch dup + (3375) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (340n) ] + /req [ [ (00) (01) ] ] + >> + (3400) exch dup + (3401) exch dup + (3402) exch dup + (3403) exch dup + (3404) exch dup + (3405) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (341n) ] + /req [ [ (00) (01) ] ] + >> + (3410) exch dup + (3411) exch dup + (3412) exch dup + (3413) exch dup + (3414) exch dup + (3415) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (342n) ] + /req [ [ (00) (01) ] ] + >> + (3420) exch dup + (3421) exch dup + (3422) exch dup + (3423) exch dup + (3424) exch dup + (3425) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (343n) ] + /req [ [ (00) (01) ] ] + >> + (3430) exch dup + (3431) exch dup + (3432) exch dup + (3433) exch dup + (3434) exch dup + (3435) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (344n) ] + /req [ [ (00) (01) ] ] + >> + (3440) exch dup + (3441) exch dup + (3442) exch dup + (3443) exch dup + (3444) exch dup + (3445) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (345n) ] + /req [ [ (00) (01) ] ] + >> + (3450) exch dup + (3451) exch dup + (3452) exch dup + (3453) exch dup + (3454) exch dup + (3455) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (346n) ] + /req [ [ (00) (01) ] ] + >> + (3460) exch dup + (3461) exch dup + (3462) exch dup + (3463) exch dup + (3464) exch dup + (3465) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (347n) ] + /req [ [ (00) (01) ] ] + >> + (3470) exch dup + (3471) exch dup + (3472) exch dup + (3473) exch dup + (3474) exch dup + (3475) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (348n) ] + /req [ [ (00) (01) ] ] + >> + (3480) exch dup + (3481) exch dup + (3482) exch dup + (3483) exch dup + (3484) exch dup + (3485) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (349n) ] + /req [ [ (00) (01) ] ] + >> + (3490) exch dup + (3491) exch dup + (3492) exch dup + (3493) exch dup + (3494) exch dup + (3495) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (350n) ] + /req [ [ (01) (02) ] ] + >> + (3500) exch dup + (3501) exch dup + (3502) exch dup + (3503) exch dup + (3504) exch dup + (3505) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (351n) ] + /req [ [ (01) (02) ] ] + >> + (3510) exch dup + (3511) exch dup + (3512) exch dup + (3513) exch dup + (3514) exch dup + (3515) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (352n) ] + /req [ [ (01) (02) ] ] + >> + (3520) exch dup + (3521) exch dup + (3522) exch dup + (3523) exch dup + (3524) exch dup + (3525) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (353n) ] + /req [ [ (00) (01) ] ] + >> + (3530) exch dup + (3531) exch dup + (3532) exch dup + (3533) exch dup + (3534) exch dup + (3535) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (354n) ] + /req [ [ (00) (01) ] ] + >> + (3540) exch dup + (3541) exch dup + (3542) exch dup + (3543) exch dup + (3544) exch dup + (3545) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (355n) ] + /req [ [ (00) (01) ] ] + >> + (3550) exch dup + (3551) exch dup + (3552) exch dup + (3553) exch dup + (3554) exch dup + (3555) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (356n) ] + /req [ [ (01) (02) ] ] + >> + (3560) exch dup + (3561) exch dup + (3562) exch dup + (3563) exch dup + (3564) exch dup + (3565) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (357n) ] + /req [ [ (01) (02) ] ] + >> + (3570) exch dup + (3571) exch dup + (3572) exch dup + (3573) exch dup + (3574) exch dup + (3575) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (360n) ] + /req [ [ (01) (02) ] ] + >> + (3600) exch dup + (3601) exch dup + (3602) exch dup + (3603) exch dup + (3604) exch dup + (3605) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (361n) ] + /req [ [ (01) (02) ] ] + >> + (3610) exch dup + (3611) exch dup + (3612) exch dup + (3613) exch dup + (3614) exch dup + (3615) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (362n) ] + /req [ [ (00) (01) ] ] + >> + (3620) exch dup + (3621) exch dup + (3622) exch dup + (3623) exch dup + (3624) exch dup + (3625) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (363n) ] + /req [ [ (00) (01) ] ] + >> + (3630) exch dup + (3631) exch dup + (3632) exch dup + (3633) exch dup + (3634) exch dup + (3635) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (364n) ] + /req [ [ (01) (02) ] ] + >> + (3640) exch dup + (3641) exch dup + (3642) exch dup + (3643) exch dup + (3644) exch dup + (3645) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (365n) ] + /req [ [ (01) (02) ] ] + >> + (3650) exch dup + (3651) exch dup + (3652) exch dup + (3653) exch dup + (3654) exch dup + (3655) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (366n) ] + /req [ [ (01) (02) ] ] + >> + (3660) exch dup + (3661) exch dup + (3662) exch dup + (3663) exch dup + (3664) exch dup + (3665) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (367n) ] + /req [ [ (00) (01) ] ] + >> + (3670) exch dup + (3671) exch dup + (3672) exch dup + (3673) exch dup + (3674) exch dup + (3675) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (368n) ] + /req [ [ (00) (01) ] ] + >> + (3680) exch dup + (3681) exch dup + (3682) exch dup + (3683) exch dup + (3684) exch dup + (3685) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (369n) ] + /req [ [ (00) (01) ] ] + >> + (3690) exch dup + (3691) exch dup + (3692) exch dup + (3693) exch dup + (3694) exch dup + (3695) exch dup + pop + + << + /parts [ + << /cset /N /min 1 /max 8 /opt false /linters [] >> + ] + /req [ [ (00) ] [ (02) (8026) ] ] + >> + (37) exch dup + pop + + << + /parts [ + << /cset /N /min 1 /max 15 /opt false /linters [] >> + ] + /ex [ (390n) (391n) (394n) (8111) ] + /req [ [ (255) (8020) ] ] + >> + (3900) exch dup + (3901) exch dup + (3902) exch dup + (3903) exch dup + (3904) exch dup + (3905) exch dup + (3906) exch dup + (3907) exch dup + (3908) exch dup + (3909) exch dup + pop + + << + /parts [ + << /cset /N /min 3 /max 3 /opt false /linters [ /lintiso4217 ] >> + << /cset /N /min 1 /max 15 /opt false /linters [] >> + ] + /ex [ (391n) ] + /req [ [ (8020) ] ] + >> + (3910) exch dup + (3911) exch dup + (3912) exch dup + (3913) exch dup + (3914) exch dup + (3915) exch dup + (3916) exch dup + (3917) exch dup + (3918) exch dup + (3919) exch dup + pop + + << + /parts [ + << /cset /N /min 1 /max 15 /opt false /linters [] >> + ] + /ex [ (392n) (393n) ] + /req [ [ (01) ] [ (30) (31nn) (32nn) (35nn) (36nn) ] ] + >> + (3920) exch dup + (3921) exch dup + (3922) exch dup + (3923) exch dup + (3924) exch dup + (3925) exch dup + (3926) exch dup + (3927) exch dup + (3928) exch dup + (3929) exch dup + pop + + << + /parts [ + << /cset /N /min 3 /max 3 /opt false /linters [ /lintiso4217 ] >> + << /cset /N /min 1 /max 15 /opt false /linters [] >> + ] + /ex [ (393n) ] + /req [ [ (30) (31nn) (32nn) (35nn) (36nn) ] ] + >> + (3930) exch dup + (3931) exch dup + (3932) exch dup + (3933) exch dup + (3934) exch dup + (3935) exch dup + (3936) exch dup + (3937) exch dup + (3938) exch dup + (3939) exch dup + pop + + << + /parts [ + << /cset /N /min 4 /max 4 /opt false /linters [] >> + ] + /ex [ (394n) (8111) ] + /req [ [ (255) ] ] + >> + (3940) exch dup + (3941) exch dup + (3942) exch dup + (3943) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /ex [ (392n) (393n) (395n) (8005) ] + /req [ [ (30) (31nn) (32nn) (35nn) (36nn) ] ] + >> + (3950) exch dup + (3951) exch dup + (3952) exch dup + (3953) exch dup + (3954) exch dup + (3955) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 30 /opt false /linters [] >> + ] + >> + (400) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 30 /opt false /linters [ /lintkey ] >> + ] + /dlpkey [ ] + >> + (401) exch dup + pop + + << + /parts [ + << /cset /N /min 17 /max 17 /opt false /linters [ /lintcsum /lintkey ] >> + ] + /dlpkey [ ] + >> + (402) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 30 /opt false /linters [] >> + ] + /req [ [ (00) ] ] + >> + (403) exch dup + pop + + << + /parts [ + << /cset /N /min 13 /max 13 /opt false /linters [ /lintcsum /lintkey ] >> + ] + >> + (410) exch dup + (411) exch dup + (412) exch dup + (413) exch dup + pop + + << + /parts [ + << /cset /N /min 13 /max 13 /opt false /linters [ /lintcsum /lintkey ] >> + ] + /dlpkey [ [ (254) ] [ (7040) ] ] + >> + (414) exch dup + pop + + << + /parts [ + << /cset /N /min 13 /max 13 /opt false /linters [ /lintcsum /lintkey ] >> + ] + /req [ [ (8020) ] ] + >> + (415) exch dup + pop + + << + /parts [ + << /cset /N /min 13 /max 13 /opt false /linters [ /lintcsum /lintkey ] >> + ] + >> + (416) exch dup + pop + + << + /parts [ + << /cset /N /min 13 /max 13 /opt false /linters [ /lintcsum /lintkey ] >> + ] + /dlpkey [ [ (7040) ] ] + >> + (417) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 20 /opt false /linters [] >> + ] + /ex [ (421) ] + >> + (420) exch dup + pop + + << + /parts [ + << /cset /N /min 3 /max 3 /opt false /linters [ /lintiso3166 ] >> + << /cset /X /min 1 /max 9 /opt false /linters [] >> + ] + /ex [ (4307) ] + >> + (421) exch dup + pop + + << + /parts [ + << /cset /N /min 3 /max 3 /opt false /linters [ /lintiso3166 ] >> + ] + /ex [ (426) ] + /req [ [ (01) (02) (8006) (8026) ] ] + >> + (422) exch dup + pop + + << + /parts [ + << /cset /N /min 1 /max 15 /opt false /linters [ /lintiso3166list ] >> + ] + /ex [ (426) ] + /req [ [ (01) (02) ] ] + >> + (423) exch dup + pop + + << + /parts [ + << /cset /N /min 3 /max 3 /opt false /linters [ /lintiso3166 ] >> + ] + /ex [ (426) ] + /req [ [ (01) (02) ] ] + >> + (424) exch dup + pop + + << + /parts [ + << /cset /N /min 1 /max 15 /opt false /linters [ /lintiso3166list ] >> + ] + /ex [ (426) ] + /req [ [ (01) (02) ] ] + >> + (425) exch dup + pop + + << + /parts [ + << /cset /N /min 3 /max 3 /opt false /linters [ /lintiso3166 ] >> + ] + /req [ [ (01) (02) ] ] + >> + (426) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 3 /opt false /linters [] >> + ] + /req [ [ (01) (02) ] [ (422) ] ] + >> + (427) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 35 /opt false /linters [ /lintpcenc ] >> + ] + /req [ [ (00) ] ] + >> + (4300) exch dup + (4301) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 70 /opt false /linters [ /lintpcenc ] >> + ] + /req [ [ (00) ] ] + >> + (4302) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 70 /opt false /linters [ /lintpcenc ] >> + ] + /req [ [ (4302) ] ] + >> + (4303) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 70 /opt false /linters [ /lintpcenc ] >> + ] + /req [ [ (00) ] ] + >> + (4304) exch dup + (4305) exch dup + (4306) exch dup + pop + + << + /parts [ + << /cset /X /min 2 /max 2 /opt false /linters [ /lintiso3166alpha2 ] >> + ] + /req [ [ (00) ] ] + >> + (4307) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 30 /opt false /linters [] >> + ] + /req [ [ (00) ] ] + >> + (4308) exch dup + pop + + << + /parts [ + << /cset /N /min 20 /max 20 /opt false /linters [ /lintlatlong ] >> + ] + /req [ [ (00) ] ] + >> + (4309) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 35 /opt false /linters [ /lintpcenc ] >> + ] + /req [ [ (00) ] ] + >> + (4310) exch dup + (4311) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 70 /opt false /linters [ /lintpcenc ] >> + ] + /req [ [ (00) ] ] + >> + (4312) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 70 /opt false /linters [ /lintpcenc ] >> + ] + /req [ [ (4312) ] ] + >> + (4313) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 70 /opt false /linters [ /lintpcenc ] >> + ] + /req [ [ (00) ] ] + >> + (4314) exch dup + (4315) exch dup + (4316) exch dup + pop + + << + /parts [ + << /cset /X /min 2 /max 2 /opt false /linters [ /lintiso3166alpha2 ] >> + ] + /req [ [ (00) ] ] + >> + (4317) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 20 /opt false /linters [] >> + ] + /req [ [ (00) ] ] + >> + (4318) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 30 /opt false /linters [] >> + ] + /req [ [ (00) ] ] + >> + (4319) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 35 /opt false /linters [ /lintpcenc ] >> + ] + /req [ [ (00) ] ] + >> + (4320) exch dup + pop + + << + /parts [ + << /cset /N /min 1 /max 1 /opt false /linters [ /lintyesno ] >> + ] + /req [ [ (00) ] ] + >> + (4321) exch dup + (4322) exch dup + (4323) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [ /lintyymmd0 ] >> + << /cset /N /min 4 /max 4 /opt false /linters [ /linthhmm ] >> + ] + /req [ [ (00) ] ] + >> + (4324) exch dup + (4325) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [ /lintyymmdd ] >> + ] + /req [ [ (00) ] ] + >> + (4326) exch dup + pop + + << + /parts [ + << /cset /N /min 13 /max 13 /opt false /linters [] >> + ] + /req [ [ (01) (02) (8006) (8026) ] ] + >> + (7001) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 30 /opt false /linters [] >> + ] + /req [ [ (01) (02) ] ] + >> + (7002) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [ /lintyymmdd ] >> + << /cset /N /min 4 /max 4 /opt false /linters [ /linthhmm ] >> + ] + /req [ [ (01) (02) ] ] + >> + (7003) exch dup + pop + + << + /parts [ + << /cset /N /min 1 /max 4 /opt false /linters [] >> + ] + /req [ [ (01) ] [ (10) ] ] + >> + (7004) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 12 /opt false /linters [] >> + ] + /req [ [ (01) (02) ] ] + >> + (7005) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [ /lintyymmdd ] >> + ] + /req [ [ (01) (02) ] ] + >> + (7006) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [ /lintyymmdd ] >> + << /cset /N /min 6 /max 6 /opt true /linters [ /lintyymmdd ] >> + ] + /req [ [ (01) (02) ] ] + >> + (7007) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 3 /opt false /linters [] >> + ] + /req [ [ (01) (02) ] ] + >> + (7008) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 10 /opt false /linters [] >> + ] + /req [ [ (01) (02) ] ] + >> + (7009) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 2 /opt false /linters [] >> + ] + /req [ [ (01) (02) ] ] + >> + (7010) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [ /lintyymmdd ] >> + << /cset /N /min 4 /max 4 /opt true /linters [ /linthhmm ] >> + ] + /req [ [ (01) (02) ] ] + >> + (7011) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 20 /opt false /linters [] >> + ] + /req [ [ (01) (8006) ] [ (416) ] ] + >> + (7020) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 20 /opt false /linters [] >> + ] + /req [ [ (01) (8006) ] ] + >> + (7021) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 20 /opt false /linters [] >> + ] + /req [ [ (7021) ] ] + >> + (7022) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 30 /opt false /linters [ /lintkey ] >> + ] + >> + (7023) exch dup + pop + + << + /parts [ + << /cset /N /min 3 /max 3 /opt false /linters [ /lintiso3166999 ] >> + << /cset /X /min 1 /max 27 /opt false /linters [] >> + ] + /req [ [ (01) (02) ] ] + >> + (7030) exch dup + (7031) exch dup + (7032) exch dup + (7033) exch dup + (7034) exch dup + (7035) exch dup + (7036) exch dup + (7037) exch dup + (7038) exch dup + (7039) exch dup + pop + + << + /parts [ + << /cset /N /min 1 /max 1 /opt false /linters [] >> + << /cset /X /min 1 /max 1 /opt false /linters [] >> + << /cset /X /min 1 /max 1 /opt false /linters [] >> + << /cset /X /min 1 /max 1 /opt false /linters [ /lintimporteridx ] >> + ] + >> + (7040) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 20 /opt false /linters [] >> + ] + /req [ [ (01) ] ] + >> + (710) exch dup + (711) exch dup + (712) exch dup + (713) exch dup + (714) exch dup + (715) exch dup + pop + + << + /parts [ + << /cset /X /min 2 /max 2 /opt false /linters [] >> + << /cset /X /min 1 /max 28 /opt false /linters [] >> + ] + /req [ [ (01) (8004) ] ] + >> + (7230) exch dup + (7231) exch dup + (7232) exch dup + (7233) exch dup + (7234) exch dup + (7235) exch dup + (7236) exch dup + (7237) exch dup + (7238) exch dup + (7239) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 20 /opt false /linters [] >> + ] + /req [ [ (01) (8006) ] ] + >> + (7240) exch dup + pop + + << + /parts [ + << /cset /N /min 4 /max 4 /opt false /linters [ /lintnonzero ] >> + << /cset /N /min 5 /max 5 /opt false /linters [ /lintnonzero ] >> + << /cset /N /min 3 /max 3 /opt false /linters [ /lintnonzero ] >> + << /cset /N /min 1 /max 1 /opt false /linters [ /lintwinding ] >> + << /cset /N /min 1 /max 1 /opt false /linters [] >> + ] + /req [ [ (01) ] ] + >> + (8001) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 20 /opt false /linters [] >> + ] + >> + (8002) exch dup + pop + + << + /parts [ + << /cset /N /min 1 /max 1 /opt false /linters [ /lintzero ] >> + << /cset /N /min 13 /max 13 /opt false /linters [ /lintcsum /lintkey ] >> + << /cset /X /min 1 /max 16 /opt true /linters [] >> + ] + /dlpkey [ ] + >> + (8003) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 30 /opt false /linters [ /lintkey ] >> + ] + /dlpkey [ [ (7040) ] ] + >> + (8004) exch dup + pop + + << + /parts [ + << /cset /N /min 6 /max 6 /opt false /linters [] >> + ] + /req [ [ (01) (02) ] ] + >> + (8005) exch dup + pop + + << + /parts [ + << /cset /N /min 14 /max 14 /opt false /linters [ /lintcsum ] >> + << /cset /N /min 4 /max 4 /opt false /linters [ /lintpieceoftotal ] >> + ] + /ex [ (01) (37) ] + /dlpkey [ [ (22) (10) (21) ] ] + >> + (8006) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 34 /opt false /linters [ /lintiban ] >> + ] + /req [ [ (415) ] ] + >> + (8007) exch dup + pop + + << + /parts [ + << /cset /N /min 8 /max 8 /opt false /linters [ /lintyymmddhh ] >> + << /cset /N /min 1 /max 4 /opt true /linters [ /lintmmoptss ] >> + ] + /req [ [ (01) (02) ] ] + >> + (8008) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 50 /opt false /linters [] >> + ] + /req [ [ (00) (01) ] ] + >> + (8009) exch dup + pop + + << + /parts [ + << /cset /Y /min 1 /max 30 /opt false /linters [ /lintkey ] >> + ] + /dlpkey [ [ (8011) ] ] + >> + (8010) exch dup + pop + + << + /parts [ + << /cset /N /min 1 /max 12 /opt false /linters [ /lintnozeroprefix ] >> + ] + /req [ [ (8010) ] ] + >> + (8011) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 20 /opt false /linters [] >> + ] + /req [ [ (01) (8006) ] ] + >> + (8012) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 25 /opt false /linters [ /lintcsumalpha /lintkey ] >> + ] + /dlpkey [ ] + >> + (8013) exch dup + pop + + << + /parts [ + << /cset /N /min 18 /max 18 /opt false /linters [ /lintcsum ] >> + ] + /dlpkey [ [ (8019) ] ] + >> + (8017) exch dup + pop + + << + /parts [ + << /cset /N /min 18 /max 18 /opt false /linters [ /lintcsum ] >> + ] + /ex [ (8017) ] + /dlpkey [ [ (8019) ] ] + >> + (8018) exch dup + pop + + << + /parts [ + << /cset /N /min 1 /max 10 /opt false /linters [] >> + ] + /req [ [ (8017) (8018) ] ] + >> + (8019) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 25 /opt false /linters [] >> + ] + /req [ [ (415) ] ] + >> + (8020) exch dup + pop + + << + /parts [ + << /cset /N /min 14 /max 14 /opt false /linters [ /lintcsum ] >> + << /cset /N /min 4 /max 4 /opt false /linters [ /lintpieceoftotal ] >> + ] + /ex [ (02) (8006) ] + /req [ [ (37) ] ] + >> + (8026) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 70 /opt false /linters [ /lintcouponcode ] >> + ] + >> + (8110) exch dup + pop + + << + /parts [ + << /cset /N /min 4 /max 4 /opt false /linters [] >> + ] + /req [ [ (255) ] ] + >> + (8111) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 70 /opt false /linters [ /lintcouponposoffer ] >> + ] + >> + (8112) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 70 /opt false /linters [] >> + ] + /req [ [ (01) ] ] + >> + (8200) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 30 /opt false /linters [] >> + ] + >> + (90) exch dup + pop + + << + /parts [ + << /cset /X /min 1 /max 90 /opt false /linters [] >> + ] + >> + (91) exch dup + (92) exch dup + (93) exch dup + (94) exch dup + (95) exch dup + (96) exch dup + (97) exch dup + (98) exch dup + (99) exch dup + pop + + >> def +} ctxdef + + % Extract AIs and vals from provided GS1 data in the indicated format + + /ai eq { % Bracketed AI element string + + % Parse out AIs and values + (\() anchorsearch not { + pop /bwipp.GS1aiMissingOpenParen (AIs must start with '\(') //raiseerror exec + } if + pop + mark exch { % loop + dup () eq {pop exit} if + (\)) search not { + cleartomark /bwipp.GS1aiMissingCloseParen (AIs must end with '\)') //raiseerror exec + } if + exch pop exch + (\() search { exch pop exch } { () } ifelse + } loop + counttomark dup 0 gt {dup 2 idiv 1 add -1 exch {-1 roll} for} {pop} ifelse + counttomark 2 idiv array astore /ais exch def + counttomark array astore [ exch { % Expand ordinals of the form ^NNN to ASCII + << /parse parse /parseonly true /parsefnc false >> //parseinput exec + } forall ] /vals exch def + pop + + } { % Digital Link URI + + % Validate and strip the scheme + (http://) anchorsearch not { + (https://) anchorsearch not { + pop /bwipp.GS1dlURIbadScheme (Scheme must be http:// or https://) //raiseerror exec + } if} if + pop + + % Strip the domain + (/) search not { + pop /bwipp.GS1dlMissingDomainOrPathInfo (URI must contain a domain and path info) //raiseerror exec + } if + pop pop + + % Fragment delimits end of data + (#) search { + exch pop exch pop + } if + + % Query parameter marker splits path info and query parameters + (?) search not { + () exch null exch + } if + /pp exch def + pop + /qp exch def + + % Find positions of character immediately following "/" in the path info + mark 0 + 0 pp { + (/) search not {pop exit} if + length 1 add exch pop 2 index add exch + } loop + counttomark 1 sub array astore /pipos exch def pop pop + pipos length 1 le { + /bwipp.GS1dlNoAIinfo (The path was too short to contain AI info) //raiseerror exec + } if + + % Walk backwards to find the right-most path element that is a valid dlpkey + false + pipos length 2 sub -2 0 { + dup + dup pipos exch get + exch pipos exch 1 add get 1 index sub 1 sub pp 3 1 roll getinterval + dup gs1syntax exch known { + gs1syntax exch get /dlpkey known { + exch pop true exit + } if + } { + pop + } ifelse + pop + } for + not { + /bwipp.GS1dlNoAIinfo (The path does not contain a valid primary key) //raiseerror exec + } if + pipos exch get dup pp length exch sub pp 3 1 roll getinterval /pp exch def + + /uriunescape { + /in exch def + /out in length string def + 0 0 { + 1 index in length ge {exit} if + in 2 index get + dup 43 eq { % "+" -> " " + pop out 1 index 32 put + 1 add exch 1 add exch + } { + dup 37 eq 3 index in length 2 sub lt and { % "%nn" -> ord + pop + (< >) 4 string copy dup 1 in 5 index 1 add 2 getinterval putinterval cvx + stopped { + pop pop /bwipp.GS1dlBadHexCharacter (Invalid hex character) //raiseerror exec + } if + 0 get out exch 2 index exch put + 1 add exch 3 add exch + } { + out exch 2 index exch put + 1 add exch 1 add exch + } ifelse } ifelse + } loop + out exch 0 exch getinterval /out exch def + pop + out + } def + + /ais 99 array def + /vals 99 array def + 0 + + % Extract AIs from the path components + pp { + (/) search { + ais exch 4 index exch put + pop + (/) search {exch pop} {() exch} ifelse + vals exch 3 index exch uriunescape put + } { + pop exit + } ifelse + exch 1 add exch + } loop + + % Validate the key-qualifiers in the path info sequence + dup 1 gt { + false + gs1syntax ais 0 get get /dlpkey get { + /seq exch def + /i 1 def /j 0 def + { + i ais length ge {exit} if + j seq length ge {exit} if + ais i get seq j get eq { + /i i 1 add def + } if + /j j 1 add def + } loop + i 2 index eq {pop true exit} if + } forall + not { + pop /bwipp.GS1dlBadPathInfo (The AIs in the path are not a valid key-qualifier sequence for the key) //raiseerror exec + } if + } if + + % Extract AIs from the query parameters + qp { + dup () eq {pop exit} if + (&) search {exch pop} {() exch} ifelse + (=) search { + true 1 index {dup 48 ge exch 57 le and and} forall { + ais exch 5 index exch put + pop + vals exch 3 index exch uriunescape put + exch 1 add exch + } { % Ignore non-numeric parameters + pop pop pop + } ifelse + } { % Ignore singletons and empty parameters + pop + } ifelse + } loop + + /ais ais 0 3 index getinterval def + /vals vals 0 3 index getinterval def + pop + + % Expand any extracted GTINs + 0 1 ais length 1 sub { + dup ais exch get (01) eq { + dup vals exch get + dup length dup 8 eq exch dup 12 eq exch 13 eq or or { + (00000000000000) 14 string copy dup 3 -1 roll dup length 14 exch sub exch putinterval + vals exch 2 index exch put + } { + pop + } ifelse + } if + pop + } for + + } ifelse + + % AIs not requiring FNC1 separation +{ + /aifixed << [ + (00) (01) (02) (03) (04) + (11) (12) (13) (14) (15) (16) (17) (18) (19) (20) + % (23) % Reassigned to variable-length AI (235)! + (31) (32) (33) (34) (35) (36) + (41) + ] {dup} forall >> def +} ctxdef + + /fncs [ + ais { + true exch + dup length 2 ge { + 0 2 getinterval aifixed exch known {pop false} if + } { + pop + } ifelse + } forall + ] def + + + % Linter routines for validating AI components + + /lintnumeric { + true exch { + dup 48 lt exch 57 gt or { pop false exit } if + } forall + not { pop /bwipp.GS1notNumeric (Not numeric) false exit } if + } def + + /lintcset82 { + true exch { + 1 string dup 0 4 -1 roll put + (!"%&'()*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz) + exch search not { pop pop false exit } if + pop pop pop + } forall + not { pop /bwipp.GS1badCSET82character (Invalid CSET 82 character) false exit } if + } def + + /lintcset39 { + true exch { + 1 string dup 0 4 -1 roll put + (#-/0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ) + exch search not { pop pop false exit } if + pop pop pop + } forall + not { pop /bwipp.GS1badCSET39character (Invalid CSET 39 character) false exit } if + } def + + /lintkey { + dup length 2 lt { pop pop /bwipp.GS1keyTooShort (Key is too short) false exit } if + dup 0 get dup 48 lt exch 57 gt or exch + 1 get dup 48 lt exch 57 gt or or { + pop /bwipp.GS1badGCP (Non-numeric company prefix) false exit + } if + } def + + /lintimporteridx { + (-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz) + exch search not {pop pop /bwipp.GS1badImporterIndex (Invalid importer index) false exit} if + pop pop pop + } def + + /lintcsum { + mark exch + dup length 2 mod 0 eq {3} {1} ifelse + exch { 48 sub 1 index mul exch 4 exch sub } forall pop + 0 counttomark 1 sub {add} repeat exch pop + 10 mod 0 ne { pop /bwipp.GS1badChecksum (Bad checksum) false exit } if + } def + +{ + /cset82 << + 0 (!"%&'\(\)*+,-./0123456789:;<=>?ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz) + { exch dup 1 add } forall pop + >> def + + /cset32 << + 0 (23456789ABCDEFGHJKLMNPQRSTUVWXYZ) + { exch dup 1 add } forall pop + >> def +} ctxdef + + /lintcsumalpha { + dup length 2 lt { pop pop /bwipp.GS1alphaTooShort (Alphanumeric string is too short to check) false exit} if + dup length 2 sub + 2 copy + 0 exch getinterval mark exch { + dup cset82 exch known { cset82 exch get } { -1 exit } ifelse + } forall + dup -1 eq { cleartomark pop pop pop /bwipp.GS1UnknownCSET82Character (Unknown CSET 82 character) false exit} if + counttomark array astore exch pop + 3 1 roll + 2 getinterval mark exch { + dup cset32 exch known { cset32 exch get } { -1 exit } ifelse + } forall + dup -1 eq { cleartomark pop pop /bwipp.GS1UnknownCSET32Character (Unknown CSET 32 character) false exit} if + counttomark array astore exch pop + dup 0 get 5 bitshift exch 1 get add exch + [ 2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 ] + 1 index length + dup 2 index length gt { pop pop pop pop pop /bwipp.GS1alphaTooLong (Alphanumeric string is too long to check) false exit} if + 0 exch getinterval {exch} forall + 0 exch { 3 -1 roll exch mul add } forall 1021 mod + ne { pop /bwipp.GS1badAlphaCheckCharacters (Bad alphanumeric check characters) false exit} if + } def + +{ + /iso3166 << [ + /004 /008 /010 /012 /016 /020 /024 /028 /031 /032 /036 /040 /044 /048 + /050 /051 /052 /056 /060 /064 /068 /070 /072 /074 /076 /084 /086 /090 /092 /096 + /100 /104 /108 /112 /116 /120 /124 /132 /136 /140 /144 /148 + /152 /156 /158 /162 /166 /170 /174 /175 /178 /180 /184 /188 /191 /192 /196 + /203 /204 /208 /212 /214 /218 /222 /226 /231 /232 /233 /234 /238 /239 /242 /246 /248 + /250 /254 /258 /260 /262 /266 /268 /270 /275 /276 /288 /292 /296 + /300 /304 /308 /312 /316 /320 /324 /328 /332 /334 /336 /340 /344 /348 + /352 /356 /360 /364 /368 /372 /376 /380 /384 /388 /392 /398 + /400 /404 /408 /410 /414 /417 /418 /422 /426 /428 /430 /434 /438 /440 /442 /446 + /450 /454 /458 /462 /466 /470 /474 /478 /480 /484 /492 /496 /498 /499 + /500 /504 /508 /512 /516 /520 /524 /528 /531 /533 /534 /535 /540 /548 + /554 /558 /562 /566 /570 /574 /578 /580 /581 /583 /584 /585 /586 /591 /598 + /600 /604 /608 /612 /616 /620 /624 /626 /630 /634 /638 /642 /643 /646 + /652 /654 /659 /660 /662 /663 /666 /670 /674 /678 /682 /686 /688 /690 /694 + /702 /703 /704 /705 /706 /710 /716 /724 /728 /729 /732 /740 /744 /748 + /752 /756 /760 /762 /764 /768 /772 /776 /780 /784 /788 /792 /795 /796 /798 + /800 /804 /807 /818 /826 /831 /832 /833 /834 /840 + /850 /854 /858 /860 /862 /876 /882 /887 /894 + ] {dup} forall >> def +} ctxdef + + /lintiso3166 { + iso3166 exch known not { pop /bwipp.GS1UnknownCountry (Unknown country code) false exit } if + } def + + /lintiso3166999 { + dup /999 ne { + iso3166 exch known not { pop /bwipp.GS1UnknownCountryOr999 (Unknown country code or not 999) false exit } if + } { + pop + } ifelse + } def + + /lintiso3166list { + dup length 3 mod 0 ne { + pop pop /bwipp.GS1BadCountryListLength (Not a group of three-digit country codes) false exit + } if + true + 0 3 3 index length 1 sub { + 2 index exch 3 getinterval + iso3166 exch known not { pop pop false exit } if + } for + not { pop /bwipp.GS1UnknownCountry (Unknown country code) false exit } if + pop + } def + +{ + /iso3166alpha2 << [ + /AD /AE /AF /AG /AI /AL /AM /AO /AQ /AR /AS /AT /AU /AW /AX /AZ + /BA /BB /BD /BE /BF /BG /BH /BI /BJ /BL /BM /BN /BO /BQ /BR /BS /BT /BV /BW /BY /BZ + /CA /CC /CD /CF /CG /CH /CI /CK /CL /CM /CN /CO /CR /CU /CV /CW /CX /CY /CZ + /DE /DJ /DK /DM /DO /DZ + /EC /EE /EG /EH /ER /ES /ET + /FI /FJ /FK /FM /FO /FR + /GA /GB /GD /GE /GF /GG /GH /GI /GL /GM /GN /GP /GQ /GR /GS /GT /GU /GW /GY + /HK /HM /HN /HR /HT /HU + /ID /IE /IL /IM /IN /IO /IQ /IR /IS /IT /JE /JM /JO /JP + /KE /KG /KH /KI /KM /KN /KP /KR /KW /KY /KZ + /LA /LB /LC /LI /LK /LR /LS /LT /LU /LV /LY + /MA /MC /MD /ME /MF /MG /MH /MK /ML /MM /MN /MO /MP /MQ /MR /MS /MT /MU /MV /MW /MX /MY /MZ + /NA /NC /NE /NF /NG /NI /NL /NO /NP /NR /NU /NZ + /OM + /PA /PE /PF /PG /PH /PK /PL /PM /PN /PR /PS /PT /PW /PY + /QA + /RE /RO /RS /RU /RW + /SA /SB /SC /SD /SE /SG /SH /SI /SJ /SK /SL /SM /SN /SO /SR /SS /ST /SV /SX /SY /SZ + /TC /TD /TF /TG /TH /TJ /TK /TL /TM /TN /TO /TR /TT /TV /TW /TZ + /UA /UG /UM /US /UY /UZ + /VA /VC /VE /VG /VI /VN /VU + /WF /WS + /YE /YT + /ZA /ZM /ZW + ] {dup} forall >> def +} ctxdef + + /lintiso3166alpha2 { + iso3166alpha2 exch known not { pop /bwipp.GS1UnknownCountryAlpha (Unknown country alpha code) false exit } if + } def + +{ + /iso4217 << [ + /008 /012 /032 /036 /044 /048 + /050 /051 /052 /060 /064 /068 /072 /084 /090 /096 + /104 /108 /116 /124 /132 /136 /144 + /152 /156 /170 /174 /188 /191 /192 + /203 /208 /214 /222 /230 /232 /238 /242 /262 /270 /292 + /320 /324 /328 /332 /340 /344 /348 + /352 /356 /360 /364 /368 /376 /388 /392 /398 + /400 /404 /408 /410 /414 /417 /418 + /422 /426 /430 /434 /446 + /454 /458 /462 /480 /484 /496 /498 + /504 /512 /516 /524 /532 /533 /548 + /554 /558 /566 /578 /586 /590 /598 + /600 /604 /608 /634 /643 /646 /654 /682 /690 /694 + /702 /704 /706 /710 /728 /748 + /752 /756 /760 /764 /776 /780 /784 /788 + /800 /807 /818 /826 /834 /840 /858 /860 /882 /886 + /901 /925 /927 /928 /929 /930 /931 /932 /933 /934 /936 /938 + /940 /941 /943 /944 /946 /947 /948 /949 + /950 /951 /952 /953 /955 /956 /957 /958 /959 + /960 /961 /962 /963 /964 /965 /967 /968 /969 + /970 /971 /972 /973 /975 /976 /977 /978 /979 + /980 /981 /984 /985 /986 /990 /994 /997 /999 + ] {dup} forall >> def +} ctxdef + + /lintiso4217 { + iso4217 exch known not { pop /bwipp.GS1UnknownCurrency (Unknown currency code) false exit } if + } def + + /lintiban { + dup length 4 le { pop pop /bwipp.GS1tooShort (IBAN too short) false exit } if + dup true exch { + 1 string dup 0 4 -1 roll put + (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ) + exch search not { pop pop false exit } if + pop pop pop + } forall + not { pop /bwipp.GS1badIBANcharacter (Invalid IBAN character) false exit } if + dup mark exch mark exch {} forall counttomark -4 roll counttomark array astore exch pop { + 48 sub dup 9 gt {7 sub dup 10 idiv exch 10 mod} if + } forall counttomark array astore exch pop + 0 exch {exch 10 mul add 97 mod} forall + 1 ne { pop pop /bwipp.GS1badIBANchecksum (IBAN checksum incorrect) false exit } if + 0 2 getinterval lintiso3166alpha2 + } def + + /lintzero { + (0) ne { pop /bwipp.GS1zeroRequired (Zero is required) false exit } if + } def + + /lintnonzero { + false exch { 48 ne {pop true} if } forall + not { pop /bwipp.GS1zeroNotPermitted (Zero not permitted) false exit } if + } def + + /lintnozeroprefix { + dup length 1 gt exch 0 get 48 eq and { + pop /bwipp.GS1badZeroPrefix (Zero prefix is not permitted) false exit + } if + } def + + /lintyymmd0 { + dup 2 2 getinterval cvi dup 1 lt exch 12 gt or { pop /bwipp.GS1badMonth (Invalid month) false exit } if + dup 0 2 getinterval cvi dup 21 sub % Update 20YY periodically for century calculation + dup 51 ge {pop 1900 add} { -50 le {2100 add} {2000 add} ifelse} ifelse % YYYY + dup 400 mod 0 eq exch dup 4 mod 0 eq exch 100 mod 0 ne and or % Leap year? + [ 31 3 -1 roll {29} {28} ifelse 31 30 31 30 31 31 30 31 30 31 ] + 1 index 2 2 getinterval cvi 1 sub get + exch 4 2 getinterval cvi lt { pop /bwipp.GS1badDay (Invalid day of month) false exit } if + } def + + /lintyymmdd { + dup length 6 ne { pop /bwipp.GS1badDateLength (Invalid length for date) false exit } if + dup 4 2 getinterval cvi 1 lt { pop /bwipp.GS1badDay (Invalid day of month) false exit } if + lintyymmd0 + } def + + /lintyymmddhh { + dup length 8 ne { pop /bwipp.GS1badYYMMDDHHLength (Invalid length for date with hour) false exit } if + dup 6 2 getinterval cvi 23 gt { pop pop /bwipp.GS1badHour (Invalid hour of day) false exit } if + 0 6 getinterval lintyymmdd + } def + + /linthhmm { + dup 0 2 getinterval cvi 23 gt { pop pop /bwipp.GS1badHour (Invalid hour of day) false exit } if + 2 2 getinterval cvi 59 gt { pop /bwipp.GS1badMinute (Invalid minute in the hour) false exit } if + } def + + /lintmmoptss { + dup length dup 2 ne exch 4 ne and { + pop /bwipp.GS1badTimeLength (Invalid length for optional minutes and seconds) false exit + } if + dup 0 2 getinterval cvi 59 gt { pop pop /bwipp.GS1badMinute (Invalid minute in the hour) false exit } if + dup length 4 ge { + dup 2 2 getinterval cvi 59 gt { pop pop /bwipp.GS1badSecond (Invalid second in the minute) false exit } if + } if + pop + } def + + /lintyesno { + dup (0) ne exch (1) ne and { + pop /bwipp.GS1badBoolean (Neither 0 nor 1 for yes or no) false exit + } if + } def + + /lintwinding { + dup (0) ne exch dup (1) ne exch (9) ne and and { + pop /bwipp.GS1badWinding (Invalid winding direction) false exit + } if + } def + + /lintpieceoftotal { + dup length 2 mod 0 ne { pop pop /bwipp.GS1badPieceTotalLength (Invalid piece/total length) false exit } if + dup dup length 2 idiv 0 exch getinterval cvi + dup 0 eq { pop pop pop /bwipp.GS1badPieceNumber (Invalid piece number) false exit } if + exch dup length 2 idiv dup getinterval cvi + dup 0 eq { pop pop pop /bwipp.GS1badPieceTotal (Invalid total number) false exit } if + gt { pop /bwipp.GS1pieceExceedsTotal (Piece number exceeds total) false exit } if + } def + + /lintpcenc { + { + (%) search not {pop exit} if + pop pop dup length 2 lt { pop pop /bwipp.GS1badPercentEscape (Invalid % escape) false exit } if + dup 0 2 getinterval true exch { + 1 string dup 0 4 -1 roll put + (0123456789ABCDEFabcdef) + exch search not { pop pop false exit } if + pop pop pop + } forall + not { pop pop /bwipp.GS1badPercentChars (Invalid characters for percent encoding) false exit } if + } loop + } def + + /lintcouponcode { + dup true exch { + dup 48 lt exch 57 gt or { pop false exit } if + } forall + not { pop pop /bwipp.GS1couponNotNumeric (Coupon not numeric) false exit } if + + % GCP VLI and value + dup length 1 lt { + pop pop /bwipp.GS1couponTooShortGCPVLI (Coupon too short: Missing GCP VLI) false exit + } if + dup 0 1 getinterval cvi dup 6 gt { + pop pop /bwipp.GS1couponBadGCPVLI (Coupon GCP length indicator must be 0-6) false exit + } if + 6 add 1 add + 2 copy exch length gt { + pop pop pop /bwipp.GS1couponTooShortGCP (Coupon too short: GCP truncated) false exit + } if + dup 2 index length exch sub getinterval + + % Offer Code + dup length 6 lt { + pop pop /bwipp.GS1couponTooShortOfferCode (Coupon too short: Offer Code truncated) false exit + } if + dup length 6 sub 6 exch getinterval + + % Save Value VLI and value + dup length 1 lt { + pop pop /bwipp.GS1couponTooShortSaveValueVLI (Coupon too short: Missing Save Value VLI) false exit + } if + dup 0 1 getinterval cvi dup dup 1 lt exch 5 gt or { + pop pop /bwipp.GS1couponBadSaveValueVLI (Coupon Save Value length indicator must be 1-5) false exit + } if + 1 add + 2 copy exch length gt { + pop pop pop /bwipp.GS1couponTooShortSaveValue (Coupon too short: Save Value truncated) false exit + } if + dup 2 index length exch sub getinterval + + % 1st Purchase Requirement VLI and value + dup length 1 lt { + pop pop /bwipp.GS1couponTooShort1stPurchaseRequirementVLI (Coupon too short: Missing 1st Purchase Requirement VLI) false exit + } if + dup 0 1 getinterval cvi dup dup 1 lt exch 5 gt or { + pop pop /bwipp.GS1couponBad1stPurchaseRequirementVLI (Coupon 1st Purchase Requirement length indicator must be 1-5) false exit + } if + 1 add + 2 copy exch length gt { + pop pop pop /bwipp.GS1couponTooShort1stPurchaseRequirement (Coupon too short: 1st Purchase Requirement truncated) false exit + } if + dup 2 index length exch sub getinterval + + % 1st Purchase Requirement Code + dup length 1 lt { + pop pop /bwipp.GS1couponTooShort1stPurchaseRequirementCode (Coupon too short: Missing 1st Purchase Requirement Code) false exit + } if + dup 0 1 getinterval cvi dup 4 gt exch 9 ne and { + pop pop /bwipp.GS1couponBad1stPurchaseRequirementCode (Coupon 1st Purchase Requirement Code must be 0-4 or 9) false exit + } if + dup length 1 sub 1 exch getinterval + + % 1st Purchase Family Code + dup length 3 lt { + pop pop /bwipp.GS1couponTooShort1stPurchaseFamilyCode (Coupon too short: 1st Purchase Family Code truncated) false exit + } if + dup length 3 sub 3 exch getinterval + + % Optional field 1 + dup length 1 ge { dup 0 1 getinterval cvi 1 eq { + 1 dup 2 index length exch sub getinterval + + % Additional Purchase Rules Code + dup length 1 lt { + pop pop /bwipp.GS1couponTooShortAdditionalPurchaseRulesCode (Coupon too short: Missing Additional Purchase Rules Code) false exit + } if + dup 0 1 getinterval cvi 3 gt { + pop pop /bwipp.GS1couponBadAdditionalPurchaseRulesCode (Coupon Additional Purchase Rules Code must be 0-3) false exit + } if + dup length 1 sub 1 exch getinterval + + % 2nd Purchase RequirementVLI and value + dup length 1 lt { + pop pop /bwipp.GS1couponTooShort2ndPurchaseRequirementVLI (Coupon too short: Missing 2nd Purchase Requirement VLI) false exit + } if + dup 0 1 getinterval cvi dup dup 1 lt exch 5 gt or { + pop pop /bwipp.GS1couponBad2ndPurchaseRequirementVLI (Coupon 2nd Purchase Requirement length indicator must be 1-5) false exit + } if + 1 add + 2 copy exch length gt { + pop pop pop /bwipp.GS1couponTooShort2ndPurchaseRequirement (Coupon too short: 2nd Purchase Requirement truncated) false exit + } if + dup 2 index length exch sub getinterval + + % 2nd Purchase Requirement Code + dup length 1 lt { + pop pop /bwipp.GS1couponTooShort2ndPurchaseRequirementCode (Coupon too short: Missing 2nd Purchase Requirement Code) false exit + } if + dup 0 1 getinterval cvi dup 4 gt exch 9 ne and { + pop pop /bwipp.GS1couponBad2ndPurchaseRequirementCode (Coupon 2nd Purchase Requirement Code must be 0-4 or 9) false exit + } if + dup length 1 sub 1 exch getinterval + + % 2nd Purchase Family Code + dup length 3 lt { + pop pop /bwipp.GS1couponTooShort2ndPurchaseFamilyCode (Coupon too short: 2nd Purchase Family Code truncated) false exit + } if + dup length 3 sub 3 exch getinterval + + % 2nd Purchase GCP VLI and value + dup length 1 lt { + pop pop /bwipp.GS1couponTooShort2ndPurchaseGCPVLI (Coupon too short: Missing 2nd Purchase GCP VLI) false exit + } if + dup 0 1 getinterval cvi dup dup 6 gt exch 9 ne and { + pop pop /bwipp.GS1couponBad2ndPurchaseGCPVLI (Coupon 2nd Purchase GCP length indicator must be 0-6 or 9) false exit + } if + dup 9 ne {6 add} {pop 0} ifelse 1 add + 2 copy exch length gt { + pop pop pop /bwipp.GS1couponTooShort2ndPurchaseGCP (Coupon too short: 2nd Purchase GCP truncated) false exit + } if + dup 2 index length exch sub getinterval + + } if } if + + % Optional field 2 + dup length 1 ge { dup 0 1 getinterval cvi 2 eq { + 1 dup 2 index length exch sub getinterval + + % 3rd Purchase RequirementVLI and value + dup length 1 lt { + pop pop /bwipp.GS1couponTooShort3rdPurchaseRequirementVLI (Coupon too short: Missing 3rd Purchase Requirement VLI) false exit + } if + dup 0 1 getinterval cvi dup dup 1 lt exch 5 gt or { + pop pop /bwipp.GS1couponBad3rdPurchaseRequirementVLI (Coupon 3rd Purchase Requirement length indicator must be 1-5) false exit + } if + 1 add + 2 copy exch length gt { + pop pop pop /bwipp.GS1couponTooShort3rdPurchaseRequirement (Coupon too short: 3rd Purchase Requirement truncated) false exit + } if + dup 2 index length exch sub getinterval + + % 3rd Purchase Requirement Code + dup length 1 lt { + pop pop /bwipp.GS1couponTooShort3rdPurchaseRequirementCode (Coupon too short: Missing 3rd Purchase Requirement Code) false exit + } if + dup 0 1 getinterval cvi dup 4 gt exch 9 ne and { + pop pop /bwipp.GS1couponBad3rdPurchaseRequirementCode (Coupon 3rd Purchase Requirement Code must be 0-4 or 9) false exit + } if + dup length 1 sub 1 exch getinterval + + % 3rd Purchase Family Code + dup length 3 lt { + pop pop /bwipp.GS1couponTooShort3rdPurchaseFamilyCode (Coupon too short: 3rd Purchase Family Code truncated) false exit + } if + dup length 3 sub 3 exch getinterval + + % 3rd Purchase GCP VLI and value + dup length 1 lt { + pop pop /bwipp.GS1couponTooShort3rdPurchaseGCPVLI (Coupon too short: Missing 3rd Purchase GCP VLI) false exit + } if + dup 0 1 getinterval cvi dup dup 6 gt exch 9 ne and { + pop pop /bwipp.GS1couponBad3rdPurchaseGCPVLI (Coupon 3rd Purchase GCP length indicator must be 0-6 or 9) false exit + } if + dup 9 ne {6 add} {pop 0} ifelse 1 add + 2 copy exch length gt { + pop pop pop /bwipp.GS1couponTooShort3rdPurchaseGCP (Coupon too short: 3rd Purchase GCP truncated) false exit + } if + dup 2 index length exch sub getinterval + + } if } if + + % Optional field 3 + /couponexpire -1 def + dup length 1 ge { dup 0 1 getinterval cvi 3 eq { + 1 dup 2 index length exch sub getinterval + + % Expiration date + dup length 6 lt { + pop pop /bwipp.GS1couponTooShortExpirationDate (Coupon too short: Expiration date) false exit + } if + dup 2 2 getinterval cvi dup 1 lt exch 12 gt or { pop pop /bwipp.GS1couponExpirationDateBadMonth (Invalid month in expiration date) false exit } if + dup 0 2 getinterval cvi dup 21 sub % Update 20YY periodically for century calculation + dup 51 ge {pop 1900 add} { -50 le {2100 add} {2000 add} ifelse} ifelse % YYYY + dup 400 mod 0 eq exch dup 4 mod 0 eq exch 100 mod 0 ne and or % Leap year? + [ 31 3 -1 roll {29} {28} ifelse 31 30 31 30 31 31 30 31 30 31 ] + 1 index 2 2 getinterval cvi 1 sub get + 1 index 4 2 getinterval cvi dup 3 1 roll lt + exch 1 lt or { pop pop /bwipp.GS1couponExpirationDateBadDay (Invalid day of month in expiration date) false exit } if + dup 0 6 getinterval cvi /couponexpire exch def + dup length 6 sub 6 exch getinterval + + } if } if + + % Optional field 4 + dup length 1 ge { dup 0 1 getinterval cvi 4 eq { + 1 dup 2 index length exch sub getinterval + + % Start date + dup length 6 lt { + pop pop /bwipp.GS1couponTooShortStartDate (Coupon too short: Start date) false exit + } if + dup 2 2 getinterval cvi dup 1 lt exch 12 gt or { pop pop /bwipp.GS1couponStartDateBadMonth (Invalid month in start date) false exit } if + dup 0 2 getinterval cvi dup 21 sub % Update 20YY periodically for century calculation + dup 51 ge {pop 1900 add} { -50 le {2100 add} {2000 add} ifelse} ifelse % YYYY + dup 400 mod 0 eq exch dup 4 mod 0 eq exch 100 mod 0 ne and or % Leap year? + [ 31 3 -1 roll {29} {28} ifelse 31 30 31 30 31 31 30 31 30 31 ] + 1 index 2 2 getinterval cvi 1 sub get + 1 index 4 2 getinterval cvi dup 3 1 roll lt + exch 1 lt or { pop pop /bwipp.GS1couponStartDateBadDay (Invalid day of month in start date) false exit } if + dup 0 6 getinterval cvi /couponstart exch def + couponexpire -1 ne couponexpire couponstart lt and { + pop pop /bwipp.GS1couponExpireDateBeforeStartDate (Coupon expires before it starts) false exit + } if + dup length 6 sub 6 exch getinterval + + } if } if + + % Optional field 5 + dup length 1 ge { dup 0 1 getinterval cvi 5 eq { + 1 dup 2 index length exch sub getinterval + + % Serial Number VLI and value + dup length 1 lt { + pop pop /bwipp.GS1couponTooShortSerialNumberVLI (Coupon too short: Missing Serial Number VLI) false exit + } if + dup 0 1 getinterval cvi 6 add 1 add + 2 copy exch length gt { + pop pop pop /bwipp.GS1couponTooShortSerialNumber (Coupon too short: Serial Number truncated) false exit + } if + dup 2 index length exch sub getinterval + + } if } if + + % Optional field 6 + dup length 1 ge { dup 0 1 getinterval cvi 6 eq { + 1 dup 2 index length exch sub getinterval + + % Retailer GCP/GLN VLI and value + dup length 1 lt { + pop pop /bwipp.GS1couponTooShortRetailerGCPGLNVLI (Coupon too short: Missing Retailer GCP/GLN VLI) false exit + } if + dup 0 1 getinterval cvi dup dup 1 lt exch 7 gt or { + pop pop /bwipp.GS1couponBadRetailerGCPGLNVLI (Coupon Retailer GCP/GLN length indicator must be 1-7) false exit + } if + 6 add 1 add + 2 copy exch length gt { + pop pop pop /bwipp.GS1couponTooShortRetailerGCPGLN (Coupon too short: Retailer GCP/GLN truncated) false exit + } if + dup 2 index length exch sub getinterval + + } if } if + + % Optional field 9 + dup length 1 ge { dup 0 1 getinterval cvi 9 eq { + 1 dup 2 index length exch sub getinterval + + % Save Value Code + dup length 1 lt { + pop pop /bwipp.GS1couponTooShortSaveValueCode (Coupon too short: Missing Save Value Code) false exit + } if + dup 0 1 getinterval cvi dup 6 gt exch dup 3 eq exch 4 eq or or { + pop pop /bwipp.GS1couponBadSaveValueCode (Coupon Save Value Code must be 0,1,2,5 or 6) false exit + } if + dup length 1 sub 1 exch getinterval + + % Save Value Applies to Item + dup length 1 lt { + pop pop /bwipp.GS1couponTooShortSaveValueAppliesToItem (Coupon too short: Missing Save Value Applies to Item) false exit + } if + dup 0 1 getinterval cvi 2 gt { + pop pop /bwipp.GS1couponBadSaveValueAppliesToItem (Coupon Save Value Applies to Item must be 0-2) false exit + } if + dup length 1 sub 1 exch getinterval + + % Store Coupon Flag + dup length 1 lt { + pop pop /bwipp.GS1couponTooShortStoreCouponFlag (Coupon too short: Missing Store Coupon Flag) false exit + } if + dup length 1 sub 1 exch getinterval + + % Don't Multiply Flag + dup length 1 lt { + pop pop /bwipp.GS1couponTooShortDontMultiplyFlag (Coupon too short: Missing Don't Multiply Flag) false exit + } if + dup 0 1 getinterval cvi 1 gt { + pop pop /bwipp.GS1couponBadDontMultiplyFlag (Don't Multiply Flag must be 0 or 1) false exit + } if + dup length 1 sub 1 exch getinterval + + } if } if + + dup length 0 ne { + pop pop /bwipp.GS1couponUnrecognisedOptionalField (Coupon fields must be 1,2,3,4,5,6 or 9, increasing order) false exit + } if + pop + } def + + /lintcouponposoffer { + dup true exch { + dup 48 lt exch 57 gt or { pop false exit } if + } forall + not { pop pop /bwipp.GS1couponNotNumeric (Coupon not numeric) false exit } if + % Format Code + dup length 1 lt { + pop pop /bwipp.GS1couponTooShortFormatCode (Coupon too short: Missing Format Code) false exit + } if + dup 0 1 getinterval dup (0) ne exch (1) ne and { + pop pop /bwipp.GS1couponBadFormatCode (Coupon format must be 0 or 1) false exit + } if + dup length 1 sub 1 exch getinterval + % Funder ID VLI and Funder ID + dup length 1 lt { + pop pop /bwipp.GS1couponTooShortFunderVLI (Coupon too short: Missing Funder VLI) false exit + } if + dup 0 1 getinterval cvi dup 6 gt { + pop pop pop /bwipp.GS1couponBadFunderVLI (Coupon Funder length indicator must be 0-6) false exit + } if + 6 add 1 add + 2 copy exch length gt { + pop pop pop /bwipp.GS1couponTooShortFunder (Coupon too short: Truncated Funder ID) false exit + } if + dup 2 index length exch sub getinterval + % Offer Code + dup length 6 lt { + pop pop /bwipp.GS1couponTooShortOfferCode (Coupon too short: Truncated Offer Code) false exit + } if + dup length 6 sub 6 exch getinterval + % Serial Number VLI and Serial Number + dup length 1 lt { + pop pop /bwipp.GS1couponTooShortSnVLI (Coupon too short: Missing SN VLI) false exit + } if + dup 0 1 getinterval cvi + 6 add 1 add + 2 copy exch length gt { + pop pop pop /bwipp.GS1couponTooShortSn (Coupon too short: Truncated SN) false exit + } if + dup 2 index length exch sub getinterval + dup length 0 ne { + pop pop /bwipp.GS1couponTooLong (Coupon too long) false exit + } if + pop + } def + + /lintlatlong { + dup length 20 ne { + pop /bwipp.GS1badGeoLength (Invalid length for a geo-location) false exit + } if + dup 0 10 getinterval cvi 1800000000 gt { pop /bwipp.GS1badLatitude (Invalid value for latitude) false exit } if + dup 10 10 getinterval cvi 3600000000 gt { pop /bwipp.GS1badLongitude (Invalid value for longitude) false exit } if + pop + } def + + dontlint not { + + % Validate AI contents + true + 0 1 vals length 1 sub { + dup ais exch get /ai exch def + vals exch get /val exch def + gs1syntax ai known { + gs1syntax ai get /parts get + % Overall length checks, e.g. to report "too long", not "checksum failure" + dup 0 exch {dup /opt get {pop 0} {/min get} ifelse add} forall val length gt { + pop /bwipp.GS1valueTooShort (Too short) false exit + } if + dup 0 exch {/max get add} forall val length lt { + pop /bwipp.GS1valueTooLong (Too long) false exit + } if + { % Checks for each component of the AI + /props exch def + props /max get val length 2 copy gt {exch} if pop + val exch 0 exch getinterval /eval exch def + /val val eval length dup val length exch sub getinterval def + eval length 0 eq { + props /opt get not { + pop /bwipp.GS1valueTooShort (Too short) false exit + } if + } { + eval length props /min get lt { + pop /bwipp.GS1valueTooShort (Too short) false exit + } if + << /N /lintnumeric /X /lintcset82 /Y /lintcset39 >> props /cset get get eval exch load exec + props /linters get { eval exch load exec } forall + } ifelse + } forall + dup not {exit} if + val length 0 ne { % Not all data consumed by components + pop /bwipp.GS1valueTooLong (Too long) false exit + } if + } { + pop /bwipp.GS1unknownAI (Unrecognised AI) false exit + } ifelse + } for + not { + dup length ai length add 5 add string + dup 0 (AI ) putinterval + dup 3 ai putinterval + dup 3 ai length add (: ) putinterval + dup 5 ai length add 4 -1 roll putinterval + //raiseerror exec + } if + + % Search for "patt" matching an AIs, excluding "this" AI + /aiexists { + /this exch def + /patt exch def + 1 { % common exit + aivals patt known {true exit} if % Fast path + patt length 4 eq { + patt 3 1 getinterval (n) eq { + /pfxlen patt 2 1 getinterval (n) eq {2} {3} ifelse def + false + ais { + dup dup this ne exch length 4 eq and { + 0 pfxlen getinterval patt 0 pfxlen getinterval eq { + pop true + } if + } { + pop + } ifelse + } forall + exit + } if + false exit + } if + false exit + } repeat + } def + + % Build AI dict and validate repeats + /aivals vals length dict def + 0 1 vals length 1 sub { + dup ais exch get /ai exch def + vals exch get /val exch def + aivals ai known { + aivals ai get val ne { + ai length 40 add string + dup 0 (Repeated AIs \() putinterval + dup 14 ai putinterval + dup 14 ai length add (\) must have the same value) putinterval + /bwipp.GS1repeatedDifferingAIs exch //raiseerror exec + } if + } { + aivals ai val put + } ifelse + } for + + % Validate ex and req pairings + 0 1 vals length 1 sub { + ais exch get /ai exch def + gs1syntax ai get /ex 2 copy known { + get { + /patt exch def + patt ai aiexists { + ai length patt length add 36 add string + dup 0 (AIs \() putinterval + dup 5 ai putinterval + dup 5 ai length add (\) and \() putinterval + dup 12 ai length add patt putinterval + dup 12 ai length add patt length add (\) are mutually exclusive) putinterval + /bwipp.GS1exclusiveAIs exch //raiseerror exec + } if + } forall + } { + pop pop + } ifelse + lintreqs { + gs1syntax ai get /req 2 copy known { + get { % For each req attribute group + false exch { % Any req AI in the group is fine + ai aiexists {pop true} if + } forall + not { + ai length 47 add string + dup 0 (One of more requisite AIs for AI \() putinterval + dup 34 ai putinterval + dup 34 ai length add (\) are missing) putinterval + /bwipp.GS1missingAIs exch //raiseerror exec + } if + } forall + } { + pop pop + } ifelse + } if + } for + + } if % dontlint + + ais vals fncs + + //unloadctx exec + + end + +} +[/barcode] {null def} forall +bind def +/gs1process dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END RESOURCE gs1process-- + % --BEGIN RENDERER renlinear-- % --REQUIRES preamble raiseerror-- -%%BeginResource: uk.co.terryburton.bwipp renlinear 0.0 2017040400 82223 84795 -%%BeginData: 237 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp renlinear 0.0 2022082100 75512 74718 +%%BeginData: 246 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put begin /renlinear { @@ -87,7 +3246,7 @@ begin /textcolor (unset) def /textxalign (unset) def /textyalign (unset) def - /textfont (NimbusMonL-Regu) def + /textfont (Courier) def /textsize 10 def /textxoffset 0 def /textyoffset 0 def @@ -112,10 +3271,10 @@ begin /guardrightypos 0 def /guardwidth 6 def /guardheight 7 def - + % Apply the renderer options and the user options args {def} forall - opt {def} forall + opt {def} forall /barcolor barcolor cvlit def /textcolor textcolor cvlit def @@ -144,28 +3303,28 @@ begin /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 + /pixx 0 def /pixy 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 + /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 + /c d 2 div pixx add def % Centre of the bar = pixx + 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 + h y add pixy gt {/pixy 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 + /d sbs i get spaceratio mul spaceratio sub 1 add def % d = digit*r-r+1 } ifelse - /x x d add def % x+=d + /pixx pixx d add def % pixx += d } for gsave @@ -174,7 +3333,7 @@ begin % Force symbol to given width width 0 ne { - width 72 mul x div 1 scale + width 72 mul pixx div 1 scale } if % Set RGB or CMYK color depending on length of given hex string @@ -186,37 +3345,44 @@ begin anycolor length 8 eq { (< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor } if - } bind def + } 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 + pixx borderleft add borderright add 0 rlineto + 0 pixy borderbottom add bordertop add rlineto + pixx borderleft add borderright add neg 0 rlineto + 0 pixy borderbottom add bordertop add neg rlineto closepath - backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if + backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if showborder { gsave bordercolor (unset) ne { bordercolor setanycolor } if borderwidth setlinewidth stroke grestore - } if - + } if + % Display the bars for elements in the bars array gsave - 0 setlinecap barcolor (unset) ne { barcolor setanycolor } if + newpath bars { dup -1 ne { - aload pop newpath setlinewidth moveto 0 exch rlineto stroke + aload pop % h x y w + 2 index 1 index 2 div sub 2 index moveto + 0 4 index rlineto + dup 0 rlineto + 0 4 index neg rlineto + closepath + pop pop pop pop } { pop } ifelse } forall + fill grestore - + % Display the text for elements in the text array textcolor (unset) ne { textcolor setanycolor } if includetext { @@ -261,21 +3427,21 @@ begin /textascent exch def /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def - /textxpos textxoffset x textwidth sub 2 div add def + /textxpos textxoffset pixx 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 (right) eq { /textxpos pixx 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 { + textxalign (offright) eq { /textxpos pixx textxoffset add def } if + textxalign (justify) eq textwidth pixx lt and { /textxpos 0 def - /textgaps x textwidth sub tstr length 1 sub div def + /textgaps pixx 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 + 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 + } if % Display the guard elements guardwhitespace { @@ -285,22 +3451,24 @@ begin guardleftpos neg guardwidth add guardleftypos guardwidth 2 div add moveto guardwidth neg guardheight -2 div rlineto guardwidth guardheight -2 div rlineto - stroke + stroke } if guardrightpos 0 ne { newpath - guardrightpos x add guardwidth sub guardrightypos guardheight 2 div add moveto + guardrightpos pixx add guardwidth sub guardrightypos guardheight 2 div add moveto guardwidth guardheight -2 div rlineto guardwidth neg guardheight -2 div rlineto - stroke + stroke } if } if - + grestore - + end -} bind def +} +[/barcode] {null def} forall +bind def /renlinear dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -310,10 +3478,10 @@ end % --BEGIN RENDERER renmatrix-- % --REQUIRES preamble raiseerror-- -%%BeginResource: uk.co.terryburton.bwipp renmatrix 0.0 2017040400 102784 108937 -%%BeginData: 309 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp renmatrix 0.0 2022082100 89491 88705 +%%BeginData: 306 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put begin /renmatrix { @@ -327,6 +3495,8 @@ begin /height 1 def /barcolor (unset) def /backgroundcolor (unset) def + /colormap (unset) def + /dotty false def /inkspread 0 def /inkspreadh 0 def /inkspreadv 0 def @@ -335,7 +3505,7 @@ begin /textcolor (unset) def /textxalign (unset) def /textyalign (unset) def - /textfont (NimbusMonL-Regu) def + /textfont (Courier) def /textsize 10 def /textxoffset 0 def /textyoffset 0 def @@ -366,192 +3536,185 @@ begin inkspread 0 ne {/inkspreadh inkspread def} if inkspread 0 ne {/inkspreadv inkspread def} if - /xyget { pixx mul add pixs exch get } bind def - /xyinvert { pixx mul add pixs exch 2 copy get 1 xor put } bind def - /mxyget { pixx mul add m exch get 2#001 and } bind def - /mxyset { pixx mul add m exch 3 -1 roll put } bind def - /msetborder { pixx mul add m exch 2 copy get 2#010 or put } bind def - /mborderoff { pixx mul add m exch 2 copy get 2#100 or put } bind def - /misborder { pixx mul add m exch get 2#110 and 2#010 eq } bind def - /mclear { pixx mul add m exch 2 copy get 2#001 and put } bind def - /mclear4 { - 2 copy mclear - 2 copy 1 add mclear - 2 copy exch 1 add exch mclear - 2 copy exch 1 add exch mclear - 1 add exch 1 add exch mclear - } bind def + /xyget { pixx mul add pixs exch get} def + /cget { pixx mul add cache exch get and} 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 + } 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 + } def + + /right {dir 1 ne {x y dir cput [x y]} if /x x 1 add def /dir 1 def} def + /down {dir 2 ne {x y dir cput [x y]} if /y y 1 add def /dir 2 def} def + /left {dir 4 ne {x y dir cput [x y]} if /x x 1 sub def /dir 4 def} def + /up {dir 8 ne {x y dir cput [x y]} if /y y 1 sub def /dir 8 def} def /trace { % Walk the outline of a region emitting edge coordinates of the path /y exch def /x exch def - % dir 0:right 1:down 2:left 3:up - % hug 0:right 1:left - /dir x 1 add y 1 add mxyget def /hug dir 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 - mark [x y] { - x 1 add y - x 1 add y 1 add - x y 1 add - x y - 8 dir 2 mul neg roll - /Dy exch def /Dx exch def /D Dx Dy xyget def - /Cy exch def /Cx exch def /C Cx Cy xyget def - /By exch def /Bx exch def /B Bx By xyget def - /Ay exch def /Ax exch def /A Ax Ay xyget def - A B eq { - A C eq {/L} {/R} ifelse - } { - A C eq B D eq and { - A 0 eq hug 0 eq xor {/R} {/F} ifelse - } { - /F - } ifelse - } ifelse - dup /F eq { - pop - dir 0 eq {/x x 1 add def} if - dir 1 eq {/y y 1 add def} if - dir 2 eq {/x x 1 sub def} if - dir 3 eq {/y y 1 sub def} if - hug 0 eq { - Ax Ay msetborder - } { - Bx By msetborder - } ifelse - } { - /L eq { - /dir dir 3 add 4 mod def - hug 1 eq { - Bx By msetborder - Dx Dy mborderoff - } if - } { % R - /dir dir 1 add 4 mod def - hug 0 eq { - Ax Ay msetborder - Cx Cy mborderoff - } if + + % 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 - [x y] - } ifelse + } repeat x sx eq y sy eq and dir sdir eq and {exit} if } loop counttomark array astore exch pop - % Invert the interior of the path - /x x 1 add def /y y 1 add def - /t x y mxyget 1 xor def - mark x y { - counttomark 0 eq {exit} if - /y exch def /x exch def - x y mxyget t ne { - 0 x 1 sub -1 0 {dup y misborder {exch pop exit} if pop} for - pixx 1 sub x 1 add 1 pixx 1 sub {dup y misborder {exch pop exit} if pop} for - 1 exch { % From left to right border + } 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 + } 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 - i y misborder not { - t i y mxyset - i y xyinvert + /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 - i y 1 sub mxyget t ne i y 1 sub misborder not and {i y 1 sub} if - i y 1 add mxyget t ne i y 1 add misborder not and {i y 1 add} if } for - } if - } loop - pop + } for + ] def - % Walk the path to clear the border information - dup 0 get aload pop /y1 exch def /x1 exch def - dup dup length 1 sub 1 exch getinterval { - aload pop /y2 exch def /x2 exch def - x2 x1 gt { x1 2 x2 1 sub {y1 mclear4} for } if - y2 y1 gt { y1 2 y2 1 sub {x1 exch mclear4} for } if - x2 x1 lt { x1 -2 x2 1 add {y1 mclear4} for } if - y2 y1 lt { y1 -2 y2 1 add {x1 exch mclear4} for } if - /x1 x2 def /y1 y2 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 - % Discard duplicate final point - dup length 1 sub 0 exch getinterval + /pixs pixsorig def - } bind def + } 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 + /drawlayerdots { - % Track inverted regions and working space - /m [ pixs length {0} repeat ] def + /pixsorig pixs def + /pixs exch def - % Construct paths by tracing and inverting each dark region - /paths [ - 0 1 pixy 1 sub { - /j exch def - 0 1 pixx 1 sub { - /i exch def - i j xyget 1 eq { - i 1 sub j 1 sub trace - } if - } for + 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 - ] def + fill - % Revert the bitmap size - /pixx pixx 2 sub def - /pixy pixy 2 sub def + /pixs pixsorig 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 + } 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 - barcolor (unset) ne { barcolor setanycolor } if - 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 + + 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 - fill % Display the text for elements in the text array textcolor (unset) ne { textcolor setanycolor } if @@ -597,14 +3760,14 @@ begin /textascent exch def /textwidth tstr stringwidth pop tstr length 1 sub textgaps mul add def - /textxpos textxoffset x textwidth sub 2 div add def + /textxpos textxoffset pixx 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 (right) eq { /textxpos pixx 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 { + textxalign (offright) eq { /textxpos pixx textxoffset add def } if + textxalign (justify) eq textwidth pixx lt and { /textxpos 0 def - /textgaps x textwidth sub tstr length 1 sub div def + /textgaps pixx 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 @@ -617,7 +3780,9 @@ begin end -} bind def +} +[/barcode] {null def} forall +bind def /renmatrix dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -627,10 +3792,10 @@ end % --BEGIN RENDERER renmaximatrix-- % --REQUIRES preamble raiseerror-- -%%BeginResource: uk.co.terryburton.bwipp renmaximatrix 0.0 2017040400 52341 55461 -%%BeginData: 79 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp renmaximatrix 0.0 2022082100 50058 49824 +%%BeginData: 81 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put begin /renmaximatrix { @@ -659,24 +3824,24 @@ begin anycolor length 8 eq { (< >) 10 string copy dup 1 anycolor putinterval cvx exec {255 div} forall setcmykcolor } if - } bind def + } def gsave currentpoint translate - 2.4945 dup scale % from 1pt to 1.88mm + 2.4945 dup scale % from 1pt to 0.88mm 0 0 moveto 30 0 lineto 30 29 lineto 0 29 lineto closepath - backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if + backgroundcolor (unset) ne { gsave backgroundcolor setanycolor fill grestore } if barcolor (unset) ne { barcolor setanycolor } if 0.5 0.5774 translate newpath pixs { - dup - /x exch 30 mod def + dup + /x exch 30 mod def /y exch 30 idiv def y 2 mod 0 eq {x} {x 0.5 add} ifelse 32 y sub 0.8661 mul @@ -704,7 +3869,9 @@ begin end -} bind def +} +[/barcode] {null def} forall +bind def /renmaximatrix dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -713,15 +3880,17 @@ end % --END RENDERER renmaximatrix-- % --BEGIN ENCODER ean5-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear-- % --DESC: EAN-5 (5 digit addon) % --EXAM: 90200 % --EXOP: includetext guardwhitespace % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp ean5 0.0 2017040400 68958 65237 -%%BeginData: 135 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp ean5 0.0 2022082100 67660 63946 +%%BeginData: 147 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -732,14 +3901,15 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text - /textfont /NimbusSanL-Regu def + /textfont /Helvetica def /textsize 12 def /textxoffset 0 def /textyoffset (unset) def - /height 0.7 def - + /height 0.7 def + % Parse the input options options type /stringtype eq { 1 dict begin @@ -749,8 +3919,8 @@ begin } loop currentdict end /options exch def } if - options {def} forall - + options {def} forall + /textfont textfont cvlit def /textsize textsize cvr def /height height cvr def @@ -761,6 +3931,8 @@ begin /textyoffset textyoffset cvr def } ifelse + /ean5 //loadctx exec + % Validate input barcode length 5 ne { /bwipp.ean5badLength (EAN-5 add-on must be 5 digits) //raiseerror exec @@ -770,7 +3942,8 @@ begin /bwipp.ean5badCharacter (EAN-5 add-on must contain only digits) //raiseerror exec } if } forall - + +{ % Create an array containing the character mappings /encs [ (3211) (2221) (2122) (1411) (1132) @@ -786,6 +3959,8 @@ begin [ (11000) (10100) (10010) (10001) (01100) (00110) (00011) (01010) (01001) (00101) ] def +} ctxdef + /checksum 0 def 0 1 4 { /i exch def @@ -801,7 +3976,7 @@ begin /sbs 31 string def /txt 5 array def - + 0 1 4 { /i exch def @@ -849,9 +4024,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /ean5 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -860,15 +4039,17 @@ end % --END ENCODER ean5-- % --BEGIN ENCODER ean2-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear-- % --DESC: EAN-2 (2 digit addon) % --EXAM: 05 % --EXOP: includetext guardwhitespace % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp ean2 0.0 2017040400 67275 63499 -%%BeginData: 120 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp ean2 0.0 2022082100 66307 62648 +%%BeginData: 133 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -879,14 +4060,15 @@ begin /options exch def % We are given an options string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text - /textfont /NimbusSanL-Regu def + /textfont /Helvetica def /textsize 12 def /textxoffset 0 def /textyoffset (unset) def /height 0.7 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -897,7 +4079,7 @@ begin currentdict end /options exch def } if options {def} forall - + /textfont textfont cvlit def /textsize textsize cvr def /height height cvr def @@ -908,6 +4090,8 @@ begin /textyoffset textyoffset cvr def } ifelse + /ean2 //loadctx exec + % Validate input barcode length 2 ne { /bwipp.ean2badLength (EAN-2 add-on must be 2 digits) //raiseerror exec @@ -917,7 +4101,8 @@ begin /bwipp.ean2badCharacter (EAN-2 add-on must contain only digits) //raiseerror exec } if } forall - + +{ % Create an array containing the character mappings /encs [ (3211) (2221) (2122) (1411) (1132) @@ -929,11 +4114,14 @@ begin /barchars (0123456789) def % Determine the mirror map based on mod 4 checksum - /mirrormap [(00) (01) (10) (11)] barcode 0 2 getinterval cvi 4 mod get def + /mirrormaps [(00) (01) (10) (11)] def +} ctxdef + + /mirrormap mirrormaps barcode 0 2 getinterval cvi 4 mod get def /sbs 13 string def /txt 2 array def - + 0 1 1 { /i exch def @@ -950,7 +4138,7 @@ begin length /indx exch def % indx is the length of pre pop pop % Discard seek and post /enc encs indx get def % Get the indxth encoding - mirrormap i get 49 eq { % Reverse enc if 1 in this position in mirrormap + mirrormap i get 49 eq { % Reverse enc if 1 in this position in mirrormap /enclen enc length def /revenc enclen string def 0 1 enclen 1 sub { @@ -981,9 +4169,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /ean2 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -992,15 +4184,17 @@ end % --END ENCODER ean2-- % --BEGIN ENCODER ean13-- -% --REQUIRES preamble raiseerror renlinear ean5 ean2-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear ean5 ean2-- % --DESC: EAN-13 % --EXAM: 2112345678900 % --EXOP: includetext guardwhitespace % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp ean13 0.0 2017040400 95001 91176 -%%BeginData: 215 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp ean13 0.0 2022082100 87150 86773 +%%BeginData: 226 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /ean2 dup /uk.co.terryburton.bwipp findresource put @@ -1013,9 +4207,10 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text - /textfont /NimbusSanL-Regu def + /textfont /Helvetica def /textsize 12 def /textxoffset -10 def /textyoffset -4 def @@ -1042,12 +4237,14 @@ begin /textxoffset textxoffset cvr def /textyoffset textyoffset cvr def /height height cvr def - /addongap addongap cvr def + /addongap addongap cvr def addontextfont (unset) ne {/addontextfont addontextfont cvlit def} if addontextsize (unset) ne {/addontextsize addontextsize cvr def} if addontextxoffset (unset) ne {/addontextxoffset addontextxoffset cvr def} if addontextyoffset (unset) ne {/addontextyoffset addontextyoffset cvr def} if + /ean13 //loadctx exec + % Split off the addon barcode ( ) search { /barcode exch def @@ -1093,6 +4290,7 @@ begin pad 12 checksum 48 add put % Put ascii for checksum at end of pad /barcode pad def +{ % Create an array containing the character mappings /encs [ (3211) (2221) (2122) (1411) (1132) @@ -1108,10 +4306,11 @@ begin [ (000000) (001011) (001101) (001110) (010011) (011001) (011100) (010101) (010110) (011010) ] def +} ctxdef /sbs 59 string def /txt 13 array def - + % Put the start character sbs 0 encs 10 get putinterval @@ -1191,8 +4390,8 @@ begin /bbs [bbs aload pop addcode (bbs) get {.075 add} forall] def /txt [txt aload pop addcode (txt) get aload pop] def /guardrightypos height 72 mul 6 sub def - } if - + } if + % Return the arguments << /ren //renlinear @@ -1208,9 +4407,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /ean13 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -1219,15 +4422,17 @@ end % --END ENCODER ean13-- % --BEGIN ENCODER ean8-- -% --REQUIRES preamble raiseerror renlinear ean5 ean2-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear ean5 ean2-- % --DESC: EAN-8 % --EXAM: 02345673 % --EXOP: includetext guardwhitespace % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp ean8 0.0 2017040400 91447 87627 -%%BeginData: 196 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp ean8 0.0 2022082100 84180 83888 +%%BeginData: 207 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /ean2 dup /uk.co.terryburton.bwipp findresource put @@ -1240,9 +4445,10 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text - /textfont /NimbusSanL-Regu def + /textfont /Helvetica def /textsize 12 def /textxoffset 4 def /textyoffset -4 def @@ -1252,7 +4458,7 @@ begin /addontextsize (unset) def /addontextxoffset (unset) def /addontextyoffset (unset) def - + % Parse the input options, either a string or a dict options type /stringtype eq { 1 dict begin @@ -1263,7 +4469,7 @@ begin currentdict end /options exch def } if options {def} forall - + /textfont textfont cvlit def /textsize textsize cvr def /textxoffset textxoffset cvr def @@ -1275,6 +4481,8 @@ begin addontextxoffset (unset) ne {/addontextxoffset addontextxoffset cvr def} if addontextyoffset (unset) ne {/addontextyoffset addontextyoffset cvr def} if + /ean8 //loadctx exec + % Split off the addon barcode ( ) search { /barcode exch def @@ -1319,8 +4527,9 @@ begin pad 0 barcode putinterval % Add barcode to the start of the pad pad 7 checksum 48 add put % Put ascii for checksum at end of pad /barcode pad def - + % Create an array containing the character mappings +{ /encs [ (3211) (2221) (2122) (1411) (1132) (1231) (1114) (1312) (1213) (3112) @@ -1329,10 +4538,11 @@ begin % Create a string of the available characters /barchars (0123456789) def +} ctxdef /sbs 43 string def /txt 8 array def - + % Put the start character sbs 0 encs 10 get putinterval @@ -1398,7 +4608,7 @@ begin /bbs [bbs aload pop addcode (bbs) get {.075 add} forall] def /txt [txt aload pop addcode (txt) get aload pop] def /guardrightypos height 72 mul 6 sub def - } if + } if % Return the arguments << @@ -1416,9 +4626,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /ean8 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -1427,15 +4641,17 @@ end % --END ENCODER ean8-- % --BEGIN ENCODER upca-- -% --REQUIRES preamble raiseerror renlinear ean5 ean2-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear ean5 ean2-- % --DESC: UPC-A % --EXAM: 416000336108 % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp upca 0.0 2017040400 100538 100055 -%%BeginData: 248 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp upca 0.0 2022082100 92023 91540 +%%BeginData: 259 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /ean2 dup /uk.co.terryburton.bwipp findresource put @@ -1448,13 +4664,14 @@ begin /options exch def /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text - /textfont /NimbusSanL-Regu def + /textfont /Helvetica def /textsize 12 def /textxoffset -7 def /textyoffset -4 def - /height 1 def + /height 1 def /addongap 12 def /addontextfont (unset) def /addontextsize (unset) def @@ -1470,7 +4687,7 @@ begin } loop currentdict end /options exch def } if - options {def} forall + options {def} forall /textfont textfont cvlit def /textsize textsize cvr def @@ -1483,6 +4700,8 @@ begin addontextxoffset (unset) ne {/addontextxoffset addontextxoffset cvr def} if addontextyoffset (unset) ne {/addontextyoffset addontextyoffset cvr def} if + /upca //loadctx exec + % Split off the addon barcode ( ) search { /barcode exch def @@ -1550,7 +4769,7 @@ begin addon length 0 ne addon length 2 ne and addon length 5 ne and { /bwipp.upcAbadAddOnLength (Add-on for UPC-A must be 2 or 5 digits) //raiseerror exec } if - + % Add checksum digit to barcode /pad 12 string def % Create pad one bigger than barcode /checksum 0 def @@ -1574,6 +4793,7 @@ begin /barcode pad def % Create an array containing the character mappings +{ /encs [ (3211) (2221) (2122) (1411) (1132) (1231) (1114) (1312) (1213) (3112) @@ -1582,6 +4802,7 @@ begin % Create a string of the available characters /barchars (0123456789) def +} ctxdef /sbs 59 string def /txt 12 array def @@ -1659,7 +4880,7 @@ begin /bbs [bbs aload pop addcode (bbs) get {.075 add} forall] def /txt [txt aload pop addcode (txt) get aload pop] def /guardrightypos height 72 mul 6 sub def - } if + } if % Return the arguments << @@ -1676,9 +4897,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /upca dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -1687,15 +4912,17 @@ end % --END ENCODER upca-- % --BEGIN ENCODER upce-- -% --REQUIRES preamble raiseerror renlinear ean5 ean2-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear ean5 ean2-- % --DESC: UPC-E % --EXAM: 00123457 % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp upce 0.0 2017040400 106367 105719 -%%BeginData: 287 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp upce 0.0 2022082100 96548 96108 +%%BeginData: 298 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /ean2 dup /uk.co.terryburton.bwipp findresource put @@ -1708,9 +4935,10 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text - /textfont /NimbusSanL-Regu def + /textfont /Helvetica def /textsize 12 def /textxoffset -7 def /textyoffset -4 def @@ -1720,7 +4948,7 @@ begin /addontextsize (unset) def /addontextxoffset (unset) def /addontextyoffset (unset) def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -1731,7 +4959,7 @@ begin currentdict end /options exch def } if options {def} forall - + /textfont textfont cvlit def /textsize textsize cvr def /textxoffset textxoffset cvr def @@ -1743,6 +4971,8 @@ begin addontextxoffset (unset) ne {/addontextxoffset addontextxoffset cvr def} if addontextyoffset (unset) ne {/addontextyoffset addontextyoffset cvr def} if + /upce //loadctx exec + % Split off the addon barcode ( ) search { /barcode exch def @@ -1812,6 +5042,7 @@ begin /bwipp.upcEbadNumberSystem (UPC-E must have number system 0 or 1) //raiseerror exec } if +{ % Create an array containing the character mappings /encs [ (3211) (2221) (2122) (1411) (1132) @@ -1826,6 +5057,7 @@ begin [ (000111) (001011) (001101) (001110) (010011) (011001) (011100) (010101) (010110) (011010) ] def +} ctxdef % Derive the equivalent UPC-A for its checksum 1 { % Common exit @@ -1909,7 +5141,7 @@ begin length /indx exch def % indx is the length of pre pop pop % Discard seek and post /enc encs indx get def % Get the indxth encoding - mirrormap i 1 sub get 49 eq { % Reverse enc if 1 in this position in mirrormap + mirrormap i 1 sub get 49 eq { % Reverse enc if 1 in this position in mirrormap /enclen enc length def /revenc enclen string def 0 1 enclen 1 sub { @@ -1975,9 +5207,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /upce dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -1986,15 +5222,15 @@ end % --END ENCODER upce-- % --BEGIN ENCODER isbn-- -% --REQUIRES preamble raiseerror renlinear ean5 ean2 ean13-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear ean5 ean2 ean13-- % --DESC: ISBN -% --EXAM: 978-1-56581-231-4 52250 +% --EXAM: 978-1-56581-231-4 90000 % --EXOP: includetext guardwhitespace % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp isbn 0.0 2017040400 104057 106666 -%%BeginData: 252 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp isbn 0.0 2022082100 95230 94623 +%%BeginData: 255 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /ean13 dup /uk.co.terryburton.bwipp findresource put @@ -2006,16 +5242,17 @@ begin /options exch def % We are given an options string /barcode exch def % We are given the isbn text with dashes + /ctx null def /dontdraw false def /includetext false def % Enable/disable ISBN text - /isbntextfont /NimbusMonL-Regu def + /isbntextfont /Courier def /isbntextsize 9 def /isbntextxoffset (unset) def /isbntextyoffset (unset) def /height 1 def - /addongap 12 def + /addongap 12 def /legacy false def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -2026,7 +5263,7 @@ begin currentdict end /options exch def } if options {def} forall - + /isbntextfont isbntextfont cvlit def /isbntextsize isbntextsize cvr def isbntextxoffset (unset) ne {/isbntextxoffset isbntextxoffset cvr def} if @@ -2194,7 +5431,7 @@ begin % Convert ISBN digits to EAN-13 /barcode 12 string def - isbn length 9 eq { + isbn length 9 eq { barcode 0 (978) putinterval barcode 3 isbn putinterval } { @@ -2203,7 +5440,7 @@ begin % Append the addon addon () ne { - 12 addon length add 1 add string + 12 addon length add 1 add string dup 0 barcode putinterval dup 12 ( ) putinterval dup 13 addon putinterval @@ -2212,7 +5449,7 @@ begin % Get the result of encoding with ean13 options (dontdraw) true put - options (addongap) addongap put + options (addongap) addongap put /args barcode options //ean13 exec def % Add the ISBN text @@ -2240,8 +5477,10 @@ begin dontdraw not //renlinear if end - -} bind def + +} +[/barcode] {null def} forall +bind def /isbn dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -2250,15 +5489,15 @@ end % --END ENCODER isbn-- % --BEGIN ENCODER ismn-- -% --REQUIRES preamble raiseerror renlinear ean5 ean2 ean13-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear ean5 ean2 ean13-- % --DESC: ISMN % --EXAM: 979-0-2605-3211-3 % --EXOP: includetext guardwhitespace % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp ismn 0.0 2017040400 99901 102499 -%%BeginData: 231 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp ismn 0.0 2022082100 91802 91288 +%%BeginData: 234 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /ean13 dup /uk.co.terryburton.bwipp findresource put @@ -2270,14 +5509,15 @@ begin /options exch def % We are given an options string /barcode exch def % We are given the ismn text with dashes + /ctx null def /dontdraw false def /includetext false def % Enable/disable ISMN text - /ismntextfont /NimbusMonL-Regu def + /ismntextfont /Courier def /ismntextsize 9 def /ismntextxoffset (unset) def /ismntextyoffset (unset) def /height 1 def - /addongap 12 def + /addongap 12 def /legacy false def % Parse the input options @@ -2290,14 +5530,14 @@ begin currentdict end /options exch def } if options {def} forall - + /ismntextfont ismntextfont cvlit def /ismntextsize ismntextsize cvr def ismntextxoffset (unset) ne {/ismntextxoffset ismntextxoffset cvr def} if ismntextyoffset (unset) ne {/ismntextyoffset ismntextyoffset cvr def} if /height height cvr def /addongap addongap cvr def - + % Split off the addon barcode ( ) search { /barcode exch def @@ -2442,11 +5682,11 @@ begin /ismntxt pad def % Convert ISMN digits to EAN-13 - /barcode ismn 0 12 getinterval def + /barcode ismn 0 12 getinterval def % Append the addon addon () ne { - 12 addon length add 1 add string + 12 addon length add 1 add string dup 0 barcode putinterval dup 12 ( ) putinterval dup 13 addon putinterval @@ -2455,7 +5695,7 @@ begin % Get the result of encoding with ean13 options (dontdraw) true put - options (addongap) addongap put + options (addongap) addongap put /args barcode options //ean13 exec def % Add the ISMN text @@ -2483,8 +5723,10 @@ begin dontdraw not //renlinear if end - -} bind def + +} +[/barcode] {null def} forall +bind def /ismn dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -2493,15 +5735,15 @@ end % --END ENCODER ismn-- % --BEGIN ENCODER issn-- -% --REQUIRES preamble raiseerror renlinear ean2 ean5 ean13-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear ean2 ean5 ean13-- % --DESC: ISSN % --EXAM: 0311-175X 00 17 % --EXOP: includetext guardwhitespace % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp issn 0.0 2017040400 89213 88719 -%%BeginData: 176 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp issn 0.0 2022082100 83234 82612 +%%BeginData: 179 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /ean13 dup /uk.co.terryburton.bwipp findresource put @@ -2513,14 +5755,15 @@ begin /options exch def % We are given an options string /issntxt exch def % We are given the issn text with dashes + /ctx null def /dontdraw false def /includetext false def % Enable/disable ISSN text - /issntextfont /NimbusMonL-Regu def + /issntextfont /Courier def /issntextsize 9 def /issntextxoffset (unset) def /issntextyoffset (unset) def /height 1 def - /addongap 12 def + /addongap 12 def % Parse the input options options type /stringtype eq { @@ -2532,7 +5775,7 @@ begin currentdict end /options exch def } if options {def} forall - + /issntextfont issntextfont cvlit def /issntextsize issntextsize cvr def issntextxoffset (unset) ne {/issntextxoffset issntextxoffset cvr def} if @@ -2626,7 +5869,7 @@ begin /issntxt pad def % Convert ISSN digits to EAN-13 - /barcode issn 0 7 getinterval def + /barcode issn 0 7 getinterval def % Append the sequence variant /barcode 12 string def @@ -2636,7 +5879,7 @@ begin % Append the addon addon () ne { - 12 addon length add 1 add string + 12 addon length add 1 add string dup 0 barcode putinterval dup 12 ( ) putinterval dup 13 addon putinterval @@ -2645,7 +5888,7 @@ begin % Get the result of encoding with ean13 options (dontdraw) true put - options (addongap) addongap put + options (addongap) addongap put /args barcode options //ean13 exec def % Add the ISSN text @@ -2672,7 +5915,9 @@ begin end -} bind def +} +[/barcode] {null def} forall +bind def /issn dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -2680,17 +5925,115 @@ end %%EndResource % --END ENCODER issn-- +% --BEGIN ENCODER mands-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear ean2 ean5 ean8-- +% --DESC: Marks & Spencer +% --EXAM: 0642118 +% --EXOP: includetext +% --RNDR: renlinear +%%BeginResource: uk.co.terryburton.bwipp mands 0.0 2022082100 71641 71714 +%%BeginData: 83 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +10 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renlinear dup /uk.co.terryburton.bwipp findresource put +dup /ean8 dup /uk.co.terryburton.bwipp findresource put +begin +/mands { + + 20 dict begin + + /options exch def + /barcode exch def + + /ctx null def + /dontdraw false def + /includetext 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 + + /barlen barcode length def + + % Validate the input + barlen 7 ne barlen 8 ne and { + /bwipp.MandSbadLength (M&S barcode must be 7 or 8 characters) //raiseerror exec + } if + + barlen 7 eq { + /barcode (00000000) 8 string copy dup 1 barcode putinterval def + } if + + % Get the result of encoding with ean8 + options (dontdraw) true put + /args barcode options //ean8 exec def + + % Remove the centre guard + args (bbs) get dup + dup 2 get 10 exch put + dup 2 get 11 exch put + args (bhs) get dup + dup 2 get 10 exch put + dup 2 get 11 exch put + + % Fix up the text for 7-digit inputs + /txt args (txt) get def + barlen 7 eq { + 0 1 6 { + txt exch 2 copy + 1 add get 0 get 3 1 roll get + 0 get exch 0 exch putinterval + } for + txt 7 get 0 get 0 ( ) putinterval + } if + + % Add the M and S guards + 10 array dup 0 txt putinterval /txt exch def + txt 0 get dup length array copy txt exch 8 exch put + txt 0 get dup length array copy txt exch 9 exch put + txt 8 get 0 (M) put txt 8 get 1 -12 put + txt 9 get 0 (S) put txt 9 get 1 69 put + + args (txt) txt put + args (opt) options put + args + + dontdraw not //renlinear if + + end + +} +[/barcode] {null def} forall +bind def +/mands dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER mands-- + % --BEGIN ENCODER code128-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renlinear-- % --DESC: Code 128 % --EXAM: Count01234567! % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp code128 0.0 2017040400 143323 149453 -%%BeginData: 455 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp code128 0.0 2022082100 125925 128825 +%%BeginData: 438 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /parseinput dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin /code128 { @@ -2700,9 +6043,10 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textxoffset 0 def /textyoffset -7 def @@ -2729,40 +6073,37 @@ begin /textyoffset textyoffset cvr def /height height cvr def - % 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 + /code128 //loadctx exec % Special function characters - /sta -1 def /stb -2 def /stc -3 def - /swa -4 def /swb -5 def /swc -6 def - /fn1 -7 def /fn2 -8 def /fn3 -9 def +{ + /sta -1 def /stb -2 def /stc -3 def + /swa -4 def /swb -5 def /swc -6 def + /fn1 -7 def /fn2 -8 def /fn3 -9 def /fn4 -10 def /sft -11 def /stp -12 def /lka -13 def /lkc -14 def % CC-A/B and CC-C linkage +} ctxdef + + % Parse the input + /fncvals << + /parse parse + /parsefnc parsefnc + (FNC1) fn1 + (FNC1) fn1 + (FNC2) fn2 + (FNC3) fn3 +% (FNC4) fn4 Not user accessible as encoded automatically + (LNKA) lka + (LNKC) lkc + >> def + /msg barcode fncvals //parseinput exec def + /msglen msg length def % Character maps for each state +{ /charmaps [ % A B C A B C A B C - [ 32 32 (00) ] [ (!) (!) (01) ] [ (") (") (02) ] % 0-2 + [ 32 32 (00) ] [ (!) (!) (01) ] [ (") (") (02) ] % 0-2 [ (#) (#) (03) ] [ ($) ($) (04) ] [ (%) (%) (05) ] % 3-5 [ (&) (&) (06) ] [ (') (') (07) ] [ 40 40 (08) ] % 6-8 [ 41 41 (09) ] [ (*) (*) (10) ] [ (+) (+) (11) ] % 9-11 @@ -2798,8 +6139,8 @@ begin [ swc swc (99) ] [ swb fn4 swb ] [ fn4 swa swa ] % 99-101 [ fn1 fn1 fn1 ] [ sta sta sta ] [ stb stb stb ] % 102-104 [ stc stc stc ] [ stp stp stp ] % 105-106 - ] def - + ] def + % Invert charmaps to give character to value maps for each state /charvals [ 109 dict 109 dict 109 dict ] def 0 1 charmaps length 1 sub { @@ -2808,12 +6149,13 @@ begin 0 1 2 { /j exch def encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required - charvals j get exch i put + charvals j get exch i put } for } for /seta charvals 0 get def /setb charvals 1 get def /setc charvals 2 get def +} ctxdef % Include pseudo characters for GS1-128 Composite linkage identifiers seta lka seta swb get put seta lkc seta swc get put @@ -2823,10 +6165,10 @@ begin raw {/encoding (raw) def} if encoding (raw) eq { - /cws barlen array def + /cws barcode length array def /i 0 def /j 0 def { % loop - i barlen eq {exit} if + i barcode length eq {exit} if /cw barcode i 1 add 3 getinterval cvi def cws j cw put /i i 4 add def @@ -2836,40 +6178,13 @@ begin /text () def } if - encoding (auto) eq { - - /fncvals << - (FNC1) fn1 - (FNC2) fn2 - (FNC3) fn3 -% (FNC4) fn4 Not user accessible as encoded automatically - (LNKA) lka - (LNKC) lkc - >> def + encoding (auto) eq { - % Convert input into bytes accounting for FNC and LNK characters - /msg barlen array def - /text barlen string def - /i 0 def /j 0 def { - i barlen eq {exit} if - /char barcode i get def - text j char put - 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 - text j ( ) putinterval - /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 - /text text 0 j getinterval def + /text msglen string def + 0 1 msglen 1 sub { + /i exch def + text i msg i get dup 0 lt { pop 32 } if put + } for % Standard and extended ASCII runlength at position /numSA [ msglen {0} repeat 0 ] def @@ -2912,26 +6227,28 @@ begin p msglen ge {exit} if msg p get dup setc exch known not {pop exit} if - fn1 eq { + dup -1 le { % FNC1 in odd position of run like two digits - s 2 mod 0 eq {/s s 1 add def} {exit} ifelse - } if + fn1 eq s 2 mod 0 eq and {/s s 1 add def} {exit} ifelse + } { + pop + } ifelse /n n 1 add def /s s 1 add def /p p 1 add def } loop n s - } bind def + } def % Encoding for each alphabet /enca { seta exch get cws exch j exch put /j j 1 add def - } bind def + } def /encb { setb exch get cws exch j exch put /j j 1 add def - } bind def + } def /encc { dup type /arraytype ne { setc exch get @@ -2940,11 +6257,11 @@ begin } ifelse cws exch j exch put /j j 1 add def - } bind def + } def % Character exclusively in either alphabet A or B - /anotb {dup seta exch known exch setb exch known not and} bind def - /bnota {dup setb exch known exch seta exch known not and} bind def + /anotb {dup seta exch known exch setb exch known not and} def + /bnota {dup setb exch known exch seta exch known not and} def % Pre-compute relative position of next anotb and next bnota characters /nextanotb [ msg length {0} repeat 9999 ] def @@ -2964,9 +6281,9 @@ begin } for % Does a-only come before b-only after given position and vice versa - /abeforeb {dup nextanotb exch get exch nextbnota exch get lt} bind def - /bbeforea {dup nextbnota exch get exch nextanotb exch get lt} bind def - + /abeforeb {dup nextanotb exch get exch nextbnota exch get lt} def + /bbeforea {dup nextbnota exch get exch nextanotb exch get lt} def + /cws barcode length 2 mul 3 add array def % Select start character @@ -2988,25 +6305,25 @@ begin /cset (setc) def exit } if - 0 abeforeb { + 0 abeforeb { sta enca /cset (seta) def - exit - } if + exit + } if stb enca /cset (setb) def exit } loop % Main encoding loop - /i 0 def { + /i 0 def { i msglen eq {exit} if - + i numsscr /nums exch def /nchars exch def - + % Determine switches and shifts { % common exit - cset (seta) eq cset (setb) eq or nums 4 ge and + cset (seta) eq cset (setb) eq or nums 4 ge and msg i get fn1 ne and { nums 2 mod 0 eq { swc cset (seta) eq {enca} {encb} ifelse @@ -3020,9 +6337,9 @@ begin exit } ifelse } if - cset (setb) eq msg i get anotb and { + cset (setb) eq msg i get anotb and { i msglen 1 sub lt { - i 1 add bbeforea { + i 1 add bbeforea { sft encb msg i get enca /i i 1 add def @@ -3046,7 +6363,7 @@ begin /cset (setb) def exit } if - cset (setc) eq nums 2 lt and { + cset (setc) eq nums 2 lt and msg i get -1 gt and { i abeforeb { swa encc /cset (seta) def @@ -3056,7 +6373,7 @@ begin /cset (setb) def exit } if - + % No switches or latches so encode cset (seta) eq { msg i get enca @@ -3069,19 +6386,19 @@ begin exit } if cset (setc) eq { - msg i get fn1 eq { - fn1 encc + msg i get -1 le { + msg i get encc /i i 1 add def } { msg i 2 getinterval encc - /i i 2 add def + /i i 2 add def } ifelse exit } if - + exit } loop - + } loop /cws cws 0 j getinterval def } if % auto encoding @@ -3098,6 +6415,7 @@ begin cws j 1 add seta stp get put % Create an array containing the character mappings +{ /encs [ (212222) (222122) (222221) (121223) (121322) (131222) (122213) (122312) (132212) (221213) (221312) (231212) (112232) (122132) @@ -3116,6 +6434,7 @@ begin (411311) (113141) (114131) (311141) (411131) (211412) (211214) (211232) (2331112) ] def +} ctxdef % Derive space bar succession /sbs cws length 6 mul 1 add string def @@ -3137,9 +6456,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /code128 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -3148,16 +6471,18 @@ end % --END ENCODER code128-- % --BEGIN ENCODER gs1-128-- -% --REQUIRES preamble raiseerror renlinear code128-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear code128-- % --DESC: GS1-128 % --EXAM: (01)95012345678903(3103)000123 % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp gs1-128 0.0 2017040400 79997 83024 -%%BeginData: 158 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp gs1-128 0.0 2022082100 80068 76461 +%%BeginData: 114 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /parseinput dup /uk.co.terryburton.bwipp findresource put +dup /gs1process dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /code128 dup /uk.co.terryburton.bwipp findresource put begin @@ -3168,16 +6493,20 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textxoffset 0 def /textyoffset -7 def /height 0.5 def /linkagea false def /linkagec false def - + /parse false def + /dontlint false def + /lintreqs false def + % Parse the input options options type /stringtype eq { 1 dict begin @@ -3193,69 +6522,16 @@ begin /textsize textsize cvr def /textxoffset textxoffset cvr def /textyoffset textyoffset cvr def - /height height cvr def - - /text barcode def - - % Expand ordinals of the form ^NNN to ASCII - /expand { - /in exch def - /out in length string def - /j 0 def - in - { % loop - (^) search { - dup out exch j exch putinterval - length j add 1 add /j exch def - pop - dup 0 3 getinterval cvi out exch j 1 sub exch put - dup length 3 sub 3 exch getinterval - } { - dup out exch j exch putinterval - length j add /j exch def - out 0 j getinterval exit - } ifelse - } loop - } bind def + /height height cvr def - % Parse out AIs - /ais [] def - /vals [] def - barcode dup length 1 sub 1 exch getinterval - { % loop - dup () eq {exit} if - (\)) search pop - exch pop - exch (\() search { - exch pop exch 3 1 roll - } { - () 3 1 roll - } ifelse - [ ais aload pop counttomark 2 add index ] /ais exch def - [ vals aload pop counttomark 1 add index expand ] /vals exch def - pop pop - } loop - pop + /text barcode def - % Pre-defined fixed length data field AIs - % any AI whose prefix is not included in this table must be - % terminated with "FNC1", even if it's fixed length - /aifixed 23 dict def - [ - 0 1 4 {} for - ] { - (00) 2 string copy dup dup 1 5 -1 roll 48 add put aifixed 3 1 roll put - } forall - [ - 11 1 20 {} for - 23 - 31 1 36 {} for - 41 - ] { - 10 2 string cvrs dup aifixed 3 1 roll put - } forall + barcode /ai //gs1process exec + /fncs exch def + /vals exch def + /ais exch def - % Create the code128 data + % Create the code128 data /fnc1 -1 def /c128 [ fnc1 ] def 0 1 ais length 1 sub { @@ -3267,7 +6543,7 @@ begin dup c128 length ai [ exch {} forall ] putinterval dup c128 length ai length add val [ exch {} forall ] putinterval /c128 exch def - i ais length 1 sub ne aifixed ai 0 2 getinterval known not and { % Append FNC1 + i ais length 1 sub ne fncs i get and { % Append FNC1 c128 length 1 add array dup 0 c128 putinterval dup c128 length fnc1 put @@ -3295,6 +6571,7 @@ begin /barcode barcode 0 j getinterval def % Get the result of encoding with code128 + options (parse) undef options (height) height put options (dontdraw) true put options (parsefnc) true put @@ -3304,12 +6581,14 @@ begin args (textxalign) (center) put args (opt) options put args - + dontdraw not //renlinear if - + end -} bind def +} +[/barcode] {null def} forall +bind def /gs1-128 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -3318,15 +6597,15 @@ end % --END ENCODER gs1-128-- % --BEGIN ENCODER ean14-- -% --REQUIRES preamble raiseerror renlinear code128-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renlinear code128-- % --DESC: GS1-14 % --EXAM: (01) 0 46 01234 56789 3 % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp ean14 0.0 2017040400 71172 70768 -%%BeginData: 105 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp ean14 0.0 2022082100 72494 72450 +%%BeginData: 108 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /code128 dup /uk.co.terryburton.bwipp findresource put @@ -3338,9 +6617,10 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textxoffset 0 def /textyoffset -7 def @@ -3361,7 +6641,7 @@ begin /textsize textsize cvr def /textxoffset textxoffset cvr def /textyoffset textyoffset cvr def - /height height cvr def + /height height cvr def % Strip spaces from the given data /text barcode def @@ -3369,7 +6649,7 @@ begin {dup 32 ne {3 copy put pop 1 add} {pop} ifelse} forall 0 exch getinterval /barcode exch def /hasspace text length barcode length ne def - + % Validate the input barcode 0 4 getinterval (\(01\)) ne { /bwipp.ean14badAI (GS1-14 must begin with (01) application identifier) //raiseerror exec @@ -3388,7 +6668,7 @@ begin 0 1 12 { /i exch def /checksum checksum barcode i 4 add get 48 sub i 2 mod 0 eq {3 mul} if add def - } for + } for /checksum 10 checksum 10 mod sub 10 mod def barcode length 18 eq { barcode 17 get checksum 48 add ne { @@ -3421,12 +6701,14 @@ begin args (textxalign) (center) put args (opt) options put args - + dontdraw not //renlinear if - + end -} bind def +} +[/barcode] {null def} forall +bind def /ean14 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -3435,15 +6717,15 @@ end % --END ENCODER ean14-- % --BEGIN ENCODER sscc18-- -% --REQUIRES preamble raiseerror renlinear code128-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renlinear code128-- % --DESC: SSCC-18 % --EXAM: (00) 0 0614141 123456789 0 % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp sscc18 0.0 2017040400 71184 70775 -%%BeginData: 105 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp sscc18 0.0 2022082100 72506 72457 +%%BeginData: 108 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /code128 dup /uk.co.terryburton.bwipp findresource put @@ -3455,14 +6737,15 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textxoffset 0 def /textyoffset -7 def /height 1 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -3478,7 +6761,7 @@ begin /textsize textsize cvr def /textxoffset textxoffset cvr def /textyoffset textyoffset cvr def - /height height cvr def + /height height cvr def % Strip spaces from the given data /text barcode def @@ -3505,7 +6788,7 @@ begin 0 1 16 { /i exch def /checksum checksum barcode i 4 add get 48 sub i 2 mod 0 eq {3 mul} if add def - } for + } for /checksum 10 checksum 10 mod sub 10 mod def barcode length 22 eq { barcode 21 get checksum 48 add ne { @@ -3538,12 +6821,14 @@ begin args (textxalign) (center) put args (opt) options put args - + dontdraw not //renlinear if - + end -} bind def +} +[/barcode] {null def} forall +bind def /sscc18 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -3552,15 +6837,17 @@ end % --END ENCODER sscc18-- % --BEGIN ENCODER code39-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear-- % --DESC: Code 39 % --EXAM: THIS IS CODE 39 % --EXOP: includetext includecheck includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp code39 0.0 2017040400 75290 74970 -%%BeginData: 141 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp code39 0.0 2022082100 72416 68679 +%%BeginData: 154 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -3571,17 +6858,18 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includecheck false def /validatecheck false def /includetext false def /includecheckintext false def /hidestars false def - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textyoffset -7 def /height 1 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -3592,16 +6880,20 @@ begin 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 + /code39 //loadctx exec + % Create a string of the available characters +{ /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def /charvals 43 dict def 0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for +} ctxdef % Validate the input 0 1 barcode length 1 sub { @@ -3627,6 +6919,7 @@ begin } if % Create an array containing the character mappings +{ /encs [ (1113313111) (3113111131) (1133111131) (3133111111) (1113311131) (3113311111) (1133311111) (1113113131) (3113113111) (1133113111) @@ -3638,6 +6931,7 @@ begin (1331311111) (1311113131) (3311113111) (1331113111) (1313131111) (1313111311) (1311131311) (1113131311) (1311313111) ] def +} ctxdef /sbs barlen includecheck {3} {2} ifelse add 10 mul string def /txt barlen includecheck {3} {2} ifelse add array def @@ -3679,7 +6973,7 @@ begin txt barlen 1 add [() barlen 1 add 16 mul textyoffset textfont textsize] put } ifelse } ifelse - + % Return the arguments << /ren //renlinear @@ -3694,9 +6988,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /code39 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -3705,16 +7003,19 @@ end % --END ENCODER code39-- % --BEGIN ENCODER code39ext-- -% --REQUIRES preamble raiseerror renlinear code39-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renlinear code39-- % --DESC: Code 39 Extended % --EXAM: Code39 Ext! % --EXOP: includetext includecheck includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp code39ext 0.0 2017040400 71403 71123 -%%BeginData: 110 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp code39ext 0.0 2022082100 71249 70993 +%%BeginData: 109 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /parseinput dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /code39 dup /uk.co.terryburton.bwipp findresource put begin @@ -3725,6 +7026,7 @@ begin /options exch def % We are given an options string /barcode exch def % We are given the code39extended text + /ctx null def /dontdraw false def /includetext false def /parse false def @@ -3740,26 +7042,17 @@ begin } if options {def} forall + /code39ext //loadctx exec + % 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 + /fncvals << + /parse parse + /parseonly true + /parsefnc false + >> def + /barcode barcode fncvals //parseinput exec def + /barlen barcode length def + options (parse) undef % Validate the input barcode { @@ -3768,9 +7061,8 @@ begin } if } forall - /barlen barcode length def - % Extended alphabet to non-extended alphabet +{ /extencs [ (%U) ($A) ($B) ($C) ($D) ($E) ($F) ($G) ($H) ($I) ($J) ($K) ($L) ($M) ($N) ($O) ($P) ($Q) ($R) ($S) ($T) ($U) ($V) ($W) ($X) ($Y) ($Z) (%A) (%B) (%C) (%D) (%E) @@ -3781,6 +7073,7 @@ begin (%W) (+A) (+B) (+C) (+D) (+E) (+F) (+G) (+H) (+I) (+J) (+K) (+L) (+M) (+N) (+O) (+P) (+Q) (+R) (+S) (+T) (+U) (+V) (+W) (+X) (+Y) (+Z) (%P) (%Q) (%R) (%S) (%T) ] def +} ctxdef /newcode barlen 2 mul string def /newtext barlen 2 mul string def @@ -3816,9 +7109,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /code39ext dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -3827,15 +7124,15 @@ end % --END ENCODER code39ext-- % --BEGIN ENCODER code32-- -% --REQUIRES preamble raiseerror renlinear code39-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear code39-- % --DESC: Italian Pharmacode % --EXAM: 01234567 % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp code32 0.0 2017040400 68684 68425 -%%BeginData: 99 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp code32 0.0 2022082100 63967 67382 +%%BeginData: 102 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /code39 dup /uk.co.terryburton.bwipp findresource put @@ -3847,9 +7144,10 @@ begin /options exch def % We are given an options string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable code32 text - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textyoffset -7 def /textxoffset 0 def @@ -3900,7 +7198,7 @@ begin /text exch def % convert number from base10 to base32 - /val text cvi 32 barcode cvrs def + /val text cvi 32 6 string cvrs def /barcode 6 string def 0 1 5 {barcode exch 48 put} for barcode 6 val length sub val putinterval @@ -3929,7 +7227,9 @@ begin end -} bind def +} +[/barcode] {null def} forall +bind def /code32 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -3938,15 +7238,15 @@ end % --END ENCODER code32-- % --BEGIN ENCODER pzn-- -% --REQUIRES preamble raiseerror renlinear code39-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear code39-- % --DESC: Pharmazentralnummer (PZN) % --EXAM: 123456 % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp pzn 0.0 2017040400 68931 68597 -%%BeginData: 100 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp pzn 0.0 2022082100 64062 67298 +%%BeginData: 103 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /code39 dup /uk.co.terryburton.bwipp findresource put @@ -3954,19 +7254,20 @@ begin /pzn { 20 dict begin - + /options exch def % We are given an options string /barcode exch def % We are given a barcode string - + + /ctx null def /dontdraw false def /includetext false def % Enable/disable code32 text - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textyoffset -7 def /textxoffset 0 def /height 1 def /pzn8 false def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -3977,7 +7278,7 @@ begin currentdict end /options exch def } if options {def} forall - + /textfont textfont cvlit def /textsize textsize cvr def /textyoffset textyoffset cvr def @@ -4006,8 +7307,8 @@ begin 0 1 msglen 3 sub { /i exch def barcode i get 48 sub i pzn8 {1} {2} ifelse add mul - checksum add /checksum exch def - } for + checksum add /checksum exch def + } for /checksum checksum 11 mod def checksum 10 eq { /bwipp.pznBadInputSequence (Incorrect PZN input sequence provided) //raiseerror exec @@ -4018,30 +7319,32 @@ begin } if } if msglen string - dup 0 45 put + dup 0 45 put dup 1 barcode putinterval dup msglen 1 sub checksum 48 add put /msg exch def - + % Get the result of encoding with code39 options (dontdraw) true put /args msg options //code39 exec def - + % format HRI /text msglen 5 add string def text 0 (PZN - ) putinterval text 6 msg 1 msglen 1 sub getinterval putinterval - + args (txt) [ [text textxoffset textyoffset textfont textsize] ] put args (textxalign) (center) put args (opt) options put args - + dontdraw not //renlinear if - + end - -} bind def + +} +[/barcode] {null def} forall +bind def /pzn dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -4050,16 +7353,19 @@ end % --END ENCODER pzn-- % --BEGIN ENCODER code93-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renlinear-- % --DESC: Code 93 % --EXAM: THIS IS CODE 93 % --EXOP: includetext includecheck % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp code93 0.0 2017040400 73201 72985 -%%BeginData: 148 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp code93 0.0 2022082100 68234 71403 +%%BeginData: 144 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /parseinput dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin /code93 { @@ -4069,15 +7375,17 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includecheck false def % Enable/disable checkdigit /includetext false def % Enable/disable text - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textyoffset -7 def /height 1 def - /parsefnc false def - + /parse false def + /parsefnc false def + % Parse the input options options type /stringtype eq { 1 dict begin @@ -4088,12 +7396,15 @@ begin 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 - + + /code93 //loadctx exec + +{ /encs [ (131112) (111213) (111312) (111411) (121113) (121212) (121311) (111114) (131211) (141111) @@ -4110,35 +7421,19 @@ begin % Create a string of the available characters /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def - /barlen barcode length def + /sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def +} ctxdef % Special function characters - /sft1 -1 def /sft2 -2 def /sft3 -3 def /sft4 -4 def /fncvals << + /parse parse + /parsefnc parsefnc (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 + /msg barcode fncvals //parseinput exec def /msglen msg length def includecheck { @@ -4150,12 +7445,12 @@ begin % 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 { + msg i get dup 0 lt { 42 exch sub /indx exch def /char ( ) def } { @@ -4182,7 +7477,7 @@ begin sbs msglen 6 mul 18 add encs 48 get putinterval } { % Put the end character - sbs msglen 6 mul 6 add encs 48 get putinterval + sbs msglen 6 mul 6 add encs 48 get putinterval } ifelse % Return the arguments @@ -4199,9 +7494,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /code93 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -4210,16 +7509,19 @@ end % --END ENCODER code93-- % --BEGIN ENCODER code93ext-- -% --REQUIRES preamble raiseerror renlinear code93-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renlinear code93-- % --DESC: Code 93 Extended % --EXAM: Code93 Ext! % --EXOP: includetext includecheck % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp code93ext 0.0 2017040400 68324 71604 -%%BeginData: 114 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp code93ext 0.0 2022082100 71471 71350 +%%BeginData: 113 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /parseinput dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /code93 dup /uk.co.terryburton.bwipp findresource put begin @@ -4230,6 +7532,7 @@ begin /options exch def % We are given an options string /barcode exch def % We are given the code39extended text + /ctx null def /dontdraw false def /includetext false def /parse false def @@ -4245,37 +7548,27 @@ begin } 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 + /code93ext //loadctx exec + % Parse ordinals of the form ^NNN to ASCII + /fncvals << + /parse parse + /parseonly true + /parsefnc false + >> def + /barcode barcode fncvals //parseinput exec def /barlen barcode length def + options (parse) undef % Extended alphabet to non-extended alphabet +{ /extencs - [ (^SFT%U) (^SFT$A) (^SFT$B) (^SFT$C) (^SFT$D) (^SFT$E) (^SFT$F) (^SFT$G) + [ (^SFT%U) (^SFT$A) (^SFT$B) (^SFT$C) (^SFT$D) (^SFT$E) (^SFT$F) (^SFT$G) (^SFT$H) (^SFT$I) (^SFT$J) (^SFT$K) (^SFT$L) (^SFT$M) (^SFT$N) (^SFT$O) (^SFT$P) (^SFT$Q) (^SFT$R) (^SFT$S) (^SFT$T) (^SFT$U) (^SFT$V) (^SFT$W) (^SFT$X) (^SFT$Y) (^SFT$Z) (^SFT%A) (^SFT%B) (^SFT%C) (^SFT%D) (^SFT%E) - ( ) (^SFT/A) (^SFT/B) (^SFT/C) (^SFT/D) (^SFT/E) (^SFT/F) (^SFT/G) - (^SFT/H) (^SFT/I) (^SFT/J) (^SFT/K) (^SFT/L) (-) (.) (^SFT/O) + ( ) (^SFT/A) (^SFT/B) (^SFT/C) ($) (%) (^SFT/F) (^SFT/G) + (^SFT/H) (^SFT/I) (^SFT/J) (+) (^SFT/L) (-) (.) (/) (0) (1) (2) (3) (4) (5) (6) (7) (8) (9) (^SFT/Z) (^SFT%F) (^SFT%G) (^SFT%H) (^SFT%I) (^SFT%J) (^SFT%V) (A) (B) (C) (D) (E) (F) (G) @@ -4287,6 +7580,7 @@ begin (^SFT+P) (^SFT+Q) (^SFT+R) (^SFT+S) (^SFT+T) (^SFT+U) (^SFT+V) (^SFT+W) (^SFT+X) (^SFT+Y) (^SFT+Z) (^SFT%P) (^SFT%Q) (^SFT%R) (^SFT%S) (^SFT%T) ] def +} ctxdef /newcode barlen 6 mul string def /newtext barlen 6 mul string def @@ -4325,9 +7619,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /code93ext dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -4336,15 +7634,17 @@ end % --END ENCODER code93ext-- % --BEGIN ENCODER interleaved2of5-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear-- % --DESC: Interleaved 2 of 5 (ITF) % --EXAM: 2401234567 % --EXOP: height=0.5 includecheck includetext includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp interleaved2of5 0.0 2017040400 73301 73185 -%%BeginData: 150 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp interleaved2of5 0.0 2022082100 70795 67054 +%%BeginData: 162 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -4355,15 +7655,16 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includecheck false def % Enable/disable checkdigit /includetext false def % Enable/disable text /includecheckintext false def - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textyoffset -7 def /height 1 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -4374,19 +7675,21 @@ begin 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 + /interleaved2of5 //loadctx exec + % Validate the input barcode { dup 48 lt exch 57 gt or { /bwipp.interleaved2of5badCharacter (Interleaved 2 of 5 must contain only digits) //raiseerror exec } if } forall - + /barlen barcode length def % Length of the code % Prefix 0 to barcode if length is even and including checkdigit @@ -4420,6 +7723,7 @@ begin } if % Create an array containing the character mappings +{ /encs [ (11221) (21112) (12112) (22111) (11212) (21211) (12211) (11122) (21121) (12121) @@ -4428,6 +7732,8 @@ begin % Create a string of the available characters /barchars (0123456789) def +} ctxdef + /sbs barlen 5 mul 8 add string def /txt barlen array def @@ -4487,9 +7793,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /interleaved2of5 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -4498,15 +7808,15 @@ end % --END ENCODER interleaved2of5-- % --BEGIN ENCODER itf14-- -% --REQUIRES preamble raiseerror renlinear interleaved2of5-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear interleaved2of5-- % --DESC: ITF-14 % --EXAM: 0 46 01234 56789 3 % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp itf14 0.0 2017040400 68114 71278 -%%BeginData: 109 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp itf14 0.0 2022082100 66573 69883 +%%BeginData: 112 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /interleaved2of5 dup /uk.co.terryburton.bwipp findresource put @@ -4518,10 +7828,11 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def /includecheckintext true def - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textxoffset 0 def /textyoffset 3 def @@ -4530,7 +7841,7 @@ begin /borderwidth 4 def /borderleft 15 def /borderright 15 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -4546,7 +7857,7 @@ begin /textsize textsize cvr def /textxoffset textxoffset cvr def /textyoffset textyoffset cvr def - /height height cvr def + /height height cvr def /borderwidth borderwidth cvr def /borderleft borderleft cvr def /borderright borderright cvr def @@ -4605,12 +7916,14 @@ begin args (textxalign) (center) put args (opt) options put args - + dontdraw not //renlinear if - + end -} bind def +} +[/barcode] {null def} forall +bind def /itf14 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -4619,15 +7932,15 @@ end % --END ENCODER itf14-- % --BEGIN ENCODER identcode-- -% --REQUIRES preamble raiseerror renlinear interleaved2of5-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear interleaved2of5-- % --DESC: Deutsche Post Identcode % --EXAM: 563102430313 % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp identcode 0.0 2017040400 64217 67381 -%%BeginData: 91 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp identcode 0.0 2022082100 62988 66378 +%%BeginData: 94 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /interleaved2of5 dup /uk.co.terryburton.bwipp findresource put @@ -4639,14 +7952,15 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textxoffset 0 def /textyoffset -7 def /height 1 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -4662,7 +7976,7 @@ begin /textsize textsize cvr def /textxoffset textxoffset cvr def /textyoffset textyoffset cvr def - /height height cvr def + /height height cvr def % Validate the input barcode length 11 ne barcode length 12 ne and { @@ -4679,7 +7993,7 @@ begin 0 1 10 { /i exch def /checksum checksum barcode i get 48 sub i 2 mod 0 eq {4 mul} {9 mul} ifelse add def - } for + } for /checksum 10 checksum 10 mod sub 10 mod def barcode length 12 eq { barcode 11 get checksum 48 add ne { @@ -4708,12 +8022,14 @@ begin args (textxalign) (center) put args (opt) options put args - + dontdraw not //renlinear if - + end -} bind def +} +[/barcode] {null def} forall +bind def /identcode dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -4722,15 +8038,15 @@ end % --END ENCODER identcode-- % --BEGIN ENCODER leitcode-- -% --REQUIRES preamble raiseerror renlinear interleaved2of5-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear interleaved2of5-- % --DESC: Deutsche Post Leitcode % --EXAM: 21348075016401 % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp leitcode 0.0 2017040400 64209 67377 -%%BeginData: 91 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp leitcode 0.0 2022082100 62980 66374 +%%BeginData: 94 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /interleaved2of5 dup /uk.co.terryburton.bwipp findresource put @@ -4742,14 +8058,15 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textxoffset 0 def /textyoffset -7 def /height 1 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -4765,7 +8082,7 @@ begin /textsize textsize cvr def /textxoffset textxoffset cvr def /textyoffset textyoffset cvr def - /height height cvr def + /height height cvr def % Validate the input barcode length 13 ne barcode length 14 ne and { @@ -4782,7 +8099,7 @@ begin 0 1 12 { /i exch def /checksum checksum barcode i get 48 sub i 2 mod 0 eq {4 mul} {9 mul} ifelse add def - } for + } for /checksum 10 checksum 10 mod sub 10 mod def barcode length 14 eq { barcode 13 get checksum 48 add ne { @@ -4811,12 +8128,14 @@ begin args (textxalign) (center) put args (opt) options put args - + dontdraw not //renlinear if - + end -} bind def +} +[/barcode] {null def} forall +bind def /leitcode dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -4825,15 +8144,17 @@ end % --END ENCODER leitcode-- % --BEGIN ENCODER databaromni-- -% --REQUIRES preamble raiseerror renlinear renmatrix-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear renmatrix-- % --DESC: GS1 DataBar Omnidirectional % --EXAM: (01)24012345678905 % --EXOP: % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp databaromni 0.0 2017040400 131912 137574 -%%BeginData: 420 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp databaromni 0.0 2022082100 115183 110835 +%%BeginData: 436 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +20 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put @@ -4845,12 +8166,13 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /height 33 72 div def /linkage false def /format (omni) def /barxmult 33 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -4861,11 +8183,13 @@ begin currentdict end /options exch def } if options {def} forall - + format (truncated) eq {/height 13 72 div def} if /height height cvr def /barxmult barxmult cvi def + /databaromni //loadctx exec + % Validate the input barcode 0 4 getinterval (\(01\)) ne { /bwipp.databaromniBadAI (GS1 DataBar Omnidirectional must begin with (01) application identifier) //raiseerror exec @@ -4917,8 +8241,8 @@ begin 1 index idiv exch 1 add exch } loop exch pop exch pop - } bind def - + } def + /getRSSwidths { /oe exch def /el exch def @@ -4929,7 +8253,7 @@ begin /mask 0 def 0 1 el 2 sub { /bar exch def - /ew 1 def + /ew 1 def /mask mask 1 bar bitshift or def { /sval nm ew sub 1 sub el bar sub 2 sub ncr def oe mask 0 eq and nm ew sub el 2 mul sub bar 2 mul add -2 ge and { @@ -4949,20 +8273,20 @@ begin val 0 lt {exit} if /ew ew 1 add def /mask mask 1 bar bitshift not and def - } loop + } loop /val val sval add def /nm nm ew sub def - out bar ew put + out bar ew put } for out el 1 sub nm put out - } bind def - - /binval [ + } def + + /binval [ linkage {1} {0} ifelse barcode 4 13 getinterval {48 sub} forall ] def - + 0 1 12 { /i exch def binval i 1 add 2 copy get binval i get 4537077 mod 10 mul add put @@ -4983,12 +8307,13 @@ begin /left left 3 -1 roll 10 13 j sub exp cvi mul add def } ifelse } for - + /d1 left 1597 idiv def /d2 left 1597 mod def /d3 right 1597 idiv def /d4 right 1597 mod def +{ /tab164 [ 160 0 12 4 8 1 161 1 960 161 10 6 6 3 80 10 @@ -5003,6 +8328,7 @@ begin 1515 1036 9 6 6 3 48 10 1596 1516 11 4 8 1 81 1 ] def +} ctxdef /i 0 def { d1 tab164 i get le { @@ -5051,7 +8377,7 @@ begin } if /i i 8 add def } loop - + /d1wo d1 d1gs sub d1te idiv d1elo d1mwo 4 false getRSSwidths def /d1we d1 d1gs sub d1te mod d1ele d1mwe 4 true getRSSwidths def /d2wo d2 d2gs sub d2to mod d2elo d2mwo 4 true getRSSwidths def @@ -5074,14 +8400,14 @@ begin d2w 7 i 2 mul sub d2wo i get put d2w 6 i 2 mul sub d2we i get put } for - + /d3w 8 array def 0 1 3 { /i exch def d3w 7 i 2 mul sub d3wo i get put d3w 6 i 2 mul sub d3we i get put } for - + /d4w 8 array def 0 1 3 { /i exch def @@ -5095,7 +8421,8 @@ begin d3w {} forall d4w {} forall ] def - + +{ /checkweights [ 1 3 9 27 2 6 18 54 58 72 24 8 29 36 12 4 @@ -5108,13 +8435,14 @@ begin 3 1 9 1 1 2 7 4 1 1 2 5 6 1 1 2 3 8 1 1 1 5 7 1 1 1 3 9 1 1 ] def - +} ctxdef + /checksum 0 def 0 1 31 { /i exch def - /checksum checksum widths i get checkweights i get mul add def + /checksum checksum widths i get checkweights i get mul add def } for - /checksum checksum 79 mod def + /checksum checksum 79 mod def checksum 8 ge {/checksum checksum 1 add def} if checksum 72 ge {/checksum checksum 1 add def} if /checklt checkwidths checksum 9 idiv 5 mul 5 getinterval def @@ -5129,10 +8457,10 @@ begin format (omni) eq format (truncated) eq or { % linear /sbs [ - 1 d1w {} forall checklt {} forall d2w {} forall + 1 d1w {} forall checklt {} forall d2w {} forall d4w {} forall checkrt {} forall d3w {} forall 1 1 ] def - + << /ren //renlinear /sbs sbs @@ -5142,19 +8470,19 @@ begin /textxalign (center) /opt options >> - + dontdraw not //renlinear if } { % 2D - stacked or stackedomni /top [ 1 1 d1w {} forall checklt {} forall d2w {} forall 1 1 0 ] def - /bot [ 1 1 d4w {} forall checkrt {} forall d3w {} forall 1 1 0 ] def + /bot [ 1 1 d4w {} forall checkrt {} forall d3w {} forall 1 1 0 ] def 0 2 24 { /i exch def top i get {0} repeat top i 1 add get {1} repeat } for - 50 array astore /top exch def + 50 array astore /top exch def 0 2 24 { /i exch def bot i get {1} repeat @@ -5164,8 +8492,9 @@ begin % Stacked format (stacked) eq { - /sep [ 50 {0} repeat ] def - 4 1 45 { + /sep 50 array def + sep 0 0 put + 1 1 49 { /i exch def top i get bot i get eq { sep i 1 top i get sub put @@ -5173,6 +8502,8 @@ begin sep i 1 sep i 1 sub get sub put } ifelse } for + sep 0 [ 0 0 0 0 ] putinterval + sep 46 [ 0 0 0 0 ] putinterval /pixs [ 5 {top aload pop} repeat sep aload pop @@ -5180,7 +8511,7 @@ begin ] def /pixy pixs length 50 idiv def } if - + % Stacked omnidirectional format (stackedomni) eq { /sep1 [ top {1 exch sub} forall ] def @@ -5230,7 +8561,7 @@ begin ] def /pixy pixs length 50 idiv def } if - + % Return the arguments << /ren //renmatrix @@ -5241,14 +8572,18 @@ begin /width 50 72 div /opt options >> - + dontdraw not //renmatrix if - + } ifelse - + + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /databaromni dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -5257,15 +8592,15 @@ end % --END ENCODER databaromni-- % --BEGIN ENCODER databarstacked-- -% --REQUIRES preamble raiseerror renlinear renmatrix databaromni-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear renmatrix databaromni-- % --DESC: GS1 DataBar Stacked % --EXAM: (01)24012345678905 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp databarstacked 0.0 2017040400 71113 67516 -%%BeginData: 73 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp databarstacked 0.0 2022082100 67310 63705 +%%BeginData: 76 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put dup /databaromni dup /uk.co.terryburton.bwipp findresource put @@ -5277,6 +8612,7 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def % Parse the input options @@ -5328,12 +8664,14 @@ begin args (opt) options put args - + dontdraw not //renmatrix if end -} bind def +} +[/barcode] {null def} forall +bind def /databarstacked dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -5342,15 +8680,15 @@ end % --END ENCODER databarstacked-- % --BEGIN ENCODER databarstackedomni-- -% --REQUIRES preamble raiseerror renlinear renmatrix databaromni-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear renmatrix databaromni-- % --DESC: GS1 DataBar Stacked Omnidirectional % --EXAM: (01)24012345678905 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp databarstackedomni 0.0 2017040400 71213 67596 -%%BeginData: 73 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp databarstackedomni 0.0 2022082100 67410 63785 +%%BeginData: 76 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put dup /databaromni dup /uk.co.terryburton.bwipp findresource put @@ -5362,6 +8700,7 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def % Parse the input options @@ -5413,12 +8752,14 @@ begin args (opt) options put args - + dontdraw not //renmatrix if end -} bind def +} +[/barcode] {null def} forall +bind def /databarstackedomni dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -5427,15 +8768,15 @@ end % --END ENCODER databarstackedomni-- % --BEGIN ENCODER databartruncated-- -% --REQUIRES preamble raiseerror renlinear renmatrix databaromni-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear renmatrix databaromni-- % --DESC: GS1 DataBar Truncated % --EXAM: (01)24012345678905 % --EXOP: % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp databartruncated 0.0 2017040400 71139 67532 -%%BeginData: 73 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp databartruncated 0.0 2022082100 67336 63721 +%%BeginData: 76 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /databaromni dup /uk.co.terryburton.bwipp findresource put @@ -5447,6 +8788,7 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def % Parse the input options @@ -5498,12 +8840,14 @@ begin args (opt) options put args - + dontdraw not //renlinear if end -} bind def +} +[/barcode] {null def} forall +bind def /databartruncated dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -5512,15 +8856,17 @@ end % --END ENCODER databartruncated-- % --BEGIN ENCODER databarlimited-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear-- % --DESC: GS1 DataBar Limited % --EXAM: (01)15012345678907 % --EXOP: % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp databarlimited 0.0 2017040400 96545 95706 -%%BeginData: 276 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp databarlimited 0.0 2022082100 90886 86535 +%%BeginData: 291 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +20 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -5531,6 +8877,7 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /height 10 72 div def /linkage false def @@ -5545,9 +8892,11 @@ begin currentdict end /options exch def } if options {def} forall - + /height height cvr def + /databarlimited //loadctx exec + % Validate the input barcode 0 4 getinterval (\(01\)) ne { /bwipp.databarlimitedBadAI (GS1 DataBar Limited must begin with (01) application identifier) //raiseerror exec @@ -5573,7 +8922,7 @@ begin /checksum 10 checksum 10 mod sub 10 mod def barcode length 18 eq { barcode 17 get checksum 48 add ne { - /bwipp.databaromniBadCheckDigit (Incorrect GS1 DataBar Limited check digit provided) //raiseerror exec + /bwipp.databarlimitedBadCheckDigit (Incorrect GS1 DataBar Limited check digit provided) //raiseerror exec } if } if 18 string @@ -5582,16 +8931,18 @@ begin /barcode exch def % Strip the AI and optional check digit - /binval [ +{ + /linkval [ 2 0 1 5 1 3 3 5 3 1 0 9 6 ] def +} ctxdef + /binval [ barcode 4 13 getinterval {48 sub} forall ] def linkage { - /linkval [ 2 0 1 5 1 3 3 5 3 1 0 9 6 ] def 0 1 binval length 1 sub { /i exch def binval i binval i get linkval i get add put } for - } if + } if % Create the human readable text /txt barcode length array def @@ -5614,8 +8965,8 @@ begin 1 index idiv exch 1 add exch } loop exch pop exch pop - } bind def - + } def + /getRSSwidths { /oe exch def /el exch def @@ -5626,7 +8977,7 @@ begin /mask 0 def 0 1 el 2 sub { /bar exch def - /ew 1 def + /ew 1 def /mask mask 1 bar bitshift or def { /sval nm ew sub 1 sub el bar sub 2 sub ncr def oe mask 0 eq and nm ew sub el 2 mul sub bar 2 mul add -2 ge and { @@ -5646,15 +8997,15 @@ begin val 0 lt {exit} if /ew ew 1 add def /mask mask 1 bar bitshift not and def - } loop + } loop /val val sval add def /nm nm ew sub def - out bar ew put + out bar ew put } for out el 1 sub nm put out - } bind def - + } def + 0 1 11 { /i exch def binval i 1 add 2 copy get binval i get 2013571 mod 10 mul add put @@ -5675,7 +9026,8 @@ begin /d1 d1 3 -1 roll 10 12 j sub exp cvi mul add def } ifelse } for - + +{ /tab267 [ 183063 0 17 9 6 3 6538 28 820063 183064 13 13 5 4 875 728 @@ -5685,6 +9037,7 @@ begin 1996938 1979845 19 7 8 1 17094 1 2013570 1996939 7 19 1 8 1 16632 ] def +} ctxdef /i 0 def { d1 tab267 i get le { @@ -5710,9 +9063,9 @@ begin /i i 8 add def } loop - /d1wo d1 d1gs sub d1te idiv d1elo d1mwo 7 false getRSSwidths def + /d1wo d1 d1gs sub d1te idiv d1elo d1mwo 7 false getRSSwidths def /d1we d1 d1gs sub d1te mod d1ele d1mwe 7 true getRSSwidths def - /d2wo d2 d2gs sub d2te idiv d2elo d2mwo 7 false getRSSwidths def + /d2wo d2 d2gs sub d2te idiv d2elo d2mwo 7 false getRSSwidths def /d2we d2 d2gs sub d2te mod d2ele d2mwe 7 true getRSSwidths def /d1w 14 array def @@ -5733,7 +9086,8 @@ begin d1w {} forall d2w {} forall ] def - + +{ /checkweights [ 1 3 9 27 81 65 17 51 64 14 42 37 22 66 20 60 2 6 18 54 73 41 34 13 39 28 84 74 @@ -5754,7 +9108,8 @@ begin 322 323 326 337 ] def - +} ctxdef + /checksum 0 def 0 1 27 { /i exch def @@ -5771,11 +9126,11 @@ begin checkwidths i 2 mul swidths i get put checkwidths i 2 mul 1 add bwidths i get put } for - + /sbs [ - 1 d1w {} forall checkwidths {} forall d2w {} forall 1 1 + 1 d1w {} forall checkwidths {} forall d2w {} forall 1 1 5 ] def - + % Return the arguments << /ren //renlinear @@ -5789,9 +9144,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /databarlimited dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -5800,16 +9159,19 @@ end % --END ENCODER databarlimited-- % --BEGIN ENCODER databarexpanded-- -% --REQUIRES preamble raiseerror renlinear renmatrix-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix-- % --DESC: GS1 DataBar Expanded % --EXAM: (01)95012345678903(3103)000123 % --EXOP: % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp databarexpanded 0.0 2017040400 245708 247229 -%%BeginData: 880 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp databarexpanded 0.0 2022082100 246206 245007 +%%BeginData: 863 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /gs1process dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put begin @@ -5820,13 +9182,17 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def + /parse false def + /dontlint false def + /lintreqs true def /dontdraw false def /height 34 72 div def /format (expanded) def /segments -1 def - /linkage false def + /linkage false def /barxmult 34 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -5837,54 +9203,25 @@ begin currentdict end /options exch def } if options {def} forall - + /height height cvr def /segments segments cvi def /barxmult barxmult cvi def + /databarexpanded //loadctx exec + segments -1 eq { /segments format (expandedstacked) eq {4} {22} ifelse def - } if + } { + segments 2 lt segments 22 gt or segments 2 mod 0 ne or { + /bwipp.gs1databarexpandedBadSegments (The number of segments must be even from 2 to 22) //raiseerror exec + } if + } ifelse - % Expand ordinals of the form ^NNN to ASCII - /expand { - /in exch def - /out in length string def - /j 0 def - in - { % loop - (^) search { - dup out exch j exch putinterval - length j add 1 add /j exch def - pop - dup 0 3 getinterval cvi out exch j 1 sub exch put - dup length 3 sub 3 exch getinterval - } { - dup out exch j exch putinterval - length j add /j exch def - out 0 j getinterval exit - } ifelse - } loop - } bind def - - % Parse out AIs - /ais [] def - /vals [] def - barcode dup length 1 sub 1 exch getinterval - { % loop - dup () eq {exit} if - (\)) search pop - exch pop - exch (\() search { - exch pop exch 3 1 roll - } { - () 3 1 roll - } ifelse - [ ais aload pop counttomark 2 add index ] /ais exch def - [ vals aload pop counttomark 1 add index expand ] /vals exch def - pop pop - } loop - pop + barcode /ai //gs1process exec + /fncs exch def + /vals exch def + /ais exch def % Method selection { % common exit @@ -5897,7 +9234,7 @@ begin } if } if } if - + % (01)9...(3202)... ais length 2 eq { ais 0 get (01) eq ais 1 get (3202) eq and { @@ -5906,7 +9243,7 @@ begin } if } if } if - + % (01)9...(3203)... ais length 2 eq { ais 0 get (01) eq ais 1 get (3203) eq and { @@ -5915,7 +9252,7 @@ begin } if } if } if - + % (01)9...(310x/320x)...[(11/13/15/17)...] ais length dup 2 eq exch 3 eq or { /ai310x false 3100 1 3109 {10 4 string cvrs ais 1 get eq or} for def @@ -5929,7 +9266,8 @@ begin ais length 3 eq { vals 0 get 0 1 getinterval (9) eq vals 1 get cvi 99999 le and - vals 2 cvi 999999 le and { + vals 2 get 2 2 getinterval cvi dup 1 ge exch 12 le and and % Month 1-12 + vals 2 get 4 2 getinterval cvi dup 0 ge exch 31 le and and { % Day 0-31 ai310x ais 2 get (11) eq and { (0111000) false exit } if ai320x ais 2 get (11) eq and { (0111001) false exit } if ai310x ais 2 get (13) eq and { (0111010) false exit } if @@ -5948,7 +9286,7 @@ begin } ifelse } if } if - + % (01)9...(392x)... ais length 2 ge { /ai392x false 3920 1 3923 {10 4 string cvrs ais 1 get eq or} for def @@ -5956,7 +9294,7 @@ begin vals 0 get 0 1 getinterval (9) eq { (01100) true exit } if } if } if - + % (01)9...(393x)... ais length 2 ge { /ai393x false 3930 1 3933 {10 4 string cvrs ais 1 get eq or} for def @@ -5964,17 +9302,17 @@ begin vals 0 get 0 1 getinterval (9) eq { (01101) true exit } if } if } if - + % (01)... ais 0 get (01) eq { (1) true exit } if - + % Freeform (00) true exit - + } loop /gpfallow exch def /method exch def - + /conv12to40 { (0000000000000000000000000000000000000000) 40 string copy 2 copy 0 10 getinterval exch 0 3 getinterval cvi 2 10 string cvrs dup length 10 exch sub exch putinterval @@ -5982,32 +9320,35 @@ begin 2 copy 20 10 getinterval exch 6 3 getinterval cvi 2 10 string cvrs dup length 10 exch sub exch putinterval 2 copy 30 10 getinterval exch 9 3 getinterval cvi 2 10 string cvrs dup length 10 exch sub exch putinterval exch pop - } bind def - + } def + /conv13to44 { (00000000000000000000000000000000000000000000) 44 string copy 2 copy 0 4 getinterval exch 0 1 getinterval cvi 2 4 string cvrs dup length 4 exch sub exch putinterval dup 3 -1 roll 1 12 getinterval conv12to40 4 exch putinterval - } bind def - + } def + /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 - + dup 3 -1 roll 2 2 index length string cvrs dup length 2 index length exch sub exch putinterval + } def + + /fnc1 -1 def /lnumeric -2 def /lalphanumeric -3 def /liso646 -4 def + method (00) eq { /cdf [] def /gpf [] def } if - + method (1) eq { /cdf vals 0 get 0 13 getinterval conv13to44 def /cdf [ cdf {48 sub} forall ] def /gpf [] def /ais ais 1 ais length 1 sub getinterval def /vals vals 1 vals length 1 sub getinterval def + /fncs fncs 1 fncs length 1 sub getinterval def } if - + method (0100) eq { /cdf 55 string def cdf 0 vals 0 get 1 12 getinterval conv12to40 putinterval @@ -6016,8 +9357,9 @@ begin /gpf [] def /ais [] def /vals [] def + /fncs [] def } if - + method (0101) eq { /cdf 55 string def cdf 0 vals 0 get 1 12 getinterval conv12to40 putinterval @@ -6031,8 +9373,9 @@ begin /gpf [] def /ais [] def /vals [] def + /fncs [] def } if - + method length 7 eq { /cdf 76 string def cdf 0 vals 0 get 1 12 getinterval conv12to40 putinterval @@ -6052,29 +9395,32 @@ begin /gpf [] def /ais [] def /vals [] def + /fncs [] def } if - + method (01100) eq { /cdf 42 string def cdf 0 vals 0 get 1 12 getinterval conv12to40 putinterval cdf 40 ais 1 get 3 1 getinterval cvi 2 tobin putinterval /cdf [ cdf {48 sub} forall ] def - /gpf [ vals 1 get {} forall ] def + /gpf [ vals 1 get {} forall ais length 2 gt { fnc1 } if ] def /ais ais 2 ais length 2 sub getinterval def /vals vals 2 vals length 2 sub getinterval def + /fncs fncs 2 fncs length 2 sub getinterval def } if - + method (01101) eq { /cdf 52 string def cdf 0 vals 0 get 1 12 getinterval conv12to40 putinterval cdf 40 ais 1 get 3 1 getinterval cvi 2 tobin putinterval cdf 42 vals 1 get 0 3 getinterval cvi 10 tobin putinterval /cdf [ cdf {48 sub} forall ] def - /gpf [ vals 1 get dup length 3 sub 3 exch getinterval {} forall ] def + /gpf [ vals 1 get dup length 3 sub 3 exch getinterval {} forall ais length 2 gt { fnc1 } if ] def /ais ais 2 ais length 2 sub getinterval def /vals vals 2 vals length 2 sub getinterval def + /fncs fncs 2 fncs length 2 sub getinterval def } if - + % Variable length symbol field gpfallow { /vlf 2 array def @@ -6082,39 +9428,20 @@ begin /vlf [] def } ifelse - % Pre-defined fixed length data field AIs - % any AI whose prefix is not included in this table must be - % terminated with "FNC1", even if it's fixed length - /aifixed 23 dict def - [ - 0 1 4 {} for - ] { - (00) 2 string copy dup dup 1 5 -1 roll 48 add put aifixed 3 1 roll put - } forall - [ - 11 1 20 {} for - 23 - 31 1 36 {} for - 41 - ] { - 10 2 string cvrs dup aifixed 3 1 roll put - } forall - - /fnc1 -1 def /lnumeric -2 def /lalphanumeric -3 def /liso646 -4 def - +{ /numeric << 0 1 119 { dup (00) 2 string copy dup 3 -1 roll 11 2 string cvrs - dup length 2 exch sub exch putinterval - dup 0 get 65 eq {dup 0 94 put} if - dup 1 get 65 eq {dup 1 94 put} if + dup length 2 exch sub exch putinterval + dup 0 get 65 eq {dup 0 94 put} if + dup 1 get 65 eq {dup 1 94 put} if exch 8 add - (0000000) 7 string copy dup 3 -1 roll 2 7 string cvrs + (0000000) 7 string copy dup 3 -1 roll 2 7 string cvrs dup length 7 exch sub exch putinterval } for lalphanumeric (0000) >> def - + /alphanumeric << 48 1 57 {dup 43 sub 5 tobin} for fnc1 (01111) @@ -6124,7 +9451,7 @@ begin lnumeric (000) liso646 (00100) >> def - + /iso646 << 48 1 57 {dup 43 sub 5 tobin} for fnc1 (01111) @@ -6139,7 +9466,8 @@ begin lnumeric (000) lalphanumeric (00100) >> def - +} ctxdef + % Append the remaining AI data 0 1 ais length 1 sub { /i exch def @@ -6150,7 +9478,7 @@ begin dup gpf length ai [ exch {} forall ] putinterval dup gpf length ai length add val [ exch {} forall ] putinterval /gpf exch def - i ais length 1 sub ne aifixed ai 0 2 getinterval known not and { % Append FNC1 + i ais length 1 sub ne fncs i get and { % Append FNC1 gpf length 1 add array dup 0 gpf putinterval dup gpf length fnc1 put @@ -6161,24 +9489,24 @@ begin % Calculate the number of bits remaining to the next valid symbol size /rembits { dup - 12 div ceiling cvi 12 mul % Round up to multiple of 12 + 12 div ceiling cvi 12 mul % Round up to multiple of 12 48 2 copy lt {exch} if pop % At least 4 symbols dup 12 idiv dup segments mod 1 eq { % At least 2 symbols on last row of stacked symbol 1 add 12 mul exch pop } { pop - } ifelse + } ifelse exch sub - } bind def - + } def + /encode { dup /raw ne {exch get} {pop} ifelse [ exch {48 sub} forall ] dup length exch gpfenc exch j exch putinterval /j exch j add def - } bind def - + } def + % Pre-compute alphanumeric and numeric runlengths and position of next ISO646-only characters /numericruns [ gpf length {0} repeat 0 -1 ] def /alphanumericruns [ gpf length {0} repeat 0 ] def @@ -6187,7 +9515,7 @@ begin /i exch def gpf i get (00) 2 string copy - dup 0 gpf i get dup fnc1 eq {pop 94} if put + dup 0 gpf i get dup fnc1 eq {pop 94} if put i gpf length 1 sub lt {dup 1 gpf i 1 add get dup fnc1 eq {pop 94} if put} if numeric exch known { numericruns i numericruns i 2 add get 2 add put @@ -6205,17 +9533,17 @@ begin nextiso646only i nextiso646only i 1 add get 1 add put } ifelse } for - + % Encode the general purpose field /gpfenc 252 array def /i 0 def /j 0 def /mode (numeric) def { % loop i gpf length eq {exit} if { % not a loop but common exit point - + mode (numeric) eq { i gpf length 2 sub le { - 2 string + 2 string dup 0 gpf i get dup fnc1 eq {pop 94} if put dup 1 gpf i 1 add get dup fnc1 eq {pop 94} if put dup numeric exch known { @@ -6224,7 +9552,7 @@ begin exit } if pop - lalphanumeric numeric encode + lalphanumeric numeric encode /mode (alphanumeric) def exit } { @@ -6241,13 +9569,13 @@ begin /i i 1 add def exit } { % C1.FNC1 - 2 string dup 0 gpf i get put dup 1 94 put numeric encode + 2 string dup 0 gpf i get put dup 1 94 put numeric encode /i i 1 add def exit } ifelse } ifelse } if - + mode (alphanumeric) eq { gpf i get fnc1 eq { fnc1 alphanumeric encode @@ -6274,7 +9602,7 @@ begin /i i 1 add def exit } if - + mode (iso646) eq { gpf i get fnc1 eq { fnc1 iso646 encode @@ -6296,13 +9624,13 @@ begin /i i 1 add def exit } if - + } loop } loop /gpf gpfenc 0 j getinterval def % Complete the variable length field and create pad - 1 12 add method length add vlf length add cdf length add gpf length add + 1 12 add method length add vlf length add cdf length add gpf length add dup rembits dup array /pad exch def vlf length 0 ne { add 12 idiv @@ -6314,16 +9642,16 @@ begin pad length 0 gt { 0 5 pad length 1 sub { % Fill with 00100 /i exch def - pad i [ 0 0 1 0 0 ] 0 pad length i sub 5 2 copy gt {exch} if pop getinterval putinterval - } for + pad i [ 0 0 1 0 0 ] 0 pad length i sub 5 2 copy gt {exch} if pop getinterval putinterval + } for mode (numeric) eq { % Prefix shift from numeric to ASCII /pad [ 0 0 0 0 pad aload pop ] 0 pad length getinterval def } if } if - - % Concatinate fields + + % Concatenate fields /binval [ - linkage {1} {0} ifelse + linkage {1} {0} ifelse method {48 sub} forall vlf aload pop cdf aload pop @@ -6331,7 +9659,7 @@ begin pad aload pop ] def /datalen binval length 12 idiv def - + /ncr { % n r 2 copy sub 2 copy lt {exch} if % n r maxd mind 1 1 5 3 roll % mind j=1 v=1 n maxd @@ -6346,8 +9674,8 @@ begin 1 index idiv exch 1 add exch } loop exch pop exch pop - } bind def - + } def + /getRSSwidths { /oe exch def /el exch def @@ -6358,7 +9686,7 @@ begin /mask 0 def 0 1 el 2 sub { /bar exch def - /ew 1 def + /ew 1 def /mask mask 1 bar bitshift or def { /sval nm ew sub 1 sub el bar sub 2 sub ncr def oe mask 0 eq and nm ew sub el 2 mul sub bar 2 mul add -2 ge and { @@ -6378,15 +9706,16 @@ begin val 0 lt {exit} if /ew ew 1 add def /mask mask 1 bar bitshift not and def - } loop + } loop /val val sval add def /nm nm ew sub def - out bar ew put + out bar ew put } for out el 1 sub nm put out - } bind def + } def +{ /tab174 [ 347 0 12 5 7 2 87 4 1387 348 10 7 5 4 52 20 @@ -6394,9 +9723,10 @@ begin 3987 2948 6 11 3 6 10 104 4191 3988 4 13 1 8 1 204 ] def +} ctxdef /dxw datalen array def - + 0 1 datalen 1 sub { /x exch def @@ -6419,14 +9749,14 @@ begin /dwo d dgs sub dte idiv delo dmwo 4 true getRSSwidths def /dwe d dgs sub dte mod dele dmwe 4 false getRSSwidths def - /dw 8 array def - x 2 mod 0 eq { + /dw 8 array def + x 2 mod 0 eq { 0 1 3 { /j exch def dw 7 j 2 mul sub dwo j get put dw 6 j 2 mul sub dwe j get put } for - } { + } { 0 1 3 { /j exch def dw j 2 mul dwo j get put @@ -6437,7 +9767,8 @@ begin dxw x dw put } for - + +{ /finderwidths [ 1 8 4 1 1 1 1 4 8 1 3 6 4 1 1 1 1 4 6 3 @@ -6459,6 +9790,7 @@ begin [0 1 2 3 4 5 6 9 10 11] [0 1 2 3 4 7 6 9 8 11 10] ] def +} ctxdef /seq finderseq datalen 2 sub 2 idiv get def /fxw seq length array def @@ -6467,12 +9799,13 @@ begin fxw x finderwidths seq x get 5 mul 5 getinterval put } for +{ /checkweights [ -1 -1 -1 -1 -1 -1 -1 -1 % A1L 77 96 32 81 27 9 3 1 % A1R 20 60 180 118 143 7 21 63 % A2L 205 209 140 117 39 13 145 189 % A2R - 193 157 49 147 19 57 171 91 % B1L + 193 157 49 147 19 57 171 91 % B1L 132 44 85 169 197 136 186 62 % B1R 185 133 188 142 4 12 36 108 % B2L 50 87 29 80 97 173 128 113 % B2R @@ -6493,6 +9826,7 @@ begin 55 165 73 8 24 72 5 15 % F2L 89 100 174 58 160 194 135 45 % F2R ] def +} ctxdef /checkweightseq [ seq {16 mul checkweights exch 16 getinterval aload pop} forall @@ -6501,11 +9835,11 @@ begin /widths [ dxw {{} forall} forall ] def - + /checksum 0 def 0 1 widths length 1 sub { /i exch def - /checksum checksum widths i get checkweightseq i get mul add def + /checksum checksum widths i get checkweightseq i get mul add def } for /checksum checksum 211 mod datalen 3 sub 211 mul add def @@ -6524,7 +9858,7 @@ begin /cwo checksum cgs sub cte idiv celo cmwo 4 true getRSSwidths def /cwe checksum cgs sub cte mod cele cmwe 4 false getRSSwidths def - /cw 8 array def + /cw 8 array def 0 1 3 { /i exch def cw i 2 mul cwo i get put @@ -6547,7 +9881,7 @@ begin 0 1 segments 1 sub { /pos exch r segments mul add def pos datalen lt { - dxw pos get {} forall + dxw pos get {} forall pos 2 mod 0 eq {fxw pos 2 idiv get {} forall} if } if } for @@ -6570,6 +9904,8 @@ begin 1 1 ] def + options (parse) undef + << /ren //renlinear /sbs sbs @@ -6599,12 +9935,10 @@ begin % Derive the separator pattern /sep [ row {1 exch sub} forall ] def - sep 0 [ 0 0 0 0 ] putinterval - sep row length 4 sub [ 0 0 0 0 ] putinterval /finderpos [ % Finder pattern module positions 19 98 row length 13 sub {} for 68 98 row length 13 sub {} for - ] def + ] def finderpos { dup 14 add 1 exch { /i exch def @@ -6620,6 +9954,8 @@ begin sep exch i exch put } for } forall + sep 0 [ 0 0 0 0 ] putinterval + sep row length 4 sub [ 0 0 0 0 ] putinterval % For even segment-pair symbols reverse alternate rows segments 4 mod 0 eq r 2 mod 1 eq and { @@ -6643,9 +9979,9 @@ begin % Extend last row and separator to fill width of symbol /pixx rows 0 get length def [ pixx {0} repeat ] dup 0 rows numrows 1 sub get putinterval - rows exch numrows 1 sub exch put + rows exch numrows 1 sub exch put [ pixx {0} repeat ] dup 0 seps numrows 1 sub get putinterval - seps exch numrows 1 sub exch put + seps exch numrows 1 sub exch put % Middle separator pattern /sep [ pixx 2 idiv 1 add { 0 1 } repeat ] 0 pixx getinterval def @@ -6667,6 +10003,8 @@ begin } for ] def + options (parse) undef + << /ren //renmatrix /pixs pixs @@ -6681,9 +10019,13 @@ begin } ifelse + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /databarexpanded dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -6692,15 +10034,15 @@ end % --END ENCODER databarexpanded-- % --BEGIN ENCODER databarexpandedstacked-- -% --REQUIRES preamble raiseerror renlinear renmatrix databarexpanded-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix databarexpanded-- % --DESC: GS1 DataBar Expanded Stacked % --EXAM: (01)95012345678903(3103)000123 % --EXOP: segments=4 % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp databarexpandedstacked 0.0 2017040400 62326 62296 -%%BeginData: 43 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp databarexpandedstacked 0.0 2022082100 72659 72245 +%%BeginData: 46 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put dup /databarexpanded dup /uk.co.terryburton.bwipp findresource put @@ -6712,6 +10054,7 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def % Parse the input options @@ -6733,12 +10076,14 @@ begin args (opt) options put args - + dontdraw not //renmatrix if end -} bind def +} +[/barcode] {null def} forall +bind def /databarexpandedstacked dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -6747,16 +10092,17 @@ end % --END ENCODER databarexpandedstacked-- % --BEGIN ENCODER gs1northamericancoupon-- -% --REQUIRES preamble raiseerror renlinear renmatrix databarexpanded databarexpandedstacked-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix databarexpanded databarexpandedstacked-- % --DESC: GS1 North American Coupon % --EXAM: (8110)106141416543213500110000310123196000 % --EXOP: includetext segments=8 % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp gs1northamericancoupon 0.0 2017040400 84603 84322 -%%BeginData: 133 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp gs1northamericancoupon 0.0 2022082100 84394 87545 +%%BeginData: 105 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /gs1process dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put dup /databarexpandedstacked dup /uk.co.terryburton.bwipp findresource put begin @@ -6767,13 +10113,16 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def - /includetext false def % Enable/disable coupon text - /coupontextfont /NimbusSanL-Regu def + /coupontextfont /Helvetica def /coupontextsize 9 def /coupontextxoffset (unset) def /coupontextyoffset (unset) def + /parse false def + /dontlint false def + /lintreqs true def % Parse the input options options type /stringtype eq { @@ -6791,45 +10140,10 @@ begin coupontextxoffset (unset) ne {/coupontextxoffset coupontextxoffset cvr def} if coupontextyoffset (unset) ne {/coupontextyoffset coupontextyoffset cvr def} if - % Expand ordinals of the form ^NNN to ASCII - /expand { - /in exch def - /out in length string def - /j 0 def - in - { % loop - (^) search { - dup out exch j exch putinterval - length j add 1 add /j exch def - pop - dup 0 3 getinterval cvi out exch j 1 sub exch put - dup length 3 sub 3 exch getinterval - } { - dup out exch j exch putinterval - length j add /j exch def - out 0 j getinterval exit - } ifelse - } loop - } bind def - - % Parse out AIs - /ais [] def - /vals [] def - barcode dup length 1 sub 1 exch getinterval - { % loop - dup () eq {exit} if - (\)) search pop - exch pop - exch (\() search { - exch pop exch 3 1 roll - } { - () 3 1 roll - } ifelse - [ ais aload pop counttomark 2 add index ] /ais exch def - [ vals aload pop counttomark 1 add index expand ] /vals exch def - pop pop - } loop + barcode /ai //gs1process exec pop + /vals exch def + /ais exch def % Validate the AI structure ais length 1 ne { @@ -6853,6 +10167,7 @@ begin coupontext gcp length 1 add cod putinterval % Get the result of encoding with databarexpandedstacked + options (parse) undef options (dontdraw) true put /args barcode options //databarexpandedstacked exec def @@ -6883,7 +10198,9 @@ begin end -} bind def +} +[/barcode] {null def} forall +bind def /gs1northamericancoupon dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -6897,10 +10214,10 @@ end % --EXAM: 117480 % --EXOP: showborder % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp pharmacode 0.0 2017040400 65042 61361 -%%BeginData: 91 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp pharmacode 0.0 2022082100 55057 54908 +%%BeginData: 94 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -6911,11 +10228,12 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /height 8 2.835 mul 72 div def /nwidth 0.5 2.835 mul def /wwidth 1.5 2.835 mul def - /swidth 1.0 2.835 mul def + /swidth 1.0 2.835 mul def % Parse the input options options type /stringtype eq { @@ -6927,7 +10245,7 @@ begin currentdict end /options exch def } if options {def} forall - + /height height cvr def /nwidth nwidth cvr def /wwidth wwidth cvr def @@ -6953,7 +10271,7 @@ begin txt i [barcode i 1 getinterval 0 0 () 0] put } for - % Convert the integer into the paramacode string + % Convert the integer into the paramacode string /barcode barcode cvi 1 add 2 17 string cvrs def /barcode barcode 1 barcode length 1 sub getinterval def @@ -6986,7 +10304,9 @@ begin end -} bind def +} +[/barcode] {null def} forall +bind def /pharmacode dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -7000,10 +10320,10 @@ end % --EXAM: 117480 % --EXOP: includetext showborder % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp pharmacode2 0.0 2017040400 65777 62019 -%%BeginData: 96 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp pharmacode2 0.0 2022082100 55888 55662 +%%BeginData: 99 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -7014,6 +10334,7 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text /height 4 def % Height of short bars in millimetres @@ -7052,12 +10373,10 @@ begin } for /encstr 16 string def - /bhs 16 array def - /bbs 16 array def /sbs 32 array def /bar 1 25.4 div height mul def % bar height (mm) /spc 1 25.4 div 72 mul def % bar width & spacing (1mm) - + % Convert number into a base3 representation /i 15 def /val barcode cvi def @@ -7069,15 +10388,17 @@ begin /i i 1 sub def } loop /encstr encstr i 1 add 15 i sub getinterval def - + % Generate the bar pattern + /bhs encstr length array def + /bbs encstr length array def 0 1 encstr length 1 sub { /i exch def encstr i get dup bhs i bar [1 1 2] 5 -1 roll get mul put bbs i [0 bar 0] 4 -1 roll get put } for - + % Return the arguments << /ren //renlinear @@ -7094,7 +10415,9 @@ begin end -} bind def +} +[/barcode] {null def} forall +bind def /pharmacode2 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -7103,15 +10426,17 @@ end % --END ENCODER pharmacode2-- % --BEGIN ENCODER code2of5-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear-- % --DESC: Code 25 % --EXAM: 01234567 % --EXOP: includetext includecheck includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp code2of5 0.0 2017040400 75739 71770 -%%BeginData: 150 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp code2of5 0.0 2022082100 73003 69031 +%%BeginData: 165 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -7122,12 +10447,13 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includecheck false def /validatecheck false def /includetext false def % Enable/disable text /includecheckintext false def - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textyoffset -7 def /height 1 def @@ -7149,6 +10475,8 @@ begin /textyoffset textyoffset cvr def /height height cvr def + /code2of5 //loadctx exec + % Validate input barcode { dup 48 lt exch 57 gt or { @@ -7173,12 +10501,13 @@ begin } if % Create an array containing the character mappings - /versions << +{ + /versions << /industrial [ (1111313111) (3111111131) (1131111131) (3131111111) (1111311131) (3111311111) (1131311111) (1111113131) (3111113111) (1131113111) (313111) (31113) - ] + ] /iata [ (1111313111) (3111111131) (1131111131) (3131111111) (1111311131) (3111311111) (1131311111) (1111113131) @@ -7197,6 +10526,8 @@ begin (133111) (111331) (311311) (131311) (1111) (311) ] >> def +} ctxdef + versions version known not { /bwipp.code2of5badVersion (Unrecognised Code 25 version) //raiseerror exec } if @@ -7204,13 +10535,16 @@ begin /cs encs 0 get length def /cw 0 encs 0 get {48 sub add} forall def - /ss encs dup length 2 sub get length def - /sw 0 encs dup length 2 sub get {48 sub add} forall def + /ss encs 10 get length def + /sw 0 encs 10 get {48 sub add} forall def + /es encs 11 get length def % Create a string of the available characters +{ /barchars (0123456789) def +} ctxdef - /sbs barlen includecheck {1 add} if cs mul ss add ss add string def + /sbs barlen includecheck {1 add} if cs mul ss add es add string def /txt barlen includecheck {1 add} if array def % Put the start character @@ -7254,9 +10588,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /code2of5 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -7265,15 +10603,15 @@ end % --END ENCODER code2of5-- % --BEGIN ENCODER industrial2of5-- -% --REQUIRES preamble raiseerror renlinear code2of5-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear code2of5-- % --DESC: Industrial 2 of 5 % --EXAM: 01234567 % --EXOP: includetext includecheck includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp industrial2of5 0.0 2017040400 57761 61035 -%%BeginData: 55 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp industrial2of5 0.0 2022082100 57292 60792 +%%BeginData: 58 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /code2of5 dup /uk.co.terryburton.bwipp findresource put @@ -7285,14 +10623,15 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textxoffset 0 def /textyoffset -7 def /height 1 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -7308,7 +10647,7 @@ begin /textsize textsize cvr def /textxoffset textxoffset cvr def /textyoffset textyoffset cvr def - /height height cvr def + /height height cvr def % Get the result of encoding with code2of5 with version=industrial options (dontdraw) true put @@ -7320,10 +10659,12 @@ begin args dontdraw not //renlinear if - + end -} bind def +} +[/barcode] {null def} forall +bind def /industrial2of5 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -7332,15 +10673,15 @@ end % --END ENCODER industrial2of5-- % --BEGIN ENCODER iata2of5-- -% --REQUIRES preamble raiseerror renlinear code2of5-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear code2of5-- % --DESC: IATA 2 of 5 % --EXAM: 01234567 % --EXOP: includetext includecheck includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp iata2of5 0.0 2017040400 57731 61011 -%%BeginData: 55 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp iata2of5 0.0 2022082100 57262 60768 +%%BeginData: 58 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /code2of5 dup /uk.co.terryburton.bwipp findresource put @@ -7352,14 +10693,15 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textxoffset 0 def /textyoffset -7 def /height 1 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -7375,7 +10717,7 @@ begin /textsize textsize cvr def /textxoffset textxoffset cvr def /textyoffset textyoffset cvr def - /height height cvr def + /height height cvr def % Get the result of encoding with code2of5 with version=iata options (dontdraw) true put @@ -7387,10 +10729,12 @@ begin args dontdraw not //renlinear if - + end -} bind def +} +[/barcode] {null def} forall +bind def /iata2of5 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -7399,15 +10743,15 @@ end % --END ENCODER iata2of5-- % --BEGIN ENCODER matrix2of5-- -% --REQUIRES preamble raiseerror renlinear code2of5-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear code2of5-- % --DESC: Matrix 2 of 5 % --EXAM: 01234567 % --EXOP: includetext includecheck includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp matrix2of5 0.0 2017040400 57741 61019 -%%BeginData: 55 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp matrix2of5 0.0 2022082100 57272 60776 +%%BeginData: 58 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /code2of5 dup /uk.co.terryburton.bwipp findresource put @@ -7419,14 +10763,15 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textxoffset 0 def /textyoffset -7 def /height 1 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -7442,7 +10787,7 @@ begin /textsize textsize cvr def /textxoffset textxoffset cvr def /textyoffset textyoffset cvr def - /height height cvr def + /height height cvr def % Get the result of encoding with code2of5 with version=matrix options (dontdraw) true put @@ -7454,10 +10799,12 @@ begin args dontdraw not //renlinear if - + end -} bind def +} +[/barcode] {null def} forall +bind def /matrix2of5 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -7466,15 +10813,15 @@ end % --END ENCODER matrix2of5-- % --BEGIN ENCODER coop2of5-- -% --REQUIRES preamble raiseerror renlinear code2of5-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear code2of5-- % --DESC: COOP 2 of 5 % --EXAM: 01234567 % --EXOP: includetext includecheck includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp coop2of5 0.0 2017040400 57731 61011 -%%BeginData: 55 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp coop2of5 0.0 2022082100 57262 60768 +%%BeginData: 58 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /code2of5 dup /uk.co.terryburton.bwipp findresource put @@ -7486,14 +10833,15 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textxoffset 0 def /textyoffset -7 def /height 1 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -7509,7 +10857,7 @@ begin /textsize textsize cvr def /textxoffset textxoffset cvr def /textyoffset textyoffset cvr def - /height height cvr def + /height height cvr def % Get the result of encoding with code2of5 with version=coop options (dontdraw) true put @@ -7521,10 +10869,12 @@ begin args dontdraw not //renlinear if - + end -} bind def +} +[/barcode] {null def} forall +bind def /coop2of5 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -7533,15 +10883,15 @@ end % --END ENCODER coop2of5-- % --BEGIN ENCODER datalogic2of5-- -% --REQUIRES preamble raiseerror renlinear code2of5-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear code2of5-- % --DESC: Datalogic 2 of 5 % --EXAM: 01234567 % --EXOP: includetext includecheck includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp datalogic2of5 0.0 2017040400 57756 61031 -%%BeginData: 55 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp datalogic2of5 0.0 2022082100 57287 60788 +%%BeginData: 58 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /code2of5 dup /uk.co.terryburton.bwipp findresource put @@ -7553,14 +10903,15 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textxoffset 0 def /textyoffset -7 def /height 1 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -7576,7 +10927,7 @@ begin /textsize textsize cvr def /textxoffset textxoffset cvr def /textyoffset textyoffset cvr def - /height height cvr def + /height height cvr def % Get the result of encoding with code2of5 with version=datalogic options (dontdraw) true put @@ -7588,10 +10939,12 @@ begin args dontdraw not //renlinear if - + end -} bind def +} +[/barcode] {null def} forall +bind def /datalogic2of5 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -7600,15 +10953,17 @@ end % --END ENCODER datalogic2of5-- % --BEGIN ENCODER code11-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear-- % --DESC: Code 11 % --EXAM: 0123456789 % --EXOP: includetext includecheck includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp code11 0.0 2017040400 78331 78011 -%%BeginData: 158 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp code11 0.0 2022082100 74329 70384 +%%BeginData: 169 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -7619,16 +10974,17 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includecheck false def /validatecheck false def /includetext false def /includecheckintext false def - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textyoffset -7 def /height 1 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -7639,13 +10995,16 @@ begin 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 - + + /code11 //loadctx exec + % Create an array containing the character mappings +{ /encs [ (111131) (311131) (131131) (331111) (113131) (313111) (133111) (111331) (311311) (311111) @@ -7656,6 +11015,7 @@ begin /barchars (0123456789-) def /charvals 11 dict def 0 1 10 {charvals exch dup barchars exch 1 getinterval exch put} for +} ctxdef % Validate the input 0 1 barcode length 1 sub { @@ -7714,15 +11074,15 @@ begin /xpos exch enc exch get 48 sub xpos add def } for } for - + % Put the checksum and end characters includecheck { barlen 10 ge { - sbs barlen 6 mul 6 add encs checksum1 get putinterval + sbs barlen 6 mul 6 add encs checksum1 get putinterval sbs barlen 6 mul 12 add encs checksum2 get putinterval includecheckintext { txt barlen [barchars checksum1 1 getinterval xpos textyoffset textfont textsize] put - /enc encs checksum1 get def + /enc encs checksum1 get def 0 1 5 { % xpos+=width of the character /xpos exch enc exch get 48 sub xpos add def } for @@ -7733,7 +11093,7 @@ begin } ifelse sbs barlen 6 mul 18 add encs 11 get putinterval } { - sbs barlen 6 mul 6 add encs checksum1 get putinterval + sbs barlen 6 mul 6 add encs checksum1 get putinterval includecheckintext { txt barlen [barchars checksum1 1 getinterval xpos textyoffset textfont textsize] put } { @@ -7759,9 +11119,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /code11 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -7770,15 +11134,17 @@ end % --END ENCODER code11-- % --BEGIN ENCODER bc412-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear-- % --DESC: BC412 % --EXAM: BC412 % --EXOP: semi includetext includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp bc412 0.0 2017040400 72256 72010 -%%BeginData: 148 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp bc412 0.0 2022082100 75365 71341 +%%BeginData: 203 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -7789,6 +11155,7 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includecheck false def /validatecheck false def @@ -7796,11 +11163,11 @@ begin /includecheckintext false def /includestartstop false def /semi false def - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textyoffset -7 def /height 1 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -7811,21 +11178,25 @@ begin 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 - + semi { - /includecheck true def + % Implies includecheck and includecheckintext also /includestartstop true def } if + /bc412 //loadctx exec + % Create a string of the available characters +{ /barchars (0R9GLVHA8EZ4NTS1J2Q6C7DYKBUIX3FWP5M) def /charvals 35 dict def 0 1 34 {charvals exch dup barchars exch 1 getinterval exch put} for +} ctxdef % Validate the input 0 1 barcode length 1 sub { @@ -7834,33 +11205,77 @@ begin } if } for - /barlen barcode length validatecheck {1 sub} if def + semi { + % Validate length + validatecheck { + barcode length 8 lt barcode length 19 gt or { + /bwipp.bc412semivalidateBadLength (BC412 semi with check digit must be 8 to 19 characters long) //raiseerror exec + } if + } { + barcode length 7 lt barcode length 18 gt or { + /bwipp.bc412semiBadLength (BC412 semi must be 7 to 18 characters long) //raiseerror exec + } if + } ifelse - /checksum 0 def - 0 1 barlen 1 sub { - barcode exch 1 getinterval charvals exch get - checksum add /checksum exch def - } for - /checksum checksum 35 mod def - validatecheck { - barcode barlen get barchars checksum get ne { - /bwipp.bc412badCheckDigit (Incorrect BC412 check digit provided) //raiseerror exec + /barlen barcode length def + validatecheck not { % Place dummy (0) in checksum position (1-based 2nd) + /barlen barlen 1 add def + /sbarcode barlen string def + sbarcode 0 barcode 0 get put + sbarcode 1 48 put % (0) + sbarcode 2 barcode 1 barlen 2 sub getinterval putinterval + /barcode sbarcode def } if - /barcode barcode 0 barlen getinterval def - /includecheck true def - } if + /sumodd 0 def /sumeven 0 def + 0 1 barlen 1 sub { + /i exch def + barcode i 1 getinterval charvals exch get + i 2 mod 0 eq { % 1-based odd + sumodd add /sumodd exch def + } { + sumeven add /sumeven exch def + } ifelse + } for + /checksum sumodd 35 mod sumeven 35 mod 2 mul add 35 mod def % F = Mod35( Mod35( Fodd ) + 2 * Mod35( Feven ) ) + validatecheck { + checksum 0 ne { + /bwipp.bc412semiBadCheckDigit (Incorrect BC412 semi check digit provided) //raiseerror exec + } if + } { + /checksum checksum 17 mul 35 mod def % CD = Mod35( 17 * F ) + barcode 1 barchars checksum get put + } ifelse + } { + /barlen barcode length validatecheck {1 sub} if def + + /checksum 0 def + 0 1 barlen 1 sub { + barcode exch 1 getinterval charvals exch get + checksum add /checksum exch def + } for + /checksum checksum 35 mod def + validatecheck { + barcode barlen get barchars checksum get ne { + /bwipp.bc412badCheckDigit (Incorrect BC412 check digit provided) //raiseerror exec + } if + /barcode barcode 0 barlen getinterval def + /includecheck true def + } if + } ifelse % Create an array containing the character mappings +{ /encs - [ (11111115) (13111212) (11131113) (12111213) (12121311) - (13131111) (12111312) (11131212) (11121411) (11151111) - (15111111) (11111511) (12131211) (13121112) (13111212) - (11111214) (12121113) (11111313) (13111113) (11121213) - (11141112) (11121312) (11141211) (14121111) (12121212) - (11131311) (13121211) (12111411) (14111211) (11111412) - (12111114) (14111112) (12141111) (11121114) (12131112) - (12) (111) + [ (11111115) (13111212) (11131113) (12111213) (12121311) % 0R9GL + (13131111) (12111312) (11131212) (11121411) (11151111) % VHA8E + (15111111) (11111511) (12131211) (13121112) (13111311) % Z4NTS + (11111214) (12121113) (11111313) (13111113) (11121213) % 1J2Q6 + (11141112) (11121312) (11141211) (14121111) (12121212) % C7DYK + (11131311) (13121211) (12111411) (14111211) (11111412) % BUIX3 + (12111114) (14111112) (12141111) (11121114) (12131112) % FWP5M + (12) (111) % Start Stop ] def +} ctxdef /sbs barlen 1 add 8 mul 5 add string def includecheck { @@ -7896,16 +11311,16 @@ begin txt barlen [() barlen 12 mul txtpos add textyoffset textfont textsize] put } ifelse /pos pos 8 add def - } if + } if % Put the stop character - includestartstop { + includestartstop { sbs pos encs 36 get putinterval - /pos pos 2 add def + /pos pos 3 add def } if % Return the arguments - /sbs sbs 0 pos getinterval def + /sbs sbs 0 pos getinterval def << /ren //renlinear /sbs [sbs {48 sub} forall] @@ -7919,9 +11334,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /bc412 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -7930,15 +11349,17 @@ end % --END ENCODER bc412-- % --BEGIN ENCODER rationalizedCodabar-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear-- % --DESC: Codabar % --EXAM: A0123456789B % --EXOP: includetext includecheck includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp rationalizedCodabar 0.0 2017040400 78699 78295 -%%BeginData: 156 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp rationalizedCodabar 0.0 2022082100 75010 71044 +%%BeginData: 167 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -7949,17 +11370,18 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /altstartstop false def /includecheck false def % Enable/disable checkdigit /validatecheck false def /includetext false def % Enable/disable text /includecheckintext false def - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textyoffset -7 def /height 1 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -7970,12 +11392,15 @@ begin 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 - + + /rationalizedCodabar //loadctx exec + +{ % Create an array containing the character mappings /encs [ (11111331) (11113311) (11131131) (33111111) (11311311) @@ -7985,11 +11410,12 @@ begin ] def % Create a string of the available characters - altstartstop { - /barchars (0123456789-$:/.+TN*E) def - } { - /barchars (0123456789-$:/.+ABCD) def - } ifelse + /barcharsnormal (0123456789-$:/.+ABCD) def + /barcharsalt (0123456789-$:/.+TN*E) def +} ctxdef + + /barchars altstartstop {barcharsalt} {barcharsnormal} ifelse def + /charvals 20 dict def 0 1 19 {charvals exch dup barchars exch 1 getinterval exch put} for /bodyvals 16 dict def @@ -7998,7 +11424,7 @@ begin 16 1 19 {ssvals exch dup barchars exch 1 getinterval exch put} for % Validate the input - barcode 0 1 getinterval ssvals exch known not + barcode 0 1 getinterval ssvals exch known not barcode barcode length 1 sub 1 getinterval ssvals exch known not or { altstartstop { /bwipp.rationalizedCodabarBadAltStartStop (Codabar start and stop characters must be one of E N T or *) //raiseerror exec @@ -8020,7 +11446,7 @@ begin checksum add /checksum exch def } for barcode barcode length 1 sub 1 getinterval charvals exch get - checksum add /checksum exch def + checksum add /checksum exch def /checksum 16 checksum 16 mod sub 16 mod def validatecheck { barcode barlen 1 sub get barchars checksum get ne { @@ -8087,9 +11513,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /rationalizedCodabar dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -8098,15 +11528,17 @@ end % --END ENCODER rationalizedCodabar-- % --BEGIN ENCODER onecode-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear-- % --DESC: USPS Intelligent Mail % --EXAM: 0123456709498765432101234567891 % --EXOP: barcolor=FF0000 % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp onecode 0.0 2017040400 113701 113359 -%%BeginData: 335 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp onecode 0.0 2022082100 108651 104892 +%%BeginData: 348 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -8117,9 +11549,10 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /height 0.15 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -8130,11 +11563,13 @@ begin currentdict end /options exch def } if options {def} forall - + /height height cvr def + /onecode //loadctx exec + /barlen barcode length def - + % Create the human readable text /txtdict << 2 dup @@ -8160,32 +11595,32 @@ begin /base exch def /num exch def num length 1 sub -1 1 { - /i exch def + /i exch def num i 1 sub 2 copy get num i get base idiv add put num i num i get base mod put } for { %loop - extend input as necessary num 0 get base lt {exit} if - /num [0 num {} forall] def + /num [0 num {} forall] def num 0 num 0 get num 1 get base idiv add put num 1 num 1 get base mod put } loop % Trim leading zeros - /num [/i true def num {dup 0 eq i and {pop} {/i false def} ifelse} forall] def + /num [/i true def num {dup 0 eq i and {pop} {/i false def} ifelse} forall] def num length 0 eq {/num [0] def} if num - } bind def + } def /bigadd { 2 copy length exch length 2 copy sub abs /offset exch def lt {exch} if - /a exch def /b exch def + /a exch def /b exch def 0 1 b length 1 sub { dup a exch offset add 2 copy get b 5 -1 roll get add put } for a - } bind def + } def % Conversion of data fields into binary data barlen 20 eq {[0]} if @@ -8208,7 +11643,7 @@ begin bintmp j bintmp j get 256 idiv put } for bytes i bintmp bintmp length 1 sub get 256 mod put - bintmp bintmp length 1 sub 2 copy get 256 idiv put + bintmp bintmp length 1 sub 2 copy get 256 idiv put } for % Generation of 11-bit CRC on byte array @@ -8216,7 +11651,7 @@ begin /dat bytes 0 get 5 bitshift def 6 { fcs dat xor 1024 and 0 ne { - /fcs fcs 1 bitshift 3893 xor def + /fcs fcs 1 bitshift 3893 xor def } { /fcs fcs 1 bitshift def } ifelse @@ -8224,10 +11659,10 @@ begin /dat dat 1 bitshift def } repeat 1 1 12 { - bytes exch get 3 bitshift /dat exch def - 8 { + bytes exch get 3 bitshift /dat exch def + 8 { fcs dat xor 1024 and 0 ne { - /fcs fcs 1 bitshift 3893 xor def + /fcs fcs 1 bitshift 3893 xor def } { /fcs fcs 1 bitshift def } ifelse @@ -8249,7 +11684,7 @@ begin /j exch def binval j 1 add 2 copy get binval j get b mod 10 mul add put binval j binval j get b idiv put - } for + } for codewords i binval binval length 1 sub get b mod put binval binval length 1 sub 2 copy get b idiv put } for @@ -8261,109 +11696,111 @@ begin } if % Conversion from codewords to characters +{ /tab513 [ - 31 7936 47 7808 55 7552 59 7040 61 6016 62 3968 79 7744 87 - 7488 91 6976 93 5952 94 3904 103 7360 107 6848 109 5824 110 3776 - 115 6592 117 5568 118 3520 121 5056 122 3008 124 1984 143 7712 151 - 7456 155 6944 157 5920 158 3872 167 7328 171 6816 173 5792 174 3744 - 179 6560 181 5536 182 3488 185 5024 186 2976 188 1952 199 7264 203 - 6752 205 5728 206 3680 211 6496 213 5472 214 3424 217 4960 218 2912 - 220 1888 227 6368 229 5344 230 3296 233 4832 234 2784 236 1760 241 - 4576 242 2528 244 1504 248 992 271 7696 279 7440 283 6928 285 5904 - 286 3856 295 7312 299 6800 301 5776 302 3728 307 6544 309 5520 310 - 3472 313 5008 314 2960 316 1936 327 7248 331 6736 333 5712 334 3664 - 339 6480 341 5456 342 3408 345 4944 346 2896 348 1872 355 6352 357 - 5328 358 3280 361 4816 362 2768 364 1744 369 4560 370 2512 372 1488 - 376 976 391 7216 395 6704 397 5680 398 3632 403 6448 405 5424 406 - 3376 409 4912 410 2864 412 1840 419 6320 421 5296 422 3248 425 4784 - 426 2736 428 1712 433 4528 434 2480 436 1456 440 944 451 6256 453 - 5232 454 3184 457 4720 458 2672 460 1648 465 4464 466 2416 468 1392 - 472 880 481 4336 482 2288 484 1264 488 752 527 7688 535 7432 539 - 6920 541 5896 542 3848 551 7304 555 6792 557 5768 558 3720 563 6536 - 565 5512 566 3464 569 5000 570 2952 572 1928 583 7240 587 6728 589 - 5704 590 3656 595 6472 597 5448 598 3400 601 4936 602 2888 604 1864 - 611 6344 613 5320 614 3272 617 4808 618 2760 620 1736 625 4552 626 - 2504 628 1480 632 968 647 7208 651 6696 653 5672 654 3624 659 6440 - 661 5416 662 3368 665 4904 666 2856 668 1832 675 6312 677 5288 678 - 3240 681 4776 682 2728 684 1704 689 4520 690 2472 692 1448 696 936 - 707 6248 709 5224 710 3176 713 4712 714 2664 716 1640 721 4456 722 - 2408 724 1384 728 872 737 4328 738 2280 740 1256 775 7192 779 6680 - 781 5656 782 3608 787 6424 789 5400 790 3352 793 4888 794 2840 796 - 1816 803 6296 805 5272 806 3224 809 4760 810 2712 812 1688 817 4504 - 818 2456 820 1432 824 920 835 6232 837 5208 838 3160 841 4696 842 - 2648 844 1624 849 4440 850 2392 852 1368 865 4312 866 2264 868 1240 - 899 6200 901 5176 902 3128 905 4664 906 2616 908 1592 913 4408 914 - 2360 916 1336 929 4280 930 2232 932 1208 961 4216 962 2168 964 1144 - 1039 7684 1047 7428 1051 6916 1053 5892 1054 3844 1063 7300 1067 6788 1069 - 5764 1070 3716 1075 6532 1077 5508 1078 3460 1081 4996 1082 2948 1084 1924 - 1095 7236 1099 6724 1101 5700 1102 3652 1107 6468 1109 5444 1110 3396 1113 - 4932 1114 2884 1116 1860 1123 6340 1125 5316 1126 3268 1129 4804 1130 2756 - 1132 1732 1137 4548 1138 2500 1140 1476 1159 7204 1163 6692 1165 5668 1166 - 3620 1171 6436 1173 5412 1174 3364 1177 4900 1178 2852 1180 1828 1187 6308 - 1189 5284 1190 3236 1193 4772 1194 2724 1196 1700 1201 4516 1202 2468 1204 - 1444 1219 6244 1221 5220 1222 3172 1225 4708 1226 2660 1228 1636 1233 4452 - 1234 2404 1236 1380 1249 4324 1250 2276 1287 7188 1291 6676 1293 5652 1294 - 3604 1299 6420 1301 5396 1302 3348 1305 4884 1306 2836 1308 1812 1315 6292 - 1317 5268 1318 3220 1321 4756 1322 2708 1324 1684 1329 4500 1330 2452 1332 - 1428 1347 6228 1349 5204 1350 3156 1353 4692 1354 2644 1356 1620 1361 4436 - 1362 2388 1377 4308 1378 2260 1411 6196 1413 5172 1414 3124 1417 4660 1418 - 2612 1420 1588 1425 4404 1426 2356 1441 4276 1442 2228 1473 4212 1474 2164 - 1543 7180 1547 6668 1549 5644 1550 3596 1555 6412 1557 5388 1558 3340 1561 - 4876 1562 2828 1564 1804 1571 6284 1573 5260 1574 3212 1577 4748 1578 2700 - 1580 1676 1585 4492 1586 2444 1603 6220 1605 5196 1606 3148 1609 4684 1610 - 2636 1617 4428 1618 2380 1633 4300 1634 2252 1667 6188 1669 5164 1670 3116 - 1673 4652 1674 2604 1681 4396 1682 2348 1697 4268 1698 2220 1729 4204 1730 - 2156 1795 6172 1797 5148 1798 3100 1801 4636 1802 2588 1809 4380 1810 2332 - 1825 4252 1826 2204 1857 4188 1858 2140 1921 4156 1922 2108 2063 7682 2071 - 7426 2075 6914 2077 5890 2078 3842 2087 7298 2091 6786 2093 5762 2094 3714 - 2099 6530 2101 5506 2102 3458 2105 4994 2106 2946 2119 7234 2123 6722 2125 - 5698 2126 3650 2131 6466 2133 5442 2134 3394 2137 4930 2138 2882 2147 6338 - 2149 5314 2150 3266 2153 4802 2154 2754 2161 4546 2162 2498 2183 7202 2187 - 6690 2189 5666 2190 3618 2195 6434 2197 5410 2198 3362 2201 4898 2202 2850 - 2211 6306 2213 5282 2214 3234 2217 4770 2218 2722 2225 4514 2226 2466 2243 - 6242 2245 5218 2246 3170 2249 4706 2250 2658 2257 4450 2258 2402 2273 4322 - 2311 7186 2315 6674 2317 5650 2318 3602 2323 6418 2325 5394 2326 3346 2329 - 4882 2330 2834 2339 6290 2341 5266 2342 3218 2345 4754 2346 2706 2353 4498 - 2354 2450 2371 6226 2373 5202 2374 3154 2377 4690 2378 2642 2385 4434 2401 - 4306 2435 6194 2437 5170 2438 3122 2441 4658 2442 2610 2449 4402 2465 4274 - 2497 4210 2567 7178 2571 6666 2573 5642 2574 3594 2579 6410 2581 5386 2582 - 3338 2585 4874 2586 2826 2595 6282 2597 5258 2598 3210 2601 4746 2602 2698 - 2609 4490 2627 6218 2629 5194 2630 3146 2633 4682 2641 4426 2657 4298 2691 - 6186 2693 5162 2694 3114 2697 4650 2705 4394 2721 4266 2753 4202 2819 6170 - 2821 5146 2822 3098 2825 4634 2833 4378 2849 4250 2881 4186 2945 4154 3079 - 7174 3083 6662 3085 5638 3086 3590 3091 6406 3093 5382 3094 3334 3097 4870 - 3107 6278 3109 5254 3110 3206 3113 4742 3121 4486 3139 6214 3141 5190 3145 - 4678 3153 4422 3169 4294 3203 6182 3205 5158 3209 4646 3217 4390 3233 4262 - 3265 4198 3331 6166 3333 5142 3337 4630 3345 4374 3361 4246 3393 4182 3457 - 4150 3587 6158 3589 5134 3593 4622 3601 4366 3617 4238 3649 4174 3713 4142 - 3841 4126 4111 7681 4119 7425 4123 6913 4125 5889 4135 7297 4139 6785 4141 - 5761 4147 6529 4149 5505 4153 4993 4167 7233 4171 6721 4173 5697 4179 6465 - 4181 5441 4185 4929 4195 6337 4197 5313 4201 4801 4209 4545 4231 7201 4235 - 6689 4237 5665 4243 6433 4245 5409 4249 4897 4259 6305 4261 5281 4265 4769 - 4273 4513 4291 6241 4293 5217 4297 4705 4305 4449 4359 7185 4363 6673 4365 - 5649 4371 6417 4373 5393 4377 4881 4387 6289 4389 5265 4393 4753 4401 4497 - 4419 6225 4421 5201 4425 4689 4483 6193 4485 5169 4489 4657 4615 7177 4619 - 6665 4621 5641 4627 6409 4629 5385 4633 4873 4643 6281 4645 5257 4649 4745 - 4675 6217 4677 5193 4739 6185 4741 5161 4867 6169 4869 5145 5127 7173 5131 - 6661 5133 5637 5139 6405 5141 5381 5155 6277 5157 5253 5187 6213 5251 6181 - 5379 6165 5635 6157 6151 7171 6155 6659 6163 6403 6179 6275 6211 5189 4681 - 4433 4321 3142 2634 2386 2274 1612 1364 1252 856 744 496 + 31 7936 47 7808 55 7552 59 7040 61 6016 62 3968 79 7744 87 + 7488 91 6976 93 5952 94 3904 103 7360 107 6848 109 5824 110 3776 + 115 6592 117 5568 118 3520 121 5056 122 3008 124 1984 143 7712 151 + 7456 155 6944 157 5920 158 3872 167 7328 171 6816 173 5792 174 3744 + 179 6560 181 5536 182 3488 185 5024 186 2976 188 1952 199 7264 203 + 6752 205 5728 206 3680 211 6496 213 5472 214 3424 217 4960 218 2912 + 220 1888 227 6368 229 5344 230 3296 233 4832 234 2784 236 1760 241 + 4576 242 2528 244 1504 248 992 271 7696 279 7440 283 6928 285 5904 + 286 3856 295 7312 299 6800 301 5776 302 3728 307 6544 309 5520 310 + 3472 313 5008 314 2960 316 1936 327 7248 331 6736 333 5712 334 3664 + 339 6480 341 5456 342 3408 345 4944 346 2896 348 1872 355 6352 357 + 5328 358 3280 361 4816 362 2768 364 1744 369 4560 370 2512 372 1488 + 376 976 391 7216 395 6704 397 5680 398 3632 403 6448 405 5424 406 + 3376 409 4912 410 2864 412 1840 419 6320 421 5296 422 3248 425 4784 + 426 2736 428 1712 433 4528 434 2480 436 1456 440 944 451 6256 453 + 5232 454 3184 457 4720 458 2672 460 1648 465 4464 466 2416 468 1392 + 472 880 481 4336 482 2288 484 1264 488 752 527 7688 535 7432 539 + 6920 541 5896 542 3848 551 7304 555 6792 557 5768 558 3720 563 6536 + 565 5512 566 3464 569 5000 570 2952 572 1928 583 7240 587 6728 589 + 5704 590 3656 595 6472 597 5448 598 3400 601 4936 602 2888 604 1864 + 611 6344 613 5320 614 3272 617 4808 618 2760 620 1736 625 4552 626 + 2504 628 1480 632 968 647 7208 651 6696 653 5672 654 3624 659 6440 + 661 5416 662 3368 665 4904 666 2856 668 1832 675 6312 677 5288 678 + 3240 681 4776 682 2728 684 1704 689 4520 690 2472 692 1448 696 936 + 707 6248 709 5224 710 3176 713 4712 714 2664 716 1640 721 4456 722 + 2408 724 1384 728 872 737 4328 738 2280 740 1256 775 7192 779 6680 + 781 5656 782 3608 787 6424 789 5400 790 3352 793 4888 794 2840 796 + 1816 803 6296 805 5272 806 3224 809 4760 810 2712 812 1688 817 4504 + 818 2456 820 1432 824 920 835 6232 837 5208 838 3160 841 4696 842 + 2648 844 1624 849 4440 850 2392 852 1368 865 4312 866 2264 868 1240 + 899 6200 901 5176 902 3128 905 4664 906 2616 908 1592 913 4408 914 + 2360 916 1336 929 4280 930 2232 932 1208 961 4216 962 2168 964 1144 + 1039 7684 1047 7428 1051 6916 1053 5892 1054 3844 1063 7300 1067 6788 1069 + 5764 1070 3716 1075 6532 1077 5508 1078 3460 1081 4996 1082 2948 1084 1924 + 1095 7236 1099 6724 1101 5700 1102 3652 1107 6468 1109 5444 1110 3396 1113 + 4932 1114 2884 1116 1860 1123 6340 1125 5316 1126 3268 1129 4804 1130 2756 + 1132 1732 1137 4548 1138 2500 1140 1476 1159 7204 1163 6692 1165 5668 1166 + 3620 1171 6436 1173 5412 1174 3364 1177 4900 1178 2852 1180 1828 1187 6308 + 1189 5284 1190 3236 1193 4772 1194 2724 1196 1700 1201 4516 1202 2468 1204 + 1444 1219 6244 1221 5220 1222 3172 1225 4708 1226 2660 1228 1636 1233 4452 + 1234 2404 1236 1380 1249 4324 1250 2276 1287 7188 1291 6676 1293 5652 1294 + 3604 1299 6420 1301 5396 1302 3348 1305 4884 1306 2836 1308 1812 1315 6292 + 1317 5268 1318 3220 1321 4756 1322 2708 1324 1684 1329 4500 1330 2452 1332 + 1428 1347 6228 1349 5204 1350 3156 1353 4692 1354 2644 1356 1620 1361 4436 + 1362 2388 1377 4308 1378 2260 1411 6196 1413 5172 1414 3124 1417 4660 1418 + 2612 1420 1588 1425 4404 1426 2356 1441 4276 1442 2228 1473 4212 1474 2164 + 1543 7180 1547 6668 1549 5644 1550 3596 1555 6412 1557 5388 1558 3340 1561 + 4876 1562 2828 1564 1804 1571 6284 1573 5260 1574 3212 1577 4748 1578 2700 + 1580 1676 1585 4492 1586 2444 1603 6220 1605 5196 1606 3148 1609 4684 1610 + 2636 1617 4428 1618 2380 1633 4300 1634 2252 1667 6188 1669 5164 1670 3116 + 1673 4652 1674 2604 1681 4396 1682 2348 1697 4268 1698 2220 1729 4204 1730 + 2156 1795 6172 1797 5148 1798 3100 1801 4636 1802 2588 1809 4380 1810 2332 + 1825 4252 1826 2204 1857 4188 1858 2140 1921 4156 1922 2108 2063 7682 2071 + 7426 2075 6914 2077 5890 2078 3842 2087 7298 2091 6786 2093 5762 2094 3714 + 2099 6530 2101 5506 2102 3458 2105 4994 2106 2946 2119 7234 2123 6722 2125 + 5698 2126 3650 2131 6466 2133 5442 2134 3394 2137 4930 2138 2882 2147 6338 + 2149 5314 2150 3266 2153 4802 2154 2754 2161 4546 2162 2498 2183 7202 2187 + 6690 2189 5666 2190 3618 2195 6434 2197 5410 2198 3362 2201 4898 2202 2850 + 2211 6306 2213 5282 2214 3234 2217 4770 2218 2722 2225 4514 2226 2466 2243 + 6242 2245 5218 2246 3170 2249 4706 2250 2658 2257 4450 2258 2402 2273 4322 + 2311 7186 2315 6674 2317 5650 2318 3602 2323 6418 2325 5394 2326 3346 2329 + 4882 2330 2834 2339 6290 2341 5266 2342 3218 2345 4754 2346 2706 2353 4498 + 2354 2450 2371 6226 2373 5202 2374 3154 2377 4690 2378 2642 2385 4434 2401 + 4306 2435 6194 2437 5170 2438 3122 2441 4658 2442 2610 2449 4402 2465 4274 + 2497 4210 2567 7178 2571 6666 2573 5642 2574 3594 2579 6410 2581 5386 2582 + 3338 2585 4874 2586 2826 2595 6282 2597 5258 2598 3210 2601 4746 2602 2698 + 2609 4490 2627 6218 2629 5194 2630 3146 2633 4682 2641 4426 2657 4298 2691 + 6186 2693 5162 2694 3114 2697 4650 2705 4394 2721 4266 2753 4202 2819 6170 + 2821 5146 2822 3098 2825 4634 2833 4378 2849 4250 2881 4186 2945 4154 3079 + 7174 3083 6662 3085 5638 3086 3590 3091 6406 3093 5382 3094 3334 3097 4870 + 3107 6278 3109 5254 3110 3206 3113 4742 3121 4486 3139 6214 3141 5190 3145 + 4678 3153 4422 3169 4294 3203 6182 3205 5158 3209 4646 3217 4390 3233 4262 + 3265 4198 3331 6166 3333 5142 3337 4630 3345 4374 3361 4246 3393 4182 3457 + 4150 3587 6158 3589 5134 3593 4622 3601 4366 3617 4238 3649 4174 3713 4142 + 3841 4126 4111 7681 4119 7425 4123 6913 4125 5889 4135 7297 4139 6785 4141 + 5761 4147 6529 4149 5505 4153 4993 4167 7233 4171 6721 4173 5697 4179 6465 + 4181 5441 4185 4929 4195 6337 4197 5313 4201 4801 4209 4545 4231 7201 4235 + 6689 4237 5665 4243 6433 4245 5409 4249 4897 4259 6305 4261 5281 4265 4769 + 4273 4513 4291 6241 4293 5217 4297 4705 4305 4449 4359 7185 4363 6673 4365 + 5649 4371 6417 4373 5393 4377 4881 4387 6289 4389 5265 4393 4753 4401 4497 + 4419 6225 4421 5201 4425 4689 4483 6193 4485 5169 4489 4657 4615 7177 4619 + 6665 4621 5641 4627 6409 4629 5385 4633 4873 4643 6281 4645 5257 4649 4745 + 4675 6217 4677 5193 4739 6185 4741 5161 4867 6169 4869 5145 5127 7173 5131 + 6661 5133 5637 5139 6405 5141 5381 5155 6277 5157 5253 5187 6213 5251 6181 + 5379 6165 5635 6157 6151 7171 6155 6659 6163 6403 6179 6275 6211 5189 4681 + 4433 4321 3142 2634 2386 2274 1612 1364 1252 856 744 496 ] def /tab213 [ - 3 6144 5 5120 6 3072 9 4608 10 2560 12 1536 17 4352 18 - 2304 20 1280 24 768 33 4224 34 2176 36 1152 40 640 48 384 - 65 4160 66 2112 68 1088 72 576 80 320 96 192 129 4128 130 - 2080 132 1056 136 544 144 288 257 4112 258 2064 260 1040 264 528 - 513 4104 514 2056 516 1032 1025 4100 1026 2052 2049 4098 4097 2050 1028 + 3 6144 5 5120 6 3072 9 4608 10 2560 12 1536 17 4352 18 + 2304 20 1280 24 768 33 4224 34 2176 36 1152 40 640 48 384 + 65 4160 66 2112 68 1088 72 576 80 320 96 192 129 4128 130 + 2080 132 1056 136 544 144 288 257 4112 258 2064 260 1040 264 528 + 513 4104 514 2056 516 1032 1025 4100 1026 2052 2049 4098 4097 2050 1028 520 272 160 ] def +} ctxdef /chars 10 array def 0 1 9 { /i exch def codewords i get dup 1286 le { - tab513 exch get + tab513 exch get } { tab213 exch 1287 sub get } ifelse @@ -8378,6 +11815,7 @@ begin } for % Conversion from characters to the OneCode encoding +{ /barmap [ 7 2 4 3 1 10 0 0 9 12 2 8 5 5 6 11 8 9 3 1 0 1 5 12 2 5 1 8 4 4 9 11 6 3 8 10 3 9 7 6 @@ -8393,8 +11831,9 @@ begin 5 4 0 11 1 5 2 2 9 1 4 12 8 3 6 6 7 0 3 7 4 7 7 5 0 12 1 11 2 9 9 0 6 8 5 3 3 10 8 2 ] def +} ctxdef - /bbs 65 array def + /bbs 65 array def /bhs 65 array def 0 1 64 { /i exch def @@ -8406,18 +11845,18 @@ begin } if dec not asc and { bbs i 3 height mul 8 div put - bhs i 5 height mul 8 div put + bhs i 5 height mul 8 div put } if dec asc not and { bbs i 0 height mul 8 div put - bhs i 5 height mul 8 div put + bhs i 5 height mul 8 div put } if dec asc and { bbs i 0 height mul 8 div put - bhs i 8 height mul 8 div put + bhs i 8 height mul 8 div put } if } for - + % Return the arguments << /ren //renlinear @@ -8426,7 +11865,7 @@ begin /sbs [bhs length 1 sub {1.44 1.872} repeat 1.44] /txt txt /textxalign (left) - /textfont /NimbusSanL-Regu + /textfont /Helvetica /textyoffset 1 /textxoffset -0.3 /opt options @@ -8434,9 +11873,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /onecode dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -8445,15 +11888,17 @@ end % --END ENCODER onecode-- % --BEGIN ENCODER postnet-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear-- % --DESC: USPS POSTNET % --EXAM: 01234 % --EXOP: includetext includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp postnet 0.0 2017040400 73030 72820 -%%BeginData: 140 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp postnet 0.0 2022082100 70644 66913 +%%BeginData: 151 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -8464,15 +11909,16 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text /validatecheck false def /includecheckintext false def - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textyoffset -7 def /height 0.125 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -8483,12 +11929,14 @@ begin 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 - + + /postnet //loadctx exec + /barlen barcode length validatecheck {1 sub} if def % Validate the input @@ -8501,9 +11949,18 @@ begin } if } forall +{ % Create a string of the available characters /barchars (0123456789) def + % Create an array containing the character mappings + /encs + [ (55222) (22255) (22525) (22552) (25225) + (25252) (25522) (52225) (52252) (52522) + (5) (5) + ] def +} ctxdef + /checksum 0 def 0 1 barlen 1 sub { /i exch def @@ -8517,13 +11974,6 @@ begin /barcode barcode 0 barlen getinterval def } if - % Create an array containing the character mappings - /encs - [ (55222) (22255) (22525) (22552) (25225) - (25252) (25522) (52225) (52252) (52522) - (5) (5) - ] def - /bhs barlen 5 mul 7 add array def /txt barlen 1 add array def @@ -8555,14 +12005,14 @@ begin /j exch def heights j enc j 1 getinterval cvi height mul 5 div put } for - bhs barlen 5 mul 1 add heights putinterval - + bhs barlen 5 mul 1 add heights putinterval + includecheckintext { txt barlen [barchars checksum 1 getinterval barlen 5 mul 1 add 3.312 mul textyoffset textfont textsize] put } { txt barlen [( ) barlen 5 mul 1 add 72 mul 25 div textyoffset textfont textsize] put } ifelse - + % Put end character /enc encs 11 get def /heights enc length array def @@ -8570,7 +12020,7 @@ begin /j exch def heights j enc j 1 getinterval cvi height mul 5 div put } for - bhs barlen 5 mul 6 add heights putinterval + bhs barlen 5 mul 6 add heights putinterval % Return the arguments << @@ -8586,9 +12036,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /postnet dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -8597,15 +12051,17 @@ end % --END ENCODER postnet-- % --BEGIN ENCODER planet-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear-- % --DESC: USPS PLANET % --EXAM: 01234567890 % --EXOP: includetext includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp planet 0.0 2017040400 72826 72620 -%%BeginData: 141 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp planet 0.0 2022082100 70504 66777 +%%BeginData: 152 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -8616,15 +12072,16 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text /validatecheck false def /includecheckintext false def - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textyoffset -7 def /height 0.125 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -8635,12 +12092,14 @@ begin 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 + /planet //loadctx exec + /barlen barcode length validatecheck {1 sub} if def % Validate the input @@ -8653,9 +12112,18 @@ begin } if } forall +{ % Create a string of the available characters /barchars (0123456789) def + % Create an array containing the character mappings + /encs + [ (22555) (55522) (55252) (55225) (52552) + (52525) (52255) (25552) (25525) (25255) + (5) (5) + ] def +} ctxdef + % Calculate the checksum /checksum 0 def 0 1 barlen 1 sub { @@ -8670,13 +12138,6 @@ begin /barcode barcode 0 barlen getinterval def } if - % Create an array containing the character mappings - /encs - [ (22555) (55522) (55252) (55225) (52552) - (52525) (52255) (25552) (25525) (25255) - (5) (5) - ] def - /bhs barlen 5 mul 7 add array def /txt barlen 1 add array def @@ -8708,14 +12169,14 @@ begin /j exch def heights j enc j 1 getinterval cvi height mul 5 div put } for - bhs barlen 5 mul 1 add heights putinterval - + bhs barlen 5 mul 1 add heights putinterval + includecheckintext { txt barlen [barchars checksum 1 getinterval barlen 5 mul 1 add 3.312 mul textyoffset textfont textsize] put } { txt barlen [( ) barlen 5 mul 1 add 72 mul 25 div textyoffset textfont textsize] put } ifelse - + % Put end character /enc encs 11 get def /heights enc length array def @@ -8723,7 +12184,7 @@ begin /j exch def heights j enc j 1 getinterval cvi height mul 5 div put } for - bhs barlen 5 mul 6 add heights putinterval + bhs barlen 5 mul 6 add heights putinterval % Return the arguments << @@ -8739,9 +12200,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /planet dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -8750,15 +12215,17 @@ end % --END ENCODER planet-- % --BEGIN ENCODER royalmail-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear-- % --DESC: Royal Mail 4 State Customer Code % --EXAM: LE28HS9Z % --EXOP: includetext barcolor=FF0000 % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp royalmail 0.0 2017040400 73773 73626 -%%BeginData: 145 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp royalmail 0.0 2022082100 71475 67703 +%%BeginData: 156 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -8769,15 +12236,16 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text /validatecheck false def /includecheckintext false def - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textyoffset -7 def /height 0.175 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -8788,17 +12256,32 @@ begin 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 + /royalmail //loadctx exec + +{ % Create a string of the available characters /barchars (ZUVWXY501234B6789AHCDEFGNIJKLMTOPQRS) def /charvals 36 dict def 0 1 35 {charvals exch dup barchars exch 1 getinterval exch put} for + % Create an array containing the character mappings + /encs + [ (3300) (2211) (2301) (2310) (3201) (3210) + (1122) (0033) (0123) (0132) (1023) (1032) + (1302) (0213) (0303) (0312) (1203) (1212) + (1320) (0231) (0321) (0330) (1221) (1230) + (3102) (2013) (2103) (2112) (3003) (3012) + (3120) (2031) (2121) (2130) (3021) (3030) + (2) (3) + ] def +} ctxdef + % Validate the input 0 1 barcode length 1 sub { barcode exch 1 getinterval charvals exch known not { @@ -8814,7 +12297,7 @@ begin /i exch def /indx charvals barcode i 1 getinterval get def /checksumrow checksumrow indx 6 idiv add def - /checksumcol checksumcol indx 6 mod add def + /checksumcol checksumcol indx 6 mod add def } for /checksum checksumrow 6 mod 6 mul checksumcol 6 mod add def validatecheck { @@ -8824,23 +12307,12 @@ begin /barcode barcode 0 barlen getinterval def } if - % Create an array containing the character mappings - /encs - [ (3300) (2211) (2301) (2310) (3201) (3210) - (1122) (0033) (0123) (0132) (1023) (1032) - (1302) (0213) (0303) (0312) (1203) (1212) - (1320) (0231) (0321) (0330) (1221) (1230) - (3102) (2013) (2103) (2112) (3003) (3012) - (3120) (2031) (2121) (2130) (3021) (3030) - (2) (3) - ] def - /encstr barlen 4 mul 6 add string def /txt barlen 1 add array def % Put start character encstr 0 encs 36 get putinterval - + 0 1 barlen 1 sub { /i exch def /indx charvals barcode i 1 getinterval get def @@ -8855,11 +12327,11 @@ begin } { txt barlen [( ) barlen 4 mul 1 add 3.312 mul textyoffset textfont textsize] put } ifelse - + % Put end character - encstr barlen 4 mul 5 add encs 37 get putinterval + encstr barlen 4 mul 5 add encs 37 get putinterval - /bbs encstr length array def + /bbs encstr length array def /bhs encstr length array def 0 1 encstr length 1 sub { /i exch def @@ -8881,7 +12353,7 @@ begin bhs i 8 height mul 8 div put } if } for - + % Return the arguments << /ren //renlinear @@ -8896,9 +12368,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /royalmail dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -8907,15 +12383,17 @@ end % --END ENCODER royalmail-- % --BEGIN ENCODER auspost-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear-- % --DESC: AusPost 4 State Customer Code % --EXAM: 5956439111ABA 9 % --EXOP: includetext custinfoenc=character % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp auspost 0.0 2017040400 85865 85800 -%%BeginData: 202 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp auspost 0.0 2022082100 82406 78597 +%%BeginData: 215 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -8926,14 +12404,15 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textyoffset -7 def /height 0.175 def /custinfoenc (character) def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -8944,13 +12423,16 @@ begin 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 + /ausport //loadctx exec + % Create an array containing the character mappings +{ /encs [ (000) (001) (002) (010) (011) (012) (020) (021) (022) (100) (101) (102) (110) (111) (112) (120) @@ -8966,7 +12448,8 @@ begin % Create a string of the available characters /barchars (ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz #) def - +} ctxdef + /barlen barcode length def barcode 0 2 getinterval (11) eq {37} if barcode 0 2 getinterval (45) eq {37} if @@ -8980,57 +12463,58 @@ begin % Encode the FCC 0 1 1 { - /i exch def + /i exch def encs barcode i 1 getinterval cvi 64 add get encstr i 2 mul 2 add 3 2 roll putinterval } for - + % Encode the DPID 2 1 9 { - /i exch def + /i exch def encs barcode i 1 getinterval cvi 64 add get encstr i 2 mul 2 add 3 2 roll putinterval txt i 2 sub [barcode i 1 getinterval i 2 sub 2 mul 6 add 3.312 mul textyoffset textfont textsize] put } for - - % Encode the customer information + + % Encode the customer information custinfoenc (numeric) eq { 0 1 barlen 11 sub { /i exch def encs barcode i 10 add 1 getinterval cvi 64 add get encstr i 2 mul 22 add 3 2 roll putinterval txt i 8 add [barcode i 10 add 1 getinterval i 2 mul 22 add 3.312 mul textyoffset textfont textsize] put - } for + } for /ciflen barlen 10 sub 2 mul def } { 0 1 barlen 11 sub { - /i exch def + /i exch def barcode i 10 add 1 getinterval barchars exch search - pop - length /indx exch def - pop pop - /enc encs indx get def + pop + length /indx exch def + pop pop + /enc encs indx get def encstr i 3 mul 22 add enc putinterval txt i 8 add [barcode i 10 add 1 getinterval i 3 mul 22 add 3.312 mul textyoffset textfont textsize] put - } for + } for /ciflen barlen 10 sub 3 mul def } ifelse % Add any filler characters - 22 ciflen add 1 encstr length 14 sub { + 22 ciflen add 1 encstr length 14 sub { encstr exch encs 75 get putinterval } for - + % Create the 64x64 Reed-Solomon table +{ /rstable 64 64 mul array def rstable 0 [ 64 {0} repeat ] putinterval rstable 64 [ 0 1 63 {} for ] putinterval /prev 1 def - 64 { + 64 { /next prev 1 bitshift def next 64 and 0 ne { /next next 67 xor def - } if + } if 0 1 63 { /j exch def /nextcell {rstable 64 next mul j add} def @@ -9041,7 +12525,8 @@ begin } for /prev next def } repeat - +} ctxdef + % Calculate the Reed-Solomon codes for triples /rscodes encstr length 16 sub 3 idiv 4 add array def rscodes 0 [ 4 {0} repeat ] putinterval @@ -9050,9 +12535,9 @@ begin rscodes rscodes length i 2 sub 3 idiv sub 1 sub encstr i 1 getinterval cvi 16 mul encstr i 1 add 1 getinterval cvi 4 mul add - encstr i 2 add 1 getinterval cvi add + encstr i 2 add 1 getinterval cvi add put - } for + } for rscodes length 5 sub -1 0 { /i exch def 0 1 4 { @@ -9068,12 +12553,12 @@ begin /enc rscodes 3 i sub get 4 3 string cvrs def checkcode i 3 mul 3 enc length sub add enc putinterval } for - + % Put checkcode and end characters encstr encstr length 14 sub checkcode putinterval - encstr encstr length 2 sub encs 74 get putinterval + encstr encstr length 2 sub encs 74 get putinterval - /bbs encstr length array def + /bbs encstr length array def /bhs encstr length array def 0 1 encstr length 1 sub { /i exch def @@ -9094,8 +12579,8 @@ begin bbs i 3 height mul 8 div put bhs i 2 height mul 8 div put } if - } for - + } for + % Return the arguments << /ren //renlinear @@ -9110,9 +12595,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /auspost dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -9121,15 +12610,17 @@ end % --END ENCODER auspost-- % --BEGIN ENCODER kix-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear-- % --DESC: Royal Dutch TPG Post KIX % --EXAM: 1231FZ13XHS % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp kix 0.0 2017040400 67923 64189 -%%BeginData: 111 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp kix 0.0 2022082100 66705 63002 +%%BeginData: 122 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -9140,13 +12631,14 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textyoffset -7 def /height 0.175 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -9157,26 +12649,30 @@ begin 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 - + + /kix //loadctx exec + +{ % Create an array containing the character mappings /encs [ (0033) (0123) (0132) (1023) (1032) (1122) - (0213) (0303) (0312) (1203) (1212) (1302) + (0213) (0303) (0312) (1203) (1212) (1302) (0231) (0321) (0330) (1221) (1230) (1320) (2013) (2103) (2112) (3003) (3012) (3102) - (2031) (2121) (2130) (3021) (3030) (3120) - (2211) (2301) (2310) (3201) (3210) (3300) + (2031) (2121) (2130) (3021) (3030) (3120) + (2211) (2301) (2310) (3201) (3210) (3300) ] def % Create a string of the available characters /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ) def /charvals 36 dict def 0 1 35 {charvals exch dup barchars exch 1 getinterval exch put} for +} ctxdef % Validate the input 0 1 barcode length 1 sub { @@ -9188,7 +12684,7 @@ begin /barlen barcode length def /encstr barlen 4 mul string def /txt barlen array def - + 0 1 barlen 1 sub { /i exch def /indx charvals barcode i 1 getinterval get def @@ -9196,7 +12692,7 @@ begin txt i [barcode i 1 getinterval i 4 mul 3.312 mul textyoffset textfont textsize] put } for - /bbs encstr length array def + /bbs encstr length array def /bhs encstr length array def 0 1 encstr length 1 sub { /i exch def @@ -9218,7 +12714,7 @@ begin bhs i 8 height mul 8 div put } if } for - + % Return the arguments << /ren //renlinear @@ -9233,9 +12729,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /kix dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -9244,15 +12744,17 @@ end % --END ENCODER kix-- % --BEGIN ENCODER japanpost-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear-- % --DESC: Japan Post 4 State Customer Code % --EXAM: 6540123789-A-K-Z % --EXOP: includetext includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp japanpost 0.0 2017040400 74350 74174 -%%BeginData: 162 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp japanpost 0.0 2022082100 71516 67819 +%%BeginData: 174 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -9263,14 +12765,15 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text /includecheckintext false def - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textyoffset -7 def /height 0.175 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -9281,24 +12784,29 @@ begin 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 - + + /barlen barcode length def + + /japanpost //loadctx exec + +{ % Create an array containing the character mappings % 0123456789- C1C2C3C4C5C6C7C8 ST EN /encs [ (300) (330) (312) (132) (321) (303) (123) (231) (213) (033) (030) - (120) (102) (210) (012) (201) (021) (003) (333) + (120) (102) (210) (012) (201) (021) (003) (333) (31) (13) ] def % Create a string of the available characters /barchars (0123456789-ABCDEFGHIJKLMNOPQRSTUVWXYZ) def - /barlen barcode length def - +} ctxdef + /encstr 20 1 add 3 mul 4 add string def /digits 20 array def /txt barlen 1 add array def @@ -9407,9 +12915,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /japanpost dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -9418,15 +12930,17 @@ end % --END ENCODER japanpost-- % --BEGIN ENCODER msi-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear-- % --DESC: MSI Modified Plessey % --EXAM: 0123456789 % --EXOP: includetext includecheck includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp msi 0.0 2017040400 77937 77655 -%%BeginData: 139 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp msi 0.0 2022082100 76335 72636 +%%BeginData: 150 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -9437,17 +12951,18 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includecheck false def % Enable/disable checkdigit /includetext false def % Enable/disable text /includecheckintext false def /checktype (mod10) def /badmod11 false def - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textyoffset -7 def /height 1 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -9458,12 +12973,15 @@ begin 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 - + + /msi //loadctx exec + +{ % Create an array containing the character mappings /encs [ (12121212) (12121221) (12122112) (12122121) (12211212) @@ -9473,42 +12991,43 @@ begin % Create a string of the available characters /barchars (0123456789) def +} ctxdef /barlen barcode length def % Length of the code /txtlen barlen def /mod10 { /code exch def - 0 0 code {48 sub exch 10 mul add exch} forall pop 2 mul + 0 0 code {48 sub exch 10 mul add exch} forall pop 2 mul 0 {1 index 10 mod add exch 10 idiv dup 0 eq {pop exit} if exch} loop 0 0 code {48 sub add exch} forall exch pop add 10 mod 10 exch sub 10 mod code length 1 add string dup 0 code putinterval dup code length 4 -1 roll 48 add put - } bind def + } def /mod11 { /code exch def code length 1 sub code {48 sub exch dup 1 sub exch 6 mod 2 add exch} forall pop - 0 code length {3 1 roll mul add} repeat + 0 code length {3 1 roll mul add} repeat 11 mod 11 exch sub 11 mod dup 10 eq badmod11 and { pop code length 2 add string dup 0 code putinterval dup code length (10) putinterval } { code length 1 add string dup 0 code putinterval dup code length 4 -1 roll 48 add put } ifelse - } bind def + } def /ncrmod11 { /code exch def code length 1 sub code {48 sub exch dup 1 sub exch 8 mod 2 add exch} forall pop - 0 code length {3 1 roll mul add} repeat + 0 code length {3 1 roll mul add} repeat 11 mod 11 exch sub 11 mod dup 10 eq badmod11 and { pop code length 2 add string dup 0 code putinterval dup code length (10) putinterval } { code length 1 add string dup 0 code putinterval dup code length 4 -1 roll 48 add put } ifelse - } bind def + } def % Calculate checksum includecheck { @@ -9558,9 +13077,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /msi dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -9569,15 +13092,17 @@ end % --END ENCODER msi-- % --BEGIN ENCODER plessey-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear-- % --DESC: Plessey UK % --EXAM: 01234ABCD % --EXOP: includetext includecheckintext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp plessey 0.0 2017040400 75943 75566 -%%BeginData: 146 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp plessey 0.0 2022082100 73069 69275 +%%BeginData: 157 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -9588,16 +13113,17 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text /validatecheck false def /includecheckintext false def /unidirectional false def - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textyoffset -7 def /height 1 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -9608,17 +13134,30 @@ begin 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 - + + /plessey //loadctx exec + % Create a string of the available characters +{ /barchars (0123456789ABCDEF) def /charvals 16 dict def 0 1 15 {charvals exch dup barchars exch 1 getinterval exch put} for + % Create an array containing the character mappings + /encs + [ (14141414) (32141414) (14321414) (32321414) + (14143214) (32143214) (14323214) (32323214) + (14141432) (32141432) (14321432) (32321432) + (14143232) (32143232) (14323232) (32323232) + (32321432) (541412323) (323) + ] def +} ctxdef + % Validate the input 0 1 barcode length 1 sub { barcode exch 1 getinterval charvals exch known not { @@ -9666,15 +13205,6 @@ begin /barcode barcode 0 barlen getinterval def } if - % Create an array containing the character mappings - /encs - [ (14141414) (32141414) (14321414) (32321414) - (14143214) (32143214) (14323214) (32323214) - (14141432) (32141432) (14321432) (32321432) - (14143232) (32143232) (14323232) (32323232) - (32321432) (541412323) (323) - ] def - /sbs barlen 8 mul unidirectional {27} {33} ifelse add string def /txt barlen 2 add array def @@ -9716,9 +13246,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /plessey dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -9727,16 +13261,19 @@ end % --END ENCODER plessey-- % --BEGIN ENCODER telepen-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renlinear-- % --DESC: Telepen % --EXAM: ABCDEF % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp telepen 0.0 2017040400 76901 76597 -%%BeginData: 173 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp telepen 0.0 2022082100 71738 74915 +%%BeginData: 174 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /parseinput dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin /telepen { @@ -9746,10 +13283,11 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /numeric false def /dontdraw false def /includetext false def % Enable/disable text - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textyoffset -7 def /height 1 def @@ -9771,28 +13309,20 @@ begin /textyoffset textyoffset cvr def /height height cvr def + /telepen //loadctx exec + % 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 + /fncvals << + /parse parse + /parseonly true + /parsefnc false + >> def + /barcode barcode fncvals //parseinput exec def + /barlen barcode length def + options (parse) undef % Create an array containing the character mappings +{ /encs [ (31313131) (1131313111) (33313111) (1111313131) (3111313111) (11333131) (13133131) (111111313111) @@ -9827,6 +13357,7 @@ begin (3113111113) (11311111111111) (331111111111) (111113111113) (31111111111111) (111311111113) (131111111113) (1111111111111111) ] def +} ctxdef /barlen barcode length def % Length of the code /sbs barlen 16 mul 48 add string def @@ -9842,7 +13373,7 @@ begin { % loop i barlen eq {exit} if numeric { % numeric mode: 00-99 & 0X-9X - barcode i get 16 gt { + barcode i get 16 gt { /np barcode i 2 getinterval def np 1 1 getinterval (X) eq { % X in even position amongst digits /indx np 0 1 getinterval cvi 17 add def @@ -9901,9 +13432,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /telepen dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -9912,15 +13447,15 @@ end % --END ENCODER telepen-- % --BEGIN ENCODER telepennumeric-- -% --REQUIRES preamble raiseerror renlinear telepen-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renlinear telepen-- % --DESC: Telepen Numeric % --EXAM: 01234567 % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp telepennumeric 0.0 2017040400 57741 61015 -%%BeginData: 55 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp telepennumeric 0.0 2022082100 63671 63649 +%%BeginData: 58 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /telepen dup /uk.co.terryburton.bwipp findresource put @@ -9932,14 +13467,15 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textxoffset 0 def /textyoffset -7 def /height 1 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -9955,9 +13491,9 @@ begin /textsize textsize cvr def /textxoffset textxoffset cvr def /textyoffset textyoffset cvr def - /height height cvr def + /height height cvr def - % Get the result of encoding with code2of5 with version=industrial + % Get the result of encoding with telepen with numeric=true options (dontdraw) true put options (numeric) true put @@ -9967,10 +13503,12 @@ begin args dontdraw not //renlinear if - + end -} bind def +} +[/barcode] {null def} forall +bind def /telepennumeric dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -9979,16 +13517,19 @@ end % --END ENCODER telepennumeric-- % --BEGIN ENCODER posicode-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renlinear-- % --DESC: PosiCode % --EXAM: ABC123 % --EXOP: version=b inkspread=-0.5 parsefnc includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp posicode 0.0 2017040400 128220 127472 -%%BeginData: 423 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp posicode 0.0 2022082100 113193 116240 +%%BeginData: 399 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /parseinput dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin /posicode { @@ -9998,9 +13539,10 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textxoffset 0 def /textyoffset -7 def @@ -10032,40 +13574,18 @@ begin /checkoffset checkoffset cvi def /height height cvr def - % 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 + /posicode //loadctx exec +{ % Special function characters - /la0 -1 def /la1 -2 def /la2 -3 def - /sf0 -4 def /sf1 -5 def /sf2 -6 def + /la0 -1 def /la1 -2 def /la2 -3 def + /sf0 -4 def /sf1 -5 def /sf2 -6 def /fn1 -7 def /fn2 -8 def /fn3 -9 def /fn4 -10 def % Character maps for each state - << - /normal - [ + /charmapsnormal [ % 0 1 2 0 1 2 0 1 2 - [ (0) (^) (') ] [ (1) (;) 27 ] [ (2) (<) 28 ] % 0-2 + [ (0) (^) (') ] [ (1) (;) 27 ] [ (2) (<) 28 ] % 0-2 [ (3) (=) 29 ] [ (4) (>) 30 ] [ (5) (?) 31 ] % 3-5 [ (6) (@) (!) ] [ (7) ([) (") ] [ (8) 92 (#) ] % 6-8 [ (9) (]) (&) ] [ (A) (a) 1 ] [ (B) (b) 2 ] % 9-11 @@ -10081,9 +13601,8 @@ begin [ ($) ({) (*) ] [ (/) (|) (,) ] [ (+) (}) (:) ] % 39-41 [ (%) (~) fn1 ] [ la1 la0 fn2 ] [ sf1 sf0 fn3 ] % 42-44 [ sf2 sf2 fn4 ] % 45 - ] - /limited - [ + ] def + /chapmapslimited [ [ (0) -98 -98 ] [ (1) -98 -98 ] [ (2) -98 -98 ] % 0-2 [ (3) -98 -98 ] [ (4) -98 -98 ] [ (5) -98 -98 ] % 3-5 [ (6) -98 -98 ] [ (7) -98 -98 ] [ (8) -98 -98 ] % 6-8 @@ -10097,10 +13616,10 @@ begin [ (U) -98 -98 ] [ (V) -98 -98 ] [ (W) -98 -98 ] % 30-32 [ (X) -98 -98 ] [ (Y) -98 -98 ] [ (Z) -98 -98 ] % 33-35 [ (-) -98 -98 ] [ (.) -98 -98 ] % 36-37 - ] - >> - version (a) eq version (b) eq or {/normal} {/limited} ifelse get - /charmaps exch def + ] def +} ctxdef + + /charmaps version (a) eq version (b) eq or {charmapsnormal} {chapmapslimited} ifelse def % Invert charmaps to give character to value maps for each state /charvals [ @@ -10112,7 +13631,7 @@ begin 0 1 2 { /j exch def encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required - charvals j get exch i put + charvals j get exch i put } for } for /set0 charvals 0 get def @@ -10122,10 +13641,10 @@ begin raw {/encoding (raw) def} if encoding (raw) eq { - /cws barlen array def + /cws barcode length array def /i 0 def /j 0 def { % loop - i barlen eq {exit} if + i barcode length eq {exit} if /cw barcode i 1 add 3 getinterval cvi def cws j cw put /i i 4 add def @@ -10135,38 +13654,25 @@ begin /text () def } if - encoding (auto) eq { + encoding (auto) eq { + % Parse the input /fncvals << + /parse parse + /parsefnc parsefnc (FNC1) fn1 (FNC2) fn2 (FNC3) fn3 % (FNC4) fn4 Not user accessible as encoded automatically >> def - - % Convert input into bytes accounting for FNC characters - /msg barlen array def - /text barlen string def - /i 0 def /j 0 def { - i barlen eq {exit} if - /char barcode i get def - text j char put - 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 - text j ( ) putinterval - /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 + /msg barcode fncvals //parseinput exec def /msglen msg length def - /text text 0 j getinterval def + + /text msglen string def + 0 1 msglen 1 sub { + /i exch def + text i msg i get dup 0 lt { pop 32 } if put + } for % Standard and extended ASCII runlength at position /numSA [ msglen {0} repeat 0 ] def @@ -10206,13 +13712,13 @@ begin /enc { exch get cws exch j exch put /j j 1 add def - } bind def + } def /cws msglen 2 mul array def /i 0 def /j 0 def /cset (set0) def { i msglen eq {exit} if - + { % common exit % Read next two characters @@ -10220,7 +13726,7 @@ begin /char2 i 1 add msglen lt {msg i 1 add get} {-99} ifelse def % If current mode is sufficient then directly encode - cset load char1 known { + cset load char1 known { char1 cset load enc /i i 1 add def exit @@ -10232,7 +13738,7 @@ begin char1 set2 enc /i i 1 add def exit - } if + } if % If char2 is also not in this set then latch else shift encode cset load char2 known not { @@ -10244,27 +13750,28 @@ begin /cset (set0) def } ifelse exit - } { + } { cset (set0) eq { sf1 cset load enc char1 set1 enc } { sf0 cset load enc char1 set0 enc - } ifelse + } ifelse /i i 1 add def exit } ifelse exit } loop - + } loop /cws cws 0 j getinterval def } if % auto encoding % Create an array containing the character mappings - << % ";"=11, "<"=12 +{ + /encmaps << % ";"=11, "<"=12 /a [ (141112) (131212) (121312) (111412) (131113) (121213) (111313) (121114) (111214) (111115) @@ -10309,16 +13816,19 @@ begin (131415) (121515) (141216) (131316) (121416) (131217) (121317) (121218) (141212) (1) ] - >> - version get /encs exch def + >> def +} ctxdef + encmaps version get /encs exch def +{ /c2w [ [ 495 330 210 126 70 35 15 5 ] [ 165 120 84 56 35 20 10 4 ] - [ 45 36 28 21 15 10 6 3 ] + [ 45 36 28 21 15 10 6 3 ] [ 9 8 7 6 5 4 3 2 ] [ 1 1 1 1 1 1 1 1 ] ] def +} ctxdef /v 0 def cws { /cw exch def @@ -10328,7 +13838,7 @@ begin } if /v v -1 bitshift def /cw cw -1 bitshift def - } repeat + } repeat } forall /v v checkoffset add def @@ -10336,7 +13846,7 @@ begin /v v 1023 and def v 824 gt v 853 lt and { /v v 292 add def - } if + } if } { /v v 1023 and 45 add def } ifelse @@ -10364,7 +13874,7 @@ begin } loop 20 0 1 4 {d exch get sub} for d exch 5 exch put - version (b) eq version (limitedb) eq or { + version (b) eq version (limitedb) eq or { /d [ d {1 add} forall ] def } if /cbs (111111111111) 12 string copy def @@ -10375,8 +13885,8 @@ begin % Concatenate the space bar successions /sbs cws length 6 mul 31 add string def - encs encs length 2 sub get dup - sbs exch 0 exch putinterval + encs encs length 2 sub get dup + sbs exch 0 exch putinterval length /j exch def 0 1 cws length 1 sub { /i exch def @@ -10403,9 +13913,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /posicode dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -10414,16 +13928,19 @@ end % --END ENCODER posicode-- % --BEGIN ENCODER codablockf-- -% --REQUIRES preamble raiseerror renmatrix-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix-- % --DESC: Codablock F % --EXAM: CODABLOCK F 34567890123456789010040digit % --EXOP: columns=8 % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp codablockf 0.0 2017040400 157635 163565 -%%BeginData: 520 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp codablockf 0.0 2022082100 134261 137478 +%%BeginData: 501 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /parseinput dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put begin /codablockf { @@ -10433,6 +13950,7 @@ begin /options exch def /barcode exch def + /ctx null def /dontdraw false def /rows -1 def /columns 8 def @@ -10457,41 +13975,42 @@ begin /rowheight rowheight cvi def /sepheight sepheight cvi def - columns 4 ge columns 62 le and - rows 2 ge rows 44 le and rows -1 eq or and {/c columns def} if + /c columns 4 ge columns 62 le and {columns} {8} ifelse def + /rows rows 2 ge rows 44 le and {rows} {-1} ifelse def - % 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 + /codablockf //loadctx exec - /barlen barcode length def - - % Convert input into bytes accounting for FNC characters + % Convert input into bytes accounting for FNC characters /swa -1 def /swb -2 def /swc -3 def /sft -4 def /fn1 -5 def /fn2 -6 def /fn3 -7 def /fn4 -8 def /sta -9 def /stp -10 def + % Parse the input + /fncvals << + /parse parse + /parsefnc parsefnc + (FNC1) fn1 +% (FNC2) fn2 Not permitted for Codablock F + (FNC3) fn3 +% (FNC4) fn4 Not user accessible as encoded automatically + >> def + /msg barcode fncvals //parseinput exec def + /msglen msg length def + + % FNC4 codeword insertion for extended ASCII + /msgtmp [] def + msg { + /char exch def + /msgtmp [ msgtmp aload pop char 128 lt {char} {fn4 char 127 and} ifelse ] def + } forall + /msg msgtmp def + /msglen msg length def + % Character maps for each state +{ /charmaps [ % A B C A B C A B C - [ 32 32 (00) ] [ (!) (!) (01) ] [ (") (") (02) ] % 0-2 + [ 32 32 (00) ] [ (!) (!) (01) ] [ (") (") (02) ] % 0-2 [ (#) (#) (03) ] [ ($) ($) (04) ] [ (%) (%) (05) ] % 3-5 [ (&) (&) (06) ] [ (') (') (07) ] [ 40 40 (08) ] % 6-8 [ 41 41 (09) ] [ (*) (*) (10) ] [ (+) (+) (11) ] % 9-11 @@ -10527,7 +14046,7 @@ begin [ swc swc (99) ] [ swb fn4 swb ] [ fn4 swa swa ] % 99-101 [ fn1 fn1 fn1 ] [ sta sta sta ] [ stp stp stp ] % 102-104 ] def - + % Invert charmaps to give character to value maps for each state /charvals [ 105 dict 105 dict 105 dict ] def 0 1 charmaps length 1 sub { @@ -10536,46 +14055,13 @@ begin 0 1 2 { /j exch def encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required - charvals j get exch i put + charvals j get exch i put } for } for /seta charvals 0 get def /setb charvals 1 get def /setc charvals 2 get def - - /fncvals << - (FNC1) fn1 -% (FNC2) fn2 Not permitted for Codablock F - (FNC3) fn3 -% (FNC4) fn4 Not user accessible as encoded automatically - >> 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 - - % FNC4 codeword insertion for extended ASCII - /msgtmp [] def - msg { - /char exch def - /msgtmp [ msgtmp aload pop char 128 lt {char} {fn4 char 127 and} ifelse ] def - } forall - /msg msgtmp def - /msglen msg length def +} ctxdef % Determine digit runlength and characters from given position /numsscr { @@ -10593,17 +14079,17 @@ begin /p p 1 add def } loop n s - } bind def + } def % Encoding for each alphabet /enca { seta exch get cws exch j exch put /j j 1 add def - } bind def + } def /encb { setb exch get cws exch j exch put /j j 1 add def - } bind def + } def /encc { dup type /arraytype ne { setc exch get @@ -10612,11 +14098,11 @@ begin } ifelse cws exch j exch put /j j 1 add def - } bind def + } def % Character exclusively in either alphabet A or B - /anotb {dup seta exch known exch setb exch known not and} bind def - /bnota {dup setb exch known exch seta exch known not and} bind def + /anotb {dup seta exch known exch setb exch known not and} def + /bnota {dup setb exch known exch seta exch known not and} def % Pre-compute relative position of next anotb and next bnota characters /nextanotb [ msg length {0} repeat 9999 ] def @@ -10636,8 +14122,8 @@ begin } for % Does a-only come before b-only after given position and vice versa - /abeforeb {dup nextanotb exch get exch nextbnota exch get lt} bind def - /bbeforea {dup nextbnota exch get exch nextanotb exch get lt} bind def + /abeforeb {dup nextanotb exch get exch nextbnota exch get lt} def + /bbeforea {dup nextbnota exch get exch nextanotb exch get lt} def % Add padding to row /padrow { @@ -10648,14 +14134,14 @@ begin cset (setc) eq {swb encc /cset (setb) def exit} if } loop } repeat - } bind def + } def % Convert message to codewords - /cws c 5 add rows -1 ne {rows} {44} ifelse mul array def + /cws c 5 add 44 mul array def /i 0 def /j 0 def /r 1 def /lastrow false def { - + lastrow {exit} if % Add start character and code subset selector @@ -10672,11 +14158,11 @@ begin /cset (setc) def exit } if - i abeforeb { + i abeforeb { sft enca /cset (seta) def - exit - } if + exit + } if swb enca /cset (setb) def exit @@ -10688,14 +14174,15 @@ begin /rem c 3 add j c 5 add mod sub def % Codewords to end of row i msglen eq endofrow or {exit} if - + i numsscr /nums exch def /nchars exch def + /remnums nums rem 2 mul gt {rem 2 mul} {nums} ifelse def % Determine switches and shifts { % common exit - cset (seta) eq cset (setb) eq or nums 4 ge and + cset (seta) eq cset (setb) eq or remnums 4 ge and msg i get fn1 ne and { - nums 2 mod 0 eq + remnums 2 mod 0 eq rem 3 ge and { swc cset (seta) eq {enca} {encb} ifelse /cset (setc) def @@ -10710,7 +14197,7 @@ begin } repeat exit } if - nums 2 mod 0 ne + remnums 2 mod 0 ne rem 4 ge and { msg i get cset (seta) eq {enca} {encb} ifelse /i i 1 add def @@ -10728,10 +14215,10 @@ begin exit } if } if - cset (setb) eq msg i get anotb and - rem 2 ge and { + cset (setb) eq msg i get anotb and + rem 2 ge and { i msglen 1 sub lt { - i 1 add bbeforea { + i 1 add bbeforea { sft encb msg i get enca /i i 1 add def @@ -10760,7 +14247,7 @@ begin /i i 1 add def exit } if - cset (setc) eq nums 2 lt and + cset (setc) eq remnums 2 lt and rem 2 ge and { i abeforeb { swa encc @@ -10775,7 +14262,7 @@ begin /i i 1 add def exit } if - + % No switches or latches so try to encode cset (seta) eq seta msg i get known and rem 1 ge and { @@ -10789,14 +14276,14 @@ begin /i i 1 add def exit } if - cset (setc) eq nums 2 ge and + cset (setc) eq remnums 2 ge and rem 1 ge and { msg i get fn1 eq { fn1 encc /i i 1 add def } { msg i 2 getinterval encc - /i i 2 add def + /i i 2 add def } ifelse exit } if @@ -10810,7 +14297,7 @@ begin } loop % Determine whether this is the final row - r rows eq rows -1 eq or r 1 gt and i msglen eq and rem 2 ge and { + r rows ge rows -1 eq or r 1 gt and i msglen eq and rem 2 ge and { rem 2 sub padrow /j j 3 add def % Skip symbol and row checksum character positions stp enca @@ -10826,13 +14313,15 @@ begin /cws cws 0 j getinterval def % Maps for row indicators and symbol checksums +{ /abmap [ 64 1 95 {} for 0 1 15 {} for 26 1 63 {} for ] def /cmap [ 0 1 85 {} for ] def - +} ctxdef + % Add symbol check characters to last row /chkmsg msglen array def /j 0 def @@ -10872,6 +14361,7 @@ begin } for % Create an array containing the character mappings +{ /encs [ (212222) (222122) (222221) (121223) (121322) (131222) (122213) (122312) (132212) (221213) (221312) (231212) (112232) (122132) @@ -10889,6 +14379,7 @@ begin (412121) (111143) (111341) (131141) (114113) (114311) (411113) (411311) (113141) (114131) (311141) (411131) (211412) (2331112) ] def +} ctxdef % Derive the bits for each row /rowbits r array def @@ -10897,7 +14388,7 @@ begin /sbs [ cws i c 5 add mul c 5 add getinterval { encs exch get {48 sub} forall - } forall + } forall ] def mark 0 sbs {1 index 1 eq {{0}} {{1}} ifelse repeat} forall @@ -10921,7 +14412,7 @@ begin rowheight {rowbits r 1 sub get aload pop} repeat symwid sepheight mul {1} repeat ] def - + % Return the arguments << /ren //renmatrix @@ -10935,9 +14426,13 @@ begin dontdraw not //renmatrix if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /codablockf dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -10946,16 +14441,19 @@ end % --END ENCODER codablockf-- % --BEGIN ENCODER code16k-- -% --REQUIRES preamble raiseerror renmatrix-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix-- % --DESC: Code 16K % --EXAM: Abcd-1234567890-wxyZ % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp code16k 0.0 2017040400 189660 202445 -%%BeginData: 744 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp code16k 0.0 2022082100 158983 161726 +%%BeginData: 725 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /parseinput dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put begin /code16k { @@ -10965,6 +14463,7 @@ begin /options exch def /barcode exch def + /ctx null def /dontdraw false def /mode -1 def /pos -1 def @@ -10993,42 +14492,22 @@ begin /rowheight rowheight cvi def /sepheight sepheight cvi def - pos -1 ne {/rows 16 def} if + /code16k //loadctx exec - % 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 + pos -1 ne {/rows 16 def} if - % Convert input into bytes accounting for FNC characters - /swa -1 def /swb -2 def /swc -3 def - /sa1 -4 def /sb1 -5 def /sc1 -6 def - /sa2 -7 def /sb2 -8 def /sc2 -9 def + % Convert input into bytes accounting for FNC characters +{ + /swa -1 def /swb -2 def /swc -3 def + /sa1 -4 def /sb1 -5 def /sc1 -6 def + /sa2 -7 def /sb2 -8 def /sc2 -9 def /pad -10 def /sb3 -11 def /sc3 -12 def /fn1 -13 def /fn2 -14 def /fn3 -15 def /fn4 -16 def % Character maps for each state /charmaps [ % A B C A B C A B C - [ 32 32 (00) ] [ (!) (!) (01) ] [ (") (") (02) ] % 0-2 + [ 32 32 (00) ] [ (!) (!) (01) ] [ (") (") (02) ] % 0-2 [ (#) (#) (03) ] [ ($) ($) (04) ] [ (%) (%) (05) ] % 3-5 [ (&) (&) (06) ] [ (') (') (07) ] [ 40 40 (08) ] % 6-8 [ 41 41 (09) ] [ (*) (*) (10) ] [ (+) (+) (11) ] % 9-11 @@ -11064,8 +14543,8 @@ begin [ swc swc (99) ] [ swb fn4 swb ] [ fn4 swa swa ] % 99-101 [ fn1 fn1 fn1 ] [ pad pad pad ] [ sb2 sa2 sb1 ] % 102-104 [ sc2 sc2 sb2 ] [ sc3 sc3 sb3 ] % 105-106 - ] def - + ] def + % Invert charmaps to give character to value maps for each state /charvals [ 109 dict 109 dict 109 dict ] def 0 1 charmaps length 1 sub { @@ -11074,56 +14553,44 @@ begin 0 1 2 { /j exch def encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required - charvals j get exch i put + charvals j get exch i put } for } for /seta charvals 0 get def /setb charvals 1 get def /setc charvals 2 get def +} ctxdef raw {/encoding (raw) def} if encoding (raw) eq { - /cws barlen array def + /cws barcode length array def /i 0 def /j 0 def { % loop - i barlen eq {exit} if + i barcode length eq {exit} if /cw barcode i 1 add 3 getinterval cvi def cws j cw put /i i 4 add def /j j 1 add def } loop /cws cws 0 j getinterval def - /text () def } if - encoding (auto) eq { + encoding (auto) eq { + % Parse the input /fncvals << + /parse parse + /parsefnc parsefnc + /eci true (FNC1) fn1 (FNC2) fn2 (FNC3) fn3 % (FNC4) fn4 Not user accessible as encoded automatically >> 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 + /msg barcode fncvals //parseinput exec def /msglen msg length def - + % Standard and extended ASCII runlength at position /numSA [ msglen {0} repeat 0 ] def /numEA [ msglen {0} repeat 0 ] def @@ -11157,7 +14624,7 @@ begin } for /msg msgtmp def /msglen msg length def - + % Determine digit runlength and characters from given position /numsscr { /n 0 def /s 0 def @@ -11174,17 +14641,17 @@ begin /p p 1 add def } loop n s - } bind def + } def % Encoding for each alphabet /enca { seta exch get cws exch j exch put /j j 1 add def - } bind def + } def /encb { setb exch get cws exch j exch put /j j 1 add def - } bind def + } def /encc { dup type /arraytype ne { setc exch get @@ -11193,11 +14660,11 @@ begin } ifelse cws exch j exch put /j j 1 add def - } bind def + } def % Character exclusively in either alphabet A or B - /anotb {dup seta exch known exch setb exch known not and} bind def - /bnota {dup setb exch known exch seta exch known not and} bind def + /anotb {dup seta exch known exch setb exch known not and} def + /bnota {dup setb exch known exch seta exch known not and} def % Pre-compute relative position of next anotb and next bnota characters /nextanotb [ msg length {0} repeat 9999 ] def @@ -11217,11 +14684,11 @@ begin } for % Does a-only come before b-only after given position and vice versa - /abeforeb {dup nextanotb exch get exch nextbnota exch get lt} bind def - /bbeforea {dup nextbnota exch get exch nextanotb exch get lt} bind def - + /abeforeb {dup nextanotb exch get exch nextbnota exch get lt} def + /bbeforea {dup nextbnota exch get exch nextanotb exch get lt} def + /cws barcode length 2 mul 3 add array def - + % Select mode and encode first characters /i 0 def /j 0 def { % common exit @@ -11229,7 +14696,7 @@ begin pos -1 ne { % encode one and two cws 0 pos 10 idiv 1 sub put - cws 1 pos 10 mod 1 sub put + cws 1 pos 10 mod 1 sub put /j 2 def /cset (setb) def /mode 7 def @@ -11281,7 +14748,7 @@ begin /i 1 def exit } if - % b . 3+ odd nums => c sb2 encode + % b . 3+ odd nums => c sb2 encode setb msg 0 get known 1 numsscr exch pop dup 3 ge exch 2 mod 1 eq and and { msg 0 get encb @@ -11317,9 +14784,9 @@ begin { % Encode remainder i msglen eq {exit} if - + i numsscr /nums exch def /nchars exch def - + % Determine switches and shifts { % common exit cset (seta) eq { @@ -11353,7 +14820,7 @@ begin } if % 4 nums . a => sc2 encode i msglen 4 sub lt { - nums 4 eq + nums 4 eq seta msg i 4 add get known and { sc2 enca 2 { @@ -11362,15 +14829,15 @@ begin /i i 1 add def } { msg i 2 getinterval encc - /i i 2 add def + /i i 2 add def } ifelse } repeat exit } if } if % 6 nums . a => sc3 encode - i msglen 6 sub lt { - nums 6 eq + i msglen 6 sub lt { + nums 6 eq seta msg i 6 add get known and { sc3 enca 3 { @@ -11409,7 +14876,7 @@ begin } if % anotb . anotb . bnota before anotb => sa2 encode i msglen 2 sub lt { - msg i get anotb + msg i get anotb msg i 1 add get anotb and i 2 add bbeforea and { sa2 encb @@ -11468,7 +14935,7 @@ begin % otherwise => encode msg i get encb /i i 1 add def - exit + exit } if cset (setc) eq { % 2+ nums => encode @@ -11530,7 +14997,7 @@ begin } if % b . b . b . 2+ even nums => sb3 encode i msglen 3 sub lt { - setb msg i get known + setb msg i get known setb msg i 1 add get known and setb msg i 2 add get known and i 3 add numsscr exch pop dup 2 ge exch 2 mod 0 eq and and { @@ -11539,7 +15006,7 @@ begin msg i 1 add get encb msg i 2 add get encb /i i 3 add def - exit + exit } if } if % anotb before bnota => swa @@ -11555,13 +15022,14 @@ begin } if exit } loop - + } loop /cws cws 0 j getinterval def } if % auto encoding - + % Basic metrics for the each symbol - % r dcws + % r dcws +{ /metrics [ [ 2 7 ] [ 3 12 ] @@ -11579,6 +15047,7 @@ begin [ 15 72 ] [ 16 77 ] ] def +} ctxdef % Select metrics of an appropriate symbol /urows rows def @@ -11601,13 +15070,14 @@ begin /cws [ r 2 sub 7 mul mode add cws aload pop ] def % Calculate the check characters - 0 0 1 dcws {dup 2 add exch cws exch get mul add} for + 0 0 1 dcws {dup 2 add exch cws exch get mul add} for 107 mod /c1 exch def - 0 0 1 dcws {dup 1 add exch cws exch get mul add} for + 0 0 1 dcws {dup 1 add exch cws exch get mul add} for c1 dcws 2 add mul add 107 mod /c2 exch def /cws [ cws aload pop c1 c2 ] def % Create an array containing the character mappings +{ /encs [ (212222) (222122) (222221) (121223) (121322) (131222) (122213) (122312) (132212) (221213) (221312) (231212) (112232) (122132) @@ -11628,7 +15098,7 @@ begin ] def % Start/stop character encodings - /startencs [ + /startencs [ (3211) (2221) (2122) (1411) (1132) (1231) (1114) (3112) (3211) (2221) (2122) (1411) (1132) (1231) (1114) (3112) ] def @@ -11640,12 +15110,14 @@ begin (2122) (1411) (1132) (1231) (1114) (3112) (1132) (1231) (1114) (3112) (3211) (2221) (2122) (1411) (3211) (2221) ] def +} ctxdef + pos -1 eq pos 10 idiv 2 mod 1 eq or { /stopencs stopencsodd def } { /stopencs stopencseven def } ifelse - + % Derive the bits for each row /rowbits r array def 0 1 r 1 sub { @@ -11656,7 +15128,7 @@ begin 1 cws i 5 mul 5 getinterval { encs exch get {48 sub} forall - } forall + } forall stopencs i get {48 sub} forall 1 ] def @@ -11677,7 +15149,7 @@ begin rowheight {rowbits r 1 sub get aload pop} repeat 81 sepheight mul {1} repeat ] def - + % Return the arguments << /ren //renmatrix @@ -11691,9 +15163,13 @@ begin dontdraw not //renmatrix if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /code16k dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -11702,16 +15178,19 @@ end % --END ENCODER code16k-- % --BEGIN ENCODER code49-- -% --REQUIRES preamble raiseerror renmatrix-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix-- % --DESC: Code 49 % --EXAM: MULTIPLE ROWS IN CODE 49 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp code49 0.0 2017040400 291373 297357 -%%BeginData: 1076 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp code49 0.0 2022082100 261468 264326 +%%BeginData: 1063 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /parseinput dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put begin /code49 { @@ -11721,6 +15200,7 @@ begin /options exch def /barcode exch def + /ctx null def /dontdraw false def /mode -1 def /pos -1 def @@ -11747,55 +15227,24 @@ begin /rowheight rowheight cvi def /sepheight sepheight cvi def - % 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 + /code49 //loadctx exec - % Convert input into bytes accounting for FNC characters +{ /s1 -1 def /s2 -2 def /fn1 -3 def /fn2 -4 def /fn3 -5 def /ns -6 def +} ctxdef + + % Parse the input /fncvals << + /parse parse + /parsefnc parsefnc (FNC1) fn1 (FNC2) fn2 (FNC3) fn3 >> 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 + /msg barcode fncvals //parseinput exec def /msglen msg length def +{ % Character encodings /charmap [ (0) (1) (2) (3) (4) (5) (6) (7) (8) (9) @@ -11809,9 +15258,9 @@ begin /charvals 49 dict def 0 1 48 { /i exch def - charmap i get + charmap i get dup type /stringtype eq {0 get} if % convert string to ASCII if required - charvals exch i put + charvals exch i put } for % Shifted character encodings @@ -11835,13 +15284,14 @@ begin charvals i [ charvals s2 get charvals c2 get ] put } if } for +} ctxdef /encodealpha { charvals exch get dup type /arraytype ne {1 array astore} if dup cws exch j exch putinterval length j add /j exch def - } bind def + } def /base48 { 0 exch {48 sub exch 10 mul add} forall @@ -11849,7 +15299,7 @@ begin [ exch dup length 1 sub -1 0 {1 index exch get exch} for pop ] dup cws exch j exch putinterval length j add /j exch def - } bind def + } def /encodenumeric { /nums exch def @@ -11864,7 +15314,7 @@ begin 3 [49 48 nums 0 4 getinterval aload pop] base48 2 nums 4 3 getinterval base48 } if - } bind def + } def % Pre-compute alphanumeric and numeric runlengths /numericruns [ msglen {0} repeat 0 ] def @@ -11893,20 +15343,23 @@ begin /cws msglen 2 mul 1 add array def /method (alpha) def /i -1 def /j -1 def +{ + /posval [ + 12 22 + 13 23 33 + 14 24 34 44 + 15 25 35 45 55 + 16 26 36 46 56 66 + 17 27 37 47 57 67 77 + 18 28 38 48 58 68 78 88 + 19 29 39 49 59 69 79 89 99 + ] def +} ctxdef + % Handle start for each mode - mode 0 eq mode 1 eq or {/method (alpha) def /i 0 def /j 0 def} if + mode 0 eq mode 1 eq or {/method (alpha) def /i 0 def /j 0 def} if mode 2 eq {/method (numeric) def /i 0 def /j 0 def} if mode 3 eq { - /posval [ - 12 22 - 13 23 33 - 14 24 34 44 - 15 25 35 45 55 - 16 26 36 46 56 66 - 17 27 37 47 57 67 77 - 18 28 38 48 58 68 78 88 - 19 29 39 49 59 69 79 89 99 - ] def cws 0 0 1 43 {dup posval exch get pos ne {pop} if} for 1 add put /method (alpha) def /i 0 def /j 1 def } if @@ -11944,7 +15397,8 @@ begin /cws cws 0 j getinterval def % Basic metrics for the each symbol - % r dcws + % r dcws +{ /metrics [ [ 2 9 ] [ 3 16 ] @@ -11954,6 +15408,7 @@ begin [ 7 42 ] [ 8 49 ] ] def +} ctxdef % Select metrics of an appropriate symbol /urows rows def @@ -11978,7 +15433,7 @@ begin 0 1 r 2 sub { /i exch def /cc cws j 7 getinterval def - ccs i 8 mul cc putinterval + ccs i 8 mul cc putinterval ccs i 8 mul 7 add 0 cc {add} forall 49 mod put /j j 7 add def } for @@ -11991,21 +15446,23 @@ begin ccs ccs length 2 sub cr7 put % Calculate the symbol check characters +{ [ 1 9 31 26 2 12 17 23 37 18 22 6 27 44 15 43 39 11 13 5 41 33 36 8 4 32 3 19 40 25 29 10 24 30 ] dup [ exch 20 exch 0 32 getinterval aload pop ] /weightx exch def dup [ exch 16 exch 1 32 getinterval aload pop ] /weighty exch def [ exch 38 exch 2 32 getinterval aload pop ] /weightz exch def +} ctxdef /calccheck { /weights exch def /score 0 def 0 1 r 1 sub 8 mul 2 idiv 1 sub { /i exch def - ccs i 2 mul get 49 mul ccs i 2 mul 1 add get add + ccs i 2 mul get 49 mul ccs i 2 mul 1 add get add weights i 1 add get mul /score exch score add def } for score - } bind def + } def /lastrow ccs ccs length 8 sub 8 getinterval def % wr1 check character @@ -12017,10 +15474,10 @@ begin /wr1 lastrow 0 get 49 mul lastrow 1 get add def % wr2 check character - cr7 weighty 0 get mul weighty calccheck add + cr7 weighty 0 get mul weighty calccheck add wr1 weighty r 4 mul 3 sub get mul add 2401 mod dup /wr2 exch def - dup 49 idiv exch 49 mod 2 array astore + dup 49 idiv exch 49 mod 2 array astore lastrow 2 3 -1 roll putinterval % wr3 check character @@ -12028,13 +15485,14 @@ begin wr1 weightx r 4 mul 3 sub get mul add wr2 weightx r 4 mul 2 sub get mul add 2401 mod - dup 49 idiv exch 49 mod 2 array astore + dup 49 idiv exch 49 mod 2 array astore lastrow 4 3 -1 roll putinterval % Place last row check character ccs ccs length 8 sub 7 getinterval 0 exch {add} forall 49 mod ccs ccs length 1 sub 3 -1 roll put +{ /patterns [ [ % Even parity (11521132) (25112131) (14212132) (25121221) (14221222) (12412132) (23321221) @@ -12730,6 +16188,7 @@ begin /parity [ (1001) (0101) (1100) (0011) (1010) (0110) (1111) (0000) ] def +} ctxdef % Derive the bits for each row /rowbits r array def @@ -12779,9 +16238,13 @@ begin dontdraw not //renmatrix if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /code49 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -12790,15 +16253,17 @@ end % --END ENCODER code49-- % --BEGIN ENCODER channelcode-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear-- % --DESC: Channel Code % --EXAM: 3493 -% --EXOP: height=0.5 includetext +% --EXOP: height=0.5 includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp channelcode 0.0 2017040400 74649 74470 -%%BeginData: 149 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp channelcode 0.0 2022082100 132918 128171 +%%BeginData: 262 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -12809,12 +16274,13 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /shortfinder false def /includetext false def /includecheck false def /height 1 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -12828,6 +16294,8 @@ begin /height height cvr def + /channelcode //loadctx exec + % Validate the input barcode length 2 lt barcode length 7 gt or { /bwipp.channelcodeBadLength (Channel Code must be 2 to 7 digits) //raiseerror exec @@ -12841,50 +16309,151 @@ begin /bwipp.channelcodeTooBig (The Channel Code value is too big for the number of channels) //raiseerror exec } if - /nextb { - dup - dup s exch get exch - dup b exch 1 sub get exch - dup s exch 1 sub get exch - b exch 2 sub get exch - add add add 4 gt {1} {2} ifelse - 1 index chan 2 add lt { - dup 1 4 index { - b 3 index 2 index put - 3 index exch sub 1 add 4 index 3 index 1 add nexts - } for - } { - dup 3 index le { - b 2 index 4 index put - value target eq { - /out [ - 3 1 10 {dup s exch get exch b exch get} for - ] 0 chan 2 mul getinterval def - } if - /value value 1 add def - } if - } ifelse - pop pop pop pop - } bind def - - /nexts { - dup chan 2 add lt {1} {1 index} ifelse 1 3 index { - s 2 index 2 index put - 2 index exch sub 1 add 3 index 2 index nextb - } for - pop pop pop - } bind def + % Tail-call optimisation FTW! + /loops1 { /s2max s1max 1 add s1 sub def /b1 1 def + s1 1 eq {nextb1} {loopb1} ifelse } def + /loopb1 { /b2max b1max 1 add b1 sub def /s2 1 def loops2 } def + /loops2 { /s3max s2max 1 add s2 sub def /b2 1 def + s1 b1 add s2 add 3 eq {nextb2} {loopb2} ifelse } def + /loopb2 { /b3max b2max 1 add b2 sub def /s3 1 def loops3 } def + /loops3 { /s4max s3max 1 add s3 sub def /b3 1 def + b1 s2 add b2 add s3 add 4 eq {nextb3} {loopb3} ifelse } def + /loopb3 { /b4max b3max 1 add b3 sub def /s4 1 def loops4 } def + /loops4 { /s5max s4max 1 add s4 sub def /b4 1 def + b2 s3 add b3 add s4 add 4 eq {nextb4} {loopb4} ifelse } def + /loopb4 { /b5max b4max 1 add b4 sub def /s5 1 def loops5 } def + /loops5 { /s6max s5max 1 add s5 sub def /b5 1 def + b3 s4 add b4 add s5 add 4 eq {nextb5} {loopb5} ifelse } def + /loopb5 { /b6max b5max 1 add b5 sub def /s6 1 def loops6 } def + /loops6 { /s7max s6max 1 add s6 sub def /b6 1 def + b4 s5 add b5 add s6 add 4 eq {nextb6} {loopb6} ifelse } def + /loopb6 { /b7max b6max 1 add b6 sub def /s7 1 def loops7 } def + /loops7 { /s8 s7max 1 add s7 sub def /b7 1 def + b5 s6 add b6 add s7 add 4 eq {nextb7} {loopb7} ifelse } def + /loopb7 { /b8 b7max 1 add b7 sub def + b6 s7 add b7 add s8 add b8 add 5 eq {nextb7} {chkchr} ifelse } def + /chkchr { + value target eq { + [s1 b1 s2 b2 s3 b3 s4 b4 s5 b5 s6 b6 s7 b7 s8 b8] exit + } if + /value value 1 add def + nextb7 + } def + /nextb7 { /b7 b7 1 add def b7 b7max le {loopb7} {nexts7} ifelse } def + /nexts7 { /s7 s7 1 add def s7 s7max le {loops7} {nextb6} ifelse } def + /nextb6 { /b6 b6 1 add def b6 b6max le {loopb6} {nexts6} ifelse } def + /nexts6 { /s6 s6 1 add def s6 s6max le {loops6} {nextb5} ifelse } def + /nextb5 { /b5 b5 1 add def b5 b5max le {loopb5} {nexts5} ifelse } def + /nexts5 { /s5 s5 1 add def s5 s5max le {loops5} {nextb4} ifelse } def + /nextb4 { /b4 b4 1 add def b4 b4max le {loopb4} {nexts4} ifelse } def + /nexts4 { /s4 s4 1 add def s4 s4max le {loops4} {nextb3} ifelse } def + /nextb3 { /b3 b3 1 add def b3 b3max le {loopb3} {nexts3} ifelse } def + /nexts3 { /s3 s3 1 add def s3 s3max le {loops3} {nextb2} ifelse } def + /nextb2 { /b2 b2 1 add def b2 b2max le {loopb2} {nexts2} ifelse } def + /nexts2 { /s2 s2 1 add def s2 s2max le {loops2} {nextb1} ifelse } def + /nextb1 { /b1 b1 1 add def b1 b1max le {loopb1} {nexts1} ifelse } def + /nexts1 { /s1 s1 1 add def s1 s1max le {loops1} if } def + +{ + /memo [ % Accelerate generation of bar patterns + [ % CH3 + [ 0 [1 1 1 1 1 2 1 2] [1 1 1 1 1 1 1 3] [1 1 1 1 1 3 2] [1 1 1 1 1 3 3] ] + ] + [ % CH4 + [ 0 [1 1 1 1 2 1 1 3] [1 1 1 1 1 1 1 4] [1 1 1 1 4 3 3] [1 1 1 1 4 4 4] ] + ] + [ % CH5 + [ 0 [1 1 1 2 1 1 2 3] [1 1 1 1 1 1 1 5] [1 1 1 5 4 4 4] [1 1 1 5 5 5 5] ] + ] + [ % CH6 + [ 0 [1 1 2 1 1 2 1 4] [1 1 1 1 1 1 1 6] [1 1 6 5 5 5 4] [1 1 6 6 6 6 6] ] + ] + [ % CH7 + [ 0 [1 2 1 1 2 1 1 5] [1 1 1 1 1 1 1 7] [1 7 6 6 6 5 5] [1 7 7 7 7 7 7] ] + [ 150000 [1 3 1 1 2 4 1 1] [1 1 3 1 2 3 2 1] [1 7 5 5 5 4 1] [1 7 7 5 5 4 2] ] + [ 300000 [1 1 4 2 1 1 1 3] [1 2 4 1 1 1 2 2] [1 7 7 4 3 3 3] [1 7 6 3 3 3 3] ] + [ 450000 [1 1 4 1 1 4 1 1] [1 3 2 1 2 1 2 2] [1 7 7 4 4 4 1] [1 7 5 4 4 3 3] ] + ] + [ % CH8 + [ 0 [2 1 1 2 1 1 2 5] [1 1 1 1 1 1 1 8] [8 7 7 7 6 6 6] [8 8 8 8 8 8 8] ] + [ 150000 [2 1 1 2 1 1 5 2] [1 1 2 1 5 2 1 2] [8 7 7 7 6 6 6] [8 8 8 7 7 3 2] ] + [ 300000 [2 1 1 4 2 2 2 1] [1 1 4 2 1 2 1 3] [8 7 7 7 4 3 2] [8 8 8 5 4 4 3] ] + [ 450000 [2 2 2 1 1 3 1 3] [1 1 2 1 1 2 4 3] [8 7 6 5 5 5 3] [8 8 8 7 7 7 6] ] + [ 600000 [2 3 1 1 4 2 1 1] [1 1 3 1 3 1 2 3] [8 7 5 5 5 2 1] [8 8 8 6 6 4 4] ] + [ 750000 [2 1 3 1 2 3 2 1] [1 2 1 1 3 4 1 2] [8 7 7 5 5 4 2] [8 8 7 7 7 5 2] ] + [ 900000 [2 2 1 4 1 2 2 1] [1 2 1 2 1 5 1 2] [8 7 6 6 3 3 2] [8 8 7 7 6 6 2] ] + [ 1050000 [2 4 1 1 1 2 2 2] [1 2 1 2 1 3 1 4] [8 7 4 4 4 4 3] [8 8 7 7 6 6 4] ] + [ 1200000 [2 2 1 5 2 1 1 1] [1 3 1 3 2 1 1 3] [8 7 6 6 2 1 1] [8 8 6 6 4 3 3] ] + [ 1350000 [2 2 1 3 3 1 1 2] [1 4 1 2 1 1 4 1] [8 7 6 6 4 2 2] [8 8 5 5 4 4 4] ] + [ 1500000 [3 1 2 2 2 1 1 3] [1 1 1 1 2 2 4 3] [8 6 6 5 4 3 3] [8 8 8 8 8 7 6] ] + [ 1650000 [3 2 1 2 3 1 2 1] [1 1 1 1 3 2 4 2] [8 6 5 5 4 2 2] [8 8 8 8 8 6 5] ] + [ 1800000 [3 1 1 3 2 3 1 1] [1 2 1 1 3 4 2 1] [8 6 6 6 4 3 1] [8 8 7 7 7 5 2] ] + [ 1950000 [3 2 1 2 1 2 2 2] [1 2 4 1 2 2 1 2] [8 6 5 5 4 4 3] [8 8 7 4 4 3 2] ] + [ 2100000 [3 1 2 1 4 2 1 1] [1 4 1 2 1 1 2 3] [8 6 6 5 5 2 1] [8 8 5 5 4 4 4] ] + [ 2250000 [4 1 1 4 1 1 2 1] [1 1 4 2 1 1 1 4] [8 5 5 5 2 2 2] [8 8 8 5 4 4 4] ] + [ 2400000 [4 3 1 2 1 2 1 1] [1 2 4 2 2 2 1 1] [8 5 3 3 2 2 1] [8 8 7 4 3 2 1] ] + [ 2550000 [5 1 1 1 1 1 3 2] [1 2 2 4 3 1 1 1] [8 4 4 4 4 4 4] [8 8 7 6 3 1 1] ] + [ 2700000 [1 1 3 6 1 1 1 1] [2 1 1 2 1 1 6 1] [8 8 8 6 1 1 1] [8 7 7 7 6 6 6] ] + [ 2850000 [1 1 1 2 2 3 2 3] [2 1 3 3 2 1 1 2] [8 8 8 8 7 6 4] [8 7 7 5 3 2 2] ] + [ 3000000 [1 2 3 3 3 1 1 1] [2 1 1 1 5 1 2 2] [8 8 7 5 3 1 1] [8 7 7 7 7 3 3] ] + [ 3150000 [1 3 1 2 2 2 3 1] [2 1 1 3 2 1 3 2] [8 8 6 6 5 4 3] [8 7 7 7 5 4 4] ] + [ 3300000 [1 5 1 1 3 1 1 2] [2 1 1 4 3 2 1 1] [8 8 4 4 4 2 2] [8 7 7 7 4 2 1] ] + [ 3450000 [1 1 2 2 2 5 1 1] [2 2 2 2 3 1 1 2] [8 8 8 7 6 5 1] [8 7 6 5 4 2 2] ] + [ 3600000 [1 2 1 1 3 4 2 1] [2 2 3 1 1 1 2 3] [8 8 7 7 7 5 2] [8 7 6 4 4 4 4] ] + [ 3750000 [1 1 2 1 1 5 3 1] [2 3 1 1 4 1 2 1] [8 8 8 7 7 7 3] [8 7 5 5 5 2 2] ] + [ 3900000 [1 3 1 2 4 2 1 1] [2 3 3 1 1 1 2 2] [8 8 6 6 5 2 1] [8 7 5 3 3 3 3] ] + [ 4050000 [1 3 1 2 3 1 2 2] [2 6 2 1 1 1 1 1] [8 8 6 6 5 3 3] [8 7 2 1 1 1 1] ] + [ 4200000 [2 1 1 2 1 2 2 4] [2 1 3 1 3 3 1 1] [8 7 7 7 6 6 5] [8 7 7 5 5 3 1] ] + [ 4350000 [2 2 1 4 1 2 2 1] [2 1 4 1 3 1 2 1] [8 7 6 6 3 3 2] [8 7 7 4 4 2 2] ] + [ 4500000 [2 1 1 1 2 1 3 4] [2 2 2 1 2 1 3 2] [8 7 7 7 7 6 6] [8 7 6 5 5 4 4] ] + [ 4650000 [2 4 2 1 2 2 1 1] [2 2 2 1 2 1 2 3] [8 7 4 3 3 2 1] [8 7 6 5 5 4 4] ] + [ 4800000 [2 3 2 1 1 2 2 2] [2 4 1 2 1 1 3 1] [8 7 5 4 4 4 3] [8 7 4 4 3 3 3] ] + [ 4950000 [3 2 2 1 2 1 1 3] [2 1 1 2 1 1 1 6] [8 6 5 4 4 3 3] [8 7 7 7 6 6 6] ] + [ 5100000 [3 2 1 1 1 3 3 1] [2 2 3 2 1 1 3 1] [8 6 5 5 5 5 3] [8 7 6 4 3 3 3] ] + [ 5250000 [4 1 2 1 2 2 1 2] [2 1 4 1 2 1 1 3] [8 5 5 4 4 3 2] [8 7 7 4 4 3 3] ] + [ 5400000 [5 1 2 1 2 1 1 2] [2 2 1 1 4 1 3 1] [8 4 4 3 3 2 2] [8 7 6 6 6 3 3] ] + [ 5550000 [1 1 4 4 1 2 1 1] [3 1 2 1 1 3 2 2] [8 8 8 5 2 2 1] [8 6 6 5 5 5 3] ] + [ 5700000 [1 2 1 1 2 1 3 4] [3 1 4 1 2 2 1 1] [8 8 7 7 7 6 6] [8 6 6 3 3 2 1] ] + [ 5850000 [1 1 3 3 2 2 2 1] [3 2 1 1 2 1 4 1] [8 8 8 6 4 3 2] [8 6 5 5 5 4 4] ] + [ 6000000 [1 4 3 1 1 2 1 2] [3 2 2 1 2 2 1 2] [8 8 5 3 3 3 2] [8 6 5 4 4 3 2] ] + [ 6150000 [2 1 1 4 1 2 1 3] [3 1 1 2 1 2 1 4] [8 7 7 7 4 4 3] [8 6 6 6 5 5 4] ] + [ 6300000 [2 2 2 1 3 2 2 1] [3 1 4 1 3 1 1 1] [8 7 6 5 5 3 2] [8 6 6 3 3 1 1] ] + [ 6450000 [2 5 1 3 1 1 1 1] [3 2 1 1 2 3 1 2] [8 7 3 3 1 1 1] [8 6 5 5 5 4 2] ] + [ 6600000 [3 2 3 1 2 1 2 1] [3 1 3 2 2 1 1 2] [8 6 5 3 3 2 2] [8 6 6 4 3 2 2] ] + [ 6750000 [4 1 2 2 1 1 3 1] [3 2 1 3 1 1 3 1] [8 5 5 4 3 3 3] [8 6 5 5 3 3 3] ] + [ 6900000 [1 2 1 4 2 2 2 1] [4 1 1 2 2 2 2 1] [8 8 7 7 4 3 2] [8 5 5 5 4 3 2] ] + [ 7050000 [1 2 5 2 1 2 1 1] [4 2 1 3 2 1 1 1] [8 8 7 3 2 2 1] [8 5 4 4 2 1 1] ] + [ 7200000 [2 2 2 1 3 1 3 1] [4 1 3 1 3 1 1 1] [8 7 6 5 5 3 3] [8 5 5 3 3 1 1] ] + [ 7350000 [3 1 4 2 1 1 1 2] [4 2 2 1 1 1 2 2] [8 6 6 3 2 2 2] [8 5 4 3 3 3 3] ] + [ 7500000 [1 1 1 4 1 1 3 3] [5 2 1 2 2 1 1 1] [8 8 8 8 5 5 5] [8 4 3 3 2 1 1] ] + [ 7650000 [5 2 1 2 1 2 1 1] [5 2 2 1 1 2 1 1] [8 4 3 3 2 2 1] [8 4 3 2 2 2 1] ] + ] + ] def +} ctxdef /encode { /chan exch def /target exch def - /value 0 def - /out -1 def - /b [ 1 1 1 0 0 0 0 0 0 0 0 ] def - /s [ 0 1 1 0 0 0 0 0 0 0 0 ] def - chan dup 3 nexts - out - } bind def + + % Lookup memoized starting value close to the target + memo chan 3 sub get { + /m exch def + m 0 get target gt {exit} if + /mv m 0 get def + /mb m 1 get def + /ms m 2 get def + /mbmax m 3 get def + /msmax m 4 get def + } forall + /value mv def + mb aload pop [/b8 /b7 /b6 /b5 /b4 /b3 /b2 /b1] {exch def} forall + ms aload pop [/s8 /s7 /s6 /s5 /s4 /s3 /s2 /s1] {exch def} forall + mbmax aload pop [/b7max /b6max /b5max /b4max /b3max /b2max /b1max] {exch def} forall + msmax aload pop [/s7max /s6max /s5max /s4max /s3max /s2max /s1max] {exch def} forall + + 1 {chkchr} repeat 8 chan sub 2 mul dup 16 exch sub getinterval + + } def /barlen barcode length def @@ -12895,17 +16464,20 @@ begin /data barcode cvi barlen 1 add encode def % Determine check data - /check [] def - includecheck { - /mod23 [ +{ + /mod23map [ [] [] [ 13 12 4 9 3 1 ] - [ 13 2 12 3 18 16 4 1 ] + [ 8 2 12 3 18 16 4 1 ] [ 11 16 17 8 20 4 10 2 5 1 ] [ 1 4 16 18 3 12 2 8 9 13 6 1 ] - [ 20 16 22 13 15 12 5 4 8 9 21 3 7 1 ] + [ 20 16 22 13 15 12 5 4 17 9 21 3 7 1 ] [ 2 6 18 8 1 3 9 4 12 13 16 2 6 18 8 1 ] - ] barlen get def + ] def +} ctxdef + /check [] def + includecheck { + /mod23 mod23map barlen get def 0 0 1 data length 1 sub { dup data exch get 1 sub exch mod23 exch get mul add @@ -12940,9 +16512,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /channelcode dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -12951,15 +16527,17 @@ end % --END ENCODER channelcode-- % --BEGIN ENCODER flattermarken-- -% --REQUIRES preamble raiseerror renlinear-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear-- % --DESC: Flattermarken % --EXAM: 11099 % --EXOP: inkspread=-0.25 showborder borderleft=0 borderright=0 % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp flattermarken 0.0 2017040400 63805 60185 -%%BeginData: 93 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp flattermarken 0.0 2022082100 63195 59686 +%%BeginData: 104 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -12970,9 +16548,10 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /includetext false def % Enable/disable text - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textyoffset -7 def /height 0.3 def @@ -13000,6 +16579,8 @@ begin /textyoffset textyoffset cvr def /height height cvr def + /flattermarken //loadctx exec + % Validate the input barcode { dup 48 lt exch 57 gt or { @@ -13007,6 +16588,7 @@ begin } if } forall +{ % Create an array containing the character mappings /encs [ (0018) (0117) (0216) (0315) (0414) (0513) (0612) (0711) (0810) @@ -13015,6 +16597,7 @@ begin % Create a string of the available characters /barchars (1234567890) def +} ctxdef /barlen barcode length def % Length of the code @@ -13045,9 +16628,13 @@ begin dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /flattermarken dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -13061,10 +16648,10 @@ end % --EXAM: 331132131313411122131311333213114131131221323 % --EXOP: height=0.5 % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp raw 0.0 2017040400 58495 55088 -%%BeginData: 52 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp raw 0.0 2022082100 49590 49483 +%%BeginData: 55 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -13075,6 +16662,7 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /height 1 def @@ -13111,7 +16699,9 @@ begin end -} bind def +} +[/barcode] {null def} forall +bind def /raw dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -13125,10 +16715,10 @@ end % --EXAM: FATDAFTDAD % --EXOP: % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp daft 0.0 2017040400 62389 58827 -%%BeginData: 76 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp daft 0.0 2022082100 52828 52694 +%%BeginData: 79 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -13139,6 +16729,7 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /height 0.175 def @@ -13199,7 +16790,9 @@ begin end -} bind def +} +[/barcode] {null def} forall +bind def /daft dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -13213,10 +16806,10 @@ end % --EXAM: fima % --EXOP: backgroundcolor=DD000011 % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp symbol 0.0 2017040400 61969 58378 -%%BeginData: 72 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp symbol 0.0 2022082100 53420 53349 +%%BeginData: 80 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put begin @@ -13227,6 +16820,7 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def % Parse the input options @@ -13261,15 +16855,20 @@ begin /bhs [.625 .625 .625 .625 .625 .625 .625] def /bbs [0 0 0 0 0 0 0] def } bind + /fime { + /sbs [2.25 6.75 2.25 15.75 2.25 6.75 2.25] def + /bhs [.625 .625 .625 .625 .625 .625 .625] def + /bbs [0 0 0 0 0 0 0] def + } bind >> def - % Valiate input + % Valiate input symbols barcode known not { - /bwipp.symbolUnknownSymbol (Unknown symbol name provided) //raiseerror exec + /bwipp.symbolUnknownSymbol (Unknown symbol name provided) //raiseerror exec } if symbols barcode get exec - + % Return the arguments << /ren //renlinear @@ -13283,7 +16882,9 @@ begin end -} bind def +} +[/barcode] {null def} forall +bind def /symbol dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -13292,16 +16893,19 @@ end % --END ENCODER symbol-- % --BEGIN ENCODER pdf417-- -% --REQUIRES preamble raiseerror renmatrix-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix-- % --DESC: PDF417 % --EXAM: This is PDF417 % --EXOP: columns=2 % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp pdf417 0.0 2017040400 225385 234487 -%%BeginData: 873 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp pdf417 0.0 2022082100 202024 204168 +%%BeginData: 911 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /parseinput dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put begin /pdf417 { @@ -13311,6 +16915,7 @@ begin /options exch def /barcode exch def + /ctx null def /dontdraw false def /compact false def /eclevel -1 def @@ -13321,6 +16926,7 @@ begin /ccc false def /raw false def /parse false def + /parsefnc false def % Parse the input options options type /stringtype eq { @@ -13338,26 +16944,98 @@ begin /rows rows cvi def /rowmult rowmult cvr def - % 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 + /pdf417 //loadctx exec + +{ + % Modes and text submodes + /T 0 def /N 1 def /B 2 def + /A 0 def /L 1 def /M 2 def /P 3 def + + % Special function characters for mode switching + /tl -1 def /nl -2 def /bl -3 def /bl6 -4 def /bs -5 def + + % Special function characters for text mode + /al -6 def /ll -7 def /ml -8 def /pl -9 def /as -10 def /ps -11 def + + % Character maps for each state + /charmaps [ + % A L M P + [ (A) (a) (0) (;) ] % 0 + [ (B) (b) (1) (<) ] % 1 + [ (C) (c) (2) (>) ] % 2 + [ (D) (d) (3) (@) ] % 3 + [ (E) (e) (4) ([) ] % 4 + [ (F) (f) (5) 92 ] % 5 + [ (G) (g) (6) (]) ] % 6 + [ (H) (h) (7) (_) ] % 7 + [ (I) (i) (8) (`) ] % 8 + [ (J) (j) (9) (~) ] % 9 + [ (K) (k) (&) (!) ] % 10 + [ (L) (l) 13 13 ] % 11 + [ (M) (m) 9 9 ] % 12 + [ (N) (n) (,) (,) ] % 13 + [ (O) (o) (:) (:) ] % 14 + [ (P) (p) (#) 10 ] % 15 + [ (Q) (q) (-) (-) ] % 16 + [ (R) (r) (.) (.) ] % 17 + [ (S) (s) ($) ($) ] % 18 + [ (T) (t) (/) (/) ] % 19 + [ (U) (u) (+) (") ] % 20 + [ (V) (v) (%) (|) ] % 21 + [ (W) (w) (*) (*) ] % 22 + [ (X) (x) (=) 40 ] % 23 + [ (Y) (y) (^) 41 ] % 24 + [ (Z) (z) pl (?) ] % 25 + [ ( ) ( ) ( ) ({) ] % 26 + [ ll as ll (}) ] % 27 + [ ml ml al (') ] % 28 + [ ps ps ps al ] % 29 + ] def + + % Invert charmaps to give character to value maps for each state + /charvals [ 30 dict 30 dict 30 dict 30 dict ] def + /alltext 104 dict def + 0 1 charmaps length 1 sub { + /i exch def + /encs charmaps i get def + 0 1 3 { + /j exch def + encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required + dup charvals j get exch i put + alltext exch -1 put + } for + } for + + /e 10000 def % "Empty" + + /latlen [ % Bit length of latch between submodes + % To: A L M P From + [ 0 1 1 2 ] % A + [ 2 0 1 2 ] % L + [ 1 1 0 1 ] % M + [ 1 2 2 0 ] % P + ] def + + /latseq [ % Latch sequences between submodes + % To: A L M P From + [ [] [ll] [ml] [ml pl] ] % A + [ [ml al] [] [ml] [ml pl] ] % L + [ [al] [ll] [] [pl] ] % M + [ [al] [al ll] [al ml] [] ] % P + ] def + + /shftlen [ % Bit length of shift to submode + % To: A L M P From + [ e e e 1 ] % A + [ 1 e e 1 ] % L + [ e e e 1 ] % M + [ e e e e ] % P + ] def + + /latchcws << + tl 900 bl 901 bl6 924 nl 902 bs 913 + >> def +} ctxdef raw {/encoding (raw) def} if @@ -13375,9 +17053,6 @@ begin /datcws datcws 0 j getinterval def } if - /barcode [ barcode {} forall ] def - /barlen barcode length def - ccc {/encoding (ccc) def} if /encb { @@ -13414,130 +17089,67 @@ begin putinterval } if out - } bind def - + } def + encoding (byte) eq encoding (ccc) eq or { + /barlen barcode length def /datcws barlen 6 idiv 5 mul barlen 6 mod add 1 add array def datcws 0 barlen 6 mod 0 eq {924} {901} ifelse put - datcws 1 barcode encb putinterval + datcws 1 [ barcode {} forall ] encb putinterval encoding (ccc) eq {/datcws [920 datcws aload pop] def} if } if encoding (auto) eq { - % Modes and text submodes - /T 0 def /N 1 def /B 2 def - /A 0 def /L 1 def /M 2 def /P 3 def - - % Special function characters for mode switching - /tl -1 def /nl -2 def /bl -3 def /bl6 -4 def /bs -5 def - - % Special function characters for text mode - /al -6 def /ll -7 def /ml -8 def /pl -9 def /as -10 def /ps -11 def - - % Character maps for each state - /charmaps [ - % A L M P - [ (A) (a) (0) (;) ] % 0 - [ (B) (b) (1) (<) ] % 1 - [ (C) (c) (2) (>) ] % 2 - [ (D) (d) (3) (@) ] % 3 - [ (E) (e) (4) ([) ] % 4 - [ (F) (f) (5) 92 ] % 5 - [ (G) (g) (6) (]) ] % 6 - [ (H) (h) (7) (_) ] % 7 - [ (I) (i) (8) (`) ] % 8 - [ (J) (j) (9) (~) ] % 9 - [ (K) (k) (&) (!) ] % 10 - [ (L) (l) 13 13 ] % 11 - [ (M) (m) 9 9 ] % 12 - [ (N) (n) (,) (,) ] % 13 - [ (O) (o) (:) (:) ] % 14 - [ (P) (p) (#) 10 ] % 15 - [ (Q) (q) (-) (-) ] % 16 - [ (R) (r) (.) (.) ] % 17 - [ (S) (s) ($) ($) ] % 18 - [ (T) (t) (/) (/) ] % 19 - [ (U) (u) (+) (") ] % 20 - [ (V) (v) (%) (|) ] % 21 - [ (W) (w) (*) (*) ] % 22 - [ (X) (x) (=) 40 ] % 23 - [ (Y) (y) (^) 41 ] % 24 - [ (Z) (z) pl (?) ] % 25 - [ ( ) ( ) ( ) ({) ] % 26 - [ ll as ll (}) ] % 27 - [ ml ml al (') ] % 28 - [ ps ps ps al ] % 29 - ] def - - % Invert charmaps to give character to value maps for each state - /charvals [ 30 dict 30 dict 30 dict 30 dict ] def - /alltext 104 dict def - 0 1 charmaps length 1 sub { - /i exch def - /encs charmaps i get def - 0 1 3 { - /j exch def - encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required - dup charvals j get exch i put - alltext exch -1 put - } for - } for - - /e 10000 def % "Empty" - - /latlen [ % Bit length of latch between submodes - % To: A L M P From - [ 0 1 1 2 ] % A - [ 2 0 1 2 ] % L - [ 1 1 0 1 ] % M - [ 1 2 2 0 ] % P - ] def - - /latseq [ % Latch sequences between submodes - % To: A L M P From - [ [] [ll] [ml] [ml pl] ] % A - [ [ml al] [] [ml] [ml pl] ] % L - [ [al] [ll] [] [pl] ] % M - [ [al] [al ll] [al ml] [] ] % P - ] def - - /shftlen [ % Bit length of shift to submode - % To: A L M P From - [ e e e 1 ] % A - [ 1 e e 1 ] % L - [ e e e 1 ] % M - [ e e e e ] % P - ] def - + % Parse the input + /fncvals << + /parse parse + /parsefnc parsefnc + /eci true + % Predates FNC non-data codewords, but supports ECI + >> def + /msg barcode fncvals //parseinput exec def + /msglen msg length def + % Determine runlengths of digits - /numdigits [ barlen {0} repeat 0 ] def - /numtext [ barlen {0} repeat 0 ] def - /numbytes [ barlen {0} repeat 0 ] def - barlen 1 sub -1 0 { + /numdigits [ msglen {0} repeat 0 ] def + /numtext [ msglen {0} repeat 0 ] def + /numbytes [ msglen {0} repeat 0 ] def + /iseci [ msglen {0} repeat 0 ] def + msglen 1 sub -1 0 { /i exch def - barcode i get dup 48 ge exch 57 le and { + msg i get dup 48 ge exch 57 le and { numdigits i numdigits i 1 add get 1 add put } if - alltext barcode i get known numdigits i get 13 lt and { + alltext msg i get known numdigits i get 13 lt and { numtext i numtext i 1 add get 1 add put } if - numtext i get 5 lt numdigits i get 13 lt and { + msg i get 0 ge numtext i get 5 lt and numdigits i get 13 lt and { numbytes i numbytes i 1 add get 1 add put } if + iseci i msg i get -1000000 le put } for - /numdigits numdigits 0 barlen getinterval def - /numtext numtext 0 barlen getinterval def - /numbytes numbytes 0 barlen getinterval def - + /numdigits numdigits 0 msglen getinterval def + /numtext numtext 0 msglen getinterval def + /numbytes numbytes 0 msglen getinterval def + /seq [] def /seqlen 0 def /state T def /p 0 def { % loop - p barlen eq {exit} if + p msglen eq {exit} if + iseci p get { + /eci msg p get def + /seq [ + seq aload pop + [ eci ] + ] def + /p p 1 add def + /seqlen seqlen eci -1810900 le {2} {eci -1000900 le {3} {2} ifelse} ifelse add def + } { /n numdigits p get def n 13 ge { /seq [ seq aload pop nl - [ barcode p n getinterval aload pop ] + [ msg p n getinterval aload pop ] ] def /state N def /p p n add def @@ -13547,8 +17159,10 @@ begin t 5 ge { /seq [ seq aload pop - state T ne {tl} if - [ barcode p t getinterval aload pop ] + state T ne { + tl + } if + [ msg p t getinterval aload pop ] ] def /state T def /p p t add def @@ -13559,7 +17173,7 @@ begin /seq [ seq aload pop bs - [ barcode p get ] + [ msg p get ] ] def /p p b add def /seqlen seqlen 2 add def @@ -13567,43 +17181,38 @@ begin /seq [ seq aload pop b 6 mod 0 ne {bl} {bl6} ifelse - [ barcode p b getinterval aload pop ] + [ msg p b getinterval aload pop ] ] def /state B def /p p b add def /seqlen seqlen 1 add b add def - } ifelse } ifelse } ifelse + } ifelse } ifelse } ifelse } ifelse } loop - - /latchcws << - tl 900 bl 901 bl6 924 nl 902 bs 913 - >> def - + % Submode encoding functions - /enca {charvals A get exch get} bind def - /encl {charvals L get exch get} bind def - /encm {charvals M get exch get} bind def - /encp {charvals P get exch get} bind def + /enca {charvals A get exch get} def + /encl {charvals L get exch get} def + /encm {charvals M get exch get} def + /encp {charvals P get exch get} def /textencfuncs [ /enca /encl /encm /encp ] def - + /addtotext { text exch l exch put /l l 1 add def - } bind def - + } def + /enct { - /in exch def - + /curlen [ e e e e ] def curlen submode 0 put /curseq [ [] [] [] [] ] def - + % Derive the optimal sequences ending in each submode in { - + /char exch def - + % Check for optimisations in the current sequences by latching from x to y { % loop /imp false def @@ -13624,25 +17233,25 @@ begin } forall imp not {exit} if % Repeat unless no improvement } loop - + % Determine optimal next sequences for each valid encoding /nxtlen [ e e e e ] def /nxtseq 4 array def - + [ A L M P ] { /x exch def - + { % loop for common exit - + charvals x get char known not {exit} if - + % Extend directly /cost curlen x get 1 add def cost nxtlen x get lt { nxtlen x cost put nxtseq x [ curseq x get aload pop char ] put } if - + % Optimise for direct shifts from y to x [ A L M P ] { /y exch def @@ -13658,17 +17267,17 @@ begin } if } if } forall - + exit } loop - + } forall - + /curlen nxtlen def /curseq nxtseq def - + } forall - + % Select the optimal sequence /minseq e def [ A L M P ] { @@ -13678,31 +17287,31 @@ begin /txtseq curseq k get def } if } forall - + % Encode the sequence /text minseq array def /k 0 def /l 0 def { k txtseq length ge {exit} if - + /char txtseq k get def - + % Encode character char textencfuncs submode get load exec addtotext /k k 1 add def - + % Encode shifted next character char as eq char ps eq or { txtseq k get char as eq {enca} {encp} ifelse addtotext /k k 1 add def } if - + % Latches to new submode char al eq {/submode A def} if char ll eq {/submode L def} if char ml eq {/submode M def} if char pl eq {/submode P def} if } loop - + text length 2 mod 1 eq { submode P eq { /pad al encp def @@ -13712,17 +17321,17 @@ begin } ifelse /text [ text aload pop pad ] def } if - + /out text length 2 idiv array def 0 1 out length 1 sub { /k exch def out k text k 2 mul get 30 mul text k 2 mul 1 add get add put } for - + out - - } bind def - + + } def + /encn { /in exch def /out [] def @@ -13755,23 +17364,40 @@ begin /out [ out aload pop cwn aload pop ] def } for out - } bind def - + } def + + /ence { + 0 get neg 1000000 sub + dup 000899 le { % ECI 000000 - 000899 + 927 exch 2 array astore + } { dup 810899 le { % ECI 000900 - 810899 + 926 exch dup 900 idiv 1 sub exch 900 mod 3 array astore + } { dup 811799 le { % ECI 810900 - 811799 + 925 exch 810900 sub 2 array astore + } { + /bwipp.pdf417badECI (PDF417 supports ECIs 000000 to 811799) //raiseerror exec + } ifelse } ifelse } ifelse + } def + /encfuncs [ /enct /encn /encb ] def - + /addtocws { dup datcws j 3 -1 roll putinterval length j add /j exch def - } bind def - + } def + % Encode the sequence /state T def /submode A def /datcws seqlen array def /i 0 def /j 0 def { i seq length ge {exit} if /chars seq i get def - chars type /arraytype eq { % Encode data according to mode - chars encfuncs state get load exec addtocws + chars type /arraytype eq { + chars 0 get -1000000 le { % ECI + chars ence addtocws + } { % Encode data according to mode + chars encfuncs state get load exec addtocws + } ifelse } { % Encode the latch to new state or byte shift [ latchcws chars get ] addtocws chars tl eq {/state T def /submode A def} if @@ -13803,13 +17429,18 @@ begin % To determine size of matrix, number of columns if given by user... columns 0 eq {/columns m k add 3 div sqrt round cvi def} if - columns 1 ge columns 30 le and {/c columns def} if + /c columns 1 ge {columns} {1} ifelse def % ... and rows is greater of those required and that given by user within limits /r m k add 1 add columns div ceiling cvi def % Required r rows lt rows 90 le and {/r rows def} if r 3 lt {/r 3 def} if + % Symbol cannot exceed 90 rows + r 90 gt { + /bwipp.pdf417insufficientCapacity (Insufficient capacity in the symbol) //raiseerror exec + } if + % Opportunistically raise the error level if a better fit to the matrix is possible /maxeclevel c r mul 1 sub m sub ln 2 ln div cvi 1 sub 8 2 copy gt {exch} if pop def maxeclevel eclevel gt { @@ -13837,17 +17468,17 @@ begin } { pop pop 0 } ifelse - } bind def + } def % Generate the coefficients /coeffs [ 1 k {0} repeat ] def 1 1 k { - /i exch def + /i exch def coeffs i coeffs i 1 sub get put i 1 sub -1 1 { /j exch def coeffs j coeffs j 1 sub get coeffs j get rsalog i get rsprod add 929 mod put - } for + } for coeffs 0 coeffs 0 get rsalog i get rsprod put } for /coeffs coeffs 0 coeffs length 1 sub getinterval def @@ -13866,7 +17497,10 @@ begin % Trim the working space from the end of the codewords /cws cws 0 cws length 1 sub getinterval def + options /debugcws known { /bwipp.debugcws cws //raiseerror exec } if + % Base 10 encoding of the bar space successions for the codewords in each cluster +{ /clusters [ [ 120256 125680 128380 120032 125560 128318 108736 119920 108640 86080 108592 86048 @@ -14107,13 +17741,14 @@ begin 67476 69556 67474 69554 116714 ] ] def +} ctxdef % Return the 17 bits for a codeword in a given cluster /cwtobits { clusters exch get exch get /v exch def [ 17 {0} repeat v 2 17 string cvrs {48 sub} forall ] dup length 17 sub 17 getinterval - } bind def + } def % Populate bitmap for the image compact { @@ -14123,7 +17758,7 @@ begin } ifelse /pixs rwid r mul array def - 0 1 r 1 sub { + 0 1 r 1 sub { /i exch def i 3 mod 0 eq { @@ -14166,9 +17801,13 @@ begin dontdraw not //renmatrix if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /pdf417 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -14177,15 +17816,15 @@ end % --END ENCODER pdf417-- % --BEGIN ENCODER pdf417compact-- -% --REQUIRES preamble raiseerror renmatrix pdf417-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix pdf417-- % --DESC: Compact PDF417 % --EXAM: This is compact PDF417 % --EXOP: columns=2 % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp pdf417compact 0.0 2017040400 59527 59274 -%%BeginData: 43 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp pdf417compact 0.0 2022082100 62537 62516 +%%BeginData: 46 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put dup /pdf417 dup /uk.co.terryburton.bwipp findresource put @@ -14197,6 +17836,7 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def % Parse the input options @@ -14218,12 +17858,14 @@ begin args (opt) options put args - + dontdraw not //renmatrix if end -} bind def +} +[/barcode] {null def} forall +bind def /pdf417compact dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -14232,16 +17874,19 @@ end % --END ENCODER pdf417compact-- % --BEGIN ENCODER micropdf417-- -% --REQUIRES preamble raiseerror renmatrix-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix-- % --DESC: MicroPDF417 % --EXAM: MicroPDF417 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp micropdf417 0.0 2017040400 241907 247375 -%%BeginData: 959 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp micropdf417 0.0 2022082100 212812 214997 +%%BeginData: 998 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /parseinput dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put begin /micropdf417 { @@ -14251,6 +17896,7 @@ begin /options exch def /barcode exch def + /ctx null def /dontdraw false def /version (unset) def /columns 0 def @@ -14261,6 +17907,7 @@ begin /ccb false def /raw false def /parse false def + /parsefnc false def % Parse the input options options type /stringtype eq { @@ -14283,26 +17930,94 @@ begin /rows rows cvi def /rowmult rowmult cvr def - % 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 + /micropdf417 //loadctx exec + +{ + % Modes and text submodes + /T 0 def /N 1 def /B 2 def + /A 0 def /L 1 def /M 2 def /P 3 def + + % Special function characters for mode switching + /tl -1 def /nl -2 def /bl -3 def /bl6 -4 def /bs -5 def + + % Special function characters for text mode + /al -6 def /ll -7 def /ml -8 def /pl -9 def /as -10 def /ps -11 def + + % Character maps for each state + /charmaps [ + % A L M P + [ (A) (a) (0) (;) ] % 0 + [ (B) (b) (1) (<) ] % 1 + [ (C) (c) (2) (>) ] % 2 + [ (D) (d) (3) (@) ] % 3 + [ (E) (e) (4) ([) ] % 4 + [ (F) (f) (5) 92 ] % 5 + [ (G) (g) (6) (]) ] % 6 + [ (H) (h) (7) (_) ] % 7 + [ (I) (i) (8) (`) ] % 8 + [ (J) (j) (9) (~) ] % 9 + [ (K) (k) (&) (!) ] % 10 + [ (L) (l) 13 13 ] % 11 + [ (M) (m) 9 9 ] % 12 + [ (N) (n) (,) (,) ] % 13 + [ (O) (o) (:) (:) ] % 14 + [ (P) (p) (#) 10 ] % 15 + [ (Q) (q) (-) (-) ] % 16 + [ (R) (r) (.) (.) ] % 17 + [ (S) (s) ($) ($) ] % 18 + [ (T) (t) (/) (/) ] % 19 + [ (U) (u) (+) (") ] % 20 + [ (V) (v) (%) (|) ] % 21 + [ (W) (w) (*) (*) ] % 22 + [ (X) (x) (=) 40 ] % 23 + [ (Y) (y) (^) 41 ] % 24 + [ (Z) (z) pl (?) ] % 25 + [ ( ) ( ) ( ) ({) ] % 26 + [ ll as ll (}) ] % 27 + [ ml ml al (') ] % 28 + [ ps ps ps al ] % 29 + ] def + + % Invert charmaps to give character to value maps for each state + /charvals [ 30 dict 30 dict 30 dict 30 dict ] def + /alltext 104 dict def + 0 1 charmaps length 1 sub { + /i exch def + /encs charmaps i get def + 0 1 3 { + /j exch def + encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required + dup charvals j get exch i put + alltext exch -1 put + } for + } for + + /e 10000 def % "Empty" + + /latlen [ % Bit length of latch between submodes + % To: A L M P From + [ 0 1 1 2 ] % A + [ 2 0 1 2 ] % L + [ 1 1 0 1 ] % M + [ 1 2 2 0 ] % P + ] def + + /latseq [ % Latch sequences between submodes + % To: A L M P From + [ [] [ll] [ml] [ml pl] ] % A + [ [ml al] [] [ml] [ml pl] ] % L + [ [al] [ll] [] [pl] ] % M + [ [al] [al ll] [al ml] [] ] % P + ] def + + /shftlen [ % Bit length of shift to submode + % To: A L M P From + [ e e e 1 ] % A + [ 1 e e 1 ] % L + [ e e e 1 ] % M + [ e e e e ] % P + ] def +} ctxdef raw {/encoding (raw) def} if cca {/encoding (cca) def} if @@ -14321,9 +18036,6 @@ begin /datcws datcws 0 j getinterval def } if - /barcode [ barcode {} forall ] def - /barlen barcode length def - ccb {/encoding (ccb) def} if /encb { @@ -14360,130 +18072,67 @@ begin putinterval } if out - } bind def + } def encoding (byte) eq encoding (ccb) eq or { + /barlen barcode length def /datcws barlen 6 idiv 5 mul barlen 6 mod add 1 add array def datcws 0 barlen 6 mod 0 eq {924} {901} ifelse put - datcws 1 barcode encb putinterval + datcws 1 [ barcode {} forall ] encb putinterval encoding (ccb) eq {/datcws [920 datcws aload pop] def} if } if encoding (auto) eq { - % Modes and text submodes - /T 0 def /N 1 def /B 2 def - /A 0 def /L 1 def /M 2 def /P 3 def - - % Special function characters for mode switching - /tl -1 def /nl -2 def /bl -3 def /bl6 -4 def /bs -5 def - - % Special function characters for text mode - /al -6 def /ll -7 def /ml -8 def /pl -9 def /as -10 def /ps -11 def - - % Character maps for each state - /charmaps [ - % A L M P - [ (A) (a) (0) (;) ] % 0 - [ (B) (b) (1) (<) ] % 1 - [ (C) (c) (2) (>) ] % 2 - [ (D) (d) (3) (@) ] % 3 - [ (E) (e) (4) ([) ] % 4 - [ (F) (f) (5) 92 ] % 5 - [ (G) (g) (6) (]) ] % 6 - [ (H) (h) (7) (_) ] % 7 - [ (I) (i) (8) (`) ] % 8 - [ (J) (j) (9) (~) ] % 9 - [ (K) (k) (&) (!) ] % 10 - [ (L) (l) 13 13 ] % 11 - [ (M) (m) 9 9 ] % 12 - [ (N) (n) (,) (,) ] % 13 - [ (O) (o) (:) (:) ] % 14 - [ (P) (p) (#) 10 ] % 15 - [ (Q) (q) (-) (-) ] % 16 - [ (R) (r) (.) (.) ] % 17 - [ (S) (s) ($) ($) ] % 18 - [ (T) (t) (/) (/) ] % 19 - [ (U) (u) (+) (") ] % 20 - [ (V) (v) (%) (|) ] % 21 - [ (W) (w) (*) (*) ] % 22 - [ (X) (x) (=) 40 ] % 23 - [ (Y) (y) (^) 41 ] % 24 - [ (Z) (z) pl (?) ] % 25 - [ ( ) ( ) ( ) ({) ] % 26 - [ ll as ll (}) ] % 27 - [ ml ml al (') ] % 28 - [ ps ps ps al ] % 29 - ] def - - % Invert charmaps to give character to value maps for each state - /charvals [ 30 dict 30 dict 30 dict 30 dict ] def - /alltext 104 dict def - 0 1 charmaps length 1 sub { - /i exch def - /encs charmaps i get def - 0 1 3 { - /j exch def - encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required - dup charvals j get exch i put - alltext exch -1 put - } for - } for - - /e 10000 def % "Empty" - - /latlen [ % Bit length of latch between submodes - % To: A L M P From - [ 0 1 1 2 ] % A - [ 2 0 1 2 ] % L - [ 1 1 0 1 ] % M - [ 1 2 2 0 ] % P - ] def - - /latseq [ % Latch sequences between submodes - % To: A L M P From - [ [] [ll] [ml] [ml pl] ] % A - [ [ml al] [] [ml] [ml pl] ] % L - [ [al] [ll] [] [pl] ] % M - [ [al] [al ll] [al ml] [] ] % P - ] def - - /shftlen [ % Bit length of shift to submode - % To: A L M P From - [ e e e 1 ] % A - [ 1 e e 1 ] % L - [ e e e 1 ] % M - [ e e e e ] % P - ] def - + % Parse the input + /fncvals << + /parse parse + /parsefnc parsefnc + /eci true + % Predates FNC non-data codewords, but supports ECI + >> def + /msg barcode fncvals //parseinput exec def + /msglen msg length def + % Determine runlengths of digits - /numdigits [ barlen {0} repeat 0 ] def - /numtext [ barlen {0} repeat 0 ] def - /numbytes [ barlen {0} repeat 0 ] def - barlen 1 sub -1 0 { + /numdigits [ msglen {0} repeat 0 ] def + /numtext [ msglen {0} repeat 0 ] def + /numbytes [ msglen {0} repeat 0 ] def + /iseci [ msglen {0} repeat ] def + msglen 1 sub -1 0 { /i exch def - barcode i get dup 48 ge exch 57 le and { + msg i get dup 48 ge exch 57 le and { numdigits i numdigits i 1 add get 1 add put } if - alltext barcode i get known numdigits i get 13 lt and { + alltext msg i get known numdigits i get 13 lt and { numtext i numtext i 1 add get 1 add put } if - numtext i get 5 lt numdigits i get 13 lt and { + msg i get 0 ge numtext i get 5 lt and numdigits i get 13 lt and { numbytes i numbytes i 1 add get 1 add put } if + iseci i msg i get -1000000 le put } for - /numdigits numdigits 0 barlen getinterval def - /numtext numtext 0 barlen getinterval def - /numbytes numbytes 0 barlen getinterval def - + /numdigits numdigits 0 msglen getinterval def + /numtext numtext 0 msglen getinterval def + /numbytes numbytes 0 msglen getinterval def + /seq [] def /seqlen 0 def /state B def /p 0 def { % loop - p barlen eq {exit} if + p msglen eq {exit} if + iseci p get { + /eci msg p get def + /seq [ + seq aload pop + [ eci ] + ] def + /p p 1 add def + /seqlen seqlen eci -1810900 le {2} {eci -1000900 le {3} {2} ifelse} ifelse add def + } { /n numdigits p get def n 13 ge { /seq [ seq aload pop nl - [ barcode p n getinterval aload pop ] + [ msg p n getinterval aload pop ] ] def /state N def /p p n add def @@ -14493,8 +18142,10 @@ begin t 5 ge { /seq [ seq aload pop - state T ne {tl} if - [ barcode p t getinterval aload pop ] + state T ne { + tl + } if + [ msg p t getinterval aload pop ] ] def /state T def /p p t add def @@ -14505,7 +18156,7 @@ begin /seq [ seq aload pop bs - [ barcode p get ] + [ msg p get ] ] def /p p b add def /seqlen seqlen 2 add def @@ -14513,43 +18164,43 @@ begin /seq [ seq aload pop b 6 mod 0 ne {bl} {bl6} ifelse - [ barcode p b getinterval aload pop ] + [ msg p b getinterval aload pop ] ] def /state B def /p p b add def /seqlen seqlen 1 add b add def - } ifelse } ifelse } ifelse + } ifelse } ifelse } ifelse } ifelse } loop - + /latchcws << tl 900 bl 901 bl6 924 nl 902 bs 913 >> def - + % Submode encoding functions - /enca {charvals A get exch get} bind def - /encl {charvals L get exch get} bind def - /encm {charvals M get exch get} bind def - /encp {charvals P get exch get} bind def + /enca {charvals A get exch get} def + /encl {charvals L get exch get} def + /encm {charvals M get exch get} def + /encp {charvals P get exch get} def /textencfuncs [ /enca /encl /encm /encp ] def - + /addtotext { text exch l exch put /l l 1 add def - } bind def - + } def + /enct { - + /in exch def - + /curlen [ e e e e ] def curlen submode 0 put /curseq [ [] [] [] [] ] def - + % Derive the optimal sequences ending in each submode in { - + /char exch def - + % Check for optimisations in the current sequences by latching from x to y { % loop /imp false def @@ -14570,25 +18221,25 @@ begin } forall imp not {exit} if % Repeat unless no improvement } loop - + % Determine optimal next sequences for each valid encoding /nxtlen [ e e e e ] def /nxtseq 4 array def - + [ A L M P ] { /x exch def - + { % loop for common exit - + charvals x get char known not {exit} if - + % Extend directly /cost curlen x get 1 add def cost nxtlen x get lt { nxtlen x cost put nxtseq x [ curseq x get aload pop char ] put } if - + % Optimise for direct shifts from y to x [ A L M P ] { /y exch def @@ -14604,17 +18255,17 @@ begin } if } if } forall - + exit } loop - + } forall - + /curlen nxtlen def /curseq nxtseq def - + } forall - + % Select the optimal sequence /minseq e def [ A L M P ] { @@ -14624,31 +18275,31 @@ begin /txtseq curseq k get def } if } forall - + % Encode the sequence /text minseq array def /k 0 def /l 0 def { k txtseq length ge {exit} if - + /char txtseq k get def - + % Encode character char textencfuncs submode get load exec addtotext /k k 1 add def - + % Encode shifted next character char as eq char ps eq or { txtseq k get char as eq {enca} {encp} ifelse addtotext /k k 1 add def } if - + % Latches to new submode char al eq {/submode A def} if char ll eq {/submode L def} if char ml eq {/submode M def} if char pl eq {/submode P def} if } loop - + text length 2 mod 1 eq { submode P eq { /pad al encp def @@ -14658,17 +18309,17 @@ begin } ifelse /text [ text aload pop pad ] def } if - + /out text length 2 idiv array def 0 1 out length 1 sub { /k exch def out k text k 2 mul get 30 mul text k 2 mul 1 add get add put } for - + out - - } bind def - + + } def + /encn { /in exch def /out [] def @@ -14701,23 +18352,40 @@ begin /out [ out aload pop cwn aload pop ] def } for out - } bind def - + } def + + /ence { + 0 get neg 1000000 sub + dup 000899 le { % ECI 000000 - 000899 + 927 exch 2 array astore + } { dup 810899 le { % ECI 000900 - 810899 + 926 exch dup 900 idiv 1 sub exch 900 mod 3 array astore + } { dup 811799 le { % ECI 810900 - 811799 + 925 exch 810900 sub 2 array astore + } { + /bwipp.pdf417badECI (PDF417 supports ECIs 000000 to 811799) //raiseerror exec + } ifelse } ifelse } ifelse + } def + /encfuncs [ /enct /encn /encb ] def - + /addtocws { dup datcws j 3 -1 roll putinterval length j add /j exch def - } bind def - + } def + % Encode the sequence - /state T def /submode A def + % No need to set state as seq will always begin with a latch, unlike for pdf417 /datcws seqlen array def /i 0 def /j 0 def { i seq length ge {exit} if /chars seq i get def chars type /arraytype eq { % Encode data according to mode - chars encfuncs state get load exec addtocws + chars 0 get -1000000 le { % ECI + chars ence addtocws + } { % Encode data according to mode + chars encfuncs state get load exec addtocws + } ifelse } { % Encode the latch to new state or byte shift [ latchcws chars get ] addtocws chars tl eq {/state T def /submode A def} if @@ -14733,9 +18401,32 @@ begin /datcws datcws 0 j getinterval def } if +{ % Basic metrics for the each symbol % c r ecw rl rc rr - /metrics [ + /ccametrics [ + [ 2 5 4 39 0 19 ] + [ 2 6 4 1 0 33 ] + [ 2 7 5 32 0 12 ] + [ 2 8 5 8 0 40 ] + [ 2 9 6 14 0 46 ] + [ 2 10 6 43 0 23 ] + [ 2 12 7 20 0 52 ] + [ 3 4 4 11 43 23 ] + [ 3 5 5 1 33 13 ] + [ 3 6 6 5 37 17 ] + [ 3 7 7 15 47 27 ] + [ 3 8 7 21 1 33 ] + [ 4 3 4 40 20 52 ] + [ 4 4 5 43 23 3 ] + [ 4 5 6 46 26 6 ] + [ 4 6 7 34 14 46 ] + [ 4 7 8 29 9 41 ] + ] def + + % Basic metrics for the each symbol + % c r ecw rl rc rr + /nonccametrics [ [ 1 11 7 1 0 9 ] [ 1 14 7 8 0 8 ] [ 1 17 7 36 0 36 ] @@ -14771,29 +18462,9 @@ begin [ 4 38 44 15 31 47 ] [ 4 44 50 1 25 49 ] ] def +} ctxdef - % Basic metrics for the each symbol - % c r ecw rl rc rr - /ccametrics [ - [ 2 5 4 39 0 19 ] - [ 2 6 4 1 0 33 ] - [ 2 7 5 32 0 12 ] - [ 2 8 5 8 0 40 ] - [ 2 9 6 14 0 46 ] - [ 2 10 6 43 0 23 ] - [ 2 12 7 20 0 52 ] - [ 3 4 4 11 43 23 ] - [ 3 5 5 1 33 13 ] - [ 3 6 6 5 37 17 ] - [ 3 7 7 15 47 27 ] - [ 3 8 7 21 1 33 ] - [ 4 3 4 40 20 52 ] - [ 4 4 5 43 23 3 ] - [ 4 5 6 46 26 6 ] - [ 4 6 7 34 14 46 ] - [ 4 7 8 29 9 41 ] - ] def - cca {/metrics ccametrics def} if + /metrics cca {ccametrics} {nonccametrics} ifelse def % Select metrics of an appropriate symbol /urows rows def @@ -14825,9 +18496,11 @@ begin cws n [ k {0} repeat 0 ] putinterval % Calculate the log and anti-log tables +{ /rsalog [ 1 928 {dup 3 mul 929 mod} repeat ] def /rslog 929 array def 1 1 928 {dup rsalog exch get exch rslog 3 1 roll put} for +} ctxdef % Function to calculate the product in the field /rsprod { @@ -14836,17 +18509,17 @@ begin } { pop pop 0 } ifelse - } bind def + } def % Generate the coefficients /coeffs [ 1 k {0} repeat ] def 1 1 k { - /i exch def + /i exch def coeffs i coeffs i 1 sub get put i 1 sub -1 1 { /j exch def coeffs j coeffs j 1 sub get coeffs j get rsalog i get rsprod add 929 mod put - } for + } for coeffs 0 coeffs 0 get rsalog i get rsprod put } for /coeffs coeffs 0 coeffs length 1 sub getinterval def @@ -14865,6 +18538,9 @@ begin % Trim the working space from the end of the codewords /cws cws 0 cws length 1 sub getinterval def + options /debugcws known { /bwipp.debugcws cws //raiseerror exec } if + +{ % Base 10 encoding of the bar space successions for the codewords in each cluster /clusters [ [ @@ -15121,20 +18797,21 @@ begin 654 652 668 664 696 688 656 720 592 600 604 732 734 ] ] def +} ctxdef % Return the 17 bits for a codeword in a given cluster /cwtobits { clusters exch get exch get /v exch def [ 17 {0} repeat v 2 17 string cvrs {48 sub} forall ] dup length 17 sub 17 getinterval - } bind def + } def % Return the 10 bits for a row address pattern /raptobits { raps exch get exch get /v exch def [ 10 {0} repeat v 2 10 string cvrs {48 sub} forall ] dup length 10 sub 10 getinterval - } bind def + } def % Populate bitmap for the image /rwid [38 55 82 99] c 1 sub get def @@ -15192,9 +18869,13 @@ begin dontdraw not //renmatrix if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /micropdf417 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -15203,16 +18884,19 @@ end % --END ENCODER micropdf417-- % --BEGIN ENCODER datamatrix-- -% --REQUIRES preamble raiseerror renmatrix-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix-- % --DESC: Data Matrix % --EXAM: This is Data Matrix! % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp datamatrix 0.0 2017040400 258183 263444 -%%BeginData: 889 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp datamatrix 0.0 2022082100 213189 215115 +%%BeginData: 934 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /parseinput dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put begin /datamatrix { @@ -15222,6 +18906,7 @@ begin /options exch def /barcode exch def + /ctx null def /dontdraw false def /columns 0 def /rows 0 def @@ -15229,7 +18914,12 @@ begin /version (unset) def /parse false def /parsefnc false def - /dmre false def + /encoding (auto) def + /mailmark false def + /raw false def + /dmre false def % Alias for isodmre + /dindmre false def + /isodmre false def % Parse the input options options type /stringtype eq { @@ -15251,121 +18941,67 @@ begin /columns columns cvi def /rows rows cvi def - % 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 + /isodmre dmre def - % Macro 05/06 compression of [)>{RS}05/06{GS}...{RS}{EOT} structured data - /mac05comp false def - /mac06comp false def - barcode length 9 ge { - barcode 0 7 getinterval - dup ([\)>\03605\035) eq - exch ([\)>\03606\035) eq or - barcode barcode length 2 sub 2 getinterval (\036\004) eq and { - barcode 5 get 53 eq {/mac05comp} {/mac06comp} ifelse true def - /barcode barcode 7 barcode length 9 sub getinterval def - } if - } if - - /barlen barcode length def - - % Convert input into bytes accounting for FNC characters - /fnc1 -1 def /prog -2 def /m05 -3 def /m06 -4 def - /fncvals << - (FNC1) fnc1 - (PROG) prog - (MAC5) m05 - (MAC6) m06 - >> 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 - - % Prefix the Macro 05/06 compression indicator - mac05comp { /msg [ m05 msg aload pop ] def } if - mac06comp { /msg [ m06 msg aload pop ] def } if - - /msglen msg length def + /datamatrix //loadctx exec + % TODO make this "static" % Basic metrics for the each symbol - % rows cols regh regv rscw rsbl + % rows cols regh regv rscw rsbl /metrics [ % Standard square symbols - [ 10 10 1 1 5 1 ] - [ 12 12 1 1 7 1 ] - [ 14 14 1 1 10 1 ] - [ 16 16 1 1 12 1 ] - [ 18 18 1 1 14 1 ] - [ 20 20 1 1 18 1 ] - [ 22 22 1 1 20 1 ] - [ 24 24 1 1 24 1 ] - [ 26 26 1 1 28 1 ] - [ 32 32 2 2 36 1 ] - [ 36 36 2 2 42 1 ] - [ 40 40 2 2 48 1 ] - [ 44 44 2 2 56 1 ] - [ 48 48 2 2 68 1 ] - [ 52 52 2 2 84 2 ] - [ 64 64 4 4 112 2 ] - [ 72 72 4 4 144 4 ] - [ 80 80 4 4 192 4 ] - [ 88 88 4 4 224 4 ] - [ 96 96 4 4 272 4 ] - [ 104 104 4 4 336 6 ] - [ 120 120 6 6 408 6 ] - [ 132 132 6 6 496 8 ] - [ 144 144 6 6 620 10 ] + [ 10 10 1 1 5 1 ] + [ 12 12 1 1 7 1 ] + [ 14 14 1 1 10 1 ] + [ 16 16 1 1 12 1 ] + [ 18 18 1 1 14 1 ] + [ 20 20 1 1 18 1 ] + [ 22 22 1 1 20 1 ] + [ 24 24 1 1 24 1 ] + [ 26 26 1 1 28 1 ] + [ 32 32 2 2 36 1 ] + [ 36 36 2 2 42 1 ] + [ 40 40 2 2 48 1 ] + [ 44 44 2 2 56 1 ] + [ 48 48 2 2 68 1 ] + [ 52 52 2 2 84 2 ] + [ 64 64 4 4 112 2 ] + [ 72 72 4 4 144 4 ] + [ 80 80 4 4 192 4 ] + [ 88 88 4 4 224 4 ] + [ 96 96 4 4 272 4 ] + [ 104 104 4 4 336 6 ] + [ 120 120 6 6 408 6 ] + [ 132 132 6 6 496 8 ] + [ 144 144 6 6 620 10 ] % Optional rectangular symbols - [ 8 18 1 1 7 1 ] - [ 8 32 1 2 11 1 ] - dmre { [ 8 48 1 2 15 1 ] } if - dmre { [ 8 64 1 4 18 1 ] } if - [ 12 26 1 1 14 1 ] - [ 12 36 1 2 18 1 ] - dmre { [ 12 64 1 4 27 1 ] } if - [ 16 36 1 2 24 1 ] - [ 16 48 1 2 28 1 ] - dmre { [ 16 64 1 4 36 1 ] } if - dmre { [ 24 32 1 2 28 1 ] } if - dmre { [ 24 36 1 2 33 1 ] } if - dmre { [ 24 48 1 2 41 1 ] } if - dmre { [ 24 64 1 4 46 1 ] } if - dmre { [ 26 32 1 2 32 1 ] } if - dmre { [ 26 40 1 2 38 1 ] } if - dmre { [ 26 48 1 2 42 1 ] } if - dmre { [ 26 64 1 4 50 1 ] } if + [ 8 18 1 1 7 1 ] + [ 8 32 1 2 11 1 ] + dindmre isodmre or { [ 8 48 1 2 15 1 ] } if + dindmre isodmre or { [ 8 64 1 4 18 1 ] } if + isodmre { [ 8 80 1 4 22 1 ] } if + isodmre { [ 8 96 1 4 28 1 ] } if + isodmre { [ 8 120 1 6 32 1 ] } if + isodmre { [ 8 144 1 6 36 1 ] } if + [ 12 26 1 1 14 1 ] + [ 12 36 1 2 18 1 ] + dindmre isodmre or { [ 12 64 1 4 27 1 ] } if + isodmre { [ 12 88 1 4 36 1 ] } if + [ 16 36 1 2 24 1 ] + [ 16 48 1 2 28 1 ] + dindmre isodmre or { [ 16 64 1 4 36 1 ] } if + isodmre { [ 20 36 1 2 28 1 ] } if + isodmre { [ 20 44 1 2 34 1 ] } if + isodmre { [ 20 64 1 4 42 1 ] } if + isodmre { [ 22 48 1 2 38 1 ] } if + dindmre { [ 24 32 1 2 28 1 ] } if + dindmre { [ 24 36 1 2 33 1 ] } if + dindmre isodmre or { [ 24 48 1 2 41 1 ] } if + dindmre isodmre or { [ 24 64 1 4 46 1 ] } if + dindmre { [ 26 32 1 2 32 1 ] } if + dindmre isodmre or { [ 26 40 1 2 38 1 ] } if + dindmre isodmre or { [ 26 48 1 2 42 1 ] } if + dindmre isodmre or { [ 26 64 1 4 50 1 ] } if ] def % Create array of codewords remaining to make a full symbol @@ -15399,11 +19035,13 @@ begin } if } for +{ % Special characters + /fnc1 -1 def /prog -2 def /m05 -3 def /m06 -4 def /lC -5 def /lB -6 def /lX -7 def /lT -8 def /lE -9 def /unl -10 def /sapp -11 def /usft -12 def /sft1 -13 def /sft2 -14 def /sft3 -15 def /eci -16 def /pad -17 def /unlcw 254 def - + /Avals << 0 1 128 {dup 1 add} for pad 129 @@ -15416,7 +19054,7 @@ begin /Avals << Avals {[exch]} forall >> def - + /CNvals << sft1 0 sft2 1 @@ -15440,7 +19078,7 @@ begin C2vals {[exch CNvals sft2 get exch]} forall C3vals {[exch CNvals sft3 get exch]} forall >> def - + /TNvals << sft1 0 sft2 1 @@ -15468,7 +19106,7 @@ begin T2vals {[exch TNvals sft2 get exch]} forall T3vals {[exch TNvals sft3 get exch]} forall >> def - + % Extended ASCII mappings 128 1 255 { /i exch def @@ -15476,7 +19114,7 @@ begin Cvals i [ Cvals usft get aload pop Cvals i 128 sub get aload pop ] put Tvals i [ Tvals usft get aload pop Tvals i 128 sub get aload pop ] put } for - + /Xvals << 13 0 42 1 @@ -15488,7 +19126,7 @@ begin /Xvals << Xvals {[exch]} forall >> def - + /Evals << 64 1 94 {dup 64 sub} for unl 31 @@ -15497,345 +19135,425 @@ begin /Evals << Evals {[exch]} forall >> def - + /Bvals << 0 1 255 {dup} for >> def /Bvals << Bvals {[exch]} forall >> def - + /encvals [ Avals Cvals Tvals Xvals Evals Bvals ] def - - /numD [ msglen {0} repeat 0 ] def - /nextXterm [ msglen {0} repeat 9999 ] def - /nextNonX [ msglen {0} repeat 9999 ] def - msglen 1 sub -1 0 { - /i exch def - /barchar msg i get def - barchar 48 ge barchar 57 le and { - numD i numD i 1 add get 1 add put - } if - barchar 13 eq barchar 42 eq or barchar 62 eq or { - nextXterm i 0 put - } { - nextXterm i nextXterm i 1 add get 1 add put - } ifelse - Xvals barchar known not { - nextNonX i 0 put - } { - nextNonX i nextNonX i 1 add get 1 add put - } ifelse - } for - /nextXterm [nextXterm {dup 10000 gt {pop 10000} if} forall] def - /nextNonX [nextNonX {dup 10000 gt {pop 10000} if} forall] def - - /isD {char 48 ge char 57 le and} bind def - /isC {CNvals char known} bind def - /isT {TNvals char known} bind def - /isX {Xvals char known} bind def - /isE {Evals char known} bind def - /isEA {char 127 gt} bind def - /isFN {char 0 lt} bind def - /XtermFirst {dup nextXterm exch get exch nextNonX exch get lt} bind def - + /A 0 def /C 1 def /T 2 def /X 3 def /E 4 def /B 5 def +} ctxdef - /lookup { - /ac 1 def /cc 2 def /tc 2 def /xc 2 def /ec 2 def /bc 2.25 def - mode A eq {/ac 0 def /cc 1 def /tc 1 def /xc 1 def /ec 1 def /bc 1.25 def} if - mode C eq {/cc 0 def} if - mode T eq {/tc 0 def} if - mode X eq {/xc 0 def} if - mode E eq {/ec 0 def} if - mode B eq {/bc 0 def} if - 1 { % common exit - /k 0 def { % loop - i k add msglen eq { - [/ac /cc /tc /xc /ec /bc] {dup load ceiling def} forall - true [ cc tc xc ec bc] {ac exch le and} forall {A exit} if - true [ac cc tc xc ec ] {bc exch lt and} forall {B exit} if - true [ac cc tc xc bc] {ec exch lt and} forall {E exit} if - true [ac cc xc ec bc] {tc exch lt and} forall {T exit} if - true [ac cc tc ec bc] {xc exch lt and} forall {X exit} if - C exit - } if - /char msg i k add get def - /ac ac isD {1 2 div add} {isEA {ceiling 2 add} {ceiling 1 add} ifelse} ifelse def - /cc cc isC {2 3 div add} {isEA { 8 3 div add } { 4 3 div add } ifelse} ifelse def - /tc tc isT {2 3 div add} {isEA { 8 3 div add } { 4 3 div add } ifelse} ifelse def - /xc xc isX {2 3 div add} {isEA {13 3 div add } {10 3 div add } ifelse} ifelse def - /ec ec isE {3 4 div add} {isEA {17 4 div add } {13 4 div add } ifelse} ifelse def - /bc bc isFN {4 add} {1 add} ifelse def - k 4 ge { - true [ cc tc xc ec bc] {ac 1 add exch le and} forall {A exit} if - bc 1 add ac le {B exit} if - true [ cc tc xc ec ] {bc 1 add exch lt and} forall {B exit} if - true [ac cc tc xc bc] {ec 1 add exch lt and} forall {E exit} if - true [ac cc xc ec bc] {tc 1 add exch lt and} forall {T exit} if - true [ac cc tc ec bc] {xc 1 add exch lt and} forall {X exit} if - true [ac tc ec bc] {cc 1 add exch lt and} forall { - cc xc lt {C exit} if - cc xc eq {i k add 1 add XtermFirst {X exit} {C exit} ifelse} if - } if + raw {/encoding (raw) def} if + + encoding (raw) eq { + /cws barcode length array def + /i 0 def /j 0 def + { % loop + i barcode length eq {exit} if + /cw barcode i 1 add 3 getinterval cvi def + cws j cw put + /i i 4 add def + /j j 1 add def + } loop + /cws cws 0 j getinterval def + } if % encoding=raw + + encoding (auto) eq { + + % Parse the input + /fncvals << + /parse parse + /parsefnc parsefnc + /eci true + (FNC1) fnc1 + (PROG) prog +% (MAC5) m05 Encoded automatically +% (MAC6) m06 Encoded automatically + >> def + /msg barcode fncvals //parseinput exec def + /msglen msg length def + + % Macro 05/06 compression of [)>{RS}05/06{GS}...{RS}{EOT} structured data + msglen 9 ge { + msg 0 7 getinterval aload pop + 29 eq exch pop exch 48 eq and exch % [)>{RS}0*{GS}... + 30 eq and exch 62 eq and exch 41 eq and exch 91 eq and { + msg msglen 2 sub 2 getinterval aload pop + 4 eq exch 30 eq and { % ...{RS}{EOT} + msg 5 get 53 eq { % ...5... + /msg [ m05 msg 7 msg length 9 sub getinterval aload pop ] def + } { + msg 5 get 54 eq { % ...6... + /msg [ m06 msg 7 msg length 9 sub getinterval aload pop ] def + } if + } ifelse } if - /k k 1 add def - } loop - } repeat - } bind def - - /addtocws { - dup cws exch j exch putinterval - /j exch length j add def - } bind def - - /encA { - 1 { % Common exit - numD i get 2 ge { - 2 string dup 0 msg i get put dup 1 msg i 1 add get put Avals exch get addtocws - /i i 2 add def - exit } if - /newmode lookup def - newmode mode ne { - Avals [-1 lC lT lX lE lB] newmode get get addtocws - /mode newmode def - exit + } if + /msglen msg length def + + /numD [ msglen {0} repeat 0 ] def + /nextXterm [ msglen {0} repeat 9999 ] def + /nextNonX [ msglen {0} repeat 9999 ] def + /isECI [ msglen {false} repeat false ] def + msglen 1 sub -1 0 { + /i exch def + /barchar msg i get def + barchar 48 ge barchar 57 le and { + numD i numD i 1 add get 1 add put } if - Avals msg i get get addtocws - /i i 1 add def - exit - } repeat - } bind def - - /CTXvalstocws { - /in exch def - mark - 0 3 in length 1 sub { - in exch 3 getinterval 0 exch {add 40 mul} forall 40 idiv 1 add - dup 256 idiv exch 256 mod + barchar 13 eq barchar 42 eq or barchar 62 eq or { + nextXterm i 0 put + } { + nextXterm i nextXterm i 1 add get 1 add put + } ifelse + Xvals barchar known not { + nextNonX i 0 put + } { + nextNonX i nextNonX i 1 add get 1 add put + } ifelse + isECI i barchar -1000000 le put } for - counttomark array astore exch pop - } bind def - - /encCTX { - /p 0 def - /ctxvals 2500 array def - - % Lookup the values for each character - { - i msglen eq {exit} if - encvals mode get msg i get known not {exit} if - p 3 mod 0 eq { - lookup mode ne { - ctxvals 0 p getinterval CTXvalstocws addtocws - [unlcw] addtocws - /mode A def + /nextXterm [nextXterm {dup 10000 gt {pop 10000} if} forall] def + /nextNonX [nextNonX {dup 10000 gt {pop 10000} if} forall] def + + /isD {char 48 ge char 57 le and} def + /isC {CNvals char known} def + /isT {TNvals char known} def + /isX {Xvals char known} def + /isE {Evals char known} def + /isEA {char 127 gt} def + /isFN {char 0 lt} def + /XtermFirst {dup nextXterm exch get exch nextNonX exch get lt} def + + /lookup { + /ac 1 def /cc 2 def /tc 2 def /xc 2 def /ec 2 def /bc 2.25 def + mode A eq {/ac 0 def /cc 1 def /tc 1 def /xc 1 def /ec 1 def /bc 1.25 def} if + mode C eq {/cc 0 def} if + mode T eq {/tc 0 def} if + mode X eq {/xc 0 def} if + mode E eq {/ec 0 def} if + mode B eq {/bc 0 def} if + 1 { % common exit + isECI i get {A exit} if % ECI only in ASCII + mailmark i 45 lt and {C exit} if % Mailmark is C40 only for 45 characters + /k 0 def { % loop + i k add msglen eq { + [/ac /cc /tc /xc /ec /bc] {dup load ceiling def} forall + true [ cc tc xc ec bc] {ac exch le and} forall {A exit} if + true [ac cc tc xc ec ] {bc exch lt and} forall {B exit} if + true [ac cc tc xc bc] {ec exch lt and} forall {E exit} if + true [ac cc xc ec bc] {tc exch lt and} forall {T exit} if + true [ac cc tc ec bc] {xc exch lt and} forall {X exit} if + C exit + } if + /char msg i k add get def + /ac ac isD {1 2 div add} {isEA {ceiling 2 add} {ceiling 1 add} ifelse} ifelse def + /cc cc isC {2 3 div add} {isEA { 8 3 div add } { 4 3 div add } ifelse} ifelse def + /tc tc isT {2 3 div add} {isEA { 8 3 div add } { 4 3 div add } ifelse} ifelse def + /xc xc isX {2 3 div add} {isEA {13 3 div add } {10 3 div add } ifelse} ifelse def + /ec ec isE {3 4 div add} {isEA {17 4 div add } {13 4 div add } ifelse} ifelse def + /bc bc isFN {4 add} {1 add} ifelse def + k 4 ge { + true [ cc tc xc ec bc] {ac 1 add exch le and} forall {A exit} if + bc 1 add ac le {B exit} if + true [ cc tc xc ec ] {bc 1 add exch lt and} forall {B exit} if + true [ac cc tc xc bc] {ec 1 add exch lt and} forall {E exit} if + true [ac cc xc ec bc] {tc 1 add exch lt and} forall {T exit} if + true [ac cc tc ec bc] {xc 1 add exch lt and} forall {X exit} if + true [ac tc ec bc] {cc 1 add exch lt and} forall { + cc xc lt {C exit} if + cc xc eq {i k add 1 add XtermFirst {X exit} {C exit} ifelse} if + } if + } if + /k k 1 add def + } loop + } repeat + } def + + /addtocws { + dup cws exch j exch putinterval + /j exch length j add def + } def + + /ECItocws { + neg 1000000 sub + dup 000126 le { % ECI 000000 - 000126 + 1 add + 1 array astore + } { dup 016382 le { % ECI 000127 - 016382 + 127 sub + dup 254 idiv 128 add exch + 254 mod 1 add + 2 array astore + } { % ECI 016383 - 999999 + 16383 sub + dup 64516 idiv 192 add exch + dup 254 idiv 254 mod 1 add exch + 254 mod 1 add + 3 array astore + } ifelse } ifelse + } def + + /encA { + 1 { % Common exit + isECI i get { + Avals eci get addtocws + msg i get ECItocws addtocws + /i i 1 add def exit } if - msglen i sub 3 le { % Check end of data conditions - /remcws numremcws j p 3 idiv 2 mul add get def - /remvals [ - msg i msglen i sub getinterval { - dup encvals mode get exch known { - encvals mode get exch get aload pop - } { % Unencodable X12 characters - pop -1 -1 -1 -1 - } ifelse - } forall - ] def - remcws 2 eq remvals length 3 eq and { - % Encode and omit unlatch - [ - ctxvals 0 p getinterval aload pop - remvals aload pop - ] CTXvalstocws addtocws - /mode A def - /i msglen def - exit - } if - remcws 2 eq remvals length 2 eq and mode X ne and { - % Encode with sft1 as third value, omit unlatch - [ - ctxvals 0 p getinterval aload pop - remvals aload pop - encvals mode get sft1 get aload pop - ] CTXvalstocws addtocws - /mode A def - /i msglen def - exit + numD i get 2 ge { + 2 string dup 0 msg i get put dup 1 msg i 1 add get put Avals exch get addtocws + /i i 2 add def + exit + } if + /newmode lookup def + newmode mode ne { + Avals [-1 lC lT lX lE lB] newmode get get addtocws + /mode newmode def + exit + } if + Avals msg i get get addtocws + /i i 1 add def + exit + } repeat + } def + + /CTXvalstocws { + /in exch def + mark + 0 3 in length 1 sub { + in exch 3 getinterval 0 exch {add 40 mul} forall 40 idiv 1 add + dup 256 idiv exch 256 mod + } for + counttomark array astore exch pop + } def + + /encCTX { + /p 0 def + /ctxvals 2500 array def + /done false def + + % Lookup the values for each character + { + i msglen eq {exit} if + encvals mode get msg i get known not {exit} if + p 3 mod 0 eq { + p 0 gt { + /newmode lookup def + newmode mode ne { + ctxvals 0 p getinterval CTXvalstocws addtocws + [unlcw] addtocws + newmode A ne { + Avals [-1 lC lT lX lE lB] newmode get get addtocws + } if + /mode newmode def + /done true def + exit + } if } if - remcws 2 eq remvals length 1 eq and { - % Unlatch to ASCII - ctxvals 0 p getinterval CTXvalstocws addtocws - [unlcw] addtocws - Avals msg i get get addtocws - /mode A def - /i msglen def - exit + msglen i sub 3 le { % Check end of data conditions + /remcws numremcws j p 3 idiv 2 mul add get def + /remvals [ + msg i msglen i sub getinterval { + dup encvals mode get exch known { + encvals mode get exch get aload pop + } { % Unencodable X12 characters + pop -1 -1 -1 -1 + } ifelse + } forall + ] def + remcws 2 eq remvals length 3 eq and { + % Encode and omit unlatch + [ + ctxvals 0 p getinterval aload pop + remvals aload pop + ] CTXvalstocws addtocws + /mode A def + /i msglen def + /done true def + exit + } if + remcws 2 eq remvals length 2 eq and mode X ne and { + % Encode with sft1 as third value, omit unlatch + [ + ctxvals 0 p getinterval aload pop + remvals aload pop + encvals mode get sft1 get aload pop + ] CTXvalstocws addtocws + /mode A def + /i msglen def + /done true def + exit + } if + remcws 2 eq remvals length 1 eq and { + % Unlatch to ASCII + ctxvals 0 p getinterval CTXvalstocws addtocws + [unlcw] addtocws + Avals msg i get get addtocws + /mode A def + /i msglen def + /done true def + exit + } if + remcws 1 eq remvals length 1 eq and { + % Implied unlatch to ASCII + ctxvals 0 p getinterval CTXvalstocws addtocws + Avals msg i get get addtocws + /mode A def + /i msglen def + /done true def + exit + } if } if - remcws 1 eq remvals length 1 eq and { - % Implied unlatch to ASCII - ctxvals 0 p getinterval CTXvalstocws addtocws + } if + encvals mode get msg i get get + dup ctxvals exch p exch putinterval + /p exch length p add def + /i i 1 add def + } loop + + % Backtrack to a boundary and return to ASCII + done not { + { + p 3 mod 0 eq {exit} if + /i i 1 sub def + /p p encvals mode get msg i get get length sub def + } loop + [ + ctxvals 0 p getinterval aload pop + ] CTXvalstocws addtocws + [unlcw] addtocws + /mode A def + % Encode something to avoid latching immediately back + i msglen ne isECI i get not and { + numD i get 2 ge { + 2 string dup 0 msg i get put dup 1 msg i 1 add get put Avals exch get addtocws + /i i 2 add def + } { Avals msg i get get addtocws - /mode A def - /i msglen def - exit - } if + /i i 1 add def + } ifelse } if } if - encvals mode get msg i get get - dup ctxvals exch p exch putinterval - /p exch length p add def - /i i 1 add def - } loop - % Backtrack to a boundary and return to ASCII - mode A ne { + } def + + /Evalstocws { + /in exch def + /inlen in length def + /outlen in length 4 div 3 mul ceiling cvi def + /in [ in aload pop 0 0 0 ] def + mark + 0 4 inlen 1 sub { + in exch 4 getinterval 0 exch {or 6 bitshift} forall -6 bitshift + dup -16 bitshift 255 and exch + dup -8 bitshift 255 and exch + 255 and + } for + counttomark array astore exch pop + 0 outlen getinterval + } def + + /encE { + /p 0 def + /edifactvals 2100 array def + + % Lookup the values for each character { - p 3 mod 0 eq {exit} if - /i i 1 sub def - /p p encvals mode get msg i get get length sub def - } loop - [ - ctxvals 0 p getinterval aload pop - ] CTXvalstocws addtocws - [unlcw] addtocws - /mode A def - % Encode something to avoid latching immediately back - i msglen ne { - numD i get 2 ge { - 2 string dup 0 msg i get put dup 1 msg i 1 add get put Avals exch get addtocws - /i i 2 add def - } { - Avals msg i get get addtocws - /i i 1 add def - } ifelse - } if - } if - - } bind def - - /Evalstocws { - /in exch def - /inlen in length def - /outlen in length 4 div 3 mul ceiling cvi def - /in [ in aload pop 0 0 0 ] def - mark - 0 4 inlen 1 sub { - in exch 4 getinterval 0 exch {or 6 bitshift} forall -6 bitshift - dup -16 bitshift 255 and exch - dup -8 bitshift 255 and exch - 255 and - } for - counttomark array astore exch pop - 0 outlen getinterval - } bind def - - /encE { - /p 0 def - /edifactvals 2100 array def - - % Lookup the values for each character - { - i msglen eq {exit} if - Evals msg i get known not {exit} if - p 4 mod 0 eq { - lookup mode ne {exit} if - msglen i sub 2 le { % Check end of data conditions - /remcws numremcws j p 4 idiv 3 mul add get def - /remvals [ - msg i msglen i sub getinterval { - dup Evals exch known { - Evals exch get aload pop - } { % Unencodable EDIFACT characters - pop -1 -1 -1 -1 -1 - } ifelse - } forall - ] def - remcws 2 eq remvals length 2 eq and { - % Implied unlatch to ASCII - edifactvals 0 p getinterval Evalstocws addtocws - Avals msg i get get addtocws - Avals msg i 1 add get get addtocws - /mode A def - /i msglen def - exit - } if - remcws 2 eq remcws 1 eq or remvals length 1 eq and { - % Implied unlatch to ASCII - edifactvals 0 p getinterval Evalstocws addtocws - Avals msg i get get addtocws - /mode A def - /i msglen def - exit + i msglen eq {exit} if + Evals msg i get known not {exit} if + p 4 mod 0 eq { + msglen i sub 2 le { % Check end of data condition + /remcws numremcws j p 4 idiv 3 mul add get def + /remvals [ + msg i msglen i sub getinterval { + Avals exch get aload pop + } forall + ] def + remcws 1 eq remcws 2 eq or remvals length remcws le and { + % Implied unlatch to ASCII + edifactvals 0 p getinterval Evalstocws addtocws + remvals addtocws + /mode A def + /i msglen def + exit + } if } if + lookup mode ne {exit} if } if - } if - Evals msg i get get - dup edifactvals exch p exch putinterval - /p exch length p add def - /i i 1 add def - } loop - - % Unlatch and pad with zeros until boundary - mode A ne { - /remcws numremcws j p 4 idiv 3 mul add 1 sub get 1 sub def - remcws 0 ne { % Unlatch if we haven't filled symbol - Evals unl get + Evals msg i get get dup edifactvals exch p exch putinterval /p exch length p add def + /i i 1 add def + } loop + + % Unlatch and pad with zeros until boundary + mode A ne { + /remcws numremcws j p 4 idiv 3 mul add 1 sub get 1 sub def + p 4 mod 0 ne i msglen ne or remcws 3 ge or { % Unlatch unless less than 3 codewords remain + Evals unl get + dup edifactvals exch p exch putinterval + /p exch length p add def + } if + edifactvals 0 p getinterval Evalstocws addtocws + /mode A def + % Encode something to avoid latching immediately back + i msglen ne isECI i get not and { + numD i get 2 ge { + 2 string dup 0 msg i get put dup 1 msg i 1 add get put Avals exch get addtocws + /i i 2 add def + } { + Avals msg i get get addtocws + /i i 1 add def + } ifelse + } if } if - edifactvals 0 p getinterval Evalstocws addtocws - /mode A def - % Encode something to avoid latching immediately back - i msglen ne { - numD i get 2 ge { - 2 string dup 0 msg i get put dup 1 msg i 1 add get put Avals exch get addtocws - /i i 2 add def + + } def + + /encB { + /p 0 def /bvals 1558 array def { + i msglen eq {exit} if + lookup mode ne {exit} if + bvals p msg i get put + /p p 1 add def + /i i 1 add def + } loop + /remcws numremcws j p add get 1 sub def + /bvals [ + remcws 0 eq i msglen eq and { % Terminates symbol + 0 } { - Avals msg i get get addtocws - /i i 1 add def + p 250 lt {p} {p 250 idiv 249 add p 250 mod} ifelse } ifelse - } if - } if + bvals 0 p getinterval aload pop + ] def + 0 1 bvals length 1 sub { % Pseudo-randomise based on codeword position + /p exch def + j p add 1 add 149 mul 255 mod 1 add bvals p get add + dup 256 ge {256 sub} if + bvals exch p exch put + } for + bvals addtocws + /mode A def + } def - } bind def - - /encB { - /p 0 def /bvals 1558 array def { - i msglen eq {exit} if - lookup mode ne {exit} if - bvals p msg i get put - /p p 1 add def - /i i 1 add def + % Derive the codewords + /cws 1558 array def + /mode A def /i 0 def /j 0 def { + i msglen ge {exit} if + [ /encA /encCTX /encCTX /encCTX /encE /encB ] mode get load exec } loop - /remcws numremcws j p add get 1 sub def - /bvals [ - remcws 0 eq i msglen eq and { % Terminates symbol - 0 - } { - p 250 lt {p} {p 250 idiv 249 add p 250 mod} ifelse - } ifelse - bvals 0 p getinterval aload pop - ] def - 0 1 bvals length 1 sub { % Pseudo-randomise based on codeword position - /p exch def - j p add 1 add 149 mul 255 mod 1 add bvals p get add - dup 256 ge {256 sub} if - bvals exch p exch put - } for - bvals addtocws - /mode A def - } bind def - - % Derive the codewords - /cws 1558 array def - /mode A def /i 0 def /j 0 def { - i msglen ge {exit} if - [ /encA /encCTX /encCTX /encCTX /encE /encB ] mode get load exec - } loop - /cws cws 0 j getinterval def + /cws cws 0 j getinterval def + + } if % encoding=auto % Extend codewords to fill symbol with pseudo-randomised pad characters /datlen cws length def @@ -15850,6 +19568,8 @@ begin } for } if + options /debugcws known { /bwipp.debugcws cws //raiseerror exec } if + % Lookup symbol metrics based on number of codewords and user specification /i 0 def { % loop /m metrics i get def @@ -15884,38 +19604,40 @@ begin } { i 7 le {/cwbsize 156 def} {/cwbsize 155 def} ifelse } ifelse - /cwb cwbsize array def + /cwb cwbsize array def 0 1 cwbsize 1 sub { /j exch def cwb j cws j rsbl mul i add get put - } for + } for cwbs i cwb put ecbs i [ rscw rsbl idiv {0} repeat ] put } for % Calculate the log and anti-log tables +{ /rsalog [ 1 255 { dup 2 mul dup 256 ge {301 xor} if } repeat ] def /rslog 256 array def 1 1 255 {dup rsalog exch get exch rslog 3 1 roll put} for +} ctxdef % Function to calculate the product in the field /rsprod { - 2 copy 0 ne exch 0 ne and { + 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 + } def % Generate the coefficients /coeffs [ 1 rscw rsbl idiv {0} repeat ] def 1 1 rscw rsbl idiv { - /i exch def + /i exch def coeffs i coeffs i 1 sub get put i 1 sub -1 1 { /j exch def coeffs j coeffs j 1 sub get coeffs j get rsalog i get rsprod xor put - } for + } for coeffs 0 coeffs 0 get rsalog i get rsprod put } for /coeffs coeffs 0 coeffs length 1 sub getinterval def @@ -15926,13 +19648,13 @@ begin /cwb cwbs i get def /ecb ecbs i get def 0 1 cwb length 1 sub { - /t exch cwb exch get ecb 0 get xor def + /t exch cwb exch get ecb 0 get xor def ecb length 1 sub -1 0 { /j exch def /p ecb length j sub 1 sub def ecb p t coeffs j get rsprod put j 0 gt { ecb p ecb p 1 add get ecb p get xor put } if - } for + } for } for } for @@ -15951,9 +19673,9 @@ begin % Place the codewords into the matrix /module { % cw row col shape - 4 -1 roll - (00000000) 8 string copy dup 3 -1 roll 2 8 string cvrs - dup length 8 exch sub exch putinterval + 4 -1 roll + (00000000) 8 string copy dup 3 -1 roll 2 8 string cvrs + dup length 8 exch sub exch putinterval 7 -1 0 {1 index exch get 48 sub exch} for pop 11 -3 roll % 1 2 4 8 16 32 64 128 row col shape @@ -15973,7 +19695,7 @@ begin exch mcols mul add mmat exch 5 -1 roll put } forall - } bind def + } def % Placement patterns /dmn [ @@ -15982,28 +19704,28 @@ begin { 2 copy exch 1 sub exch } bind { 2 copy 2 sub } bind { 2 copy 1 sub } bind { 2 copy } bind ] def - + /dmc1 [ { mrows 1 sub 0 } bind { mrows 1 sub 1 } bind { mrows 1 sub 2 } bind { 0 mcols 2 sub } bind { 0 mcols 1 sub } bind { 1 mcols 1 sub } bind { 2 mcols 1 sub } bind { 3 mcols 1 sub } bind ] def - + /dmc2 [ { mrows 3 sub 0 } bind { mrows 2 sub 0 } bind { mrows 1 sub 0 } bind { 0 mcols 4 sub } bind { 0 mcols 3 sub } bind { 0 mcols 2 sub } bind { 0 mcols 1 sub } bind { 1 mcols 1 sub } bind ] def - + /dmc3 [ { mrows 3 sub 0 } bind { mrows 2 sub 0 } bind { mrows 1 sub 0 } bind { 0 mcols 2 sub } bind { 0 mcols 1 sub } bind { 1 mcols 1 sub } bind { 2 mcols 1 sub } bind { 3 mcols 1 sub } bind ] def - + /dmc4 [ { mrows 1 sub 0 } bind { mrows 1 sub mcols 1 sub } bind { 0 mcols 3 sub } bind { 0 mcols 2 sub } bind @@ -16065,8 +19787,8 @@ begin /cwpos 0 def 0 1 rows 1 sub { /i exch def - i rrows 2 add mod 0 eq { pixs i cols mul [ cols 2 idiv {1 0} repeat ] putinterval } if - i rrows 2 add mod rrows 1 add eq { pixs i cols mul [ cols {1} repeat ] putinterval } if + i rrows 2 add mod 0 eq { pixs i cols mul [ cols 2 idiv {1 0} repeat ] putinterval } if + i rrows 2 add mod rrows 1 add eq { pixs i cols mul [ cols {1} repeat ] putinterval } if i rrows 2 add mod 0 ne i rrows 2 add mod rrows 1 add ne and { 0 1 cols 1 sub { /j exch def @@ -16077,7 +19799,7 @@ begin /cwpos cwpos 1 add def } if } for - } if + } if } for % Return the arguments @@ -16093,9 +19815,13 @@ begin dontdraw not //renmatrix if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /datamatrix dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -16104,15 +19830,15 @@ end % --END ENCODER datamatrix-- % --BEGIN ENCODER datamatrixrectangular-- -% --REQUIRES preamble raiseerror renmatrix datamatrix-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix datamatrix-- % --DESC: Data Matrix Rectangular % --EXAM: 1234 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp datamatrixrectangular 0.0 2017040400 59583 59426 -%%BeginData: 43 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp datamatrixrectangular 0.0 2022082100 62617 62460 +%%BeginData: 46 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put dup /datamatrix dup /uk.co.terryburton.bwipp findresource put @@ -16124,6 +19850,7 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def % Parse the input options @@ -16145,12 +19872,14 @@ begin args (opt) options put args - + dontdraw not //renmatrix if end -} bind def +} +[/barcode] {null def} forall +bind def /datamatrixrectangular dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -16158,17 +19887,181 @@ end %%EndResource % --END ENCODER datamatrixrectangular-- +% --BEGIN ENCODER datamatrixrectangularextension-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix datamatrix-- +% --DESC: Data Matrix Rectangular Extension +% --EXAM: 1234 +% --EXOP: version=8x96 +% --RNDR: renmatrix +%%BeginResource: uk.co.terryburton.bwipp datamatrixrectangularextension 0.0 2022082100 63804 63742 +%%BeginData: 56 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +20 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +dup /datamatrix dup /uk.co.terryburton.bwipp findresource put +begin +/datamatrixrectangularextension { + + 20 dict begin + + /options exch def + /barcode exch def + + /ctx null def + /dontdraw false def + + /dmre false def + /dindmre 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 + + % Get the result of encoding with datamatrix + options (dontdraw) true put + options (format) (rectangle) put + + dindmre dmre or not { % Default is (ISO) DMRE + options (dmre) true put + } { % Otherwise enable formats as given + options (dmre) dmre put % ISO + options (dindmre) dindmre put % DIN + } ifelse + + /args barcode options //datamatrix exec def + + args (opt) options put + args + + dontdraw not //renmatrix if + + end + +} +[/barcode] {null def} forall +bind def +/datamatrixrectangularextension dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER datamatrixrectangularextension-- + +% --BEGIN ENCODER mailmark-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix datamatrix-- +% --DESC: Royal Mail Mailmark +% --EXAM: JGB 012100123412345678AB19XY1A 0 www.xyz.com +% --EXOP: type=29 +% --RNDR: renmatrix +%%BeginResource: uk.co.terryburton.bwipp mailmark 0.0 2022082100 66101 65894 +%%BeginData: 81 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +10 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /parseinput dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +dup /datamatrix dup /uk.co.terryburton.bwipp findresource put +begin +/mailmark { + + 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 + + /ctx null def + /type (unset) def % 7, 9 or 29 + /parse false def + /dontdraw 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 + /fncvals << + /parse parse + /parseonly true + /parsefnc false + >> def + /barcode barcode fncvals //parseinput exec def + /barlen barcode length def + options (parse) undef + + % Map the given type to a format and version of Data Matrix + << + (7) (24x24) + (9) (32x32) + (29) (16x48) + >> /type load get /version exch def + + << + (7) (square) + (9) (square) + (29) (rectangle) + >> /type load get /format exch def + + % Validate the input + barcode length 45 lt { + /bwipp.mailmarkBadLength (Royal Mail Mailmark must contain at least 45 characters of Mailmark formatted data, including any required space padding) //raiseerror exec + } if + barcode 0 4 getinterval (JGB ) ne { + /bwipp.mailmarkBadIndicator (Royal Mail Mailmark must begin with JGB<space> identifier) //raiseerror exec + } if + + % Get the result of encoding with datamatrix + options (dontdraw) true put + options (version) version put + options (format) format put + options (mailmark) true put + /args barcode options //datamatrix exec def + + args (opt) options put + args + + dontdraw not //renmatrix if + + end + +} +[/barcode] {null def} forall +bind def +/mailmark dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER mailmark-- + % --BEGIN ENCODER qrcode-- -% --REQUIRES preamble raiseerror renmatrix-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix-- % --DESC: QR Code % --EXAM: http://goo.gl/0bis % --EXOP: eclevel=M % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp qrcode 0.0 2017040400 322089 326433 -%%BeginData: 1028 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp qrcode 0.0 2022082100 320507 354887 +%%BeginData: 1369 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /parseinput dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put begin /qrcode { @@ -16178,10 +20071,11 @@ begin /options exch def /barcode exch def + /ctx null def /dontdraw false def - /format (full) def % full or micro or any - /version (unset) def % 1-40 or M1-M4 - /eclevel (unset) def % L, M, Q or H + /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 @@ -16199,51 +20093,32 @@ begin /mask mask cvi def - % 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 + /qrcode //loadctx exec - /barlen barcode length 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 - % Convert input into bytes accounting for FNC characters + % Default error correction level + eclevel (unset) eq {/eclevel format (micro) ne {(M)} {(L)} ifelse def} if + + % Parse the input /fn1 -1 def /fncvals << + /parse parse + /parsefnc parsefnc + /eci true (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 + /msg barcode fncvals //parseinput exec def /msglen msg length def % If FNC1 in first position then escape % as %% @@ -16256,18 +20131,32 @@ begin } if } if - % Default error correction level - eclevel (unset) eq {/eclevel format (full) eq {(M)} {(L)} ifelse def} if +{ % context + + % 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 - + % + % Modes: (N)umeric, (A)lphanumeric, (B)yte, (K)anji, (E)CI + % + /N 0 def /A 1 def /B 2 def /K 3 def /E 4 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 @@ -16275,61 +20164,104 @@ begin 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 - + + % Binary exclusives calculated from "not others" + /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) ] % 1-9 - [ (0001) (0010) (0100) (1000) ] % 10-26 - [ (0001) (0010) (0100) (1000) ] % 27-40 - [ () -1 -1 -1 ] % M1 - [ (0) (1) -1 -1 ] % M2 - [ (00) (01) (10) (11) ] % M3 - [ (000) (001) (010) (011) ] % M4 + + /mids [ + % N A B K E + [ (0001) (0010) (0100) (1000) (0111) ] % v1to9 + [ (0001) (0010) (0100) (1000) (0111) ] % v10to26 + [ (0001) (0010) (0100) (1000) (0111) ] % v27to40 + [ () -1 -1 -1 -1 ] % vM1 + [ (0) (1) -1 -1 -1 ] % vM2 + [ (00) (01) (10) (11) -1 ] % vM3 + [ (000) (001) (010) (011) -1 ] % vM4 + 32 { + [ (001) (010) (011) (100) (111) ] % rMQR + } repeat ] def - + /cclens [ % N A B K - [ 10 9 8 8 ] % 1-9 - [ 12 11 16 10 ] % 10-26 - [ 14 13 16 12 ] % 27-40 - [ 3 -1 -1 -1 ] % M1 - [ 4 3 -1 -1 ] % M2 - [ 5 4 4 3 ] % M3 - [ 6 5 5 4 ] % M4 + [ 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 + [ 7 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 [ 4 4 4 3 5 7 9 ] 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 + + /termlens [ + 3 { + 4 % Full + } repeat + 3 % vM1 + 5 % vM2 + 7 % vM3 + 9 % vM4 + 32 { + 3 % rMQR + } repeat + ] def + + /padstrs [ (11101100) (00010001) ] 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 +} ctxdef + + % 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 + } def + /encA { /in exch def fnc1first { % FNC1 as % - /in [ in { dup -1 eq {pop 37} if } forall ] def + /in [ in { dup fn1 eq {pop 37} if } forall ] def } if /out in length 11 mul 2 idiv 1 add string def /k 0 def /m 0 def { @@ -16345,8 +20277,8 @@ begin length m add /m exch def } loop out 0 m getinterval - } bind def - + } def + /encN { /in exch def /out in length 10 mul 3 idiv 1 add string def @@ -16368,12 +20300,12 @@ begin length m add /m exch def } loop out 0 m getinterval - } bind def - + } def + /encB { /in exch def fnc1first { % FNC1 as GS - /in [ in { dup -1 eq {pop 29} if } forall ] def + /in [ in { dup fn1 eq {pop 29} if } forall ] def } if /out in length 8 mul string def 0 1 in length 1 sub { @@ -16382,8 +20314,8 @@ begin out k 8 mul 3 -1 roll putinterval } for out - } bind def - + } def + /encK { /in exch def /out in length 2 idiv 13 mul string def @@ -16397,73 +20329,175 @@ begin /k k 2 add def } loop out - } bind def - - /encfuncs [ /encN /encA /encB /encK ] def - + } def + + /encE { + 0 get neg 1000000 sub + dup 000127 le { % ECI 000000 - 000127 + 8 tobin + } { dup 016383 le { % ECI 000128 - 016383 + 2#1000000000000000 add 16 tobin + } { % ECI 016384 - 999999 + 2#110000000000000000000000 add 24 tobin + } ifelse } ifelse + } def + + /encfuncs [ /encN /encA /encB /encK /encE ] def + /addtobits { dup bits j 3 -1 roll putinterval length j add /j exch def - } bind def - + } def + /numNs [ msglen {0} repeat 0 ] def /numAs [ msglen {0} repeat 0 ] def + /numAorNs [ msglen {0} repeat 0 ] def /numBs [ msglen {0} repeat 0 ] def - /numKs [ msglen {0} repeat -1 ] def + /numKs [ msglen {0} repeat 0 ] 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 + /isECI msglen array 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 + /sjis i 1 add msglen lt { barchar 256 mul msg i 1 add get add } {0} ifelse def % Zero if last char + sjis 16#8140 ge sjis 16#9FFC le and sjis 16#E040 ge sjis 16#EBBF le and or { + nextKs i 0 put + numKs i numKs i 2 add get 1 add put + } { + nextKs i nextKs i 1 add get 1 add put + } ifelse } { 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 + numAorNs i numAorNs 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 + numAorNs i numAorNs i 1 add get 1 add put } { nextAs i nextAs i 1 add get 1 add put } ifelse + isECI i barchar -1000000 le put } 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 - - % Encode unterminated bitsream for each version group separately - /msgbits [-1 -1 -1 -1 -1 -1 -1] def - /v1to9 0 def /v10to26 1 def /v27to40 2 def /vM1 3 def /vM2 4 def /vM3 5 def /vM4 6 def + 0 1 msglen 1 sub { % Scan forward to set any "2nd byte 1st byte" Kanji matches to zero + /i exch def + numKs i get 0 gt { + numKs i 1 add 0 put + nextKs i 1 add nextKs i 1 add get 1 add put + } if + } for + msglen 1 sub -1 0 { % Finally scan backwards again to set numBs/nextBs from "not others" + /i exch def + numNs i get numAs i get numKs i get add add 0 eq isECI i get not and { + 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 + } for + + /KbeforeB {numK exch ver get ge nextBs numK 2 mul i add get 0 eq and} def + /KbeforeA {numK exch ver get ge nextAs numK 2 mul i add get 0 eq and} def + /KbeforeN {numK exch ver get ge nextNs numK 2 mul i add get 0 eq and} def + /KbeforeE {numK exch ver get ge numK 2 mul i add msglen eq and} def + /AbeforeK {numA exch ver get ge nextKs numA i add get 0 eq and} def + /AbeforeB {numA exch ver get ge nextBs numA i add get 0 eq and} def + /AbeforeN {numA exch ver get ge nextNs numA i add get 0 eq and} def + /AbeforeE {numA exch ver get ge numA i add msglen eq and} def + /NbeforeK {numN exch ver get ge nextKs numN i add get 0 eq and} def + /NbeforeB {numN exch ver get ge nextBs numN i add get 0 eq and} def + /NbeforeA {numN exch ver get ge nextAs numN i add get 0 eq and} def + /NbeforeE {numN exch ver get ge numN i add msglen eq and} def + /AorNbeforeB {numAorN exch ver get ge nextBs numAorN i add get 0 eq and} def + /AorNbeforeE {numAorN exch ver get ge numAorN i add msglen eq and} def + + /nextNslt { nextNs i get msglen ge { pop true } { numNs nextNs i get i add get exch ver get lt } ifelse } 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 +{ + /versetmap << + % 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 + >> def + /versetfull [v1to9 v10to26 v27to40] def + /versetmicro [vM1 vM2 vM3 vM4] def +} ctxdef + version (unset) ne { + % A specific version of symbol is given so encode in just the corresponding vergrp + /verset versetmap version get [ exch ] def + } { + % Just the format is specified so encode in each vergrp for the type of symbol + format (full) eq { /verset versetfull def } if + format (micro) eq { /verset versetmicro def } if + % rMQR symbols are accessed with an explicit version + } ifelse + + % Encode unterminated bitstream for each compatible vergrp separately + /msgbits [ 39 {-1} repeat ] def /e 10000 def - [v1to9 v10to26 v27to40 vM1 vM2 vM3 vM4] { + + % Number of before characters per vergrp, depending on current mode, for optimising modes + % Generated by contrib/development/build-qr-mode-optim-arrs.php + % Full Micro R7 R9 R11 R13 R15 R17 +{ + /mode0forceKB [ 1 1 1 e e 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1] def + /mode0forceA [ 1 1 1 e 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1] def + /mode0forceN [ 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1] def + + /mode0NbeforeB [ 4 4 5 e e 2 3 2 2 3 3 3 2 3 3 3 3 2 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3] def + + /modeBKbeforeB [ 9 12 13 e e 4 6 4 5 6 6 6 5 6 6 6 7 4 6 6 6 7 7 5 6 6 7 7 7 6 6 7 7 7 6 7 7 7 8] def + /modeBKbeforeA [ 8 10 11 e e 4 5 4 5 5 6 6 5 5 6 6 6 4 5 6 6 6 6 5 6 6 6 6 7 6 6 6 6 7 6 6 6 7 7] def + /modeBKbeforeN [ 8 9 11 e e 3 5 3 4 5 5 5 4 5 5 5 6 3 5 5 5 6 6 4 5 5 6 6 6 5 5 6 6 7 5 6 6 6 7] def + /modeBKbeforeE [ 5 5 6 e e 2 3 2 3 3 3 3 3 3 3 3 4 2 3 3 3 4 4 3 3 3 4 4 4 3 3 4 4 4 3 4 4 4 4] def + + /modeBAbeforeK [11 12 14 e e 5 7 5 6 7 8 8 6 7 8 8 8 6 7 8 8 8 8 6 8 8 8 8 9 8 8 8 8 9 8 8 8 9 9] def + /modeBAbeforeB [11 15 16 e e 6 7 6 7 7 8 8 7 7 8 8 8 6 7 8 8 8 9 7 8 8 8 9 9 8 8 9 9 9 8 8 9 9 10] def + /modeBAbeforeN [12 13 15 e e 6 8 6 7 8 8 8 7 8 8 8 9 6 8 8 8 9 9 7 8 8 9 9 10 8 9 9 9 10 8 9 9 10 10] def + /modeBAbeforeE [ 6 7 8 e e 3 4 3 4 4 4 4 4 4 4 4 5 4 4 4 4 5 5 4 4 4 5 5 5 4 5 5 5 5 4 5 5 5 5] def + + /modeBNbeforeK [ 6 7 8 e e 3 4 3 4 4 5 5 4 4 5 5 5 3 4 5 5 5 5 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 5] def + /modeBNbeforeB [ 6 8 9 e e 3 4 3 4 4 5 5 4 4 5 5 5 3 4 5 5 5 5 4 4 5 5 5 5 5 5 5 5 5 5 5 5 5 6] def + /modeBNbeforeA [ 6 7 8 e e 3 4 3 4 4 5 5 4 4 5 5 5 4 4 5 5 5 5 4 5 5 5 5 5 5 5 5 5 6 5 5 5 5 6] def + /modeBNbeforeE [ 3 4 4 e e 2 3 2 2 3 3 3 2 3 3 3 3 2 3 3 3 3 3 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3] def + + /modeANbeforeA [13 15 17 e 5 7 9 7 8 9 9 9 8 9 9 9 11 7 9 9 9 11 11 8 9 9 10 11 11 9 10 11 11 11 9 11 11 11 11] def + /modeANbeforeB [13 17 18 e e 7 9 7 8 9 9 9 8 9 9 9 10 7 9 9 9 10 11 8 9 9 9 11 11 9 9 11 11 11 9 10 11 11 11] def + /modeANbeforeE [ 7 8 9 e 3 4 5 4 5 5 5 5 5 5 5 5 6 4 5 5 5 6 6 5 5 5 5 6 6 5 5 6 6 6 5 6 6 6 6] def +} ctxdef + + verset { /ver exch def - + % Derive optimal sequence /mode -1 def /seq [] def /i 0 def { i msglen ge {exit} if @@ -16471,51 +20505,60 @@ begin /numB numBs i get def /numA numAs i get def /numN numNs i get def + /numAorN numAorNs i get def + /eci isECI 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 vM1 eq eci 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 + ver vM2 eq eci and {/seq -1 def exit} if + ver vM3 eq eci and {/seq -1 def exit} if + ver vM4 eq eci and {/seq -1 def exit} if { % common exit - 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 + eci { + E exit + } if + mode -1 eq { % Set initial mode (or mode after ECI) + mode0forceKB KbeforeA {K exit} if + mode0forceKB KbeforeN {K exit} if + modeBKbeforeE KbeforeB {K exit} if % Re-using modeB KbeforeE array + mode0forceKB 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 + mode0NbeforeB NbeforeB {N exit} if + mode0forceKB NbeforeB {B exit} if + modeANbeforeE NbeforeA {N exit} if % Re-using modeA NbeforeE array + mode0forceN NbeforeE {N exit} if + modeBAbeforeE AbeforeK {A exit} if % Re-using modeB AbeforeE array + modeBAbeforeE AorNbeforeB {A exit} if % Re-using modeB AbeforeE array + mode0forceA AorNbeforeE {A 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 + modeBKbeforeB KbeforeB {K exit} if + modeBKbeforeA KbeforeA {K exit} if + modeBKbeforeN KbeforeN {K exit} if + modeBKbeforeE KbeforeE {K exit} if + modeBAbeforeK AbeforeK {A exit} if + modeBAbeforeB AbeforeB {A exit} if + modeBAbeforeN AbeforeN {A exit} if + modeBAbeforeE AbeforeE {A exit} if + modeBNbeforeK NbeforeK {N exit} if + modeBNbeforeB NbeforeB {N exit} if + modeBNbeforeA NbeforeA {N exit} if + modeBNbeforeE NbeforeE {N exit} if + modeBAbeforeE AorNbeforeE numAorN modeBAbeforeN ver get le and { % If A/N sequence at end and short + modeBNbeforeA nextNslt {A exit} if % And next N sequence shorter than NbeforeA + } 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 + modeANbeforeA NbeforeA {N exit} if + modeANbeforeB NbeforeB {N exit} if + modeANbeforeE NbeforeE {N exit} if numA 1 ge numN 1 ge or {A exit} if B exit } if @@ -16548,6 +20591,7 @@ begin 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 + mode E eq {E msg i 1 getinterval /mode -1 def} if /dat exch def /sw exch def /seq [ seq aload pop sw dat ] def } ifelse @@ -16559,18 +20603,23 @@ begin seq -1 eq {exit} if % Sequence not available /bits 23648 string def /j 0 def - fnc1first {(0101) addtobits} if + 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 + /charslen chars length mode K eq {2 idiv} if def + mode E ne { + /cclen cclens ver get mode get def + charslen 2 cclen exp cvi ge { % Too many characters for cc indicator + /abort true def exit + } if + charslen cclen tobin addtobits } if - chars length mode K eq {2 idiv} if cclen tobin addtobits chars encfuncs mode get load exec addtobits } for abort {exit} if @@ -16581,81 +20630,118 @@ begin } forall % Lookup the most appropriate symbol specification +{ /metrics [ - % format vers vergrp size align modules error codewords error correction blocks - % L M Q H L1 L2 M1 M2 Q1 Q2 H1 H2 - [ (micro) (M1) vM1 11 98 99 36 [ 2 99 99 99 ] [ 1 0 -1 -1 -1 -1 -1 -1 ] ] - [ (micro) (M2) vM2 13 98 99 80 [ 5 6 99 99 ] [ 1 0 1 0 -1 -1 -1 -1 ] ] - [ (micro) (M3) vM3 15 98 99 132 [ 6 8 99 99 ] [ 1 0 1 0 -1 -1 -1 -1 ] ] - [ (micro) (M4) vM4 17 98 99 192 [ 8 10 14 99 ] [ 1 0 1 0 1 0 -1 -1 ] ] - [ (full) (1) v1to9 21 98 99 208 [ 7 10 13 17 ] [ 1 0 1 0 1 0 1 0 ] ] - [ (full) (2) v1to9 25 18 99 359 [ 10 16 22 28 ] [ 1 0 1 0 1 0 1 0 ] ] - [ (full) (3) v1to9 29 22 99 567 [ 15 26 36 44 ] [ 1 0 1 0 2 0 2 0 ] ] - [ (full) (4) v1to9 33 26 99 807 [ 20 36 52 64 ] [ 1 0 2 0 2 0 4 0 ] ] - [ (full) (5) v1to9 37 30 99 1079 [ 26 48 72 88 ] [ 1 0 2 0 2 2 2 2 ] ] - [ (full) (6) v1to9 41 34 99 1383 [ 36 64 96 112 ] [ 2 0 4 0 4 0 4 0 ] ] - [ (full) (7) v1to9 45 22 38 1568 [ 40 72 108 130 ] [ 2 0 4 0 2 4 4 1 ] ] - [ (full) (8) v1to9 49 24 42 1936 [ 48 88 132 156 ] [ 2 0 2 2 4 2 4 2 ] ] - [ (full) (9) v1to9 53 26 46 2336 [ 60 110 160 192 ] [ 2 0 3 2 4 4 4 4 ] ] - [ (full) (10) v10to26 57 28 50 2768 [ 72 130 192 224 ] [ 2 2 4 1 6 2 6 2 ] ] - [ (full) (11) v10to26 61 30 54 3232 [ 80 150 224 264 ] [ 4 0 1 4 4 4 3 8 ] ] - [ (full) (12) v10to26 65 32 58 3728 [ 96 176 260 308 ] [ 2 2 6 2 4 6 7 4 ] ] - [ (full) (13) v10to26 69 34 62 4256 [ 104 198 288 352 ] [ 4 0 8 1 8 4 12 4 ] ] - [ (full) (14) v10to26 73 26 46 4651 [ 120 216 320 384 ] [ 3 1 4 5 11 5 11 5 ] ] - [ (full) (15) v10to26 77 26 48 5243 [ 132 240 360 432 ] [ 5 1 5 5 5 7 11 7 ] ] - [ (full) (16) v10to26 81 26 50 5867 [ 144 280 408 480 ] [ 5 1 7 3 15 2 3 13 ] ] - [ (full) (17) v10to26 85 30 54 6523 [ 168 308 448 532 ] [ 1 5 10 1 1 15 2 17 ] ] - [ (full) (18) v10to26 89 30 56 7211 [ 180 338 504 588 ] [ 5 1 9 4 17 1 2 19 ] ] - [ (full) (19) v10to26 93 30 58 7931 [ 196 364 546 650 ] [ 3 4 3 11 17 4 9 16 ] ] - [ (full) (20) v10to26 97 34 62 8683 [ 224 416 600 700 ] [ 3 5 3 13 15 5 15 10 ] ] - [ (full) (21) v10to26 101 28 50 9252 [ 224 442 644 750 ] [ 4 4 17 0 17 6 19 6 ] ] - [ (full) (22) v10to26 105 26 50 10068 [ 252 476 690 816 ] [ 2 7 17 0 7 16 34 0 ] ] - [ (full) (23) v10to26 109 30 54 10916 [ 270 504 750 900 ] [ 4 5 4 14 11 14 16 14 ] ] - [ (full) (24) v10to26 113 28 54 11796 [ 300 560 810 960 ] [ 6 4 6 14 11 16 30 2 ] ] - [ (full) (25) v10to26 117 32 58 12708 [ 312 588 870 1050 ] [ 8 4 8 13 7 22 22 13 ] ] - [ (full) (26) v10to26 121 30 58 13652 [ 336 644 952 1110 ] [ 10 2 19 4 28 6 33 4 ] ] - [ (full) (27) v27to40 125 34 62 14628 [ 360 700 1020 1200 ] [ 8 4 22 3 8 26 12 28 ] ] - [ (full) (28) v27to40 129 26 50 15371 [ 390 728 1050 1260 ] [ 3 10 3 23 4 31 11 31 ] ] - [ (full) (29) v27to40 133 30 54 16411 [ 420 784 1140 1350 ] [ 7 7 21 7 1 37 19 26 ] ] - [ (full) (30) v27to40 137 26 52 17483 [ 450 812 1200 1440 ] [ 5 10 19 10 15 25 23 25 ] ] - [ (full) (31) v27to40 141 30 56 18587 [ 480 868 1290 1530 ] [ 13 3 2 29 42 1 23 28 ] ] - [ (full) (32) v27to40 145 34 60 19723 [ 510 924 1350 1620 ] [ 17 0 10 23 10 35 19 35 ] ] - [ (full) (33) v27to40 149 30 58 20891 [ 540 980 1440 1710 ] [ 17 1 14 21 29 19 11 46 ] ] - [ (full) (34) v27to40 153 34 62 22091 [ 570 1036 1530 1800 ] [ 13 6 14 23 44 7 59 1 ] ] - [ (full) (35) v27to40 157 30 54 23008 [ 570 1064 1590 1890 ] [ 12 7 12 26 39 14 22 41 ] ] - [ (full) (36) v27to40 161 24 50 24272 [ 600 1120 1680 1980 ] [ 6 14 6 34 46 10 2 64 ] ] - [ (full) (37) v27to40 165 28 54 25568 [ 630 1204 1770 2100 ] [ 17 4 29 14 49 10 24 46 ] ] - [ (full) (38) v27to40 169 32 58 26896 [ 660 1260 1860 2220 ] [ 4 18 13 32 48 14 42 32 ] ] - [ (full) (39) v27to40 173 26 54 28256 [ 720 1316 1950 2310 ] [ 20 4 40 7 43 22 10 67 ] ] - [ (full) (40) v27to40 177 30 58 29648 [ 750 1372 2040 2430 ] [ 19 6 18 31 34 34 20 61 ] ] + % 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 +} ctxdef + /eclval (LMQH) eclevel search pop length exch pop exch pop def - 0 1 43 { + 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 - /size m 3 get def % Length of side - /asp2 m 4 get def % Position of second alignment symbol - /asp3 m 5 get def % Position of third alignment symbol - /nmod m 6 get def % Number of modules + /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 - size 11 eq size 15 eq or { % Adjustments for M1 and M3 symbols + 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 7 get eclval get def % Number of error correction codewords + /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 8 get eclval 2 mul get def % First error correction blocks - /ecb2 m 8 get eclval 2 mul 1 add get def % Second error correction blocks + /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 (any) ne format frmt ne and {/okay false def} if % The format must match that supplied - frmt (micro) eq fnc1first and {/okay false def} if + 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 @@ -16669,7 +20755,7 @@ begin } for okay not { - /bwipp.qrcodeNoValidSymbol (No valid symbol available) //raiseerror exec + /bwipp.qrcodeNoValidSymbol (Maximum length exceeded or invalid content) //raiseerror exec } if /format frmt def @@ -16678,7 +20764,7 @@ begin /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 + % Complete the message bits by adding the terminator, truncated if necessary /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 @@ -16689,15 +20775,14 @@ begin /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 + pad exch padstrs padnum get putinterval /padnum padnum 1 add 2 mod def } for % Evaluate the padded message into codewords - /cws dcws array def + /cws dcws array def 0 1 cws length 1 sub { /c exch def /bpcw 8 def @@ -16707,36 +20792,40 @@ begin 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 + } for cws c cw put - } for + } 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 + options /debugcws known { /bwipp.debugcws cws //raiseerror exec } 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 +} ctxdef % Function to calculate the product in the field /rsprod { - 2 copy 0 ne exch 0 ne and { + 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 + } def % Generate the coefficients for the Reed-Solomon algorithm /coeffs [ 1 ecpb {0} repeat ] def 0 1 ecpb 1 sub { - /i exch def + /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 + } for coeffs 0 coeffs 0 get rsalog i get rsprod put } for /coeffs coeffs 0 coeffs length 1 sub getinterval def @@ -16755,7 +20844,7 @@ begin } for } for rscws rsnd ecpb getinterval - } bind def + } def % Divide codewords into two groups of blocks and calculate the error correction codewords /dcwsb ecb1 ecb2 add array def @@ -16770,7 +20859,7 @@ begin 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 @@ -16792,7 +20881,7 @@ begin /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 @@ -16800,10 +20889,10 @@ begin 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 + 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 @@ -16812,11 +20901,49 @@ begin cws ncws 1 sub cws ncws 1 sub get 15 and 4 bitshift put } if + options /debugecc known { /bwipp.debugecc cws //raiseerror exec } if + % Create the bitmap - /pixs [ size size mul {-1} repeat ] def - /qmv {size mul add} bind def - + /pixs [ rows cols mul {-1} repeat ] def + /qmv {cols mul add} 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 ] @@ -16827,27 +20954,77 @@ begin [ 1 1 1 1 1 1 1 0 ] [ 0 0 0 0 0 0 0 0 ] ] def - 0 1 fpat length 1 sub { + /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 + /fpatmap << + % TL TR BL BR + (full) [ fpat fpat fpat fnullpat ] + (micro) [ fpat fnullpat fnullpat fnullpat ] + (rmqr) [ fpat fcorpat fcorpat fsubpat ] + >> def +} ctxdef + /fpats fpatmap format get def + 0 1 7 { /y exch def - 0 1 fpat 0 get length 1 sub { + 0 1 7 { /x exch def - /fpb fpat y get x get def - pixs x y qmv fpb put - format (full) eq { - pixs size x sub 1 sub y qmv fpb put - pixs x size y sub 1 sub qmv fpb put - } if + /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 - /algnpat [ +{ + /algnpatfull [ [ 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 + /algnpatrmqr [ + [ 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 +} ctxdef + /putalgnpat { /py exch def /px exch def @@ -16855,70 +21032,79 @@ begin /pb exch def 0 1 4 { /pa exch def - pixs px pa add py pb add qmv algnpat pb get pa get put + /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 - asp2 2 sub asp3 asp2 sub size 13 sub { - /i exch def - i 4 putalgnpat - 4 i putalgnpat - } for - asp2 2 sub asp3 asp2 sub size 9 sub { - /x exch def - asp2 2 sub asp3 asp2 sub size 9 sub { - /y exch def - x y putalgnpat - } for - } for - - % Timing patterns + } def format (full) eq { - 8 1 size 9 sub { + /algnpat algnpatfull def + asp2 2 sub asp3 asp2 sub cols 13 sub { /i exch def - pixs i 6 qmv i 1 add 2 mod put - pixs 6 i qmv i 1 add 2 mod put + i 4 putalgnpat + 4 i putalgnpat } for - } { - 8 1 size 1 sub { + 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 algnpatrmqr def + asp2 2 sub asp3 asp2 sub cols 13 sub { /i exch def - pixs i 0 qmv i 1 add 2 mod put - pixs 0 i qmv i 1 add 2 mod put + i 0 putalgnpat + i rows 3 sub putalgnpat } for - } ifelse - + } if + % Format information modules - format (full) eq { - /formatmap [ - [ [ 0 8 ] [ 8 size 1 sub ] ] [ [ 1 8 ] [ 8 size 2 sub ] ] [ [ 2 8 ] [ 8 size 3 sub ] ] - [ [ 3 8 ] [ 8 size 4 sub ] ] [ [ 4 8 ] [ 8 size 5 sub ] ] [ [ 5 8 ] [ 8 size 6 sub ] ] - [ [ 7 8 ] [ 8 size 7 sub ] ] [ [ 8 8 ] [ size 8 sub 8 ] ] [ [ 8 7 ] [ size 7 sub 8 ] ] - [ [ 8 5 ] [ size 6 sub 8 ] ] [ [ 8 4 ] [ size 5 sub 8 ] ] [ [ 8 3 ] [ size 4 sub 8 ] ] - [ [ 8 2 ] [ size 3 sub 8 ] ] [ [ 8 1 ] [ size 2 sub 8 ] ] [ [ 8 0 ] [ size 1 sub 8 ] ] - ] def - } { - /formatmap [ +{ + /formatmapmicro [ [ [ 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 ] ] - ] def - } ifelse + ] def +} ctxdef + /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) formatmapmicro + (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 0 put } forall + { {} forall qmv pixs exch 1 put } forall } forall - + % Version information modules - size 45 ge { + format (full) eq cols 45 ge and { /versionmap [ - [ [ size 9 sub 5 ] [ 5 size 9 sub ] ] [ [ size 10 sub 5 ] [ 5 size 10 sub ] ] - [ [ size 11 sub 5 ] [ 5 size 11 sub ] ] [ [ size 9 sub 4 ] [ 4 size 9 sub ] ] - [ [ size 10 sub 4 ] [ 4 size 10 sub ] ] [ [ size 11 sub 4 ] [ 4 size 11 sub ] ] - [ [ size 9 sub 3 ] [ 3 size 9 sub ] ] [ [ size 10 sub 3 ] [ 3 size 10 sub ] ] - [ [ size 11 sub 3 ] [ 3 size 11 sub ] ] [ [ size 9 sub 2 ] [ 2 size 9 sub ] ] - [ [ size 10 sub 2 ] [ 2 size 10 sub ] ] [ [ size 11 sub 2 ] [ 2 size 11 sub ] ] - [ [ size 9 sub 1 ] [ 1 size 9 sub ] ] [ [ size 10 sub 1 ] [ 1 size 10 sub ] ] - [ [ size 11 sub 1 ] [ 1 size 11 sub ] ] [ [ size 9 sub 0 ] [ 0 size 9 sub ] ] - [ [ size 10 sub 0 ] [ 0 size 10 sub ] ] [ [ size 11 sub 0 ] [ 0 size 11 sub ] ] + [ [ 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 @@ -16929,29 +21115,31 @@ begin % Reserve the solitary dark module in full symbols format (full) eq { - pixs 8 size 8 sub qmv 0 put + pixs 8 rows 8 sub qmv 0 put } if % Calculate the mask patterns - format (full) eq { - /maskfuncs [ - {add 2 mod} bind - {exch pop 2 mod} bind - {pop 3 mod} bind - {add 3 mod} bind - {2 idiv exch 3 idiv add 2 mod} bind - {mul dup 2 mod exch 3 mod add} bind - {mul dup 2 mod exch 3 mod add 2 mod} bind - {2 copy mul 3 mod 3 1 roll add 2 mod add 2 mod} bind - ] def - } { - /maskfuncs [ - {exch pop 2 mod} bind - {2 idiv exch 3 idiv add 2 mod} bind - {mul dup 2 mod exch 3 mod add 2 mod} bind - {2 copy mul 3 mod 3 1 roll add 2 mod add 2 mod} bind - ] def - } ifelse + /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 @@ -16959,22 +21147,22 @@ begin /masks maskfuncs length array def 0 1 masks length 1 sub { /m exch def - /mask size size mul array def - 0 1 size 1 sub { + /mask rows cols mul array def + 0 1 rows 1 sub { /j exch def - 0 1 size 1 sub { + 0 1 cols 1 sub { /i exch def - i j maskfuncs m get exec 0 eq + 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 size 1 sub def - /posy size 1 sub def + /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 @@ -16990,9 +21178,9 @@ begin /posx posx 1 sub def } { /col 1 def - /posx posx 1 add def + /posx posx 1 add def /posy posy dir add def - posy 0 lt posy size ge or { % Turn around at top and bottom + 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 @@ -17025,23 +21213,23 @@ begin } if } for scr1 scr3 - } bind def - + } def + % Evaluation algorithm for full symbols /evalfull { /sym exch def /n1 0 def /n2 0 def /n3 0 def - /rle size 1 add array def - /lastpairs size array def - /thispairs size array def - /sizeadd1 size 1 add def - 0 1 size 1 sub { + /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 size dup dup mul 1 sub { + i cols dup dup mul 1 sub { sym exch get exch 1 index eq {exch 1 add exch} {1 exch} ifelse } for pop @@ -17050,11 +21238,11 @@ begin pop % Runlength encode (light, dark, light, ...) and evaluate each row - /symrow sym i size mul size getinterval def - mark 0 0 - symrow { + /symrow sym i cols mul cols getinterval def + mark 0 0 + symrow { exch 1 index eq {exch 1 add exch} {1 exch} ifelse - } forall + } forall pop rle 0 counttomark 2 sub getinterval astore evalfulln1n3 n3 add /n3 exch def n1 add /n1 exch def @@ -17069,52 +21257,52 @@ begin i 0 gt { mark lastpairs aload pop thispairs aload pop - n2 size { exch sizeadd1 index add 3 and 0 eq {3 add} if } repeat + n2 cols { exch colsadd1 index add 3 and 0 eq {3 add} if } repeat /n2 exch def cleartomark } if } for - - % Score dark/light imbalance + + % Score dark/light imbalance /dark 0 sym {add} forall def - /n4 dark 100 mul size dup mul div 50 sub abs 5 div cvi 10 mul 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 - + } def + % Evaluation algorithm for micro symbols /evalmicro { /sym exch def /dkrhs 0 def /dkbot 0 def - 1 1 size 1 sub { + 1 1 cols 1 sub { /i exch def - /dkrhs dkrhs sym size 1 sub i qmv get add def - /dkbot dkbot sym i size 1 sub qmv get add 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 - + } def + % Evaluate the masked symbols to find the most suitable /bestscore 999999999 def 0 1 masks length 1 sub { /m exch def - /masksym size size mul array def - 0 1 size size mul 1 sub { + /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 { + 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 { + score bestscore lt { /bestsym masksym def /bestmaskval m def /bestscore score def @@ -17127,46 +21315,85 @@ begin % Set the solitary dark module in full symbols format (full) eq { - pixs 8 size 8 sub qmv 1 put + pixs 8 cols 8 sub qmv 1 put } if % Add the format information +{ + /fmtvalsfull [ + 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 + /fmtvalsmicro [ + 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 + /fmtvalsrmqr1 [ + 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 + /fmtvalsrmqr2 [ + 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 +} ctxdef 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 - } { - /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] ] size 11 sub 2 idiv get eclval get def - /fmtval fmtvals symid 2 bitshift bestmaskval add get def - } ifelse - 0 1 formatmap length 1 sub { - /i exch def - formatmap i get { - pixs exch {} forall qmv fmtval 14 i sub neg bitshift 1 and put - } forall - } for - + /fmtval fmtvalsfull 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 { + /symid [ [0] [1 2] [3 4] [5 6 7] ] cols 11 sub 2 idiv get eclval get def + /fmtval fmtvalsmicro 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 { + /fmtvalu (MH) eclevel search pop length exch pop exch pop 5 bitshift verind add def + /fmtval1 fmtvalsrmqr1 fmtvalu get def + /fmtval2 fmtvalsrmqr2 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 - size 45 ge { - /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 size 17 sub 4 idiv 7 sub get def +{ + /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 +} ctxdef + format (full) eq cols 45 ge and { + /verval vervals cols 17 sub 4 idiv 7 sub get def 0 1 versionmap length 1 sub { /i exch def versionmap i get { @@ -17179,18 +21406,22 @@ begin << /ren //renmatrix /pixs pixs - /pixx size - /pixy size - /height size 2 mul 72 div - /width size 2 mul 72 div + /pixx cols + /pixy rows + /height rows 2 mul 72 div + /width cols 2 mul 72 div /opt options >> dontdraw not //renmatrix if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /qrcode dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -17198,16 +21429,156 @@ end %%EndResource % --END ENCODER qrcode-- +% --BEGIN ENCODER swissqrcode-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix qrcode-- +% --DESC: Swiss QR Code +% --EXAM: +% --EXOP: +% --RNDR: renmatrix +%%BeginResource: uk.co.terryburton.bwipp swissqrcode 0.0 2022082100 68213 68020 +%%BeginData: 128 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +10 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /parseinput 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 + + /ctx null def + /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 + /fncvals << + /parse parse + /parseonly true + /parsefnc false + >> def + /barcode barcode fncvals //parseinput exec def + /barlen barcode length def + options (parse) undef + + % 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 +% --END ENCODER swissqrcode-- + % --BEGIN ENCODER microqrcode-- -% --REQUIRES preamble raiseerror renmatrix qrcode-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix qrcode-- % --DESC: Micro QR Code % --EXAM: 1234 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp microqrcode 0.0 2017040400 59531 59384 -%%BeginData: 43 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp microqrcode 0.0 2022082100 62905 62760 +%%BeginData: 46 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 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 @@ -17219,6 +21590,7 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def % Parse the input options @@ -17240,12 +21612,14 @@ begin args (opt) options put args - + dontdraw not //renmatrix if end -} bind def +} +[/barcode] {null def} forall +bind def /microqrcode dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -17253,17 +21627,78 @@ end %%EndResource % --END ENCODER microqrcode-- +% --BEGIN ENCODER rectangularmicroqrcode-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix qrcode-- +% --DESC: Rectangular Micro QR Code +% --EXAM: 1234 +% --EXOP: version=R17x139 +% --RNDR: renmatrix +%%BeginResource: uk.co.terryburton.bwipp rectangularmicroqrcode 0.0 2022082100 62948 62792 +%%BeginData: 46 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +10 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 +/rectangularmicroqrcode { + + 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 + + /ctx null def + /dontdraw 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 + + % Get the result of encoding with qrcode with format=micro + options (dontdraw) true put + options (format) (rmqr) put + + /args barcode options //qrcode exec def + + args (opt) options put + args + + dontdraw not //renmatrix if + + end + +} +[/barcode] {null def} forall +bind def +/rectangularmicroqrcode dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER rectangularmicroqrcode-- + % --BEGIN ENCODER maxicode-- -% --REQUIRES preamble raiseerror renmaximatrix-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmaximatrix-- % --DESC: MaxiCode % --EXAM: [)>^03001^02996152382802^029840^029001^0291Z00004951^029UPSN^02906X610^029159^0291234567^0291/1^029^029Y^029634 ALPHA DR^029PITTSBURGH^029PA^029^004 % --EXOP: mode=2 parse % --RNDR: renmaximatrix -%%BeginResource: uk.co.terryburton.bwipp maxicode 0.0 2017040400 141526 147393 -%%BeginData: 564 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp maxicode 0.0 2022082100 132737 135002 +%%BeginData: 607 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /parseinput dup /uk.co.terryburton.bwipp findresource put dup /renmaximatrix dup /uk.co.terryburton.bwipp findresource put begin /maxicode { @@ -17273,10 +21708,12 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /mode -1 def /sam -1 def /parse false def + /parsefnc false def % Parse the input options options type /stringtype eq { @@ -17292,64 +21729,66 @@ begin /mode mode cvi def /sam sam cvi def - % 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 - - /msg barcode def + /maxicode //loadctx exec + + % Parse the input + /fncvals << + /parse parse + /parsefnc parsefnc + /eci true + % ECIs only + >> def + /msg barcode fncvals //parseinput exec def /msglen msg length def % Special message handling for modes 2 and 3 mode 2 eq mode 3 eq or { - % Normalise messages that begin with a field identifier [)>RS01GSyy - msg 0 7 getinterval <5b293e1e30311d> eq { - /fid msg 0 9 getinterval def - /msg msg 9 msglen 9 sub getinterval def + % Convert to a string for extracting the structured data + /barcode msglen string def + 0 1 msglen 1 sub { + /i exch def + msg i get 0 gt { + barcode i msg i get put + } if + } for + /barlen barcode length def + + % Normalise messages that begin with a field identifier [)>{RS}01{GS}yy + barcode 0 7 getinterval <5b293e1e30311d> eq { + /fid barcode 0 9 getinterval def + /barcode barcode 9 barlen 9 sub getinterval def } { /fid () def } ifelse - % Read the postcode, country code and service code fields seperated by GS - msg <1d> search pop /pcode exch def + % Read the postcode, country code and service code fields separated by GS + barcode <1d> search pop /pcode exch def pop <1d> search pop /ccode exch def pop <1d> search pop /scode exch def - pop /msg exch def + pop /barcode exch def % Prepend the field identifier - msg length fid length add string dup - 0 fid putinterval dup - fid length msg putinterval - /msg exch def + barcode length fid length add string dup + 0 fid putinterval dup + fid length barcode putinterval + /barcode exch def + /barlen barcode length def + + /msg [ barcode {} forall ] def /msglen msg length def } if +{ % Special function characters /eci -1 def /pad -2 def /ns -3 def /la -4 def /lb -5 def /sa -6 def /sb -7 def /sc -8 def /sd -9 def /se -10 def - /sa2 -11 def /sa3 -12 def + /sa2 -11 def /sa3 -12 def /lkc -13 def /lkd -14 def /lke -15 def - /pd2 -16 def /pd3 -17 def - + /pd2 -16 def /pd3 -17 def + % Character maps for each state /charmaps [ % A B C D E @@ -17362,7 +21801,7 @@ begin [ (F) (f) 198 230 6 ] % 6 [ (G) (g) 199 231 7 ] % 7 [ (H) (h) 200 232 8 ] % 8 - [ (I) (i) 201 233 9 ] % 9 + [ (I) (i) 201 233 9 ] % 9 [ (J) (j) 202 234 10 ] % 10 [ (K) (k) 203 235 11 ] % 11 [ (L) (l) 204 236 12 ] % 12 @@ -17417,8 +21856,8 @@ begin [ sd sd sd lkd sd ] % 61 [ se se se se lke ] % 62 [ lb la lb lb lb ] % 63 - ] def - + ] def + % Invert charmaps to give character to value maps for each state /charvals [ 64 dict 64 dict 64 dict 64 dict 64 dict ] def 0 1 charmaps length 1 sub { @@ -17427,7 +21866,7 @@ begin 0 1 4 { /j exch def encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required - charvals j get exch i put + charvals j get exch i put } for } for /seta charvals 0 get def @@ -17435,6 +21874,7 @@ begin /setc charvals 2 get def /setd charvals 3 get def /sete charvals 4 get def +} ctxdef % Compute numeric runlengths /nseq [ msglen 1 add {0} repeat ] def @@ -17448,19 +21888,19 @@ begin } for /nseq nseq 0 msglen getinterval def - % Encode the message from ASCII to codewords + % Encode the message from ASCII to codewords /prefixinset { 0 { - 2 copy exch length ge {exit} if + 2 copy exch length ge {exit} if 2 copy get 3 index exch known {1 add} {exit} ifelse } loop exch pop exch pop - } bind def - + } def + /enc { exch get out exch j exch put /j j 1 add def - } bind def + } def /out 144 array def /i 0 def /j 0 def /cset (seta) def @@ -17474,29 +21914,58 @@ begin exit } if { % not a loop but common exit point - + % Immediately encode an ECI + msg i get -1000000 le { + eci cset load enc + msg i get neg 1000000 sub + dup 000031 le { % ECI 000000 - 000031 + 63 and + 1 array astore + } { dup 001023 le { % ECI 000032 - 001023 + dup -6 bitshift 31 and 32 or exch + 63 and + 2 array astore + } { dup 032767 le { % ECI 001024 - 032767 + dup -12 bitshift 47 and 48 or exch + dup -6 bitshift 63 and exch + 63 and + 3 array astore + } { % ECI 032768 - 999999 + dup -18 bitshift 55 and 56 or exch + dup -12 bitshift 63 and exch + dup -6 bitshift 63 and exch + 63 and + 4 array astore + } ifelse } ifelse } ifelse + dup out exch j exch putinterval + length j add /j exch def + /i i 1 add def + exit + } if + % If 9 numerals available then use NS nseq i get 9 ge { - msg i 9 getinterval cvi 4 { dup 63 and exch -6 bitshift } repeat cset load ns get + msg i 9 getinterval 0 exch {48 sub add 10 mul} forall 10 idiv + 4 { dup 63 and exch -6 bitshift } repeat cset load ns get 0 2 10 {index} for 6 array astore 7 1 roll 6 {pop} repeat out exch j exch putinterval /i i 9 add def /j j 6 add def exit } if - + % Read next three characters /char1 msg i get def /char2 i 1 add msglen lt {msg i 1 add get} {-99} ifelse def /char3 i 2 add msglen lt {msg i 2 add get} {-99} ifelse def - + % If current mode is sufficient then directly encode - cset load char1 known { + cset load char1 known { char1 cset load enc /i i 1 add def exit } if - + % For switching from A to B cset (seta) eq setb char1 known and { setb char2 known { @@ -17509,7 +21978,7 @@ begin } ifelse exit } if - + % For switching from B to A encode according to length of prefix cset (setb) eq seta char1 known and { /p seta msg i 4 msglen i sub 2 copy gt {exch} if pop getinterval prefixinset def @@ -17522,14 +21991,14 @@ begin sa2 setb enc char1 seta enc char2 seta enc - /i i 2 add def + /i i 2 add def } if p 3 eq { sa3 setb enc char1 seta enc char2 seta enc char3 seta enc - /i i 3 add def + /i i 3 add def } if p 4 ge { la setb enc @@ -17537,24 +22006,24 @@ begin } if exit } if - + % If character is in A or B then directly latch seta char1 known { la cset load enc /cset (seta) def exit - } if + } if setb char1 known { lb cset load enc /cset (setb) def exit - } if - + } if + % Determine which one of sets C, D or E the character is in setc char1 known {/setx (setc) def /sx sc def /lkx lkc def} if setd char1 known {/setx (setd) def /sx sd def /lkx lkd def} if sete char1 known {/setx (sete) def /sx se def /lkx lke def} if - + % Encode according to the length of the prefix /p setx load msg i 4 msglen i sub 2 copy gt {exch} if pop getinterval prefixinset def p 1 eq { @@ -17581,20 +22050,20 @@ begin p 4 ge { sx cset load enc lkx setx load enc - /cset setx def + /cset setx def } if - + exit } loop % out } loop /encmsg out 0 j getinterval def - /padval cset load pad get def + /padval cset load pad get def % Prefix the encoded message with the structured append insert /sami [] def sam -1 ne { /sami 2 array def - sami 0 seta pad get put + sami 0 seta pad get put sami 1 sam 10 idiv 1 sub 8 mul sam 10 mod 1 sub add put } if /encmsg [ sami aload pop encmsg aload pop ] def @@ -17613,8 +22082,8 @@ begin pcb pcode cvi 2 30 string cvrs dup length 36 exch sub exch putinterval } { % mode=3 % For alphanumeric postcode, trim or pad with spaces to 6 chars and encode to binary - /pccw [ - ( ) 6 string copy dup 0 pcode length 6 gt {pcode 0 6 getinterval} {pcode} ifelse putinterval + /pccw [ + ( ) 6 string copy dup 0 pcode length 6 gt {pcode 0 6 getinterval} {pcode} ifelse putinterval {seta exch get} forall ] def 0 1 5 { @@ -17641,7 +22110,7 @@ begin % Evaluate the structured carrier message as codewords /pri [ 0 0 0 0 0 0 0 0 0 0 ] def - 0 1 59 { + 0 1 59 { /i exch def /ps i 6 idiv def /ep 2 5 i 6 mod sub exp cvi scm i get 48 sub mul def @@ -17685,7 +22154,7 @@ begin } { pop pop 0 } ifelse - } bind def + } def % Generate error correction codewords /rscodes { @@ -17720,7 +22189,7 @@ begin ecb - } bind def + } def % Split secondary codeword into odd and even elements /seco [ 0 2 sec length 1 sub { sec exch get } for ] def @@ -17734,11 +22203,11 @@ begin % Recompose the secondary parity codewords /secchk [ 0 1 scodes 1 sub { dup secochk exch get exch secechk exch get } for ] def - % Concatinate the data into final codewords + % Concatenate the data into final codewords /codewords [ - pri aload pop + pri aload pop pri 10 rscodes aload pop - sec aload pop + sec aload pop secchk aload pop ] def @@ -17751,52 +22220,54 @@ begin } for % Maps modules to pixels in the grid +{ /modmap [ - 469 529 286 316 347 346 673 672 703 702 647 676 283 282 313 312 370 610 618 379 - 378 409 408 439 705 704 559 589 588 619 458 518 640 701 675 674 285 284 315 314 - 310 340 531 289 288 319 349 348 456 486 517 516 471 470 369 368 399 398 429 428 - 549 548 579 578 609 608 649 648 679 678 709 708 639 638 669 668 699 698 279 278 - 309 308 339 338 381 380 411 410 441 440 561 560 591 590 621 620 547 546 577 576 - 607 606 367 366 397 396 427 426 291 290 321 320 351 350 651 650 681 680 711 710 - 1 0 31 30 61 60 3 2 33 32 63 62 5 4 35 34 65 64 7 6 - 37 36 67 66 9 8 39 38 69 68 11 10 41 40 71 70 13 12 43 42 - 73 72 15 14 45 44 75 74 17 16 47 46 77 76 19 18 49 48 79 78 - 21 20 51 50 81 80 23 22 53 52 83 82 25 24 55 54 85 84 27 26 - 57 56 87 86 117 116 147 146 177 176 115 114 145 144 175 174 113 112 143 142 - 173 172 111 110 141 140 171 170 109 108 139 138 169 168 107 106 137 136 167 166 - 105 104 135 134 165 164 103 102 133 132 163 162 101 100 131 130 161 160 99 98 - 129 128 159 158 97 96 127 126 157 156 95 94 125 124 155 154 93 92 123 122 - 153 152 91 90 121 120 151 150 181 180 211 210 241 240 183 182 213 212 243 242 - 185 184 215 214 245 244 187 186 217 216 247 246 189 188 219 218 249 248 191 190 - 221 220 251 250 193 192 223 222 253 252 195 194 225 224 255 254 197 196 227 226 - 257 256 199 198 229 228 259 258 201 200 231 230 261 260 203 202 233 232 263 262 - 205 204 235 234 265 264 207 206 237 236 267 266 297 296 327 326 357 356 295 294 - 325 324 355 354 293 292 323 322 353 352 277 276 307 306 337 336 275 274 305 304 - 335 334 273 272 303 302 333 332 271 270 301 300 331 330 361 360 391 390 421 420 - 363 362 393 392 423 422 365 364 395 394 425 424 383 382 413 412 443 442 385 384 - 415 414 445 444 387 386 417 416 447 446 477 476 507 506 537 536 475 474 505 504 - 535 534 473 472 503 502 533 532 455 454 485 484 515 514 453 452 483 482 513 512 - 451 450 481 480 511 510 541 540 571 570 601 600 543 542 573 572 603 602 545 544 - 575 574 605 604 563 562 593 592 623 622 565 564 595 594 625 624 567 566 597 596 - 627 626 657 656 687 686 717 716 655 654 685 684 715 714 653 652 683 682 713 712 - 637 636 667 666 697 696 635 634 665 664 695 694 633 632 663 662 693 692 631 630 - 661 660 691 690 721 720 751 750 781 780 723 722 753 752 783 782 725 724 755 754 - 785 784 727 726 757 756 787 786 729 728 759 758 789 788 731 730 761 760 791 790 - 733 732 763 762 793 792 735 734 765 764 795 794 737 736 767 766 797 796 739 738 - 769 768 799 798 741 740 771 770 801 800 743 742 773 772 803 802 745 744 775 774 - 805 804 747 746 777 776 807 806 837 836 867 866 897 896 835 834 865 864 895 894 - 833 832 863 862 893 892 831 830 861 860 891 890 829 828 859 858 889 888 827 826 - 857 856 887 886 825 824 855 854 885 884 823 822 853 852 883 882 821 820 851 850 - 881 880 819 818 849 848 879 878 817 816 847 846 877 876 815 814 845 844 875 874 - 813 812 843 842 873 872 811 810 841 840 871 870 901 900 931 930 961 960 903 902 - 933 932 963 962 905 904 935 934 965 964 907 906 937 936 967 966 909 908 939 938 - 969 968 911 910 941 940 971 970 913 912 943 942 973 972 915 914 945 944 975 974 - 917 916 947 946 977 976 919 918 949 948 979 978 921 920 951 950 981 980 923 922 - 953 952 983 982 925 924 955 954 985 984 927 926 957 956 987 986 58 89 88 118 - 149 148 178 209 208 238 269 268 298 329 328 358 389 388 418 449 448 478 509 508 - 538 569 568 598 629 628 658 689 688 718 749 748 778 809 808 838 869 868 898 929 + 469 529 286 316 347 346 673 672 703 702 647 676 283 282 313 312 370 610 618 379 + 378 409 408 439 705 704 559 589 588 619 458 518 640 701 675 674 285 284 315 314 + 310 340 531 289 288 319 349 348 456 486 517 516 471 470 369 368 399 398 429 428 + 549 548 579 578 609 608 649 648 679 678 709 708 639 638 669 668 699 698 279 278 + 309 308 339 338 381 380 411 410 441 440 561 560 591 590 621 620 547 546 577 576 + 607 606 367 366 397 396 427 426 291 290 321 320 351 350 651 650 681 680 711 710 + 1 0 31 30 61 60 3 2 33 32 63 62 5 4 35 34 65 64 7 6 + 37 36 67 66 9 8 39 38 69 68 11 10 41 40 71 70 13 12 43 42 + 73 72 15 14 45 44 75 74 17 16 47 46 77 76 19 18 49 48 79 78 + 21 20 51 50 81 80 23 22 53 52 83 82 25 24 55 54 85 84 27 26 + 57 56 87 86 117 116 147 146 177 176 115 114 145 144 175 174 113 112 143 142 + 173 172 111 110 141 140 171 170 109 108 139 138 169 168 107 106 137 136 167 166 + 105 104 135 134 165 164 103 102 133 132 163 162 101 100 131 130 161 160 99 98 + 129 128 159 158 97 96 127 126 157 156 95 94 125 124 155 154 93 92 123 122 + 153 152 91 90 121 120 151 150 181 180 211 210 241 240 183 182 213 212 243 242 + 185 184 215 214 245 244 187 186 217 216 247 246 189 188 219 218 249 248 191 190 + 221 220 251 250 193 192 223 222 253 252 195 194 225 224 255 254 197 196 227 226 + 257 256 199 198 229 228 259 258 201 200 231 230 261 260 203 202 233 232 263 262 + 205 204 235 234 265 264 207 206 237 236 267 266 297 296 327 326 357 356 295 294 + 325 324 355 354 293 292 323 322 353 352 277 276 307 306 337 336 275 274 305 304 + 335 334 273 272 303 302 333 332 271 270 301 300 331 330 361 360 391 390 421 420 + 363 362 393 392 423 422 365 364 395 394 425 424 383 382 413 412 443 442 385 384 + 415 414 445 444 387 386 417 416 447 446 477 476 507 506 537 536 475 474 505 504 + 535 534 473 472 503 502 533 532 455 454 485 484 515 514 453 452 483 482 513 512 + 451 450 481 480 511 510 541 540 571 570 601 600 543 542 573 572 603 602 545 544 + 575 574 605 604 563 562 593 592 623 622 565 564 595 594 625 624 567 566 597 596 + 627 626 657 656 687 686 717 716 655 654 685 684 715 714 653 652 683 682 713 712 + 637 636 667 666 697 696 635 634 665 664 695 694 633 632 663 662 693 692 631 630 + 661 660 691 690 721 720 751 750 781 780 723 722 753 752 783 782 725 724 755 754 + 785 784 727 726 757 756 787 786 729 728 759 758 789 788 731 730 761 760 791 790 + 733 732 763 762 793 792 735 734 765 764 795 794 737 736 767 766 797 796 739 738 + 769 768 799 798 741 740 771 770 801 800 743 742 773 772 803 802 745 744 775 774 + 805 804 747 746 777 776 807 806 837 836 867 866 897 896 835 834 865 864 895 894 + 833 832 863 862 893 892 831 830 861 860 891 890 829 828 859 858 889 888 827 826 + 857 856 887 886 825 824 855 854 885 884 823 822 853 852 883 882 821 820 851 850 + 881 880 819 818 849 848 879 878 817 816 847 846 877 876 815 814 845 844 875 874 + 813 812 843 842 873 872 811 810 841 840 871 870 901 900 931 930 961 960 903 902 + 933 932 963 962 905 904 935 934 965 964 907 906 937 936 967 966 909 908 939 938 + 969 968 911 910 941 940 971 970 913 912 943 942 973 972 915 914 945 944 975 974 + 917 916 947 946 977 976 919 918 949 948 979 978 921 920 951 950 981 980 923 922 + 953 952 983 982 925 924 955 954 985 984 927 926 957 956 987 986 58 89 88 118 + 149 148 178 209 208 238 269 268 298 329 328 358 389 388 418 449 448 478 509 508 + 538 569 568 598 629 628 658 689 688 718 749 748 778 809 808 838 869 868 898 929 928 958 989 988 ] def +} ctxdef % Lookup pixels for enabled modules from modmap /pixs 864 array def @@ -17819,9 +22290,13 @@ begin dontdraw not //renmaximatrix if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /maxicode dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -17830,16 +22305,19 @@ end % --END ENCODER maxicode-- % --BEGIN ENCODER azteccode-- -% --REQUIRES preamble raiseerror renmatrix-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix-- % --DESC: Aztec Code % --EXAM: This is Aztec Code % --EXOP: format=full % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp azteccode 0.0 2017040400 209943 222599 -%%BeginData: 679 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp azteccode 0.0 2022082100 189159 191319 +%%BeginData: 794 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /parseinput dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put begin /azteccode { @@ -17849,6 +22327,7 @@ begin /options exch def /barcode exch def + /ctx null def /dontdraw false def /format (unset) def % full, compact or rune /readerinit false def @@ -17857,6 +22336,7 @@ begin /ecaddchars 3 def /raw false def /parse false def + /parsefnc false def % Parse the input options options type /stringtype eq { @@ -17868,149 +22348,170 @@ begin currentdict end /options exch def } if options {def} forall - + /layers layers cvi def /eclevel eclevel cvr def /ecaddchars ecaddchars cvi def - % 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 + /azteccode //loadctx exec + + format (rune) eq { + barcode length 0 eq { + /bwipp.aztecRuneNotNumeric (Aztec runes must be numeric) //raiseerror exec + } if + barcode { + dup 48 lt exch 57 gt or { + /bwipp.aztecRuneNotNumeric (Aztec runes must be numeric) //raiseerror exec + } if + } forall + barcode cvi dup 0 lt exch 255 gt or { + /bwipp.aztecRuneInvalid (Aztec runes must be 0 to 255) //raiseerror exec + } if } if - % Convert from input into message bitstream - /msgbits () def - format (rune) ne raw and {/msgbits barcode def} if - format (rune) ne raw not and { + % Parse the input + /fn1 -1 def + /fncvals << + /parse parse + /parsefnc parsefnc + /eci true + (FNC1) fn1 + >> def + /msg barcode fncvals //parseinput exec def + /msglen msg length def - % State key: "U"pper, "L"ower, "M"ixed, "P"unctuation, "D"igit, "B"inary - /U 0 def /L 1 def /M 2 def /P 3 def /D 4 def /B 5 def - - % Special function characters - /lu -1 def /ll -2 def /lm -3 def - /lp -4 def /ld -5 def /su -6 def - /sp -7 def /sb -8 def /fl -9 def - /p2 -10 def /p3 -11 def /p4 -12 def /p5 -13 def - - % Character maps for each state - /charmaps [ - % U L M P D - [ sp sp sp fl sp ] % 0 - [ 32 32 32 13 32 ] % 1 - [ (A) (a) 1 p2 (0) ] % 2 p2 = CR LF - [ (B) (b) 2 p3 (1) ] % 3 p3 = ". " - [ (C) (c) 3 p4 (2) ] % 4 p4 = ", " - [ (D) (d) 4 p5 (3) ] % 5 p5 = ": " - [ (E) (e) 5 (!) (4) ] % 6 - [ (F) (f) 6 (") (5) ] % 7 - [ (G) (g) 7 (#) (6) ] % 8 - [ (H) (h) 8 ($) (7) ] % 9 - [ (I) (i) 9 (%) (8) ] % 10 - [ (J) (j) 10 (&) (9) ] % 11 - [ (K) (k) 11 (') (,) ] % 12 - [ (L) (l) 12 40 (.) ] % 13 - [ (M) (m) 13 41 lu ] % 14 - [ (N) (n) 27 (*) su ] % 15 - [ (O) (o) 28 (+) -99 ] % 16 - [ (P) (p) 29 (,) -99 ] % 17 - [ (Q) (q) 30 (-) -99 ] % 18 - [ (R) (r) 31 (.) -99 ] % 19 - [ (S) (s) (@) (/) -99 ] % 20 - [ (T) (t) 92 (:) -99 ] % 21 - [ (U) (u) (^) (;) -99 ] % 22 - [ (V) (v) (_) (<) -99 ] % 23 - [ (W) (w) (`) (=) -99 ] % 24 - [ (X) (x) (|) (>) -99 ] % 25 - [ (Y) (y) (~) (?) -99 ] % 26 - [ (Z) (z) 127 ([) -99 ] % 27 - [ ll su ll (]) -99 ] % 28 - [ lm lm lu ({) -99 ] % 29 - [ ld ld lp (}) -99 ] % 30 - [ sb sb sb lu -99 ] % 31 - ] def - - % Invert charmaps to give character to value maps for each state - /charvals [ 32 dict 32 dict 32 dict 32 dict 16 dict ] def - 0 1 charmaps length 1 sub { - /i exch def - /encs charmaps i get def - 0 1 4 { - /j exch def - encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required - charvals j get exch i put - } for +{ + % State key: "U"pper, "L"ower, "M"ixed, "P"unctuation, "D"igit, "B"inary + /U 0 def /L 1 def /M 2 def /P 3 def /D 4 def /B 5 def + + % Special function characters + /lu -2 def /ll -3 def /lm -4 def + /lp -5 def /ld -6 def /su -7 def + /sp -8 def /sb -9 def /fl -10 def + /p2 -11 def /p3 -12 def /p4 -13 def /p5 -14 def + + % Character maps for each state + /charmaps [ + % U L M P D + [ sp sp sp fl sp ] % 0 + [ 32 32 32 13 32 ] % 1 + [ (A) (a) 1 p2 (0) ] % 2 p2 = CR LF + [ (B) (b) 2 p3 (1) ] % 3 p3 = ". " + [ (C) (c) 3 p4 (2) ] % 4 p4 = ", " + [ (D) (d) 4 p5 (3) ] % 5 p5 = ": " + [ (E) (e) 5 (!) (4) ] % 6 + [ (F) (f) 6 (") (5) ] % 7 + [ (G) (g) 7 (#) (6) ] % 8 + [ (H) (h) 8 ($) (7) ] % 9 + [ (I) (i) 9 (%) (8) ] % 10 + [ (J) (j) 10 (&) (9) ] % 11 + [ (K) (k) 11 (') (,) ] % 12 + [ (L) (l) 12 40 (.) ] % 13 + [ (M) (m) 13 41 lu ] % 14 + [ (N) (n) 27 (*) su ] % 15 + [ (O) (o) 28 (+) -99 ] % 16 + [ (P) (p) 29 (,) -99 ] % 17 + [ (Q) (q) 30 (-) -99 ] % 18 + [ (R) (r) 31 (.) -99 ] % 19 + [ (S) (s) (@) (/) -99 ] % 20 + [ (T) (t) 92 (:) -99 ] % 21 + [ (U) (u) (^) (;) -99 ] % 22 + [ (V) (v) (_) (<) -99 ] % 23 + [ (W) (w) (`) (=) -99 ] % 24 + [ (X) (x) (|) (>) -99 ] % 25 + [ (Y) (y) (~) (?) -99 ] % 26 + [ (Z) (z) 127 ([) -99 ] % 27 + [ ll su ll (]) -99 ] % 28 + [ lm lm lu ({) -99 ] % 29 + [ ld ld lp (}) -99 ] % 30 + [ sb sb sb lu -99 ] % 31 + ] def + + % Invert charmaps to give character to value maps for each state + /charvals [ 32 dict 32 dict 32 dict 32 dict 16 dict ] def + 0 1 charmaps length 1 sub { + /i exch def + /encs charmaps i get def + 0 1 4 { + /j exch def + encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required + charvals j get exch i put } for - - % Punctuation compression - /pcomp << - <0d0a> p2 % CR LF - (. ) p3 - (, ) p4 - (: ) p5 - >> def - - /e 10000 def % "Empty" - - /latlen [ % Bit length of latch between states - % To: U L M P D B From - [ 0 5 5 10 5 10 ] % U - [ 9 0 5 10 5 10 ] % L - [ 5 5 0 5 10 10 ] % M - [ 5 10 10 0 10 15 ] % P - [ 4 9 9 14 0 14 ] % D - [ 0 0 0 0 0 0 ] % B - ] def + } for - /latseq [ % Latch sequences between states - % To: U L M P D B From - [ [] [ll] [lm] [lm lp] [ld] [sb] ] % U - [ [ld lu] [] [lm] [lm lp] [ld] [sb] ] % L - [ [lu] [ll] [] [lp] [lu ld] [sb] ] % M - [ [lu] [lu ll] [lu lm] [] [lu ld] [lu sb] ] % P - [ [lu] [lu ll] [lu lm] [lu lm lp] [] [lu sb] ] % D - [ [lu] [ll] [lm] [] [] [] ] % B - ] def + % Punctuation compression + /pcomp << + <0d0a> p2 % CR LF + (. ) p3 + (, ) p4 + (: ) p5 + >> def + + /e 10000 def % "Empty" + + /latlen [ % Bit length of latch between states + % To: U L M P D B From + [ 0 5 5 10 5 10 ] % U + [ 9 0 5 10 5 10 ] % L + [ 5 5 0 5 10 10 ] % M + [ 5 10 10 0 10 15 ] % P + [ 4 9 9 14 0 14 ] % D + [ 0 0 0 0 0 0 ] % B + ] def + + /latseq [ % Latch sequences between states + % To: U L M P D B From + [ [] [ll] [lm] [lm lp] [ld] [sb] ] % U + [ [ld lu] [] [lm] [lm lp] [ld] [sb] ] % L + [ [lu] [ll] [] [lp] [lu ld] [sb] ] % M + [ [lu] [lu ll] [lu lm] [] [lu ld] [lu sb] ] % P + [ [lu] [lu ll] [lu lm] [lu lm lp] [] [lu sb] ] % D + [ [lu] [ll] [lm] [] [] [] ] % B + ] def + + /shftlen [ % Bit length of shift to state + % To: U L M P D From + [ e e e 5 e ] % U + [ 5 e e 5 e ] % L + [ e e e 5 e ] % M + [ e e e e e ] % P + [ 4 e e 4 e ] % D + ] def + +} ctxdef + + % Convert from input into message bitstream + /msgbits () def + format (rune) ne raw and {/msgbits barcode def} if + format (rune) ne raw not and { + + /charsize { + dup 0 ge { + % U L M P D B + pop [ 5 5 5 5 4 8 ] exch get + } { % FNC or ECI in P + exch pop + dup fn1 eq { % FNC1: PS{Flg(0)} + 3 + pop 8 + } { % ECI: PS{Flg(n)} + 3 + 4n + neg 1000000 sub dup 0 eq {pop 1} if + ln 10 ln div cvi 1 add 4 mul 8 add + } ifelse + } ifelse + } def - /shftlen [ % Bit length of shift to state - % To: U L M P D From - [ e e e 5 e ] % U - [ 5 e e 5 e ] % L - [ e e e 5 e ] % M - [ e e e e e ] % P - [ 4 e e 4 e ] % D - ] def - - % U L M P D B - /charsize [ 5 5 5 5 4 8 ] def - % U L M P D B /curlen [ 0 e e e e e ] def /curseq [ [] [] [] [] [] [] ] def - + /backto U def % U /lastchar () def - + % Derive the optimal sequences ending in each state - barcode { - + msg { + /char exch def - + % Check for optimisations in the current sequences by latching from x to y { % loop /imp false def @@ -18037,31 +22538,35 @@ begin imp not {exit} if % Repeat unless no improvement } loop - % Determine optimal next sequences for each valid encoding - /nxtlen [ e e e e e e ] def + % Determine optimal next sequences for each valid encoding + /nxtlen [ e e e e e e ] def /nxtseq 6 array def - + [ U L M P D B ] { /x exch def - + { % loop for common exit - + % Skip states that cannot encode character - x B ne {charvals x get char known not {exit} if} if - + char 0 ge { + x B ne {charvals x get char known not {exit} if} if + } { + x P ne {exit} if % Only P can encode FNC1 and ECI + } ifelse + % Extend directly - /cost curlen x get charsize x get add def + /cost curlen x get x char charsize add def cost nxtlen x get lt { nxtlen x cost put nxtseq x [ curseq x get aload pop char ] put } if - - % Optimise for direct shifts from y to x + + % Optimise for direct shifts from y to x x B eq {exit} if % B is treated as a latch [ U L M P D ] { /y exch def x y ne { - /cost curlen y get shftlen y get x get add charsize x get add def + /cost curlen y get shftlen y get x get add x char charsize add def cost nxtlen y get lt { nxtlen y cost put nxtseq y [ @@ -18072,36 +22577,88 @@ begin } if } if } forall - + exit } loop - + } forall - + % Optimise using P compression - lastchar () ne { + lastchar () ne char 0 ge and { /pchars 2 string dup 0 lastchar put dup 1 char put def pcomp pchars known { - curlen P get nxtlen P get lt { - nxtlen P curlen P get put - nxtseq P [ curseq P get aload pop pop pcomp pchars get ] put - } if + [ U L M P D ] { + /i exch def + /inP true def % U and L can't encode CR, comma, dot or colon + i M eq { % M can encode CR + lastchar 13 eq { /inP false def } if + } { + i D eq { % D can encode comma and dot + lastchar 44 eq lastchar 46 eq or { /inP false def } if + } if + } ifelse + inP curlen i get nxtlen i get lt and { + /curseqi curseq i get def + /lastld false def + /lastsp false def + /lastidx -1 def + curseqi length 1 sub -1 0 { % Search backwards for lastchar + /idx exch def + /ch curseqi idx get def + lastidx -1 eq { + ch lastchar eq { + /lastidx idx def + idx 0 gt { + curseqi idx 1 sub get sp eq { /lastsp true def } if % Preceded by P/S + } if + } if + } { % Found lastchar, check latch + ch 0 lt ch ld ge and { % If have latch + i P eq { + ch ld eq { /lastld true def } if % Set flag if D/L for adjustment below + } { + ch lp ne { /inP lastsp def } if % If not P/L only in P if have P/S + } ifelse + exit + } if + } ifelse + } for + inP lastidx 0 ge and { + nxtlen i curlen i get put + lastidx curseqi length 1 sub lt { % If lastchar not at end of sequence + i P eq { + lastld { nxtlen i nxtlen i get 1 add put } if % Adjust count if D/L + % Move lastchar to end and replace + nxtseq i [ curseqi aload pop curseqi length lastidx sub -1 roll pop pcomp pchars get ] put + } { + % Replace lastchar in situ + nxtseq i [ curseqi aload pop ] put + nxtseq i get lastidx pcomp pchars get put + } ifelse + } { + nxtseq i [ curseqi aload pop pop pcomp pchars get ] put + } ifelse + } if + } if + } forall } if - } if - + } if + % Account for binary extension for 32 or more bytes - /numbytes 0 def - nxtseq B get { - sb eq {0} {numbytes 1 add} ifelse /numbytes exch def - } forall - numbytes 32 eq {nxtlen B nxtlen B get 11 add put} if - + nxtseq B get null ne { + /numbytes 0 def + nxtseq B get { + sb eq {0} {numbytes 1 add} ifelse /numbytes exch def + } forall + numbytes 32 eq {nxtlen B nxtlen B get 11 add put} if + } if + /curlen nxtlen def /curseq nxtseq def - /lastchar char def - + /lastchar char 0 ge {char} {()} ifelse def + } forall - + % Select the optimal sequence /minseq e def [ U L M P D B ] { @@ -18111,44 +22668,67 @@ begin /seq curseq i get def } if } forall - + % 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 - /encu {charvals U get exch get 5 tobin} bind def - /encl {charvals L get exch get 5 tobin} bind def - /encm {charvals M get exch get 5 tobin} bind def - /encp {charvals P get exch get 5 tobin} bind def - /encd {charvals D get exch get 4 tobin} bind def + dup 3 -1 roll 2 2 index length string cvrs dup length 2 index length exch sub exch putinterval + } def + + /encu {charvals U get exch get 5 tobin} def + /encl {charvals L get exch get 5 tobin} def + /encm {charvals M get exch get 5 tobin} def + /encd {charvals D get exch get 4 tobin} def + + /encp { + dup fn1 eq { % FNC1: Flg(0) + pop (00000000) + } { + dup -1000000 le { % ECI: Flg(n) + n-Digits + neg 1000000 sub dup dup 0 eq {pop 1} if + ln 10 ln div cvi + dup 1 add 4 mul 8 add string + dup 0 (00000) putinterval % Flg(n) + dup 2 index 1 add 3 tobin 5 exch putinterval % len + 3 1 roll -1 0 { % ECI digits in "Digit" encoding + 4 mul 8 add exch + dup 10 idiv 3 index 4 2 roll + 10 mod 2 add 4 tobin putinterval + } for + pop + } { + charvals P get exch get 5 tobin + } ifelse } ifelse + } def + /encfuncs [ /encu /encl /encm /encp /encd ] def + /addtomsgbits { /v exch def msgbits j v putinterval /j j v length add def - } bind def - + } def + % Encode the sequence /state U def /msgbits minseq string def /i 0 def /j 0 def { i seq length ge {exit} if - + state B ne { - + /char seq i get def - + % Encode character char encfuncs state get load exec addtomsgbits /i i 1 add def - + % Encode shifted next character char su eq char sp eq or { seq i get char su eq {encu} {encp} ifelse addtomsgbits /i i 1 add def } if - + % Latches to new state char lu eq {/state U def} if char ll eq {/state L def} if @@ -18156,16 +22736,16 @@ begin char lp eq {/state P def} if char ld eq {/state D def} if char sb eq {/state B def} if - + } { % Binary - + % Find number of bytes before latch or end /numbytes 0 def { i numbytes add seq length ge {exit} if - seq i numbytes add get 0 lt {exit} if + seq i numbytes add get 0 lt {exit} if /numbytes numbytes 1 add def } loop - + % Encode length numbytes 31 le { numbytes 5 tobin addtomsgbits @@ -18173,13 +22753,13 @@ begin 0 5 tobin addtomsgbits numbytes 31 sub 11 tobin addtomsgbits } ifelse - + % Encode bytes numbytes { - seq i get 8 tobin addtomsgbits + seq i get 8 tobin addtomsgbits /i i 1 add def } repeat - + % Return to previous state as indicated i seq length lt { /char seq i get def @@ -18188,14 +22768,15 @@ begin char ll eq {/state L def} if char lm eq {/state M def} if } if - + } ifelse - + } loop } if - % Lookup the most appropriate symbol specification + % Lookup the most appropriate symbol specification +{ /metrics [ [ (rune) 0 0 0 6 ] % Special metric for rune symbols [ (compact) 1 1 17 6 ] [ (full) 1 1 21 6 ] [ (compact) 2 0 40 6 ] @@ -18211,6 +22792,7 @@ begin [ (full) 27 0 1224 12 ] [ (full) 28 0 1306 12 ] [ (full) 29 0 1392 12 ] [ (full) 30 0 1480 12 ] [ (full) 31 0 1570 12 ] [ (full) 32 0 1664 12 ] ] def +} ctxdef /i 0 def { % loop @@ -18221,12 +22803,12 @@ begin /ncws m 3 get def % Total of codewords /bpcw m 4 get def % Bits per codeword /numecw ncws eclevel mul 100 div ecaddchars add ceiling cvi def - msgbits length 0 eq {/numecw 0 def} if % Error correction codewords + msgbits length 0 eq {/numecw 0 def} if % Error correction codewords /numdcw ncws numecw sub def % Data codewords /okay true def format (unset) ne format frmt ne and {/okay false def} if readerinit icap 1 ne and {/okay false def} if - layers -1 ne layers mlyr ne and {/okay false def} if + layers -1 ne layers mlyr ne and {/okay false def} if msgbits length bpcw div ceiling cvi numdcw gt {/okay false def} if okay {exit} if /i i 1 add def @@ -18235,8 +22817,8 @@ begin /format frmt def % Expand message bits into codewords avoiding codewords with all zeros or all ones - /allzero {dup length (000000000000) 0 3 -1 roll getinterval eq} bind def - /allones {dup length (111111111111) 0 3 -1 roll getinterval eq} bind def + /allzero {dup length (000000000000) 0 3 -1 roll getinterval eq} def + /allones {dup length (111111111111) 0 3 -1 roll getinterval eq} def /cws ncws array def /m 0 def /c 0 def { @@ -18246,8 +22828,8 @@ begin /cwf msgbits m bpcw add 1 sub 1 getinterval def % Last bit cwb allzero {/cwf (1) def /m m 1 sub def} if % Flip last bit to avoid zeros cwb allones {/cwf (0) def /m m 1 sub def} if % Flip last bit to avoid ones - % Concatinate the bits - 12 string dup 0 cwb putinterval + % Concatenate the bits + 12 string dup 0 cwb putinterval dup bpcw 1 sub cwf putinterval 0 bpcw getinterval /cwb exch def @@ -18263,11 +22845,13 @@ begin /cw cw 2 bpcw i sub 1 sub exp cvi cwb i get 48 sub mul add def } for cws c cw put - /m m bpcw add def + /m m bpcw add def /c c 1 add def - } loop + } loop /cws cws 0 c getinterval def + options /debugcws known { /bwipp.debugcws cws //raiseerror exec } if + % Reed-Solomon algorithm /rscodes { @@ -18288,17 +22872,17 @@ begin } { pop pop 0 } ifelse - } bind def + } def % Generate the coefficients /coeffs [ 1 rsnc {0} repeat ] def 1 1 rsnc { - /i exch def + /i exch def coeffs i coeffs i 1 sub get put i 1 sub -1 1 { /j exch def coeffs j coeffs j 1 sub get coeffs j get rsalog i get rsprod xor put - } for + } for coeffs 0 coeffs 0 get rsalog i get rsprod put } for @@ -18306,17 +22890,17 @@ begin /nd rscws length def /rscws [ rscws {} forall rsnc {0} repeat 0 ] def 0 1 nd 1 sub { - /k exch rscws exch get rscws nd get xor def + /k exch rscws exch get rscws nd get xor def 0 1 rsnc 1 sub { - /j exch def + /j exch def rscws nd j add rscws nd j add 1 add get k coeffs rsnc j sub 1 sub get rsprod xor put - } for + } for } for % Return all but the last codeword rscws 0 rscws length 1 sub getinterval - } bind def + } def % Create the codewords and bit string for the mode format (full) eq { @@ -18328,11 +22912,11 @@ begin mode 2#0000000011110000 and -4 bitshift mode 2#0000000000001111 and ] def - /mode mode 6 16 19 rscodes def + /mode mode 6 16 19 rscodes def } if format (compact) eq { /mode layers 1 sub 6 bitshift cws length 1 sub add def - readerinit {/mode mode 2#00100000 or def} if + readerinit {/mode mode 2#00100000 or def} if /mode [ mode 2#11110000 and -4 bitshift mode 2#00001111 and @@ -18352,36 +22936,38 @@ begin 0 1 modebits length 1 sub {modebits exch (0) putinterval} for 0 1 mode length 1 sub { /i exch def - modebits mode i get 2 4 string cvrs dup length 4 exch sub 4 i mul add exch putinterval + modebits mode i get 2 4 string cvrs dup length 4 exch sub 4 i mul add exch putinterval } for % Extend the data codewords with error correction codewords to create the bit string for the data +{ /rsparams [ - [] [] [] [] [] [] - [ 64 67 ] % 6-bit codewords + [] [] [] [] [] [] + [ 64 67 ] % 6-bit codewords [] [ 256 301 ] % 8-bit codewords - [] + [] [ 1024 1033 ] % 10-bit codewords [] [ 4096 4201 ] % 12-bit codewords ] def +} ctxdef /cws cws ncws cws length sub rsparams bpcw get {} forall rscodes def format (full) eq { - /databits layers layers mul 16 mul layers 112 mul add string def + /databits layers layers mul 16 mul layers 112 mul add string def } { - /databits layers layers mul 16 mul layers 88 mul add string def + /databits layers layers mul 16 mul layers 88 mul add string def } ifelse 0 1 databits length 1 sub {databits exch (0) putinterval} for - 0 1 ncws 1 sub { + 0 1 ncws 1 sub { /i exch def - databits cws i get 2 bpcw string cvrs - dup length bpcw exch sub bpcw i mul add databits length ncws bpcw mul sub add - exch putinterval + databits cws i get 2 bpcw string cvrs + dup length bpcw exch sub bpcw i mul add databits length ncws bpcw mul sub add + exch putinterval } for % Move to a point in the cartesian plane centered on the bullseye - /cmv {size mul sub mid add} bind def + /cmv {size mul sub mid add} def % Move to a bit position within a layer /lmv { @@ -18390,7 +22976,7 @@ begin /lwid fw llyr 4 mul add def /ldir lbit 2 idiv lwid idiv def ldir 0 eq { % Top - lwid 1 sub 2 idiv neg 1 add lbit 2 idiv lwid mod add + lwid 1 sub 2 idiv neg 1 add lbit 2 idiv lwid mod add fw 1 sub 2 idiv llyr 2 mul add lbit 2 mod add cmv } if @@ -18409,12 +22995,12 @@ begin lwid 2 idiv 1 sub lbit 2 idiv lwid mod sub neg cmv } if - } bind def + } def % Create the pixel map % For full symbols we disregard the reference grid at this stage format (full) eq {/fw 12 def} {/fw 9 def} ifelse - /size fw layers 4 mul add 2 add def + /size fw layers 4 mul add 2 add def /pixs [size size mul {-1} repeat] def /mid size 1 sub 2 idiv size mul size 1 sub 2 idiv add def @@ -18444,7 +23030,7 @@ begin npixs i size 2 idiv neg j add cmv [size 2 idiv j add i add 1 add 2 mod] putinterval npixs i neg size 2 idiv neg j add cmv [size 2 idiv j add i add 1 add 2 mod] putinterval } for - } for + } for /j 0 def 0 1 npixs length 1 sub { /i exch def @@ -18478,21 +23064,21 @@ begin ] {pixs exch {} forall 3 1 roll cmv exch put} forall % Mode ring - format (full) eq { - /modemap [ - [-5 7] [-4 7] [-3 7] [-2 7] [-1 7] [ 1 7] [ 2 7] [ 3 7] [ 4 7] [ 5 7] - [ 7 5] [ 7 4] [ 7 3] [ 7 2] [ 7 1] [ 7 -1] [ 7 -2] [ 7 -3] [ 7 -4] [ 7 -5] - [ 5 -7] [ 4 -7] [ 3 -7] [ 2 -7] [ 1 -7] [-1 -7] [-2 -7] [-3 -7] [-4 -7] [-5 -7] - [-7 -5] [-7 -4] [-7 -3] [-7 -2] [-7 -1] [-7 1] [-7 2] [-7 3] [-7 4] [-7 5] - ] def - } { - /modemap [ - [-3 5] [-2 5] [-1 5] [ 0 5] [ 1 5] [ 2 5] [ 3 5] - [ 5 3] [ 5 2] [ 5 1] [ 5 0] [ 5 -1] [ 5 -2] [ 5 -3] - [ 3 -5] [ 2 -5] [ 1 -5] [ 0 -5] [-1 -5] [-2 -5] [-3 -5] - [-5 -3] [-5 -2] [-5 -1] [-5 0] [-5 1] [-5 2] [-5 3] - ] def - } ifelse +{ + /modemapfull [ + [-5 7] [-4 7] [-3 7] [-2 7] [-1 7] [ 1 7] [ 2 7] [ 3 7] [ 4 7] [ 5 7] + [ 7 5] [ 7 4] [ 7 3] [ 7 2] [ 7 1] [ 7 -1] [ 7 -2] [ 7 -3] [ 7 -4] [ 7 -5] + [ 5 -7] [ 4 -7] [ 3 -7] [ 2 -7] [ 1 -7] [-1 -7] [-2 -7] [-3 -7] [-4 -7] [-5 -7] + [-7 -5] [-7 -4] [-7 -3] [-7 -2] [-7 -1] [-7 1] [-7 2] [-7 3] [-7 4] [-7 5] + ] def + /modemapcompact [ + [-3 5] [-2 5] [-1 5] [ 0 5] [ 1 5] [ 2 5] [ 3 5] + [ 5 3] [ 5 2] [ 5 1] [ 5 0] [ 5 -1] [ 5 -2] [ 5 -3] + [ 3 -5] [ 2 -5] [ 1 -5] [ 0 -5] [-1 -5] [-2 -5] [-3 -5] + [-5 -3] [-5 -2] [-5 -1] [-5 0] [-5 1] [-5 2] [-5 3] + ] def +} ctxdef + /modemap format (full) eq {modemapfull} {modemapcompact} ifelse def 0 1 modemap length 1 sub { /i exch def pixs modemap i get {} forall cmv modebits i get 48 sub put @@ -18510,9 +23096,13 @@ begin dontdraw not //renmatrix if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /azteccode dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -18521,15 +23111,15 @@ end % --END ENCODER azteccode-- % --BEGIN ENCODER azteccodecompact-- -% --REQUIRES preamble raiseerror renmatrix azteccode-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix azteccode-- % --DESC: Compact Aztec Code % --EXAM: 1234 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp azteccodecompact 0.0 2017040400 59559 59303 -%%BeginData: 43 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp azteccodecompact 0.0 2022082100 62569 62441 +%%BeginData: 46 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put dup /azteccode dup /uk.co.terryburton.bwipp findresource put @@ -18541,6 +23131,7 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def % Parse the input options @@ -18562,12 +23153,14 @@ begin args (opt) options put args - + dontdraw not //renmatrix if end -} bind def +} +[/barcode] {null def} forall +bind def /azteccodecompact dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -18576,15 +23169,15 @@ end % --END ENCODER azteccodecompact-- % --BEGIN ENCODER aztecrune-- -% --REQUIRES preamble raiseerror renmatrix azteccode-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix azteccode-- % --DESC: Aztec Runes % --EXAM: 1 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp aztecrune 0.0 2017040400 59528 59279 -%%BeginData: 43 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp aztecrune 0.0 2022082100 62538 62417 +%%BeginData: 46 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put dup /azteccode dup /uk.co.terryburton.bwipp findresource put @@ -18596,6 +23189,7 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def % Parse the input options @@ -18617,12 +23211,14 @@ begin args (opt) options put args - + dontdraw not //renmatrix if end -} bind def +} +[/barcode] {null def} forall +bind def /aztecrune dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -18631,16 +23227,19 @@ end % --END ENCODER aztecrune-- % --BEGIN ENCODER codeone-- -% --REQUIRES preamble raiseerror renmatrix-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix-- % --DESC: Code One % --EXAM: Code One % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp codeone 0.0 2017040400 241249 250071 -%%BeginData: 856 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp codeone 0.0 2022082100 201282 203168 +%%BeginData: 903 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /parseinput dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put begin /codeone { @@ -18650,6 +23249,7 @@ begin /options exch def /barcode exch def + /ctx null def /dontdraw false def /version (unset) def /parse false def @@ -18666,52 +23266,169 @@ begin } 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 + /codeone //loadctx exec /stype version 0 1 getinterval (S) eq def +{ + /stypevals [ + (1) + (1010) + (1100100) + (1111101000) + (10011100010000) + (11000011010100000) + (11110100001001000000) + (100110001001011010000000) + (101111101011110000100000000) + (111011100110101100101000000000) + (1001010100000010111110010000000000) + (1011101001000011101101110100000000000) + (1110100011010100101001010001000000000000) + (10010001100001001110011100101010000000000000) + (10110101111001100010000011110100100000000000000) + (11100011010111111010100100110001101000000000000000) + (100011100001101111001001101111110000010000000000000000) + (101100011010001010111100001011101100010100000000000000000) + ] def + + % Basic metrics for the each symbol + % ver row col dcol dcws rscw rsbl ro ri rl + /stypemetrics [ + [ (S-10) 8 11 10 4 4 1 99 99 99 ] + [ (S-20) 8 21 20 8 8 1 99 99 99 ] + [ (S-30) 8 31 30 12 12 1 99 99 99 ] + ] def + + % Basic metrics for the each symbol + % ver row col dcol dcws rscw rsbl ro ri rl + /nonstypemetrics [ + [ (A) 16 18 16 10 10 1 4 99 6 ] + [ (B) 22 22 20 19 16 1 4 99 8 ] + [ (C) 28 32 28 44 26 1 4 22 11 ] + [ (D) 40 42 36 91 44 1 4 16 16 ] + [ (E) 52 54 48 182 70 1 4 22 22 ] + [ (F) 70 76 68 370 140 2 4 22 31 ] + [ (G) 104 98 88 732 280 4 6 21 47 ] + [ (H) 148 134 120 1480 560 8 6 20 69 ] + [ (T-16) 16 17 16 10 10 1 99 99 99 ] + [ (T-32) 16 33 32 24 16 1 99 99 99 ] + [ (T-48) 16 49 48 38 22 1 99 99 99 ] + ] def + + % Special characters + /fnc1 -1 def /fnc3 -2 def + /lC -5 def /lB -6 def /lX -7 def /lT -8 def /lD -9 def /unl -10 def + /fnc2 -11 def /fnc4 -12 def /sft1 -13 def /sft2 -14 def /sft3 -15 def /eci -16 def /pad -17 def /fnc1lD -18 def + /unlcw 255 def + + /Avals << + 0 1 128 {dup 1 add} for + pad 129 + 0 1 99 { % Double digits + dup 10 2 string cvrs (00) 2 string copy dup 2 3 index length sub 4 -1 roll putinterval + exch 130 add + } for + 229 [ lC lB fnc1 fnc2 fnc3 fnc4 fnc1lD ] {exch 1 add dup} forall pop + lX 238 + lT 239 + % 240-255 lD + 4 bits + >> def + /Avals << + Avals {[exch]} forall + >> def + + /CNvals << + sft1 0 + sft2 1 + sft3 2 + 32 3 + 48 1 57 {dup 44 sub} for % 0-9 + 65 1 90 {dup 51 sub} for % A-Z + >> def + /C1vals << 0 1 31 {dup} for >> def + /C2vals << + 33 1 47 {dup 33 sub} for + 58 1 64 {dup 43 sub} for + 91 1 95 {dup 69 sub} for + fnc1 27 + fnc2 28 + fnc3 29 + fnc4 30 + pad 31 + >> def + /C3vals << 96 1 127 {dup 96 sub} for >> def + /Cvals << + CNvals {[exch]} forall + C1vals {[exch CNvals sft1 get exch]} forall + C2vals {[exch CNvals sft2 get exch]} forall + C3vals {[exch CNvals sft3 get exch]} forall + >> def + + /TNvals << + sft1 0 + sft2 1 + sft3 2 + 32 3 + 48 1 57 {dup 44 sub} for % 0-9 + 97 1 122 {dup 83 sub} for % a-z + >> def + /T1vals << 0 1 31 {dup} for >> def + /T2vals << + 33 1 47 {dup 33 sub} for + 58 1 64 {dup 43 sub} for + 91 1 95 {dup 69 sub} for + fnc1 27 + fnc2 28 + fnc3 29 + fnc4 30 + pad 31 + >> def + /T3vals << + 96 0 + 65 1 90 {dup 64 sub} for + 123 1 127 {dup 96 sub} for + >> def + /Tvals << + TNvals {[exch]} forall + T1vals {[exch TNvals sft1 get exch]} forall + T2vals {[exch TNvals sft2 get exch]} forall + T3vals {[exch TNvals sft3 get exch]} forall + >> def + + % Extended ASCII mappings + 128 1 255 { + /i exch def + Avals i [ Avals fnc4 get aload pop Avals i 128 sub get aload pop ] put + Cvals i [ Cvals fnc4 get aload pop Cvals i 128 sub get aload pop ] put + Tvals i [ Tvals fnc4 get aload pop Tvals i 128 sub get aload pop ] put + } for + + /Xvals << + 13 0 + 42 1 + 62 2 + 32 3 + 48 1 57 {dup 44 sub} for + 65 1 90 {dup 51 sub} for + >> def + /Xvals << + Xvals {[exch]} forall + >> def + + /Bvals << + 0 1 255 {dup} for + >> def + /Bvals << + Bvals {[exch]} forall + >> def + + /encvals [ Avals Cvals Tvals Xvals -1 Bvals ] def + + /A 0 def /C 1 def /T 2 def /X 3 def /D 4 def /B 5 def +} ctxdef + stype { - /vals [ - (1) - (1010) - (1100100) - (1111101000) - (10011100010000) - (11000011010100000) - (11110100001001000000) - (100110001001011010000000) - (101111101011110000100000000) - (111011100110101100101000000000) - (1001010100000010111110010000000000) - (1011101001000011101101110100000000000) - (1110100011010100101001010001000000000000) - (10010001100001001110011100101010000000000000) - (10110101111001100010000011110100100000000000000) - (11100011010111111010100100110001101000000000000000) - (100011100001101111001001101111110000010000000000000000) - (101100011010001010111100001011101100010100000000000000000) - ] def /normalize { /base exch def @@ -18731,7 +23448,7 @@ begin /num [/i true def num {dup 0 eq i and {pop} {/i false def} ifelse} forall] def num length 0 eq {/num [0] def} if num - } bind def + } def /bigadd { 2 copy length exch length @@ -18742,13 +23459,15 @@ begin dup a exch offset add 2 copy get b 5 -1 roll get add put } for a - } bind def + } def + + /barlen barcode length def % Convert value plus one to binary /v [ 1 ] def 0 1 barlen 1 sub { /i exch def - [ vals i get {48 sub barcode barlen i sub 1 sub get 48 sub mul} forall ] + [ stypevals i get {48 sub barcode barlen i sub 1 sub get 48 sub mul} forall ] v bigadd /v exch def } for /v v 2 normalize def @@ -18763,57 +23482,54 @@ begin cws exch i exch put } for - % Basic metrics for the each symbol - % ver row col dcol dcws rscw rsbl ro ri rl - /metrics [ - [ (S-10) 8 11 10 4 4 1 99 99 99 ] - [ (S-20) 8 21 20 8 8 1 99 99 99 ] - [ (S-30) 8 31 30 12 12 1 99 99 99 ] - ] def + /metrics stypemetrics def } { % Standard and type-T % Convert input into bytes accounting for FNC characters - /fnc1 -1 def /fnc3 -2 def /fncvals << + /parse parse + /parsefnc parsefnc + /eci true (FNC1) fnc1 (FNC3) fnc3 >> 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 + /msg barcode fncvals //parseinput exec def + /msglen msg length def + + % Code One stores ECIs in data + /eciesc 16#5c def % We choose \ as a typical default + /numecis 0 msg { -1000000 le {1 add} if } forall def + numecis 0 gt { + /msgtmp msg length 2 mul numecis 6 mul add 2 add array def + msgtmp 0 pad put + msgtmp 1 eciesc put + /j 2 def + 0 1 msg length 1 sub { + msg exch get + dup -1000000 le { + neg 10 7 string cvrs 1 6 getinterval {} forall 6 array astore + msgtmp exch j 1 add exch putinterval + msgtmp j eciesc put + /j j 7 add def } { - /i i 1 add def + dup eciesc ne { + msgtmp exch j exch put + /j j 1 add def + } { + pop + msgtmp j eciesc put + msgtmp j 1 add eciesc put + /j j 2 add def + } ifelse } 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 + } for + /msg msgtmp 0 j getinterval def + /msglen msg length def + } if + + /metrics nonstypemetrics def - % Basic metrics for the each symbol - % ver row col dcol dcws rscw rsbl ro ri rl - /metrics [ - [ (A) 16 18 16 10 10 1 4 99 6 ] - [ (B) 22 22 20 19 16 1 4 99 8 ] - [ (C) 28 32 28 44 26 1 4 22 11 ] - [ (D) 40 42 36 91 44 1 4 16 16 ] - [ (E) 52 54 48 182 70 1 4 22 22 ] - [ (F) 70 76 68 370 140 2 4 22 31 ] - [ (G) 104 98 88 732 280 4 6 21 47 ] - [ (H) 148 134 120 1480 560 8 6 20 69 ] - [ (T-16) 16 17 16 10 10 1 99 99 99 ] - [ (T-32) 16 33 32 24 16 1 99 99 99 ] - [ (T-48) 16 49 48 38 22 1 99 99 99 ] - ] def - % Select metrics of an appropriate symbol /fullcws [] def metrics { @@ -18836,115 +23552,7 @@ begin numremcws i numremcws i 1 add get 1 add put } if } for - - % Special characters - /lC -5 def /lB -6 def /lX -7 def /lT -8 def /lD -9 def /unl -10 def - /fnc2 -11 def /fnc4 -12 def /sft1 -13 def /sft2 -14 def /sft3 -15 def /eci -16 def /pad -17 def /fnc1lD -18 def - /unlcw 255 def - - /Avals << - 0 1 128 {dup 1 add} for - pad 129 - 0 1 99 { % Double digits - dup 10 2 string cvrs (00) 2 string copy dup 2 3 index length sub 4 -1 roll putinterval - exch 130 add - } for - 229 [ lC lB fnc1 fnc2 fnc3 fnc4 fnc1lD ] {exch 1 add dup} forall pop - lX 238 - lT 239 - % 240-255 lD + 4 bits - >> def - /Avals << - Avals {[exch]} forall - >> def - - /CNvals << - sft1 0 - sft2 1 - sft3 2 - 32 3 - 48 1 57 {dup 44 sub} for % 0-9 - 65 1 90 {dup 51 sub} for % A-Z - >> def - /C1vals << 0 1 31 {dup} for >> def - /C2vals << - 33 1 47 {dup 33 sub} for - 58 1 64 {dup 43 sub} for - 91 1 95 {dup 69 sub} for - fnc1 27 - fnc2 28 - fnc3 29 - fnc4 30 - pad 31 - >> def - /C3vals << 96 1 127 {dup 96 sub} for >> def - /Cvals << - CNvals {[exch]} forall - C1vals {[exch CNvals sft1 get exch]} forall - C2vals {[exch CNvals sft2 get exch]} forall - C3vals {[exch CNvals sft3 get exch]} forall - >> def - - /TNvals << - sft1 0 - sft2 1 - sft3 2 - 32 3 - 48 1 57 {dup 44 sub} for % 0-9 - 97 1 122 {dup 83 sub} for % a-z - >> def - /T1vals << 0 1 31 {dup} for >> def - /T2vals << - 33 1 47 {dup 33 sub} for - 58 1 64 {dup 43 sub} for - 91 1 95 {dup 69 sub} for - fnc1 27 - fnc2 28 - fnc3 29 - fnc4 30 - pad 31 - >> def - /T3vals << - 96 0 - 65 1 90 {dup 64 sub} for - 123 1 127 {dup 96 sub} for - >> def - /Tvals << - TNvals {[exch]} forall - T1vals {[exch TNvals sft1 get exch]} forall - T2vals {[exch TNvals sft2 get exch]} forall - T3vals {[exch TNvals sft3 get exch]} forall - >> def - - % Extended ASCII mappings - 128 1 255 { - /i exch def - Avals i [ Avals fnc4 get aload pop Avals i 128 sub get aload pop ] put - Cvals i [ Cvals fnc4 get aload pop Cvals i 128 sub get aload pop ] put - Tvals i [ Tvals fnc4 get aload pop Tvals i 128 sub get aload pop ] put - } for - - /Xvals << - 13 0 - 42 1 - 62 2 - 32 3 - 48 1 57 {dup 44 sub} for - 65 1 90 {dup 51 sub} for - >> def - /Xvals << - Xvals {[exch]} forall - >> def - - /Bvals << - 0 1 255 {dup} for - >> def - /Bvals << - Bvals {[exch]} forall - >> def - - /encvals [ Avals Cvals Tvals Xvals -1 Bvals ] def - + /numD [ msglen {0} repeat 0 ] def /nextXterm [ msglen {0} repeat 9999 ] def /nextNonX [ msglen {0} repeat 9999 ] def @@ -18967,17 +23575,15 @@ begin } for /nextXterm [nextXterm {dup 10000 gt {pop 10000} if} forall] def /nextNonX [nextNonX {dup 10000 gt {pop 10000} if} forall] def - - /isD {char 48 ge char 57 le and} bind def - /isC {CNvals char known} bind def - /isT {TNvals char known} bind def - /isX {Xvals char known} bind def - /isEA {char 127 gt} bind def - /isFN {char 0 lt} bind def - /XtermFirst {dup nextXterm exch get exch nextNonX exch get lt} bind def - - /A 0 def /C 1 def /T 2 def /X 3 def /D 4 def /B 5 def - + + /isD {char 48 ge char 57 le and} def + /isC {CNvals char known} def + /isT {TNvals char known} def + /isX {Xvals char known} def + /isEA {char 127 gt} def + /isFN {char 0 lt} def + /XtermFirst {dup nextXterm exch get exch nextNonX exch get lt} def + /lookup { /ac 1 def /cc 2 def /tc 2 def /xc 2 def /bc 3 def mode A eq {/ac 0 def /cc 1 def /tc 1 def /xc 1 def /bc 2 def} if @@ -19000,32 +23606,32 @@ begin /tc tc isT {2 3 div add} {isEA { 8 3 div add } { 4 3 div add } ifelse} ifelse def /xc xc isX {2 3 div add} {isEA {13 3 div add } {10 3 div add } ifelse} ifelse def /bc bc isFN {3 add} {1 add} ifelse def - k 3 ge { + k 3 ge { % Checking after at least 4 characters (cf. Data Matrix), not 3 as in spec Step Q true [ac cc tc xc ] {bc 1 add exch ceiling le and} forall {B exit} if true [ cc tc xc bc] {ac 1 add exch ceiling le and} forall {A exit} if - true [ac cc xc bc] {tc 1 add exch ceiling le and} forall {T exit} if - true [ac tc ] {cc 1 add exch ceiling le and} forall { + true [ac cc xc bc] {tc ceiling 1 add exch ceiling le and} forall {T exit} if + true [ac tc ] {cc ceiling 1 add exch ceiling le and} forall { cc ceiling xc ceiling lt {C exit} if cc xc eq {i k add 1 add XtermFirst {X exit} {C exit} ifelse} if } if - true [ac cc tc bc] {xc 1 add exch lt and} forall {X exit} if + true [ac cc tc bc] {xc ceiling 1 add exch ceiling le and} forall {X exit} if } if /k k 1 add def } loop } repeat - } bind def - + } def + /addtocws { dup cws exch j exch putinterval /j exch length j add def - } bind def - + } def + /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 [ exch {48 sub} forall ] - } bind def - + } def + /encA { 1 { % Common exit numD i get 21 ge { @@ -19069,8 +23675,8 @@ begin /i i 1 add def exit } repeat - } bind def - + } def + /CTXvalstocws { /in exch def mark @@ -19079,33 +23685,52 @@ begin dup 256 idiv exch 256 mod } for counttomark array astore exch pop - } bind def - + } def + /encCTX { /p 0 def /ctxvals 2220 array def - + % Lookup the values for each character { i msglen eq {exit} if - encvals mode get msg i get known not {exit} if p 3 mod 0 eq { numD i get 12 ge { + ctxvals 0 p getinterval CTXvalstocws addtocws [unlcw] addtocws /mode A def exit } if numD i get dup 8 ge exch i add msglen eq and { - [unlcw] addtocws - /mode A def - exit - } if - lookup mode ne { ctxvals 0 p getinterval CTXvalstocws addtocws [unlcw] addtocws /mode A def exit } if + mode X eq { % Steps E1c, E2 + Xvals msg i get known not { + ctxvals 0 p getinterval CTXvalstocws addtocws + % Unlatch to ASCII unless one codeword left and single ASCII to encode + numremcws j get 1 ne msg i get 127 gt or { + [unlcw] addtocws + } if + /mode A def + exit + } if + i 1 add msglen lt { + Xvals msg i 1 add get known not {exit} if + i 2 add msglen lt { + Xvals msg i 2 add get known not {exit} if + } if + } if + } { + lookup mode ne { + ctxvals 0 p getinterval CTXvalstocws addtocws + [unlcw] addtocws + /mode A def + exit + } if + } ifelse msglen i sub 3 le { % Check end of data conditions /remcws numremcws j p 3 idiv 2 mul add get def /remvals [ @@ -19162,7 +23787,7 @@ begin /p exch length p add def /i i 1 add def } loop - + % Backtrack to a boundary and return to ASCII mode A ne { { @@ -19186,11 +23811,11 @@ begin } ifelse } if } if - - } bind def - + + } def + /encD { - + { % loop numD i get 3 lt { @@ -19199,13 +23824,19 @@ begin /remcws numremcws j Dbits length 8 idiv add get def % Final codeword with no data - numremcws j Dbits length 8 idiv add 1 sub get 1 sub 0 eq - i msglen eq and {exit} if - - % Final digit into final codeword as ASCII + numremcws j Dbits length 8 idiv add 1 sub get 1 sub 0 eq Drem 0 eq and % No remaining codewords and no bits + remcws 1 eq Drem 0 ne and or % Or 1 remaining codeword and some bits + i msglen eq and { + Drem 4 eq Drem 6 eq or { /Dbits [ Dbits aload pop 1 1 1 1 ] def } if + Drem 2 eq Drem 6 eq or { /Dbits [ Dbits aload pop 0 1 ] def } if + exit + } if + + % Final digit or double-digit into final codeword as ASCII i msglen 1 sub eq numD i get 1 eq and + i msglen 2 sub eq numD i get 2 eq and or remcws 1 eq and Drem 0 eq and {exit} if - + % Latch to ASCII unless 4 or 6 bits remain in final codeword i msglen 1 sub eq numD i get 1 eq and remcws 1 eq and Drem 4 eq Drem 6 eq or and not { @@ -19229,9 +23860,9 @@ begin } if exit - + } if - + % Three digit value plus one to ten bits /Dbits [ Dbits aload pop @@ -19239,7 +23870,7 @@ begin 1 add 10 tobin aload pop ] def /i i 3 add def - + } loop mark @@ -19249,8 +23880,8 @@ begin counttomark array astore exch pop addtocws /mode A def - } bind def - + } def + /encB { /p 0 def /bvals 1480 array def { i msglen eq {exit} if @@ -19271,7 +23902,7 @@ begin ] def bvals addtocws /mode A def - } bind def + } def % Derive the codewords /cws 1480 array def @@ -19280,7 +23911,7 @@ begin [ /encA /encCTX /encCTX /encCTX /encD /encB ] mode get load exec } loop /cws cws 0 j getinterval def - + } ifelse % Select metrics of an appropriate symbol @@ -19292,7 +23923,7 @@ begin /cols m 2 get def % Columns in symbol /dcol m 3 get def % Data columns in symbol /dcws m 4 get def % Data codewords in symbol - /rscw m 5 get def % Error correction codewords + /rscw m 5 get def % Error correction codewords /rsbl m 6 get def % Error correction blocks /riso m 7 get def % Riser offset /risi m 8 get def % Riser interval @@ -19313,16 +23944,18 @@ begin /cws [ dcws cws length sub {0} repeat cws aload pop ] def } ifelse + options /debugcws known { /bwipp.debugcws cws //raiseerror exec } if + % De-interleave the codewords into blocks /cwbs rsbl array def % Array of data codeword blocks /ecbs rsbl array def % Array of error correction blocks 0 1 rsbl 1 sub { /i exch def - /cwb dcpb array def + /cwb dcpb array def 0 1 dcpb 1 sub { /j exch def cwb j cws j rsbl mul i add get put - } for + } for cwbs i cwb put } for @@ -19334,22 +23967,22 @@ begin /rslog gf array def 1 1 gf-1 {dup rsalog exch get exch rslog 3 1 roll put} for /rsprod { - 2 copy 0 ne exch 0 ne and { + 2 copy 0 ne exch 0 ne and { rslog exch get exch rslog exch get add gf-1 mod rsalog exch get } { pop pop 0 } ifelse - } bind def + } def % Generate the coefficients for the Reed-Solomon algorithm /coeffs [ 1 ecpb {0} repeat ] def 0 1 ecpb 1 sub { - /i exch def + /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 + } for coeffs 0 coeffs 0 get rsalog i get rsprod put } for /coeffs coeffs 0 coeffs length 1 sub getinterval def @@ -19403,21 +24036,22 @@ begin } for % Create bitmap and add finder patterns - /mmv {cols mul add} bind def + /mmv {cols mul add} def /pixs [ rows cols mul {-1} repeat ] def % Centre pattern /artifact [ - {cols {0} repeat} bind - {cols {1} repeat} bind - {0 cols 2 sub {1} repeat 0} bind - {0 1 cols 4 sub {0} repeat 1 0} bind - {cols 1 sub 2 idiv {-1} repeat 1 cols 1 sub 2 idiv {-1} repeat} bind - {cols 1 sub 2 idiv {-1} repeat 0 cols 1 sub 2 idiv {-1} repeat} bind - {1 cols 2 sub {0} repeat 1} bind - {1 0 cols 4 sub {1} repeat 0 1} bind + {cols {0} repeat} bind + {cols {1} repeat} bind + {0 cols 2 sub {1} repeat 0} bind + {0 1 cols 4 sub {0} repeat 1 0} bind + {cols 1 sub 2 idiv {-1} repeat 1 cols 1 sub 2 idiv {-1} repeat} bind + {cols 1 sub 2 idiv {-1} repeat 0 cols 1 sub 2 idiv {-1} repeat} bind + {1 cols 2 sub {0} repeat 1} bind + {1 0 cols 4 sub {1} repeat 0 1} bind ] def - /cpat << +{ + /cpatmap << /A (121343) /B (12134343) /C (12121343) @@ -19428,8 +24062,10 @@ begin /H (121212134343) /S (56661278) /T (5666666666127878) - >> vers 0 1 getinterval get def - pixs 0 rows cpat length sub 2 idiv mmv + >> def +} ctxdef + /cpat cpatmap vers 0 1 getinterval get def + pixs 0 rows cpat length sub 2 idiv mmv [ cpat {artifact exch 49 sub get exec} forall ] putinterval % Risers @@ -19441,14 +24077,15 @@ begin pixs j i mmv 3 -1 roll putinterval i risl 1 sub ne { - pixs cols j sub 2 sub rows i sub 1 sub mmv + pixs cols j sub 2 sub rows i sub 1 sub mmv 3 -1 roll putinterval } {pop} ifelse } for } for % Black dots - << +{ + /blackdotmap << /A [ [12 5] ] /B [ [16 7] ] /C [ [26 12] ] @@ -19463,7 +24100,9 @@ begin /T-16 [ [8 10] ] /T-32 [ [16 10] [16 12] ] /T-48 [ [24 10] [24 12] [24 14] ] - >> vers get {pixs exch aload pop mmv 1 put} forall + >> def +} ctxdef + blackdotmap vers get {pixs exch aload pop mmv 1 put} forall % Place the modules onto a pixel map between alignment patterns /j 0 def @@ -19488,9 +24127,13 @@ begin dontdraw not //renmatrix if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /codeone dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -19499,16 +24142,19 @@ end % --END ENCODER codeone-- % --BEGIN ENCODER hanxin-- -% --REQUIRES preamble raiseerror renmatrix-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix-- % --DESC: Han Xin Code % --EXAM: This is Han Xin % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp hanxin 0.0 2017040400 371193 376561 -%%BeginData: 886 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp hanxin 0.0 2022082100 304477 334267 +%%BeginData: 863 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /parseinput dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put begin /hanxin { @@ -19518,6 +24164,7 @@ begin /options exch def /barcode exch def + /ctx null def /dontdraw false def /version (unset) def % 1-84 /eclevel (unset) def % L1, L2, L3 or L4 @@ -19538,50 +24185,15 @@ begin /mask mask cvi def - % 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 + /hanxin //loadctx exec - /barlen barcode length def - - % Convert input into bytes accounting for FNC characters + % Parse the input /fncvals << + /parse parse + /parsefnc parsefnc % No FNC characters defined >> 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 + /msg barcode fncvals //parseinput exec def /msglen msg length def % Default error correction level @@ -19591,7 +24203,7 @@ begin 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 + } def % Encode the data using byte mode encoding /bits 4 13 add msglen 8 mul add string def @@ -19603,6 +24215,7 @@ begin } for % Lookup the most appropriate symbol specification +{ /metrics [ % vers size align modules error correction blocks [ (1) 23 -1 0 205 [ 1 21 4 ] [ 0 -1 -1 ] [ 0 -1 -1 ] @@ -19942,6 +24555,7 @@ begin [ 2 26 26 ] [ 62 33 28 ] [ 0 -1 -1 ] [ 79 18 28 ] [ 4 33 30 ] [ 0 -1 -1 ] ] ] def +} ctxdef /eclval eclevel 1 get 49 sub def 0 1 83 { @@ -19964,9 +24578,9 @@ begin bits length dmod gt {/okay false def} if % Bitstream must fit into data modules okay {exit} if } for - + okay not { - /bwipp.hanxinNoValidSymbol (No valid symbol available) //raiseerror exec + /bwipp.hanxinNoValidSymbol (Maximum length exceeded or invalid content) //raiseerror exec } if /version vers def @@ -20012,7 +24626,7 @@ begin } { pop pop 0 } ifelse - } bind def + } def % Generate the coefficients /coeffs [ 1 rsnc {0} repeat ] def @@ -20040,7 +24654,7 @@ begin % Return all but the last codeword rscws 0 rscws length 1 sub getinterval - } bind def + } def % Divide codewords into two groups of blocks and calculate the error correction codewords /dcwsb e1nb e2nb add e3nb add array def @@ -20080,7 +24694,7 @@ begin 13 ncws 1 sub { dup ncws lt {cws exch get} {pop} ifelse } for } for ] def - + % Extend codewords by one if there are remainder bits rbit 0 gt { /pad cws length 1 add array def @@ -20091,15 +24705,15 @@ begin % Create the bitmap /pixs [ size size mul {-1} repeat ] def - /qmv {size mul add} bind def + /qmv {size mul add} def % Alignment patterns alnn 0 ne { - /trmv {size mul size add 1 sub exch sub} bind def + /trmv {size mul size add 1 sub exch sub} def /aplot { 3 1 roll 3 copy exch trmv pixs exch 3 -1 roll put trmv pixs exch 3 -1 roll put - } bind def + } def /i 0 def /stag 0 def { i size ge {exit} if 0 1 size 1 sub { @@ -20153,6 +24767,7 @@ begin } if % Finder patterns +{ /fpat [ [ 1 1 1 1 1 1 1 0 ] [ 1 0 0 0 0 0 0 0 ] @@ -20173,6 +24788,7 @@ begin [ 1 1 1 1 1 1 1 0 ] [ 0 0 0 0 0 0 0 0 ] ] def +} ctxdef 0 1 fpat length 1 sub { /y exch def 0 1 fpat 0 get length 1 sub { @@ -20292,8 +24908,8 @@ begin } if } for scr1 scr3 - } bind def - + } def + % Evaluation algorithm /evalfull { /sym exch def @@ -20330,8 +24946,8 @@ begin } for n1 n3 add - } bind def - + } def + % Evaluate the masked symbols to find the most suitable /bestscore 999999999 def 0 1 masks length 1 sub { @@ -20386,9 +25002,13 @@ begin dontdraw not //renmatrix if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /hanxin dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -20396,34 +25016,2638 @@ end %%EndResource % --END ENCODER hanxin-- +% --BEGIN ENCODER dotcode-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix-- +% --DESC: DotCode +% --EXAM: This is DotCode +% --EXOP: inkspread=0.16 +% --RNDR: renmatrix +%%BeginResource: uk.co.terryburton.bwipp dotcode 0.0 2022082100 238866 247484 +%%BeginData: 1067 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /parseinput dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/dotcode { + + 20 dict begin + + /options exch def + /barcode exch def + + /ctx null def + /dontdraw false def + /rows -1 def + /columns -1 def + /ratio -1 def + /parse false def + /parsefnc false def + /raw false def + /fast 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 + + /rows rows cvi def + /columns columns cvi def + /ratio ratio cvr def + /mask mask cvi def + + /dotcode //loadctx exec + + % Set the ratio to 3:2 if no size is specified + ratio -1 eq rows -1 eq and columns -1 eq and { + /ratio 3 2 div def + } if + + % Convert input into bytes accounting for FNC characters +{ + /laa -1 def /lab -2 def /lac -3 def /bin -4 def + /sfa -5 def /sfb -6 def /sb2 -7 def /sb3 -8 def + /sb4 -9 def /sb5 -10 def /sb6 -11 def /sfc -12 def + /sc2 -13 def /sc3 -14 def /sc4 -15 def /sc5 -16 def + /sc6 -17 def /sc7 -18 def /bsa -19 def /bsb -20 def + /tma -21 def /tmb -22 def /tmc -23 def /tms -24 def + /fn1 -25 def /fn2 -26 def /fn3 -27 def /crl -28 def + /aim -29 def /m05 -30 def /m06 -31 def /m12 -32 def + /mac -33 def +} ctxdef + + % Parse the input + /fncvals << + /parse parse + /parsefnc parsefnc + /eci true + (FNC1) fn1 + % (FNC2) fn2 % Use ^ECInnnnnn for ECI; Structured append not supported + (FNC3) fn3 + >> def + /msg barcode fncvals //parseinput exec def + /msglen msg length def + + % Special FNC2 semantics: Expand ECI characters into ^FNC2nnnnnn + /numecis 0 msg { -1000000 le {1 add} if } forall def + /msgtmp msg length numecis 6 mul add array def + /j 0 def + 0 1 msg length 1 sub { + msg exch get dup -1000000 le { + neg 10 7 string cvrs 1 6 getinterval {} forall 6 array astore + msgtmp exch j 1 add exch putinterval + msgtmp j fn2 put + /j j 7 add def + } { + msgtmp exch j exch put + /j j 1 add def + } ifelse + } for + /msg msgtmp def + /msglen msg length def + + % Character maps for each state +{ + /charmaps [ + % A B C A B C A B C + [ 32 32 (00) ] [ (!) (!) (01) ] [ (") (") (02) ] % 0-2 + [ (#) (#) (03) ] [ ($) ($) (04) ] [ (%) (%) (05) ] % 3-5 + [ (&) (&) (06) ] [ (') (') (07) ] [ 40 40 (08) ] % 6-8 + [ 41 41 (09) ] [ (*) (*) (10) ] [ (+) (+) (11) ] % 9-11 + [ (,) (,) (12) ] [ (-) (-) (13) ] [ (.) (.) (14) ] % 12-14 + [ (/) (/) (15) ] [ (0) (0) (16) ] [ (1) (1) (17) ] % 15-17 + [ (2) (2) (18) ] [ (3) (3) (19) ] [ (4) (4) (20) ] % 18-20 + [ (5) (5) (21) ] [ (6) (6) (22) ] [ (7) (7) (23) ] % 21-23 + [ (8) (8) (24) ] [ (9) (9) (25) ] [ (:) (:) (26) ] % 24-26 + [ (;) (;) (27) ] [ (<) (<) (28) ] [ (=) (=) (29) ] % 27-29 + [ (>) (>) (30) ] [ (?) (?) (31) ] [ (@) (@) (32) ] % 30-32 + [ (A) (A) (33) ] [ (B) (B) (34) ] [ (C) (C) (35) ] % 33-35 + [ (D) (D) (36) ] [ (E) (E) (37) ] [ (F) (F) (38) ] % 36-38 + [ (G) (G) (39) ] [ (H) (H) (40) ] [ (I) (I) (41) ] % 39-41 + [ (J) (J) (42) ] [ (K) (K) (43) ] [ (L) (L) (44) ] % 42-44 + [ (M) (M) (45) ] [ (N) (N) (46) ] [ (O) (O) (47) ] % 45-47 + [ (P) (P) (48) ] [ (Q) (Q) (49) ] [ (R) (R) (50) ] % 48-50 + [ (S) (S) (51) ] [ (T) (T) (52) ] [ (U) (U) (53) ] % 51-53 + [ (V) (V) (54) ] [ (W) (W) (55) ] [ (X) (X) (56) ] % 54-56 + [ (Y) (Y) (57) ] [ (Z) (Z) (58) ] [ ([) ([) (59) ] % 57-59 + [ 92 92 (60) ] [ (]) (]) (61) ] [ (^) (^) (62) ] % 60-62 + [ (_) (_) (63) ] [ 0 (`) (64) ] [ 1 (a) (65) ] % 63-65 + [ 2 (b) (66) ] [ 3 (c) (67) ] [ 4 (d) (68) ] % 66-68 + [ 5 (e) (69) ] [ 6 (f) (70) ] [ 7 (g) (71) ] % 69-71 + [ 8 (h) (72) ] [ 9 (i) (73) ] [ 10 (j) (74) ] % 72-74 + [ 11 (k) (75) ] [ 12 (l) (76) ] [ 13 (m) (77) ] % 75-77 + [ 14 (n) (78) ] [ 15 (o) (79) ] [ 16 (p) (80) ] % 78-80 + [ 17 (q) (81) ] [ 18 (r) (82) ] [ 19 (s) (83) ] % 81-83 + [ 20 (t) (84) ] [ 21 (u) (85) ] [ 22 (v) (86) ] % 84-86 + [ 23 (w) (87) ] [ 24 (x) (88) ] [ 25 (y) (89) ] % 87-89 + [ 26 (z) (90) ] [ 27 ({) (91) ] [ 28 (|) (92) ] % 90-92 + [ 29 (}) (93) ] [ 30 (~) (94) ] [ 31 127 (95) ] % 93-95 + [ sfb crl (96) ] [ sb2 9 (97) ] [ sb3 28 (98) ] % 96-98 + [ sb4 29 (99) ] [ sb5 30 aim ] [ sb6 sfa laa ] % 99-101 + [ lab laa sfb ] [ sc2 sc2 sb2 ] [ sc3 sc3 sb3 ] % 102-104 + [ sc4 sc4 sb4 ] [ lac lac lab ] [ fn1 fn1 fn1 ] % 105-107 + [ fn2 fn2 fn2 ] [ fn3 fn3 fn3 ] [ bsa bsa bsa ] % 108-110 + [ bsb bsb bsb ] [ bin bin bin ] % 111-112 + ] def + + % Invert charmaps to give character to value maps for each state + /charvals [ 113 dict 117 dict 113 dict ] def + 0 1 charmaps length 1 sub { + /i exch def + /encs charmaps i get def + 0 1 2 { + /j exch def + encs j get dup type /stringtype eq {0 get} if % convert string to ASCII if required + charvals j get exch i put + } for + } for + /Avals charvals 0 get def + /Bvals charvals 1 get def + Bvals m05 97 put + Bvals m06 98 put + Bvals m12 99 put + Bvals mac 100 put + /Cvals charvals 2 get def + /BINvals << + 102 [ sc2 sc3 sc4 sc5 sc6 sc7 tma tmb tmc tms ] {exch 1 add dup} forall pop + >> def + + /A 0 def /B 1 def /C 2 def /BIN 3 def +} ctxdef + + % Pre-compute properties of the input at each point + /nDigits [ msglen 1 add {0} repeat ] def + /SeventeenTen [ msglen 1 add {false} repeat ] def + /ECI [ msglen 1 add {false} repeat ] def + /DatumA [ msglen 1 add {false} repeat ] def + /DatumB [ msglen 1 add {false} repeat ] def + /DatumC [ msglen 1 add {false} repeat ] def + /Binary [ msglen 8 add {false} repeat ] def + /AheadC [ msglen 1 add {0} repeat ] def + /TryC [ msglen 1 add {0} repeat ] def + /AheadA [ msglen 1 add {0} repeat ] def + /AheadB [ msglen 1 add {0} repeat ] def + /UntilEndSeg [ msglen 1 add {0} repeat ] def + msglen 1 sub -1 0 { + /i exch def + /barchar msg i get def + barchar 48 ge barchar 57 le and { + nDigits i nDigits i 1 add get 1 add put + } if + Avals barchar known {DatumA i true put} if + Bvals barchar known {DatumB i true put} if + /CRLF false def + barchar 13 eq i msglen 1 sub lt and { + msg i 1 add get 10 eq {/CRLF true def} if + } if + CRLF {DatumB i true put} if + nDigits i get 2 ge {DatumC i true put} if + barchar 0 lt {DatumC i true put} if % FNCx + barchar 128 ge {Binary i true put} if + nDigits i get 10 ge { % 17xxxxxx10 + mark + msg i 10 getinterval aload pop + 1 { % common exit + 48 ne {false exit} if + 49 ne {false exit} if + pop pop pop pop pop pop + 55 ne {false exit} if + 49 ne {false exit} if + true + } repeat + SeventeenTen i 3 -1 roll put + cleartomark + } if + nDigits i 1 add get 6 ge msg i get fn2 eq and { % ^FNC2xxxxxx + ECI i true put + } if + barchar 0 lt barchar fn3 ne and { % FNCx, except FNC3 + AheadC i AheadC i 1 add get 1 add put + } { + nDigits i get 1 le { + AheadC i 0 put + } { + AheadC i AheadC i 2 add get 1 add put + } ifelse + } ifelse + nDigits i get 0 gt AheadC i get AheadC i 1 add get gt and { + TryC i AheadC i get put + } if + DatumA i get TryC i get 2 lt and barchar fn3 ne and { + AheadA i AheadA i 1 add get 1 add put + } if + DatumB i get TryC i get 2 lt and barchar fn3 ne and { + AheadB i AheadB i 1 add CRLF {1 add} if get 1 add put + } if + barchar fn3 ne { + UntilEndSeg i UntilEndSeg i 1 add get 1 add put + } if + } for + + /addtocws { + dup cws exch j exch putinterval + /j exch length j add def + } def + + % Base 259 to one more in base 103 + /base259to103 { + /in exch def + /inlen in length def + /in [ 5 inlen sub {0} repeat in aload pop ] def + /out 6 array def + /msbs [ in 0 2 getinterval aload pop ] def + /mscs [ + msbs aload pop exch 259 mul add + 2 {dup 103 mod exch 103 idiv} repeat + ] def + /lsbs [ in 2 3 getinterval aload pop ] def + /lscs [ + lsbs aload pop exch 259 mul add exch 67081 mul add + 3 {dup 103 mod exch 103 idiv} repeat + ] def + lscs 0 get mscs 0 get 42 mul add + out 5 2 index 103 mod put + 103 idiv lscs 1 get add mscs 0 get 68 mul add mscs 1 get 42 mul add + out 4 2 index 103 mod put + 103 idiv lscs 2 get add mscs 0 get 92 mul add mscs 1 get 68 mul add mscs 2 get 42 mul add + out 3 2 index 103 mod put + 103 idiv lscs 3 get add mscs 0 get 15 mul add mscs 1 get 92 mul add mscs 2 get 68 mul add + out 2 2 index 103 mod put + 103 idiv mscs 1 get 15 mul add mscs 2 get 92 mul add + out 1 2 index 103 mod put + 103 idiv mscs 2 get 15 mul add + out 0 3 -1 roll 103 mod put + out 6 inlen sub 1 sub inlen 1 add getinterval + } def + + /finaliseBIN { + bpos 0 ne { + bvals 0 bpos getinterval base259to103 aload pop + /bpos 0 def + } if + } def + + /addtobin { + bvals exch bpos exch put + /bpos bpos 1 add def + bpos 5 eq { finaliseBIN } if + } def + + /ECIabc { % ECI encoding for modes A, B and C + msg i 1 add 6 getinterval 0 exch {48 sub add 10 mul} forall 10 idiv + dup 40 ge { + 40 sub + dup 12769 idiv 40 add exch 12769 mod + dup 113 idiv exch 113 mod + } if + } def + + /ECIbin { % ECI encoding for binary mode + [ + msg i 1 add 6 getinterval 0 exch {48 sub add 10 mul} forall 10 idiv + dup 65536 ge { + 258 exch dup 65536 idiv exch 65536 mod dup 256 idiv exch 256 mod + } { + dup 256 ge { + 257 exch dup 256 idiv exch 256 mod + } { + 256 exch + } ifelse + } ifelse + ] { + addtobin + } forall + } def + + /encC { + 1 { % Common exit + i segstart eq { % Structured data macros + 1 { % common exit + i segend 7 sub gt {0 exit} if + msg segstart get 91 ne {0 exit} if % [ + msg segstart 1 add get 41 ne {0 exit} if % ) + msg segstart 2 add get 62 ne {0 exit} if % > + msg segstart 3 add get 30 ne {0 exit} if % {RS} + msg segstart 4 add get dup 48 lt exch 57 gt or {0 exit} if % digit + msg segstart 5 add get dup 48 lt exch 57 gt or {0 exit} if % digit + msg segend 1 sub get 4 ne {0 exit} if % End: {EOT} + msg segstart 4 add get 48 sub 10 mul msg segstart 5 add get 48 sub add + dup dup 05 ne exch dup 06 ne exch 12 ne and and {pop mac exit} if + msg segstart 6 add get 29 ne {pop 0 exit} if % {GS} + msg segend 2 sub get 30 ne {pop 0 exit} if % End: {RS} + dup 05 eq {pop m05 exit} if + 06 eq { m06 exit} if + m12 exit + } repeat + /inmac exch def + inmac 0 ne { + [ Cvals lab get ] addtocws + /mode B def + [ Bvals inmac get ] addtocws + inmac mac eq { + [ Bvals msg segstart 4 add get get ] addtocws + [ Bvals msg segstart 5 add get get ] addtocws + /i i 6 add def + } { + /i i 7 add def + } ifelse + exit + } if + } if + % Special treatment of FNC1 in First for Dotcode + i segstart eq { + % Encode an FNC1 if two digits start a segment + nDigits i get 2 ge { + [ Cvals fn1 get ] addtocws + } if + % Skip an FNC1 if followed by two digits at start of segment + msg i get fn1 eq nDigits i 1 add get 2 ge and { + /i i 1 add def + } if + } if + SeventeenTen i get { + [ % 17xxxxxx10 macro + Cvals aim get + msg i 2 add get 48 sub 10 mul msg i 3 add get 48 sub add + msg i 4 add get 48 sub 10 mul msg i 5 add get 48 sub add + msg i 6 add get 48 sub 10 mul msg i 7 add get 48 sub add + ] addtocws + /i i 10 add def + exit + } if + DatumC i get { + msg i get dup fn1 eq exch dup fn2 eq exch fn3 eq or or { % FNCx + [ Cvals msg i get get ] addtocws + ECI i get { % FNC2 then 6 digits + [ ECIabc ] addtocws + /i i 7 add def + exit + } if + msg i get fn3 eq segstart i ne and { % FNC3 + /i i 1 add def + /inmac 0 def + /segstart i def + /segend i UntilEndSeg i get add def + exit + } if + /i i 1 add def + exit + } if + [ msg i get 48 sub 10 mul msg i 1 add get 48 sub add ] addtocws + /i i 2 add def + exit + } if + Binary i get { % Binary + nDigits i 1 add get 0 gt { + msg i get 160 lt { + [ Cvals bsa get Avals msg i get 128 sub get ] addtocws + } { + [ Cvals bsb get Bvals msg i get 128 sub get ] addtocws + } ifelse + /i i 1 add def + exit + } if + [ Cvals bin get ] addtocws + /mode BIN def + exit + } if + /m AheadA i get def /n AheadB i get def + m n gt { + [ Cvals laa get ] addtocws + /mode A def + exit + } if + i segstart eq { + msg i get dup 9 eq exch dup 28 eq exch dup 29 eq exch 30 eq or or or { + [ Cvals laa get ] addtocws + /mode A def + exit + } if + } if + n 4 gt { + [ Cvals lab get ] addtocws + /mode B def + exit + } if + [ Cvals [ sfb sb2 sb3 sb4 ] n 1 sub get get ] addtocws + n { + msg i get 13 eq { + [ Bvals crl get ] addtocws + /i i 2 add def + } { + [ Bvals msg i get get ] addtocws + /i i 1 add def + } ifelse + } repeat + exit + } repeat + } def % encC + + /encB { + 1 { % Common exit + /n TryC i get def + n 2 ge { + n 4 gt { + [ Bvals lac get ] addtocws + /mode C def + exit + } if + [ Bvals [ sfc sc2 sc3 sc4 ] n 1 sub get get ] addtocws + n { + msg i get 0 lt { + [ Cvals msg i get get ] addtocws + /i i 1 add def + } { + [ msg i get 48 sub 10 mul msg i 1 add get 48 sub add ] addtocws + /i i 2 add def + } ifelse + } repeat + exit + } if + DatumB i get { + msg i get dup fn1 eq exch dup fn2 eq exch fn3 eq or or { % FNCx + [ Bvals msg i get get ] addtocws + ECI i get { % FNC2 then 6 digits + [ ECIabc ] addtocws + /i i 7 add def + exit + } if + msg i get fn3 eq i segstart ne and { % FNC3 + /i i 1 add def + /mode C def + /inmac 0 def + /segstart i def + /segend i UntilEndSeg i get add def + exit + } if + /i i 1 add def + exit + } if + msg i get 13 eq i msglen 1 sub lt and { + msg i 1 add get 10 eq { % CRLF + [ Bvals crl get ] addtocws + /i i 2 add def + exit + } if + } if + [ Bvals msg i get get ] addtocws + /i i 1 add def + exit + } if + Binary i get { % Binary + DatumB i 1 add get { + msg i get 160 lt { + [ Bvals bsa get Avals msg i get 128 sub get ] addtocws + } { + [ Bvals bsb get Bvals msg i get 128 sub get ] addtocws + } ifelse + /i i 1 add def + exit + } if + [ Bvals bin get ] addtocws + /mode BIN def + exit + } if + AheadA i get 1 eq { + [ Bvals sfa get Avals msg i get get ] addtocws + /i i 1 add def + exit + } if + [ Bvals laa get ] addtocws + /mode A def + exit + } repeat + } def + + /encA { + 1 { % Common exit + /n TryC i get def + n 2 ge { + n 4 gt { + [ Avals lac get ] addtocws + /mode C def + exit + } if + [ Avals [ sfc sc2 sc3 sc4 ] n 1 sub get get ] addtocws + n { + msg i get 0 lt { + [ Cvals msg i get get ] addtocws + /i i 1 add def + } { + [ msg i get 48 sub 10 mul msg i 1 add get 48 sub add ] addtocws + /i i 2 add def + } ifelse + } repeat + exit + } if + DatumA i get { + msg i get dup fn1 eq exch dup fn2 eq exch fn3 eq or or { % FNCx + [ Avals msg i get get ] addtocws + ECI i get { % FNC2 then 6 digits + [ ECIabc ] addtocws + /i i 7 add def + exit + } if + msg i get fn3 eq i segstart ne and { % FNC3 + /i i 1 add def + /mode C def + /inmac 0 def + /segstart i def + /segend i UntilEndSeg i get add def + exit + } if + /i i 1 add def + exit + } if + [ Avals msg i get get ] addtocws + /i i 1 add def + exit + } if + Binary i get { % Binary + DatumA i 1 add get { + msg i get 160 lt { + [ Avals bsa get Avals msg i get 128 sub get ] addtocws + } { + [ Avals bsb get Bvals msg i get 128 sub get ] addtocws + } ifelse + /i i 1 add def + exit + } if + [ Avals bin get ] addtocws + /mode BIN def + exit + } if + /n AheadB i get def + n 6 gt { + [ Avals lab get ] addtocws + /mode B def + exit + } if + [ Avals [ sfb sb2 sb3 sb4 sb5 sb6 ] n 1 sub get get ] addtocws + n { + msg i get 13 eq { + [ Bvals crl get ] addtocws + /i i 2 add def + } { + [ Bvals msg i get get ] addtocws + /i i 1 add def + } ifelse + } repeat + exit + } repeat + } def + + /encBIN { + 1 { % Common exit + /n TryC i get def + n 2 ge { + [ finaliseBIN ] addtocws + n 7 gt { % Terminate to C + [ BINvals tmc get ] addtocws + /mode C def + exit + } if + [ BINvals [ sc2 sc3 sc4 sc5 sc6 sc7 ] n 2 sub get get ] addtocws + n { + msg i get 0 lt { + [ Cvals msg i get get ] addtocws + /i i 1 add def + } { + [ msg i get 48 sub 10 mul msg i 1 add get 48 sub add ] addtocws + /i i 2 add def + } ifelse + } repeat + exit + } if + ECI i get Binary i 7 add get and { % ECI then binary + [ ECIbin ] addtocws + /i i 7 add def + i msglen eq { [ finaliseBIN ] addtocws } if + exit + } if + msg i get 0 ge { % Not FNCx + Binary i get Binary i 1 add get or + Binary i 2 add get or Binary i 3 add get or + ECI i 1 add get Binary i 8 add get and or { + [ msg i get addtobin ] addtocws + /i i 1 add def + i msglen eq { [ finaliseBIN ] addtocws } if + exit + } if + } if + [ finaliseBIN ] addtocws + i msglen 1 sub ne { % Not last character + msg i get fn3 eq i segstart ne and { % FNC3 + [ BINvals tms get ] addtocws + /i i 1 add def + /mode C def + /inmac 0 def + /segstart i def + /segend i UntilEndSeg i get add def + exit + } if + AheadA i get AheadB i get gt { + [ BINvals tma get ] addtocws + /mode A def + } { + [ BINvals tmb get ] addtocws + /mode B def + } ifelse + exit + } if + exit + } repeat + } def + + /cws msglen 2 mul 1 add array def + /mode C def + /bvals 5 array def /bpos 0 def + /inmac 0 def /segstart 0 def /segend UntilEndSeg 0 get def + /i 0 def /j 0 def { + i msglen ge {exit} if + inmac 0 ne { % Jump over macro trailers + inmac mac ne i segend 2 sub eq and { % {RS}{EOT} + /i i 2 add def + i msglen ge {exit} if + } if + inmac mac eq i segend 1 sub eq and { % {EOT} + /i i 1 add def + i msglen ge {exit} if + } if + } if + [ /encA /encB /encC /encBIN ] mode get load exec + } loop + /cws cws 0 j getinterval def + + % Determine the symbol size + /nd cws length def + /minarea nd 3 add nd 2 idiv add 9 mul 2 add 2 mul def + ratio -1 ne { % Fixed ratio + /hgt minarea ratio div sqrt def + /wid minarea ratio mul sqrt def + /h hgt cvi def /w wid cvi def + h w add 2 mod 1 eq { + h w mul minarea lt {/h h 1 add def /w w 1 add def} if + } { + hgt w mul wid h mul lt { + /w w 1 add def + h w mul minarea lt { + /w w 1 sub def /h h 1 add def + h w mul minarea lt {/w w 2 add def} if + } if + } { + /h h 1 add def + h w mul minarea lt { + /h h 1 sub def /w w 1 add def + h w mul minarea lt {/h h 2 add def} if + } if + } ifelse + } ifelse + /rows h def /columns w def + } { + columns -1 eq { % Fixed height + /columns minarea rows add 1 sub rows idiv dup rows add 2 mod 0 eq {1 add} if def + } if + rows -1 eq { % Fixed width + /rows minarea columns add 1 sub columns idiv dup columns add 2 mod 0 eq {1 add} if def + } if + } ifelse + + % Extend the codewords with padding + /ndots rows columns mul 2 idiv def + { + nd 1 add dup 2 idiv 3 add add 9 mul 2 add ndots gt {exit} if + /nd nd 1 add def + } loop + /nc nd 2 idiv 3 add def + /nw nd nc add def + /rembits ndots nw 9 mul 2 add sub def + nd cws length gt { + /cws [ + cws aload pop + mode BIN eq {109} {106} ifelse + nd cws length sub 1 sub {106} repeat + ] def + } if + + options /debugcws known { /bwipp.debugcws cws //raiseerror exec } if + + % Create an array containing the character mappings +{ + /encs [ + (101010101) (010101011) (010101101) (010110101) (011010101) + (101010110) (101011010) (101101010) (110101010) (010101110) + (010110110) (010111010) (011010110) (011011010) (011101010) + (100101011) (100101101) (100110101) (101001011) (101001101) + (101010011) (101011001) (101100101) (101101001) (110010101) + (110100101) (110101001) (001010111) (001011011) (001011101) + (001101011) (001101101) (001110101) (010010111) (010011011) + (010011101) (010100111) (010110011) (010111001) (011001011) + (011001101) (011010011) (011011001) (011100101) (011101001) + (100101110) (100110110) (100111010) (101001110) (101011100) + (101100110) (101101100) (101110010) (101110100) (110010110) + (110011010) (110100110) (110101100) (110110010) (110110100) + (111001010) (111010010) (111010100) (001011110) (001101110) + (001110110) (001111010) (010011110) (010111100) (011001110) + (011011100) (011100110) (011101100) (011110010) (011110100) + (100010111) (100011011) (100011101) (100100111) (100110011) + (100111001) (101000111) (101100011) (101110001) (110001011) + (110001101) (110010011) (110011001) (110100011) (110110001) + (111000101) (111001001) (111010001) (000101111) (000110111) + (000111011) (000111101) (001001111) (001100111) (001110011) + (001111001) (010001111) (011000111) (011100011) (011110001) + (100011110) (100111100) (101111000) (110001110) (110011100) + (110111000) (111000110) (111001100) + ] def +} ctxdef + + % Final six dots arranged at edges + rows 2 mod 0 eq { + /sixedges [ + [ columns 1 sub rows 2 sub ] + [ 0 rows 2 sub ] + [ columns 2 sub rows 1 sub ] + [ 1 rows 1 sub ] + [ columns 1 sub 0 ] + [ 0 0 ] + ] def + } { + /sixedges [ + [ columns 2 sub 0 ] + [ columns 2 sub rows 1 sub ] + [ columns 1 sub 1 ] + [ columns 1 sub rows 2 sub ] + [ 0 0 ] + [ 0 rows 1 sub ] + ] def + } ifelse + + /dmv {columns mul add} def + + % Construct the template + /outline rows columns mul array def + 0 1 rows 1 sub { + /y exch def + 0 1 columns 1 sub { + /x exch def + outline x y dmv x y add 2 mod 1 sub put + } for + } for + sixedges { + outline exch aload pop dmv 1 put + } forall + + /clearcol { + /x exch def + true + x 1 and 2 rows 1 sub { + x exch dmv sym exch get 1 eq {pop false exit} if + } for + } def + + /clearrow { + /y exch def + true + y 1 and 2 columns 1 sub { + y dmv sym exch get 1 eq {pop false exit} if + } for + } def + + % Evaluate the symbol + /evalsymbol { + /sym exch def + + % Identify the worst side + /worst 9999999 def + [ [ /x 0 ] [ /x 1 ] [ /y 0 ] [ /y 1 ] ] { % Top Bottom Left Right + aload pop /fl exch def /dir exch def + /sum 0 def /first -1 def /last -1 def + 0 1 dir /x eq {columns} {rows} ifelse 1 sub { + dir exch def + sym + dir load + dir /x eq {rows} {columns} ifelse 1 sub fl mul + dir /y eq {exch} if + dmv get 1 eq { + first -1 eq {/first dir load def} if + /last dir load def + /sum sum 1 add def + } if + } for + sum last add first sub + dir /x eq {rows} {columns} ifelse mul + dup worst lt {/worst exch def} {pop} ifelse + } forall + + /pen 0 def + + % Check for groups of blank columns unless data is encoded vertically + % in a symbol of sufficient height to overcome up to six consecutive 0s + % in two neighbouring 5 of 9 dot patterns + rows 2 mod 1 eq rows 12 le or { + /sum 0 def /p 0 def + 1 1 columns 2 sub { + clearcol { + /sum sum 1 add def + /p sum 1 eq {rows} {p rows mul} ifelse def + } { + /sum 0 def + /pen pen p add def + /p 0 def + } ifelse + } for + /pen pen p add def + } if + + % Check for groups of blank rows unless data is encoded horizontally + % in a symbol of sufficient width to overcome up to six consecutive 0s + % in two neighbouring 5 of 9 dot patterns + rows 2 mod 0 eq columns 12 le or { + /sum 0 def /p 0 def + 1 1 rows 2 sub { + clearrow { + /sum sum 1 add def + /p sum 1 eq {columns} {p columns mul} ifelse def + } { + /sum 0 def + /pen pen p add def + /p 0 def + } ifelse + } for + /pen pen p add def + } if + + % Pad twice on all sides + /symp [ + columns 4 add 2 mul {0} repeat + 0 columns sym length 1 sub { + 0 exch 0 exch + sym exch columns getinterval aload pop + 0 0 + } for + columns 4 add 2 mul {0} repeat + ] def + + % Count voids and isolated dots + /columns columns 4 add def + /rows rows 4 add def + /sum 0 def + 2 1 rows 3 sub { + /y exch def + y 1 and 2 add 2 columns 3 sub { + /x exch def + 1 { % Common exit + symp x 1 sub y 1 sub dmv get 1 eq {exit} if + symp x 1 add y 1 sub dmv get 1 eq {exit} if + symp x 1 sub y 1 add dmv get 1 eq {exit} if + symp x 1 add y 1 add dmv get 1 eq {exit} if + symp x y dmv get 0 eq {/sum sum 1 add def exit} if + symp x 2 sub y dmv get 1 eq {exit} if + symp x y 2 sub dmv get 1 eq {exit} if + symp x 2 add y dmv get 1 eq {exit} if + symp x y 2 add dmv get 1 eq {exit} if + /sum sum 1 add def + } repeat + } for + } for + /columns columns 4 sub def + /rows rows 4 sub def + + worst 0 eq { % Fixed penalty to disqualify a symbol with an unlit edge + -99999 + } { + worst sum sum mul sub pen sub + } ifelse + + } def + + % Reed Solomon antilog table + /rsalog [ 1 112 { dup 3 mul 113 mod } repeat ] def + /step nw 112 idiv 1 add def + /offset {step mul start add} def + + % Evaluate the symbols in the following order: + % fast mode: m3 -> m3' -> m2 -> m2' -> m1 -> m1' -> m0 -> m0' + % dflt mode: (m0 m1 m2 m3) -> (m0' m1' m2' m3') + % -> : Test if we have met the HxW/2 threshold + % m' : Symbols with six edge dots forcibly lit + % () : Best of + /bestscore -99999999 def + /masks mask -1 ne { + [ mask ] + } { + fast { [ 2#11 2#10 2#01 2#00 ] } { [ 2#00 2#01 2#10 2#11 ] } ifelse + } ifelse def + /litmasks 4 array def + masks { % For each mask pattern + + /mask exch def + + % Calculate the error correction codewords for each block + /rscws [ + mask + [ 0 3 7 17 ] mask get 0 cws {1 index add 113 mod exch 2 index add exch 3 1 roll} forall pop pop + nc {0} repeat + ] def + 0 1 step 1 sub { + /start exch def + /ND nd 1 add start sub step add 1 sub step idiv def + /NW nw 1 add start sub step add 1 sub step idiv def + /NC NW ND sub def + /coeffs [ 1 NC {0} repeat ] def + 1 1 NC { + /i exch def + NC -1 1 { + /j exch def + coeffs j coeffs j get 113 add rsalog i get coeffs j 1 sub get mul 113 mod sub 113 mod put + } for + } for + 0 1 ND 1 sub { + /t exch rscws exch offset get rscws ND offset get add 113 mod def + 0 1 NC 2 sub { + /j exch def + rscws ND j add offset rscws ND j add 1 add offset get 113 add t coeffs j 1 add get mul 113 mod sub 113 mod put + } for + rscws ND NC add 1 sub offset 113 t coeffs NC get mul 113 mod sub 113 mod put + } for + ND 1 NW 1 sub { dup rscws exch offset 113 rscws 5 -1 roll offset get sub 113 mod put } for + } for + + % Create the bitstream + /bits ndots string def + bits 0 [ (00) (01) (10) (11) ] mask get putinterval + 1 1 nw { + /i exch def + bits i 1 sub 9 mul 2 add encs rscws i get get putinterval + } for + rembits 0 gt { + bits nw 9 mul 2 add (11111111111111111) 0 rembits getinterval putinterval + } if + + % Walk the symbol placing the bitstream + /pixs outline dup length array copy def + /posx 0 def + /posy rows 2 mod 0 eq {0} {rows 1 sub} ifelse def + bits 0 bits length 6 sub getinterval { + { % Move to next vacant position + pixs posx posy dmv get -1 eq {exit} if + rows 2 mod 0 eq { + /posy posy 1 add def + posy rows eq { + /posy 0 def + /posx posx 1 add def + } if + } { + /posx posx 1 add def + posx columns eq { + /posx 0 def + /posy posy 1 sub def + } if + } ifelse + } loop + pixs posx posy dmv 3 -1 roll 48 sub put + } forall + 0 1 5 { % Last six edge dots + /i exch def + pixs sixedges i get aload pop dmv + bits bits length 6 sub i add get 48 sub put + } for + + % Evaluate the symbol to find the most suitable mask + /score pixs evalsymbol def + score bestscore gt { + /bestsym pixs def + /bestscore score def + fast bestscore rows columns mul 2 idiv gt and {exit} if + } if + + % Make a copy with lit edges for possible later evaluation + /litmask pixs dup length array copy def + 0 1 5 { % Light last six edge dots + /i exch def + litmask sixedges i get aload pop dmv + 1 put + } for + litmasks mask litmask put + + % In fast mode immediately score the lit symbol + fast { + /score litmask evalsymbol def + score bestscore gt { + /bestsym litmask def + /bestscore score def + bestscore rows columns mul 2 idiv gt {exit} if + } if + } if + + } forall + /pixs bestsym def + + % For default mode, if best mask fails threshold then recalculate with lit corners and pick best + fast not bestscore rows columns mul 2 idiv le and { + /bestscore -99999999 def + masks { + litmasks exch get /litmask exch def + /score litmask evalsymbol def + score bestscore gt { + /bestsym litmask def + /bestscore score def + } if + } forall + /pixs bestsym def + } if + + % Return the arguments + << + /ren //renmatrix + /dotty true + /pixs pixs + /pixx columns + /pixy rows + /height rows 2 mul 72 div + /width columns 2 mul 72 div + /opt options + >> + + dontdraw not //renmatrix if + + //unloadctx exec + + end + +} +[/barcode] {null def} forall +bind def +/dotcode dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER dotcode-- + +% --BEGIN ENCODER ultracode-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix-- +% --DESC: Ultracode +% --EXAM: Awesome colours! +% --EXOP: eclevel=EC2 +% --RNDR: renmatrix +%%BeginResource: uk.co.terryburton.bwipp ultracode 0.0 2022082100 96235 99035 +%%BeginData: 361 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /parseinput dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/ultracode { + + 20 dict begin + + /options exch def + /barcode exch def + + /ctx null def + /dontdraw false def + /eclevel (EC2) def % EC0-EC5 + /encoding (auto) def + /parse false def + /parsefnc false def + /start 257 def % 8-bit ISO-8859-1, until we write high-level encoders + /link1 0 def + /raw false def + /rev 1 def % Ultracode specification revision + + % 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 + + /start start cvi def + /link1 link1 cvi def + /rev rev cvi def + + rev dup 1 ne exch 2 ne and { + /bwipp.ultracodeInvalidRevision (Valid revisions are 1 and 2) //raiseerror exec + } if + + /ultracode //loadctx exec + + raw {/encoding (raw) def} if + + encoding (raw) eq { + /dcws barcode length array def + /i 0 def /j 0 def + { % loop + i barcode length eq {exit} if + /cw barcode i 1 add 3 getinterval cvi def + dcws j cw put + /i i 4 add def + /j j 1 add def + } loop + /dcws dcws 0 j getinterval def + } if + + % Basic high level encoding + encoding (auto) eq { + + % Parse the input + /fn1 -1 def /fn3 -2 def + /fncvals << + /parse parse + /parsefnc parsefnc + (FNC1) fn1 + (FNC3) fn3 + >> def + /msg barcode fncvals //parseinput exec def + /msglen msg length def + + /scr [] def % Empty symbol control region + /scp [] def % Empty start sequence parameters + /dcws [ + scr aload pop + scp aload pop + msg { + dup fn1 eq {pop 268} if + dup fn3 eq {pop 269} if + } forall + ] def + + } if + + options /debugcws known { /bwipp.debugcws dcws //raiseerror exec } if + + /mcc dcws length 3 add def % Message codewords: start mcc acc [dcws ...] + + /eclval eclevel 2 get 48 sub def + eclval 0 ne { + /qcc [0 1 2 4 6 8] eclval get mcc 25 idiv mcc 25 mod 0 ne {1 add} if mul 5 add def + } { + /qcc 3 def + } ifelse + /acc qcc 3 sub 78 link1 mul add def + /tcc mcc qcc add def + + % Lookup the most appropriate symbol specification +{ + /metrics [ + % rows minc maxc mcol + [ 2 7 37 5 ] + [ 3 36 84 13 ] + [ 4 85 161 22 ] + [ 5 142 282 29 ] + ] def +} ctxdef + + 0 1 3 { + /i exch def + /m metrics i get def + /rows m 0 get def + /minc m 1 get def % Minimum permissible codewords + /maxc m 2 get def % Maximum permissible codewords + /mcol m 3 get def % Minimum tile columns + /okay true def + tcc minc lt tcc maxc gt or {/okay false def} if + okay {exit} if + } for + + okay not { + /bwipp.ultracodeNoValidSymbol (Maximum length exceeded or invalid content) //raiseerror exec + } if + + % Determine required number of columns and pads + mcol 1 61 { + /columns exch def + columns + columns 15 ge {1 sub} if + columns 31 ge {1 sub} if + columns 47 ge {1 sub} if + rows mul 3 sub tcc sub dup 0 ge { + /pads exch def + exit + } if + pop + } for + /dcc columns mcol sub def + + % Reed-Solomon error correction + /rsseq [ + start + mcc + acc + dcws aload pop + qcc {0} repeat + 0 % Working space + ] def + + % Calculate the log and anti-log tables + /rsalog [ 1 282 {dup 3 mul 283 mod} repeat ] def + /rslog 283 array def + 1 1 282 {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 282 mod rsalog exch get + } { + pop pop 0 + } ifelse + } def + + % Generate the coefficients + /n mcc def /k qcc def + /coeffs [ 1 k {0} repeat ] def + 1 1 k { + /i exch def + coeffs i coeffs i 1 sub get put + i 1 sub -1 1 { + /j exch def + coeffs j coeffs j 1 sub get coeffs j get rsalog i get rsprod add 283 mod put + } for + coeffs 0 coeffs 0 get rsalog i get rsprod put + } for + /coeffs coeffs 0 coeffs length 1 sub getinterval def + coeffs length 1 sub -2 0 {coeffs exch 2 copy get 283 exch sub put} for + + % Derive the error codewords + 0 1 n 1 sub { + /t exch rsseq exch get rsseq n get add 283 mod def + 0 1 k 1 sub { + /j exch def + rsseq n j add rsseq n j add 1 add get 283 t coeffs k j sub 1 sub get mul 283 mod sub add 283 mod put + } for + } for + n 1 n k add { dup rsseq exch 283 rsseq 5 -1 roll get sub 283 mod put } for + /ecws rsseq n k getinterval def + + options /debugecc known { /bwipp.debugecc ecws //raiseerror exec } if + +{ + /tiles [ + 13135 13136 13153 13156 13163 13165 13513 13515 13516 13531 % 0-9 + 13535 13536 13561 13563 13565 13613 13615 13616 13631 13635 % 10-19 + 13636 13651 13653 13656 15135 15136 15153 15163 15165 15313 % 20-29 + 15315 15316 15351 15353 15356 15361 15363 15365 15613 15615 % 30-39 + 15616 15631 15635 15636 15651 15653 15656 16135 16136 16153 % 40-49 + 16156 16165 16313 16315 16316 16351 16353 16356 16361 16363 % 50-59 + 16365 16513 16515 16516 16531 16535 16536 16561 16563 16565 % 60-69 + 31315 31316 31351 31356 31361 31365 31513 31515 31516 31531 % 70-79 + 31535 31536 31561 31563 31565 31613 31615 31631 31635 31636 % 80-89 + 31651 31653 31656 35131 35135 35136 35151 35153 35156 35161 % 90-99 + 35163 35165 35315 35316 35351 35356 35361 35365 35613 35615 % 100-109 + 35616 35631 35635 35636 35651 35653 35656 36131 36135 36136 % 110-119 + 36151 36153 36156 36163 36165 36315 36316 36351 36356 36361 % 120-129 + 36365 36513 36515 36516 36531 36535 36536 36561 36563 36565 % 130-139 + 51313 51315 51316 51351 51353 51356 51361 51363 51365 51513 % 140-149 + 51516 51531 51536 51561 51563 51613 51615 51616 51631 51635 % 150-159 + 51636 51651 51653 51656 53131 53135 53136 53151 53153 53156 % 160-169 + 53161 53163 53165 53513 53516 53531 53536 53561 53563 53613 % 170-179 + 53615 53616 53631 53635 53636 53651 53653 53656 56131 56135 % 180-189 + 56136 56151 56153 56156 56161 56163 56165 56313 56315 56316 % 190-199 + 56351 56353 56356 56361 56363 56365 56513 56516 56531 56536 % 200-209 + 56561 56563 61313 61315 61316 61351 61353 61356 61361 61363 % 210-219 + 61365 61513 61515 61516 61531 61535 61536 61561 61563 61565 % 220-229 + 61615 61631 61635 61651 61653 63131 63135 63136 63151 63153 % 230-239 + 63156 63161 63163 63165 63513 63515 63516 63531 63535 63536 % 240-249 + 63561 63563 63565 63613 63615 63631 63635 63651 63653 65131 % 250-259 + 65135 65136 65151 65153 65156 65161 65163 65165 65313 65315 % 260-269 + 65316 65351 65353 65356 65361 65363 65365 65613 65615 65631 % 270-279 + 65635 65651 65653 56565 51515 % 280-284 + ] def + + /dccurev1 [ + 51363 51563 51653 53153 53163 53513 53563 53613 % 0-7 + 53653 56153 56163 56313 56353 56363 56513 56563 % 8-15 + 51316 51356 51536 51616 53156 53516 53536 53616 % 16-23 + 53636 53656 56136 56156 56316 56356 56516 56536 % 24-31 + ] def + /dcclrev1 [ + 61351 61361 61531 61561 61631 61651 63131 63151 % 0-7 + 63161 63531 63561 63631 65131 65161 65351 65631 % 8-15 + 31351 31361 31531 31561 31631 31651 35131 35151 % 16-23 + 35161 35361 35631 35651 36131 36151 36351 36531 % 24-31 + ] def + /dccurev2 [ + 15316 16316 13516 16516 13616 15616 13136 15136 % 0-7 + 16136 13536 16536 13636 13156 16156 15356 13656 % 8-15 + 15313 16313 13513 16513 13613 15613 13153 15153 % 16-23 + 16153 16353 13653 15653 13163 15163 15363 13563 % 24-31 + ] def + /dcclrev2 [ + 36315 36515 35615 35135 36135 31535 36535 31635 % 0-7 + 35635 35165 36165 31365 35365 36365 31565 36565 % 8-15 + 61315 65315 63515 61615 65135 61535 63535 61635 % 16-23 + 63635 65635 63165 65165 61365 65365 61565 63565 % 24-31 + ] def +} ctxdef + + /dccu rev 1 eq {dccurev1} {dccurev2} ifelse def + /dccl rev 1 eq {dcclrev1} {dcclrev2} ifelse def + + % Create the bitmap + /rows rows 6 mul 1 add def + /columns columns 6 add def + /pixs [ rows columns mul {-1} repeat ] def + /qmv {columns mul add} def + 0 1 columns 1 sub { + /i exch def + 0 6 rows 1 sub { + /j exch def + i 5 ge {pixs i j qmv i 2 mod 9 mul put} if + } for + pixs i 0 qmv 9 put + pixs i rows 1 sub qmv 9 put + } for + 1 1 rows 2 sub { + /i exch def + 3 16 columns 1 sub { + /j exch def + pixs j i qmv 1 i 2 mod sub 9 mul put + } for + pixs 0 i qmv 9 put + pixs 1 i qmv 1 i 2 mod sub 9 mul put + pixs 2 i qmv 0 put + pixs 3 i qmv 9 put + pixs 4 i qmv 0 put + pixs columns 1 sub i qmv 9 put + } for + + % DCCU and DCCL tiles + /i rows 2 idiv 5 sub def + [ + dccu dcc get 10 5 string cvrs {48 sub} forall + 0 + dccl dcc get 10 5 string cvrs {48 sub} forall + ] { + pixs 2 i qmv 3 -1 roll put + /i i 1 add def + } forall + + % Data tiles + /tileseq [ + start + mcc + ecws aload pop + tcc + 283 % SEP + acc + dcws aload pop + pads {284} repeat + qcc + ] def + + /x 5 def /y 1 def + tileseq { + tiles exch get 10 5 string cvrs { + pixs x y qmv 3 -1 roll 48 sub put + /y y 1 add def + } forall + y rows 1 sub ne { + /y y 1 add def % Jump horizontal timing pattern + } { + /x x 1 add def /y 1 def + pixs x y qmv get -1 ne { + /x x 1 add def % Jump vertical timing pattern + } if + } ifelse + } forall + +{ + /colormap << + 0 (FFFFFF) % W + 9 (000000) % K + 1 (00FFFF) % C + 3 (FF00FF) % M + 5 (FFFF00) % Y + 6 (00FF00) % G + >> def +} ctxdef + + % Return the arguments + << + /ren //renmatrix + /pixs pixs + /pixx columns + /pixy rows + /height rows 72 div 2 mul + /width columns 72 div 2 mul + /colormap colormap + /opt options + >> + + dontdraw not //renmatrix if + + //unloadctx exec + + end + +} +[/barcode] {null def} forall +bind def +/ultracode dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER ultracode-- + +% --BEGIN ENCODER jabcode-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix-- +% --DESC: JAB Code (Beta) +% --EXAM: This is JAB Code +% --EXOP: eclevel=6 +% --RNDR: renmatrix +%%BeginResource: uk.co.terryburton.bwipp jabcode 0.0 2022082100 244344 255738 +%%BeginData: 1133 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +10 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /parseinput dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +begin +/jabcode { + + 20 dict begin + + /options exch def + /barcode exch def + + /ctx null def + /dontdraw false def + /rows -1 def + /columns -1 def + /slave false def + /colors 16 def + /eclevel 6 def % 0-10 + /raw false def + /parse false def + /parsefnc false def + /mask -1 def % 0-7 + + % 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 + + /rows rows cvi def + /columns columns cvi def + /colors colors cvi def + /eclevel eclevel cvi def + /mask mask cvi def + + /databpm colors ln 2 ln div round cvi def + /metabpm colors dup 8 gt {pop 8} if ln 2 ln div round cvi def + + % Parse the input + /fn1 -1 def + /fncvals << + /parse parse + /parsefnc parsefnc + (FNC1) fn1 + >> def + /msg barcode fncvals //parseinput exec def + /msglen msg length def + + % Wide array support, as needed + {65536 array} stopped { + pop + /arrayw { + dup 65535 idiv 1 add dup array exch 0 exch 1 sub {2 copy 65535 array put 1 add} repeat + 1 index 4 1 roll 3 -1 roll 65535 mod array put + } def + /getw {exch 1 index 65535 idiv get exch 65535 mod get} def + /putw {3 1 roll exch 1 index 65535 idiv get exch 65535 mod 3 -1 roll put} def + /copyw {exch 0 exch {dup length array copy 3 copy put pop 1 add} forall pop} def + } { + pop + /arrayw {array} def + /getw {get} def + /putw {put} def + /copyw {copy} def + } ifelse + + /addtobits { + dup bits j 3 -1 roll putinterval + length j add /j exch def + } def + + /tofixedbits { % Zero padded base 2 string + (0000000000000) 13 string copy dup 4 -1 roll 2 13 string cvrs + dup length 4 index exch sub exch putinterval + 0 3 -1 roll getinterval + } def + + % Encode the data using byte mode encoding and terminate with EOM + /bits 7 msglen 15 le {4} {17} ifelse add msglen 8 mul add 12 add string def + /j 0 def + 31 5 tofixedbits addtobits % MS + (00) addtobits % S/B + msglen 15 le { + msglen 4 tofixedbits addtobits + } { + (0000) addtobits + msglen 16 sub 13 tofixedbits addtobits + } ifelse + 0 1 msglen 1 sub { + msg exch get 8 tofixedbits addtobits + } for + 28 5 tofixedbits addtobits % L/L + 31 5 tofixedbits addtobits % MS + (11) addtobits % EOM + + % TODO Cascade + /diffside 21 def + /sameshape false def + /sameecc false def + /hasslaves false def + + % Determine the metrics for a symbol of a given size + /metrics { + /mc exch def /mr exch def + mc mr mul % All modules + mc 25 sub 16 idiv 2 add mr 25 sub 16 idiv 2 add + mul 4 sub 7 mul % Alignment modules + 64 colors 2 copy gt {exch} if pop 2 mul % Palette modules + slave {7} {17} ifelse 4 mul % Finder modules + + % Metadata bits and modules + slave not { % Master + /metass mr mc eq {0} {1} ifelse def + mr mc 2 copy lt {exch} if pop + 21 sub 16 idiv [ 0 1 2 2 3 3 3 3 ] exch get /metavf exch def + /metavlen metass 0 eq {[2 2 3 4]} {[4 6 8 10]} ifelse metavf get def + /metaelen metavf 2 mul 10 add def + 7 % II: SS VF MSK SF + metavlen add metaelen add % III: V E + hasslaves {4 add} if % III: S + 2 mul % LDPC + metabpm div ceiling cvi + dup metabpm mul 6 add /nummetabits exch def + 6 add % I: Nc into 6 modules + } { % Slave + 3 % I: SS SE SF + sameshape not {5 add} if % II: V + hasslaves {3 add} if % II: S + sameecc not { + mr mc 2 copy lt {exch} if pop + 21 sub 16 idiv [ 10 12 14 14 16 16 16 16 ] exch get + add % III: E + } if + 2 mul % LDPC + metabpm div ceiling cvi + dup metabpm mul /nummetabits exch def + } ifelse + + dup /nummetamodules exch def + add add add sub /numdatamodules exch def + /numdatabits numdatamodules databpm mul def + } def + + % Select a symbol size sufficient to carry the message + /coderate [ 0.67 0.63 0.57 0.55 0.50 0.43 0.34 0.25 0.20 0.17 0.14 ] eclevel get def + /grosslen bits length coderate div ceiling cvi def + /snapsize {ceiling cvi 18 sub dup 0 lt {pop 0} if 4 idiv 4 mul 21 add} def + + rows -1 eq columns -1 eq and { % Square if neither rows or columns fixed + /size grosslen sqrt snapsize def + { + size size metrics + grosslen numdatabits le {exit} if + /size size 4 add def + } loop + /rows size def + /columns size def + } { + columns -1 eq rows -1 ne and { % Fixed height + /columns grosslen rows div snapsize def + { + rows columns metrics + grosslen numdatabits le {exit} if + /columns columns 4 add def + } loop + } if + rows -1 eq columns -1 ne and { % Fixed width + /rows grosslen columns div snapsize def + { + rows columns metrics + grosslen numdatabits le {exit} if + /rows rows 4 add def + } loop + } if + rows -1 ne columns -1 ne and { % Fixed height and width + rows columns metrics + } if + } ifelse + /C numdatabits def + /cols columns def + + % TODO Reject all invalid sizes + rows 145 gt cols 145 gt or { + /bwipp.jabcodeNoValidSymbol (Maximum length exceeded or invalid content) //raiseerror exec + } if + + % Pick ECC params to maximally fill symbol + /min C def + 3 1 8 { + /i exch def + i 1 add 1 9 { + /j exch def + /dist C j idiv j mul C j idiv i mul sub bits length sub def + dist min lt dist 0 ge and { + /datawc i def + /datawr j def + /min dist def + } if + } for + } for + + % Extend the encoded data to fill the required data length + /tmpbits C datawr idiv datawr mul C datawr idiv datawc mul sub string def + tmpbits 0 bits putinterval + bits length 1 tmpbits length 1 sub { + dup 1 sub tmpbits exch get dup 2 mod 0 eq {1 add} {1 sub} ifelse + tmpbits 3 1 roll put + } for + /bits tmpbits def + + % Avoid 15-bit overflow when multiplying the digits by stealing from the second digit + % m = 6364136223846793005 = 0x 5851 f42d 4c95 7f2d + /m0 16#5851 16#1 add def /m1 16#f42d 16#10000 sub def /m2 16#4c95 def /m3 16#7f2d def + + /lcg64_temper { + + % Multiply seed by 6364136223846793005 then add 1 + + /p00 m0 s0 mul def /p01 m0 s1 mul def /p02 m0 s2 mul def /p03 m0 s3 mul def + /p10 m1 s0 mul def /p11 m1 s1 mul def /p12 m1 s2 mul def /p13 m1 s3 mul def + /p20 m2 s0 mul def /p21 m2 s1 mul def /p22 m2 s2 mul def /p23 m2 s3 mul def + /p30 m3 s0 mul def /p31 m3 s1 mul def /p32 m3 s2 mul def /p33 m3 s3 mul def + + /s3 p33 16#10000 mod 1 add def % 1 added here + /s2 p32 16#10000 mod p33 16#10000 idiv add + p23 16#10000 mod add def + /s1 p31 16#10000 mod p32 16#10000 idiv add + p22 16#10000 mod p23 16#10000 idiv add add + p13 16#10000 mod add def + /s0 p30 16#10000 mod p31 16#10000 idiv add + p21 16#10000 mod p22 16#10000 idiv add add + p12 16#10000 mod p13 16#10000 idiv add add + p03 16#10000 mod add def + + % Simplify carry by making each digit positive by borrowing from more significant digit + /s3 s3 16#10000 add def + /s2 s2 16#ffff add def + /s1 s1 16#ffff add def + /s0 s0 16#ffff add def + + % Carry + /s2 s3 16#10000 idiv s2 add def /s3 s3 16#10000 mod def + /s1 s2 16#10000 idiv s1 add def /s2 s2 16#10000 mod def + /s0 s1 16#10000 idiv s0 add def /s1 s1 16#10000 mod def + /s0 s0 16#10000 mod def + + % Temper most significant 32 bits + s0 16#8000 sub 16#10000 mul s1 add 16#80000000 xor + 16#ffffffff and + dup -11 bitshift xor + dup 7 bitshift 16#62d3a980 neg and xor % 0x9D2C5680 - 0x100000000 + dup 15 bitshift 16#103a0000 neg and xor % 0xEFC60000 - 0x100000000 + 16#ffffffff and + dup -18 bitshift xor + + } def + + /createMatrixA { + + /nb_pcb wr 4 lt {Pg_sub_block 2 idiv} {Pg_sub_block wr idiv wc mul} ifelse def + /offset Pg_sub_block 32 div ceiling cvi def + /effwidth offset 32 mul def + /matrixA offset nb_pcb mul arrayw def + 0 1 offset nb_pcb mul 1 sub {matrixA exch 0 putw} for + /permutation Pg_sub_block array def + 0 1 Pg_sub_block 1 sub {permutation exch dup put} for + + 0 1 Pg_sub_block wr idiv 1 sub { + /i exch def + 0 1 wr 1 sub { + /j exch def + matrixA i effwidth wr add mul j add 32 idiv + 2 copy getw 1 31 i effwidth wr add mul j add 32 mod sub bitshift or putw + } for + } for + + % Pseudorandom permutation + /s0 16#0000 def /s1 16#0000 def /s2 16#000B def /s3 16#FC39 def % s=785465 + 1 1 wc 1 sub { + /i exch def + /off_index Pg_sub_block wr idiv i mul def + 0 1 Pg_sub_block 1 sub { + /j exch def + lcg64_temper + dup 0 lt {16#80000000 xor 2147483648.0 add} if + 4294967296.0 div Pg_sub_block j sub mul cvi % (float)UINT32_MAX = 65536.0 * 65536 + /pos exch def + 0 1 Pg_sub_block wr idiv 1 sub { + /k exch def + matrixA off_index k add offset mul j 32 idiv add + 2 copy getw + matrixA permutation pos get 32 idiv k offset mul add getw + 31 permutation pos get 32 mod sub neg bitshift 1 and + 31 j 32 mod sub bitshift + or putw + } for + permutation pos permutation Pg_sub_block 1 sub j sub 2 copy get permutation pos get + exch 4 1 roll % p b p a p[a] p[b] -> p b p[a] p a p[b] + put put + } for + } for + + } def + + /createMetadataMatrixA { + + /nb_pcb Pg_sub_block 2 idiv def + /offset Pg_sub_block 32 div ceiling cvi def + /matrixA offset nb_pcb mul arrayw def + 0 1 offset nb_pcb mul 1 sub {matrixA exch 0 putw} for + /permutation Pg_sub_block array def + 0 1 Pg_sub_block 1 sub {permutation exch dup put} for + + % Pseudorandom permutation + /s0 16#0000 def /s1 16#0000 def /s2 16#0000 def /s3 16#9691 def % s=38545 + /nb_once nb_pcb wc div Pg_sub_block mul 3 add cvi nb_pcb idiv def + 0 1 nb_pcb 1 sub { + /i exch def + 0 1 nb_once 1 sub { + /j exch def + lcg64_temper + dup 0 lt {16#80000000 xor 2147483648.0 add} if + 4294967296.0 div Pg_sub_block j sub mul cvi % (float)UINT32_MAX = 65536.0 * 65536 + /pos exch def + matrixA i offset mul permutation pos get 32 idiv add + 2 copy getw 1 31 permutation pos get 32 mod sub bitshift or putw + permutation pos permutation Pg_sub_block 1 sub j sub 2 copy get permutation pos get + exch 4 1 roll % p b p a p[a] p[b] -> p b p[a] p a p[b] + put put + } for + } for + + } def + + /GaussJordan { + + /nb_pcb wr 4 lt {Pg_sub_block 2 idiv} {Pg_sub_block wr idiv wc mul} ifelse def + /offset Pg_sub_block 32 div ceiling cvi def + /matrixH matrixA dup length array copyw def + /column_arrangement [ Pg_sub_block {0} repeat ] def + /processed_column [ Pg_sub_block {false} repeat ] def + /zero_lines_nb [ nb_pcb {0} repeat ] def + /swap_col [ Pg_sub_block 2 mul {0} repeat ] def + /zero_lines 0 def + + /loop0 0 def + 0 1 nb_pcb 1 sub { + /i exch def + /pivot_column Pg_sub_block 1 add def + 0 1 Pg_sub_block 1 sub { + /j exch def + matrixH offset 32 mul i mul j add 32 idiv getw + 31 offset 32 mul i mul j add 32 mod sub neg bitshift 1 and 1 eq { + /pivot_column j def + exit + } if + } for + pivot_column Pg_sub_block lt { + processed_column pivot_column true put + column_arrangement pivot_column i put + pivot_column nb_pcb ge { + swap_col loop0 2 mul pivot_column put + /loop0 loop0 1 add def + } if + /off_index pivot_column 32 idiv def + /off_index1 pivot_column 32 mod def + 0 1 nb_pcb 1 sub { + /j exch def + i j ne { + matrixH off_index j offset mul add getw + 31 off_index1 sub neg bitshift 1 and 1 eq { + 0 1 offset 1 sub { + /k exch def + matrixH offset j mul k add + 2 copy getw matrixH offset i mul k add getw xor putw + } for + } if + } if + } for + } { + zero_lines_nb zero_lines i put + /zero_lines zero_lines 1 add def + } ifelse + } for + + /matrix_rank nb_pcb zero_lines sub def + /loop2 0 def + matrix_rank 1 nb_pcb 1 sub { + /i exch def + column_arrangement i get 0 gt { + 0 1 nb_pcb 1 sub { + /j exch def + processed_column j get not { + column_arrangement j column_arrangement i get put + column_arrangement i 0 put + processed_column j true put + processed_column i false put + swap_col loop0 2 mul i put + swap_col loop0 2 mul 1 add j put + column_arrangement i j put + /loop0 loop0 1 add def + /loop2 loop2 1 add def + exit + } if + } for + } if + } for + + /loop1 0 def + 0 1 nb_pcb 1 sub { + /kl exch def + processed_column kl get not loop1 loop0 loop2 sub lt and { + column_arrangement kl column_arrangement swap_col loop1 2 mul get get put + processed_column kl true put + swap_col loop1 2 mul 1 add kl put + /loop1 loop1 1 add def + } if + } for + + /loop1 0 def + 0 1 nb_pcb 1 sub { + /kl exch def + processed_column kl get not { + column_arrangement kl zero_lines_nb loop1 get put + /loop1 loop1 1 add def + } if + } for + + 0 1 nb_pcb 1 sub { + /i exch def + 0 1 offset 1 sub { + /j exch def + matrixH column_arrangement i get offset mul j add getw + matrixA exch i offset mul j add exch putw + } for + } for + + /tmp 0 def + 0 1 loop0 1 sub { + /i exch def + 0 1 nb_pcb 1 sub { + /j exch def + matrixA swap_col i 2 mul get 32 idiv j offset mul add getw + 31 swap_col i 2 mul get 32 mod sub neg bitshift 1 and neg tmp xor 1 and + tmp xor /tmp exch def + matrixA swap_col i 2 mul get 32 idiv j offset mul add + 2 copy getw + matrixA swap_col i 2 mul 1 add get 32 idiv j offset mul add getw + 31 swap_col i 2 mul 1 add get 32 mod sub neg bitshift 1 and neg + matrixA swap_col i 2 mul get 32 idiv j offset mul add getw xor + 1 31 swap_col i 2 mul get 32 mod sub bitshift and + xor putw + matrixA swap_col i 2 mul 1 add get 32 idiv j offset mul add + 2 copy getw + tmp 1 and neg + matrixA swap_col i 2 mul 1 add get 32 idiv j offset mul add getw xor + 1 31 swap_col i 2 mul 1 add get 32 mod sub bitshift and + xor putw + } for + } for + + } def + + /createGeneratorMatrix { + + /pn Pg_sub_block matrix_rank sub def + /offset pn 32 div ceiling cvi def + /effwidth offset 32 mul def + /offset_cap Pg_sub_block 32 div ceiling cvi def + /G offset Pg_sub_block mul arrayw def + 0 1 offset Pg_sub_block mul 1 sub { + G exch 0 putw + } for + 0 1 pn 1 sub { + /i exch def + G Pg_sub_block pn sub i add offset mul i 32 idiv add + 2 copy getw 1 31 i 32 mod sub bitshift or putw + } for + /matrix_index Pg_sub_block pn sub def + /loop0 0 def + 0 1 Pg_sub_block pn sub effwidth mul 1 sub { + /i exch def + matrix_index Pg_sub_block ge { + /loop0 loop0 1 add def + /matrix_index Pg_sub_block pn sub def + } if + i effwidth mod pn lt { + G i 32 idiv + 2 copy getw + matrixA matrix_index 32 idiv offset_cap loop0 mul add getw + 31 matrix_index 32 mod sub neg bitshift 1 and neg + G i 32 idiv getw xor + 1 31 i 32 mod sub bitshift and + xor putw + /matrix_index matrix_index 1 add def + } if + } for + + } def + + /ldpc { + + /wr exch def + /wc exch def + [ exch {48 sub} forall ] /data exch def + + /Pn data length def + wr -1 ne { % Message data + /Pg Pn wr mul wr wc sub div ceiling wr div ceiling wr mul cvi def + /nb_sub_blocks Pg 2700 idiv 1 add def + /Pg_sub_block Pg nb_sub_blocks idiv wr idiv wr mul def + /Pn_sub_block Pg_sub_block wr wc sub mul wr idiv def + /nb_sub_blocks Pg Pg_sub_block idiv def + /encoding_iterations Pg Pg_sub_block idiv Pn_sub_block nb_sub_blocks mul Pn lt {1 sub} if def + createMatrixA + } { % Metadata + /Pg Pn 2 mul def + /nb_sub_blocks 1 def + /Pg_sub_block Pg def + /Pn_sub_block Pn def + /encoding_iterations 1 def + createMetadataMatrixA + } ifelse + GaussJordan + createGeneratorMatrix + + /ecc_encoded_data Pg array def + + /offset Pg_sub_block matrix_rank sub 32 div ceiling cvi def + 0 1 encoding_iterations 1 sub { + /iter exch def + 0 1 Pg_sub_block 1 sub { + /i exch def + /temp 0 def + /loop0 0 def + /offset_index offset i mul def + iter Pn_sub_block mul 1 iter 1 add Pn_sub_block mul 1 sub { + data exch get + G offset_index loop0 32 idiv add getw 31 loop0 32 mod sub neg bitshift 1 and and + /temp exch temp xor def + /loop0 loop0 1 add def + } for + ecc_encoded_data i iter Pg_sub_block mul add temp put + } for + } for + + encoding_iterations nb_sub_blocks ne { + /start encoding_iterations Pn_sub_block mul def + /last_index encoding_iterations Pg_sub_block mul def + /Pg_sub_block Pg encoding_iterations Pg_sub_block mul sub def + /Pn_sub_block Pg_sub_block wr wc sub mul wr idiv def + createMatrixA + GaussJordan + createGeneratorMatrix + /offset Pg_sub_block matrix_rank sub 32 div ceiling cvi def + 0 1 Pg_sub_block 1 sub { + /i exch def + /temp 0 def + /loop0 0 def + /offset_index offset i mul def + start 1 Pn 1 sub { + data exch get + G offset_index loop0 32 idiv add getw 31 loop0 32 mod sub neg bitshift 1 and and + /temp exch temp xor def + /loop0 loop0 1 add def + } for + ecc_encoded_data i last_index add temp put + } for + } if + + /out Pg string def + 0 1 Pg 1 sub { + dup ecc_encoded_data exch get + out 3 1 roll 48 add put + } for + out + + } def + + % Replace data bitstream with LDPC error correction stream + /bits bits datawc datawr ldpc def + + % Interleave via pseudorandom permutation + /s0 16#0000 def /s1 16#0000 def /s2 16#0003 def /s3 16#75C7 def % s=226759 + bits length 1 sub -1 1 { + /l exch def + lcg64_temper + dup 0 lt {16#80000000 xor 2147483648.0 add} if + 4294967296.0 div l 1 add mul cvi % (float)UINT32_MAX = 65536.0 * 65536 + /r exch def + bits l get bits r get + bits exch l exch put + bits exch r exch put + } for + + % Append padding bits to the interleaved, ECC encoded data up to capacity + /tmpbits C string def + tmpbits 0 bits putinterval + /j bits length def + C j sub 1 add 2 idiv { + tmpbits j 48 put + j 1 add C lt {tmpbits j 1 add 49 put} if + /j j 2 add def + } repeat + /bits tmpbits def + + % Define the color palette + colors 4 eq { + /bi 0 def /gi 1 def /mi 2 def /yi 3 def + /ki 4 def /wi 5 def % Extended + /palette << + bi (0000FF) gi (00FF00) mi (FF00FF) yi (FFFF00) + ki (000000) wi (FFFFFF) + >> def + /metacolorindex [bi gi mi yi] def + /palettelayout [bi gi mi yi] def + } { + /rgbres << + % r g b Graduations + 8 [ 2 2 2 ] + 16 [ 4 2 2 ] + 32 [ 4 4 2 ] + 64 [ 4 4 4 ] + 128 [ 8 4 4 ] + 256 [ 8 8 4 ] + >> colors get def + + /rvals rgbres 0 get [ exch 1 sub dup 0 exch 1 exch {255 2 index div mul round cvi exch} for pop ] def + /gvals rgbres 1 get [ exch 1 sub dup 0 exch 1 exch {255 2 index div mul round cvi exch} for pop ] def + /bvals rgbres 2 get [ exch 1 sub dup 0 exch 1 exch {255 2 index div mul round cvi exch} for pop ] def + + /palette colors dict def + /palettelayout 64 colors 2 copy gt {exch} if pop array def + /i 0 def /j 8 def + rvals { + /r exch def + gvals { + /g exch def + bvals { + /b exch def + r 16 bitshift g 8 bitshift or b or + (000000) 6 string copy dup 3 -1 roll 16 6 string cvrs dup length 6 exch sub exch putinterval + false + 1 index (000000) eq {/ki i def pop true} if + 1 index (0000FF) eq {/bi i def pop true} if + 1 index (00FF00) eq {/gi i def pop true} if + 1 index (00FFFF) eq {/ci i def pop true} if + 1 index (FF0000) eq {/ri i def pop true} if + 1 index (FF00FF) eq {/mi i def pop true} if + 1 index (FFFF00) eq {/yi i def pop true} if + 1 index (FFFFFF) eq {/wi i def pop true} if + not { + colors 64 le + colors 128 eq + r 0 eq r 73 eq or r 182 eq or r 255 eq or and + colors 256 eq + r 0 eq r 73 eq or r 182 eq or r 255 eq or and + g 0 eq g 73 eq or g 182 eq or g 255 eq or and + or or { % RGB space is sampled into 64 slots + palettelayout j i put + /j j 1 add def + } if + } if + palette exch i exch put + /i i 1 add def + } forall + } forall + } forall + palettelayout 0 [ki bi gi ci ri mi yi wi] putinterval + /metacolorindex [ki bi gi ci ri mi yi wi] def + } ifelse + + % Create the pixel map + /pixs [rows cols mul {-1} repeat] def + /jmv {cols mul add} def + + % Finder patterns + slave not { % Master alignment pattern + /fpat [ + [ 1 1 1 0 0 ] + [ 1 2 2 0 0 ] + [ 1 2 1 2 1 ] + [ 0 0 2 2 1 ] + [ 0 0 1 1 1 ] + ] def + /fmap [ + [ -1 bi yi ] % UL + [ -1 yi bi ] % LL + [ -1 gi mi ] % UR + [ -1 mi gi ] % LR + ] def + } { % Slave alignment pattern + /fpat [ + [ 0 0 0 0 0 ] + [ 0 2 2 0 0 ] + [ 0 2 1 2 0 ] + [ 0 0 2 2 0 ] + [ 0 0 0 0 0 ] + ] def + /fmap [ + [ -1 ki wi ] % UL + [ -1 ki wi ] % LL + [ -1 ki wi ] % UR + [ -1 ki wi ] % LR + ] def + } ifelse + 0 1 4 { + /y exch def + 0 1 4 { + /x exch def + /fpb fpat y get x get def + pixs x 1 add y 1 add jmv fmap 0 get fpb get put + pixs x 1 add rows y sub 2 sub jmv fmap 1 get fpb get put + pixs x cols add 6 sub y 1 add jmv fmap 2 get fpb get put + pixs x cols add 6 sub rows y sub 2 sub jmv fmap 3 get fpb get put + } for + } for + + % Alignment patterns + /algnpat0 [ + [ ki ki -1 ] + [ ki wi ki ] + [ -1 ki ki ] + ] def + /algnpat1 [ + [ -1 ki ki ] + [ ki wi ki ] + [ ki ki -1 ] + ] def + /num cols 16 div round cvi 1 sub def + /algnrpos [ 3 17 ] def + num 0 gt { + /algnrpos [ 0 1 num {cols 7 sub num div mul cvi 3 add} for ] def + } if + /num rows 16 div round cvi 1 sub def + /algncpos [ 3 17 ] def + num 0 gt { + /algncpos [ 0 1 num {rows 7 sub num div mul cvi 3 add} for ] def + } if + /putalgnpat { + /pp exch def + /py exch def + /px exch def + 0 1 2 { + /pb exch def + 0 1 2 { + /pa exch def + pixs px pa add py pb add jmv pp pb get pa get put + } for + } for + } def + 0 1 algncpos length 1 sub { + /j exch def + /y algncpos j get def + 0 1 algnrpos length 1 sub { + /i exch def + /x algnrpos i get def + pixs x y jmv get -1 eq { + x 1 sub y 1 sub i j add 2 mod 0 eq {algnpat0} {algnpat1} ifelse putalgnpat + } if + } for + } for + + slave not { + + [ % Expanded to [ x y ] [ x -y ] [ -x -y ] [ x -y ] + % Metadata and palette + [ 6 1 ] [ 6 2 ] [ 6 3 ] [ 6 4 ] [ 6 5 ] [ 6 6 ] [ 5 6 ] [ 4 6 ] [ 3 6 ] [ 2 6 ] % 0-39 + [ 1 6 ] [ 7 1 ] [ 7 2 ] [ 7 3 ] [ 7 4 ] [ 7 5 ] [ 7 6 ] [ 7 7 ] [ 6 7 ] [ 5 7 ] % 40-79 + % Palette only + [ 4 7 ] [ 3 7 ] [ 2 7 ] [ 1 7 ] [ 8 1 ] [ 8 2 ] [ 8 3 ] [ 8 4 ] % 16-31 + [ 8 5 ] [ 8 6 ] [ 8 7 ] [ 8 8 ] [ 7 8 ] [ 6 8 ] [ 5 8 ] [ 4 8 ] % 32-47 + [ 3 8 ] [ 2 8 ] [ 1 8 ] [ 9 1 ] [ 9 2 ] [ 9 3 ] [ 9 4 ] [ 9 5 ] % 48-63 + ] { + aload pop /y exch def /x exch def + [ x y ] [ x neg y ] [ x neg y neg ] [ x y neg ] + } forall + 176 array astore /metadatamap exch def + + /palettemap1 [ + [ 4 1 ] [ 4 2 ] [ 5 1 ] [ 5 2 ] [ 2 4 ] [ 2 5 ] [ 1 4 ] [ 1 5 ] % 0-7 + [ -2 1 ] [ -2 2 ] [ -1 1 ] [ -1 2 ] [ -4 4 ] [ -4 5 ] [ -5 4 ] [ -5 5 ] % 8-15 + ] def + + /palettemap2 [ + [ -4 -5 ] [ -4 -4 ] [ -5 -5 ] [ -5 -4 ] [ -2 -2 ] [ -2 -1 ] [ -1 -2 ] [ -1 -1 ] % 0-7 + [ 2 -5 ] [ 2 -4 ] [ 1 -5 ] [ 1 -4 ] [ 4 -2 ] [ 4 -1 ] [ 5 -2 ] [ 5 -1 ] % 8-15 + ] def + + } { % Slave + + % TODO Cascade + + /metadatamap [ + 1 1 19 { + /i exch def + [ 0 i ] [ 1 i ] + } for + 5 1 12 { + /i exch def + [ 2 i ] [ 3 i ] + } for + ] def + + /palettemap1 [ + 5 1 12 { [ exch 4 exch ] } for + 12 -1 5 { [ exch 5 exch ] } for + 5 1 12 { [ exch 6 exch ] } for + 12 -1 5 { [ exch 7 exch ] } for + ] def + + /palettemap2 [ + palettemap1 {[ exch aload pop neg exch neg exch]} forall + ] def + + } ifelse + + % Normalise wrapping + metadatamap { + dup 0 get dup 0 lt {cols add 1 sub 1 index 0 3 -1 roll put} {pop} ifelse + dup 1 get dup 0 lt {rows add 1 sub 1 index 1 3 -1 roll put} {pop} ifelse + pop + } forall + palettemap1 { + dup 0 get dup 0 lt {cols add 1 sub 1 index 0 3 -1 roll put} {pop} ifelse + dup 1 get dup 0 lt {rows add 1 sub 1 index 1 3 -1 roll put} {pop} ifelse + pop + } forall + palettemap2 { + dup 0 get dup 0 lt {cols add 1 sub 1 index 0 3 -1 roll put} {pop} ifelse + dup 1 get dup 0 lt {rows add 1 sub 1 index 1 3 -1 roll put} {pop} ifelse + pop + } forall + + % Reserve the metadata modules to be placed once mask is determined + 0 1 nummetamodules 1 sub { + pixs exch metadatamap exch get aload pop jmv 0 put + } for + + % Place the color palette + slave not { + % Up to first 16 colors into finder slots + 0 1 16 colors 2 copy gt {exch} if pop 1 sub { + /i exch def + palettelayout i get dup + pixs exch palettemap1 i get aload pop jmv exch put + pixs exch palettemap2 i get aload pop jmv exch put + } for + /i 16 def + } { + /i 0 def + } ifelse + + % Continue palette placement after end of metadata modules + /j nummetamodules def + i 2 palettelayout length 1 sub { + /i exch def + palettelayout i get dup + pixs exch metadatamap j get aload pop jmv exch put + pixs exch metadatamap j 2 add get aload pop jmv exch put + palettelayout i 1 add get dup + pixs exch metadatamap j 1 add get aload pop jmv exch put + pixs exch metadatamap j 3 add get aload pop jmv exch put + /j j 4 add def + } for + + % Calculate the mask patterns applied to data modules + /maskfuncs [ + {add colors mod} bind + {pop colors mod} bind + {exch pop colors mod} bind + {3 idiv exch 2 idiv add colors mod} bind + {2 idiv exch 3 idiv add colors mod} bind + {add dup 2 idiv exch 3 idiv add colors mod} bind + {2 copy exch dup mul mul 7 mod 3 1 roll exch dup mul add 2 mul 19 mod add colors mod} bind + {2 copy dup mul mul 5 mod 3 1 roll dup mul exch 2 mul add 13 mod add colors mod} bind + ] def + mask -1 ne { % User specifies a mask + /maskfuncs [maskfuncs mask get] def + /bestmaskval mask 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 + pixs i j jmv get -1 eq {i j maskfuncs m get exec} {0} ifelse + mask i j jmv 3 -1 roll put + } for + } for + masks m mask put + } for + + % Walk the symbol placing the data bitstream + /posx 0 def /posy 0 def + /i 0 def + { % loop + posx cols eq {exit} if + pixs posx posy jmv get -1 eq { + bits i databpm getinterval 0 exch {48 sub add 2 mul} forall 2 idiv + pixs posx posy jmv 3 -1 roll put + /i i databpm add def + } if + /posy posy 1 add def + posy rows eq {/posy 0 def /posx posx 1 add def} if + } loop + + % Evaluate runlength encoded rows or columns in full symbols + /evalrle { + /scrle exch def + /scr1 0 def /scr3 0 def + 0 2 scrle length 2 sub { + /j exch def + scrle j 1 add get -1 ne { % Skip over voids + % Detect runs of 5 or more like modules, except in voids + scrle j get dup 5 ge {2 sub /scr1 exch scr1 add def} {pop} ifelse + % Detect finder pattern + j 4 ge j scrle length 5 sub le and { + scrle j 4 sub 10 getinterval % n1 c1 ... n5 c5 + dup {1 eq} forall pop 4 {exch pop and} repeat { % n{1-5}=1 + mark exch aload pop + 8 index dup 6 index eq exch 2 index eq and % c1=c3=c5 + 7 index 4 index eq and { % c2=c4 + 2 index /c4 exch def /c5 exch def + c4 bi eq c5 yi eq and c4 yi eq c5 bi eq and + c4 gi eq c5 mi eq and c4 mi eq c5 gi eq and + or or or {/scr3 scr3 100 add def} if + } if + cleartomark + } {pop} ifelse + } if + } if + } for + scr1 scr3 + } def + + /evalmask { + /sym exch def + + /n1 0 def /n2 0 def /n3 0 def + /rle rows cols 2 copy lt {exch} if pop 2 mul 2 add array def + /lastpairs cols array def + /thispairs cols array def + + % Runlength encode and evaluate each column + 0 1 cols 1 sub { + /i exch def + mark 0 -1 + i cols rows cols mul 1 sub { + sym exch get 2 copy eq {pop exch 1 add exch} {1 exch} ifelse + } for + rle 0 counttomark 2 sub getinterval astore + evalrle n3 add /n3 exch def n1 add /n1 exch def + pop + } for + + 0 1 rows 1 sub { + /i exch def + + % Runlength encode and evaluate each row + /symrow sym i cols mul cols getinterval def + mark 0 -1 + symrow { + 2 copy eq {pop exch 1 add exch} {1 exch} ifelse + } forall + rle 0 counttomark 2 sub getinterval astore + evalrle n3 add /n3 exch def n1 add /n1 exch def + pop + + % Count and score same coloured blocks + /lastpairs thispairs /thispairs lastpairs def def + -1 symrow {exch 2 copy ne {pop -1 exch} if} forall + pop + thispairs astore pop + i 0 gt { + mark + lastpairs aload pop thispairs aload pop + n2 cols { exch dup -1 ne { cols 1 add index eq {3 add} if } {pop} ifelse } repeat + /n2 exch def + cleartomark + } if + } for + + n1 n2 add n3 add + } 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 { + masksym evalmask /score exch def + score bestscore lt { + /bestsym masksym def + /bestmaskval m def + /bestscore score def + } if + } { + /bestsym masksym def + } ifelse + } for + /pixs bestsym def + /metamask bestmaskval def + + % Derive the metadata bitstream + /addtometapart { + dup metapart p 3 -1 roll putinterval + length p add /p exch def + } def + + /addtometabits { + dup metabits q 3 -1 roll putinterval + length q add /q exch def + } def + + /metapart 40 string def + /metabits nummetabits string def + /p 0 def /q 0 def + slave not { + + % Part I + colors ln 2 ln div round cvi 1 sub + 3 tofixedbits addtometapart % Nc + metapart 0 p getinterval 2 -1 ldpc addtometabits /p 0 def + + % Part II + metass 1 tofixedbits addtometapart % SS + metavf 2 tofixedbits addtometapart % VF + metamask 3 tofixedbits addtometapart % MSK + hasslaves {(1)} {(0)} ifelse addtometapart % SF + metapart 0 p getinterval 2 -1 ldpc addtometabits /p 0 def + + % Part III + metass 0 eq { % Square + cols 17 sub 4 idiv [ 0 4 8 16 ] metavf get sub 1 sub + metavlen tofixedbits addtometapart % V + } { % Rectangular + cols 17 sub 4 idiv 1 sub + metavlen 2 idiv tofixedbits addtometapart % V1 + rows 17 sub 4 idiv 1 sub + metavlen 2 idiv tofixedbits addtometapart % V2 + } ifelse + datawc 3 sub metaelen 2 idiv tofixedbits addtometapart % E1 + datawr 4 sub metaelen 2 idiv tofixedbits addtometapart % E2 + hasslaves { % TODO Cascading + 0 4 tofixedbits addtometapart % S + } if + metapart 0 p getinterval 2 -1 ldpc addtometabits /p 0 def + + } { % slave + + % Part I + sameshape {0} {1} ifelse 1 tofixedbits addtometapart % SS + sameecc {0} {1} ifelse 1 tofixedbits addtometapart % SE + hasslaves {1} {0} ifelse 1 tofixedbits addtometapart % SF + metapart 0 p getinterval 2 -1 ldpc addtometabits /p 0 def + + % Part II + sameshape not { + diffside 17 sub 4 idiv 1 sub + 5 tofixedbits addtometapart % V + } if + hasslaves { % TODO Cascading + 0 3 tofixedbits addtometapart % S + } if + metapart 0 p getinterval 2 -1 ldpc addtometabits /p 0 def + + % Part III + sameecc not { + datawc 3 sub metaelen 2 idiv tofixedbits addtometapart % E1 + datawr 4 sub metaelen 2 idiv tofixedbits addtometapart % E2 + } if + metapart 0 p getinterval 2 -1 ldpc addtometabits /p 0 def + + } ifelse + q 1 nummetabits 1 sub { % Pad with 0s + metabits exch 48 put + } for + + % Place the metadata + /i 0 def /j 0 def + slave not { % Two-color encoding of Part I (Nc) in master symbols + metabits i 6 getinterval { + colors 4 eq {[bi yi]} {[ki wi]} ifelse exch 48 sub get + pixs metadatamap j get aload pop jmv 3 -1 roll put + /j j 1 add def + } forall + /i i 6 add def + } if + nummetabits i sub metabpm idiv { + metabits i metabpm getinterval 0 exch {48 sub add 2 mul} forall 2 idiv + metacolorindex exch get + pixs metadatamap j get aload pop jmv 3 -1 roll put + /i i metabpm add def + /j j 1 add def + } repeat + + << + /ren //renmatrix + /pixs pixs + /pixx cols + /pixy rows + /colormap palette + /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 +/jabcode dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER jabcode-- + % --BEGIN ENCODER gs1-cc-- -% --REQUIRES preamble raiseerror renmatrix micropdf417 pdf417-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renmatrix micropdf417 pdf417-- % --DESC: GS1 Composite 2D Component % --EXAM: (01)95012345678903(3103)000123 % --EXOP: ccversion=b cccolumns=4 % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp gs1-cc 0.0 2017040400 208546 207818 -%%BeginData: 656 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp gs1-cc 0.0 2022082100 222469 205288 +%%BeginData: 639 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /gs1process dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put dup /pdf417 dup /uk.co.terryburton.bwipp findresource put dup /micropdf417 dup /uk.co.terryburton.bwipp findresource put begin /gs1-cc { - + 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 + /ctx null def + /parse false def + /dontlint false def + /lintreqs false def /dontdraw false def /ccversion (a) def /cccolumns -1 def /lintype () def /linwidth -1 def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -20434,10 +27658,12 @@ begin currentdict end /options exch def } if options {def} forall - + /cccolumns cccolumns cvi def /linwidth linwidth cvi def + /gs1-cc //loadctx exec + % Select columns based on linear type cccolumns -1 eq { << @@ -20454,55 +27680,20 @@ begin /databarlimited 3 /databarexpanded 4 /databarexpandedstacked 4 - >> lintype get /cccolumns exch def + >> lintype get /cccolumns exch def } if - % Expand ordinals of the form ^NNN to ASCII - /expand { - /in exch def - /out in length string def - /j 0 def - in - { % loop - (^) search { - dup out exch j exch putinterval - length j add 1 add /j exch def - pop - dup 0 3 getinterval cvi out exch j 1 sub exch put - dup length 3 sub 3 exch getinterval - } { - dup out exch j exch putinterval - length j add /j exch def - out 0 j getinterval exit - } ifelse - } loop - } bind def - - % Parse out AIs - /ais [] def - /vals [] def - barcode dup length 1 sub 1 exch getinterval - { % loop - dup () eq {exit} if - (\)) search pop - exch pop - exch (\() search { - exch pop exch 3 1 roll - } { - () 3 1 roll - } ifelse - [ ais aload pop counttomark 2 add index ] /ais exch def - [ vals aload pop counttomark 1 add index expand ] /vals exch def - pop pop - } loop - pop + barcode /ai //gs1process exec + /fncs exch def + /vals exch def + /ais exch def % Method selection - /isupper {dup 65 ge exch 90 le and} bind def % A-Z - /isnum0 {dup 48 ge exch 57 le and} bind def % 0-9 - /isnum1 {dup 49 ge exch 57 le and} bind def % 1-9 + /isupper {dup 65 ge exch 90 le and} def % A-Z + /isnum0 {dup 48 ge exch 57 le and} def % 0-9 + /isnum1 {dup 49 ge exch 57 le and} def % 1-9 { % common exit - + % (10/11/17)... ais length 1 ge { ais 0 get (10) eq ais 0 get (11) eq or ais 0 get (17) eq or { @@ -20545,18 +27736,20 @@ begin % Freeform -1 (0) exit - + } loop /method exch def /npre exch def - /fnc1 -1 def /lnumeric -2 def /lalphanumeric -3 def /liso646 -4 def - /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 - + dup 3 -1 roll 2 2 index length string cvrs dup length 2 index length exch sub exch putinterval + } def + +{ + + /fnc1 -1 def /lnumeric -2 def /lalphanumeric -3 def /liso646 -4 def + /alpha << 65 1 90 {dup 65 sub 5 tobin} for 48 1 57 {dup 4 add 6 tobin} for @@ -20566,16 +27759,16 @@ begin /numeric << 0 1 119 { dup (00) 2 string copy dup 3 -1 roll 11 2 string cvrs - dup length 2 exch sub exch putinterval - dup 0 get 65 eq {dup 0 94 put} if - dup 1 get 65 eq {dup 1 94 put} if + dup length 2 exch sub exch putinterval + dup 0 get 65 eq {dup 0 94 put} if + dup 1 get 65 eq {dup 1 94 put} if exch 8 add - (0000000) 7 string copy dup 3 -1 roll 2 7 string cvrs + (0000000) 7 string copy dup 3 -1 roll 2 7 string cvrs dup length 7 exch sub exch putinterval } for lalphanumeric (0000) >> def - + /alphanumeric << 48 1 57 {dup 43 sub 5 tobin} for fnc1 (01111) @@ -20585,7 +27778,7 @@ begin lnumeric (000) liso646 (00100) >> def - + /iso646 << 48 1 57 {dup 43 sub 5 tobin} for fnc1 (01111) @@ -20601,6 +27794,8 @@ begin lalphanumeric (00100) >> def +} ctxdef + method (10) eq { % TODO: fixme ais 0 get (11) eq ais 0 get (17) eq or { vals 0 get @@ -20615,6 +27810,7 @@ begin ] /cdf exch def /ais ais 1 ais length 1 sub getinterval def /vals vals 1 vals length 1 sub getinterval def + /fncs fncs 1 fncs length 1 sub getinterval def } { /cdf [ 1 0 1 1 ] def } ifelse @@ -20624,6 +27820,7 @@ begin ais length 1 gt {/gpf [ gpf aload pop fnc1 ] def} if % TODO: check /ais ais 1 ais length 1 sub getinterval def /vals vals 1 vals length 1 sub getinterval def + /fncs fncs 1 fncs length 1 sub getinterval def } { /gpf [fnc1] def % TODO: check } ifelse @@ -20645,7 +27842,7 @@ begin /ai90rem exch def /nalpha 0 ai90rem {dup 65 ge exch 90 le and {1 add} if} forall def /nnums 0 ai90rem {dup 48 ge exch 57 le and {1 add} if} forall def - /mode nalpha nnums gt {(alpha)} {(numeric)} ifelse def + /mode nalpha nnums gt {(alpha)} { nalpha 0 eq {(numeric)} {(alphanumeric)} ifelse } ifelse def nalpha nnums add ai90rem length ne {/mode (alphanumeric) def} if /cdf [ cdf aload pop @@ -20693,15 +27890,14 @@ begin abits aload pop ] def } ifelse - mode (numeric) eq { + mode (alpha) ne { /gpf [ ai90rem {} forall ais length 1 gt {fnc1} if ] def } { - /encs mode (alpha) eq {alpha} {alphanumeric} ifelse def /in [ ai90rem {} forall ais length 1 gt {fnc1} if ] def /out in length 6 mul array def /j 0 def 0 1 in length 1 sub { - in exch get encs exch get + in exch get alpha exch get dup [ exch {48 sub} forall ] out exch j exch putinterval length j add /j exch def } for @@ -20710,10 +27906,11 @@ begin out 0 j getinterval aload pop ] def /gpf [] def - ais length 1 gt mode (alpha) ne or {/mode (numeric) def} if + ais length 1 gt {/mode (numeric) def} if } ifelse /ais ais 1 ais length 1 sub getinterval def /vals vals 1 vals length 1 sub getinterval def + /fncs fncs 1 fncs length 1 sub getinterval def ais length 0 ne { ais1 (21) eq ais1 (8004) eq or { /gpf [ @@ -20722,6 +27919,7 @@ begin ] def /ais ais 1 ais length 1 sub getinterval def /vals vals 1 vals length 1 sub getinterval def + /fncs fncs 1 fncs length 1 sub getinterval def ais length 0 ne {/gpf [gpf aload pop fnc1] def} if } if } if @@ -20733,24 +27931,6 @@ begin /mode (numeric) def } if - % Pre-defined fixed length data field AIs - % any AI whose prefix is not included in this table must be - % terminated with "FNC1", even if it's fixed length - /aifixed 23 dict def - [ - 0 1 4 {} for - ] { - (00) 2 string copy dup dup 1 5 -1 roll 48 add put aifixed 3 1 roll put - } forall - [ - 11 1 20 {} for - 23 - 31 1 36 {} for - 41 - ] { - 10 2 string cvrs dup aifixed 3 1 roll put - } forall - % Append the remaining AI data 0 1 ais length 1 sub { /i exch def @@ -20761,7 +27941,7 @@ begin dup gpf length ai [ exch {} forall ] putinterval dup gpf length ai length add val [ exch {} forall ] putinterval /gpf exch def - i ais length 1 sub ne aifixed ai 0 2 getinterval known not and { % Append FNC1 + i ais length 1 sub ne fncs i get and { % Append FNC1 gpf length 1 add array dup 0 gpf putinterval dup gpf length fnc1 put @@ -20770,21 +27950,25 @@ begin } for % Calculate the number of bits remaining to the next valid symbol size +{ + /bitcapsmaps << + /a [ + [167 138 118 108 88 78 59] + [167 138 118 98 78] + [197 167 138 108 78] + ] + /b [ + [ 336 296 256 208 160 104 56] + [ 768 648 536 416 304 208 152 112 72 32] + [1184 1016 840 672 496 352 264 208 152 96 56] + ] + >> def +} ctxdef + /rembits { /used exch def ccversion (c) ne { % cc-a or cc-b - << - /a [ - [167 138 118 108 88 78 59] - [167 138 118 98 78] - [197 167 138 108 78] - ] - /b [ - [ 336 296 256 208 160 104 56] - [ 768 648 536 416 304 208 152 112 72 32] - [1184 1016 840 672 496 352 264 208 152 96 56] - ] - >> ccversion get cccolumns 2 sub get /bitcaps exch def + /bitcaps bitcapsmaps ccversion get cccolumns 2 sub get def -1 bitcaps {dup used ge {exch} if pop} forall dup -1 ne {used sub} if } { @@ -20793,14 +27977,19 @@ begin m 40 le {8 } if m 41 ge m 160 le and {16} if m 161 ge m 320 le and {32} if - m 321 ge {64} if + m 321 ge m 833 le and {64} if % 833 = 900 - 3 - 64, where 900 = 30 rows x 30 cols limit + m 834 ge {32} if % Reduce to meet advertised "up to 2361 digits" (allows max 2372) within 900 limit /eccws exch def /m m eccws add 3 add def - /c linwidth 52 sub 17 idiv def - m c idiv 90 gt {/c c 1 add def} if - /r m c div ceiling cvi def - /tgt c r mul eccws sub 3 sub dup 5 idiv 6 mul exch 5 mod add 8 mul def - used 8296 le {tgt used sub} {-1} ifelse + cccolumns 30 gt { /cccolumns 30 def } if + { % Loop until rows <= 30 or columns >= 30 (GS1 General Specifications 5.11.2.3) + m cccolumns div ceiling cvi 30 le cccolumns 30 ge or {exit} if + /cccolumns cccolumns 1 add def + } loop + /r m cccolumns div ceiling cvi def + r 3 lt { /r 3 def } if % GS1 General Specifications 5.11.2.3 "3 to 30 rows" + /tgt cccolumns r mul eccws sub 3 sub dup 5 idiv 6 mul exch 5 mod add 8 mul def + used 8304 le {tgt used sub} {-1} ifelse } ifelse dup -1 eq { % Upgrade CC-A to CC-B or CC-B to CC-C to fit pop @@ -20813,10 +28002,10 @@ begin } { /ccversion -1 def } ifelse - } ifelse + } ifelse used rembits } if - } bind def + } def /encode { dup /raw ne {exch get} {pop} ifelse @@ -20824,7 +28013,7 @@ begin dup length exch gpfenc exch j exch putinterval /j exch j add def - } bind def + } def % Pre-compute alphanumeric and numeric runlengths and position of next ISO646-only characters /numericruns [ gpf length {0} repeat 0 -1 ] def @@ -20834,7 +28023,7 @@ begin /i exch def gpf i get (00) 2 string copy - dup 0 gpf i get dup fnc1 eq {pop 94} if put + dup 0 gpf i get dup fnc1 eq {pop 94} if put i gpf length 1 sub lt {dup 1 gpf i 1 add get dup fnc1 eq {pop 94} if put} if numeric exch known { numericruns i numericruns i 2 add get 2 add put @@ -20852,17 +28041,17 @@ begin nextiso646only i nextiso646only i 1 add get 1 add put } ifelse } for - + % Encode the general purpose field - /gpfenc 8296 array def + /gpfenc 8304 array def % 8304 = (865 / 5) * 6 * 8, where 865 = 900 - 3 - 32 /i 0 def /j 0 def { % loop i gpf length eq {exit} if { % not a loop but common exit point - + mode (numeric) eq { i gpf length 2 sub le { - 2 string + 2 string dup 0 gpf i get dup fnc1 eq {pop 94} if put dup 1 gpf i 1 add get dup fnc1 eq {pop 94} if put dup numeric exch known { @@ -20871,7 +28060,7 @@ begin exit } if pop - lalphanumeric numeric encode + lalphanumeric numeric encode /mode (alphanumeric) def exit } { @@ -20888,13 +28077,13 @@ begin /i i 1 add def exit } { % C1.FNC1 - 2 string dup 0 gpf i get put dup 1 94 put numeric encode + 2 string dup 0 gpf i get put dup 1 94 put numeric encode /i i 1 add def exit } ifelse } ifelse } if - + mode (alphanumeric) eq { gpf i get fnc1 eq { fnc1 alphanumeric encode @@ -20921,7 +28110,7 @@ begin /i i 1 add def exit } if - + mode (iso646) eq { gpf i get fnc1 eq { fnc1 iso646 encode @@ -20943,7 +28132,7 @@ begin /i i 1 add def exit } if - + } loop } loop /gpf gpfenc 0 j getinterval def @@ -20953,38 +28142,41 @@ begin pad length 0 gt { 0 5 pad length 1 sub { % Fill with 00100 /i exch def - pad i [ 0 0 1 0 0 ] 0 pad length i sub 5 2 copy gt {exch} if pop getinterval putinterval - } for + pad i [ 0 0 1 0 0 ] 0 pad length i sub 5 2 copy gt {exch} if pop getinterval putinterval + } for mode (numeric) eq { % Prefix shift from numeric to ASCII /pad [ 0 0 0 0 pad aload pop ] 0 pad length getinterval def } if - mode (alpha) eq { % Prefix FNC1 - /pad [ 1 1 1 1 1 pad aload pop ] 0 pad length getinterval def + mode (alpha) eq { % Prefix FNC1 + shift from numeric to ASCII + /pad [ 1 1 1 1 1 0 0 0 0 pad aload pop ] 0 pad length getinterval def } if } if - % Concatinate fields + % Concatenate fields /bits [ cdf aload pop gpf aload pop pad aload pop ] def - ccversion (a) eq { - /pwr928 [ - [ 0 0 0 0 0 0 1 ] - 68 {7 array} repeat - ] def - 1 1 68 { - /j exch def - /v 0 def - 6 -1 1 { - /i exch def - /v pwr928 j 1 sub get i get 2 mul v 928 idiv add def - pwr928 j get i v 928 mod put - } for - pwr928 j get 0 pwr928 j 1 sub get 0 get 2 mul v 928 idiv add put +{ + /pwr928 [ + [ 0 0 0 0 0 0 1 ] + 68 {7 array} repeat + ] def + 1 1 68 { + /j exch def + /v 0 def + 6 -1 1 { + /i exch def + /v pwr928 j 1 sub get i get 2 mul v 928 idiv add def + pwr928 j get i v 928 mod put } for + pwr928 j get 0 pwr928 j 1 sub get 0 get 2 mul v 928 idiv add put + } for +} ctxdef + + ccversion (a) eq { /cws [ 28 {0} repeat ] def /b 0 def /c 0 def { % loop @@ -21007,7 +28199,7 @@ begin /i exch def cs i 1 sub 2 copy get cs i get 928 idiv add put cs i 2 copy get 928 mod put - } for + } for /b b bsl add def /c c csl add def } loop @@ -21019,6 +28211,7 @@ begin dup length 4 exch sub exch putinterval barcode i 4 mul 3 -1 roll putinterval } for + options (parse) undef options (dontdraw) true put options (cca) true put options (columns) cccolumns put @@ -21032,6 +28225,7 @@ begin bits i 8 mul 8 getinterval 0 exch {add 2 mul} forall 2 idiv barcode exch i exch put } for + options (parse) undef options (dontdraw) true put options (ccb) true put options (columns) cccolumns put @@ -21045,18 +28239,24 @@ begin bits i 8 mul 8 getinterval 0 exch {add 2 mul} forall 2 idiv barcode exch i exch put } for + options (parse) undef options (dontdraw) true put options (ccc) true put options (columns) cccolumns put + options (eclevel) eccws ln 2 ln div cvi 1 sub put /args barcode options //pdf417 exec def } if args dontdraw not //renmatrix if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /gs1-cc dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -21065,18 +28265,19 @@ end % --END ENCODER gs1-cc-- % --BEGIN ENCODER ean13composite-- -% --REQUIRES preamble raiseerror renlinear renmatrix ean5 ean2 ean13 micropdf417 pdf417 gs1-cc-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix ean5 ean2 ean13 micropdf417 pdf417 gs1-cc-- % --DESC: EAN-13 Composite % --EXAM: 2112345678900|(99)1234-abcd % --EXOP: includetext % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp ean13composite 0.0 2017040400 82022 81974 -%%BeginData: 72 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp ean13composite 0.0 2022082100 105183 107941 +%%BeginData: 159 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /ean13 dup /uk.co.terryburton.bwipp findresource put dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /gs1process dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put begin @@ -21087,8 +28288,13 @@ begin /options exch def /barcode exch def + /ctx null def /dontdraw false def - + /usematrix false def + /parse false def + /dontlint false def + /lintreqs true def + % Parse the input options options type /stringtype eq { 1 dict begin @@ -21100,6 +28306,8 @@ begin } if options {def} forall + dontdraw { /usematrix true def } if + % Split the linear and composite parts barcode (|) search { /linear exch def @@ -21109,38 +28317,117 @@ begin pop } ifelse - gsave - options (lintype) (ean13) put options (inkspread) (0) put options (dontdraw) true put + options (dontlint) true put + + % Lint with a fake AI (01) + comp length 18 add string + dup 0 ((01)00000000000000) putinterval + dup 18 comp putinterval + /ai //gs1process exec pop pop pop % Plot the linear part - linear options //ean13 exec //renlinear exec + linear options //ean13 exec + usematrix not { + gsave + + //renlinear exec + + % Plot the separator + -1 72 rmoveto << + /ren //renmatrix + /pixs [ + 0 1 93 {0} repeat 1 0 + 1 0 93 {0} repeat 0 1 + 0 1 93 {0} repeat 1 0 + ] + /pixx 97 + /pixy 3 + /height 6 72 div + /width 97 72 div + /opt options + >> //renmatrix exec + + % Plot the 2D part + -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec + + grestore + } { + /linsym exch def + /sbs linsym /sbs get def + /bhs linsym /bhs get def + /bbs linsym /bbs get def + /linwidth 0 sbs {cvi add} forall def + + /compsym comp options //gs1-cc exec def + /ccpixs compsym /pixs get def + /ccpixx compsym /pixx get def + + /linpad [ ccpixx 97 sub {0} repeat ] def + + /diff linwidth linpad length add 2 add ccpixx sub def % An add-on can make linear wider than composite + diff 0 gt { % Left align composite + /ccrpad [ diff {0} repeat ] def + /pixx ccpixx diff add def + } { + /ccrpad 0 array def + /pixx ccpixx def + } ifelse - % Plot the separator - -1 72 rmoveto << - /ren //renmatrix /pixs [ - 0 1 93 {0} repeat 1 0 - 1 0 93 {0} repeat 0 1 - 0 1 93 {0} repeat 1 0 - ] - /pixx 97 - /pixy 3 - /height 6 72 div - /width 97 72 div - /opt options - >> //renmatrix exec + 0 ccpixx ccpixs length 1 sub { + /i exch def + 2 { ccpixs i ccpixx getinterval aload pop ccrpad aload pop } repeat + } for + 2 { linpad aload pop 0 1 93 {0} repeat 1 0 ccrpad aload pop } repeat + 2 { linpad aload pop 1 0 93 {0} repeat 0 1 ccrpad aload pop } repeat + 2 { linpad aload pop 0 1 93 {0} repeat 1 0 ccrpad aload pop } repeat + 71 -1 0 { + /y exch def + linpad aload pop + 0 + 0 1 sbs length 1 sub { + /i exch def + i 2 mod 0 eq { + % Don't print when bbs > y || (bbs + bhs) < y (i.e. add-on or includetext offsets) + bbs i 2 idiv get 72 mul dup y gt exch bhs i 2 idiv get 72 mul add y lt or { + sbs i get cvi {0} repeat + } { + sbs i get cvi {1} repeat + } ifelse + } { + sbs i get cvi {0} repeat + } ifelse + } for + 0 + } for + ] def - % Plot the 2D part - -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec + /pixy pixs length pixx idiv def + << + /ren //renmatrix + /pixs pixs + /pixx pixx + /pixy pixy + /height pixy 72 div + /width pixx 72 div + /opt options + >> - grestore + dontdraw not { + gsave + //renmatrix exec + grestore + } if + } ifelse end -} bind def +} +[/barcode] {null def} forall +bind def /ean13composite dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -21149,18 +28436,19 @@ end % --END ENCODER ean13composite-- % --BEGIN ENCODER ean8composite-- -% --REQUIRES preamble raiseerror renlinear renmatrix ean5 ean2 ean8 micropdf417 pdf417 gs1-cc-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix ean5 ean2 ean8 micropdf417 pdf417 gs1-cc-- % --DESC: EAN-8 Composite % --EXAM: 02345673|(21)A12345678 % --EXOP: includetext % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp ean8composite 0.0 2017040400 82363 82316 -%%BeginData: 75 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp ean8composite 0.0 2022082100 109084 108283 +%%BeginData: 162 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /ean8 dup /uk.co.terryburton.bwipp findresource put dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /gs1process dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put begin @@ -21171,8 +28459,13 @@ begin /options exch def /barcode exch def + /ctx null def /dontdraw false def - + /usematrix false def + /parse false def + /dontlint false def + /lintreqs true def + % Parse the input options options type /stringtype eq { 1 dict begin @@ -21184,6 +28477,8 @@ begin } if options {def} forall + dontdraw { /usematrix true def } if + % Split the linear and composite parts barcode (|) search { /linear exch def @@ -21193,41 +28488,120 @@ begin pop } ifelse - gsave - % Get the result of encoding with ean8 and gs1-cc options (lintype) (ean8) put options (inkspread) (0) put options (dontdraw) true put + options (dontlint) true put + + % Lint with a fake AI (01) + comp length 18 add string + dup 0 ((01)00000000000000) putinterval + dup 18 comp putinterval + /ai //gs1process exec pop pop pop % Plot the linear part - linear options //ean8 exec //renlinear exec + linear options //ean8 exec + usematrix not { + gsave + + //renlinear exec + + % Plot the separator + -1 72 rmoveto << + /ren //renmatrix + /pixs [ + 0 1 65 {0} repeat 1 0 + 1 0 65 {0} repeat 0 1 + 0 1 65 {0} repeat 1 0 + ] + /pixx 69 + /pixy 3 + /height 6 72 div + /width 69 72 div + /opt options + >> //renmatrix exec + + % Plot the 2D part + comp options //gs1-cc exec + dup (pixx) get 69 exch sub 6 rmoveto + //renmatrix exec + + grestore + } { + /linsym exch def + /sbs linsym /sbs get def + /bhs linsym /bhs get def + /bbs linsym /bbs get def + /linwidth 0 sbs {cvi add} forall def + + /compsym comp options //gs1-cc exec def + /ccpixs compsym /pixs get def + /ccpixx compsym /pixx get def + + /linpad [ ccpixx 69 sub {0} repeat ] def + + /diff linwidth linpad length add 2 add ccpixx sub def % An add-on can make linear wider than composite + diff 0 gt { % Left align composite + /ccrpad [ diff {0} repeat ] def + /pixx ccpixx diff add def + } { + /ccrpad 0 array def + /pixx ccpixx def + } ifelse - % Plot the separator - -1 72 rmoveto << - /ren //renmatrix /pixs [ - 0 1 65 {0} repeat 1 0 - 1 0 65 {0} repeat 0 1 - 0 1 65 {0} repeat 1 0 - ] - /pixx 69 - /pixy 3 - /height 6 72 div - /width 69 72 div - /opt options - >> //renmatrix exec + 0 ccpixx ccpixs length 1 sub { + /i exch def + 2 { ccpixs i ccpixx getinterval aload pop ccrpad aload pop } repeat + } for + 2 { linpad aload pop 0 1 65 {0} repeat 1 0 ccrpad aload pop } repeat + 2 { linpad aload pop 1 0 65 {0} repeat 0 1 ccrpad aload pop } repeat + 2 { linpad aload pop 0 1 65 {0} repeat 1 0 ccrpad aload pop } repeat + 71 -1 0 { + /y exch def + linpad aload pop + 0 + 0 1 sbs length 1 sub { + /i exch def + i 2 mod 0 eq { + % Don't print when bbs > y || (bbs + bhs) < y (i.e. add-on or includetext offsets) + bbs i 2 idiv get 72 mul dup y gt exch bhs i 2 idiv get 72 mul add y lt or { + sbs i get cvi {0} repeat + } { + sbs i get cvi {1} repeat + } ifelse + } { + sbs i get cvi {0} repeat + } ifelse + } for + 0 + } for + ] def - % Plot the 2D part - comp options //gs1-cc exec - dup (pixx) get 69 exch sub 6 rmoveto - //renmatrix exec + /pixy pixs length pixx idiv def + << + /ren //renmatrix + /pixs pixs + /pixx pixx + /pixy pixy + /height pixy 72 div + /width pixx 72 div + /opt options + >> - grestore + dontdraw not { + gsave + //renmatrix exec + grestore + } if + } ifelse end -} bind def +} +[/barcode] {null def} forall +bind def /ean8composite dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -21236,18 +28610,19 @@ end % --END ENCODER ean8composite-- % --BEGIN ENCODER upcacomposite-- -% --REQUIRES preamble raiseerror renlinear renmatrix ean5 ean2 upca micropdf417 pdf417 gs1-cc-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix ean5 ean2 upca micropdf417 pdf417 gs1-cc-- % --DESC: UPC-A Composite % --EXAM: 416000336108|(99)1234-abcd % --EXOP: includetext % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp upcacomposite 0.0 2017040400 82104 82161 -%%BeginData: 72 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp upcacomposite 0.0 2022082100 105177 107936 +%%BeginData: 159 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -2 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /upca dup /uk.co.terryburton.bwipp findresource put dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /gs1process dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put begin @@ -21258,8 +28633,13 @@ begin /options exch def /barcode exch def + /ctx null def /dontdraw false def - + /usematrix false def + /parse false def + /dontlint false def + /lintreqs true def + % Parse the input options options type /stringtype eq { 1 dict begin @@ -21271,6 +28651,8 @@ begin } if options {def} forall + dontdraw { /usematrix true def } if + % Split the linear and composite parts barcode (|) search { /linear exch def @@ -21280,38 +28662,117 @@ begin pop } ifelse - gsave - options (lintype) (ean13) put options (inkspread) (0) put options (dontdraw) true put + options (dontlint) true put + + % Lint with a fake AI (01) + comp length 18 add string + dup 0 ((01)00000000000000) putinterval + dup 18 comp putinterval + /ai //gs1process exec pop pop pop % Plot the linear part - linear options //upca exec //renlinear exec + linear options //upca exec + usematrix not { + gsave + + //renlinear exec + + % Plot the separator + -1 72 rmoveto << + /ren //renmatrix + /pixs [ + 0 1 93 {0} repeat 1 0 + 1 0 93 {0} repeat 0 1 + 0 1 93 {0} repeat 1 0 + ] + /pixx 97 + /pixy 3 + /height 6 72 div + /width 97 72 div + /opt options + >> //renmatrix exec + + % Plot the 2D part + -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec + + grestore + } { + /linsym exch def + /sbs linsym /sbs get def + /bhs linsym /bhs get def + /bbs linsym /bbs get def + /linwidth 0 sbs {cvi add} forall def + + /compsym comp options //gs1-cc exec def + /ccpixs compsym /pixs get def + /ccpixx compsym /pixx get def + + /linpad [ ccpixx 97 sub {0} repeat ] def + + /diff linwidth linpad length add 2 add ccpixx sub def % An add-on can make linear wider than composite + diff 0 gt { % Left align composite + /ccrpad [ diff {0} repeat ] def + /pixx ccpixx diff add def + } { + /ccrpad 0 array def + /pixx ccpixx def + } ifelse - % Plot the separator - -1 72 rmoveto << - /ren //renmatrix /pixs [ - 0 1 93 {0} repeat 1 0 - 1 0 93 {0} repeat 0 1 - 0 1 93 {0} repeat 1 0 - ] - /pixx 97 - /pixy 3 - /height 6 72 div - /width 97 72 div - /opt options - >> //renmatrix exec + 0 ccpixx ccpixs length 1 sub { + /i exch def + 2 { ccpixs i ccpixx getinterval aload pop ccrpad aload pop } repeat + } for + 2 { linpad aload pop 0 1 93 {0} repeat 1 0 ccrpad aload pop } repeat + 2 { linpad aload pop 1 0 93 {0} repeat 0 1 ccrpad aload pop } repeat + 2 { linpad aload pop 0 1 93 {0} repeat 1 0 ccrpad aload pop } repeat + 71 -1 0 { + /y exch def + linpad aload pop + 0 + 0 1 sbs length 1 sub { + /i exch def + i 2 mod 0 eq { + % Don't print when bbs > y || (bbs + bhs) < y (i.e. add-on or includetext offsets) + bbs i 2 idiv get 72 mul dup y gt exch bhs i 2 idiv get 72 mul add y lt or { + sbs i get cvi {0} repeat + } { + sbs i get cvi {1} repeat + } ifelse + } { + sbs i get cvi {0} repeat + } ifelse + } for + 0 + } for + ] def - % Plot the 2D part - -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec + /pixy pixs length pixx idiv def + << + /ren //renmatrix + /pixs pixs + /pixx pixx + /pixy pixy + /height pixy 72 div + /width pixx 72 div + /opt options + >> - grestore + dontdraw not { + gsave + //renmatrix exec + grestore + } if + } ifelse end -} bind def +} +[/barcode] {null def} forall +bind def /upcacomposite dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -21320,18 +28781,19 @@ end % --END ENCODER upcacomposite-- % --BEGIN ENCODER upcecomposite-- -% --REQUIRES preamble raiseerror renlinear renmatrix ean5 ean2 upce micropdf417 pdf417 gs1-cc-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix ean5 ean2 upce micropdf417 pdf417 gs1-cc-- % --DESC: UPC-E Composite % --EXAM: 00123457|(15)021231 % --EXOP: includetext % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp upcecomposite 0.0 2017040400 83282 83120 -%%BeginData: 87 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp upcecomposite 0.0 2022082100 108608 104503 +%%BeginData: 159 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -2 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /upce dup /uk.co.terryburton.bwipp findresource put dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /gs1process dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put begin @@ -21342,8 +28804,13 @@ begin /options exch def /barcode exch def + /ctx null def /dontdraw false def - + /usematrix false def + /parse false def + /dontlint false def + /lintreqs true def + % Parse the input options options type /stringtype eq { 1 dict begin @@ -21355,6 +28822,8 @@ begin } if options {def} forall + dontdraw { /usematrix true def } if + % Split the linear and composite parts barcode (|) search { /linear exch def @@ -21364,53 +28833,117 @@ begin pop } ifelse - % Define the separator - /sep << - /ren //renmatrix - /pixs [ - 0 1 49 {0} repeat 1 0 - 1 0 49 {0} repeat 0 1 - 0 1 49 {0} repeat 1 0 - ] - /pixx 53 - /pixy 3 - /height 6 72 div - /width 53 72 div - /opt options - >> def - - gsave - options (lintype) (upce) put options (inkspread) (0) put options (dontdraw) true put + options (dontlint) true put + + % Lint with a fake AI (01) + comp length 18 add string + dup 0 ((01)00000000000000) putinterval + dup 18 comp putinterval + /ai //gs1process exec pop pop pop % Plot the linear part - linear options //upce exec //renlinear exec + linear options //upce exec + usematrix not { + gsave + + //renlinear exec + + % Plot the separator + -1 72 rmoveto << + /ren //renmatrix + /pixs [ + 0 1 49 {0} repeat 1 0 + 1 0 49 {0} repeat 0 1 + 0 1 49 {0} repeat 1 0 + ] + /pixx 53 + /pixy 3 + /height 6 72 div + /width 53 72 div + /opt options + >> //renmatrix exec + + % Plot the 2D part + -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec + + grestore + } { + /linsym exch def + /sbs linsym /sbs get def + /bhs linsym /bhs get def + /bbs linsym /bbs get def + /linwidth 0 sbs {cvi add} forall def + + /compsym comp options //gs1-cc exec def + /ccpixs compsym /pixs get def + /ccpixx compsym /pixx get def + + /linpad [ ccpixx 53 sub {0} repeat ] def + + /diff linwidth linpad length add 2 add ccpixx sub def % An add-on can make linear wider than composite + diff 0 gt { % Left align composite + /ccrpad [ diff {0} repeat ] def + /pixx ccpixx diff add def + } { + /ccrpad 0 array def + /pixx ccpixx def + } ifelse - % Plot the separator - -1 72 rmoveto << - /ren //renmatrix /pixs [ - 0 1 49 {0} repeat 1 0 - 1 0 49 {0} repeat 0 1 - 0 1 49 {0} repeat 1 0 - ] - /pixx 53 - /pixy 3 - /height 6 72 div - /width 53 72 div - /opt options - >> //renmatrix exec + 0 ccpixx ccpixs length 1 sub { + /i exch def + 2 { ccpixs i ccpixx getinterval aload pop ccrpad aload pop } repeat + } for + 2 { linpad aload pop 0 1 49 {0} repeat 1 0 ccrpad aload pop } repeat + 2 { linpad aload pop 1 0 49 {0} repeat 0 1 ccrpad aload pop } repeat + 2 { linpad aload pop 0 1 49 {0} repeat 1 0 ccrpad aload pop } repeat + 71 -1 0 { + /y exch def + linpad aload pop + 0 + 0 1 sbs length 1 sub { + /i exch def + i 2 mod 0 eq { + % Don't print when bbs > y || (bbs + bhs) < y (i.e. add-on or includetext offsets) + bbs i 2 idiv get 72 mul dup y gt exch bhs i 2 idiv get 72 mul add y lt or { + sbs i get cvi {0} repeat + } { + sbs i get cvi {1} repeat + } ifelse + } { + sbs i get cvi {0} repeat + } ifelse + } for + 0 + } for + ] def - % Plot the 2D part - -2 6 rmoveto comp options //gs1-cc exec //renmatrix exec + /pixy pixs length pixx idiv def + << + /ren //renmatrix + /pixs pixs + /pixx pixx + /pixy pixy + /height pixy 72 div + /width pixx 72 div + /opt options + >> - grestore + dontdraw not { + gsave + //renmatrix exec + grestore + } if + } ifelse end -} bind def +} +[/barcode] {null def} forall +bind def /upcecomposite dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -21419,18 +28952,19 @@ end % --END ENCODER upcecomposite-- % --BEGIN ENCODER databaromnicomposite-- -% --REQUIRES preamble raiseerror renlinear renmatrix databaromni micropdf417 pdf417 gs1-cc-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix databaromni micropdf417 pdf417 gs1-cc-- % --DESC: GS1 DataBar Omnidirectional Composite % --EXAM: (01)03612345678904|(11)990102 % --EXOP: % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp databaromnicomposite 0.0 2017040400 82965 86277 -%%BeginData: 100 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp databaromnicomposite 0.0 2022082100 94570 94434 +%%BeginData: 114 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -2 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /databaromni dup /uk.co.terryburton.bwipp findresource put dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /gs1process dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put begin @@ -21441,8 +28975,12 @@ begin /options exch def /barcode exch def + /ctx null def /dontdraw false def - + /parse false def + /dontlint false def + /lintreqs true def + % Parse the input options options type /stringtype eq { 1 dict begin @@ -21469,6 +29007,13 @@ begin options (linkage) true put options (inkspread) (0) put options (dontdraw) true put + options (dontlint) true put + + % Lint the combined AI element strings + linear length comp length add string + dup 0 linear putinterval + dup linear length comp putinterval + /ai //gs1process exec pop pop pop % Plot the linear part linear options //databaromni exec @@ -21497,7 +29042,7 @@ begin % Right shifted module for value 3 finder sep fp [ 0 0 0 0 0 0 0 0 0 0 1 0 0 ] putinterval } if - } bind def + } def mark 0 linsbs {1 index 1 eq {{0}} {{1}} ifelse repeat} forall counttomark 1 sub array astore /bot exch def pop pop @@ -21522,7 +29067,9 @@ begin end -} bind def +} +[/barcode] {null def} forall +bind def /databaromnicomposite dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -21531,18 +29078,19 @@ end % --END ENCODER databaromnicomposite-- % --BEGIN ENCODER databarstackedcomposite-- -% --REQUIRES preamble raiseerror renlinear renmatrix databaromni databarstacked micropdf417 pdf417 gs1-cc-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix databaromni databarstacked micropdf417 pdf417 gs1-cc-- % --DESC: GS1 DataBar Stacked Composite % --EXAM: (01)03412345678900|(17)010200 % --EXOP: % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp databarstackedcomposite 0.0 2017040400 88569 84684 -%%BeginData: 96 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp databarstackedcomposite 0.0 2022082100 96302 96201 +%%BeginData: 110 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -2 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /databarstacked dup /uk.co.terryburton.bwipp findresource put dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /gs1process dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put begin /databarstackedcomposite { @@ -21552,8 +29100,12 @@ begin /options exch def /barcode exch def + /ctx null def /dontdraw false def - + /parse false def + /dontlint false def + /lintreqs true def + % Parse the input options options type /stringtype eq { 1 dict begin @@ -21580,6 +29132,13 @@ begin options (linkage) true put options (inkspread) (0) put options (dontdraw) true put + options (dontlint) true put + + % Lint the combined AI element strings + linear length comp length add string + dup 0 linear putinterval + dup linear length comp putinterval + /ai //gs1process exec pop pop pop % Plot the linear part linear options //databarstacked exec @@ -21608,7 +29167,7 @@ begin % Right shifted module for value 3 finder sep fp [ 0 0 0 0 0 0 0 0 0 0 1 0 0 ] putinterval } if - } bind def + } def /sep [ bot {1 exch sub} forall ] def sep 0 [ 0 0 0 0 ] putinterval sep sep length 4 sub [ 0 0 0 0 ] putinterval @@ -21630,7 +29189,9 @@ begin end -} bind def +} +[/barcode] {null def} forall +bind def /databarstackedcomposite dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -21639,18 +29200,19 @@ end % --END ENCODER databarstackedcomposite-- % --BEGIN ENCODER databarstackedomnicomposite-- -% --REQUIRES preamble raiseerror renlinear renmatrix databaromni databarstackedomni micropdf417 pdf417 gs1-cc-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix databaromni databarstackedomni micropdf417 pdf417 gs1-cc-- % --DESC: GS1 DataBar Stacked Omnidirectional Composite % --EXAM: (01)03612345678904|(11)990102 % --EXOP: % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp databarstackedomnicomposite 0.0 2017040400 88645 84756 -%%BeginData: 96 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp databarstackedomnicomposite 0.0 2022082100 96354 96225 +%%BeginData: 110 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -2 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /databarstackedomni dup /uk.co.terryburton.bwipp findresource put dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /gs1process dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put begin /databarstackedomnicomposite { @@ -21660,8 +29222,12 @@ begin /options exch def /barcode exch def + /ctx null def /dontdraw false def - + /parse false def + /dontlint false def + /lintreqs true def + % Parse the input options options type /stringtype eq { 1 dict begin @@ -21688,6 +29254,13 @@ begin options (linkage) true put options (inkspread) (0) put options (dontdraw) true put + options (dontlint) true put + + % Lint the combined AI element strings + linear length comp length add string + dup 0 linear putinterval + dup linear length comp putinterval + /ai //gs1process exec pop pop pop % Plot the linear part linear options //databarstackedomni exec @@ -21716,9 +29289,9 @@ begin % Right shifted module for value 3 finder sep fp [ 0 0 0 0 0 0 0 0 0 0 1 0 0 ] putinterval } if - } bind def + } def /sep [ bot {1 exch sub} forall ] def - sep 0 [ 0 0 0 ] putinterval + sep 0 [ 0 0 0 0 ] putinterval sep sep length 4 sub [ 0 0 0 0 ] putinterval 18 sepfinder 0 linheight rmoveto << @@ -21738,7 +29311,9 @@ begin end -} bind def +} +[/barcode] {null def} forall +bind def /databarstackedomnicomposite dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -21747,18 +29322,19 @@ end % --END ENCODER databarstackedomnicomposite-- % --BEGIN ENCODER databartruncatedcomposite-- -% --REQUIRES preamble raiseerror renlinear renmatrix databaromni databartruncated micropdf417 pdf417 gs1-cc-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix databaromni databartruncated micropdf417 pdf417 gs1-cc-- % --DESC: GS1 DataBar Truncated Composite % --EXAM: (01)03612345678904|(11)990102 % --EXOP: % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp databartruncatedcomposite 0.0 2017040400 89639 85738 -%%BeginData: 100 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp databartruncatedcomposite 0.0 2022082100 97436 97319 +%%BeginData: 114 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -2 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /databartruncated dup /uk.co.terryburton.bwipp findresource put dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /gs1process dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put begin @@ -21769,8 +29345,12 @@ begin /options exch def /barcode exch def + /ctx null def /dontdraw false def - + /parse false def + /dontlint false def + /lintreqs true def + % Parse the input options options type /stringtype eq { 1 dict begin @@ -21797,6 +29377,13 @@ begin options (linkage) true put options (inkspread) (0) put options (dontdraw) true put + options (dontlint) true put + + % Lint the combined AI element strings + linear length comp length add string + dup 0 linear putinterval + dup linear length comp putinterval + /ai //gs1process exec pop pop pop % Plot the linear part linear options //databartruncated exec @@ -21825,7 +29412,7 @@ begin % Right shifted module for value 3 finder sep fp [ 0 0 0 0 0 0 0 0 0 0 1 0 0 ] putinterval } if - } bind def + } def mark 0 linsbs {1 index 1 eq {{0}} {{1}} ifelse repeat} forall counttomark 1 sub array astore /bot exch def pop pop @@ -21850,7 +29437,9 @@ begin end -} bind def +} +[/barcode] {null def} forall +bind def /databartruncatedcomposite dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -21859,18 +29448,19 @@ end % --END ENCODER databartruncatedcomposite-- % --BEGIN ENCODER databarlimitedcomposite-- -% --REQUIRES preamble raiseerror renlinear renmatrix databarlimited micropdf417 pdf417 gs1-cc-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix databarlimited micropdf417 pdf417 gs1-cc-- % --DESC: GS1 DataBar Limited Composite -% --EXAM: (01)03512345678907|(21)abcdefghijklmnopqrstuv +% --EXAM: (01)03512345678907|(21)abcdefghijklmnopqrst % --EXOP: % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp databarlimitedcomposite 0.0 2017040400 79414 79211 -%%BeginData: 79 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp databarlimitedcomposite 0.0 2022082100 87443 90776 +%%BeginData: 93 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -2 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /databarlimited dup /uk.co.terryburton.bwipp findresource put dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /gs1process dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put begin @@ -21881,8 +29471,12 @@ begin /options exch def /barcode exch def + /ctx null def /dontdraw false def - + /parse false def + /dontlint false def + /lintreqs true def + % Parse the input options options type /stringtype eq { 1 dict begin @@ -21909,6 +29503,13 @@ begin options (linkage) true put options (inkspread) (0) put options (dontdraw) true put + options (dontlint) true put + + % Lint the combined AI element strings + linear length comp length add string + dup 0 linear putinterval + dup linear length comp putinterval + /ai //gs1process exec pop pop pop % Plot the linear part linear options //databarlimited exec @@ -21921,7 +29522,7 @@ begin 1 linsbs {1 index 0 eq {{1}} {{0}} ifelse repeat} forall counttomark 1 sub array astore /sep exch def pop pop sep 0 [0 0 0] putinterval - sep sep length 4 sub [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 @@ -21933,15 +29534,17 @@ begin >> //renmatrix exec % Plot the 2D part - comp options //gs1-cc exec - dup (pixx) get 72 exch sub 1 rmoveto + comp options //gs1-cc exec + dup (pixx) get 72 exch sub 1 rmoveto //renmatrix exec grestore end -} bind def +} +[/barcode] {null def} forall +bind def /databarlimitedcomposite dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -21950,18 +29553,19 @@ end % --END ENCODER databarlimitedcomposite-- % --BEGIN ENCODER databarexpandedcomposite-- -% --REQUIRES preamble raiseerror renlinear renmatrix databarexpanded micropdf417 pdf417 gs1-cc-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix databarexpanded micropdf417 pdf417 gs1-cc-- % --DESC: GS1 DataBar Expanded Composite % --EXAM: (01)93712345678904(3103)001234|(91)1A2B3C4D5E % --EXOP: % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp databarexpandedcomposite 0.0 2017040400 85836 82285 -%%BeginData: 98 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp databarexpandedcomposite 0.0 2022082100 93873 93874 +%%BeginData: 112 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -2 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /databarexpanded dup /uk.co.terryburton.bwipp findresource put dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /gs1process dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put begin @@ -21972,8 +29576,12 @@ begin /options exch def /barcode exch def + /ctx null def /dontdraw false def - + /parse false def + /dontlint false def + /lintreqs true def + % Parse the input options options type /stringtype eq { 1 dict begin @@ -22000,6 +29608,13 @@ begin options (linkage) true put options (inkspread) (0) put options (dontdraw) true put + options (dontlint) true put + + % Lint the combined AI element strings + linear length comp length add string + dup 0 linear putinterval + dup linear length comp putinterval + /ai //gs1process exec pop pop pop % Plot the linear part linear options //databarexpanded exec @@ -22023,7 +29638,7 @@ begin } ifelse sep exch i exch put } for - } bind def + } def mark 0 linsbs {1 index 1 eq {{0}} {{1}} ifelse repeat} forall counttomark 1 sub array astore /bot exch def pop pop @@ -22033,7 +29648,7 @@ begin [ % Finder pattern module positions 18 98 bot length 13 sub {} for 69 98 bot length 13 sub {} for - ] {sepfinder} forall + ] {sepfinder} forall 0 linheight rmoveto << /ren //renmatrix /pixs sep @@ -22051,7 +29666,9 @@ begin end -} bind def +} +[/barcode] {null def} forall +bind def /databarexpandedcomposite dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -22060,18 +29677,19 @@ end % --END ENCODER databarexpandedcomposite-- % --BEGIN ENCODER databarexpandedstackedcomposite-- -% --REQUIRES preamble raiseerror renlinear renmatrix databarexpanded databarexpandedstacked micropdf417 pdf417 gs1-cc-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix databarexpanded databarexpandedstacked micropdf417 pdf417 gs1-cc-- % --DESC: GS1 DataBar Expanded Stacked Composite % --EXAM: (01)00012345678905(10)ABCDEF|(21)12345678 -% --EXOP: segments=4 +% --EXOP: segments=4 % --RNDR: renmatrix renlinear -%%BeginResource: uk.co.terryburton.bwipp databarexpandedstackedcomposite 0.0 2017040400 88452 84444 -%%BeginData: 95 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp databarexpandedstackedcomposite 0.0 2022082100 96049 95929 +%%BeginData: 109 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -2 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /databarexpandedstacked dup /uk.co.terryburton.bwipp findresource put dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /gs1process dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put begin /databarexpandedstackedcomposite { @@ -22081,8 +29699,12 @@ begin /options exch def /barcode exch def + /ctx null def /dontdraw false def - + /parse false def + /dontlint false def + /lintreqs true def + % Parse the input options options type /stringtype eq { 1 dict begin @@ -22109,6 +29731,13 @@ begin options (linkage) true put options (inkspread) (0) put options (dontdraw) true put + options (dontlint) true put + + % Lint the combined AI element strings + linear length comp length add string + dup 0 linear putinterval + dup linear length comp putinterval + /ai //gs1process exec pop pop pop % Plot the linear part linear options //databarexpandedstacked exec @@ -22132,14 +29761,14 @@ begin } ifelse sep exch i exch put } for - } bind def + } def /sep [ bot {1 exch sub} forall ] def - sep 0 [ 0 0 0 ] putinterval + sep 0 [ 0 0 0 0 ] putinterval sep sep length 4 sub [ 0 0 0 0 ] putinterval [ % Finder pattern module positions 19 98 bot length 13 sub {} for 70 98 bot length 13 sub {} for - ] {sepfinder} forall + ] {sepfinder} forall 0 linheight rmoveto << /ren //renmatrix /pixs sep @@ -22158,7 +29787,9 @@ begin end -} bind def +} +[/barcode] {null def} forall +bind def /databarexpandedstackedcomposite dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -22167,18 +29798,19 @@ end % --END ENCODER databarexpandedstackedcomposite-- % --BEGIN ENCODER gs1-128composite-- -% --REQUIRES preamble raiseerror renlinear renmatrix code128 gs1-128 micropdf417 pdf417 gs1-cc-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renlinear renmatrix code128 gs1-128 micropdf417 pdf417 gs1-cc-- % --DESC: GS1-128 Composite % --EXAM: (00)030123456789012340|(02)13012345678909(37)24(10)1234567ABCDEFG % --EXOP: ccversion=c % --RNDR: renlinear renmatrix -%%BeginResource: uk.co.terryburton.bwipp gs1-128composite 0.0 2017040400 85883 88824 -%%BeginData: 100 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp gs1-128composite 0.0 2022082100 97016 93461 +%%BeginData: 114 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -2 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /gs1-128 dup /uk.co.terryburton.bwipp findresource put dup /gs1-cc dup /uk.co.terryburton.bwipp findresource put +dup /gs1process dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put begin @@ -22189,8 +29821,12 @@ begin /options exch def /barcode exch def + /ctx null def /dontdraw false def - + /parse false def + /dontlint false def + /lintreqs true def + % Parse the input options options type /stringtype eq { 1 dict begin @@ -22215,6 +29851,13 @@ begin options (inkspread) (0) put options (dontdraw) true put + options (dontlint) true put + + % Lint the combined AI element strings + linear length comp length add string + dup 0 linear putinterval + dup linear length comp putinterval + /ai //gs1process exec pop pop pop % Dummy plot of linear part with CC-A to get width options (linkagea) true put @@ -22225,7 +29868,7 @@ begin options (lintype) (gs1-128) put options (linwidth) linwidth put comp options //gs1-cc exec /compsym exch def - compsym (pixx) get 99 eq {(a)} {(c)} ifelse /linktype exch def + compsym (pixx) get 99 eq {(a)} {(c)} ifelse /linktype exch def % Plot linear part linktype (a) eq { @@ -22261,7 +29904,7 @@ begin /x s p sub 1 sub 11 mul 10 add p 0 eq {2 add} if 99 sub def x 1 rmoveto } { - -7 1 rmoveto + -7 1 rmoveto } ifelse compsym //renmatrix exec @@ -22270,7 +29913,9 @@ begin end -} bind def +} +[/barcode] {null def} forall +bind def /gs1-128composite dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -22279,16 +29924,17 @@ end % --END ENCODER gs1-128composite-- % --BEGIN ENCODER gs1datamatrix-- -% --REQUIRES preamble raiseerror renmatrix datamatrix-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renmatrix datamatrix-- % --DESC: GS1 Data Matrix % --EXAM: (01)03453120000011(17)120508(10)ABCD1234(410)9501101020917 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp gs1datamatrix 0.0 2017040400 79986 76213 -%%BeginData: 135 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp gs1datamatrix 0.0 2022082100 77432 73954 +%%BeginData: 91 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /gs1process dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put dup /datamatrix dup /uk.co.terryburton.bwipp findresource put begin @@ -22299,8 +29945,13 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def - + /parse false def + /dontlint false def + /lintreqs true def + /gssep false def + % Parse the input options options type /stringtype eq { 1 dict begin @@ -22312,65 +29963,12 @@ begin } if options {def} forall - % Expand ordinals of the form ^NNN to ASCII - /expand { - /in exch def - /out in length string def - /j 0 def - in - { % loop - (^) search { - dup out exch j exch putinterval - length j add 1 add /j exch def - pop - dup 0 3 getinterval cvi out exch j 1 sub exch put - dup length 3 sub 3 exch getinterval - } { - dup out exch j exch putinterval - length j add /j exch def - out 0 j getinterval exit - } ifelse - } loop - } bind def - - % Parse out AIs - /ais [] def - /vals [] def - barcode dup length 1 sub 1 exch getinterval - { % loop - dup () eq {exit} if - (\)) search pop - exch pop - exch (\() search { - exch pop exch 3 1 roll - } { - () 3 1 roll - } ifelse - [ ais aload pop counttomark 2 add index ] /ais exch def - [ vals aload pop counttomark 1 add index expand ] /vals exch def - pop pop - } loop - pop - - % Pre-defined fixed length data field AIs - % any AI whose prefix is not included in this table must be - % terminated with "FNC1", even if it's fixed length - /aifixed 23 dict def - [ - 0 1 4 {} for - ] { - (00) 2 string copy dup dup 1 5 -1 roll 48 add put aifixed 3 1 roll put - } forall - [ - 11 1 20 {} for - 23 - 31 1 36 {} for - 41 - ] { - 10 2 string cvrs dup aifixed 3 1 roll put - } forall + barcode /ai //gs1process exec + /fncs exch def + /vals exch def + /ais exch def - % Create the datamatrix data + % Create the datamatrix data /fnc1 -1 def /dmtx [ fnc1 ] def 0 1 ais length 1 sub { @@ -22382,10 +29980,10 @@ begin dup dmtx length ai [ exch {} forall ] putinterval dup dmtx length ai length add val [ exch {} forall ] putinterval /dmtx exch def - i ais length 1 sub ne aifixed ai 0 2 getinterval known not and { % Append FNC1 + i ais length 1 sub ne fncs i get and { % Append FNC1 dmtx length 1 add array dup 0 dmtx putinterval - dup dmtx length fnc1 put + dup dmtx length gssep {29} {fnc1} ifelse put /dmtx exch def } if } for @@ -22406,18 +30004,21 @@ begin /barcode barcode 0 j getinterval def % Get the result of encoding with datamatrix + options (parse) undef options (dontdraw) true put options (parsefnc) true put /args barcode options //datamatrix exec def args (opt) options put args - + dontdraw not //renmatrix if - + end -} bind def +} +[/barcode] {null def} forall +bind def /gs1datamatrix dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -22426,16 +30027,17 @@ end % --END ENCODER gs1datamatrix-- % --BEGIN ENCODER gs1datamatrixrectangular-- -% --REQUIRES preamble raiseerror renmatrix datamatrix-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renmatrix datamatrix-- % --DESC: GS1 Data Matrix Rectangular % --EXAM: (01)03453120000011(17)120508(10)ABCD1234(410)9501101020917 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp gs1datamatrixrectangular 0.0 2017040400 80189 79933 -%%BeginData: 136 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp gs1datamatrixrectangular 0.0 2022082100 77747 74258 +%%BeginData: 92 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /gs1process dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put dup /datamatrix dup /uk.co.terryburton.bwipp findresource put begin @@ -22446,8 +30048,13 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def + /parse false def + /dontlint false def + /lintreqs true def /dontdraw false def - + /gssep false def + % Parse the input options options type /stringtype eq { 1 dict begin @@ -22459,65 +30066,12 @@ begin } if options {def} forall - % Expand ordinals of the form ^NNN to ASCII - /expand { - /in exch def - /out in length string def - /j 0 def - in - { % loop - (^) search { - dup out exch j exch putinterval - length j add 1 add /j exch def - pop - dup 0 3 getinterval cvi out exch j 1 sub exch put - dup length 3 sub 3 exch getinterval - } { - dup out exch j exch putinterval - length j add /j exch def - out 0 j getinterval exit - } ifelse - } loop - } bind def + barcode /ai //gs1process exec + /fncs exch def + /vals exch def + /ais exch def - % Parse out AIs - /ais [] def - /vals [] def - barcode dup length 1 sub 1 exch getinterval - { % loop - dup () eq {exit} if - (\)) search pop - exch pop - exch (\() search { - exch pop exch 3 1 roll - } { - () 3 1 roll - } ifelse - [ ais aload pop counttomark 2 add index ] /ais exch def - [ vals aload pop counttomark 1 add index expand ] /vals exch def - pop pop - } loop - pop - - % Pre-defined fixed length data field AIs - % any AI whose prefix is not included in this table must be - % terminated with "FNC1", even if it's fixed length - /aifixed 23 dict def - [ - 0 1 4 {} for - ] { - (00) 2 string copy dup dup 1 5 -1 roll 48 add put aifixed 3 1 roll put - } forall - [ - 11 1 20 {} for - 23 - 31 1 36 {} for - 41 - ] { - 10 2 string cvrs dup aifixed 3 1 roll put - } forall - - % Create the datamatrix data + % Create the datamatrix data /fnc1 -1 def /dmtx [ fnc1 ] def 0 1 ais length 1 sub { @@ -22529,10 +30083,10 @@ begin dup dmtx length ai [ exch {} forall ] putinterval dup dmtx length ai length add val [ exch {} forall ] putinterval /dmtx exch def - i ais length 1 sub ne aifixed ai 0 2 getinterval known not and { % Append FNC1 + i ais length 1 sub ne fncs i get and { % Append FNC1 dmtx length 1 add array dup 0 dmtx putinterval - dup dmtx length fnc1 put + dup dmtx length gssep {29} {fnc1} ifelse put /dmtx exch def } if } for @@ -22553,6 +30107,7 @@ begin /barcode barcode 0 j getinterval def % Get the result of encoding with datamatrix + options (parse) undef options (dontdraw) true put options (parsefnc) true put options (format) (rectangle) put @@ -22560,12 +30115,14 @@ begin args (opt) options put args - + dontdraw not //renmatrix if - + end -} bind def +} +[/barcode] {null def} forall +bind def /gs1datamatrixrectangular dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -22573,16 +30130,88 @@ end %%EndResource % --END ENCODER gs1datamatrixrectangular-- +% --BEGIN ENCODER gs1dldatamatrix-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renmatrix datamatrix-- +% --DESC: GS1 Digital Link Data Matrix +% --EXAM: https://id.gs1.org/01/12312312312333/22/ABC%2d123?99=XYZ%2f987#test +% --EXOP: +% --RNDR: renmatrix +%%BeginResource: uk.co.terryburton.bwipp gs1dldatamatrix 0.0 2022082100 70572 63571 +%%BeginData: 59 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +10 dict +dup /parseinput dup /uk.co.terryburton.bwipp findresource put +dup /gs1process dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +dup /datamatrix dup /uk.co.terryburton.bwipp findresource put +begin +/gs1dldatamatrix { + + 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 + + /ctx null def + /parse false def + /dontlint false def + /lintreqs true def + /dontdraw 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 the input + /fncvals << + /parse parse + /parseonly true + /parsefnc false + >> def + /barcode barcode fncvals //parseinput exec def + + barcode /dl //gs1process exec pop pop pop + + % Get the result of encoding with datamatrix + options (parse) undef + options (dontdraw) true put + /args barcode options //datamatrix exec def + + args (opt) options put + args + + dontdraw not //renmatrix if + + end + +} +[/barcode] {null def} forall +bind def +/gs1dldatamatrix dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER gs1dldatamatrix-- + % --BEGIN ENCODER gs1qrcode-- -% --REQUIRES preamble raiseerror renmatrix qrcode-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renmatrix qrcode-- % --DESC: GS1 QR Code % --EXAM: (01)03453120000011(8200)http://www.abc.net(10)ABCD1234(410)9501101020917 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp gs1qrcode 0.0 2017040400 76420 79603 -%%BeginData: 134 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp gs1qrcode 0.0 2022082100 77214 73742 +%%BeginData: 89 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /gs1process 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 @@ -22593,8 +30222,12 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def + /parse false def + /dontlint false def + /lintreqs true def /dontdraw false def - + % Parse the input options options type /stringtype eq { 1 dict begin @@ -22606,63 +30239,10 @@ begin } if options {def} forall - % Expand ordinals of the form ^NNN to ASCII - /expand { - /in exch def - /out in length string def - /j 0 def - in - { % loop - (^) search { - dup out exch j exch putinterval - length j add 1 add /j exch def - pop - dup 0 3 getinterval cvi out exch j 1 sub exch put - dup length 3 sub 3 exch getinterval - } { - dup out exch j exch putinterval - length j add /j exch def - out 0 j getinterval exit - } ifelse - } loop - } bind def - - % Parse out AIs - /ais [] def - /vals [] def - barcode dup length 1 sub 1 exch getinterval - { % loop - dup () eq {exit} if - (\)) search pop - exch pop - exch (\() search { - exch pop exch 3 1 roll - } { - () 3 1 roll - } ifelse - [ ais aload pop counttomark 2 add index ] /ais exch def - [ vals aload pop counttomark 1 add index expand ] /vals exch def - pop pop - } loop - pop - - % Pre-defined fixed length data field AIs - % any AI whose prefix is not included in this table must be - % terminated with "FNC1", even if it's fixed length - /aifixed 23 dict def - [ - 0 1 4 {} for - ] { - (00) 2 string copy dup dup 1 5 -1 roll 48 add put aifixed 3 1 roll put - } forall - [ - 11 1 20 {} for - 23 - 31 1 36 {} for - 41 - ] { - 10 2 string cvrs dup aifixed 3 1 roll put - } forall + barcode /ai //gs1process exec + /fncs exch def + /vals exch def + /ais exch def % Create the qrcode data /fnc1 -1 def @@ -22676,7 +30256,7 @@ begin dup qrc length ai [ exch {} forall ] putinterval dup qrc length ai length add val [ exch {} forall ] putinterval /qrc exch def - i ais length 1 sub ne aifixed ai 0 2 getinterval known not and { % Append FNC1 + i ais length 1 sub ne fncs i get and { % Append FNC1 qrc length 1 add array dup 0 qrc putinterval dup qrc length fnc1 put @@ -22700,18 +30280,21 @@ begin /barcode barcode 0 j getinterval def % Get the result of encoding with qrcode + options (parse) undef options (dontdraw) true put options (parsefnc) true put /args barcode options //qrcode exec def args (opt) options put args - + dontdraw not //renmatrix if - + end -} bind def +} +[/barcode] {null def} forall +bind def /gs1qrcode dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -22719,16 +30302,191 @@ end %%EndResource % --END ENCODER gs1qrcode-- +% --BEGIN ENCODER gs1dlqrcode-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renmatrix qrcode-- +% --DESC: GS1 Digital Link QR Code +% --EXAM: https://id.gs1.org/01/12312312312333/22/ABC%2d123?99=XYZ%2f987#test +% --EXOP: +% --RNDR: renmatrix +%%BeginResource: uk.co.terryburton.bwipp gs1dlqrcode 0.0 2022082100 67116 67111 +%%BeginData: 59 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +10 dict +dup /parseinput dup /uk.co.terryburton.bwipp findresource put +dup /gs1process 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 +/gs1dlqrcode { + + 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 + + /ctx null def + /parse false def + /dontlint false def + /lintreqs true def + /dontdraw 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 the input + /fncvals << + /parse parse + /parseonly true + /parsefnc false + >> def + /barcode barcode fncvals //parseinput exec def + + barcode /dl //gs1process exec pop pop pop + + % Get the result of encoding with qrcode + options (parse) undef + options (dontdraw) true put + /args barcode options //qrcode exec def + + args (opt) options put + args + + dontdraw not //renmatrix if + + end + +} +[/barcode] {null def} forall +bind def +/gs1dlqrcode dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER gs1dlqrcode-- + +% --BEGIN ENCODER gs1dotcode-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput gs1process renmatrix dotcode-- +% --DESC: GS1 DotCode +% --EXAM: (235)5vBZIF%!<B;?oa%(01)01234567890128(8008)19052001 +% --EXOP: rows=16 +% --RNDR: renmatrix +%%BeginResource: uk.co.terryburton.bwipp gs1dotcode 0.0 2022082100 77157 73683 +%%BeginData: 90 ASCII Lines +/setpacking where {pop currentpacking true setpacking} if +10 dict +dup /raiseerror dup /uk.co.terryburton.bwipp findresource put +dup /gs1process dup /uk.co.terryburton.bwipp findresource put +dup /renmatrix dup /uk.co.terryburton.bwipp findresource put +dup /dotcode dup /uk.co.terryburton.bwipp findresource put +begin +/gs1dotcode { + + 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 + + /ctx null def + /dontdraw false def + /parse false def + /dontlint false def + /lintreqs true 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 + + barcode /ai //gs1process exec + /fncs exch def + /vals exch def + /ais exch def + + % Create the dotcode data + /fnc1 -1 def + /dmtx [ fnc1 ] def + 0 1 ais length 1 sub { + /i exch def + /ai ais i get def + /val vals i get def + dmtx length ai length add val length add array + dup 0 dmtx putinterval + dup dmtx length ai [ exch {} forall ] putinterval + dup dmtx length ai length add val [ exch {} forall ] putinterval + /dmtx exch def + i ais length 1 sub ne fncs i get and { % Append FNC1 + dmtx length 1 add array + dup 0 dmtx putinterval + dup dmtx length fnc1 put + /dmtx exch def + } if + } for + + % Compose input to dotcode + /barcode dmtx length 1 add 5 mul string def + /i 0 def /j 0 def { + i dmtx length eq {exit} if + dmtx i get dup fnc1 eq { + pop barcode j (^FNC1) putinterval + /j j 4 add def + } { + barcode exch j exch put + } ifelse + /i i 1 add def + /j j 1 add def + } loop + /barcode barcode 0 j getinterval def + + % Get the result of encoding with dotcode + options (parse) undef + options (dontdraw) true put + options (parsefnc) true put + /args barcode options //dotcode exec def + + args (opt) options put + args + + dontdraw not //renmatrix if + + end + +} +[/barcode] {null def} forall +bind def +/gs1dotcode dup load /uk.co.terryburton.bwipp defineresource pop +end +/setpacking where {pop setpacking} if +%%EndData +%%EndResource +% --END ENCODER gs1dotcode-- + % --BEGIN ENCODER hibccode39-- -% --REQUIRES preamble raiseerror renlinear code39-- +% --REQUIRES preamble loadctx unloadctx raiseerror renlinear code39-- % --DESC: HIBC Code 39 % --EXAM: A123BJC5D6E71 % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp hibccode39 0.0 2017040400 68512 68281 -%%BeginData: 92 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp hibccode39 0.0 2022082100 63587 67110 +%%BeginData: 103 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /code39 dup /uk.co.terryburton.bwipp findresource put @@ -22740,8 +30498,9 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textyoffset -7 def /textxoffset 0 def @@ -22763,10 +30522,14 @@ begin /textyoffset textyoffset cvr def /textxoffset textxoffset cvr def + /hibccode39 //loadctx exec + % Create a string of the available characters +{ /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def /charvals 43 dict def 0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for +} ctxdef % Validate the input 0 1 barcode length 1 sub { @@ -22810,12 +30573,16 @@ begin args (textxalign) (center) put args (opt) options put args - + dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /hibccode39 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -22824,15 +30591,17 @@ end % --END ENCODER hibccode39-- % --BEGIN ENCODER hibccode128-- -% --REQUIRES preamble raiseerror renlinear code128-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renlinear code128-- % --DESC: HIBC Code 128 % --EXAM: A123BJC5D6E71 % --EXOP: includetext % --RNDR: renlinear -%%BeginResource: uk.co.terryburton.bwipp hibccode128 0.0 2017040400 68415 68036 -%%BeginData: 91 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp hibccode128 0.0 2022082100 69879 69846 +%%BeginData: 102 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renlinear dup /uk.co.terryburton.bwipp findresource put dup /code128 dup /uk.co.terryburton.bwipp findresource put @@ -22844,8 +30613,9 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def - /textfont /NimbusMonL-Regu def + /textfont /Courier def /textsize 10 def /textyoffset -7 def /textxoffset 0 def @@ -22867,10 +30637,14 @@ begin /textyoffset textyoffset cvr def /textxoffset textxoffset cvr def + /hibccode128 //loadctx exec + % Create a string of the available characters +{ /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def /charvals 43 dict def 0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for +} ctxdef % Validate the input 0 1 barcode length 1 sub { @@ -22913,12 +30687,16 @@ begin args (textxalign) (center) put args (opt) options put args - + dontdraw not //renlinear if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /hibccode128 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -22927,15 +30705,17 @@ end % --END ENCODER hibccode128-- % --BEGIN ENCODER hibcdatamatrix-- -% --REQUIRES preamble raiseerror renmatrix datamatrix-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix datamatrix-- % --DESC: HIBC Data Matrix % --EXAM: A123BJC5D6E71 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp hibcdatamatrix 0.0 2017040400 65202 64798 -%%BeginData: 74 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp hibcdatamatrix 0.0 2022082100 67458 67144 +%%BeginData: 85 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put dup /datamatrix dup /uk.co.terryburton.bwipp findresource put @@ -22947,6 +30727,7 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /validatecheck false def @@ -22961,10 +30742,14 @@ begin } if options {def} forall + /hibcdatamatrix //loadctx exec + % Create a string of the available characters +{ /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def /charvals 43 dict def 0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for +} ctxdef % Validate the input 0 1 barcode length 1 sub { @@ -22999,12 +30784,16 @@ begin args (opt) options put args - + dontdraw not //renmatrix if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /hibcdatamatrix dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -23013,15 +30802,17 @@ end % --END ENCODER hibcdatamatrix-- % --BEGIN ENCODER hibcdatamatrixrectangular-- -% --REQUIRES preamble raiseerror renmatrix datamatrix-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix datamatrix-- % --DESC: HIBC Data Matrix Rectangular % --EXAM: A123BJC5D6E71 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp hibcdatamatrixrectangular 0.0 2017040400 65451 65014 -%%BeginData: 75 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp hibcdatamatrixrectangular 0.0 2022082100 67707 67360 +%%BeginData: 86 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put dup /datamatrix dup /uk.co.terryburton.bwipp findresource put @@ -23033,6 +30824,7 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /validatecheck false def @@ -23047,10 +30839,14 @@ begin } if options {def} forall + /hibcdatamatrixrectangular //loadctx exec + % Create a string of the available characters +{ /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def /charvals 43 dict def 0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for +} ctxdef % Validate the input 0 1 barcode length 1 sub { @@ -23086,12 +30882,16 @@ begin args (opt) options put args - + dontdraw not //renmatrix if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /hibcdatamatrixrectangular dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -23100,15 +30900,17 @@ end % --END ENCODER hibcdatamatrixrectangular-- % --BEGIN ENCODER hibcpdf417-- -% --REQUIRES preamble raiseerror renmatrix pdf417-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix pdf417-- % --DESC: HIBC PDF417 % --EXAM: A123BJC5D6E71 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp hibcpdf417 0.0 2017040400 65591 65215 -%%BeginData: 78 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp hibcpdf417 0.0 2022082100 67713 67465 +%%BeginData: 89 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put dup /pdf417 dup /uk.co.terryburton.bwipp findresource put @@ -23120,6 +30922,7 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /columns 2 def /validatecheck false def @@ -23137,10 +30940,14 @@ begin /columns columns cvi def + /hibcpdf417 //loadctx exec + % Create a string of the available characters +{ /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def /charvals 43 dict def 0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for +} ctxdef % Validate the input 0 1 barcode length 1 sub { @@ -23176,12 +30983,16 @@ begin args (opt) options put args - + dontdraw not //renmatrix if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /hibcpdf417 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -23190,15 +31001,17 @@ end % --END ENCODER hibcpdf417-- % --BEGIN ENCODER hibcmicropdf417-- -% --REQUIRES preamble raiseerror renmatrix micropdf417-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix micropdf417-- % --DESC: HIBC MicroPDF417 % --EXAM: A123BJC5D6E71 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp hibcmicropdf417 0.0 2017040400 65641 65250 -%%BeginData: 78 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp hibcmicropdf417 0.0 2022082100 67787 67500 +%%BeginData: 89 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put dup /micropdf417 dup /uk.co.terryburton.bwipp findresource put @@ -23210,6 +31023,7 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /columns 2 def /validatecheck false def @@ -23227,10 +31041,14 @@ begin /columns columns cvi def + /hibcmicropdf417 //loadctx exec + % Create a string of the available characters +{ /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def /charvals 43 dict def 0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for +} ctxdef % Validate the input 0 1 barcode length 1 sub { @@ -23266,12 +31084,16 @@ begin args (opt) options put args - + dontdraw not //renmatrix if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /hibcmicropdf417 dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -23280,15 +31102,17 @@ end % --END ENCODER hibcmicropdf417-- % --BEGIN ENCODER hibcqrcode-- -% --REQUIRES preamble raiseerror renmatrix qrcode-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix qrcode-- % --DESC: HIBC QR Code % --EXAM: A123BJC5D6E71 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp hibcqrcode 0.0 2017040400 65146 64770 -%%BeginData: 74 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp hibcqrcode 0.0 2022082100 68350 68090 +%%BeginData: 85 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put 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 @@ -23300,6 +31124,7 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /validatecheck false def @@ -23314,10 +31139,14 @@ begin } if options {def} forall + /hibcqrcode //loadctx exec + % Create a string of the available characters +{ /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def /charvals 43 dict def 0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for +} ctxdef % Validate the input 0 1 barcode length 1 sub { @@ -23352,12 +31181,16 @@ begin args (opt) options put args - + dontdraw not //renmatrix if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /hibcqrcode dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -23366,15 +31199,17 @@ end % --END ENCODER hibcqrcode-- % --BEGIN ENCODER hibccodablockf-- -% --REQUIRES preamble raiseerror renmatrix codablockf-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix codablockf-- % --DESC: HIBC Codablock F % --EXAM: A123BJC5D6E71 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp hibccodablockf 0.0 2017040400 65182 64798 -%%BeginData: 74 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp hibccodablockf 0.0 2022082100 67542 67272 +%%BeginData: 85 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put dup /codablockf dup /uk.co.terryburton.bwipp findresource put @@ -23386,6 +31221,7 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /validatecheck false def @@ -23400,10 +31236,14 @@ begin } if options {def} forall + /hibccodablockf //loadctx exec + % Create a string of the available characters +{ /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def /charvals 43 dict def 0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for +} ctxdef % Validate the input 0 1 barcode length 1 sub { @@ -23438,12 +31278,16 @@ begin args (opt) options put args - + dontdraw not //renmatrix if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /hibccodablockf dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if @@ -23452,15 +31296,17 @@ end % --END ENCODER hibccodablockf-- % --BEGIN ENCODER hibcazteccode-- -% --REQUIRES preamble raiseerror renmatrix azteccode-- +% --REQUIRES preamble loadctx unloadctx raiseerror parseinput renmatrix azteccode-- % --DESC: HIBC Aztec Code % --EXAM: A123BJC5D6E71 % --EXOP: % --RNDR: renmatrix -%%BeginResource: uk.co.terryburton.bwipp hibcazteccode 0.0 2017040400 68614 64895 -%%BeginData: 74 ASCII Lines +%%BeginResource: uk.co.terryburton.bwipp hibcazteccode 0.0 2022082100 67408 67137 +%%BeginData: 85 ASCII Lines /setpacking where {pop currentpacking true setpacking} if -1 dict +10 dict +dup /loadctx dup /uk.co.terryburton.bwipp findresource put +dup /unloadctx dup /uk.co.terryburton.bwipp findresource put dup /raiseerror dup /uk.co.terryburton.bwipp findresource put dup /renmatrix dup /uk.co.terryburton.bwipp findresource put dup /azteccode dup /uk.co.terryburton.bwipp findresource put @@ -23472,6 +31318,7 @@ begin /options exch def % We are given an option string /barcode exch def % We are given a barcode string + /ctx null def /dontdraw false def /validatecheck false def @@ -23486,10 +31333,14 @@ begin } if options {def} forall + /hibcazteccode //loadctx exec + % Create a string of the available characters +{ /barchars (0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ-. $/+%) def /charvals 43 dict def 0 1 42 {charvals exch dup barchars exch 1 getinterval exch put} for +} ctxdef % Validate the input 0 1 barcode length 1 sub { @@ -23524,12 +31375,16 @@ begin args (opt) options put args - + dontdraw not //renmatrix if + //unloadctx exec + end -} bind def +} +[/barcode] {null def} forall +bind def /hibcazteccode dup load /uk.co.terryburton.bwipp defineresource pop end /setpacking where {pop setpacking} if |