Skip to content

Commit 295af4c

Browse files
committed
render: When grid fitting independent axis, at least fit in the same direction
1 parent cb2a215 commit 295af4c

2 files changed

Lines changed: 49 additions & 2 deletions

File tree

src/render.ps.src

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -900,6 +900,11 @@ begin
900900
%
901901
1 0 gridmatrix dtransform abs exch abs 2 copy lt {exch} if pop
902902

903+
% Snap mode used for x (0=round, 1=floor, 2=ceiling). The snapy
904+
% branch replays this against the y-axis devpx so square matrix
905+
% symbols stay square when the x-axis retry bumps to floor/ceiling.
906+
/xsnapmode 0 def
907+
903908
xdim 0 ne { % strictspec is provided
904909
/devpx exch def
905910
/snapped devpx 0 snapto def
@@ -908,6 +913,7 @@ begin
908913
pop pop % Discard error details
909914
/snap1 snapped def
910915
devpx mag div dup floor sub 0.5 lt { 2 } { 1 } ifelse
916+
dup /xsnapmode exch def
911917
devpx exch snapto /snapped exch def
912918
snapped effx xmin xmax //render.validate_xdim exec
913919
not {
@@ -921,7 +927,7 @@ begin
921927
xmax -1 ne { 1 index xmax sub dup 0 gt { add } { pop } ifelse } if
922928
exch pop
923929
} def
924-
eff1 dist eff2 dist lt { /snapped snap1 def } if
930+
eff1 dist eff2 dist lt { /snapped snap1 def /xsnapmode 0 def } if
925931
} {
926932
/bwipp.renderGridfitXdimOutOfSpec
927933
[ (No X-dimension within the permissible range )
@@ -941,7 +947,7 @@ begin
941947

942948
snapy {
943949
0 1 gridmatrix dtransform abs exch abs 2 copy lt {exch} if pop
944-
dup mag div round dup 0 le { pop 1 } if mag mul exch div
950+
dup xsnapmode snapto exch div
945951
} { dup } ifelse
946952

947953
scale

tests/ps_tests/rendergridfit.ps.test

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,44 @@
6363
{ gsave 0 0 moveto 10 dict begin /loosespec false def /griddpi 300 def 1 0.330 0.3295 0.3305 false false /gridfit render end
6464
not { pop grestore } if % Discard info string, grestore
6565
} /bwipp.renderGridfitXdimOutOfSpec isEqual
66+
67+
%
68+
% snapy=true must mirror the x-axis retry direction so square matrix
69+
% symbols (QR, Data Matrix, Aztec, ...) stay square. The three cases
70+
% below exercise each xsnapmode outcome and assert scale_x == scale_y
71+
% by comparing |dtransform(1,0)| against |dtransform(0,1)| after gridfit.
72+
% Dev-px calculations assume the test device's 72 DPI resolution so
73+
% devpx = griddpi / 72 per user unit.
74+
%
75+
% snapy=true + ceiling retry (xsnapmode=2)
76+
% griddpi=300: devpx=4.167, round=4 eff=0.288 < xmin=0.295, frac=0.167 <0.5
77+
% so retry picks ceiling=5 eff=0.360 within [0.295, 0.400]. y must
78+
% also snap to 5 rather than its independent round=4.
79+
%
80+
{ gsave 0 0 moveto 10 dict begin /loosespec false def /griddpi 300 def 1 0.300 0.295 0.400 false true /gridfit render
81+
{ 1 0 dtransform abs exch abs add 0 1 dtransform abs exch abs add sub abs 0.0001 lt }
82+
{ pop false } ifelse
83+
end grestore } true isEqual
84+
85+
%
86+
% snapy=true + floor retry (xsnapmode=1)
87+
% griddpi=200: devpx=2.778, round=3 eff=0.410 > xmax=0.379, frac=0.778 >=0.5
88+
% so retry picks floor=2 eff=0.274 within [0.200, 0.379]. y must
89+
% also snap to 2 rather than its independent round=3.
90+
%
91+
{ gsave 0 0 moveto 10 dict begin /loosespec false def /griddpi 200 def 1 0.380 0.200 0.379 false true /gridfit render
92+
{ 1 0 dtransform abs exch abs add 0 1 dtransform abs exch abs add sub abs 0.0001 lt }
93+
{ pop false } ifelse
94+
end grestore } true isEqual
95+
96+
%
97+
% snapy=true + loosespec revert to snap1 (xsnapmode reset to 0)
98+
% griddpi=300: devpx=4.167, round=4 eff=0.288 < xmin=0.295 fail,
99+
% retry ceiling=5 eff=0.360 > xmax=0.350 fail. loosespec picks closer:
100+
% dist(0.288)=0.007 < dist(0.360)=0.010, so snap1 (round=4) wins and
101+
% xsnapmode must reset to 0 so y also rounds to 4, not stay at ceil=5.
102+
%
103+
{ gsave 0 0 moveto 10 dict begin /loosespec true def /griddpi 300 def 1 0.300 0.295 0.350 false true /gridfit render
104+
{ 1 0 dtransform abs exch abs add 0 1 dtransform abs exch abs add sub abs 0.0001 lt }
105+
{ pop false } ifelse
106+
end grestore } true isEqual

0 commit comments

Comments
 (0)