summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/dvips
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2022-08-23 20:12:06 +0000
committerKarl Berry <karl@freefriends.org>2022-08-23 20:12:06 +0000
commit363c7f7c9597348addc3264cc2cfd69eadfe57f3 (patch)
tree28d968562b53ae3a91786fe8c9bcbb757537d47c /Master/texmf-dist/dvips
parented7b23797cf7ee9f0635e8b076528b88f81337e0 (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.pro16527
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