@@ -192,6 +192,20 @@ begin
192192
193193 (input.processoptions) //renmatrix.after exec
194194
195+ % Default rowmult to all 1s if not provided
196+ currentdict /rowmult known not {
197+ /rowmult [ pixy { 1 } repeat ] def
198+ } if
199+
200+ /pixycomp rowmult length def
201+ /rowcumul pixycomp 1 add array def
202+ rowcumul 0 0 put
203+ 0 1 pixycomp 1 sub { % i
204+ dup rowcumul exch get % ... rowcumul[i]
205+ 1 index rowmult exch get add % ... rowcumul[i] + rowmult[i]
206+ exch 1 add exch rowcumul 3 1 roll put % rowcumul[i+1] = rowcumul[i]+rowmult[i]
207+ } for
208+
195209 %
196210 % Input validation
197211 %
@@ -228,10 +242,14 @@ begin
228242 /bwipp.renmatrixBadDimensions (The symbol dimensions must be positive) //raiseerror exec
229243 } if
230244
231- pixs length pixx pixy mul lt {
245+ pixs length pixx pixycomp mul lt {
232246 /bwipp.renmatrixBadPixelData (The pixel data is shorter than the symbol dimensions require) //raiseerror exec
233247 } if
234248
249+ rowcumul pixycomp get pixy ne {
250+ /bwipp.renmatrixRowmultMismatch (rowmult sum does not equal pixy) //raiseerror exec
251+ } if
252+
235253 (input.validate) //renmatrix.after exec
236254
237255 %
@@ -334,16 +352,16 @@ begin
334352
335353 % Pad the bitmap on all sides
336354 /pixx pixx 2 add def
337- /pixy pixy 2 add def
355+ /pixycomp pixycomp 2 add def
338356 /pixxpad pixx def
339357 /zerorow [ pixx {0} repeat ] def
340- pixx pixy mul { array } stopped {
358+ pixx pixycomp mul { array } stopped {
341359 pop /bwipp.renmatrixBitmapTooLarge (The bitmap exceeds the implementation limits) //raiseerror exec
342360 } if /padded exch def
343361 0 pixx padded length 1 sub {
344362 padded exch zerorow putinterval
345363 } for
346- 0 1 pixy 3 sub {
364+ 0 1 pixycomp 3 sub {
347365 /row exch def
348366 padded row 1 add pixx mul 1 add pixs row pixx 2 sub mul pixx 2 sub getinterval putinterval
349367 } for
@@ -363,11 +381,11 @@ begin
363381 % Pre-compute abcd values (printed neighbours) for all cells
364382 %
365383 /abcdw pixx 1 sub def
366- abcdw pixy 1 sub mul { array } stopped {
384+ abcdw pixycomp 1 sub mul { array } stopped {
367385 pop /bwipp.renmatrixBitmapTooLarge (The bitmap exceeds the implementation limits) //raiseerror exec
368386 } if /abcdcache exch def
369387 /abcdrow abcdw array def
370- 0 1 pixy 2 sub {
388+ 0 1 pixycomp 2 sub {
371389 /j exch def
372390 0 1 abcdw 1 sub {
373391 dup j abcd abcdrow 3 1 roll put
@@ -381,7 +399,7 @@ begin
381399 % Construct paths by tracing regions avoiding duplication by using the cache
382400 %
383401 /paths [
384- 0 1 pixy 2 sub {
402+ 0 1 pixycomp 2 sub {
385403 /j exch def
386404 0 1 pixx 2 sub {
387405 /i exch def
@@ -405,7 +423,7 @@ begin
405423 % Revert the bitmap size
406424 %
407425 /pixx pixx 2 sub def
408- /pixy pixy 2 sub def
426+ /pixycomp pixycomp 2 sub def
409427
410428 options /debugpaths known
411429 /uk.co.terryburton.bwipp.global_ctx dup where {exch get /enabledebug known} {pop false} ifelse
@@ -422,11 +440,12 @@ begin
422440 paths {
423441 /p exch def
424442 /len p length def
425- p len 1 sub get unpack
426- p 0 get unpack
443+ p len 1 sub get unpack rowcumul exch get
444+ p 0 get unpack rowcumul exch get
427445 0 1 len 1 sub { % x1 y1 x2 y2
428446 /i exch def
429- p i 1 add len mod get unpack 6 -2 roll % x3 y3 x1 y1 x2 y2
447+ p i 1 add len mod get unpack
448+ rowcumul exch get 6 -2 roll % x3 y3 x1 y1 x2 y2
430449 5 index inkspreadh 2 div
431450 4 index 4 -1 roll lt {add} {sub} ifelse % y3<y1 ? x2+ih : x2-ih
432451 4 1 roll
@@ -458,8 +477,11 @@ begin
458477 dup pixx mod /x exch def
459478 pixx idiv /y exch def
460479 x y xyget 1 eq {
461- x 0.5 add pixy y sub 0.5 sub moveto
462- x 0.5 add pixy y sub 0.5 sub 0.5 inkspread 2 div sub 0 360 arc
480+ rowcumul y get 1 rowcumul y 1 add get 1 sub {
481+ /vy exch def
482+ x 0.5 add pixy vy sub 0.5 sub moveto
483+ x 0.5 add pixy vy sub 0.5 sub 0.5 inkspread 2 div sub 0 360 arc
484+ } for
463485 } if
464486 } for
465487 fill
0 commit comments