@@ -135,36 +135,59 @@ begin
135135 /pixx ccpixx def
136136 } ifelse
137137
138- /pixs [
139- 0 ccpixx ccpixs length 1 sub {
140- /i exch def
141- ccpixs i ccpixx getinterval aload pop ccrpad aload pop
142- } for
143- 2 { linpad aload pop 0 1 93 {0} repeat 1 0 ccrpad aload pop } repeat
144- 2 { linpad aload pop 1 0 93 {0} repeat 0 1 ccrpad aload pop } repeat
145- 2 { linpad aload pop 0 1 93 {0} repeat 1 0 ccrpad aload pop } repeat
138+ /ccrows ccpixs length ccpixx idiv def
139+
140+ % Pre-compute bbs and bbs+bhs in row units to avoid repeated calculation
141+ /nbars sbs length 1 add 2 idiv def
142+ /bbsrow nbars array def
143+ /bhsrow nbars array def
144+ 0 1 nbars 1 sub {
145+ /b exch def
146+ bbsrow b bbs b get 72 mul cvi put
147+ bhsrow b bbsrow b get bhs b get 72 mul add put
148+ } for
149+
150+ % Rasterize linear rows, deduplicating identical adjacent rows using a string buffer
151+ /rowbuf pixx string def
152+ /prevrow () def /linrowmult 72 array def /lri 0 def
153+ /linpixs [
146154 71 -1 0 {
147155 /y exch def
148- linpad aload pop
149- 0
156+ /p 0 def
157+ linpad { rowbuf p 3 -1 roll put /p p 1 add def } forall
158+ rowbuf p 0 put /p p 1 add def
150159 0 1 sbs length 1 sub {
151160 /i exch def
152161 i 2 mod 0 eq {
153- % Don't print when bbs > y || (bbs + bhs) < y (i.e. add-on or includetext offsets)
154- bbs i 2 idiv get 72 mul cvi dup y gt exch bhs i 2 idiv get 72 mul add y lt or {
155- sbs i get cvi {0} repeat
156- } {
157- sbs i get cvi {1} repeat
158- } ifelse
159- } {
160- sbs i get cvi {0} repeat
161- } ifelse
162+ bbsrow i 2 idiv get y gt bhsrow i 2 idiv get y lt or { 0 } { 1 } ifelse
163+ } { 0 } ifelse
164+ sbs i get cvi { rowbuf p 2 index put /p p 1 add def } repeat pop
162165 } for
163- diff 0 lt {0} if % Allow for middle separator overhang on RHS if no add-on
166+ diff 0 lt { rowbuf p 0 put /p p 1 add def } if
167+ rowbuf prevrow eq {
168+ linrowmult lri 1 sub 2 copy get 1 add put % Bump multiplier
169+ } {
170+ prevrow length 0 gt { prevrow {} forall } if % Commit previous batch
171+ /prevrow rowbuf pixx string copy def
172+ linrowmult lri 1 put /lri lri 1 add def
173+ } ifelse
164174 } for
175+ prevrow {} forall % Commit final batch
165176 ] def
177+ /linrowmult linrowmult 0 lri getinterval def
166178
167- /pixy pixs length pixx idiv def
179+ /pixs [
180+ 0 ccpixx ccpixs length 1 sub {
181+ /i exch def
182+ ccpixs i ccpixx getinterval aload pop ccrpad aload pop
183+ } for
184+ linpad aload pop 0 1 93 {0} repeat 1 0 ccrpad aload pop
185+ linpad aload pop 1 0 93 {0} repeat 0 1 ccrpad aload pop
186+ linpad aload pop 0 1 93 {0} repeat 1 0 ccrpad aload pop
187+ linpixs aload pop
188+ ] def
189+ /rowmult [ ccrows { 1 } repeat 2 2 2 linrowmult aload pop ] def
190+ /pixy 0 rowmult {add} forall def
168191
169192 /borderleft
170193 linsym /borderleft 2 copy known { get } { pop pop 10 } ifelse linpad length 1 add sub
@@ -190,6 +213,7 @@ begin
190213 /pixs pixs
191214 /pixx pixx
192215 /pixy pixy
216+ /rowmult rowmult
193217 /height pixy 72 div
194218 /width pixx 72 div
195219 /borderleft borderleft
0 commit comments