diff options
Diffstat (limited to 'Master/tlpkg/tlgs/Resource/Init/pdf_ops.ps')
-rw-r--r-- | Master/tlpkg/tlgs/Resource/Init/pdf_ops.ps | 101 |
1 files changed, 59 insertions, 42 deletions
diff --git a/Master/tlpkg/tlgs/Resource/Init/pdf_ops.ps b/Master/tlpkg/tlgs/Resource/Init/pdf_ops.ps index fe61b12dcdb..47ff512d927 100644 --- a/Master/tlpkg/tlgs/Resource/Init/pdf_ops.ps +++ b/Master/tlpkg/tlgs/Resource/Init/pdf_ops.ps @@ -1,4 +1,4 @@ -% Copyright (C) 2001-2021 Artifex Software, Inc. +% Copyright (C) 2001-2020 Artifex Software, Inc. % All Rights Reserved. % % This software is provided AS-IS with no warranty, either express or @@ -695,11 +695,10 @@ end { % Check OP and BM in case we need to push a group //OPsaveDstack begin //Dpush exec % push the current OPsaveDstack values into 'previous' - /SupportsDevn .special_op okOPcs currentcolorspace 0 get dup /Indexed eq { pop currentcolorspace 1 get % use the base space } if - known or { + known { 1 index /stroke ne { .currentfilloverprint } { .currentstrokeoverprint } ifelse % Change BM to CompatibleOverprint if this has overprint true dup /ChangeBM exch def @@ -1479,8 +1478,19 @@ currentdict /clip_if_required .undef % width under pdfwrite. Pdfwrite uses (in text mode) an identity % CTM, so we need to calculate the stroke width which would result % if the CTM had been unity. - calc_text_linewidth - setlinewidth + currentlinewidth dup + currentdict /qTextSaveMatrix known { + matrix defaultmatrix idtransform qTextSaveMatrix dtransform + }{ + matrix defaultmatrix idtransform TextSaveMatrix dtransform + } ifelse + abs 2 copy exch abs eq { + pop + }{ + % non-square scaling reduces to Text matrix in pdfwrite , so + % we can ignore it. (wrong answer, but consistent) + pop pop currentlinewidth + }ifelse setlinewidth show setlinewidth} bind executeonly % Tr 2 - Fill then Stroke { currentlinewidth exch setsmaskstate @@ -1488,8 +1498,19 @@ currentdict /clip_if_required .undef % width under pdfwrite. Pdfwrite uses (in text mode) an identity % CTM, so we need to calculate the stroke width which would result % if the CTM had been unity. - calc_text_linewidth - setlinewidth + currentlinewidth dup + currentdict /qTextSaveMatrix known { + matrix defaultmatrix idtransform qTextSaveMatrix dtransform + }{ + matrix defaultmatrix idtransform TextSaveMatrix dtransform + } ifelse + abs 2 copy exch abs eq { + pop + }{ + % non-square scaling reduces to Text matrix in pdfwrite , so + % we can ignore it. (wrong answer, but consistent) + pop pop currentlinewidth + }ifelse setlinewidth setsmaskstate show setlinewidth} bind executeonly % Tr 3 - Neither fill nor stroke { setsmaskstate show } bind executeonly @@ -1504,50 +1525,38 @@ currentdict /clip_if_required .undef setsmaskstate dup show grestore //true charpath } bind executeonly % Tr 5 - Stroke, add to clip { gsave 1 .settextrenderingmode - calc_text_linewidth - setlinewidth + currentlinewidth dup + matrix defaultmatrix idtransform TextSaveMatrix dtransform + abs 2 copy exch abs eq { + pop + }{ + % non-square scaling reduces to Text matrix in pdfwrite , so + % we can ignore it. (wrong answer, but consistent) + pop pop currentlinewidth + }ifelse setlinewidth setsmaskstate dup show grestore //true charpath} bind executeonly % Tr 6 - Fill, stroke, add to clip { gsave 2 .settextrenderingmode - calc_text_linewidth - setlinewidth + currentlinewidth dup + currentdict /qTextSaveMatrix known { + matrix defaultmatrix idtransform qTextSaveMatrix dtransform + }{ + matrix defaultmatrix idtransform TextSaveMatrix dtransform + } ifelse + abs 2 copy exch abs eq { + pop + }{ + % non-square scaling reduces to Text matrix in pdfwrite , so + % we can ignore it. (wrong answer, but consistent) + pop pop currentlinewidth + }ifelse setlinewidth setsmaskstate dup show grestore //true charpath} bind executeonly % Tr 7 - Add to clip { //true charpath} bind executeonly ] readonly def -% - calc_text_linewidth calculated_width -% This calculates the required linewidth for stroke for *pdfwrite*, it must not be -% used for rendering. Because pdfwrite writes text scaled into a 72 dpi resolution -% we cannot use the current linewidth for it, it will be too large. Instead we must -% re-calculate the original linewidth (removing the default CTM) and then apply the -% TextSaveMatrix to find the appropriate new linewidth. -% We check to see if the x and y scaling are approximately the same, if they are not -% then we calculate a linewidth based on a right triangle with the x and y values -% of the current linewidth in each direction and then calculate the hypotenuse, which -% we then use as an approximation to the required width. -% The 'approximation' of 0.01 is just a guess. -/calc_text_linewidth -{ - currentlinewidth dup - currentdict /qTextSaveMatrix known { - matrix defaultmatrix idtransform qTextSaveMatrix dtransform - }{ - matrix defaultmatrix idtransform TextSaveMatrix dtransform - } ifelse - abs 2 copy exch abs sub abs 0.01 le { - pop - }{ - % We used to leave the linewidth alone for non-square resolutions, - % claiming it reduced to the text matrix in pdfwrite. This is not - % true. So handle it the same way we usually do, the hypotenuse of - % the unit square transformed through the TextSaveMatrix. - dup mul exch dup mul add sqrt 2 div - }ifelse -} bind executeonly def - /setstrokeforTrpreservation { % Check to see if the current device supports Tr /PreserveTrMode /GetDeviceParam .special_op { @@ -1564,7 +1573,15 @@ currentdict /clip_if_required .undef % CTM, so we need to calculate the stroke width which would result % if the CTM had been unity. NOTE! Only interested in magnitudes, % not signs. - calc_text_linewidth + currentlinewidth dup + matrix defaultmatrix idtransform TextSaveMatrix dtransform + abs 2 copy exch abs eq { + pop + }{ + % non-square scaling reduces to Text matrix in pdfwrite , so + % we can ignore it. (wrong answer, but consistent) + pop pop currentlinewidth + }ifelse setlinewidth } if } if |