rghost_barcode 0.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/doc/classes/RGhost.html +109 -0
- data/lib/doc/classes/RGhost/Barcode.html +147 -0
- data/lib/doc/classes/RGhost/Barcode/Auspost.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Azteccode.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Base.html +266 -0
- data/lib/doc/classes/RGhost/Barcode/Base.src/M000004.html +34 -0
- data/lib/doc/classes/RGhost/Barcode/Base.src/M000005.html +30 -0
- data/lib/doc/classes/RGhost/Barcode/Base.src/M000006.html +20 -0
- data/lib/doc/classes/RGhost/Barcode/Border.html +170 -0
- data/lib/doc/classes/RGhost/Barcode/Border.src/M000001.html +27 -0
- data/lib/doc/classes/RGhost/Barcode/Code11.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Code128.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Code2of5.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Code39.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Code93.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Datamatrix.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Ean13.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Ean2.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Ean5.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Ean8.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Guard.html +174 -0
- data/lib/doc/classes/RGhost/Barcode/Guard.src/M000003.html +27 -0
- data/lib/doc/classes/RGhost/Barcode/Interleaved2of5.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Isbn.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Kix.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Maxicode.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Msi.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Onecode.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Parameter.html +262 -0
- data/lib/doc/classes/RGhost/Barcode/Parameter.src/M000007.html +20 -0
- data/lib/doc/classes/RGhost/Barcode/Parameter.src/M000008.html +18 -0
- data/lib/doc/classes/RGhost/Barcode/Parameter.src/M000009.html +18 -0
- data/lib/doc/classes/RGhost/Barcode/Parameter.src/M000010.html +18 -0
- data/lib/doc/classes/RGhost/Barcode/Parameter.src/M000011.html +18 -0
- data/lib/doc/classes/RGhost/Barcode/Parameter.src/M000012.html +24 -0
- data/lib/doc/classes/RGhost/Barcode/Parameter.src/M000013.html +18 -0
- data/lib/doc/classes/RGhost/Barcode/Parameter.src/M000014.html +18 -0
- data/lib/doc/classes/RGhost/Barcode/Parameter.src/M000015.html +16 -0
- data/lib/doc/classes/RGhost/Barcode/Pdf417.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Pharmacode.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Plessey.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Postnet.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Qrcode.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Rationalizedcodabar.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Raw.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Royalmail.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Rss14.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Rssexpanded.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Rsslimited.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Symbol.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Text.html +193 -0
- data/lib/doc/classes/RGhost/Barcode/Text.src/M000002.html +30 -0
- data/lib/doc/classes/RGhost/Barcode/Upca.html +113 -0
- data/lib/doc/classes/RGhost/Barcode/Upce.html +113 -0
- data/lib/doc/classes/RGhost/Config.html +150 -0
- data/lib/doc/classes/RGhost/Config.src/M000016.html +45 -0
- data/lib/doc/classes/RGhost/Document.html +704 -0
- data/lib/doc/classes/RGhost/Document.src/M000017.html +19 -0
- data/lib/doc/classes/RGhost/Document.src/M000018.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000019.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000020.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000021.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000022.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000023.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000024.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000025.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000026.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000027.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000028.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000029.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000030.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000031.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000032.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000033.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000034.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000035.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000036.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000037.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000038.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000039.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000040.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000041.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000042.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000043.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000044.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000045.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000046.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000047.html +18 -0
- data/lib/doc/classes/RGhost/Document.src/M000048.html +18 -0
- data/lib/doc/created.rid +1 -0
- data/lib/doc/files/rghost_barcode/rghost_barcode_adapter_rb.html +101 -0
- data/lib/doc/files/rghost_barcode/rghost_barcode_base_rb.html +101 -0
- data/lib/doc/files/rghost_barcode/rghost_barcode_classes_rb.html +101 -0
- data/lib/doc/files/rghost_barcode/rghost_barcode_examples_rb.html +101 -0
- data/lib/doc/files/rghost_barcode/rghost_barcode_version_rb.html +101 -0
- data/lib/doc/files/rghost_barcode_rb.html +111 -0
- data/lib/doc/files/teste_main_rb.html +110 -0
- data/lib/doc/fr_class_index.html +67 -0
- data/lib/doc/fr_file_index.html +33 -0
- data/lib/doc/fr_method_index.html +74 -0
- data/lib/doc/index.html +24 -0
- data/lib/rghost_barcode.rb +7 -0
- data/lib/rghost_barcode/ps/auspost.ps +192 -0
- data/lib/rghost_barcode/ps/azteccode.ps +357 -0
- data/lib/rghost_barcode/ps/barcode_template.eps +1193 -0
- data/lib/rghost_barcode/ps/code11.ps +128 -0
- data/lib/rghost_barcode/ps/code128.ps +121 -0
- data/lib/rghost_barcode/ps/code2of5.ps +106 -0
- data/lib/rghost_barcode/ps/code39.ps +109 -0
- data/lib/rghost_barcode/ps/code93.ps +117 -0
- data/lib/rghost_barcode/ps/datamatrix.ps +328 -0
- data/lib/rghost_barcode/ps/ean13.ps +183 -0
- data/lib/rghost_barcode/ps/ean2.ps +101 -0
- data/lib/rghost_barcode/ps/ean5.ps +116 -0
- data/lib/rghost_barcode/ps/ean8.ps +101 -0
- data/lib/rghost_barcode/ps/interleaved2of5.ps +132 -0
- data/lib/rghost_barcode/ps/isbn.ps +118 -0
- data/lib/rghost_barcode/ps/kix.ps +98 -0
- data/lib/rghost_barcode/ps/maxicode.ps +307 -0
- data/lib/rghost_barcode/ps/msi.ps +104 -0
- data/lib/rghost_barcode/ps/onecode.ps +276 -0
- data/lib/rghost_barcode/ps/pdf417.ps +428 -0
- data/lib/rghost_barcode/ps/pharmacode.ps +69 -0
- data/lib/rghost_barcode/ps/plessey.ps +121 -0
- data/lib/rghost_barcode/ps/postnet.ps +114 -0
- data/lib/rghost_barcode/ps/qrcode.ps +530 -0
- data/lib/rghost_barcode/ps/rationalizedcodabar.ps +117 -0
- data/lib/rghost_barcode/ps/raw.ps +35 -0
- data/lib/rghost_barcode/ps/render.ps +307 -0
- data/lib/rghost_barcode/ps/render.ps~ +308 -0
- data/lib/rghost_barcode/ps/royalmail.ps +119 -0
- data/lib/rghost_barcode/ps/rss14.ps +237 -0
- data/lib/rghost_barcode/ps/rssexpanded.ps +211 -0
- data/lib/rghost_barcode/ps/rsslimited.ps +191 -0
- data/lib/rghost_barcode/ps/symbol.ps +49 -0
- data/lib/rghost_barcode/ps/upca.ps +128 -0
- data/lib/rghost_barcode/ps/upce.ps +157 -0
- data/lib/rghost_barcode/rghost_barcode_adapter.rb +249 -0
- data/lib/rghost_barcode/rghost_barcode_base.rb +210 -0
- data/lib/rghost_barcode/rghost_barcode_classes.rb +96 -0
- data/lib/rghost_barcode/rghost_barcode_examples.rb +35 -0
- data/lib/rghost_barcode/rghost_barcode_version.rb +8 -0
- data/lib/teste_main.rb +94 -0
- metadata +218 -0
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
|
|
2
|
+
% --DESC: Pharmaceutical Binary Code
|
|
3
|
+
% --EXAM: 117480
|
|
4
|
+
% --EXOP: showborder
|
|
5
|
+
% --RNDR: renlinear
|
|
6
|
+
/pharmacode {
|
|
7
|
+
|
|
8
|
+
0 begin % Confine variables to local scope
|
|
9
|
+
|
|
10
|
+
/options exch def % We are given an option string
|
|
11
|
+
/useropts options def
|
|
12
|
+
/barcode exch def % We are given a barcode string
|
|
13
|
+
|
|
14
|
+
/height 8 2.835 mul 72 div def
|
|
15
|
+
/nwidth 0.5 2.835 mul def
|
|
16
|
+
/wwidth 1.5 2.835 mul def
|
|
17
|
+
/swidth 1.0 2.835 mul def
|
|
18
|
+
|
|
19
|
+
% Parse the input options
|
|
20
|
+
options {
|
|
21
|
+
token false eq {exit} if dup length string cvs (=) search
|
|
22
|
+
true eq {cvlit exch pop exch def} {cvlit true def} ifelse
|
|
23
|
+
} loop
|
|
24
|
+
|
|
25
|
+
/height height cvr def
|
|
26
|
+
/nwidth nwidth cvr def
|
|
27
|
+
/wwidth wwidth cvr def
|
|
28
|
+
/swidth swidth cvr def
|
|
29
|
+
|
|
30
|
+
% Create the human readable text
|
|
31
|
+
/txt barcode length array def
|
|
32
|
+
0 1 barcode length 1 sub {
|
|
33
|
+
/i exch def
|
|
34
|
+
txt i [barcode i 1 getinterval 0 0 () 0] put
|
|
35
|
+
} for
|
|
36
|
+
|
|
37
|
+
% Convert the integer into the paramacode string
|
|
38
|
+
/barcode barcode cvi 1 add 2 17 string cvrs def
|
|
39
|
+
/barcode barcode 1 barcode length 1 sub getinterval def
|
|
40
|
+
|
|
41
|
+
/barlen barcode length def % Length of the code
|
|
42
|
+
/sbs barlen 2 mul array def
|
|
43
|
+
|
|
44
|
+
0 1 barlen 1 sub {
|
|
45
|
+
/i exch def
|
|
46
|
+
/enc barcode i 1 getinterval def
|
|
47
|
+
enc (0) eq {
|
|
48
|
+
sbs i 2 mul nwidth put
|
|
49
|
+
} {
|
|
50
|
+
sbs i 2 mul wwidth put
|
|
51
|
+
} ifelse
|
|
52
|
+
sbs i 2 mul 1 add swidth put
|
|
53
|
+
} for
|
|
54
|
+
|
|
55
|
+
% Return the arguments
|
|
56
|
+
/retval 8 dict def
|
|
57
|
+
retval (ren) (renlinear) put
|
|
58
|
+
retval (sbs) sbs put
|
|
59
|
+
retval (bhs) [sbs length 1 add 2 idiv {height} repeat] put
|
|
60
|
+
retval (bbs) [sbs length 1 add 2 idiv {0} repeat] put
|
|
61
|
+
retval (txt) txt put
|
|
62
|
+
retval (textxalign) (center) put
|
|
63
|
+
retval (opt) useropts put
|
|
64
|
+
retval
|
|
65
|
+
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
} bind def
|
|
69
|
+
/pharmacode load 0 1 dict put
|
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
|
|
2
|
+
% --DESC: Plessey
|
|
3
|
+
% --EXAM: 01234ABCD
|
|
4
|
+
% --EXOP: includetext includecheckintext
|
|
5
|
+
% --RNDR: renlinear
|
|
6
|
+
/plessey {
|
|
7
|
+
|
|
8
|
+
0 begin % Confine variables to local scope
|
|
9
|
+
|
|
10
|
+
/options exch def % We are given an option string
|
|
11
|
+
/useropts options def
|
|
12
|
+
/barcode exch def % We are given a barcode string
|
|
13
|
+
|
|
14
|
+
/includetext false def % Enable/disable text
|
|
15
|
+
/includecheckintext false def
|
|
16
|
+
/textfont /Courier def
|
|
17
|
+
/textsize 10 def
|
|
18
|
+
/textyoffset -7 def
|
|
19
|
+
/height 1 def
|
|
20
|
+
|
|
21
|
+
% Parse the input options
|
|
22
|
+
options {
|
|
23
|
+
token false eq {exit} if dup length string cvs (=) search
|
|
24
|
+
true eq {cvlit exch pop exch def} {cvlit true def} ifelse
|
|
25
|
+
} loop
|
|
26
|
+
|
|
27
|
+
/textfont textfont cvlit def
|
|
28
|
+
/textsize textsize cvr def
|
|
29
|
+
/textyoffset textyoffset cvr def
|
|
30
|
+
/height height cvr def
|
|
31
|
+
|
|
32
|
+
% Create an array containing the character mappings
|
|
33
|
+
/encs
|
|
34
|
+
[ (13131313) (31131313) (13311313) (31311313)
|
|
35
|
+
(13133113) (31133113) (13313113) (31313113)
|
|
36
|
+
(13131331) (31131331) (13311331) (31311331)
|
|
37
|
+
(13133131) (31133131) (13313131) (31313131)
|
|
38
|
+
(31311331) (331311313)
|
|
39
|
+
] def
|
|
40
|
+
|
|
41
|
+
% Create a string of the available characters
|
|
42
|
+
/barchars (0123456789ABCDEF) def
|
|
43
|
+
|
|
44
|
+
/barlen barcode length def % Length of the code
|
|
45
|
+
/sbs barlen 8 mul 33 add string def
|
|
46
|
+
/txt barlen 2 add array def
|
|
47
|
+
/checkbits barlen 4 mul 8 add array def
|
|
48
|
+
checkbits barlen 4 mul [ 0 0 0 0 0 0 0 0 ] putinterval
|
|
49
|
+
|
|
50
|
+
% Put start character
|
|
51
|
+
sbs 0 encs 16 get putinterval
|
|
52
|
+
|
|
53
|
+
0 1 barlen 1 sub {
|
|
54
|
+
/i exch def
|
|
55
|
+
% Lookup the encoding for the each barcode character
|
|
56
|
+
barcode i 1 getinterval barchars exch search
|
|
57
|
+
pop % Discard true leaving pre
|
|
58
|
+
length /indx exch def % indx is the length of pre
|
|
59
|
+
pop pop % Discard seek and post
|
|
60
|
+
/enc encs indx get def % Get the indxth encoding
|
|
61
|
+
sbs i 8 mul 8 add enc putinterval % Put encoded digit into sbs
|
|
62
|
+
txt i [barcode i 1 getinterval i 16 mul 16 add textyoffset textfont textsize] put
|
|
63
|
+
checkbits i 4 mul [
|
|
64
|
+
indx 1 and
|
|
65
|
+
indx -1 bitshift 1 and
|
|
66
|
+
indx -2 bitshift 1 and
|
|
67
|
+
indx -3 bitshift
|
|
68
|
+
] putinterval
|
|
69
|
+
} for
|
|
70
|
+
|
|
71
|
+
% Checksum is last 8 bits of a CRC using a salt
|
|
72
|
+
/checksalt [ 1 1 1 1 0 1 0 0 1 ] def
|
|
73
|
+
0 1 barlen 4 mul 1 sub {
|
|
74
|
+
/i exch def
|
|
75
|
+
checkbits i get 1 eq {
|
|
76
|
+
0 1 8 {
|
|
77
|
+
/j exch def
|
|
78
|
+
checkbits i j add checkbits i j add get checksalt j get xor put
|
|
79
|
+
} for
|
|
80
|
+
} if
|
|
81
|
+
} for
|
|
82
|
+
|
|
83
|
+
% Calculate the value of the checksum digits
|
|
84
|
+
/checkval 0 def
|
|
85
|
+
0 1 7 {
|
|
86
|
+
/i exch def
|
|
87
|
+
/checkval checkval 2 7 i sub exp cvi checkbits barlen 4 mul i add get mul add def
|
|
88
|
+
} for
|
|
89
|
+
|
|
90
|
+
% Put the checksum characters
|
|
91
|
+
/checksum1 checkval -4 bitshift def
|
|
92
|
+
/checksum2 checkval 15 and def
|
|
93
|
+
sbs barlen 8 mul 8 add encs checksum1 get putinterval
|
|
94
|
+
sbs barlen 8 mul 16 add encs checksum2 get putinterval
|
|
95
|
+
includecheckintext {
|
|
96
|
+
txt barlen [barchars checksum1 1 getinterval barlen 16 mul 16 add textyoffset textfont textsize] put
|
|
97
|
+
txt barlen 1 add [barchars checksum2 1 getinterval barlen 1 add 16 mul 16 add textyoffset textfont textsize] put
|
|
98
|
+
} {
|
|
99
|
+
txt barlen [( ) barlen 16 mul 16 add textyoffset textfont textsize] put
|
|
100
|
+
txt barlen 1 add [( ) barlen 1 add 16 mul 16 add textyoffset textfont textsize] put
|
|
101
|
+
} ifelse
|
|
102
|
+
|
|
103
|
+
% Put end character
|
|
104
|
+
sbs barlen 8 mul 24 add encs 17 get putinterval
|
|
105
|
+
|
|
106
|
+
% Return the arguments
|
|
107
|
+
/retval 8 dict def
|
|
108
|
+
retval (ren) (renlinear) put
|
|
109
|
+
retval (sbs) [sbs {48 sub} forall] put
|
|
110
|
+
retval (bhs) [sbs length 1 add 2 idiv {height} repeat] put
|
|
111
|
+
retval (bbs) [sbs length 1 add 2 idiv {0} repeat] put
|
|
112
|
+
includetext {
|
|
113
|
+
retval (txt) txt put
|
|
114
|
+
} if
|
|
115
|
+
retval (opt) useropts put
|
|
116
|
+
retval
|
|
117
|
+
|
|
118
|
+
end
|
|
119
|
+
|
|
120
|
+
} bind def
|
|
121
|
+
/plessey load 0 1 dict put
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
|
|
2
|
+
% --DESC: United States Postal Service Postnet
|
|
3
|
+
% --EXAM: 012345
|
|
4
|
+
% --EXOP: includetext includecheckintext
|
|
5
|
+
% --RNDR: renlinear
|
|
6
|
+
/postnet {
|
|
7
|
+
|
|
8
|
+
0 begin
|
|
9
|
+
|
|
10
|
+
/options exch def % We are given an option string
|
|
11
|
+
/useropts options def
|
|
12
|
+
/barcode exch def % We are given a barcode string
|
|
13
|
+
|
|
14
|
+
/includetext false def % Enable/disable text
|
|
15
|
+
/includecheckintext false def
|
|
16
|
+
/textfont /Courier def
|
|
17
|
+
/textsize 10 def
|
|
18
|
+
/textyoffset -7 def
|
|
19
|
+
/height 0.125 def
|
|
20
|
+
|
|
21
|
+
% Parse the input options
|
|
22
|
+
options {
|
|
23
|
+
token false eq {exit} if dup length string cvs (=) search
|
|
24
|
+
true eq {cvlit exch pop exch def} {cvlit true def} ifelse
|
|
25
|
+
} loop
|
|
26
|
+
|
|
27
|
+
/textfont textfont cvlit def
|
|
28
|
+
/textsize textsize cvr def
|
|
29
|
+
/textyoffset textyoffset cvr def
|
|
30
|
+
/height height cvr def
|
|
31
|
+
|
|
32
|
+
/barlen barcode length def
|
|
33
|
+
|
|
34
|
+
% Create an array containing the character mappings
|
|
35
|
+
/encs
|
|
36
|
+
[ (55222) (22255) (22525) (22552) (25225)
|
|
37
|
+
(25252) (25522) (52225) (52252) (52522)
|
|
38
|
+
(5) (5)
|
|
39
|
+
] def
|
|
40
|
+
|
|
41
|
+
% Create a string of the available characters
|
|
42
|
+
/barchars (0123456789) def
|
|
43
|
+
|
|
44
|
+
/bhs barlen 5 mul 7 add array def
|
|
45
|
+
/txt barlen 1 add array def
|
|
46
|
+
|
|
47
|
+
% Put start character
|
|
48
|
+
/enc encs 10 get def
|
|
49
|
+
/heights enc length array def
|
|
50
|
+
0 1 enc length 1 sub {
|
|
51
|
+
/j exch def
|
|
52
|
+
heights j enc j 1 getinterval cvi height mul 5 div put
|
|
53
|
+
} for
|
|
54
|
+
bhs 0 heights putinterval % Put encoded digit into sbs
|
|
55
|
+
|
|
56
|
+
/checksum 0 def
|
|
57
|
+
0 1 barlen 1 sub {
|
|
58
|
+
/i exch def
|
|
59
|
+
% Lookup the encoding for the each barcode character
|
|
60
|
+
barcode i 1 getinterval barchars exch search
|
|
61
|
+
pop % Discard true leaving pre
|
|
62
|
+
length /indx exch def % indx is the length of pre
|
|
63
|
+
pop pop % Discard seek and post
|
|
64
|
+
/enc encs indx get def % Get the indxth encoding
|
|
65
|
+
/heights enc length array def
|
|
66
|
+
0 1 enc length 1 sub {
|
|
67
|
+
/j exch def
|
|
68
|
+
heights j enc j 1 getinterval cvi height mul 5 div put
|
|
69
|
+
} for
|
|
70
|
+
bhs i 5 mul 1 add heights putinterval % Put encoded digit into sbs
|
|
71
|
+
txt i [barcode i 1 getinterval i 5 mul 1 add 3.312 mul textyoffset textfont textsize] put
|
|
72
|
+
/checksum checksum indx add def % checksum+=indx
|
|
73
|
+
} for
|
|
74
|
+
|
|
75
|
+
% Put the checksum character
|
|
76
|
+
/checksum 10 checksum 10 mod sub 10 mod def
|
|
77
|
+
/enc encs checksum get def
|
|
78
|
+
/heights enc length array def
|
|
79
|
+
0 1 enc length 1 sub {
|
|
80
|
+
/j exch def
|
|
81
|
+
heights j enc j 1 getinterval cvi height mul 5 div put
|
|
82
|
+
} for
|
|
83
|
+
bhs barlen 5 mul 1 add heights putinterval
|
|
84
|
+
|
|
85
|
+
includecheckintext {
|
|
86
|
+
txt barlen [barchars checksum 1 getinterval barlen 5 mul 1 add 3.312 mul textyoffset textfont textsize] put
|
|
87
|
+
} {
|
|
88
|
+
txt barlen [( ) barlen 5 mul 1 add 72 mul 25 div textyoffset textfont textsize] put
|
|
89
|
+
} ifelse
|
|
90
|
+
|
|
91
|
+
% Put end character
|
|
92
|
+
/enc encs 11 get def
|
|
93
|
+
/heights enc length array def
|
|
94
|
+
0 1 enc length 1 sub {
|
|
95
|
+
/j exch def
|
|
96
|
+
heights j enc j 1 getinterval cvi height mul 5 div put
|
|
97
|
+
} for
|
|
98
|
+
bhs barlen 5 mul 6 add heights putinterval
|
|
99
|
+
|
|
100
|
+
/retval 8 dict def
|
|
101
|
+
retval (ren) (renlinear) put
|
|
102
|
+
retval (bhs) bhs put
|
|
103
|
+
retval (bbs) [bhs length {0} repeat] put
|
|
104
|
+
retval (sbs) [bhs length 1 sub {1.44 1.872} repeat 1.44] put
|
|
105
|
+
includetext {
|
|
106
|
+
retval (txt) txt put
|
|
107
|
+
} if
|
|
108
|
+
retval (opt) useropts put
|
|
109
|
+
retval
|
|
110
|
+
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
} bind def
|
|
114
|
+
/postnet load 0 1 dict put
|
|
@@ -0,0 +1,530 @@
|
|
|
1
|
+
|
|
2
|
+
% --DESC: QR Code
|
|
3
|
+
% --EXAM: 000100000010000000001100010101100110000110000
|
|
4
|
+
% --EXOP: version=1 eclevel=M
|
|
5
|
+
% --RNDR: renmatrix
|
|
6
|
+
/qrcode {
|
|
7
|
+
|
|
8
|
+
0 begin
|
|
9
|
+
|
|
10
|
+
/options exch def
|
|
11
|
+
/useropts options def
|
|
12
|
+
/barcode exch def
|
|
13
|
+
|
|
14
|
+
/format (full) def % full or micro
|
|
15
|
+
/version (unset) def
|
|
16
|
+
/eclevel (L) def % L, M, Q or H
|
|
17
|
+
|
|
18
|
+
% Parse the input options
|
|
19
|
+
options {
|
|
20
|
+
token false eq {exit} if dup length string cvs (=) search
|
|
21
|
+
true eq {cvlit exch pop exch def} {cvlit true def} ifelse
|
|
22
|
+
} loop
|
|
23
|
+
|
|
24
|
+
% Convert from input into message bitstream
|
|
25
|
+
/msgbits barcode def
|
|
26
|
+
|
|
27
|
+
% Lookup the most appropriate symbol specification
|
|
28
|
+
/metrics [
|
|
29
|
+
% format vers size align modules error codewords error correction blocks
|
|
30
|
+
% L M Q H L1 L2 M1 M2 Q1 Q2 H1 H2
|
|
31
|
+
[ (micro) (M1) 11 98 99 36 [ 2 99 99 99 ] [ 1 0 99 99 99 99 99 99 ] ]
|
|
32
|
+
[ (micro) (M2) 13 98 99 80 [ 5 6 99 99 ] [ 1 0 1 0 99 99 99 99 ] ]
|
|
33
|
+
[ (micro) (M3) 15 98 99 132 [ 6 8 99 99 ] [ 1 0 1 0 99 99 99 99 ] ]
|
|
34
|
+
[ (micro) (M4) 17 98 99 192 [ 8 10 14 99 ] [ 1 0 1 0 1 0 99 99 ] ]
|
|
35
|
+
[ (full) (1) 21 98 99 208 [ 7 10 13 17 ] [ 1 0 1 0 1 0 1 0 ] ]
|
|
36
|
+
[ (full) (2) 25 18 99 359 [ 10 16 22 28 ] [ 1 0 1 0 1 0 1 0 ] ]
|
|
37
|
+
[ (full) (3) 29 22 99 567 [ 15 26 36 44 ] [ 1 0 1 0 2 0 2 0 ] ]
|
|
38
|
+
[ (full) (4) 33 26 99 807 [ 20 36 52 64 ] [ 1 0 2 0 2 0 4 0 ] ]
|
|
39
|
+
[ (full) (5) 37 30 99 1079 [ 26 48 72 88 ] [ 1 0 2 0 2 2 2 2 ] ]
|
|
40
|
+
[ (full) (6) 41 34 99 1383 [ 36 64 96 112 ] [ 2 0 4 0 4 0 4 0 ] ]
|
|
41
|
+
[ (full) (7) 45 22 38 1568 [ 40 72 108 130 ] [ 2 0 4 0 2 4 4 1 ] ]
|
|
42
|
+
[ (full) (8) 49 24 42 1936 [ 48 88 132 156 ] [ 2 0 2 2 4 2 4 2 ] ]
|
|
43
|
+
[ (full) (9) 53 26 46 2336 [ 60 110 160 192 ] [ 2 0 3 2 4 4 4 4 ] ]
|
|
44
|
+
[ (full) (10) 57 28 50 2768 [ 72 130 192 224 ] [ 2 2 4 1 6 2 6 2 ] ]
|
|
45
|
+
[ (full) (11) 61 30 54 3232 [ 80 150 224 264 ] [ 4 0 1 4 4 4 3 8 ] ]
|
|
46
|
+
[ (full) (12) 65 32 58 3728 [ 96 176 260 308 ] [ 2 2 6 2 4 6 7 4 ] ]
|
|
47
|
+
[ (full) (13) 69 34 62 4256 [ 104 198 288 352 ] [ 4 0 8 1 8 4 12 4 ] ]
|
|
48
|
+
[ (full) (14) 73 26 46 4651 [ 120 216 320 384 ] [ 3 1 4 5 11 5 11 5 ] ]
|
|
49
|
+
[ (full) (15) 77 26 48 5243 [ 132 240 360 432 ] [ 5 1 5 5 5 7 11 7 ] ]
|
|
50
|
+
[ (full) (16) 81 26 50 5867 [ 144 280 408 480 ] [ 5 1 7 3 15 2 3 13 ] ]
|
|
51
|
+
[ (full) (17) 85 30 54 6523 [ 168 308 448 532 ] [ 1 5 10 1 1 15 2 17 ] ]
|
|
52
|
+
[ (full) (18) 89 30 56 7211 [ 180 338 504 588 ] [ 5 1 9 4 17 1 2 19 ] ]
|
|
53
|
+
[ (full) (19) 93 30 58 7931 [ 196 364 546 650 ] [ 3 4 3 11 17 4 9 16 ] ]
|
|
54
|
+
[ (full) (20) 97 34 62 8683 [ 224 416 600 700 ] [ 3 5 3 13 15 5 15 10 ] ]
|
|
55
|
+
[ (full) (21) 101 28 50 9252 [ 224 442 644 750 ] [ 4 4 17 0 17 6 19 6 ] ]
|
|
56
|
+
[ (full) (22) 105 26 50 10068 [ 252 476 690 816 ] [ 2 7 17 0 7 16 34 0 ] ]
|
|
57
|
+
[ (full) (23) 109 30 54 10916 [ 270 504 750 900 ] [ 4 5 4 14 11 14 16 14 ] ]
|
|
58
|
+
[ (full) (24) 113 28 54 11796 [ 300 560 810 960 ] [ 6 4 6 14 11 16 30 2 ] ]
|
|
59
|
+
[ (full) (25) 117 32 58 12708 [ 312 588 870 1050 ] [ 8 4 8 13 7 22 22 13 ] ]
|
|
60
|
+
[ (full) (26) 121 30 58 13652 [ 336 644 952 1110 ] [ 10 2 19 4 28 6 33 4 ] ]
|
|
61
|
+
[ (full) (27) 125 34 62 14628 [ 360 700 1020 1200 ] [ 8 4 22 3 8 26 12 28 ] ]
|
|
62
|
+
[ (full) (28) 129 26 50 15371 [ 390 728 1050 1260 ] [ 3 10 3 23 4 31 11 31 ] ]
|
|
63
|
+
[ (full) (29) 133 30 54 16411 [ 420 784 1140 1350 ] [ 7 7 21 7 1 37 19 26 ] ]
|
|
64
|
+
[ (full) (30) 137 26 52 17483 [ 450 812 1200 1440 ] [ 5 10 19 10 15 25 23 25 ] ]
|
|
65
|
+
[ (full) (31) 141 30 56 18587 [ 480 868 1290 1530 ] [ 13 3 2 29 42 1 23 28 ] ]
|
|
66
|
+
[ (full) (32) 145 34 60 19723 [ 510 924 1350 1620 ] [ 17 0 10 23 10 35 19 35 ] ]
|
|
67
|
+
[ (full) (33) 149 30 58 20891 [ 540 980 1440 1710 ] [ 17 1 14 21 29 19 11 46 ] ]
|
|
68
|
+
[ (full) (34) 153 34 62 22091 [ 570 1036 1530 1800 ] [ 13 6 14 23 44 7 59 1 ] ]
|
|
69
|
+
[ (full) (35) 157 30 54 23008 [ 570 1064 1590 1890 ] [ 12 7 12 26 39 14 22 41 ] ]
|
|
70
|
+
[ (full) (36) 161 24 50 24272 [ 600 1120 1680 1980 ] [ 6 14 6 34 46 10 2 64 ] ]
|
|
71
|
+
[ (full) (37) 165 28 54 25568 [ 630 1204 1770 2100 ] [ 17 4 29 14 49 10 24 46 ] ]
|
|
72
|
+
[ (full) (38) 169 32 58 26896 [ 660 1260 1860 2220 ] [ 4 18 13 32 48 14 42 32 ] ]
|
|
73
|
+
[ (full) (39) 173 26 54 28256 [ 720 1316 1950 2310 ] [ 20 4 40 7 43 22 10 67 ] ]
|
|
74
|
+
[ (full) (40) 177 30 58 29648 [ 750 1372 2040 2430 ] [ 19 6 18 31 34 34 20 61 ] ]
|
|
75
|
+
] def
|
|
76
|
+
|
|
77
|
+
/eclval (LMQH) eclevel search pop length exch pop exch pop def
|
|
78
|
+
/i 0 def
|
|
79
|
+
{ % loop
|
|
80
|
+
/m metrics i get def
|
|
81
|
+
/frmt m 0 get def % Format of the symbol
|
|
82
|
+
/vers m 1 get def % Version of symbol
|
|
83
|
+
/size m 2 get def % Length of side
|
|
84
|
+
/asp2 m 3 get def % Position of second alignment symbol
|
|
85
|
+
/asp3 m 4 get def % Position of third alignment symbol
|
|
86
|
+
/nmod m 5 get def % Number of modules
|
|
87
|
+
/ncws nmod 8 idiv def % Total number of codewords
|
|
88
|
+
/rbit nmod 8 mod def % Number of remainder bits
|
|
89
|
+
/lc4b false def % Last data codeword is 4 bits long
|
|
90
|
+
size 11 eq size 15 eq or { % Adjustments for M1 and M3 symbols
|
|
91
|
+
/ncws ncws 1 add def
|
|
92
|
+
/rbit 0 def
|
|
93
|
+
/lc4b true def
|
|
94
|
+
} if
|
|
95
|
+
/ecws m 6 get eclval get def % Number of error correction codewords
|
|
96
|
+
/dcws ncws ecws sub def % Number of data codewords
|
|
97
|
+
/dmod dcws 8 mul lc4b {4} {0} ifelse sub def % Number of data modules
|
|
98
|
+
/ecb1 m 7 get eclval 2 mul get def % First error correction blocks
|
|
99
|
+
/ecb2 m 7 get eclval 2 mul 1 add get def % Second error correction blocks
|
|
100
|
+
/dcpb dcws ecb1 ecb2 add idiv def % Base data codewords per block
|
|
101
|
+
/ecpb ncws ecb1 ecb2 add idiv dcpb sub def % Error correction codewords per block
|
|
102
|
+
/okay true def
|
|
103
|
+
version (unset) ne version vers ne and {/okay false def} if
|
|
104
|
+
version (unset) eq format frmt ne and {/okay false def} if
|
|
105
|
+
msgbits length dmod gt {/okay false def} if
|
|
106
|
+
okay {exit} if
|
|
107
|
+
/i i 1 add def
|
|
108
|
+
} loop
|
|
109
|
+
/format frmt def
|
|
110
|
+
/version vers def
|
|
111
|
+
|
|
112
|
+
% Expand the message bits by adding padding as necessary
|
|
113
|
+
/pad dmod string def
|
|
114
|
+
0 4 dmod 1 sub {pad exch (0000) putinterval} for
|
|
115
|
+
pad 0 msgbits putinterval
|
|
116
|
+
/padstrs [ (11101100) (00010001) ] def
|
|
117
|
+
/padnum 0 def
|
|
118
|
+
msgbits length 8 div ceiling 8 mul cvi 8 dmod lc4b {5} {1} ifelse sub {
|
|
119
|
+
pad exch padstrs padnum get putinterval
|
|
120
|
+
/padnum padnum 1 add 2 mod def
|
|
121
|
+
} for
|
|
122
|
+
|
|
123
|
+
% Evaluate the padded message into codewords
|
|
124
|
+
/cws dcws array def
|
|
125
|
+
0 1 cws length 1 sub {
|
|
126
|
+
/c exch def
|
|
127
|
+
/bpcw 8 def
|
|
128
|
+
lc4b c cws length 1 sub eq and {/bpcw 4 def} if
|
|
129
|
+
/cwb pad c 8 mul bpcw getinterval def
|
|
130
|
+
/cw 0 def
|
|
131
|
+
0 1 bpcw 1 sub {
|
|
132
|
+
/i exch def
|
|
133
|
+
/cw cw 2 bpcw i sub 1 sub exp cvi cwb i get 48 sub mul add def
|
|
134
|
+
} for
|
|
135
|
+
cws c cw put
|
|
136
|
+
} for
|
|
137
|
+
|
|
138
|
+
% Calculate the log and anti-log tables
|
|
139
|
+
/rslog [ -255 255 {0} repeat ] def
|
|
140
|
+
/rsalog [ 1 255 {0} repeat ] def
|
|
141
|
+
1 1 255 {
|
|
142
|
+
/i exch def
|
|
143
|
+
rsalog i rsalog i 1 sub get 2 mul put
|
|
144
|
+
rsalog i get 256 ge { rsalog i rsalog i get 285 xor put } if
|
|
145
|
+
rslog rsalog i get i put
|
|
146
|
+
} for
|
|
147
|
+
|
|
148
|
+
% Function to calculate the product in the field
|
|
149
|
+
/rsprod {
|
|
150
|
+
/y exch def
|
|
151
|
+
/x exch def
|
|
152
|
+
x y mul 0 ne {
|
|
153
|
+
rsalog rslog x get rslog y get add 255 mod get
|
|
154
|
+
} {
|
|
155
|
+
0
|
|
156
|
+
} ifelse
|
|
157
|
+
} bind def
|
|
158
|
+
|
|
159
|
+
% Generate the coefficients for the Reed-Solomon algorithm
|
|
160
|
+
/coeffs [ 1 ecpb {0} repeat ] def
|
|
161
|
+
0 1 ecpb 1 sub {
|
|
162
|
+
/i exch def
|
|
163
|
+
coeffs i 1 add coeffs i get put
|
|
164
|
+
i -1 1 {
|
|
165
|
+
/j exch def
|
|
166
|
+
coeffs j coeffs j 1 sub get coeffs j get rsalog i get rsprod xor put
|
|
167
|
+
} for
|
|
168
|
+
coeffs 0 coeffs 0 get rsalog i get rsprod put
|
|
169
|
+
} for
|
|
170
|
+
/coeffs coeffs 0 coeffs length 1 sub getinterval def
|
|
171
|
+
|
|
172
|
+
% Reed-Solomon algorithm to derive the error correction codewords
|
|
173
|
+
/rscodes {
|
|
174
|
+
/rscws exch def
|
|
175
|
+
/rsnd rscws length def
|
|
176
|
+
/rscws [ rscws {} forall ecpb {0} repeat ] def
|
|
177
|
+
0 1 rsnd 1 sub {
|
|
178
|
+
/m exch def
|
|
179
|
+
/k rscws m get def
|
|
180
|
+
0 1 ecpb 1 sub {
|
|
181
|
+
/j exch def
|
|
182
|
+
rscws m j add 1 add coeffs ecpb j sub 1 sub get k rsprod rscws m j add 1 add get xor put
|
|
183
|
+
} for
|
|
184
|
+
} for
|
|
185
|
+
rscws rsnd ecpb getinterval
|
|
186
|
+
} bind def
|
|
187
|
+
|
|
188
|
+
% Divide codewords into two groups of blocks and calculate the error correction codewords
|
|
189
|
+
/dcwsb ecb1 ecb2 add array def
|
|
190
|
+
/ecwsb ecb1 ecb2 add array def
|
|
191
|
+
0 1 ecb1 1 sub { % First group of blocks has smaller number of data codewords
|
|
192
|
+
/i exch def
|
|
193
|
+
dcwsb i cws i dcpb mul dcpb getinterval put
|
|
194
|
+
ecwsb i dcwsb i get rscodes put
|
|
195
|
+
} for
|
|
196
|
+
0 1 ecb2 1 sub { % Second group of blocks has larger number of data codewords
|
|
197
|
+
/i exch def
|
|
198
|
+
dcwsb ecb1 i add cws ecb1 dcpb mul i dcpb 1 add mul add dcpb 1 add getinterval put
|
|
199
|
+
ecwsb ecb1 i add dcwsb ecb1 i add get rscodes put
|
|
200
|
+
} for
|
|
201
|
+
|
|
202
|
+
% Reassemble the codewords
|
|
203
|
+
/cws ncws array def
|
|
204
|
+
/cw 0 def
|
|
205
|
+
0 1 dcpb { % Interleave the data codeword blocks
|
|
206
|
+
/i exch def
|
|
207
|
+
0 1 ecb1 ecb2 add 1 sub {
|
|
208
|
+
/j exch def
|
|
209
|
+
i dcwsb j get length lt { % Ignore the end of short blocks
|
|
210
|
+
cws cw dcwsb j get i get put
|
|
211
|
+
/cw cw 1 add def
|
|
212
|
+
} if
|
|
213
|
+
} for
|
|
214
|
+
} for
|
|
215
|
+
0 1 ecpb 1 sub { % Interleave the error codeword blocks
|
|
216
|
+
/i exch def
|
|
217
|
+
0 1 ecb1 ecb2 add 1 sub {
|
|
218
|
+
/j exch def
|
|
219
|
+
cws cw ecwsb j get i get put
|
|
220
|
+
/cw cw 1 add def
|
|
221
|
+
} for
|
|
222
|
+
} for
|
|
223
|
+
|
|
224
|
+
% Extend codewords by one if there are remainder bits
|
|
225
|
+
rbit 0 gt {
|
|
226
|
+
/pad cws length 1 add array def
|
|
227
|
+
pad 0 cws putinterval
|
|
228
|
+
pad pad length 1 sub 0 put
|
|
229
|
+
/cws pad def
|
|
230
|
+
} if
|
|
231
|
+
|
|
232
|
+
% Fixups for the short final data byte in M1 and M3 symbols
|
|
233
|
+
lc4b {
|
|
234
|
+
dcws 1 sub 1 ncws 2 sub {
|
|
235
|
+
/i exch def
|
|
236
|
+
cws i cws i get 15 and 4 bitshift put
|
|
237
|
+
cws i cws i 1 add get -4 bitshift 15 and cws i get or put
|
|
238
|
+
} for
|
|
239
|
+
cws ncws 1 sub cws ncws 1 sub get 15 and 4 bitshift put
|
|
240
|
+
} if
|
|
241
|
+
|
|
242
|
+
% Create the bitmap
|
|
243
|
+
/pixs [ size size mul {-1} repeat ] def
|
|
244
|
+
/qmv {size mul add} bind def
|
|
245
|
+
|
|
246
|
+
% Finder patterns
|
|
247
|
+
/fpat [
|
|
248
|
+
[ 1 1 1 1 1 1 1 0 ]
|
|
249
|
+
[ 1 0 0 0 0 0 1 0 ]
|
|
250
|
+
[ 1 0 1 1 1 0 1 0 ]
|
|
251
|
+
[ 1 0 1 1 1 0 1 0 ]
|
|
252
|
+
[ 1 0 1 1 1 0 1 0 ]
|
|
253
|
+
[ 1 0 0 0 0 0 1 0 ]
|
|
254
|
+
[ 1 1 1 1 1 1 1 0 ]
|
|
255
|
+
[ 0 0 0 0 0 0 0 0 ]
|
|
256
|
+
] def
|
|
257
|
+
0 1 fpat length 1 sub {
|
|
258
|
+
/y exch def
|
|
259
|
+
0 1 fpat 0 get length 1 sub {
|
|
260
|
+
/x exch def
|
|
261
|
+
/fpb fpat y get x get def
|
|
262
|
+
pixs x y qmv fpb put
|
|
263
|
+
format (full) eq {
|
|
264
|
+
pixs size x sub 1 sub y qmv fpb put
|
|
265
|
+
pixs x size y sub 1 sub qmv fpb put
|
|
266
|
+
} if
|
|
267
|
+
} for
|
|
268
|
+
} for
|
|
269
|
+
|
|
270
|
+
% Alignment patterns
|
|
271
|
+
/algnpat [
|
|
272
|
+
[ 1 1 1 1 1 ]
|
|
273
|
+
[ 1 0 0 0 1 ]
|
|
274
|
+
[ 1 0 1 0 1 ]
|
|
275
|
+
[ 1 0 0 0 1 ]
|
|
276
|
+
[ 1 1 1 1 1 ]
|
|
277
|
+
] def
|
|
278
|
+
/putalgnpat {
|
|
279
|
+
/py exch def
|
|
280
|
+
/px exch def
|
|
281
|
+
0 1 4 {
|
|
282
|
+
/pb exch def
|
|
283
|
+
0 1 4 {
|
|
284
|
+
/pa exch def
|
|
285
|
+
pixs px pa add py pb add qmv algnpat pb get pa get put
|
|
286
|
+
} for
|
|
287
|
+
} for
|
|
288
|
+
} bind def
|
|
289
|
+
asp2 2 sub asp3 asp2 sub size 13 sub {
|
|
290
|
+
/i exch def
|
|
291
|
+
i 4 putalgnpat
|
|
292
|
+
4 i putalgnpat
|
|
293
|
+
} for
|
|
294
|
+
asp2 2 sub asp3 asp2 sub size 9 sub {
|
|
295
|
+
/x exch def
|
|
296
|
+
asp2 2 sub asp3 asp2 sub size 9 sub {
|
|
297
|
+
/y exch def
|
|
298
|
+
x y putalgnpat
|
|
299
|
+
} for
|
|
300
|
+
} for
|
|
301
|
+
|
|
302
|
+
% Timing patterns
|
|
303
|
+
format (full) eq {
|
|
304
|
+
8 1 size 9 sub {
|
|
305
|
+
/i exch def
|
|
306
|
+
pixs i 6 qmv i 1 add 2 mod put
|
|
307
|
+
pixs 6 i qmv i 1 add 2 mod put
|
|
308
|
+
} for
|
|
309
|
+
} {
|
|
310
|
+
8 1 size 1 sub {
|
|
311
|
+
/i exch def
|
|
312
|
+
pixs i 0 qmv i 1 add 2 mod put
|
|
313
|
+
pixs 0 i qmv i 1 add 2 mod put
|
|
314
|
+
} for
|
|
315
|
+
} ifelse
|
|
316
|
+
|
|
317
|
+
% Format information modules
|
|
318
|
+
format (full) eq {
|
|
319
|
+
/formatmap [
|
|
320
|
+
[ [ 0 8 ] [ 8 size 1 sub ] ] [ [ 1 8 ] [ 8 size 2 sub ] ] [ [ 2 8 ] [ 8 size 3 sub ] ]
|
|
321
|
+
[ [ 3 8 ] [ 8 size 4 sub ] ] [ [ 4 8 ] [ 8 size 5 sub ] ] [ [ 5 8 ] [ 8 size 6 sub ] ]
|
|
322
|
+
[ [ 7 8 ] [ 8 size 7 sub ] ] [ [ 8 8 ] [ size 8 sub 8 ] ] [ [ 8 7 ] [ size 7 sub 8 ] ]
|
|
323
|
+
[ [ 8 5 ] [ size 6 sub 8 ] ] [ [ 8 4 ] [ size 5 sub 8 ] ] [ [ 8 3 ] [ size 4 sub 8 ] ]
|
|
324
|
+
[ [ 8 2 ] [ size 3 sub 8 ] ] [ [ 8 1 ] [ size 2 sub 8 ] ] [ [ 8 0 ] [ size 1 sub 8 ] ]
|
|
325
|
+
] def
|
|
326
|
+
} {
|
|
327
|
+
/formatmap [
|
|
328
|
+
[ [ 1 8 ] ] [ [ 2 8 ] ] [ [ 3 8 ] ] [ [ 4 8 ] ] [ [ 5 8 ] ]
|
|
329
|
+
[ [ 6 8 ] ] [ [ 7 8 ] ] [ [ 8 8 ] ] [ [ 8 7 ] ] [ [ 8 6 ] ]
|
|
330
|
+
[ [ 8 5 ] ] [ [ 8 4 ] ] [ [ 8 3 ] ] [ [ 8 2 ] ] [ [ 8 1 ] ]
|
|
331
|
+
] def
|
|
332
|
+
} ifelse
|
|
333
|
+
formatmap {
|
|
334
|
+
{ {} forall qmv pixs exch 0 put } forall
|
|
335
|
+
} forall
|
|
336
|
+
|
|
337
|
+
% Version information modules
|
|
338
|
+
size 45 ge {
|
|
339
|
+
/versionmap [
|
|
340
|
+
[ [ size 9 sub 5 ] [ 5 size 9 sub ] ] [ [ size 10 sub 5 ] [ 5 size 10 sub ] ]
|
|
341
|
+
[ [ size 11 sub 5 ] [ 5 size 11 sub ] ] [ [ size 9 sub 4 ] [ 4 size 9 sub ] ]
|
|
342
|
+
[ [ size 10 sub 4 ] [ 4 size 10 sub ] ] [ [ size 11 sub 4 ] [ 4 size 11 sub ] ]
|
|
343
|
+
[ [ size 9 sub 3 ] [ 3 size 9 sub ] ] [ [ size 10 sub 3 ] [ 3 size 10 sub ] ]
|
|
344
|
+
[ [ size 11 sub 3 ] [ 3 size 11 sub ] ] [ [ size 9 sub 2 ] [ 2 size 9 sub ] ]
|
|
345
|
+
[ [ size 10 sub 2 ] [ 2 size 10 sub ] ] [ [ size 11 sub 2 ] [ 2 size 11 sub ] ]
|
|
346
|
+
[ [ size 9 sub 1 ] [ 1 size 9 sub ] ] [ [ size 10 sub 1 ] [ 1 size 10 sub ] ]
|
|
347
|
+
[ [ size 11 sub 1 ] [ 1 size 11 sub ] ] [ [ size 9 sub 0 ] [ 0 size 9 sub ] ]
|
|
348
|
+
[ [ size 10 sub 0 ] [ 0 size 10 sub ] ] [ [ size 11 sub 0 ] [ 0 size 11 sub ] ]
|
|
349
|
+
] def
|
|
350
|
+
} {
|
|
351
|
+
/versionmap [] def
|
|
352
|
+
} ifelse
|
|
353
|
+
versionmap {
|
|
354
|
+
{ {} forall qmv pixs exch 0 put } forall
|
|
355
|
+
} forall
|
|
356
|
+
|
|
357
|
+
% Solitary dark module in full symbols
|
|
358
|
+
format (full) eq {
|
|
359
|
+
pixs 8 size 8 sub qmv 1 put
|
|
360
|
+
} if
|
|
361
|
+
|
|
362
|
+
% Calculate the mask patterns
|
|
363
|
+
format (full) eq {
|
|
364
|
+
/maskfuncs [
|
|
365
|
+
{add 2 mod} bind
|
|
366
|
+
{exch pop 2 mod} bind
|
|
367
|
+
{pop 3 mod} bind
|
|
368
|
+
{add 3 mod} bind
|
|
369
|
+
{2 idiv exch 3 idiv add 2 mod} bind
|
|
370
|
+
{mul dup 2 mod exch 3 mod add} bind
|
|
371
|
+
{mul dup 2 mod exch 3 mod add 2 mod} bind
|
|
372
|
+
{2 copy mul 3 mod 3 1 roll add 2 mod add 2 mod} bind
|
|
373
|
+
] def
|
|
374
|
+
} {
|
|
375
|
+
/maskfuncs [
|
|
376
|
+
{exch pop 2 mod} bind
|
|
377
|
+
{2 idiv exch 3 idiv add 2 mod} bind
|
|
378
|
+
{mul dup 2 mod exch 3 mod add 2 mod} bind
|
|
379
|
+
{2 copy mul 3 mod 3 1 roll add 2 mod add 2 mod} bind
|
|
380
|
+
] def
|
|
381
|
+
} ifelse
|
|
382
|
+
/masks maskfuncs length array def
|
|
383
|
+
0 1 masks length 1 sub {
|
|
384
|
+
/m exch def
|
|
385
|
+
/mask size size mul array def
|
|
386
|
+
0 1 size 1 sub {
|
|
387
|
+
/j exch def
|
|
388
|
+
0 1 size 1 sub {
|
|
389
|
+
/i exch def
|
|
390
|
+
i j maskfuncs m get exec 0 eq
|
|
391
|
+
pixs i j qmv get -1 eq and {1} {0} ifelse
|
|
392
|
+
mask i j qmv 3 -1 roll put
|
|
393
|
+
} for
|
|
394
|
+
} for
|
|
395
|
+
masks m mask put
|
|
396
|
+
} for
|
|
397
|
+
|
|
398
|
+
% Walk the symbol placing the bitstream
|
|
399
|
+
/posx size 1 sub def
|
|
400
|
+
/posy size 1 sub def
|
|
401
|
+
/dir -1 def % -1 is upwards, 1 is downwards
|
|
402
|
+
/col 1 def % 0 is left bit, 1 is right bit
|
|
403
|
+
/num 0 def
|
|
404
|
+
{ % loop
|
|
405
|
+
posx 0 lt {exit} if
|
|
406
|
+
pixs posx posy qmv get -1 eq {
|
|
407
|
+
cws num 8 idiv get 7 num 8 mod sub neg bitshift 1 and
|
|
408
|
+
pixs posx posy qmv 3 -1 roll put
|
|
409
|
+
/num num 1 add def
|
|
410
|
+
} if
|
|
411
|
+
col 1 eq {
|
|
412
|
+
/col 0 def
|
|
413
|
+
/posx posx 1 sub def
|
|
414
|
+
} {
|
|
415
|
+
/col 1 def
|
|
416
|
+
/posx posx 1 add def
|
|
417
|
+
/posy posy dir add def
|
|
418
|
+
posy 0 lt posy size ge or { % Turn around at top and bottom
|
|
419
|
+
/dir dir -1 mul def
|
|
420
|
+
/posy posy dir add def
|
|
421
|
+
/posx posx 2 sub def
|
|
422
|
+
% Hop over the timing pattern in full size symbols
|
|
423
|
+
format (full) eq posx 6 eq and {/posx posx 1 sub def} if
|
|
424
|
+
} if
|
|
425
|
+
} ifelse
|
|
426
|
+
} loop
|
|
427
|
+
|
|
428
|
+
% Evaluation algorithm for full symbols
|
|
429
|
+
/evalfull {
|
|
430
|
+
/sym exch def
|
|
431
|
+
m 2 eq {1} {2} ifelse % In future we may evaluate the masks
|
|
432
|
+
} bind def
|
|
433
|
+
|
|
434
|
+
% Evaluation algoritm for micro symbols
|
|
435
|
+
/evalmicro {
|
|
436
|
+
/sym exch def
|
|
437
|
+
/dkrhs 0 def /dkbot 0 def
|
|
438
|
+
1 1 size 1 sub {
|
|
439
|
+
/i exch def
|
|
440
|
+
/dkrhs dkrhs sym size 1 sub i qmv get add def
|
|
441
|
+
/dkbot dkbot sym i size 1 sub qmv get add def
|
|
442
|
+
} for
|
|
443
|
+
dkrhs dkbot le {
|
|
444
|
+
dkrhs 16 mul dkbot add neg
|
|
445
|
+
} {
|
|
446
|
+
dkbot 16 mul dkrhs add neg
|
|
447
|
+
} ifelse
|
|
448
|
+
} bind def
|
|
449
|
+
|
|
450
|
+
% Evaluate the masked symbols to find the most suitable
|
|
451
|
+
/bestscore 999999999 def
|
|
452
|
+
0 1 masks length 1 sub {
|
|
453
|
+
/m exch def
|
|
454
|
+
/masksym size size mul array def
|
|
455
|
+
0 1 size size mul 1 sub {
|
|
456
|
+
/i exch def
|
|
457
|
+
masksym i pixs i get masks m get i get xor put
|
|
458
|
+
} for
|
|
459
|
+
format (full) eq {
|
|
460
|
+
masksym evalfull /score exch def
|
|
461
|
+
} {
|
|
462
|
+
masksym evalmicro /score exch def
|
|
463
|
+
} ifelse
|
|
464
|
+
score bestscore lt {
|
|
465
|
+
/bestsym masksym def
|
|
466
|
+
/bestmaskval m def
|
|
467
|
+
/bestscore score def
|
|
468
|
+
} if
|
|
469
|
+
} for
|
|
470
|
+
/pixs bestsym def
|
|
471
|
+
|
|
472
|
+
% Add the format information
|
|
473
|
+
format (full) eq {
|
|
474
|
+
/fmtvals [
|
|
475
|
+
16#5412 16#5125 16#5e7c 16#5b4b 16#45f9 16#40ce 16#4f97 16#4aa0
|
|
476
|
+
16#77c4 16#72f3 16#7daa 16#789d 16#662f 16#6318 16#6c41 16#6976
|
|
477
|
+
16#1689 16#13be 16#1ce7 16#19d0 16#0762 16#0255 16#0d0c 16#083b
|
|
478
|
+
16#355f 16#3068 16#3f31 16#3a06 16#24b4 16#2183 16#2eda 16#2bed
|
|
479
|
+
] def
|
|
480
|
+
/ecid (MLHQ) eclevel search pop length exch pop exch pop def
|
|
481
|
+
/fmtval fmtvals ecid 3 bitshift bestmaskval add get def
|
|
482
|
+
} {
|
|
483
|
+
/fmtvals [
|
|
484
|
+
16#4445 16#4172 16#4e2b 16#4b1c 16#55ae 16#5099 16#5fc0 16#5af7
|
|
485
|
+
16#6793 16#62a4 16#6dfd 16#68ca 16#7678 16#734f 16#7c16 16#7921
|
|
486
|
+
16#06de 16#03e9 16#0cb0 16#0987 16#1735 16#1202 16#1d5b 16#186c
|
|
487
|
+
16#2508 16#203f 16#2f66 16#2a51 16#34e3 16#31d4 16#3e8d 16#3bba
|
|
488
|
+
] def
|
|
489
|
+
/symid [ [0] [1 2] [3 4] [5 6 7] ] size 11 sub 2 idiv get eclval get def
|
|
490
|
+
/fmtval fmtvals symid 2 bitshift bestmaskval add get def
|
|
491
|
+
} ifelse
|
|
492
|
+
0 1 formatmap length 1 sub {
|
|
493
|
+
/i exch def
|
|
494
|
+
formatmap i get {
|
|
495
|
+
pixs exch {} forall qmv fmtval 14 i sub neg bitshift 1 and put
|
|
496
|
+
} forall
|
|
497
|
+
} for
|
|
498
|
+
|
|
499
|
+
% Add the version information
|
|
500
|
+
size 45 ge {
|
|
501
|
+
/vervals [
|
|
502
|
+
16#07c94 16#085bc 16#09a99 16#0a4d3 16#0bbf6 16#0c762 16#0d847
|
|
503
|
+
16#0e60d 16#0f928 16#10b78 16#1145d 16#12a17 16#13532 16#149a6
|
|
504
|
+
16#15683 16#168c9 16#177ec 16#18ec4 16#191e1 16#1afab 16#1b08e
|
|
505
|
+
16#1cc1a 16#1d33f 16#1ed75 16#1f250 16#209d5 16#216fd 16#228ba
|
|
506
|
+
16#2379f 16#24b0b 16#2542e 16#26a64 16#27541 16#28c69
|
|
507
|
+
] def
|
|
508
|
+
/verval vervals size 17 sub 4 idiv 7 sub get def
|
|
509
|
+
0 1 versionmap length 1 sub {
|
|
510
|
+
/i exch def
|
|
511
|
+
versionmap i get {
|
|
512
|
+
pixs exch {} forall qmv verval 17 i sub neg bitshift 1 and put
|
|
513
|
+
} forall
|
|
514
|
+
} for
|
|
515
|
+
} if
|
|
516
|
+
|
|
517
|
+
/retval 7 dict def
|
|
518
|
+
retval (ren) (renmatrix) put
|
|
519
|
+
retval (pixs) pixs put
|
|
520
|
+
retval (pixx) size put
|
|
521
|
+
retval (pixy) size put
|
|
522
|
+
retval (height) size 2 mul 72 div put
|
|
523
|
+
retval (width) size 2 mul 72 div put
|
|
524
|
+
retval (opt) useropts put
|
|
525
|
+
retval
|
|
526
|
+
|
|
527
|
+
end
|
|
528
|
+
|
|
529
|
+
} bind def
|
|
530
|
+
/qrcode load 0 1 dict put
|