diff options
22 files changed, 1361 insertions, 1055 deletions
diff --git a/Master/source/ghostscript-9.23.tar.xz b/Master/source/ghostscript-9.25.tar.xz Binary files differindex a36a5a99825..f0df5e2de5e 100644 --- a/Master/source/ghostscript-9.23.tar.xz +++ b/Master/source/ghostscript-9.25.tar.xz diff --git a/Master/tlpkg/tlgs/README.TEXLIVE b/Master/tlpkg/tlgs/README.TEXLIVE index 493afc3ca4e..0ac61d93b18 100644 --- a/Master/tlpkg/tlgs/README.TEXLIVE +++ b/Master/tlpkg/tlgs/README.TEXLIVE @@ -1,5 +1,5 @@ -This directory contains a subset of the Ghostscript 9.23 distribution +This directory contains a subset of the Ghostscript 9.25 distribution for Windows. The only purpose of this package is to support programs shipped with TeX Live. It's not intended for general use. diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_dps.ps b/Master/tlpkg/tlgs/Resource/Init/gs_dps.ps index 3ebd0a33172..cad7056230d 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_dps.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_dps.ps @@ -70,7 +70,7 @@ % Save a copy of the initial gstate. //systemdict /savedinitialgstate gstate readonly .forceput .setglobal -} .bind def +} .bind executeonly def % must be bound and hidden for .forceput % Initialize local dictionaries and gstate when creating a new context. % Note that until this completes, we are in the anomalous situation of diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_fntem.ps b/Master/tlpkg/tlgs/Resource/Init/gs_fntem.ps index 0f7c3153a7b..3ceee18d396 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_fntem.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_fntem.ps @@ -408,7 +408,7 @@ currentdict end def exit } loop exch setglobal -} bind def +} .bind executeonly def % must be bound and hidden for .forceput currentdict end /ProcSet defineresource pop diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_init.ps b/Master/tlpkg/tlgs/Resource/Init/gs_init.ps index 6c8da532ca0..bec307d1b13 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_init.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_init.ps @@ -29,7 +29,7 @@ % Interpreter library version number % NOTE: the interpreter code requires that the first non-comment token % in this file be an integer, and that it match the compiled-in version! -923 +925 % Check the interpreter revision. dup revision ne @@ -767,23 +767,6 @@ userdict /.currentresourcefile //null put { /run .systemvar exec } .execasresource } bind def -% Define procedures for getting and setting the current device resolution. - -/gsgetdeviceprop % <device> <propname> gsgetdeviceprop <value> - { 2 copy mark exch //null .dicttomark .getdeviceparams - dup mark eq % if true, not found - { pop dup /undefined signalerror } - { 5 1 roll pop pop pop pop } - ifelse - } bind def -/gscurrentresolution % - gscurrentresolution <[xres yres]> - { currentdevice /HWResolution gsgetdeviceprop - } bind def -/gssetresolution % <[xres yres]> gssetresolution - - { 2 array astore mark exch /HWResolution exch - currentdevice copydevice putdeviceprops setdevice - } bind def - % Define auxiliary procedures needed for the above. /shellarguments % -> shell_arguments true (or) false { /ARGUMENTS where @@ -898,7 +881,7 @@ userdict /.currentresourcefile //null put { not exch pop exit } { pop } ifelse } for exch pop .quit - } bind def + } bind executeonly def /.errorhandler % <command> <errorname> .errorhandler - { % Detect an internal 'stopped'. 1 .instopped { //null eq { pop pop stop } if } if @@ -943,7 +926,7 @@ userdict /.currentresourcefile //null put $error /globalmode get $error /.nosetlocal get and .setglobal $error /.inerror //false put stop - } bind def + } bind executeonly def % Define the standard handleerror. We break out the printing procedure % (.printerror) so that it can be extended for binary output % if the Level 2 facilities are present. @@ -993,7 +976,7 @@ userdict /.currentresourcefile //null put ifelse % newerror end flush - } bind def + } bind executeonly def /.printerror_long % long error printout, % $error is on the dict stack { % Push the (anonymous) stack printing procedure. @@ -1070,14 +1053,14 @@ userdict /.currentresourcefile //null put { (Current file position is ) print position = } if - } bind def + } bind executeonly def % Define a procedure for clearing the error indication. /.clearerror { $error /newerror //false put $error /errorname //null put $error /errorinfo //null put 0 .setoserrno - } bind def + } bind executeonly def % Define $error. This must be in local VM. .currentglobal //false .setglobal @@ -1103,11 +1086,15 @@ end /errordict ErrorNames length 3 add dict .forcedef % errordict is local, systemdict is global .setglobal % back to global VM -% For greater Adobe compatibility, we put all non-standard errors in a -% separate dictionary, gserrordict. It does not need to be in local VM, -% because PostScript programs do not access it. +% gserrordict contains all the default error handling methods, but unlike +% errordict it is noaccess after creation (also it is in global VM). +% When running 'SAFER', we'll ignore the contents of errordict, which +% may have been tampered with by the running job, and always use gserrordict +% gserrordict also contains any non-standard errors, for better compatibility +% with Adobe. +% % NOTE: the name gserrordict is known to the interpreter. -/gserrordict 5 dict def +/gserrordict ErrorNames length 3 add dict def % Register an error in errordict. We make this a procedure because we only % register the Level 1 errors here: the rest are registered by "feature" % files. However, ErrorNames contains all of the error names regardless of @@ -1136,8 +1123,11 @@ errordict begin } bind def end % errordict -% Put non-standard errors in gserrordict. -gserrordict /unknownerror errordict /unknownerror get put +% Put all the default handlers in gserrordict +gserrordict +errordict {2 index 3 1 roll put} forall +noaccess pop +% remove the non-standard errors from errordict errordict /unknownerror .undef % Define a stable private copy of handleerror that we will always use under % JOBSERVER mode. @@ -1521,6 +1511,14 @@ setpacking dup 150 lt //systemdict /DITHERPPI known not and } bind def +/.gsgetdeviceprop % <device> <propname> gsgetdeviceprop <value> + { 2 copy mark exch //null .dicttomark .getdeviceparams + dup mark eq % if true, not found + { pop dup /undefined signalerror } + { 5 1 roll pop pop pop pop } + ifelse + } bind def + % The following implementation uses LL2 extensions, but only in stopped % contexts so that with LL1, the .set??reshalftone will be used. % @@ -1528,7 +1526,7 @@ setpacking % false /.getdefaulthalftone { % try the device to see if it has a default halftone - { currentdevice /HalftoneDefault gsgetdeviceprop } .internalstopped + { currentdevice /HalftoneDefault //.gsgetdeviceprop exec } .internalstopped { pop pop //false } % no device property { dup type /dicttype eq { //true } { pop //false } ifelse } ifelse @@ -1541,6 +1539,7 @@ setpacking } if } bind def +currentdict /.gsgetdeviceprop .forceundef /.setdefaulthalftone { .getdefaulthalftone @@ -2012,15 +2011,30 @@ systemdict /EPSBoundingBoxInit known { EPSBoundingBoxInit } if .currentglobal //true .setglobal /SAFETY 2 dict dup /safe //false put - dup /tempfiles 10 dict readonly put + dup /tempfiles 10 dict noaccess put readonly def .setglobal +/tempfilepaths +[ + (TMPDIR) getenv not + { + (TEMP) getenv not + { + (TMP) getenv not + { + (/temp) (/tmp) + } if + } if + } if +] def + /.locksafe_userparams { SAFETY /safe get not { << /PermitFileReading [ currentuserparams /PermitFileReading get aload pop + //tempfilepaths (*) .generate_dir_list_templates /FONTPATH .systemvar (*) .generate_dir_list_templates % Library files : /LIBPATH .systemvar (*) .generate_dir_list_templates @@ -2035,6 +2049,18 @@ readonly def [ currentsystemparams /GenericResourceDir get] (*) .file_name_separator (*) concatstrings concatstrings .generate_dir_list_templates } if + currentuserparams /ICCProfilesDir known { + [currentuserparams /ICCProfilesDir get] (*) + .generate_dir_list_templates + } if + ] + /PermitFileWriting [ + currentuserparams /PermitFileWriting get aload pop + //tempfilepaths (*) .generate_dir_list_templates + ] + /PermitFileControl [ + currentuserparams /PermitFileControl get aload pop + //tempfilepaths (*) .generate_dir_list_templates ] /LockFilePermissions //true >> setuserparams @@ -2042,6 +2068,8 @@ readonly def if } bind def +currentdict /tempfilepaths undef + /.locksafe { .locksafe_userparams systemdict /getenv {pop //false} .forceput @@ -2103,151 +2131,145 @@ readonly def .locksafeglobal } bind executeonly odef -/deletefile { - dup { deletefile } stopped { - pop //deletefile $error /errorname get signalerror - } { - % deletefile succeeded. Remove from tempfile list if present - //SAFETY /tempfiles get exch cvn 2 copy known { - .forceundef - } { - pop pop - } - ifelse - } - ifelse -} .bind executeonly odef - -% If a file is opened with .tempfile with SAFER not (yet) set, -% the file can be deleted later, even if SAFER is set. -/.tempfile { - .tempfile % filename file - //SAFETY /tempfiles get 2 .argindex //true .forceput -} .bind executeonly odef - % If we are running in SAFER mode, lock things down SAFER { .setsafeglobal } if +/SAFERUndefinePostScriptOperators { + [ + % Used by our own test suite files + /.pushpdf14devicefilter % transparency-example.ps + /.poppdf14devicefilter % transparency-example.ps + /.setopacityalpha % transparency-example.ps + /.setshapealpha % transparency-example.ps + /.endtransparencygroup % transparency-example.ps + /.setdotlength % Bug687720.ps + /.sort /.setdebug /.mementolistnewblocks /getenv + + /.makeoperator /.setCPSImode % gs_cet.ps, this won't work on cluster with -dSAFER + + /unread + ] + {systemdict exch .forceundef} forall + + //systemdict /SAFERUndefinePostScriptOperators .forceundef +} .bind executeonly def % must be bound and hidden for .forceundef + /UndefinePostScriptOperators { -%% This list is of Display PostScript operators. We believe that Display PostScript -%% was never fully implemented and the only known user, GNUStep, is no longer -%% using it. So lets remove it. -[ -/condition /currentcontext /detach /.fork /join /.localfork /lock /monitor /notify -/wait /yield /.currentscreenphase /.setscreenphase /.image2 /eoviewclip /initviewclip -/viewclip /viewclippath /defineusername -%% NeXT DPS extensions -/currentalpha /setalpha /.alphaimage /composite /compositerect /dissolve /sizeimagebox /.sizeimageparams -] -{systemdict exch .forceundef} forall - -%% This list is of operators which no longer appear to be used, and which we do not believe -%% to have any real use. For now we will undefine the operstors so they cannot easily be used -%% but can be easily restored (just delete the name from the list in the array). In future -%% we may remove the operator and the code implementation entirely. -[ -/.bitadd /.charboxpath /.cond /.countexecstack /.execstack /.runandhide /.popdevicefilter -/.execfile /.filenamesplit /.file_name_parent -/.setdefaultmatrix /.isprocfilter /.unread /.psstringencode -/.buildsampledfunction /.isencapfunction /.currentaccuratecurves /.currentcurvejoin /.currentdashadapt /.currentdotlength -/.currentlimitclamp /.dotorientation /.setaccuratecurves /.setcurvejoin /.setdashadapt /.setdotorientation -/.setlimitclamp /.currentscreenlevels /.dashpath /.pathbbox /.identeq /.identne /.tokenexec /.forgetsave /.pantonecallback - -%% Used by our own test suite files -%%/.setdotlength % Bug687720.ps -] -{systemdict exch .forceundef} forall - -%% This list of operators are used internally by various parts of the Ghostscript startup code. -%% Since each operator is a potential security vulnerability, and any operator listed here -%% is not required once the initislisation is complete and functions are bound, we undefine -%% the ones that aren't needed at runtime. -[ -/.callinstall /.callbeginpage /.callendpage -/.currentstackprotect /.setstackprotect /.errorexec /.finderrorobject /.installsystemnames /.bosobject /.fontbbox -/.type1execchar /.type2execchar /.type42execchar /.setweightvector /.getuseciecolor /processcolors /.includecolorspace -/.execn /.instopped /.stop /.stopped /.setcolorrendering /.setdevicecolorrendering /.buildcolorrendering1 /.builddevicecolorrendering1 -/.TransformPQR_scale_WB0 /.TransformPQR_scale_WB1 /.TransformPQR_scale_WB2 /.currentoverprintmode /.copydevice2 -/.devicename /.doneshowpage /.getbitsrect /.getdevice /.getdefaultdevice /.getdeviceparams /.gethardwareparams -/makewordimagedevice /.outputpage /.putdeviceparams /.setdevice /.currentshowpagecount -/.setpagedevice /.currentpagedevice /.knownundef /.setmaxlength /.rectappend /.initialize_dsc_parser /.parse_dsc_comments -/.fillCIDMap /.fillIdentityCIDMap /.buildcmap /.filenamelistseparator /.libfile /.getfilename -/.file_name_combine /.file_name_is_absolute /.file_name_separator /.file_name_directory_separator /.file_name_current /.filename -/.peekstring /.writecvp /.subfiledecode /.setupUnicodeDecoder /.jbig2makeglobalctx /.registerfont /.parsecff -/.getshowoperator /.getnativefonts /.beginform /.endform /.get_form_id /.repeatform /.reusablestream /.rsdparams -/.buildfunction /.currentfilladjust2 /.setfilladjust2 /.sethpglpathmode /.currenthpglpathmode -/.currenthalftone /.sethalftone5 /.image1 /.imagemask1 /.image3 /.image4 -/.getiodevice /.getdevparms /.putdevparams /.bbox_transform /.matchmedia /.matchpagesize /.defaultpapersize -/.oserrno /.setoserrno /.oserrorstring /.getCPSImode -/.getscanconverter /.setscanconverter /.type1encrypt /.type1decrypt/.languagelevel /.setlanguagelevel /.eqproc /.fillpage /.buildpattern1 /.saslprep -/.buildshading1 /.buildshadin2 /.buildshading3 /.buildshading4 /.buildshading5 /.buildshading6 /.buildshading7 /.buildshadingpattern -/.argindex /.bytestring /.namestring /.stringbreak /.stringmatch /.globalvmarray /.globalvmdict /.globalvmpackedarray /.globalvmstring -/.localvmarray /.localvmdict /.localvmpackedarray /.localvmstring /.systemvmarray /.systemvmdict /.systemvmpackedarray /.systemvmstring /.systemvmfile /.systemvmlibfile -/.systemvmSFD /.settrapparams /.currentsystemparams /.currentuserparams /.getsystemparam /.getuserparam /.setsystemparams /.setuserparams -/.checkpassword /.locale_to_utf8 /.currentglobal /.gcheck /.imagepath - -% Used by a free user in the Library of Congress. Apparently this is used to -% draw a partial page, which is then filled in by the results of a barcode -% scanner and SQL database lookup. Its not clear to us exactly why this needs to be -% done as a partial page, but its easiest to restore the operator, and it seems like -% its a reasonably safe operator to restore, for the *very* few devices on which -% it will have any effect. Currently this uses the 'sync_outptu' device method -% to transfer the partial page, in future we may use a spec_op instead. -%/flushpage - -% Used by our own test suite files -%/.fileposition %image-qa.ps -%/.makeoperator /.setCPSImode % gs_cet.ps - -% Either our code uses these in ways which mean they can't be undefined, or they are used directly by -% test files/utilities, or engineers expressed a desire to keep them visible. -% -%/currentdevice /.sort /.buildfont0 /.buildfont1 /.buildfont2 /.buildfont3 /.buildfont4 /.buildfont9 /.buildfont10 /.buildfont11 -%/.buildfotn32 /.buildfont42 /.type9mapcid /.type11mapcid /.swapcolors -%/currentdevice /.quit /.setuseciecolor /.needinput /.setoverprintmode /.special_op /.dicttomark /.knownget -%/.FAPIavailable /.FAPIpassfont /.FAPIrebuildfont /.FAPIBuildGlyph /.FAPIBuildChar /.FAPIBuildGlyph9 -%/.tempfile /.numicc_components /.set_outputintent /.max /.min /.shfill /.vmreclaim /.getpath /.setglobal -%/.setdebug /.mementolistnewblocks /getenv -] -{systemdict exch .forceundef} forall - -//systemdict /UndefinePostScriptOperators .forceundef -} bind def + %% This list is of Display PostScript operators. We believe that Display PostScript + %% was never fully implemented and the only known user, GNUStep, is no longer + %% using it. So lets remove it. + [ + /condition /currentcontext /detach /.fork /join /.localfork /lock /monitor /notify + /wait /yield /.currentscreenphase /.setscreenphase /.image2 /eoviewclip /initviewclip + /viewclip /viewclippath /defineusername + %% NeXT DPS extensions + /currentalpha /setalpha /.alphaimage /composite /compositerect /dissolve /sizeimagebox /.sizeimageparams + ] + {systemdict exch .forceundef} forall + + %% This list is of operators which no longer appear to be used, and which we do not believe + %% to have any real use. For now we will undefine the operstors so they cannot easily be used + %% but can be easily restored (just delete the name from the list in the array). In future + %% we may remove the operator and the code implementation entirely. + [ + /.bitadd /.charboxpath /.cond /.countexecstack /.execstack /.runandhide /.popdevicefilter + /.execfile /.filenamesplit /.file_name_parent + /.setdefaultmatrix /.isprocfilter /.unread /.psstringencode + /.buildsampledfunction /.isencapfunction /.currentaccuratecurves /.currentcurvejoin /.currentdashadapt /.currentdotlength + /.currentlimitclamp /.dotorientation /.setaccuratecurves /.setcurvejoin /.setdashadapt /.setdotorientation + /.setlimitclamp /.currentscreenlevels /.dashpath /.pathbbox /.identeq /.identne /.tokenexec /.forgetsave /.pantonecallback + + %% Used by our own test suite files + %%/.setdotlength % Bug687720.ps + ] + {systemdict exch .forceundef} forall + + %% This list of operators are used internally by various parts of the Ghostscript startup code. + %% Since each operator is a potential security vulnerability, and any operator listed here + %% is not required once the initialisation is complete and functions are bound, we undefine + %% the ones that aren't needed at runtime. + [ + /.callinstall /.callbeginpage /.callendpage + /.currentstackprotect /.setstackprotect /.errorexec /.finderrorobject /.installsystemnames /.bosobject /.fontbbox + /.type1execchar /.type2execchar /.type42execchar /.setweightvector /.getuseciecolor /processcolors /.includecolorspace + /.execn /.instopped /.stop /.stopped /.setcolorrendering /.setdevicecolorrendering /.buildcolorrendering1 /.builddevicecolorrendering1 + /.TransformPQR_scale_WB0 /.TransformPQR_scale_WB1 /.TransformPQR_scale_WB2 /.currentoverprintmode /.copydevice2 + /.devicename /.doneshowpage /.getbitsrect /.getdevice /.getdefaultdevice /.getdeviceparams /.gethardwareparams + /makewordimagedevice /.outputpage /.putdeviceparams /.setdevice /.currentshowpagecount + /.setpagedevice /.currentpagedevice /.knownundef /.setmaxlength /.rectappend /.initialize_dsc_parser /.parse_dsc_comments + /.fillCIDMap /.fillIdentityCIDMap /.buildcmap /.filenamelistseparator /.libfile /.getfilename + /.file_name_combine /.file_name_is_absolute /.file_name_separator /.file_name_directory_separator /.file_name_current /.filename + /.peekstring /.writecvp /.subfiledecode /.setupUnicodeDecoder /.jbig2makeglobalctx /.registerfont /.parsecff + /.getshowoperator /.getnativefonts /.beginform /.endform /.get_form_id /.repeatform /.reusablestream /.rsdparams + /.buildfunction /.currentfilladjust2 /.setfilladjust2 /.sethpglpathmode /.currenthpglpathmode + /.currenthalftone /.sethalftone5 /.image1 /.imagemask1 /.image3 /.image4 + /.getiodevice /.getdevparms /.putdevparams /.bbox_transform /.matchmedia /.matchpagesize /.defaultpapersize + /.oserrno /.setoserrno /.oserrorstring /.getCPSImode + /.getscanconverter /.setscanconverter /.type1encrypt /.type1decrypt/.languagelevel /.setlanguagelevel /.eqproc /.fillpage /.buildpattern1 /.saslprep + /.buildshading1 /.buildshading2 /.buildshading3 /.buildshading4 /.buildshading5 /.buildshading6 /.buildshading7 /.buildshadingpattern + /.shfill /.argindex /.bytestring /.namestring /.stringbreak /.stringmatch /.globalvmarray /.globalvmdict /.globalvmpackedarray /.globalvmstring + /.localvmarray /.localvmdict /.localvmpackedarray /.localvmstring /.systemvmarray /.systemvmdict /.systemvmpackedarray /.systemvmstring /.systemvmfile /.systemvmlibfile + /.systemvmSFD /.settrapparams /.currentsystemparams /.currentuserparams /.getsystemparam /.getuserparam /.setsystemparams /.setuserparams + /.checkpassword /.locale_to_utf8 /.currentglobal /.gcheck /.imagepath + + % Used by a free user in the Library of Congress. Apparently this is used to + % draw a partial page, which is then filled in by the results of a barcode + % scanner and SQL database lookup. Its not clear to us exactly why this needs to be + % done as a partial page, but its easiest to restore the operator, and it seems like + % its a reasonably safe operator to restore, for the *very* few devices on which + % it will have any effect. Currently this uses the 'sync_output' device method + % to transfer the partial page, in future we may use a spec_op instead. + %/flushpage + + % Used by our own test suite files + %/.fileposition %image-qa.ps + %/.makeoperator /.setCPSImode % gs_cet.ps + + % Either our code uses these in ways which mean they can't be undefined, or they are used directly by + % test files/utilities, or engineers expressed a desire to keep them visible. + % + %/currentdevice /.sort /.buildfont0 /.buildfont1 /.buildfont2 /.buildfont3 /.buildfont4 /.buildfont9 /.buildfont10 /.buildfont11 + %/.buildfotn32 /.buildfont42 /.type9mapcid /.type11mapcid /.swapcolors + %/currentdevice /.quit /.setuseciecolor /.needinput /.setoverprintmode /.special_op /.dicttomark /.knownget + %/.FAPIavailable /.FAPIpassfont /.FAPIrebuildfont /.FAPIBuildGlyph /.FAPIBuildChar /.FAPIBuildGlyph9 + %/.tempfile /.numicc_components /.set_outputintent /.max /.min /.vmreclaim /.getpath /.setglobal + %/.setdebug /.mementolistnewblocks /getenv + ] + {systemdict exch .forceundef} forall + + //systemdict /UndefinePostScriptOperators .forceundef +} .bind executeonly def % must be bound and hidden for .forceundef /UndefinePDFOperators { -%% This list of operators are used internally by various parts of the Ghostscript PDF interpreter. -%% Since each operator is a potential security vulnerability, and any operator listed here -%% is not required once the initislisation is complete and functions are bound, we undefine -%% the ones that aren't needed at runtime. -[ -/.pdfawidthshow /.pdfwidthshow /.currentblackptcomp /.setblackptcomp -/.setfillcolor /.setfillcolorspace /.setstrokecolor /.setstrokecolorspace /.currentrenderingintent /.setrenderingintent -/.currenttextrenderingmode /.settextspacing /.currenttextspacing /.settextleading /.currenttextleading -/.settextrise /.currenttextrise /.setwordspacing /.currentwordspacing /.settexthscaling /.currenttexthscaling -/.settextlinematrix /.currenttextlinematrix /.currenttextmatrix /.settextmatrix /.currentblendmode -/.currentopacityalpha /.currentshapealpha /.currenttextknockout -/.pushextendedgstate /.popextendedgstate /.begintransparencytextgroup -/.endtransparencytextgroup /.begintransparencymaskgroup /.begintransparencymaskimage /.endtransparencymask /.image3x -/.abortpdf14devicefilter /.pdfinkpath /.pdfFormName /.setstrokeconstantalpha -/.setfillconstantalpha /.setalphaisshape /.currentalphaisshape -/.settextspacing /.currenttextspacing /.settextleading /.currenttextleading /.settextrise /.currenttextrise -/.setwordspacing /.currentwordspacing /.settexthscaling /.currenttexthscaling /.setPDFfontsize /.currentPDFfontsize - -% Used by our own test suite files -%/.pushpdf14devicefilter % transparency-example.ps -%/.poppdf14devicefilter % transparency-example.ps -%/.setopacityalpha % transparency-example.ps -%/.setshapealpha % transparency-example.ps -%/.endtransparencygroup % transparency-example.ps - -% undefining these causes errors/incorrect output -%/.settextrenderingmode /.setblendmode /.begintransparencygroup /.settextknockout /check_r6_password /.setstrokeoverprint /.setfilloverprint -%/.currentstrokeoverprint /.currentfilloverprint /.currentfillconstantalpha /.currentstrokeconstantalpha -] -{systemdict exch .forceundef} forall -//systemdict /UndefinePDFOperators .forceundef -} bind def + %% This list of operators are used internally by various parts of the Ghostscript PDF interpreter. + %% Since each operator is a potential security vulnerability, and any operator listed here + %% is not required once the initislisation is complete and functions are bound, we undefine + %% the ones that aren't needed at runtime. + %% This function is only called if DELAYBIND is true. It is a copy of the code at the end of pdf_main.ps + %% and must be maintained in parallel with it. + [ + /.pdfawidthshow /.pdfwidthshow /.currentblackptcomp /.setblackptcomp + /.setfillcolor /.setfillcolorspace /.setstrokecolor /.setstrokecolorspace /.currentrenderingintent /.setrenderingintent + /.currenttextrenderingmode /.settextspacing /.currenttextspacing /.settextleading /.currenttextleading + /.settextrise /.currenttextrise /.setwordspacing /.currentwordspacing /.settexthscaling /.currenttexthscaling + /.settextlinematrix /.currenttextlinematrix /.currenttextmatrix /.settextmatrix /.currentblendmode + /.currentopacityalpha /.currentshapealpha /.currenttextknockout + /.pushextendedgstate /.popextendedgstate /.begintransparencytextgroup + /.endtransparencytextgroup /.begintransparencymaskgroup /.begintransparencymaskimage /.endtransparencymask /.image3x + /.abortpdf14devicefilter /.pdfinkpath /.pdfFormName /.setstrokeconstantalpha + /.setfillconstantalpha /.setalphaisshape /.currentalphaisshape + /.settextspacing /.currenttextspacing /.settextleading /.currenttextleading /.settextrise /.currenttextrise + /.setwordspacing /.currentwordspacing /.settexthscaling /.currenttexthscaling /.setPDFfontsize /.currentPDFfontsize + /.setdistillerparams + + % undefining these causes errors/incorrect output + %/.settextrenderingmode /.setblendmode /.begintransparencygroup /.settextknockout /check_r6_password /.setstrokeoverprint /.setfilloverprint + %/.currentstrokeoverprint /.currentfilloverprint /.currentfillconstantalpha /.currentstrokeconstantalpha + ] + {systemdict exch .forceundef} forall + //systemdict /UndefinePDFOperators .forceundef +} .bind executeonly def % must be bound and hidden for .forceundef % If we delayed binding, make it possible to do it later. /.bindnow { @@ -2262,8 +2284,11 @@ SAFER { .setsafeglobal } if //systemdict /.delaybind {} .forceput % reclaim the space //systemdict /.bindnow .forceundef % ditto put -% //systemdict /UndefinePostScriptOperators get exec -% //systemdict /UndefinePDFOperators get exec + SAFER { + //systemdict /SAFERUndefinePostScriptOperators get exec + } if + //systemdict /UndefinePostScriptOperators get exec + //systemdict /UndefinePDFOperators get exec //systemdict /.forcecopynew .forceundef % remove temptation //systemdict /.forcedef .forceundef % ditto //systemdict /.forceput .forceundef % ditto @@ -2375,6 +2400,9 @@ currentdict /.renderingintentdict .undef %% If we are using DELAYBIND we have to defer the undefinition %% until .bindnow. DELAYBIND not { + SAFER { + //systemdict /SAFERUndefinePostScriptOperators get exec + } if //systemdict /UndefinePostScriptOperators get exec //systemdict /UndefinePDFOperators .forceundef } if @@ -2385,6 +2413,7 @@ end { pop NOGC not { 2 .vmreclaim 0 vmreclaim } if } if DELAYBIND not { + systemdict /.bindnow .undef % We only need this for DELAYBIND systemdict /.forcecopynew .undef % remove temptation systemdict /.forcedef .undef % ditto systemdict /.forceput .undef % ditto diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_lev2.ps b/Master/tlpkg/tlgs/Resource/Init/gs_lev2.ps index 72c11edb4a1..eee0b9f6175 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_lev2.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_lev2.ps @@ -163,7 +163,8 @@ end % Set them again to the new values. From here on, we are safe, % since a context switch will consult userparams. .setuserparams -} .bind def +} .bind executeonly def % must be bound and hidden for .forceput + /setuserparams { % <dict> setuserparams - .setuserparams2 } .bind odef @@ -1072,10 +1073,10 @@ def % the values given into an array. This is consistent with what we see when % testing with Adobe Distiller 6.0. % <cyan> <magenta> <yellow> <black> <key> findcmykcustomcolor <array> -/findcmykcustomcolor { 5 array astore } bind def +/findcmykcustomcolor { 5 array astore } bind executeonly def % The following isn't documented by Adobe, but was found in Adobe Illustrator (R) % Version 7.0 Full Prolog -/findrgbcustomcolor { 4 array astore } bind def +/findrgbcustomcolor { 4 array astore } bind executeonly def % Build a tint transform function for use by setcustomcolor. This function % is for a Separation color space which has either a DeviceCMYK base color space @@ -1104,7 +1105,7 @@ def ] } ifelse cvx bind exch pop % Make executable and remove the input array -} bind def +} bind executeonly def % Construct the colorspace array to be used by setcolorspace from the array % result of either findcmykcustomcolor or findrgbcustomcolor. @@ -1124,7 +1125,7 @@ def ] } ifelse exch pop % remove the input array -} bind def +} bind executeonly def % Set a custom color based upon a tint and array which describes the custom % color. See findcmykcustomcolor. First we create and then set a Separation @@ -1133,14 +1134,51 @@ def % for some reason, so an alternate operational mode is tolerated: % null setcustomcolor - /setcustomcolor % <array> <tint> setcustomcolor - -{ dup //null ne { +{ + dup //null eq { + pop pop + }{ + % Check that the tint is a number between 0 and 1 + dup type dup /integertype eq exch /realtype eq or not { + /setcustomcolor /typecheck cvx signalerror + } if + dup 1 le not { + /setcustomcolor /rangecheck cvx signalerror + } if + dup 0 ge not { + /setcustomcolor /rangecheck cvx signalerror + } if + + % The array is supposed to be the result of fundcmykcustomcolor. Our + % implementation just pushes all the arguments into the array and that's + % what buildcolorspacearray expects. So check that now. + % Starting with the first N-1 elemenst which must be numbers where 0 <= x <= 1 + 1 index + 0 1 2 index length 2 sub + { + 1 index exch get dup + type dup /integertype eq exch /realtype eq or not { + /setcustomcolor /typecheck cvx signalerror + } if + dup + 1 le not { + /setcustomcolor /rangecheck cvx signalerror + } if + 0 ge not { + /setcustomcolor /rangecheck cvx signalerror + } if + } for + + % Finally, check the last element of the array, which must be a string. + dup length 1 sub get type /stringtype eq not { + /setcustomcolor /typecheck cvx signalerror + } if + exch //buildcolorspacearray exec setcolorspace % Set the Separation color space as current setcolor % Set the tint as the current color - } - { pop pop } % 'null' as the tint is ignored. pop tint and array - ifelse -} bind def + } ifelse +} bind executeonly def % This proc is supposed to implement a version of overprinting. TN 5044 says % that this proc is not used by any shipping host-based application. We have diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_ll3.ps b/Master/tlpkg/tlgs/Resource/Init/gs_ll3.ps index 5aa56a36833..1d37e536165 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_ll3.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_ll3.ps @@ -440,6 +440,11 @@ systemdict /.reuseparamdict mark /shfill .systemvar /undefined signalerror } ifelse } bind def + +/.buildshading_and_shfill { + .buildshading .shfill +} bind def + systemdict /.reuseparamdict undef /.buildpattern2 { % <template> <matrix> .buildpattern2 @@ -464,7 +469,7 @@ systemdict /.reuseparamdict undef % Currently, .shfill requires that the color space % in the pattern be the current color space. % Disable overprintmode for shfill - { dup gsave 0 .setoverprintmode .buildshading .shfill } stopped + { dup gsave 0 .setoverprintmode .buildshading_and_shfill } stopped grestore { /$error .systemvar /errorinfo 2 copy known { pop pop diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_pdfwr.ps b/Master/tlpkg/tlgs/Resource/Init/gs_pdfwr.ps index 3da5306223e..fb1c4191c4d 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_pdfwr.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_pdfwr.ps @@ -197,7 +197,7 @@ languagelevel 2 .setlanguagelevel /ColorConversionStrategy /UseDeviceIndependentColor /ColorImageDownsampleType /Average /ColorImageResolution 300 - /CompatibilityLevel 1.5 + /CompatibilityLevel 1.7 /CreateJobTicket //true /DoThumbnails //false /EmbedAllFonts //true @@ -224,7 +224,7 @@ languagelevel 2 .setlanguagelevel /ColorConversionStrategy /LeaveColorUnchanged /ColorImageDownsampleType /Bicubic /ColorImageResolution 300 - /CompatibilityLevel 1.5 + /CompatibilityLevel 1.7 /CreateJobTicket //true /DoThumbnails //true /EmbedAllFonts //true @@ -660,8 +660,7 @@ currentdict /.pdfmarkparams .undef { pop } ifelse -} -bind def +} .bind executeonly def % must be bound and hidden for .forceput % Use the DSC processing hook to pass DSC comments to the driver. % We use a pseudo-parameter named DSC whose value is an array: diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_setpd.ps b/Master/tlpkg/tlgs/Resource/Init/gs_setpd.ps index 0fc72300f39..8fa7c51df15 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_setpd.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_setpd.ps @@ -95,27 +95,41 @@ level2dict begin { % Since setpagedevice doesn't create new device objects, % we must (carefully) reinstall the old parameters in % the same device. - .currentpagedevice pop //null currentdevice //null .trysetparams + .currentpagedevice pop //null currentdevice //null + { .trysetparams } .internalstopped + { + //null + } if dup type /booleantype eq { pop pop } - { % This should never happen! + { SETPDDEBUG { (Error in .trysetparams!) = pstack flush } if - cleartomark pop pop pop + {cleartomark pop pop pop} .internalstopped pop + % if resetting the entire device state failed, at least put back the + % security related key + currentdevice //null //false mark /.LockSafetyParams + currentpagedevice /.LockSafetyParams .knownget not + {systemdict /SAFER .knownget not {//false} } if + .putdeviceparamsonly /.installpagedevice cvx /rangecheck signalerror } ifelse pop pop % A careful reading of the Red Book reveals that an erasepage % should occur, but *not* an initgraphics. erasepage .beginpage - } bind def + } bind executeonly def /.uninstallpagedevice - { 2 .endpage { .currentnumcopies //false .outputpage } if + { + {2 .endpage { .currentnumcopies //false .outputpage } if} .internalstopped pop nulldevice } bind def (%grestorepagedevice) cvn - { .uninstallpagedevice grestore .installpagedevice + { + .uninstallpagedevice + grestore + .installpagedevice } bind def (%grestoreallpagedevice) cvn @@ -204,8 +218,8 @@ level2dict begin mark % First put the device's default page size in slot 0 % This satifies those that have devices built with a4 as the default - 0 mark /PageSize currentdevice /PageSize gsgetdeviceprop .dicttomark - + 0 mark /PageSize /GetDeviceParam .special_op + not {/setpagedevice .systemvar /configurationerror signalerror} if .dicttomark % Only populate the other entries if we aren't FIXEDMEDIA FIXEDMEDIA not { statusdict /.pagetypenames get { @@ -624,7 +638,7 @@ SETPDDEBUG { (Rolling back.) = pstack flush } if { 4 index 3 1 roll .forceput } { 3 index exch .undef } ifelse - } .bind + } .bind executeonly % must be bound and hidden for .forceput 7 { % For PageSize only, just impose the request. 1 index /PageSize eq { pop pop 1 index /PageSize 7 put } diff --git a/Master/tlpkg/tlgs/Resource/Init/gs_typ32.ps b/Master/tlpkg/tlgs/Resource/Init/gs_typ32.ps index 747196f48c8..b6600b0ce81 100644 --- a/Master/tlpkg/tlgs/Resource/Init/gs_typ32.ps +++ b/Master/tlpkg/tlgs/Resource/Init/gs_typ32.ps @@ -85,7 +85,7 @@ systemdict /.removeglyphs .undef { dup /FontType 32 .forceput dup /CharStrings 20 dict .forceput 1 index exch .buildfont32 exch pop -} bind def +} .bind executeonly def % must be bound and hidden for .forceput end % .cidfonttypes diff --git a/Master/tlpkg/tlgs/Resource/Init/pdf_base.ps b/Master/tlpkg/tlgs/Resource/Init/pdf_base.ps index 0218bab0a1e..a82a2a3adfc 100644 --- a/Master/tlpkg/tlgs/Resource/Init/pdf_base.ps +++ b/Master/tlpkg/tlgs/Resource/Init/pdf_base.ps @@ -28,14 +28,14 @@ pdfdict begin % Define the name interpretation dictionary for reading values. /valueopdict mark - (<<) cvn { mark } bind % don't push an actual mark! + (<<) cvn { mark } bind executeonly % don't push an actual mark! (>>) cvn { { .dicttomark } stopped { ( **** Error: File has an unbalanced >> \(close dictionary\).\n) pdfformaterror ( Output may be incorrect.\n) pdfformaterror } if - } bind - ([) cvn { mark } bind % ditto + } bind executeonly + ([) cvn { mark } bind executeonly % ditto (]) cvn dup load % /true true % see .pdfexectoken below % /false false % ibid. @@ -62,7 +62,7 @@ pdfdict begin pop } ifelse } if -} bind def +} bind executeonly def /name#escape % <post> <(#)> <pre> name#escape <string> { exch pop 1 index 2 () /SubFileDecode filter dup (x) readhexstring @@ -77,7 +77,7 @@ pdfdict begin exch 2 1 index length 2 sub getinterval } ifelse (#) search { name#escape } if concatstrings -} bind def +} bind executeonly def /num-chars-dict mark (0123456789-.) {dup} forall .dicttomark readonly def @@ -124,7 +124,7 @@ pdfdict begin pop pop count exch sub { pop } repeat % pop all the operands } if ( Output may be incorrect.\n) pdfformaterror -} bind def +} bind executeonly def currentdict /num-chars-dict .undef @@ -218,7 +218,7 @@ currentdict /num-chars-dict .undef } ifelse } ifelse } ifelse -} bind def +} bind executeonly def /PDFScanRules_true << /PDFScanRules //true >> def /PDFScanRules_null << /PDFScanRules //null >> def /.pdfrun { % <file> <opdict> .pdfrun - @@ -278,7 +278,7 @@ currentdict /num-chars-dict .undef .packtomark cvx % file { { {cnt <<>> file ... } loop } stopped /PDFsource PDFsource store {...} if} /PDFsource 3 -1 roll store % {...} exec -} bind def +} bind executeonly def % Execute a file, like .pdfrun, for a marking context. % This temporarily rebinds LocalResources and DefaultQstate. @@ -289,7 +289,7 @@ currentdict /num-chars-dict .undef 3 .execn /DefaultQstate exch store /LocalResources exch store -} bind def +} bind executeonly def % Get the depth of the PDF operand stack. The caller sets pdfemptycount % before calling .pdfrun or .pdfruncontext. It is initially set by @@ -298,7 +298,7 @@ currentdict /num-chars-dict .undef % of .pdfrun{context} which have not been checked for opstack depth. /.pdfcount { % - .pdfcount <count> count pdfemptycount sub -} bind def +} bind executeonly def % Read a token, but simply return false (no token read) in the case of an % error. This is messy because 'token' either may or may not pop its operand @@ -306,12 +306,12 @@ currentdict /num-chars-dict .undef % on whether the source is a file or a string. To avoid closing the file % check for '{' before trying 'token'. /token_nofail_dict mark - ( ) { dup ( ) readstring pop pop } bind + ( ) { dup ( ) readstring pop pop } bind executeonly (\t) 1 index (\r) 1 index (\n) 1 index (\000) 1 index - ({) { //null //true exit } bind + ({) { //null //true exit } bind executeonly .dicttomark def /token_nofail { % <file|string> token_nofail false @@ -341,7 +341,7 @@ currentdict /num-chars-dict .undef ifelse } ifelse } ifelse -} bind def +} bind executeonly def currentdict /token_nofail_dict .undef @@ -384,7 +384,7 @@ currentdict /token_nofail_dict .undef /GlobalObjects 20 dict def .setglobal /IsGlobal 0 string def -} bind def +} bind executeonly def % Grow the tables to a specified size. /growPDFobjects { % <minsize> growPDFobjects - @@ -401,7 +401,7 @@ currentdict /token_nofail_dict .undef dup IsGlobal exch string dup 3 1 roll copy pop /IsGlobal exch def } if pop -} bind def +} bind executeonly def % We represent an unresolved object reference by a procedure of the form % {obj# gen# resolveR}. This is not a possible PDF object, because PDF has @@ -429,7 +429,7 @@ currentdict /token_nofail_dict .undef } { % Else object is not executable. exch pop //true % Therefore it must have been resolved. } ifelse -} bind def +} bind executeonly def /oforce /exec load def /oget { % <array> <index> oget <object> % <dict> <key> oget <object> @@ -437,15 +437,15 @@ currentdict /token_nofail_dict .undef % object back into the referring slot. In order to support % PDF linearization, we no longer do this. get oforce -} bind def +} bind executeonly def /oforce_array { % <array> oforce_array <array> [ exch { oforce } forall ] -} bind def +} bind executeonly def /oforce_elems { % <array> oforce_elems <first> ... <last> { oforce } forall -} bind def +} bind executeonly def %% Safe recursion maintain a dicitonary in which we record all the object numbers %% of objects which we resolve. Whenever it resolves a new one, it checks all the @@ -485,11 +485,11 @@ currentdict /token_nofail_dict .undef << exch 2 index <<>> copy exch { 3 -1 roll exch safe_recursive 3 -1 roll oforce 3 1 roll exch } forall pop>> } if } ifelse -} bind def +} bind executeonly def /oforce_recursive { << >> exch safe_recursive exch pop -} bind def +} bind executeonly def % A null value in a dictionary is equivalent to an omitted key; % we must check for this specially. @@ -501,26 +501,26 @@ currentdict /token_nofail_dict .undef } { //false } ifelse -} bind def +} bind executeonly def % See /knownoget above. /oknown { % <dict> <key> oknown <bool> .knownget { oforce //null ne } { //false } ifelse -} bind def +} bind executeonly def /knownogetdict { % <dict> <key> knownogetdict <dict> true % <dict> <key> knownogetdict false //knownoget exec dup { 1 index type /dicttype ne { pop pop //false } if } if -} bind def +} bind executeonly def % PDF 1.1 defines a 'foreign file reference', but not its meaning. % Per the specification, we convert these to nulls. /F { % <file#> <object#> <generation#> F <object> % Some PDF 1.1 files use F as a synonym for f! .pdfcount 3 lt { f } { pop pop pop //null } ifelse -} bind def +} bind executeonly def % Verify the generation number for a specified object % Note: The values in Generations is the generation number plus 1. @@ -550,7 +550,7 @@ currentdict /token_nofail_dict .undef % Ghostscript tolerant of of bad generation numbers. //true } ifelse -} bind def +} bind executeonly def /R { % <object#> <generation#> R <object> %% Parameter validation; this should not be required but we have found files %% (Bug 697351) which are corrupted in ways that mean we see a 'R' in a stream @@ -567,7 +567,7 @@ currentdict /token_nofail_dict .undef ( **** Error: indirect object reference \(R\) encountered with invalid arguments.) pdfformaterror ( Output may be incorrect.\n) pdfformaterror } ifelse -} bind def +} bind executeonly def % If we encounter an object definition while reading sequentially, % we just store it away and keep going. @@ -578,7 +578,7 @@ currentdict /token_nofail_dict .undef /obj { % <object#> <generation#> obj <object> PDFfile objopdict .pdfrun -} bind def +} bind executeonly def /endobj { % <object#> <generation#> <object> endobj <object> @@ -631,19 +631,19 @@ currentdict /token_nofail_dict .undef pop pop //null } ifelse }ifelse -} bind def +} bind executeonly def % When resolving an object reference in an object stream, we stop at % the end of file. Note: Objects in an object stream do not have either % a starting 'obj' or and ending 'endobj'. /resolveobjstreamopdict mark valueopdict { } forall - (%%EOF) cvn { exit } bind + (%%EOF) cvn { exit } bind executeonly /endobj { % bug 689795 ( **** Error: Objects in an object stream should not have 'endobj'.\n) pdfformaterror ( Output may be incorrect.\n) pdfformaterror - } bind + } bind executeonly .dicttomark readonly def % Note: This version of this function is not currently being used. @@ -722,7 +722,7 @@ currentdict /token_nofail_dict .undef Objects exch 2 index exch put % Put object into Objects array } if pop pop pop pop % Clear stack -} bind def +} bind executeonly def /no_debug_dict << /PDFDEBUG //false @@ -792,7 +792,7 @@ currentdict /token_nofail_dict .undef pop % Remove loop index } for pop pop pop pop pop % Remove strm# objstream, N, (obj#], and [objects] -} bind def +} bind executeonly def currentdict /no_debug_dict undef @@ -803,26 +803,26 @@ currentdict /no_debug_dict undef ( **** Error: Encountered 'xref' while expecting 'endobj'.\n) pdfformaterror ( Treating this as a missing 'endobj', output may be incorrect.\n) pdfformaterror endobj exit - } bind + } bind executeonly /endstream { endobj exit } bind /endobj { endobj exit } bind /endjobj { % Bug 689876. ( **** Error: Operator 'endobj' is misspelled as 'endjobj'.\n) pdfformaterror ( Output may be incorrect.\n) pdfformaterror endobj exit - } bind + } bind executeonly /enbobj { % Bug 690397. ( **** Error: Operator 'endobj' is misspelled as 'enbobj'.\n) pdfformaterror ( Output may be incorrect.\n) pdfformaterror endobj exit - } bind + } bind executeonly /obj { % OmniForm generates PDF file with endobj missing in some % objects. AR ignores this. So we have to do it too. ( **** Error: Encountered 'obj' while expecting 'endobj'.\n) pdfformaterror ( Treating this as a missing 'endobj', output may be incorrect.\n) pdfformaterror pop pop endobj exit - } bind + } bind executeonly .dicttomark readonly def /resolveR { % <object#> <generation#> resolveR <object> @@ -896,7 +896,7 @@ currentdict /no_debug_dict undef } {exch pop} ifelse -} bind def +} bind executeonly def % ================================ Streams ================================ % @@ -1010,11 +1010,11 @@ currentdict /no_debug_dict undef } if } ifelse cvx -} bind def +} bind executeonly def /endstream { exit -} bind def +} bind executeonly def % Contrary to the published PDF (1.3) specification, Acrobat Reader % accepts abbreviated filter names everywhere, not just for in-line images, @@ -1053,7 +1053,7 @@ currentdict /no_debug_dict undef % No filters: ignore parameters, if any. pop //null { } } ifelse -} bind def +} bind executeonly def /filtername { % <filtername> filtername <filtername'> //unabbrevfilterdict 1 index .knownget { exch pop } if dup /Filter resourcestatus { pop pop } { @@ -1067,7 +1067,7 @@ currentdict /no_debug_dict undef % provide a filter that returns EOF (no data) /.EOFDecode } ifelse -} bind def +} bind executeonly def /pdf_rules_dict << /PDFRules //true >> readonly def @@ -1084,7 +1084,7 @@ currentdict /no_debug_dict undef //pdf_rules_dict exch } ifelse } if -} bind def +} bind executeonly def currentdict /pdf_rules_dict undef @@ -1114,7 +1114,7 @@ currentdict /pdf_rules_dict undef } ifelse } ifelse forall exch pop -} bind def +} bind executeonly def % JBIG2 streams have an optional 'globals' stream obj for % sharing redundant data between page images. Here we resolve @@ -1136,7 +1136,7 @@ currentdict /pdf_rules_dict undef 1 index exch /.jbig2globalctx exch put } if -} bind def +} bind executeonly def % Resolve a stream dictionary to a PostScript stream. % Streams with no filters require special handling: @@ -1197,17 +1197,17 @@ currentdict /pdf_rules_dict undef } ifelse % Stack: readdata? dict file exch pop exch pop -} bind def +} bind executeonly def % ============================ Name/number trees ============================ % /nameoget { % <nametree> <key> nameoget <obj|null> exch /Names exch .treeget -} bind def +} bind executeonly def /numoget { % <numtree> <key> numoget <obj|null> exch /Nums exch .treeget -} bind def +} bind executeonly def /.treeget { % <key> <leafkey> <tree> .treeget <obj|null> dup /Kids knownoget { @@ -1215,7 +1215,7 @@ currentdict /pdf_rules_dict undef } { exch oget .leafget } ifelse -} bind def +} bind executeonly def /.branchget { % <key> <leafkey> <kids> .branchget <obj|null> dup length 0 eq { @@ -1237,7 +1237,7 @@ currentdict /pdf_rules_dict undef } ifelse } ifelse } ifelse -} bind def +} bind executeonly def /.leafget { % <key> <pairs> .leafget <obj|null> dup length 2 eq { @@ -1249,7 +1249,57 @@ currentdict /pdf_rules_dict undef 3 index gt { 0 exch } { 1 index length 1 index sub } ifelse getinterval .leafget } ifelse -} bind def +} bind executeonly def + +% The following variants return tree entry whose key is closest but +% less or equal to the given key. + +/numogetle { % <numtree> <key> numogetle <key obj true|false> + exch /Nums exch .treegetle +} bind executeonly def + +/.treegetle { % <key> <leafkey> <tree> .treegetle <key obj true|false> + dup /Kids knownoget { + exch pop .branchgetle + } { + exch oget .leafgetle + } ifelse +} bind executeonly def + +/.branchgetle { % <key> <leafkey> <kids> .branchgetle <key obj true|false> + dup length 0 eq { + pop pop pop false + } { + dup length -1 bitshift 2 copy oget + dup /Limits oget aload pop + % Stack: key leafkeyb kids mid kids[mid] min max + 6 index ge { + 5 index le { + exch pop exch pop .treegetle + } { + pop 0 exch getinterval .branchgetle + } ifelse + } { + pop 2 index length 2 index sub 1 gt { + pop 1 index length 1 index sub getinterval .branchgetle + } { + exch pop exch pop .treegetle + } ifelse + } ifelse + } ifelse +} bind executeonly def + +/.leafgetle { % <key> <pairs> .leafget <obj|null> + dup length 2 eq { + dup 0 get + 2 index le { exch pop aload pop true } { pop pop false } ifelse + } { + dup length -1 bitshift -2 and 2 copy oget + % Stack: key pairs mid pairs[mid] + 3 index gt { 0 exch } { 1 index length 1 index sub } ifelse + getinterval .leafgetle + } ifelse +} bind executeonly def end % pdfdict .setglobal diff --git a/Master/tlpkg/tlgs/Resource/Init/pdf_draw.ps b/Master/tlpkg/tlgs/Resource/Init/pdf_draw.ps index e8ca213bbae..d1b6ac909d3 100644 --- a/Master/tlpkg/tlgs/Resource/Init/pdf_draw.ps +++ b/Master/tlpkg/tlgs/Resource/Init/pdf_draw.ps @@ -68,14 +68,14 @@ pdfdict begin % Stack: filepos fndict data exch dup /DataSource 4 -1 roll put exch PDFfile exch setfileposition -} bdef +} bind executeonly def /.resolvefn2 { dup length dict .copydict dup /C0 2 copy knownoget { put } { pop pop } ifelse dup /C1 2 copy knownoget { put } { pop pop } ifelse dup /N 2 copy knownoget { put } { pop pop } ifelse -} bdef +} bind executeonly def /.resolvefn3 { dup length dict .copydict @@ -85,7 +85,7 @@ pdfdict begin oforce .resolvefn } forall counttomark -1 roll astore exch pop put -} bdef +} bind executeonly def /.resolvefn4 { PDFfile fileposition exch % filepos fndict @@ -102,31 +102,31 @@ pdfdict begin .bind 1 index /Function 3 -1 roll put exch PDFfile exch setfileposition -} bdef +} bind executeonly def /.resolvefn { % <fndict> .resolvefn <fndict'> dup length dict .copydict dup /Domain 2 copy knownoget { put } { pop pop } ifelse dup /Range 2 copy knownoget { put } { pop pop } ifelse dup /FunctionType oget //fnrdict exch get exec -} bdef +} bind executeonly def /resolvefunction { % <fndict> resolvefunction <function> .resolvefn PDFDEBUG { pdfdict /PDFSTEPcount .knownget { 1 le } { //true } ifelse { (%Function: ) print dup === flush } if } if -} bdef +} bind executeonly def /resolvefnproc { % <fndict> resolvefnproc <proc> resolvefunction .buildfunction -} bdef +} bind executeonly def /resolveidfnproc { % <fndict> resolveidfnproc <proc> dup /Identity eq { pop { } } { resolvefnproc } ifelse -} bdef +} bind executeonly def /resolvedefaultfnproc { % <fndict> <default> resolved'fnproc <proc> 1 index /Default eq { exch pop } { pop resolveidfnproc } ifelse -} bdef +} bind executeonly def %% A BBox where width or height (or both) is 0 should still paint one pixel %% See the ISO 32000-2:2017 spec, section 8.7.4.3, p228 'BBox' and 8.7.3.1 @@ -140,7 +140,7 @@ pdfdict begin 2 index 0.000001 add exch pop }if 5 -1 roll astore -}bind def +}bind executeonly def % ---------------- Shadings ---------------- % @@ -159,25 +159,25 @@ pdfdict begin } repeat 5 -1 roll astore - } bind + } bind executeonly /BBox { dup dup dup aload pop normrect_elems 5 -1 roll astore FixPatternBBox - } bind + } bind executeonly /ColorSpace { resolvecolorspace - } bind + } bind executeonly /Function { dup type /dicttype eq { resolvefunction } { [ exch { oforce resolvefunction } forall ] } ifelse - } bind + } bind executeonly /Extend { mark exch {oforce} forall ] - } bind + } bind executeonly .dicttomark readonly def /resolveshading { % <shadingstream> resolveshading <shading> @@ -201,7 +201,7 @@ pdfdict begin exch PDFfile exch setfileposition dup 3 1 roll /.shading_dict exch put } ifelse -} bdef +} bind executeonly def /resolvesh { % <shname> resolvesh <shading> % <shname> resolvesh <null> Page /Shading rget { @@ -218,7 +218,7 @@ pdfdict begin } { //null }ifelse -} bdef +} bind executeonly def % ---------------- Halftones ---------------- % @@ -229,7 +229,7 @@ pdfdict begin } { 1 sub dup mul exch 1 sub dup mul add 1 sub } ifelse - } bind + } bind executeonly /Diamond { abs exch abs 2 copy add .75 le { dup mul exch dup mul add 1 exch sub @@ -240,7 +240,7 @@ pdfdict begin 1 sub dup mul exch 1 sub dup mul add 1 sub } ifelse } ifelse - } bind + } bind executeonly /Ellipse { abs exch abs 2 copy 3 mul exch 4 mul add 3 sub dup 0 lt { pop dup mul exch .75 div dup mul add 4 div 1 exch sub @@ -252,27 +252,27 @@ pdfdict begin .5 exch sub exch pop exch pop } ifelse } ifelse - } bind - /EllipseA { dup mul .9 mul exch dup mul add 1 exch sub } bind - /InvertedEllipseA { dup mul .9 mul exch dup mul add 1 sub } bind - /EllipseB { dup 5 mul 8 div mul exch dup mul exch add sqrt 1 exch sub } bind - /EllipseC { dup mul .9 mul exch dup mul add 1 exch sub } bind - /InvertedEllipseC { dup mul .9 mul exch dup mul add 1 sub } bind - /Line { exch pop abs neg } bind - /LineX { pop } bind - /LineY { exch pop } bind - /Square { abs exch abs 2 copy lt { exch } if pop neg } bind - /Cross { abs exch abs 2 copy gt { exch } if pop neg } bind - /Rhomboid { abs exch abs 0.9 mul add 2 div } bind - /DoubleDot { 2 {360 mul sin 2 div exch } repeat add } bind - /InvertedDoubleDot { 2 {360 mul sin 2 div exch } repeat add neg } bind - /SimpleDot { dup mul exch dup mul add 1 exch sub } bind - /InvertedSimpleDot { dup mul exch dup mul add 1 sub } bind - /CosineDot { 180 mul cos exch 180 mul cos add 2 div } bind - /Double { exch 2 div exch 2 { 360 mul sin 2 div exch } repeat add } bind + } bind executeonly + /EllipseA { dup mul .9 mul exch dup mul add 1 exch sub } bind executeonly + /InvertedEllipseA { dup mul .9 mul exch dup mul add 1 sub } bind executeonly + /EllipseB { dup 5 mul 8 div mul exch dup mul exch add sqrt 1 exch sub } bind executeonly + /EllipseC { dup mul .9 mul exch dup mul add 1 exch sub } bind executeonly + /InvertedEllipseC { dup mul .9 mul exch dup mul add 1 sub } bind executeonly + /Line { exch pop abs neg } bind executeonly + /LineX { pop } bind executeonly + /LineY { exch pop } bind executeonly + /Square { abs exch abs 2 copy lt { exch } if pop neg } bind executeonly + /Cross { abs exch abs 2 copy gt { exch } if pop neg } bind executeonly + /Rhomboid { abs exch abs 0.9 mul add 2 div } bind executeonly + /DoubleDot { 2 {360 mul sin 2 div exch } repeat add } bind executeonly + /InvertedDoubleDot { 2 {360 mul sin 2 div exch } repeat add neg } bind executeonly + /SimpleDot { dup mul exch dup mul add 1 exch sub } bind executeonly + /InvertedSimpleDot { dup mul exch dup mul add 1 sub } bind executeonly + /CosineDot { 180 mul cos exch 180 mul cos add 2 div } bind executeonly + /Double { exch 2 div exch 2 { 360 mul sin 2 div exch } repeat add } bind executeonly /InvertedDouble { exch 2 div exch 2 { 360 mul sin 2 div exch } repeat add neg - } bind + } bind executeonly .dicttomark readonly def /.resolveht1 { @@ -309,13 +309,13 @@ pdfdict begin } if } ifelse } forall .dicttomark -} bdef +} bind executeonly def /.resolveht5 { mark exch { oforce dup type /dicttype eq { resolvehalftone } if } forall .dicttomark -} bdef +} bind executeonly def /.resolveht6 { %% resolvestream will reposition PDFfile. If we are in the middle @@ -332,7 +332,7 @@ pdfdict begin 1 index exch /TransferFunction exch put } if exch PDFfile exch setfileposition -} bdef +} bind executeonly def /htrdict mark 1 //.resolveht1 @@ -357,15 +357,15 @@ currentdict /.resolveht6 undef ( Output may be incorrect.\n) pdfformaterror gsave .setdefaulthalftone currenthalftone grestore } ifelse -} bdef +} bind executeonly def % ---------------- Graphics state management ---------------- % /cmmatrix matrix def drawopdict begin % Graphics state stack - /q { q } def - /Q { Q } def + /q { q } executeonly def + /Q { Q } executeonly def % Graphics state setting /cm { //cmmatrix astore .getpath @@ -380,25 +380,25 @@ drawopdict begin currentdict /qTextSaveMatrix .knownget { //cmmatrix exch dup concatmatrix pop } if - } bdef + } bind executeonly def - /i { 1 .min setflat } bdef + /i { 1 .min setflat } bind executeonly def /J { setlinecap } bind 0 get def /d { setdash } bind 0 get def /j { setlinejoin } bind 0 get def /w { setlinewidth } bind 0 get def - /M { 1 .max setmiterlimit } bdef - /gs { gs } def + /M { 1 .max setmiterlimit } bind executeonly def + /gs { gs } executeonly def end % Each entry in this dictionary is % <gsres> <value> -proc- <gsres> /gsbg { /BGDefault load resolvedefaultfnproc setblackgeneration -} bdef +} bind executeonly def /gsucr { /UCRDefault load resolvedefaultfnproc setundercolorremoval -} bdef +} bind executeonly def /gstr { dup type /arraytype eq { { oforce /TRDefault load resolvedefaultfnproc } forall @@ -406,17 +406,17 @@ end } { /TRDefault load resolvedefaultfnproc settransfer } ifelse -} bdef +} bind executeonly def /gsparamdict mark - /SA { setstrokeadjust } - /OP { 1 index /op known not { dup op } if OP } + /SA { setstrokeadjust } executeonly + /OP { 1 index /op known not { dup op } if OP } executeonly % The PDF 1.3 specification says that the name /Default is only % recognized for {BG,UCR,TR}2. However, PDF 1.3 files produced % by Adobe Acrobat Distiller 4.0 for Windows use the name /Default % with the older keys, so we have to implement this. - /BG { 1 index /BG2 known { pop } { gsbg } ifelse } - /UCR { 1 index /UCR2 known { pop } { gsucr } ifelse } - /TR { 1 index /TR2 known { pop } { gstr } ifelse } + /BG { 1 index /BG2 known { pop } { gsbg } ifelse } executeonly + /UCR { 1 index /UCR2 known { pop } { gsucr } ifelse } executeonly + /TR { 1 index /TR2 known { pop } { gstr } ifelse } executeonly % Some functions used to implement phases of HT and HTP /sethalftones { @@ -425,10 +425,10 @@ end } { resolvehalftone sethalftone } ifelse - } bdef + } bind executeonly def /sethalftonephases { /sethalftonephase where { pop aload pop sethalftonephase } { pop } ifelse - } bdef + } bind executeonly def /HT { dup sethalftones .swapcolors sethalftones .swapcolors @@ -442,51 +442,51 @@ end /dup /Default eq { oforce gsparamdict /TR get exec } { pop } ifelse } if } ifelse - } + } executeonly /HTP { % HTP may be present even if this isn't a DPS interpreter. dup sethalftonephases .swapcolors sethalftonephases .swapcolors - } + } executeonly % PDF 1.3 % The font is an indirect reference, not a resource name /Font { aload pop exch oforce resourcefont exch Tf } - /LW { setlinewidth } - /LC { setlinecap } - /LJ { setlinejoin } - /ML { 1 .max setmiterlimit } - /D { aload pop setdash } - /RI { ri } - /op { op } - /OPM { OPM } - /BG2 { gsbg } - /UCR2 { gsucr } - /TR2 { gstr } - /FL { 1 .min setflat } + /LW { setlinewidth } executeonly + /LC { setlinecap } executeonly + /LJ { setlinejoin } executeonly + /ML { 1 .max setmiterlimit } executeonly + /D { aload pop setdash } executeonly + /RI { ri } executeonly + /op { op } executeonly + /OPM { OPM } executeonly + /BG2 { gsbg } executeonly + /UCR2 { gsucr } executeonly + /TR2 { gstr } executeonly + /FL { 1 .min setflat } executeonly /SM { % SM may be present even if this is only a Level 2 interpreter. /setsmoothness where { pop setsmoothness } { pop } ifelse - } + } executeonly % PDF 1.4 % All of these require the "transparency" feature in the interpreter. - /ca { ca } - /CA { CA } + /ca { ca } executeonly + /CA { CA } executeonly /SMask { {gssmask} PDFSTOPONERROR { exec //false } { stopped } ifelse { pop (\n **** Error in SMask during ExtGState. Ignoring the mask, output may be incorrect.\n) pdfformaterror } if - } - /AIS { AIS } - /BM { BM } - /TK { TK } - /UseBlackPtComp { UseBlackPtComp } + } executeonly + /AIS { AIS } executeonly + /BM { BM } executeonly + /TK { TK } executeonly + /UseBlackPtComp { UseBlackPtComp } executeonly /HTO { % PDF 2.0, supposed to be 'similar' to halftone phase but using a different % co-ordiate system. Treat the same for now and fix if anyone ever complains. aload pop transform cvi exch cvi exch 2 array astore dup sethalftonephases .swapcolors sethalftonephases .swapcolors - } + } executeonly .dicttomark readonly def /gs { % <gsres> gs - Page /ExtGState rget { @@ -496,7 +496,7 @@ end oforce exch gsparamdict exch .knownget { exec } { pop } ifelse } forall pop } if -} bdef +} bind executeonly def % ------ Transparency support ------ % @@ -583,7 +583,7 @@ end exit } loop SMask -} bdef +} bind executeonly def % Functions specific to the Device* colorspaces to force the switch to % the Device* colorspace so that the SMask will not get a CIEBased* colorspace @@ -592,7 +592,7 @@ end /forceDefaultCS << { currentcolorspace setcolorspace % this will switch to Device colorspace - } bind + } bind executeonly /DeviceGray exch /DeviceRGB 1 index /DeviceCMYK 1 index @@ -664,7 +664,7 @@ def setmatrix end % restore colorspace, color and ExtGState (end) .currentSMask /Processed //true put % special setting to tell us it has been rendered -} bdef +} bind executeonly def % Paint a Form+Group XObject, either for a transparency mask or for a Do. /.execgroup { % [colour values] <colour space> <resdict> <stream> .execgroup - @@ -699,7 +699,7 @@ def .pdfruncontext end grestore /pdfemptycount exch store -} bdef +} bind executeonly def /.beginformgroup { % groupdict bbox .beginformgroup - exch mark exch % bbox mark groupdict @@ -710,7 +710,7 @@ def % Stack: bbox paramdict exch aload pop .begintransparencygroup -} bdef +} bind executeonly def % .paintgroupform implements the Form PaintProc in the case where the % Form XObject dictionary includes a Group key. See .paintform below. @@ -725,7 +725,7 @@ def .beginformgroup .execgroup .endtransparencygroup -} bdef +} bind executeonly def % Make an ImageType 103 (soft-masked) image. /makesoftmaskimage { % <datasource> <imagemask> <SMask> makesoftmaskimage @@ -759,7 +759,7 @@ def .currentalphaisshape { /ShapeMaskDict } { /OpacityMaskDict } ifelse exch def /ColorSpace DataDict /ColorSpace get def -} bdef +} bind executeonly def % ---------------- Color setting ---------------- % @@ -769,17 +769,17 @@ def % The keys here are resolved (PostScript, not PDF) color space names. /csncompdict 9 dict begin - /DeviceGray { pop 1 } bdef - /DeviceRGB { pop 3 } bdef - /DeviceCMYK { pop 4 } bdef + /DeviceGray { pop 1 } bind executeonly def + /DeviceRGB { pop 3 } bind executeonly def + /DeviceCMYK { pop 4 } bind executeonly def /CIEBasedA //DeviceGray def /CIEBasedABC //DeviceRGB def /CalGray //DeviceGray def /CalRGB //DeviceRGB def /Lab //DeviceRGB def - /ICCBased { 1 oget /N oget } bdef + /ICCBased { 1 oget /N oget } bind executeonly def /Separation //DeviceGray def - /DeviceN { 1 oget length } bdef + /DeviceN { 1 oget length } bind executeonly def /Indexed //DeviceGray def currentdict end readonly def @@ -787,7 +787,7 @@ currentdict end readonly def /csncomp { dup dup type /arraytype eq { 0 oget } if //csncompdict exch get exec -} bdef +} bind executeonly def currentdict /csncompdict undef @@ -832,26 +832,26 @@ currentdict /csncompdict undef } { pop % remove colorspace dictionary } ifelse -} bdef +} bind executeonly def /csrdict 13 dict begin - /DeviceGray { } bdef - /DeviceRGB { } bdef - /DeviceCMYK { } bdef + /DeviceGray { } bind executeonly def + /DeviceRGB { } bind executeonly def + /DeviceCMYK { } bind executeonly def - /CalGray { 1 oget [ exch /CalGray exch ] } bdef - /CalRGB { 1 oget [ exch /CalRGB exch ] } bdef - /Lab { 1 oget [ exch /Lab exch ] } bdef + /CalGray { 1 oget [ exch /CalGray exch ] } bind executeonly def + /CalRGB { 1 oget [ exch /CalRGB exch ] } bind executeonly def + /Lab { 1 oget [ exch /Lab exch ] } bind executeonly def /CalCMYK { pop /DeviceCMYK % not defined by Adobe - } bdef + } bind executeonly def /ICCBased { dup 1 get type /dicttype ne { % don't resolve more than once ICCBased-resolve } if - } bdef + } bind executeonly def /Separation { aload pop exch oforce resolvecolorspace @@ -863,7 +863,7 @@ currentdict /csncompdict undef 3 -1 roll oforce 3 1 roll 4 array astore - } bdef + } bind executeonly def /DeviceN { [ exch aload pop ] % Copy into a new array @@ -890,7 +890,7 @@ currentdict /csncompdict undef } if 4 exch put % Put resolved or new attributes dict } if - } bdef + } bind executeonly def /Indexed { aload pop @@ -959,7 +959,7 @@ currentdict /csncompdict undef } if } if } if pop - } bdef + } bind executeonly def /I { % Bug 689815 ( **** Error: The name /Indexed cannot be abbreviated to /I in the color space\n) @@ -967,7 +967,7 @@ currentdict /csncompdict undef ( Output may be incorrect.\n) pdfformaterror dup 0 /Indexed put //Indexed exec - } bdef + } bind executeonly def /Pattern { dup type /nametype ne { @@ -976,7 +976,7 @@ currentdict /csncompdict undef /Pattern exch 2 array astore } if } if - } bdef + } bind executeonly def currentdict end readonly def @@ -984,7 +984,7 @@ currentdict end readonly def % <csname> cssubst false dup resolvecolorspace dup 1 index ne { exch pop //true } { pop pop //false } ifelse -} bdef +} bind executeonly def /csnames mark /DeviceGray dup /DeviceRGB dup /DeviceCMYK dup /Pattern dup @@ -1012,7 +1012,7 @@ currentdict end readonly def } ifelse } ifelse } ifelse -} bdef +} bind executeonly def /resolvecolorspace { % <cspace> resolvecolorspace <cspace'> dup type /dicttype eq { @@ -1043,7 +1043,7 @@ currentdict end readonly def } ifelse } ifelse } if -} bdef +} bind executeonly def /scresolve { % <c0> ... scresolve <multi> % We can't really make sc[n] and SC[N] work, because @@ -1061,7 +1061,7 @@ currentdict end readonly def } { .pdfcount 1 gt } ifelse -} bdef +} bind executeonly def %% Bug #696017 When we begin a text block, we switch to a special set of marking operations %% for paths, these ops don't use the current CTM, but the 'SavedTextMatrix', in order to @@ -1158,19 +1158,24 @@ currentdict end readonly def Q PDFDEBUG { pdfdict /PDFSTEPcount .knownget { 1 le } { //true } ifelse { (%End PaintProc) print dup === flush } if } if PDFfile exch setfileposition -} bdef +} bind executeonly def /.pdfpaintproc { %% Get the /m from pdfopdict (must be present) %% and check its a packedarray pdfopdict /m get dup type /packedarraytype eq { - %% get the initial element of the packedarray - %% and check its a name - 0 get dup type /nametype eq { - %% If the name is inside_text_m then we are in a text block - /inside_text_m eq + %% The non-text version of /m is executeonly, so if we can't read it, its not a text block. + dup rcheck { + %% get the initial element of the packedarray + %% and check its a name + 0 get dup type /nametype eq { + %% If the name is inside_text_m then we are in a text block + /inside_text_m eq + }{ + pop false + } ifelse }{ - pop false + pop false } ifelse }{ pop false @@ -1184,7 +1189,7 @@ currentdict end readonly def { switch_to_text_marking_ops } if -}bdef +}bind executeonly def /resolvepattern { % <patternstreamdict> resolvepattern <patterndict> % Don't do the resolvestream now: just capture the data @@ -1223,7 +1228,7 @@ currentdict end readonly def dup /BBox 2 copy knownoget { normrect FixPatternBBox put } { pop pop } ifelse dup /.pattern_uses_transparency 1 index patternusestransparency put PDFDEBUG { pdfdict /PDFSTEPcount .knownget { 1 le } { //true } ifelse { (%Pattern: ) print dup === flush } if } if -} bdef +} bind executeonly def /ignore_color_op ( **** Error: Ignoring a color operation in a cached context.\n Output may be incorrect.\n) readonly def @@ -1233,28 +1238,28 @@ drawopdict begin } { /DeviceGray cssubst { cs sc1 } { g } ifelse } ifelse - } bdef + } bind executeonly def /rg { .incachedevice { pop pop pop //ignore_color_op pdfformaterror } { /DeviceRGB cssubst { cs sc* } { rg } ifelse } ifelse - } bdef + } bind executeonly def /k { .incachedevice { pop pop pop pop //ignore_color_op pdfformaterror } { k } ifelse - } bdef + } bind executeonly def /cs { .incachedevice { pop //ignore_color_op pdfformaterror } { csresolve { cs } if } ifelse - } bdef + } bind executeonly def /sc { .incachedevice { .pdfcount { pop } repeat //ignore_color_op pdfformaterror @@ -1266,7 +1271,7 @@ drawopdict begin { sc*_and_set } { sc1_and_set } ifelse } ifelse } ifelse - } bdef + } bind executeonly def /scn /sc load def @@ -1275,35 +1280,35 @@ drawopdict begin } { /DeviceGray cssubst { CS SC1 } { G } ifelse } ifelse - } bdef + } bind executeonly def /RG { .incachedevice { pop pop pop //ignore_color_op pdfformaterror } { /DeviceRGB cssubst { CS SC* } { RG } ifelse } ifelse - } bdef + } bind executeonly def /K { .incachedevice { pop pop pop pop //ignore_color_op pdfformaterror } { K } ifelse - } bdef + } bind executeonly def /CS { .incachedevice { pop //ignore_color_op pdfformaterror } { csresolve { CS } if } ifelse - } bdef + } bind executeonly def /ri { .incachedevice { pop //ignore_color_op pdfformaterror } { ri } ifelse - } bdef + } bind executeonly def /SC { .incachedevice { .pdfcount { pop } repeat //ignore_color_op pdfformaterror @@ -1315,7 +1320,7 @@ drawopdict begin { SC*_and_set } { SC1_and_set } ifelse }ifelse } ifelse - } bdef + } bind executeonly def /SCN /SC load def end @@ -1326,36 +1331,36 @@ currentdict /ignore_color_op undef drawopdict begin % Path construction - /m { { moveto } stopped { count pdfemptycount sub 2 .min { pop } repeat 0 0 moveto } if } bdef - /l { { lineto } stopped { count pdfemptycount sub 2 .min { pop } repeat } if } bdef - /c { { curveto } stopped { count pdfemptycount sub 6 .min { pop } repeat } if } bdef + /m { { moveto } stopped { count pdfemptycount sub 2 .min { pop } repeat 0 0 moveto } if } bind executeonly def + /l { { lineto } stopped { count pdfemptycount sub 2 .min { pop } repeat } if } bind executeonly def + /c { { curveto } stopped { count pdfemptycount sub 6 .min { pop } repeat } if } bind executeonly def /v { count pdfemptycount sub 4 ge { { currentpoint 6 2 roll curveto } stopped { count pdfemptycount sub 6 .min { pop } repeat } if } { count pdfemptycount sub { pop } repeat } ifelse - } bdef - /y { { 2 copy curveto } stopped { count pdfemptycount sub 6 .min { pop } repeat } if } bdef + } bind executeonly def + /y { { 2 copy curveto } stopped { count pdfemptycount sub 6 .min { pop } repeat } if } bind executeonly def /re { 4 2 roll moveto exch dup 0 rlineto 0 3 -1 roll rlineto neg 0 rlineto closepath - } bdef + } bind executeonly def /h { closepath } bind 0 get def % Path painting and clipping - /n { n } def - /S { S } def - /s { s } def - /f { f } def - /f* { f* } def - /B { B } def - /b { b } def - /B* { B* } def - /b* { b* } def - /W { W } def - /W* { W* } def + /n { n } executeonly def + /S { S } executeonly def + /s { s } executeonly def + /f { f } executeonly def + /f* { f* } executeonly def + /B { B } executeonly def + /b { b } executeonly def + /B* { B* } executeonly def + /b* { b* } executeonly def + /W { W } executeonly def + /W* { W* } executeonly def /sh_save 1 array def /sh_group << /Subtype /Group /Isolated //true >> readonly def @@ -1365,15 +1370,14 @@ drawopdict begin { dup /.shading .knownget { exch pop } { - .buildshading + .buildshading_and_shfill } ifelse - .shfill } stopped { pop ( **** Error: Ignoring invalid smooth shading object, output may be incorrect.\n) pdfformaterror } if - } bdef + } bind executeonly def /sh { OFFlevels length 0 eq { @@ -1417,43 +1421,43 @@ drawopdict begin } { pop } ifelse - } bdef + } bind executeonly def currentdict dup /sh_save undef /sh_group undef end % ---------------- XObjects ---------------- % /xobjectprocs mark % <dict> -proc- - - /Image { DoImage } - /Form { DoForm } - /PS { DoPS } + /Image { DoImage } executeonly + /Form { DoForm } executeonly + /PS { DoPS } executeonly .dicttomark readonly def % Note that the keys in defaultdecodedict are resolved (PostScript, not PDF) % color space names. /defaultdecodedict mark - /DeviceGray { pop //01_1 } bind - /DeviceRGB { pop //01_3 } bind - /DeviceCMYK { pop //01_4 } bind - /CIEBasedA { 1 get /RangeA knownoget not { //01_1 } if } bind - /CIEBasedABC { 1 get /RangeABC knownoget not { //01_3 } if } bind - /CalGray { pop //01_1 } bind - /CalRGB { pop //01_3 } bind - /Lab { 1 get /Range knownoget not { [-100 100 -100 100] } {aload pop 0 100 6 2 roll 6 array astore}ifelse } bind + /DeviceGray { pop //01_1 } bind executeonly + /DeviceRGB { pop //01_3 } bind executeonly + /DeviceCMYK { pop //01_4 } bind executeonly + /CIEBasedA { 1 get /RangeA knownoget not { //01_1 } if } bind executeonly + /CIEBasedABC { 1 get /RangeABC knownoget not { //01_3 } if } bind executeonly + /CalGray { pop //01_1 } bind executeonly + /CalRGB { pop //01_3 } bind executeonly + /Lab { 1 get /Range knownoget not { [-100 100 -100 100] } {aload pop 0 100 6 2 roll 6 array astore}ifelse } bind executeonly /ICCBased { 1 oget dup /Range knownoget { exch pop }{ /N get [ exch {0 1} repeat ] readonly } ifelse - } bind - /Separation { pop //01_1 } bind + } bind executeonly + /Separation { pop //01_1 } bind executeonly /DeviceN { 1 oget length [ exch {0 1} repeat ] readonly - } bind + } bind executeonly /Indexed { pop [ 0 1 BitsPerComponent bitshift 1 sub ] - } bind + } bind executeonly .dicttomark readonly def /checkaltimage { % <resdict> checkaltimage <resdict[']> @@ -1472,23 +1476,23 @@ end } forall } if } if -} bdef +} bind executeonly def % <string> <index> getu16 <integer> /getu16 { 2 copy get 8 bitshift 3 1 roll 1 add get add -} bind def +} bind executeonly def % <string> <index> getu32 <integer> /getu32 { 2 copy getu16 16 bitshift 3 1 roll 2 add getu16 add -} bind def +} bind executeonly def /jp2_csp_dict mark 12 { /DeviceCMYK } % CMYK 14 { [ /Lab << /WhitePoint [ 0.9505 1 1.0890 ] readonly >> ] } % LAB, WhitePoint == D65 - 16 { /sRGBICC /ColorSpace findresource } bind - 17 { /sGrayICC /ColorSpace findresource } bind + 16 { /sRGBICC /ColorSpace findresource } bind executeonly + 17 { /sGrayICC /ColorSpace findresource } bind executeonly 18 3 index % YCC is converted to RGB % 19 % CIEJab not supportec by PDF 1.7 % 20 % e-sRGB @@ -1502,7 +1506,7 @@ end /jp2h { % descend into a sub-stream, don't return. () /SubFileDecode filter 0 - } bdef + } bind executeonly def /ihdr { 14 sub % file len-14 @@ -1519,7 +1523,7 @@ end dup 12 eq { pop 16 } if /BitsPerComponent exch def % file len-14 } {pop} ifelse - } bdef + } bind executeonly def %% if the ihdr has a BPC of 255 then we get a bpcc box which %% gives the bpc for each component individually. We cannot @@ -1540,7 +1544,7 @@ end pop /BitsPerComponent BitsPerComponent 1 add def - } bdef + } bind executeonly def /colr { currentdict /ColorSpace known not { @@ -1569,7 +1573,7 @@ end } ifelse } ifelse } if - } bdef + } bind executeonly def % Palette colors are decoded by the library. /pclr { @@ -1577,7 +1581,7 @@ end 1 index (1234) readstring pop 3 get 16#7F and 1 add /BitsPerComponent exch def - } bdef + } bind executeonly def /cdef { pop @@ -1593,7 +1597,7 @@ end } ifelse } repeat 0 - } bdef + } bind executeonly def currentdict end readonly def @@ -1635,7 +1639,7 @@ currentdict end readonly def } ifelse } loop pop -} bind def +} bind executeonly def currentdict /jp2_tag_dict .undef currentdict /jp2_csp_dict .undef @@ -1677,7 +1681,7 @@ currentdict /jp2_csp_dict .undef } ifelse 1 index exch /DecodeParms exch put % <resdict> -} bdef +} bind executeonly def /last-ditch-bpc-csp { currentdict /BitsPerComponent oknown not { @@ -1749,7 +1753,7 @@ currentdict /jp2_csp_dict .undef } if } if /ColorSpace exch def -} bdef +} bind executeonly def /get-smask-in-data { % <dict> -> <int> /SMaskInData knownoget { @@ -1759,7 +1763,7 @@ currentdict /jp2_csp_dict .undef } { 0 } ifelse -} bdef +} bind executeonly def /makeimagedict { % <resdict> <newdict> makeimagedict <imagemask?> % On return, newdict' is currentdict @@ -1770,7 +1774,7 @@ currentdict /jp2_csp_dict .undef /BitsPerComponent 2 copy knownoget { cvi def } { pop } ifelse /Interpolate 2 copy knownoget { def } { pop } ifelse makeimagekeys -} bdef +} bind executeonly def /makeimagekeys { % <resdict> makeimagekeys <imagemask> % newdict is currentdict @@ -2034,7 +2038,7 @@ currentdict /jp2_csp_dict .undef //false resolvestream /DataSource exch def //false } ifelse -} bdef +} bind executeonly def currentdict /add-to-last-param undef currentdict /last-ditch-bpc-csp undef @@ -2072,7 +2076,7 @@ currentdict /last-ditch-bpc-csp undef } if 1 index /Mask knownoget { 1 index exch /Mask exch put } if makeimagedict doimagesmask -} bdef +} bind executeonly def /makemaskimage { % <datasource> <imagemask> <Mask> makemaskimage % <datasource> <imagemask>, updates currentdict = % imagedict @@ -2174,7 +2178,7 @@ currentdict /last-ditch-bpc-csp undef /MaskDict exch def /ColorSpace DataDict /ColorSpace get def } ifelse -} bdef +} bind executeonly def /doimagesmask { % <imagemask> doimagesmask - PDFusingtransparency { @@ -2224,14 +2228,14 @@ currentdict /last-ditch-bpc-csp undef { doimage } ifelse } ifelse -} bdef +} bind executeonly def % For development needs we define a special option for running with a new handler % for images with a soft mask. //systemdict /NEW_IMAGE3X .knownget not { //false } if { /doimagesmask { % <imagemask> doimagesmask - doimage - } bdef + } bind executeonly def } if /ValidateDecode { % <<image dict>> -imagemask- ValidateDecode <<image dict>> @@ -2270,7 +2274,7 @@ currentdict /last-ditch-bpc-csp undef } { exch pop }ifelse -}bdef +}bind executeonly def /doimage { % <imagemask> doimage - % imagedict is currentdict, gets popped from dstack @@ -2332,7 +2336,7 @@ currentdict /last-ditch-bpc-csp undef .endtransparencygroup OPsavedict dup /saveOA get .setopacityalpha /saveBM get .setblendmode } if -} bdef +} bind executeonly def /.paintform { % <formdict> <resdict> <stream> .paintform - 1 index /FormResDict gput % For broken forms that inherit resources from the context. @@ -2341,7 +2345,7 @@ currentdict /last-ditch-bpc-csp undef } { pop pdfopdict .pdfruncontext } ifelse -} bdef +} bind executeonly def /IncrementAppearanceNumber { pdfdict /AppearanceNumber .knownget { @@ -2349,7 +2353,7 @@ currentdict /last-ditch-bpc-csp undef }{ pdfdict /AppearanceNumber 0 .forceput } ifelse -}bdef +}bind executeonly def /MakeAppearanceName { pdfdict /AppearanceNumber get @@ -2358,12 +2362,12 @@ currentdict /last-ditch-bpc-csp undef dup 3 -1 roll 9 exch putinterval dup dup length 1 sub (\}) putinterval -} bdef +} bind executeonly def /MakeNewAppearanceName { IncrementAppearanceNumber MakeAppearanceName -}bdef +}bind executeonly def /DoAppearance { %% Might need to rethink this. The problem is that if the page has a CropBox, we apply @@ -2378,7 +2382,7 @@ currentdict /last-ditch-bpc-csp undef DoForm pdfdict /.PreservePDFForm 3 -1 roll .forceput grestore -} bdef +} bind executeonly def /DoForm { %% save the current value, if its true we will set it to false later, in order @@ -2537,7 +2541,7 @@ currentdict /last-ditch-bpc-csp undef end } if pdfdict /.PreservePDFForm 3 -1 roll .forceput -} bdef +} bind executeonly def /_dops_save 1 array def @@ -2550,7 +2554,7 @@ currentdict /last-ditch-bpc-csp undef } { pop } ifelse -} bdef +} bind executeonly def currentdict /_dops_save undef @@ -2563,7 +2567,7 @@ currentdict /_dops_save undef pop } ifelse } forall - } bdef + } bind executeonly def /AnyOn { //false exch { oforce dup type /dicttype eq { @@ -2572,13 +2576,13 @@ currentdict /_dops_save undef pop } ifelse } forall - } bdef + } bind executeonly def /AnyOff { //AllOn exec not - } bdef + } bind executeonly def /AllOff { //AnyOn exec not - } bdef + } bind executeonly def currentdict end readonly def % Check whether OCG or OCMD is visible @@ -2654,7 +2658,7 @@ currentdict end readonly def } { /OFF known not % OFF is inserted by process_trailer_attrs } ifelse -} bdef +} bind executeonly def drawopdict begin /Do { % /Name @@ -2744,7 +2748,7 @@ drawopdict begin % Otherwise ignore it and tidy up the stacks pop pop } ifelse - } bdef + } bind executeonly def end currentdict /xobjectprocs .undef @@ -2778,12 +2782,12 @@ currentdict /ocg_pocs .undef .dicttomark readonly def /unabbrevvalue { % <obj> unabbrevvalue <obj'> oforce //unabbrevtypedict 1 index type .knownget { exec } if -} bdef +} bind executeonly def /is_space_dict << 0 0 9 9 10 10 12 12 13 13 32 32 >> readonly def drawopdict begin - /BI { mark } bdef + /BI { mark } bind executeonly def /ID { gsave %% Bug 696547, related to Bug 695897 (see /Do above) This file has an inline image inside @@ -2852,7 +2856,7 @@ drawopdict begin } ifelse } loop grestore - } bdef + } bind executeonly def end currentdict /is_space_dict undef @@ -2861,26 +2865,26 @@ currentdict /is_space_dict undef drawopdict begin % Text control - /BT { BT } def - /ET { ET } def - /Tc { Tc } def - /TL { TL } def - /Tr { Tr } def - /Ts { Ts } def - /Tw { Tw } def - /Tz { Tz } def + /BT { BT } executeonly def + /ET { ET } executeonly def + /Tc { Tc } executeonly def + /TL { TL } executeonly def + /Tr { Tr } executeonly def + /Ts { Ts } executeonly def + /Tw { Tw } executeonly def + /Tz { Tz } executeonly def % Text positioning - /Td { Td } def - /TD { TD } def - /Tm { Tm } def - /T* { T* } def + /Td { Td } executeonly def + /TD { TD } executeonly def + /Tm { Tm } executeonly def + /T* { T* } executeonly def % Text painting - /Tj { Tj } def - /' { ' } def - /" { " } def - /TJ { TJ } def + /Tj { Tj } executeonly def + /' { ' } executeonly def + /" { " } executeonly def + /TJ { TJ } executeonly def - /Tform { Tform } def % Text formatting and painting for AcroForm + /Tform { Tform } executeonly def % Text formatting and painting for AcroForm % without appearance streams. end @@ -2892,14 +2896,14 @@ drawopdict begin ( **** Error: invalid operator QBT processed as Q BT .\n) pdfformaterror % Bug 690089 ( Output may be incorrect.\n) pdfformaterror - } def + } executeonly def /. { 0. ( **** Error: invalid operator . processed as number 0. .\n) pdfformaterror % Bug 690730 ( Output may be incorrect.\n) pdfformaterror - } def + } executeonly def end % ============================== Annotations ============================== % @@ -2919,14 +2923,14 @@ end dup /Parent oknown not { 2 copy exch /ParentField exch put } if -} bdef +} bind executeonly def % Get and normalize an annotation's rectangle. /annotrect { % <annot> annotrect <x> <y> <w> <h> /Rect oget oforce_recursive aload pop exch 3 index sub dup 0 lt { dup 5 -1 roll add 4 1 roll neg } if exch 2 index sub dup 0 lt { dup 4 -1 roll add 3 1 roll neg } if -} bdef +} bind executeonly def % Set an annotation color. % If the /C array is empty we don't want to draw the annotation @@ -2955,7 +2959,7 @@ end } ifelse } { 0 setgray true} ifelse -} bdef +} bind executeonly def % Set an annotation color. % If the /C array is empty we don't want to draw the annotation @@ -2984,7 +2988,7 @@ end } ifelse } { 0 setgray true} ifelse -} bdef +} bind executeonly def % Draw the border. Currently, we ignore requests for beveling, and we % don't round the corners of rectangles. @@ -3005,7 +3009,7 @@ end } { pop pop pop }ifelse -} bdef +} bind executeonly def % Draw an annotation border. /drawborder { % <annot> drawborder - @@ -3049,7 +3053,7 @@ end 1 {} strokeborder } ifelse grestore -} bdef +} bind executeonly def % stroke the path of an annotation border. /strokeborderpath { % <annot> strokeborderpath - @@ -3098,7 +3102,7 @@ end } ifelse pop grestore -} bdef +} bind executeonly def /fillborderpath { % <annot> fillborderpath - gsave @@ -3106,7 +3110,7 @@ end annotsetinteriorcolor {fill} if grestore -}bdef +}bind executeonly def % % The PDF annotation F (flags) integer is bit encoded. @@ -3135,12 +3139,12 @@ end } { pop pop //false % Hidden } ifelse -} bdef +} bind executeonly def /set_bc_color << - 1 { 0 get oforce setgray } bind - 3 { { oforce } forall setrgbcolor } bind - 4 { { oforce } forall setcmykcolor } bind + 1 { 0 get oforce setgray } bind executeonly + 3 { { oforce } forall setrgbcolor } bind executeonly + 4 { { oforce } forall setcmykcolor } bind executeonly >> readonly def % Get an inherited attribute from a node through /Parent and /ParentField @@ -3164,7 +3168,7 @@ end } ifelse } ifelse } loop - } bind def + } bind executeonly def % <annot> foo <annot> /make_tx_da { @@ -3218,7 +3222,7 @@ end /File File 0 Length getinterval def closefile % <annot> end -} bdef +} bind executeonly def /can-regenerate-ap { % <annot> -> <bool> //false exch @@ -3239,7 +3243,7 @@ end } if } if pop -} bdef +} bind executeonly def /drawwidget { % <scalefactor_x> <scalefactor_y> <annot> drawwidget - @@ -3359,7 +3363,7 @@ end } if } ifelse pop pop pop -} bdef +} bind executeonly def currentdict /set_bc_color undef @@ -3409,7 +3413,7 @@ currentdict /set_bc_color undef ( Output may be incorrect.\n) pdfformaterror pop 1 1 } ifelse -} bdef +} bind executeonly def % Draw an annotation. /drawannottypes 20 dict begin @@ -3433,13 +3437,13 @@ currentdict /set_bc_color undef % } ifelse .begintransparencygroup } if - }bdef + }bind executeonly def /endannottransparency { PDFusingtransparency { .endtransparencygroup } if - }bdef + }bind executeonly def % x0 y0 x1 y1 x2 y2 x3 y3 -> x0 y0 x1-x0 y1-y0 x2-x0 y2-y0 /quadpoints2basis { @@ -3482,7 +3486,7 @@ currentdict /set_bc_color undef 4 index sub exch % x0 y0 x2-x0 y2-y0 y1-y0 x1 5 index sub exch % x0 y0 x2-x0 y2-y0 x1-x0 y1-y0 4 2 roll % x0 y0 x1-x0 y1-y0 x2-x0 y2-y0 - } bdef + } bind executeonly def /Square { dup /AP oknown { @@ -3506,7 +3510,7 @@ currentdict /set_bc_color undef //endannottransparency exec grestore }ifelse - } bdef + } bind executeonly def %% Width Height drawellipse - /drawellipse { @@ -3525,7 +3529,7 @@ currentdict /set_bc_color undef % Stack: yrad xrad xmag ymag exch neg 4 1 roll 3 -1 roll neg 3 1 roll exch neg exch neg 1 index 0 curveto % xmag neg yrad neg xrad neg ymag neg 0 curveto -}bdef +}bind executeonly def /Circle { dup /AP oknown { @@ -3542,7 +3546,7 @@ currentdict /set_bc_color undef grestore //false } ifelse - } bdef + } bind executeonly def /Polygon { dup /AP oknown { @@ -3591,7 +3595,7 @@ currentdict /set_bc_color undef //false grestore } ifelse - } bdef + } bind executeonly def /LineEnd_dict 10 dict begin %% Stack contains <annot> @@ -3624,7 +3628,7 @@ currentdict /set_bc_color undef dup neg lineto closepath strokeborderpath - } bdef + } bind executeonly def /Circle { dup /BS knownoget { @@ -3647,7 +3651,7 @@ currentdict /set_bc_color undef 0 moveto 0 0 3 -1 roll 0 360 arc strokeborderpath - } bdef + } bind executeonly def /Diamond { dup /BS knownoget { @@ -3675,7 +3679,7 @@ currentdict /set_bc_color undef 0 lineto closepath strokeborderpath - } bdef + } bind executeonly def /OpenArrow { dup gsave @@ -3692,7 +3696,7 @@ currentdict /set_bc_color undef dup 6 mul neg exch 4 mul lineto strokeborderpath grestore - } bdef + } bind executeonly def /ClosedArrow { dup gsave @@ -3718,8 +3722,8 @@ currentdict /set_bc_color undef dup /CA knownoget {.setopacityalpha} if fillborderpath grestore - } bdef - /None {} bdef + } bind executeonly def + /None {} bind executeonly def /Butt { dup /BS knownoget { @@ -3732,7 +3736,7 @@ currentdict /set_bc_color undef }ifelse 3 mul dup neg 0 exch moveto 0 exch lineto strokeborderpath - } bdef + } bind executeonly def /ROpenArrow { gsave dup @@ -3750,7 +3754,7 @@ currentdict /set_bc_color undef dup 6 mul neg exch 4 mul lineto strokeborderpath grestore - } bdef + } bind executeonly def /RClosedArrow { gsave dup @@ -3777,7 +3781,7 @@ currentdict /set_bc_color undef dup /CA knownoget {.setopacityalpha} if fillborderpath grestore - } bdef + } bind executeonly def /Slash { gsave dup @@ -3793,7 +3797,7 @@ currentdict /set_bc_color undef 3 mul dup neg 0 exch moveto 0 exch lineto strokeborderpath grestore - } bdef + } bind executeonly def currentdict end readonly def @@ -3837,7 +3841,7 @@ currentdict /set_bc_color undef //false grestore } ifelse - } bdef + } bind executeonly def /PolyLine { dup /AP oknown { @@ -3895,7 +3899,7 @@ currentdict /set_bc_color undef //false grestore } ifelse - } bdef + } bind executeonly def /Link { % <annot> -> <false> //startannottransparency exec @@ -3908,7 +3912,7 @@ currentdict /set_bc_color undef ( Output may be incorrect.\n) pdfformaterror }ifelse //endannottransparency exec - } bdef + } bind executeonly def /Ink { % <annot> -> <annot> <true> % <annot> -> <false> @@ -3960,7 +3964,7 @@ currentdict /set_bc_color undef //endannottransparency exec //false } ifelse - } bdef + } bind executeonly def /Underline { dup /AP oknown { @@ -3999,7 +4003,7 @@ currentdict /set_bc_color undef } if //false } ifelse - } bdef + } bind executeonly def /StrikeOut { dup /AP oknown { @@ -4038,7 +4042,7 @@ currentdict /set_bc_color undef } if //false } ifelse - } bdef + } bind executeonly def % Connect 2 points with an arc that has max distance from the line % segment to the ark equal 1/4 of the radius. @@ -4058,7 +4062,7 @@ currentdict /set_bc_color undef atan % x0 y0 x1 y1 xc yc r a1 a2 exch arcn % x0 y0 x1 y1 pop pop pop pop - } bind def + } bind executeonly def /emptydict 0 dict readonly def @@ -4093,7 +4097,7 @@ currentdict /set_bc_color undef } if //false % } ifelse - } bdef + } bind executeonly def currentdict /emptydict undef currentdict /highlight-arc undef @@ -4153,7 +4157,7 @@ currentdict /set_bc_color undef //endannottransparency exec //false } ifelse - } bdef + } bind executeonly def /Text { dup /AP oknown { @@ -4195,7 +4199,7 @@ currentdict /set_bc_color undef //endannottransparency exec //false } ifelse - } bdef + } bind executeonly def /FreeText { dup /AP knownoget { @@ -4382,7 +4386,7 @@ currentdict /set_bc_color undef { //true } ifelse - } bdef + } bind executeonly def /frame { { 255 div } forall setrgbcolor @@ -4406,7 +4410,7 @@ currentdict /set_bc_color undef } gsave 1 -1 translate 0.75 setgray dup exec grestore exec - } bdef + } bind executeonly def % (text) y h -> - /text { @@ -4425,7 +4429,7 @@ currentdict /set_bc_color undef PDFusingtransparency { .endtransparencytextgroup } if - } bdef + } bind executeonly def /red <ef4023> readonly def /green <3fae49> readonly def @@ -4435,44 +4439,44 @@ currentdict /set_bc_color undef /Approved { //green //frame exec (APPROVED) 13 30 //text exec - } bdef + } bind executeonly def /AsIs { //red //frame exec (AS IS) 13 30 //text exec - } bdef + } bind executeonly def /Confidential { //red //frame exec (CONFIDENTIAL) 17 20 //text exec - } bdef + } bind executeonly def /Departmental { //blue //frame exec (DEPARTMENTAL) 17 20 //text exec - } bdef + } bind executeonly def /Draft { //red //frame exec (DRAFT) 13 30 //text exec - } bdef + } bind executeonly def /Experimental { //blue //frame exec (EXPERIMENTAL) 17 20 //text exec - } bdef + } bind executeonly def /Expired { //red //frame exec (EXPIRED) 13 30 //text exec - } bdef + } bind executeonly def /Final { //red //frame exec (FINAL) 13 30 //text exec - } bdef + } bind executeonly def /ForComment { //green //frame exec (FOR COMMENT) 17 20 //text exec - } bdef + } bind executeonly def /ForPublicRelease { //green //frame exec (FOR PUBLIC) 26 18 //text exec (RELEASE) 8.5 18 //text exec - } bdef + } bind executeonly def /NotApproved { //red //frame exec (NOT APPROVED) 17 20 //text exec @@ -4481,15 +4485,15 @@ currentdict /set_bc_color undef //red //frame exec (NOT FOR) 26 18 //text exec (PUBLIC RELEASE) 8.5 18 //text exec - } bdef + } bind executeonly def /Sold { //blue //frame exec (SOLD) 13 30 //text exec - } bdef + } bind executeonly def /TopSecret { //red //frame exec (TOP SECRET) 14 26 //text exec - } bdef + } bind executeonly def currentdict end readonly def {/text/frame/red/green/blue} {currentdict exch undef} forall @@ -4524,7 +4528,7 @@ currentdict /set_bc_color undef //endannottransparency exec //false } ifelse - } bdef + } bind executeonly def /Popup { dup /Open oknown { @@ -4613,7 +4617,7 @@ currentdict /set_bc_color undef } { pop //false }ifelse - } bdef + } bind executeonly def /Redact { %% Redact annotations are part of a process, a Redact annotation is only present @@ -4625,7 +4629,7 @@ currentdict /set_bc_color undef } { //false } ifelse - } bdef + } bind executeonly def currentdict /startannottransparency undef currentdict /endannottransparency undef @@ -4650,7 +4654,7 @@ currentdict end readonly def } {pop pop //true} ifelse -} bind def +} bind executeonly def /drawannot { % <annot> drawannot - dup annotvisible { @@ -4681,7 +4685,7 @@ currentdict end readonly def } ifelse grestore } if pop % annotvisible -} bdef +} bind executeonly def currentdict /drawannottypes undef % Draw an annotation. @@ -4739,6 +4743,7 @@ currentdict /drawannottypes undef dup {oforce} stopped not {exch pop} if 2 index 3 1 roll put } forall + Removepdfobj# } if dup type /arraytype eq { 0 1 2 index length 1 sub{ @@ -4748,7 +4753,7 @@ currentdict /drawannottypes undef } if } if } forall -} bdef +} bind executeonly def /ApplyCTMToQuadPoints { @@ -4781,13 +4786,13 @@ currentdict /drawannottypes undef exch pop % the mark grestore -} bdef +} bind executeonly def /preserveannottypes 20 dict begin -/Circle {mark exch loadannot /ANN pdfmark false} bdef -/FileAttachment {mark exch loadannot /ANN pdfmark false} bdef -/FreeText {mark exch loadannot /ANN pdfmark false} bdef +/Circle {mark exch loadannot /ANN pdfmark false} bind executeonly def +/FileAttachment {mark exch loadannot /ANN pdfmark false} bind executeonly def +/FreeText {mark exch loadannot /ANN pdfmark false} bind executeonly def /Highlight { mark exch @@ -4797,9 +4802,9 @@ currentdict /drawannottypes undef put } if loadannot /ANN pdfmark false -} bdef +} bind executeonly def -/Ink {mark exch loadannot /ANN pdfmark false} bdef +/Ink {mark exch loadannot /ANN pdfmark false} bind executeonly def /Line { mark exch dup /L .knownget { @@ -4808,15 +4813,101 @@ currentdict /drawannottypes undef 1 index /L 3 -1 roll put } if loadannot /ANN pdfmark false -} bdef +} bind executeonly def -/Link {mark exch {drawannot} PDFSTOPONERROR {exec}{stopped {(Error: Ignoring invalid annotation, output may be incorrect.\n) pdfformaterror} if} ifelse cleartomark false} bdef +/Link { + /NO_PDFMARK_DESTS where {pop NO_PDFMARK_DESTS not}{true}ifelse + { + mark exch + dup /BS knownoget { << exch { oforce } forall >> /BS exch 3 -1 roll } if + dup /F knownoget { /F exch 3 -1 roll } if + dup /C knownoget { /Color exch 3 -1 roll } if + dup /Rect knownoget { /Rect exch 3 -1 roll } if + dup /Border knownoget { + dup type /arraytype eq { + dup length 3 lt + } { + //true + } ifelse { + pop [ 0 0 0 ] % Following AR5 use invisible border. + } if + /Border exch 3 -1 roll + } if + dup /A knownoget { + dup /URI known { + /A mark 3 2 roll % <<>> /A [ <<action>> + { oforce } forall + .dicttomark + 3 2 roll + } { + dup /S knownoget { + %% Because we process GoTo Destinations into absolute references in the PDF file + %% we need to resolve the /D or /Dest. However, we must *not* do this for + %% GoToR Destinations because (obviously) those are in a different file and + %% we cannot resolve them into absolute references. We don't need to anyway + %% because that file must already have a named destination. + dup /GoTo eq { + pop + dup /D knownoget { + exch pop exch dup length dict copy dup /Dest 4 -1 roll put + } if + }{ + dup /GoToR eq { + pop /A mark % <<..action dict..>> /A [ + 3 2 roll % /A [ <<..action dict..>> + { oforce } forall + .dicttomark + 3 2 roll + }{ + dup /Launch eq { + pop /A mark % <<..action dict..>> /A [ + 3 2 roll % /A [ <<..action dict..>> + { oforce } forall + .dicttomark + 3 2 roll + }{ + /Named eq { + /N knownoget { + namedactions exch .knownget { + exec { + pop + ( **** Warning: Ignoring a named action pointing out of the document page range.\n) + pdfformatwarning + } { + /Page exch 3 -1 roll + } ifelse + } if + } if + } if + }ifelse + } ifelse + } ifelse + } if + } ifelse + } if + { linkdest } stopped { + cleartomark + ( **** Warning: Link annotation points out of the document page range.\n) + pdfformatwarning + } { + pop + { + %% Need to remove any '/.gs.pdfobj# key/value pairs from any dictionaries + counttomark array astore dup length 1 sub 0 1 3 -1 roll { + dup 2 index exch get Removepdfobj# 2 index 3 1 roll put + } for aload pop + /LNK pdfmark + } stopped {cleartomark} if + } ifelse + }{pop} ifelse + false +} bind executeonly def -/Movie {mark exch loadannot /ANN pdfmark false} bdef -/Popup {mark exch loadannot /ANN pdfmark false} bdef -/Sound {mark exch loadannot /ANN pdfmark false} bdef -/Square {mark exch loadannot /ANN pdfmark false} bdef -/Stamp {mark exch loadannot /ANN pdfmark false} bdef +/Movie {mark exch loadannot /ANN pdfmark false} bind executeonly def +/Popup {mark exch loadannot /ANN pdfmark false} bind executeonly def +/Sound {mark exch loadannot /ANN pdfmark false} bind executeonly def +/Square {mark exch loadannot /ANN pdfmark false} bind executeonly def +/Stamp {mark exch loadannot /ANN pdfmark false} bind executeonly def /StrikeOut { mark exch @@ -4826,7 +4917,7 @@ currentdict /drawannottypes undef put } if loadannot /ANN pdfmark false -} bdef +} bind executeonly def /Squiggly { mark exch @@ -4836,10 +4927,10 @@ currentdict /drawannottypes undef put } if loadannot /ANN pdfmark false -} bdef +} bind executeonly def -/Text {mark exch loadannot /ANN pdfmark false} bdef -/TrapNet {mark exch loadannot /ANN pdfmark false} bdef +/Text {mark exch loadannot /ANN pdfmark false} bind executeonly def +/TrapNet {mark exch loadannot /ANN pdfmark false} bind executeonly def /Underline { mark exch @@ -4849,18 +4940,23 @@ currentdict /drawannottypes undef put } if loadannot /ANN pdfmark false -} bdef +} bind executeonly def %% Widget annotations are only used with AcroForms, and since we don't preserve AcroForms %% we don't want to preserve widget annotations either, because the consumer of the new %% PDF won't know what values they should take. So we draw widget annotations instead. If we %% ever preserve AcroForms then we should alter this to preserve Widgets as well. %% simply chane "drawannot" to "mark exch loadannot /ANN pdfmark" -/Widget {mark exch {drawannot} PDFSTOPONERROR {exec}{stopped {(Error: Ignoring invalid annotation, output may be incorrect.\n) pdfformaterror} if} ifelse cleartomark false} bdef +/Widget {mark exch {drawannot} PDFSTOPONERROR {exec}{stopped {(Error: Ignoring invalid annotation, output may be incorrect.\n) pdfformaterror} if} ifelse cleartomark false} bind executeonly def currentdict end readonly def /preserveannot { % <annot> preserveannot - + + dup /.gs.pdfobj# known { + dup /.gs.pdfobj# undef + } if + dup annotvisible { gsave dup dup /Subtype knownoget { @@ -4888,7 +4984,7 @@ currentdict end readonly def } ifelse grestore } if pop % annotvisible -} bdef +} bind executeonly def currentdict /preserveannottypes undef currentdict /.PDFDrawAnnotType? undef @@ -4902,7 +4998,7 @@ currentdict /.PDFDrawAnnotType? undef } { oget } ifelse -} bdef +} bind executeonly def % All procedures have the signature: % <acroform> <field> <annot|field> foo <acroform> <field> <annot|field> @@ -4936,7 +5032,7 @@ currentdict /.PDFDrawAnnotType? undef } ifelse } ifelse } ifelse -} bdef +} bind executeonly def /Tx { dup /AP known { @@ -4984,7 +5080,7 @@ currentdict /.PDFDrawAnnotType? undef dup 1 1 3 -1 roll drawwidget } if } ifelse -} bdef +} bind executeonly def /Ch { dup /AP known 3 index /NeedAppearances knownoget not { //true } if not and { @@ -5032,11 +5128,11 @@ currentdict /.PDFDrawAnnotType? undef dup 1 1 3 -1 roll drawwidget } if } ifelse -} bdef +} bind executeonly def /Sig { (Sig is not yet implemened ) //== exec -} bdef +} bind executeonly def currentdict end def @@ -5050,7 +5146,7 @@ currentdict end def } if } if pop pop -} bdef +} bind executeonly def % We distinguish 4 types of nodes on the form field tree: % - non-terminal field - has a kid that refers to the parent (or anywhere else) @@ -5077,14 +5173,14 @@ currentdict end def } { draw_terminal_field % merged annotation % - } ifelse -} bdef +} bind executeonly def /draw_acro_form { % <form> draw_acro_form - dup /Fields knownoget { { oforce draw_form_field } forall } if pop -} bdef +} bind executeonly def currentdict /draw_terminal_field_dict undef diff --git a/Master/tlpkg/tlgs/Resource/Init/pdf_font.ps b/Master/tlpkg/tlgs/Resource/Init/pdf_font.ps index a9511570ec2..feaf0d036ac 100644 --- a/Master/tlpkg/tlgs/Resource/Init/pdf_font.ps +++ b/Master/tlpkg/tlgs/Resource/Init/pdf_font.ps @@ -68,7 +68,7 @@ pdfdict begin { 3 copy put pop 1 add } ifelse } forall pop -} bdef +} bind executeonly def /good_encoding_names << /MacRomanEncoding 0 /MacExpertEncoding 0 /WinAnsiEncoding 0 @@ -130,7 +130,7 @@ pdfdict begin ( Output may be incorrect.\n) pdfformaterror } ifelse - } bdef + } bind executeonly def currentdict /good_encoding_names undef currentdict /known_symbolic_fonts undef @@ -146,7 +146,7 @@ currentdict /known_symbolic_fonts undef } if } if pop -} bind def +} bind executeonly def % Define a font using it's FontName as the key. % Adjust a font according to the Encoding and Widths in the font resource. @@ -166,7 +166,7 @@ currentdict /known_symbolic_fonts undef /Helvetica findfont }if } if -} bind def +} bind executeonly def % Get the (possibly modified) encoding of a font. /getfontencoding { % <font-resource> <font> getfontencoding @@ -213,7 +213,7 @@ currentdict /known_symbolic_fonts undef } ifelse } ifelse } ifelse -} bdef +} bind executeonly def % Returns true if the current glyph is in the Differences array at % the specified index value. This is needed because the Widths @@ -240,7 +240,7 @@ currentdict /known_symbolic_fonts undef % stack: true false index glyphname % or : false index glyphname at_index pop pop pop -} bdef +} bind executeonly def /unique_name { % <dict> </root> unique_name </unique> % @@ -262,7 +262,7 @@ currentdict /known_symbolic_fonts undef pop } for exch pop cvn % /root0 -} bdef +} bind executeonly def % Get the metrics of a font, if specified. /getfontmetrics { % <font-resource> <font> <Encoding|null> getfontmetrics @@ -397,7 +397,7 @@ currentdict /known_symbolic_fonts undef } { //null //null } ifelse -} bdef +} bind executeonly def currentdict /unique_name undef currentdict /match_in_diff undef @@ -408,20 +408,20 @@ currentdict /match_in_diff undef pop dup userdict exch /.lastToUnicode exch put exch pop - } bdef + } bind executeonly def /CIDSystemInfo { ( **** Warning: ToUnicode CMap has invalid syntax near CIDSystemInfo.\n) pdfformatwarning /CIDSystemInfo - } bdef % A work around a bug in Altona.Page_3.2002-09-27.pdf - a slash is missed. + } bind executeonly def % A work around a bug in Altona.Page_3.2002-09-27.pdf - a slash is missed. /CMapName { ( **** Warning: ToUnicode CMap has no CMapName.\n\ See the comment to revision 6201 in gs/doc/ps2pdf.htm#Problems .\n) pdfformatwarning /CMap1 % arbitrary, PDF defineresource tolerates non-unique names - } bdef % A work around incorrect ToUnicode CMap generated by GS before rev. 6201. + } bind executeonly def % A work around incorrect ToUnicode CMap generated by GS before rev. 6201. % Split large ranges into smaller chunks to stay withing the limits % of various PS% objects and speed up operand stack manipulation, @@ -448,7 +448,7 @@ currentdict /match_in_diff undef mark } ifelse } loop - } bdef + } bind executeonly def currentdict end readonly def /string2number % <string> string2number <number> @@ -457,7 +457,7 @@ currentdict end readonly def 3 2 roll 256 mul add exch % v+n*256 () } for pop % N -} bind def +} bind executeonly def /copy&def % <key> <value> <bool> copy&def - { @@ -474,7 +474,7 @@ currentdict end readonly def setglobal } if def -} bind def +} bind executeonly def /.convert_ToUnicode-into-g2u % <GlyphNames2Unicode> <Encoding|null> <CMap> .convert_ToUnicode-into-g2u - { @@ -578,14 +578,14 @@ currentdict end readonly def CMAPDEBUG { (.convert_ToUnicode-into-g2u end) = } if -} bind def +} bind executeonly def /.DoToUnicode? { /IgnoreToUnicode where {/IgnoreToUnicode get not} {//true} ifelse -} bind def +} bind executeonly def /.processToUnicode % <font-resource> <font-dict> <encoding|null> .processToUnicode - { @@ -718,7 +718,7 @@ currentdict end readonly def {pop pop pop} ifelse -} bind def +} bind executeonly def currentdict /.DoToUnicode? .forceundef @@ -768,7 +768,7 @@ setglobal 4 2 roll .growput } ifelse } ifelse -} bind def +} bind executeonly def % Add original font to cache to prevent adjustfont to accumulate changes. /pdfaddcachedfont { % <font_name> pdfaddcachedfont <font> @@ -776,7 +776,7 @@ setglobal dup gcheck { //.pdforigfontcache_g } {.pdforigfontcache_l} ifelse 4 2 roll % font d name font put % font -} bind def +} bind executeonly def /.remove_font_name_prefix { % <name> .remove_font_name_prefix <name> dup .namestring (+) search { @@ -792,7 +792,7 @@ setglobal } { pop } ifelse -} bind def +} bind executeonly def % Find a font (except for embedded ones), and adjust its encoding if necessary. /.pdfdfndict mark @@ -965,18 +965,18 @@ setglobal } ifelse } ifelse exch pop -} bdef +} bind executeonly def % ---------------- Type 1 fonts ---------------- % /buildType1 % <Type1-font-resource> buildType1 <font> { dup /BaseFont get pdffindfont - } bdef + } bind executeonly def % Read an embedded Type 1 font. /readfontfilter { % <proc> readfontfilter <filter> 0 () /SubFileDecode filter -} bdef +} bind executeonly def % Adobe Acrobat doesn't skip space characters after eexec /eexec_pdf_param_dict mark @@ -1051,12 +1051,12 @@ setglobal } ifelse } if prev_definefont - } bdef + } bind executeonly def /undef_proc_warning { /Repaired //true store % flag that we have warnings UndefProcList exch 2 copy .knownget { 1 add } { 1 } ifelse put - } bdef + } bind executeonly def /missing-type1-procs 6 dict begin /-| { string currentfile exch readstring pop /-| //undef_proc_warning exec } executeonly bdef @@ -1080,7 +1080,7 @@ setglobal currentfile flushfile % Skip the trailer after return from eexec, bug 690701. { currentdict end //missing-type1-procs eq { exit } if } loop { stop } if - } bdef + } bind executeonly def /readonly-op-dict << /stringtype 0 @@ -1094,7 +1094,7 @@ setglobal ( **** Warning: Type 1 font applies operator readonly to an invalid object type.\n) pdfformatwarning } if - } bdef + } bind executeonly def /prev_get /get load def @@ -1110,14 +1110,14 @@ setglobal prev_get } ifelse } ifelse - } bdef + } bind executeonly def /prev_begin /begin load def /begin { dup //systemdict eq { pop 0 dict } if prev_begin - } bdef + } bind executeonly def { /undef_proc_warning /missing-type1-procs /readonly-op-dict } { currentdict exch undef } forall @@ -1152,7 +1152,7 @@ currentdict /eexec_pdf_param_dict .undef PDFfile file-position setfileposition count stack-count sub { pop } repeat topFontDict end end - } bdef + } bind executeonly def % ---------------- Type 3 fonts ---------------- % @@ -1241,7 +1241,7 @@ currentdict /eexec_pdf_param_dict .undef } bdef dup currentdict Encoding .processToUnicode currentdict end .completefont exch pop -} bdef +} bind executeonly def /.adjustcharwidth { % <wx> <wy> .adjustcharwidth <wx'> <wy'> % Enforce the metrics, in glyph space, to the values found in the PDF Font object % - force wy == 0 (assumed, and not stored in the PDF font) @@ -1258,7 +1258,7 @@ currentdict /eexec_pdf_param_dict .undef exch pop Widths CharCode FirstChar sub get exch } if end } if -} bdef +} bind executeonly def % ---------------- TrueType fonts ---------------- % @@ -1318,7 +1318,7 @@ currentdict /eexec_pdf_param_dict .undef } { pdffindfont } ifelse -} bdef +} bind executeonly def % Read an embedded TrueType font. /readtruetype { % <font-resource> <stream-dict> readtruetype <font> @@ -1328,6 +1328,18 @@ currentdict /eexec_pdf_param_dict .undef % Stack: filepos fontres stream 1 index /CIDSystemInfo oknown { 1 index /CIDSystemInfo get dup type /packedarraytype eq {exec}if + dup /Registry known not { + ( **** Warning: a CIDFont's CIDSystemInfo is missing the required Registry entry\n) pdfformatwarning + dup /Registry (Adobe) put + } if + dup /Ordering known not { + ( **** Warning: a CIDFont's CIDSystemInfo is missing the required Ordering entry\n) pdfformatwarning + dup /Ordering (Identity) put + } if + dup /Supplement known not { + ( **** Warning: a CIDFont's CIDSystemInfo is missing the required Supplement entry\n) pdfformatwarning + dup /Supplement 0 put + } if 3 1 roll 1 index /Subtype knownoget { /CIDFontType2 ne { @@ -1371,7 +1383,7 @@ currentdict /eexec_pdf_param_dict .undef PDFfile 3 -1 roll setfileposition % Ignore both the Encoding and the Widths. exch pop -} bdef +} bind executeonly def % ---------------- Type 0 fonts ---------------- % @@ -1413,7 +1425,7 @@ currentdict /eexec_pdf_param_dict .undef end % CMap end % CIDInit ProcSet exch .setglobal -} bdef +} bind executeonly def /CMap_read_dict 3 dict begin /defineresource % <name> <dict> <cat-name> defineresource <dict> @@ -1421,20 +1433,20 @@ currentdict /eexec_pdf_param_dict .undef pop /.last_CMap_def 1 index store exch pop - } bdef + } bind executeonly def /CIDSystemInfo { ( **** Error: CMap has invalid syntax near CIDSystemInfo.\n) pdfformaterror ( Output may be incorrect.\n) pdfformaterror /CIDSystemInfo - } bdef % A work around a bug in Altona.Page_3.2002-09-27.pdf - a slash is missed. + } bind executeonly def % A work around a bug in Altona.Page_3.2002-09-27.pdf - a slash is missed. /CMapName { ( **** Error: CMap has no CMapName.\n\ See the comment to revision 6201 in gs/doc/ps2pdf.htm#Problems .\n) pdfformaterror ( Output may be incorrect.\n) pdfformaterror /CMap1 % arbitrary, PDF defineresource tolerates non-unique names - } bdef % A work around incorrect ToUnicode CMap generated by GS before rev. 6201. + } bind executeonly def % A work around incorrect ToUnicode CMap generated by GS before rev. 6201. currentdict end readonly def % Read an embedded stream that we *hope* is a PostScript CMap. According @@ -1451,7 +1463,7 @@ currentdict end readonly def currentdict end dup /CMapName get exch /CMap defineresource end -} bdef +} bind executeonly def % Read embedded CMap stream. % if the <wmode> parameter is null, it indicates there is no WMode, and we @@ -1475,7 +1487,7 @@ currentdict end readonly def { currentdict end //CMap_read_dict eq { exit } if } loop dup /.last_CMap_def undef /CMap defineresource -} bdef +} bind executeonly def currentdict /CMap_read_dict undef @@ -1536,7 +1548,7 @@ currentdict /CMap_read_dict undef pop } ifelse } if exch pop -} bdef +} bind executeonly def % ---------------- CIDFontType0/2 fonts ---------------- % @@ -1589,7 +1601,7 @@ currentdict /CMap_read_dict undef dup /CDevProc 1 index /CIDWProc load /exec load 3 packedarray cvx put exch pop -} bdef +} bind executeonly def /.pdfMakeInternalMTXArray { % <mtx_array> <item_size> .pdfConvertInternalW <mtx_array'> % convert /W or /W2 to internal expression @@ -1645,10 +1657,10 @@ currentdict /CMap_read_dict undef [ { putMTXEntry Mi1 type get exec i Msize ge { exit } if } loop ] end -} def +} executeonly def -/.pdfMakeInternalW { dup length 0 gt { oforce_recursive 1 .pdfMakeInternalMTXArray } if } def -/.pdfMakeInternalW2 { dup length 0 gt { oforce_recursive 3 .pdfMakeInternalMTXArray } if } def +/.pdfMakeInternalW { dup length 0 gt { oforce_recursive 1 .pdfMakeInternalMTXArray } if } executeonly def +/.pdfMakeInternalW2 { dup length 0 gt { oforce_recursive 3 .pdfMakeInternalMTXArray } if } executeonly def /.pdfGetMTXByCID { % <internalMTXArray> <cid> % .pdfGetMTXByCID @@ -1668,7 +1680,7 @@ currentdict /CMap_read_dict undef { exit } if } forall dup type /arraytype eq { exch pop //true } { pop //false } ifelse -} def +} executeonly def % Apply the [D]W[2] metrics to a character before displaying. /CIDWProc { % <w0x> <w0y> <llx> <lly> <urx> <ury> @@ -1776,7 +1788,7 @@ currentdict /CMap_read_dict undef 11 -1 roll pop % Stack: <w0x'> <w0y'> <llx> <lly> <urx> <ury> <w1x'> <w1y'> <vx'> <vy'> end % recover currentdict -} def +} executeonly def % <string> <match> tailmatch ==> <pre> true % ==> <string> false @@ -1789,7 +1801,7 @@ currentdict /CMap_read_dict undef } { pop //false } ifelse -} bind def +} bind executeonly def /makeboldfont { 16 dict begin @@ -1830,7 +1842,7 @@ currentdict /CMap_read_dict undef currentdict end dup /CIDFontName get exch /CIDFont defineresource -} bind def +} bind executeonly def % <CIDFont-resource> <CIDFontName> findCIDFont <CIDFont-resource> <font> % CIDFont-resource is not modified. @@ -2014,15 +2026,15 @@ currentdict /CMap_read_dict undef } if /findresource cvx /undefined signalerror } loop -} bdef +} bind executeonly def /buildCIDType0 { % <CIDFontType0-font-resource> buildCIDType0 <font> dup /BaseFont get findCIDFont exch pop -} bdef +} bind executeonly def /buildCIDType2 { % <CIDFontType2-font-resource> buildCIDType2 <font> dup /BaseFont get findCIDFont exch pop -} bdef +} bind executeonly def /processCIDToGIDMap { % <fontres> <cidfont> processCIDToGIDMap <fontres> <cidfont> 1 index /CIDToGIDMap knownoget { @@ -2055,7 +2067,7 @@ currentdict /CMap_read_dict undef } ifelse 3 2 roll PDFfile exch setfileposition } if -} bdef +} bind executeonly def % Adjust a CIDFontType0 DW[2] in the font resource. /adjustCIDType0 { % <font-resource> <font> adjustfont <font'> @@ -2067,7 +2079,7 @@ currentdict /CMap_read_dict undef addCIDmetrics dup /CIDFontName get exch /CIDFont defineresource } ifelse -} bind def +} bind executeonly def % Adjust a CIDFontType2 DW[2] and CIDToGIDMap in the font resource. /adjustCIDType2 { % <font-resource> <font> adjustfont <font'> @@ -2082,7 +2094,7 @@ currentdict /CMap_read_dict undef } if dup /CIDFontName get exch /CIDFont defineresource } ifelse -} bind def +} bind executeonly def % ---------------- Other embedded fonts ---------------- % @@ -2108,7 +2120,7 @@ currentdict /CMap_read_dict undef closefile closefile pop PDFfile 3 -1 roll setfileposition pop pop -} bdef +} bind executeonly def % Read an embedded CFF CIDFont. /readCIDFontType0C { % <font-resource> <stream-dict> readCIDFontType0C <font> @@ -2126,7 +2138,7 @@ currentdict /CMap_read_dict undef % Use the FontName, rather than the BaseFont, here. dup /FontDescriptor oget /FontName oget /CIDFont findresource addCIDmetrics dup /CIDFontName get exch /CIDFont defineresource -} bdef +} bind executeonly def % Read an embedded OpenType font. /readOTTOfont { % <font-resource> <stream-dict> readOTTOfont <font> @@ -2184,7 +2196,7 @@ currentdict /CMap_read_dict undef closefile closefile pop pop % font res pos PDFfile exch setfileposition % font res pop % font -} bdef +} bind executeonly def % ---------------- Font lookup ---------------- % @@ -2216,10 +2228,10 @@ currentdict /CMap_read_dict undef % Bind a proc and define n names % /name ... /name {proc} n bndef - /bndef - { exch bind exch + { exch bind executeonly exch { dup 3 1 roll def } repeat pop - } bdef + } bind executeonly def % <res> run-fonttypeproc <font> /run-fonttypeproc { @@ -2232,7 +2244,7 @@ currentdict /CMap_read_dict undef 2 copy /Subtype exch put } if //fonttypeprocs exch get exec -} bdef +} bind executeonly def % Prototype for all procedures: <res> <desc> <stream> foo <font> /font_tag_dict 13 dict begin @@ -2241,19 +2253,19 @@ currentdict /CMap_read_dict undef /no_stream { pop pop run-fonttypeproc - } bdef + } bind executeonly def /bad_stream { ( **** Error: Error reading font stream, attempting to load the font using its name\n) pdfformaterror ( Output may be incorrect.\n) pdfformaterror //no_stream exec - } bdef + } bind executeonly def <8001> % PFB { dup /PFB //true put exch pop readtype1 - } bdef + } bind executeonly def (%!PS) (%!Fo) % Type1 { exch pop readtype1 @@ -2276,7 +2288,7 @@ currentdict /CMap_read_dict undef (OTTO) { exch pop readOTTOfont - } bdef + } bind executeonly def currentdict end readonly def currentdict /bndef undef @@ -2311,7 +2323,7 @@ currentdict /bndef undef 16#7FFFFFFF and xor % object_number CRC<newhash> xor % final hashed value -}bind def +}bind executeonly def % Either patch or create a new XUID based on the existing % XUID or UniqueID and incorporating the PDF object number @@ -2344,7 +2356,7 @@ currentdict /bndef undef .completefont } ifelse } ifelse -} bind def +} bind executeonly def /resourcefont % <font-resource> resourcefont <font> { @@ -2489,7 +2501,7 @@ currentdict /bndef undef dup 3 1 roll /PSFont exch put } ifelse dup checkGlyphNames2Unicode -} bdef +} bind executeonly def currentdict /font_tag_dict .undef currentdict /fonttypeprocs .undef @@ -2499,7 +2511,7 @@ drawopdict begin /d0 { currentcolor currentcolorspace .swapcolors setcolorspace setcolor .swapcolors .adjustcharwidth setcharwidth - } bdef + } bind executeonly def /d1 { 2 copy % ... llx lly urx ury | urx ury 0 ne exch 0 ne % ... llx lly urx ury | ury!=0 urx!=0 @@ -2511,7 +2523,7 @@ drawopdict begin } { 6 -2 roll .adjustcharwidth 6 2 roll setcachedevice } ifelse - } bdef + } bind executeonly def /Tf { 1 index Page /Font rget { dup type /dicttype eq { @@ -2550,7 +2562,7 @@ drawopdict begin Tf } ifelse } ifelse - } bdef + } bind executeonly def end end % pdfdict diff --git a/Master/tlpkg/tlgs/Resource/Init/pdf_main.ps b/Master/tlpkg/tlgs/Resource/Init/pdf_main.ps index 1e3fae2e589..09f87353c20 100644 --- a/Master/tlpkg/tlgs/Resource/Init/pdf_main.ps +++ b/Master/tlpkg/tlgs/Resource/Init/pdf_main.ps @@ -30,28 +30,28 @@ pdfdict begin currentdevice //.writepdfmarkdict .getdeviceparams mark eq { //false } { pop pop //true } ifelse systemdict /DOPDFMARKS known or -} bind def +} bind executeonly def % For simplicity, we use a single interpretation dictionary for all % PDF graphics execution, even though this is too liberal. /pdfopdict mark objopdict { } forall drawopdict { } forall - /endstream { exit } bind - (%%EOF) cvn { exit } bind % for filters + /endstream { exit } bind executeonly + (%%EOF) cvn { exit } bind executeonly % for filters /obj { ( **** Error: Content stream is not terminated by 'endstream'.\n) pdfformaterror ( Output may be incorrect.\n) pdfformaterror - } bind + } bind executeonly % PDF 1.1 operators - /BX { /BXlevel BXlevel 1 add store } bind - /EX { /BXlevel BXlevel 1 sub store } bind - /PS { cvx exec } bind + /BX { /BXlevel BXlevel 1 add store } bind executeonly + /EX { /BXlevel BXlevel 1 sub store } bind executeonly + /PS { cvx exec } bind executeonly % PDF 1.2 operators /BMC { /BMClevel BMClevel 1 add store pop - } bind + } bind executeonly /BDC { /BMClevel BMClevel 1 add store exch /OC eq { @@ -69,7 +69,7 @@ pdfdict begin } { pop } ifelse - } bind + } bind executeonly /EMC { OFFlevels BMClevel 2 copy known { @@ -77,19 +77,128 @@ pdfdict begin } if 1 sub /BMClevel exch store pop - } bind + } bind executeonly /MP { pop } bind /DP { pop pop } bind /- { 0 % Bug 690016 ( **** Error: Invalid operator '-' is assumed to be the number 0.\n) pdfformaterror ( Output may be incorrect.\n) pdfformaterror - } bind + } bind executeonly /Recursive_XObject_D 1 dict def .dicttomark readonly def + +% This dictionaty encapsulates all that is needed to generate pagelabel pdfmarks. +% +% This is provided by Leon Bottou for the benefit of the djvudigital device +% which is a device developed and maintained outside of Artifex, and which is +% not a contributed device. +% +% This device does not cope with the method used by pdfwrite to pass the pagelabels +% number tree as a 'blob' of data, but requires that the page labels be passed using +% a PAGELABEL pdfmark. +% +% We don't want to do that with pdfwrite because there is no mechanism in pdfmark syntax +% to pass a tree, which means we'd have to laboriously disassemble the pdfmarks for the +% page labels and rebuild a number tree for it. This would mean pattern matching each +% string passed via PAGELABEL to see if it could be defined as a continuation +% of the preceding string, uing prefixes. Its much easier for us just to pass the tree. +% +% Note that this code simply translates the PageLabels Number tree into a number of +% individual PAGELABEL pdfmarks, if used for pdfwrite this would result in a number +% tree which consists solely of leaf nodes, where each node has a string for its label. +% This can be considerably more verbose than the shorthand possible with a Page Label +% dictionary. +% +/pagelabeldict mark + % (TEXT) .toLower (text) + /.toLower { + dup length 1 sub -1 0 { + 1 index exch 2 copy get 2#00100000 or put + } for + } bind executeonly + % int .cvAlpha (int in alphabetic base 26) + /.cvAlpha { + [ exch % construct an array of ASCII values, in reverse + { % the remainder stays on the top of stack + dup 0 eq { pop exit } if % quit if the value is zero + dup 26 mod dup 0 eq { 26 add } if % so that the division is correct + dup 64 add 3 1 roll sub 26 idiv % save the ASCII value and iterate + } loop ] + dup length dup string 3 1 roll + dup -1 1 { % put the letters in a string + 4 copy sub exch 4 -1 roll 1 sub get put + } for pop pop + } bind executeonly + % int .cvRoman (int in capital Roman numerals) + % convert a positive integer to capital Roman numerals + % return a decimal string if >= 4000 + /.cvRoman { + dup 255 string cvs % start with the decimal representation + exch 4000 lt { % convert only if Roman numerals can represent this + dup length + [ [ () (I) (II) (III) (IV) (V) (VI) (VII) (VIII) (IX) ] + [ () (X) (XX) (XXX) (XL) (L) (LX) (LXX) (LXXX) (XC) ] + [ () (C) (CC) (CCC) (CD) (D) (DC) (DCC) (DCCC) (CM) ] + [ () (M) (MM) (MMM) ] ] % Roman equivalents + () % append the Roman equivalent of each decimal digit to this string + 2 index -1 1 { + 2 index 1 index 1 sub get + 5 index 5 index 4 -1 roll sub get + 48 sub get concatstrings + } for + 4 1 roll pop pop pop + } if + } bind executeonly + % style printers + /PageStyle << + /D { 255 string cvs } bind executeonly + /R { .cvRoman } executeonly + /r { .cvRoman .toLower } executeonly + /A { .cvAlpha } executeonly + /a { .cvAlpha .toLower } executeonly >> + % check whether we want to generate pdfmarks + /wantpagelabelmarks { + % WantsPageLabels means that pagelabels will be passed + % using .pdfpagelabels and not using pdfmarks + /WantsPageLabels /GetDeviceParam .special_op + {pop pop false}{true} ifelse + + %% This is truly ugly..... + %% GSView 5 redefines pdfmark and processes it itself. However if it gets + %% a pdfmark it cannot cope with, it simply fails. Its not prepared to cope + %% with PAGELABEL pdfmarks, so we don't want to send it to them. There's no + %% way for us to fix GSView 5, its long out of any kind of support, but we do + %% try not to break it. We happen to know that GSView 5 installs a GSview + %% dictionary in userdict, so this test simply ensures we don't emit PAGELABEL + %% pdfmarks if that dictioanry is present. + userdict /GSview known {pop false} if + } bind executeonly + % generate pagelabel pdfmark + /dopagelabel { % -- dopagelabel -- + << /S null /P () /O 0 >> begin + wantpagelabelmarks { + Trailer /Root knownoget { + oforce /PageLabels knownoget { + oforce Page# 1 sub + numogetle + { oforce + dup /S knownoget not { //false } if /S exch def + dup /P knownoget not { 0 string } if /P exch def + /St knownoget not { 1 } if exch sub /O exch def + } if + P Page# 1 sub O add PageStyle S knownoget { exec concatstrings } if + mark /Label 3 -1 roll /PAGELABEL pdfmark + } if + } if + } if + end + } bind executeonly +.dicttomark readonly def + % ======================== Main program ======================== % end % pdfdict @@ -199,7 +308,7 @@ currentdict /runpdfstring .undef pdfdict begin pdfopen begin /CumulativePageCount currentpagedevice /PageCount get def -} bind def +} bind executeonly def /runpdfpagerange { % - runpdfpagerange <firstpage#> <lastpage#> <</DisablePageHandler true>> setpagedevice @@ -386,7 +495,7 @@ currentdict /runpdfstring .undef } ifelse } ifelse }ifelse -} bind def +} bind executeonly def /dopdfpages { % firstpage# lastpage# dopdfpages - << /PDFScanRules //true >> setuserparams % set scanning rules for PDF vs. PS @@ -412,7 +521,7 @@ currentdict /runpdfstring .undef % imaged is a PS file. currentpagedevice /PageSpotColors known { << /PageSpotColors -1 >> setpagedevice } if << /PDFScanRules //null >> setuserparams % restore scanning rules for PS -} bind def +} bind executeonly def /runpdfend { RepairedAnError @@ -428,7 +537,7 @@ currentdict /runpdfstring .undef PDFTopSave restore end % userdict 2 vmreclaim % couldn't hurt -} bind def +} bind executeonly def % Copy stream to an external temporary file and % return the file name as PS name. @@ -459,7 +568,7 @@ currentdict /runpdfstring .undef } { closefile } ifelse -} bind def +} bind executeonly def % Recursively enumerate /Names entries % <node> pdf_collection_names /temp_file_name ... @@ -488,7 +597,7 @@ currentdict /runpdfstring .undef } forall } if } ifelse -} bind def +} bind executeonly def % Copy selected subfiles to temporary files and return the file names % as a PostScript names to protect them from restore. @@ -508,7 +617,7 @@ currentdict /runpdfstring .undef pop } ifelse } if -} bind def +} bind executeonly def /runpdf { % <file> runpdf - %% Get the PDF filename (it *must* be a file even if it came from stdin it gets @@ -551,7 +660,7 @@ currentdict /runpdfstring .undef } forall pop } ifelse -} bind def +} bind executeonly def currentdict /pdf_collection_files .undef @@ -560,7 +669,7 @@ end % systemdict % It is OK to use { (%stdin) run } here, because a startjob cannot occur. /.runstdin { { (%stdin) run } execute0 -} bind def +} bind executeonly def end % userdict pdfdict begin @@ -577,14 +686,14 @@ pdfdict begin % they are invalid, the PDF file is probably unreadable anyway. /traileropdict mark - (<<) cvn { /dictlevelcount dictlevelcount 1 add store mark } bind + (<<) cvn { /dictlevelcount dictlevelcount 1 add store mark } bind executeonly (>>) cvn { { .dicttomark } stopped { ( **** Warning: File has unbalanced >> in trailer.\n) pdfformatwarning } if /dictlevelcount dictlevelcount 1 sub def dictlevelcount 0 eq { exit } if - } bind - ([) cvn { mark } bind % ditto + } bind executeonly + ([) cvn { mark } bind executeonly % ditto (]) cvn dup load % /true true % see .pdfexectoken in pdf_base.ps % /false false % ibid. @@ -596,7 +705,7 @@ pdfdict begin ( **** Error: indirect object reference \(R\) encountered with invalid arguments.) pdfformaterror ( Output may be incorrect.\n) pdfformaterror } ifelse - } bind % see Objects below + } bind executeonly % see Objects below .dicttomark readonly def % After reading entry count: skip whitespace, exit on a digit @@ -777,22 +886,22 @@ pdfdict begin pdfformatwarning } if PDFfile traileropdict .pdfrun - } bind def + } bind executeonly def currentdict /xref-char-dict undef % This dicitonary is used to read the xref dictionary. It should work for % reading any dictionary. dictlevelcount must contain 0. /xrefopdict mark - (<<) cvn { /dictlevelcount dictlevelcount 1 add def mark } bind + (<<) cvn { /dictlevelcount dictlevelcount 1 add def mark } bind executeonly (>>) cvn { .dicttomark /dictlevelcount dictlevelcount 1 sub def - dictlevelcount 0 eq { exit} if } bind - ([) cvn { mark } bind % ditto + dictlevelcount 0 eq { exit} if } bind executeonly + ([) cvn { mark } bind executeonly % ditto (]) cvn dup load % /true true % see .pdfexectoken in pdf_base.ps % /false false % ibid. % /null null % ibid. - /R { /resolveR cvx 3 packedarray cvx } bind % see Objects below + /R { /resolveR cvx 3 packedarray cvx } bind executeonly % see Objects below .dicttomark readonly def % Get a variable length positive integer value from a stream. A value @@ -800,7 +909,7 @@ currentdict /xref-char-dict undef /getintn { % <stream> <count> getintn int 0 exch { 256 mul 1 index read pop add } repeat exch pop % Discard stream -} bind def +} bind executeonly def % This array contains handlers for processing the different types of % entries in the XRef stream. @@ -813,7 +922,7 @@ currentdict /xref-char-dict undef % (obj num: ) print 2 index pdfstring cvs print ( ) print % (loc: ) print 1 index pdfstring cvs print ( ) print % (gen: ) print dup === flush - } bind % Do nothing for free xref entries + } bind executeonly % Do nothing for free xref entries % XRef entry type 1 - normal or n type xref entry { % field 2 = obj loc, field 3 = gen num % (normal ) print @@ -823,7 +932,7 @@ currentdict /xref-char-dict undef 0 3 1 roll % set stream number = 0 //false setxrefentry 3 -1 roll pop % remove stream number - } bind + } bind executeonly % XRef entry type 2 - compressed object type xref entry { % field 2 = object stream num, field 3 = index into object stream % (Compressed objects: ) print @@ -831,7 +940,7 @@ currentdict /xref-char-dict undef % (field 2: ) print 1 index pdfstring cvs print ( ) print % (field 3: ) print dup === flush 0 //false setxrefentry pop % set generation number = 0 - } bind + } bind executeonly ] def % Read the PDF 1.5 version of the xref table. @@ -913,7 +1022,7 @@ currentdict /xref-char-dict undef pop % Remove Index array pair loc } for % Loop through Index array entries pop pop % Remove Index array and xref stream - } bind def + } bind executeonly def % Read the cross-reference table. % <pos> is the position either from the startxref statement or the /Prev @@ -967,7 +1076,7 @@ currentdict /xref-char-dict undef } { readpdf15xref } % otherwise assume PDF 1.5 xref stream ifelse - } bind def + } bind executeonly def % Open a PDF file and read the header, trailer, and cross-reference. /pdfopen { % <file> pdfopen <dict> @@ -997,7 +1106,7 @@ currentdict /xref-char-dict undef pdfopenfile begin pdfopencache currentdict end -} bind def +} bind executeonly def /process_trailer_attrs { % - process_trailer_attrs - writeoutputintents @@ -1216,7 +1325,7 @@ currentdict /xref-char-dict undef } ifelse } if } if -} bind def +} bind executeonly def % Verify that each entry in the xref table is pointing at an object with % the correct object number and generation number. @@ -1278,7 +1387,7 @@ currentdict /xref-char-dict undef /PageCount pdfpagecount def /PageNumbers PageCount 65534 .min dict def /PageIndex PageCount 65534 .min array def -} bind def +} bind executeonly def /pdfopenfile { % <file> pdfopenfile <dict> pdfdict readonly pop % can't do it any earlier than this @@ -1441,7 +1550,7 @@ currentdict /xref-char-dict undef verify_page_tree currentdict end - } bind def + } bind executeonly def %% Executing token on a file will close the file if we reach EOF while %% processing. When repairing broken files (or searching for startxref @@ -1468,7 +1577,7 @@ currentdict /xref-char-dict undef } { token } ifelse -} bind def +} bind executeonly def % Look for the last (startxref) from the current position % of the file. Return the position after (startxref) if found or -1 . @@ -1478,7 +1587,7 @@ currentdict /xref-char-dict undef bytesavailable 9 lt { exit } if pop dup fileposition } loop -} bind def +} bind executeonly def % Search for the last 'startxfer' and read a following token, which % must be a number. Don't pay any attention to %%EOF because it's @@ -1510,30 +1619,30 @@ currentdict /xref-char-dict undef ( Output may be incorrect.\n) pdfformaterror /findxref cvx /syntaxerror signalerror } if -} bind def +} bind executeonly def /stderrfile (%stderr) (w) file def /stdoutfile (%stdout) (w) file def /stderrprint { % <string> stderrprint - //stderrfile dup 3 -1 roll writestring flushfile -} bind def +} bind executeonly def /stdoutprint { % <string> stderrprint - //stdoutfile dup 3 -1 roll writestring flushfile -} bind def +} bind executeonly def /pdfformaterror { % <string> pdfformaterror - stdoutprint /Repaired //true store /RepairedAnError //true store -} bind def +} bind executeonly def /pdfformatwarning { % <string> pdfformaterror - QUIET not {stdoutprint}{pop}ifelse /Repaired //true store PDFSTOPONWARNING {/warning cvx /undefined signalerror} if -} bind def +} bind executeonly def /knownoget_safe { 2 copy knownoget { 3 1 roll pop pop //true } { pop pop //false } ifelse @@ -1559,7 +1668,7 @@ currentdict /xref-char-dict undef stderrprint ( <<<<\n) stderrprint } ifelse -} bind def +} bind executeonly def % The UndefProcList collects noisy warnings. % This gets rid of many multiple warnings from pdf_font.ps /printCollectedWarnings { @@ -1571,7 +1680,7 @@ currentdict /xref-char-dict undef } forall (\n) stderrprint } if -} bind def +} bind executeonly def /printrepaired { QUIET not @@ -1587,7 +1696,7 @@ currentdict /xref-char-dict undef ( **** specification.\n\n) stdoutprint } if -} bind def +} bind executeonly def /printrepairederror { QUIET not @@ -1596,7 +1705,7 @@ currentdict /xref-char-dict undef ( **** The rendered output from this file may be incorrect.\n) stdoutprint } if -} bind def +} bind executeonly def % Write the outline structure for a file. Uses linkdest (below). % omit links to pages that don't exist. @@ -1677,14 +1786,14 @@ currentdict /xref-char-dict undef /First knownoget { { dup writeoutline /Next knownoget not { exit } if } loop } if - } bind def + } bind executeonly def % Close a PDF file. /pdfclose % <dict> pdfclose - { begin PDFfile closefile end - } bind def + } bind executeonly def % ======================== Page accessing ======================== % @@ -1730,7 +1839,7 @@ currentdict /xref-char-dict undef ifelse } ifelse - } bind def + } bind executeonly def /obj_get { LocalResources 1 index knownoget { @@ -1754,7 +1863,7 @@ currentdict /xref-char-dict undef pop pop pop 0 }ifelse }ifelse -}bind def +}bind executeonly def % Get the value of a resource on a given page. /rget { % <resname> <pagedict> <restype> rget <value> -true- @@ -1790,7 +1899,7 @@ currentdict /xref-char-dict undef pop pop pop pop } ifelse } ifelse -} bind def +} bind executeonly def % Get the total number of pages in the document. /pdfpagecount % - pdfpagecount <int> @@ -1835,7 +1944,7 @@ currentdict /xref-char-dict undef }{ 0 } ifelse - } bind def + } bind executeonly def % Check for loops in the 'page tree' but accept an acyclic graph. % - verify_page_tree - @@ -1864,7 +1973,7 @@ currentdict /xref-char-dict undef end } if } if -} bind def +} bind executeonly def /pdffindpage? { % <int> pdffindpage? 1 null (page not found) % <int> pdffindpage? 1 noderef (page found) @@ -1886,7 +1995,7 @@ currentdict /xref-char-dict undef % Stack: index null|noderef dup //null eq { pop pop 1 //null exit } if } loop -} bind def +} bind executeonly def % Find the N'th page of the document by iterating through the Pages tree. % The first page is numbered 1. @@ -1901,10 +2010,10 @@ currentdict /xref-char-dict undef { pop pop pop } % don't store more than 65534 pagenumbers ifelse exch pop -} bind def +} bind executeonly def /pdffindpage { % <int> pdffindpage <pagedict> pdffindpageref oforce -} bind def +} bind executeonly def % Find the N'th page of the document. % The first page is numbered 1. @@ -1917,7 +2026,7 @@ currentdict /xref-char-dict undef { exch pop oforce } { pop pdffindpage } ifelse - } bind def + } bind executeonly def % Find the page number of a page object (inverse of pdfgetpage). /pdfpagenumber % <pagedict> pdfpagenumber <int> @@ -1931,7 +2040,7 @@ currentdict /xref-char-dict undef for exch pop } ifelse - } bind def + } bind executeonly def % Arrange the four elements that define a rectangle into a 'normal' order. /normrect_elems % <x1> <y1> <x2> <y2> normrect_elems <llx> <lly> <urx> <ury> @@ -1949,14 +2058,14 @@ currentdict /xref-char-dict undef 2 copy gt { exch } if % <x2> <x1> <lly> <ury> 4 2 roll 2 copy lt { exch } if % <lly> <ury> <urx> <llx> 4 1 roll exch % <llx> <lly> <urx> <ury> -} bind def +} bind executeonly def % Arrange a rectangle into a 'normal' order. I.e the lower left corner % followed by the upper right corner. /normrect % <rect> normrect <rect> { aload pop normrect_elems 4 array astore -} bind def +} bind executeonly def /fix_empty_rect_elems % </Name> <x1> <y1> <x2> <y2> fix_empty_rect_elems <x1> <y1> <x2'> <y2'> { dup 3 index eq { //true } { 1 index 4 index eq } ifelse { @@ -1968,11 +2077,11 @@ currentdict /xref-char-dict undef } { 5 -1 roll pop } ifelse -} bind def +} bind executeonly def /boxrect % <llx> <lly> <urx> <ury> boxrect <x> <y> <w> <h> { exch 3 index sub exch 2 index sub - } bind def + } bind executeonly def /resolvedest { % <name|string|other> resolvedest <other|null> dup type /nametype eq { Trailer /Root oget /Dests knownoget { @@ -1993,12 +2102,12 @@ currentdict /xref-char-dict undef } ifelse } if } ifelse -} bind def +} bind executeonly def % Procedures to do the necessary transformations of view destinations % <PDF2PS_matrix> <rot> <view> -- <view'> /viewdestprocs 8 dict dup begin - /Fit { exch pop exch pop } bind def + /Fit { exch pop exch pop } bind executeonly def /FitH { aload length 2 lt { 1 array astore @@ -2008,7 +2117,7 @@ currentdict /xref-char-dict undef 4 -1 roll transform exch pop 2 array astore } ifelse - } bind def + } bind executeonly def /FitV { aload length 2 lt { 1 array astore @@ -2018,7 +2127,7 @@ currentdict /xref-char-dict undef 4 -1 roll transform pop 2 array astore } ifelse - } bind def + } bind executeonly def /FitB /Fit load def /FitBH /FitH load def /FitBV /FitV load def @@ -2051,14 +2160,14 @@ currentdict /xref-char-dict undef 2 { 3 -1 roll //null eq { pop //null } if exch } repeat % put the nulls back 3 -1 roll 4 array astore - } bind def + } bind executeonly def /FitR { exch pop aload pop 2 { 5 index transform 4 2 roll } repeat normrect_elems 5 array astore exch pop - } bind def + } bind executeonly def end readonly def /linkdest { % <link|outline> linkdest @@ -2109,102 +2218,31 @@ end readonly def ifelse } if -} bind def +} bind executeonly def + + +%% Used to recursively check dictionaries for any /.gs.pdfobj# keys +%% and remove them if so +%% -any- /Removepdfobj# -any- + +/Removepdfobj# +{ + dup type /dicttype eq { + dup /.gs.pdfobj# known { + dup /.gs.pdfobj# undef + } if + dup {Removepdfobj# 2 index 3 1 roll put} forall + } if +}bind executeonly def + % <pagedict> mark ... -proc- <page#> <error> /namedactions 8 dict dup begin - /FirstPage { 1 /CumulativePageCount where {pop CumulativePageCount}{0}ifelse add //false } def - /LastPage { pdfpagecount /CumulativePageCount where {pop CumulativePageCount}{0}ifelse add //false } def - /NextPage { counttomark 2 add index pdfpagenumber 1 add dup pdfpagecount gt exch /CumulativePageCount where {pop CumulativePageCount}{0}ifelse add exch} bind def - /PrevPage { counttomark 2 add index pdfpagenumber 1 sub dup 1 lt exch /CumulativePageCount where {pop CumulativePageCount}{0}ifelse add exch} bind def + /FirstPage { 1 /CumulativePageCount where {pop CumulativePageCount}{0}ifelse add //false } bind executeonly def + /LastPage { pdfpagecount /CumulativePageCount where {pop CumulativePageCount}{0}ifelse add //false } bind executeonly def + /NextPage { counttomark 2 add index pdfpagenumber 1 add dup pdfpagecount gt exch /CumulativePageCount where {pop CumulativePageCount}{0}ifelse add exch} bind executeonly def + /PrevPage { counttomark 2 add index pdfpagenumber 1 sub dup 1 lt exch /CumulativePageCount where {pop CumulativePageCount}{0}ifelse add exch} bind executeonly def end readonly def % <pagedict> <annotdict> -proc- - -/annottypes 5 dict dup begin - /Text { - mark exch - { /Rect /Open /Contents /F} - { 2 copy knownoget { 3 -1 roll } { pop } ifelse } - forall pop {/ANN pdfmark} stopped {cleartomark} if - } bind def - /Link { - /NO_PDFMARK_DESTS where {pop NO_PDFMARK_DESTS not}{true}ifelse - { - mark exch - dup /BS knownoget { << exch { oforce } forall >> /BS exch 3 -1 roll } if - dup /F knownoget { /F exch 3 -1 roll } if - dup /C knownoget { /Color exch 3 -1 roll } if - dup /Rect knownoget { /Rect exch 3 -1 roll } if - dup /Border knownoget { - dup type /arraytype eq { - dup length 3 lt - } { - //true - } ifelse { - pop [ 0 0 0 ] % Following AR5 use invisible border. - } if - /Border exch 3 -1 roll - } if - dup /A knownoget { - dup /URI known { - /A mark 3 2 roll % <<>> /A [ <<action>> - { oforce } forall - .dicttomark - 3 2 roll - } { - dup /S knownoget { - %% Because we process GoTo Destinations into absolute references in the PDF file - %% we need to resolve the /D or /Dest. However, we must *not* do this for - %% GoToR Destinations because (obviously) those are in a different file and - %% we cannot resolve them into absolute references. We don't need to anyway - %% because that file must already have a named destination. - dup /GoTo eq { - pop - dup /D knownoget { - exch pop exch dup length dict copy dup /Dest 4 -1 roll put - } if - }{ - dup /GoToR eq { - pop /A mark % <<..action dict..>> /A [ - 3 2 roll % /A [ <<..action dict..>> - { oforce } forall - .dicttomark - 3 2 roll - }{ - dup /Launch eq { - pop /A mark % <<..action dict..>> /A [ - 3 2 roll % /A [ <<..action dict..>> - { oforce } forall - .dicttomark - 3 2 roll - }{ - /Named eq { - /N knownoget { - namedactions exch .knownget { - exec { - pop - ( **** Warning: Ignoring a named action pointing out of the document page range.\n) - pdfformatwarning - } { - /Page exch 3 -1 roll - } ifelse - } if - } if - } if - }ifelse - } ifelse - } ifelse - } if - } ifelse - } if - { linkdest } stopped { - cleartomark - ( **** Warning: Link annotation points out of the document page range.\n) - pdfformatwarning - } { - pop {/LNK pdfmark} stopped {cleartomark} if - } ifelse - }{pop} ifelse - } bind def -end readonly def % **** The following procedure should not be changed to allow clients % **** to directly interface with the constituent procedures. GSview @@ -2216,14 +2254,14 @@ end readonly def pdfshowpage_init % <pagedict> pdfshowpage_setpage % <pagedict> pdfshowpage_finish % - - } bind def + } bind executeonly def /pdfpagecontents % <pagedict> pdfpagecontents <contents> - { } bind def + { } bind executeonly def /pdfshowpage_init % <pagedict> pdfshowpage_init <pagedict> { /DSCPageCount DSCPageCount 1 add store - } bind def + } bind executeonly def /get_media_box { % <pagedict> get_media_box <box> <bool> /MediaBox pget { @@ -2234,7 +2272,7 @@ end readonly def ( Output may be incorrect.\n) pdfformaterror [ 0 0 currentpagedevice /PageSize get aload pop ] //false } ifelse -} bind def +} bind executeonly def /get_any_box { % <pagedict> get_any_box <box name> <box> //systemdict /UseBleedBox .knownget dup { and } if { @@ -2325,7 +2363,7 @@ end readonly def } ifelse 4 array astore % /SomeBox [mX0 mY0 mX1 mY1] } ifelse -} bind def +} bind executeonly def % Compute the matrix that transforms the PDF->PS "default" user space /pdf_PDF2PS_matrix { % <pdfpagedict> -- matrix @@ -2405,7 +2443,7 @@ end readonly def % stack: savedCTM <pdfpagedict> pop matrix currentmatrix exch setmatrix -} bind def +} bind executeonly def % Cache the matrix that transforms the PDF->PS "default" user space % into <pdfpagedict> under the key //PDF2PS_matrix_key, then return it @@ -2417,13 +2455,13 @@ end readonly def dup dup pdf_PDF2PS_matrix //PDF2PS_matrix_key exch put //PDF2PS_matrix_key get } ifelse -} bind def +} bind executeonly def currentdict /PDF2PS_matrix_key undef /.pdfshowpage_Install { % <pagedict> [<prevproc>] .pdfshowpage_Install - 0 get exec pdf_cached_PDF2PS_matrix concat -} bind def +} bind executeonly def /pdfshowpage_setpage { % <pagedict> pdfshowpage_setpage <pagedict> 6 dict begin % for setpagedevice @@ -2524,7 +2562,7 @@ currentdict /PDF2PS_matrix_key undef /Install exch def % Stack: pagedict currentpagedict pop currentdict end setpagedevice -} bind def +} bind executeonly def /.free_page_resources { % - .free_page_resources - Page /Resources pget { @@ -2538,7 +2576,7 @@ currentdict /PDF2PS_matrix_key undef } forall } if } if -} bind def +} bind executeonly def /pdfshowpage_finish { % <pagedict> pdfshowpage_finish - save /PDFSave exch store @@ -2551,6 +2589,9 @@ currentdict /PDF2PS_matrix_key undef .writepdfmarks { + % Pagelabel + pagelabeldict begin dopagelabel end + % Copy the boxes. % Copy the boxes. { /CropBox /BleedBox /TrimBox /ArtBox } { 2 copy pget { @@ -2563,20 +2604,6 @@ currentdict /PDF2PS_matrix_key undef pop } ifelse } forall - - % Copy annotations and links. - dup /Annots knownoget { - 0 1 2 index length 1 sub - { 1 index exch oget - dup type /dicttype eq { - dup /Subtype oget annottypes exch .knownget { exec } { pop } ifelse - } { - pop - } ifelse - } - for pop - } if - } if % end .writepdfmarks % Display the actual page contents. @@ -2688,7 +2715,7 @@ currentdict /PDF2PS_matrix_key undef .setglobal /RepairedAnError exch def /Repaired exch def -} bind def +} bind executeonly def % Display the contents of a page (including annotations). /showpagecontents { % <pagedict> showpagecontents - @@ -2746,7 +2773,7 @@ currentdict /PDF2PS_matrix_key undef //systemdict /ShowAcroForm .knownget { //true eq } { //false } ifelse { Trailer /Root oget /AcroForm knownoget { draw_acro_form } if } if -} bind def +} bind executeonly def /processcolorspace { % - processcolorspace <colorspace> % The following is per the PLRM3. @@ -2754,7 +2781,7 @@ currentdict /PDF2PS_matrix_key undef exch pop exch pop dup type /nametype ne { cvn } if dup { setcolorspace } .internalstopped { pop /DeviceRGB } if -} bind def +} bind executeonly def % ------ Transparency support ------ % @@ -2795,7 +2822,7 @@ currentdict /PDF2PS_matrix_key undef % Also check for transparency in the annotation (if not in resources). { pop //true } { annotsusetransparency } ifelse } ifelse -} bind def +} bind executeonly def % Check if transparency is specified in an ExtGState dict /extgstateusestransparency { % <gstate dict> extgstateusestransparency <bool> @@ -2813,7 +2840,7 @@ currentdict /PDF2PS_matrix_key undef pop exit } loop } ifelse -} bind def +} bind executeonly def % Check if transparency is used in a Pattern /patternusestransparency { % <Pattern dict> patternusestransparency <bool> @@ -2827,7 +2854,7 @@ currentdict /PDF2PS_matrix_key undef } loop } ifelse -} bind def +} bind executeonly def % Check the Resources of a page or Form. Check for loops in the resource chain. /resourceusestransparency { % <dict> <dict> resourceusestransparency <bool> @@ -2895,7 +2922,7 @@ currentdict /PDF2PS_matrix_key undef pop //false exit } loop exch pop -} bind def +} bind executeonly def % Check if the annotations on a page use transparency /annotsusetransparency { % <page dict> annotsusetransparency <bool> @@ -2932,14 +2959,14 @@ currentdict /PDF2PS_matrix_key undef } ifelse } forall % For all annots on the page } if -} bind def +} bind executeonly def % Add a color name to our spot color list. Ignore /All and /None /putspotcolor { % <name> <spotcolordict> putspotcolor - % The 'name' could be a string. If so then convert to a name. exch dup type /stringtype eq { cvn } if dup dup /None eq exch /All eq or { pop pop } { 0 put } ifelse -} bind def +} bind executeonly def % Determine which spot colors are used within a color space Note: This % dict will include all colors used in Separation or DeviceN color spaces. @@ -2964,7 +2991,7 @@ currentdict /PDF2PS_matrix_key undef } ifelse } if pop pop -} bind def +} bind executeonly def % Check the Resources of a page, form, or annotation. Determine which spot % colors are used within the resource Note: The spot color dict will include @@ -3039,7 +3066,7 @@ currentdict /PDF2PS_matrix_key undef } if exit } loop -} bind def +} bind executeonly def % Determine which spot colors are used within the annotations. Note: This % dict will include all colors used in Separation or DeviceN color spaces. @@ -3058,7 +3085,7 @@ currentdict /PDF2PS_matrix_key undef pop } ifelse } forall -} bind def +} bind executeonly def % Determine spot colors are used within a page. We are creating a dict to % hold the spot color names as keys. Using a dict avoids having to worry @@ -3093,7 +3120,7 @@ currentdict /PDF2PS_matrix_key undef 3 -1 roll /Annots knownoget { annotsspotcolors } if pop % Discard reference loop dict -} bind def +} bind executeonly def % Determine how many (if any) spot colors are used by a page. % Note: This count does not include Cyan, Magenta, Yellow, or Black @@ -3104,7 +3131,7 @@ currentdict /PDF2PS_matrix_key undef [ /Cyan /Magenta /Yellow /Black ] { 2 index exch known { 1 sub } if } forall exch pop % Remove spot color dict -} bind def +} bind executeonly def % ------ ColorSpace substitution support ------ % @@ -3134,7 +3161,7 @@ currentdict /PDF2PS_matrix_key undef } ifelse } if } if -} bind def +} bind executeonly def %% <loopdict> <Objectdict> <calling obj_num> pdfform_detect_cspacesub <boolean> %% @@ -3218,7 +3245,7 @@ currentdict /PDF2PS_matrix_key undef } loop %% remove and discard the loopdict exch pop -} bind def +} bind executeonly def % % <pagedict> pdfshowpage_detect_cspacesub <pagedict> <boolean> @@ -3236,7 +3263,7 @@ currentdict /PDF2PS_matrix_key undef /HighLevelDevice /GetDeviceParam .special_op { exch pop not exch pop }if -} bind def +} bind executeonly def % % <pagedict> pdfshowpage_setcspacesub <pagedict> @@ -3309,7 +3336,7 @@ currentdict /PDF2PS_matrix_key undef pop } ifelse } if -} bind def +} bind executeonly def % Write OutputIntents to device if the device handles it /writeoutputintents { @@ -3370,7 +3397,7 @@ currentdict /PDF2PS_matrix_key undef pop pop } if } if -} bind def +} bind executeonly def end % pdfdict .setglobal @@ -3393,6 +3420,7 @@ DELAYBIND not { /.setfillconstantalpha /.setalphaisshape /.currentalphaisshape /.settextspacing /.currenttextspacing /.settextleading /.currenttextleading /.settextrise /.currenttextrise /.setwordspacing /.currentwordspacing /.settexthscaling /.currenttexthscaling +/.setdistillerparams % Used by our own test suite files %/.pushpdf14devicefilter % transparency-example.ps diff --git a/Master/tlpkg/tlgs/Resource/Init/pdf_ops.ps b/Master/tlpkg/tlgs/Resource/Init/pdf_ops.ps index 589d0d5d927..c45fc519be5 100644 --- a/Master/tlpkg/tlgs/Resource/Init/pdf_ops.ps +++ b/Master/tlpkg/tlgs/Resource/Init/pdf_ops.ps @@ -22,7 +22,7 @@ % to think this interpreter is a distiller. % (If this interpreter really is a distiller, don't do this.) systemdict /pdfmark known not - { userdict /pdfmark { cleartomark } bind put } if + { userdict /pdfmark { cleartomark } bind executeonly put } if userdict /GS_PDF_ProcSet 256 dict dup begin @@ -71,10 +71,10 @@ nodict readonly pop 20 dict copy dup begin 1 packedarray cvx executeonly /self exch def graphicsbeginpage textbeginpage -} bdef +} bind executeonly def /endpage { % - endpage - showpage end -} bdef +} bind executeonly def /graphicsbeginpage { initgraphics @@ -82,7 +82,7 @@ nodict readonly pop currentdict /ClipRect knownoget { aload pop rectclip } if 0 g 0 G //false op //false OP 0 OPM 1 ca 1 CA //null SMask //false AIS /Compatible BM //true TK -} bdef +} bind executeonly def % We must allow /Show to be set, otherwise a text operation can % end up in infinite recursion with showfirst calling Show, and @@ -102,7 +102,7 @@ end def exch currentdict //nodict eq { /self dup load end 5 dict begin def } if def } ifelse - } bdef + } bind executeonly def currentdict /gput_always_allow .undef /q { @@ -139,7 +139,7 @@ currentdict /gput_always_allow .undef }ifelse } ifelse PDFusingtransparency { .pushextendedgstate } if -} bdef +} bind executeonly def % Some PDF files have excess Q operators! /Q { @@ -193,12 +193,12 @@ currentdict /gput_always_allow .undef pdfformaterror } ifelse } if -} bdef +} bind executeonly def % Save PDF gstate /qstate { % - qstate <qstate> gstate -} bdef +} bind executeonly def % Set PDF gstate /setqstate { % <qstate> setqstate - @@ -209,11 +209,11 @@ currentdict /gput_always_allow .undef exch setgstate matrix currentmatrix matrix setmatrix exch newpath uappend setmatrix } ifelse -} bdef +} bind executeonly def % ---------------- Color setting ---------------- % -/nullpatternproc { pop } bdef +/nullpatternproc { pop } bind executeonly def /nullpattern mark /PatternType 1 /PaintType 1 /TilingType 3 /BBox [0 0 1 1] /XStep 1 /YStep 1 /PaintProc //nullpatternproc @@ -264,33 +264,33 @@ currentdict /gput_always_allow .undef DefaultQstate exch put } if } ifelse -} bdef +} bind executeonly def /CSdict mark - /DeviceGray { 0 } bind - /DeviceRGB { [0 0 0] cvx } bind - /DeviceCMYK { [0 0 0 1] cvx } bind - /CIEBasedA { 0 } bind - /CIEBasedABC { [0 0 0] cvx } bind - /CalGray { pop /DeviceGray 0 } bind - /CalRGB { pop /DeviceRGB [0 0 0] cvx } bind - /Lab {[0 0 0] cvx } bind - /ICCBased { [ 1 index 1 oget /N get { 0 } repeat ] cvx } bind - /Separation { 1 } bind + /DeviceGray { 0 } bind executeonly + /DeviceRGB { [0 0 0] cvx } bind executeonly + /DeviceCMYK { [0 0 0 1] cvx } bind executeonly + /CIEBasedA { 0 } bind executeonly + /CIEBasedABC { [0 0 0] cvx } bind executeonly + /CalGray { pop /DeviceGray 0 } bind executeonly + /CalRGB { pop /DeviceRGB [0 0 0] cvx } bind executeonly + /Lab {[0 0 0] cvx } bind executeonly + /ICCBased { [ 1 index 1 oget /N get { 0 } repeat ] cvx } bind executeonly + /Separation { 1 } bind executeonly /DeviceN { % What is the correct value?? [ 1 index 1 get length { 1 } repeat ] cvx - } bind - /Indexed { 0 } bind - /Pattern { //nullpattern matrix makepattern } bind + } bind executeonly + /Indexed { 0 } bind executeonly + /Pattern { //nullpattern matrix makepattern } bind executeonly .dicttomark readonly def -/ri {//.renderingintentdict exch .knownget { .setrenderingintent } if } bdef -/g {/DeviceGray .setfillcolorspace .setfillcolor } bdef -/G {/DeviceGray .setstrokecolorspace .setstrokecolor} bdef -/rg {/DeviceRGB .setfillcolorspace .setfillcolor} bdef -/RG {/DeviceRGB .setstrokecolorspace .setstrokecolor} bdef -/k {/DeviceCMYK .setfillcolorspace .setfillcolor} bdef -/K {/DeviceCMYK .setstrokecolorspace .setstrokecolor} bdef +/ri {//.renderingintentdict exch .knownget { .setrenderingintent } if } bind executeonly def +/g {/DeviceGray .setfillcolorspace .setfillcolor } bind executeonly def +/G {/DeviceGray .setstrokecolorspace .setstrokecolor} bind executeonly def +/rg {/DeviceRGB .setfillcolorspace .setfillcolor} bind executeonly def +/RG {/DeviceRGB .setstrokecolorspace .setstrokecolor} bind executeonly def +/k {/DeviceCMYK .setfillcolorspace .setfillcolor} bind executeonly def +/K {/DeviceCMYK .setstrokecolorspace .setstrokecolor} bind executeonly def /cs {dup dup type /nametype ne { 0 get } if dup /ICCBased eq { 1 index 1 get /OrigN .knownget not {1 index 1 get /N get} if mark @@ -325,7 +325,7 @@ currentdict /gput_always_allow .undef } { //CSdict exch get exec exch .setfillcolorspace exec .setfillcolor } ifelse -} bdef +} bind executeonly def /CS {dup dup type /nametype ne { 0 get } if dup /ICCBased eq { 1 index 1 get /OrigN .knownget not {1 index 1 get /N get} if mark @@ -359,11 +359,11 @@ currentdict /gput_always_allow .undef } { //CSdict exch get exec exch .setstrokecolorspace exec .setstrokecolor } ifelse -} bdef -/sc {.setfillcolor} bdef -/SC {.setstrokecolor} bdef -/sc* {.setfillcolor} bdef -/SC* {.setstrokecolor} bdef +} bind executeonly def +/sc {.setfillcolor} bind executeonly def +/SC {.setstrokecolor} bind executeonly def +/sc* {.setfillcolor} bind executeonly def +/SC* {.setstrokecolor} bind executeonly def /sc*_and_set { dup type /dicttype eq { @@ -376,7 +376,7 @@ currentdict /gput_always_allow .undef } ifelse } if .setfillcolor -} bdef +} bind executeonly def /SC*_and_set { dup type /dicttype eq { @@ -389,9 +389,9 @@ currentdict /gput_always_allow .undef } ifelse } if .setstrokecolor -} bdef -/sc1 {.setfillcolor} bdef -/SC1 {.setstrokecolor} bdef +} bind executeonly def +/sc1 {.setfillcolor} bind executeonly def +/SC1 {.setstrokecolor} bind executeonly def /sc1_and_set { dup type /dicttype eq { @@ -404,7 +404,7 @@ currentdict /gput_always_allow .undef } ifelse } if .setfillcolor -} bdef +} bind executeonly def /SC1_and_set { dup type /dicttype eq { @@ -417,9 +417,9 @@ currentdict /gput_always_allow .undef } ifelse } if .setstrokecolor -} bdef -/csput {dup dup type /nametype ne { 0 get } if //CSdict exch get exec exch 2 copy .setfillcolorspace exec .setfillcolor .setstrokecolorspace exec .setstrokecolor} bdef -/csset {dup dup type /nametype ne { 0 get } if //CSdict exch get exec exch} bdef +} bind executeonly def +/csput {dup dup type /nametype ne { 0 get } if //CSdict exch get exec exch 2 copy .setfillcolorspace exec .setfillcolor .setstrokecolorspace exec .setstrokecolor} bind executeonly def +/csset {dup dup type /nametype ne { 0 get } if //CSdict exch get exec exch} bind executeonly def % ---------------- Color setting ---------------- % @@ -427,14 +427,14 @@ currentdict /gput_always_allow .undef % ---------------- Overprint/transparency setting ---------------- % /op { .setfilloverprint -} bdef % NB pdf_draw:gsparamdict handled /OP with no /op +} bind executeonly def % NB pdf_draw:gsparamdict handled /OP with no /op /OP { .setstrokeoverprint -} bdef +} bind executeonly def /OPM { /.setoverprintmode where { pop dup .setoverprintmode .swapcolors .setoverprintmode .swapcolors } { pop } ifelse -} bdef -/ca { .setfillconstantalpha } bdef -/CA { .setstrokeconstantalpha } bdef +} bind executeonly def +/ca { .setfillconstantalpha } bind executeonly def +/CA { .setstrokeconstantalpha } bind executeonly def /SMask { dup type /booleantype eq { .currentSMask type /dicttype eq { @@ -451,8 +451,8 @@ currentdict /gput_always_allow .undef %% a gsave, so we haven't copied it to /self, if we don't do that here %% then transparent annotations cause an invalid access error. currentdict //nodict eq {/self dup load end 5 dict begin def} if -} bdef -/AIS { .setalphaisshape } bdef +} bind executeonly def +/AIS { .setalphaisshape } bind executeonly def /BM { /.setblendmode where { pop [ exch dup type /nametype ne { aload pop } if /Normal ] { @@ -461,15 +461,15 @@ currentdict /gput_always_allow .undef } { pop } ifelse -} bdef +} bind executeonly def /TK { /.settextknockout where { pop .settextknockout } { pop } ifelse -} bdef +} bind executeonly def /UseBlackPtComp { %% Our implementation of black point compensation uses 0 or 1, not a boolean /.setblackptcomp where {pop false eq {0}{1}ifelse .setblackptcomp }{ pop } ifelse -} bdef +} bind executeonly def % ---------------- Color installation ---------------- % @@ -488,7 +488,7 @@ currentdict /gput_always_allow .undef } { pop pop } ifelse -} bdef +} bind executeonly def /.settransparencymask { % <paramdict> <masknum> .settransparencymask - exch dup type /dicttype ne { PDFusingtransparency { @@ -507,24 +507,24 @@ currentdict /gput_always_allow .undef dup /Draw get exec } ifelse } ifelse -} bdef +} bind executeonly def % (Non-mask) images must execute setfillblend. /setfillblend { .currentfillconstantalpha .currentSMask .settransparencyparams -} def +} bind executeonly def /setfillstate { setfillblend -} def +} bind executeonly def /setstrokestate { .currentstrokeconstantalpha .currentSMask .settransparencyparams -} def +} bind executeonly def /Cdict 15 dict dup begin % <color...> <colorspace> -proc- - - /DeviceGray { pop setgray } bdef - /DeviceRGB { pop setrgbcolor } bdef - /DeviceCMYK { pop setcmykcolor } bdef - /CIEBasedA { setgcolorspace setcolor } bdef + /DeviceGray { pop setgray } bind executeonly def + /DeviceRGB { pop setrgbcolor } bind executeonly def + /DeviceCMYK { pop setcmykcolor } bind executeonly def + /CIEBasedA { setgcolorspace setcolor } bind executeonly def /CIEBasedABC /CIEBasedA load def /CIEBasedDEF /CIEBasedA load def /CIEBasedDEFG /CIEBasedA load def @@ -580,7 +580,7 @@ currentdict /gput_always_allow .undef cleartomark pop } ifelse - } bdef + } bind executeonly def /Separation /CIEBasedA load def /DeviceN /CIEBasedA load def /Indexed /CIEBasedA load def @@ -632,37 +632,37 @@ currentdict /gput_always_allow .undef } if } ifelse setcolor - } bdef + } bind executeonly def end def /setgcolor % (null | <color...>) <colorspace> setgcolor - { 1 index //null eq { pop pop } { dup 0 get //Cdict exch get exec } ifelse - } bdef + } bind executeonly def % Compare the old and new color spaces in an attempt to avoid expensive % reloads of CIEBased color spaces. /PCSdict 15 dict dup begin % <colorspace> -proc- <colorspace|pdfcspace> - /CIEBasedA { dup 1 get /PDFColorSpace .knownget { exch pop } if } bdef + /CIEBasedA { dup 1 get /PDFColorSpace .knownget { exch pop } if } bind executeonly def /CIEBasedABC /CIEBasedA load def /CIEBasedDEF /CIEBasedA load def /CIEBasedDEFG /CIEBasedA load def /Indexed { dup 1 get dup pdfcolorspace 2 copy ne { 3 1 roll } if pop pop - } bdef + } bind executeonly def end def /pdfcolorspace { % <colorspace> pdfcolorspace <colorspace|pdfcspace> dup type /arraytype eq { //PCSdict 1 index 0 get .knownget { exec } if } if -} bdef +} bind executeonly def /setgcolorspace { % <colorspace> setgcolorspace - dup pdfcolorspace currentcolorspace pdfcolorspace eq { pop } { setcolorspace } ifelse -} bdef +} bind executeonly def /OPsavedict 2 dict def % for saveOP, saveBM @@ -685,7 +685,7 @@ end def } { pop //false } ifelse -} bdef +} bind executeonly def /fsexec % <fillop|strokeop> fsexec - { @@ -713,7 +713,7 @@ end def } { cvx exec } ifelse -} bdef +} bind executeonly def % ---------------- Path painting and clipping ---------------- % @@ -734,9 +734,9 @@ end def currentdict /qTextSaveMatrix get setmatrix } if } ifelse -} bind def +} bind executeonly def -/normal_m { { moveto } stopped { count pdfemptycount sub 2 .min { pop } repeat 0 0 moveto } if } bdef +/normal_m { { moveto } stopped { count pdfemptycount sub 2 .min { pop } repeat 0 0 moveto } if } bind executeonly def /inside_text_m { { matrix currentmatrix 3 1 roll @@ -745,9 +745,9 @@ end def setmatrix } stopped { count pdfemptycount sub 2 .min { pop } repeat 0 0 moveto } if -} bdef +} bind executeonly def -/normal_l { { lineto } stopped { count pdfemptycount sub 2 .min { pop } repeat } if } bdef +/normal_l { { lineto } stopped { count pdfemptycount sub 2 .min { pop } repeat } if } bind executeonly def /inside_text_l { { matrix currentmatrix 3 1 roll @@ -756,9 +756,9 @@ end def setmatrix } stopped { count pdfemptycount sub 2 .min { pop } repeat } if -} bdef +} bind executeonly def -/normal_c { { curveto } stopped { count pdfemptycount sub 6 .min { pop } repeat } if } bdef +/normal_c { { curveto } stopped { count pdfemptycount sub 6 .min { pop } repeat } if } bind executeonly def /inside_text_c { { matrix currentmatrix 7 1 roll @@ -767,14 +767,14 @@ end def setmatrix } stopped { count pdfemptycount sub 6 .min { pop } repeat } if -} bdef +} bind executeonly def /normal_v { count pdfemptycount sub 4 ge { { currentpoint 6 2 roll curveto } stopped { count pdfemptycount sub 6 .min { pop } repeat } if } { count pdfemptycount sub { pop } repeat } ifelse - } bdef + } bind executeonly def /inside_text_v { count pdfemptycount sub 4 ge { { matrix currentmatrix 5 1 roll @@ -785,9 +785,9 @@ end def } { count pdfemptycount sub { pop } repeat } ifelse - } bdef + } bind executeonly def -/normal_y { { 2 copy curveto } stopped { count pdfemptycount sub 6 .min { pop } repeat } if } bdef +/normal_y { { 2 copy curveto } stopped { count pdfemptycount sub 6 .min { pop } repeat } if } bind executeonly def /inside_text_y { { matrix currentmatrix 5 1 roll @@ -796,19 +796,19 @@ end def setmatrix } stopped { count pdfemptycount sub 6 .min { pop } repeat } if -} bdef +} bind executeonly def /normal_re { 4 2 roll moveto exch dup 0 rlineto 0 3 -1 roll rlineto neg 0 rlineto closepath - } bdef + } bind executeonly def /inside_text_re { matrix currentmatrix 5 1 roll check_and_set_saved_matrix 4 2 roll moveto exch dup 0 rlineto 0 3 -1 roll rlineto neg 0 rlineto closepath setmatrix - } bdef + } bind executeonly def /S { OFFlevels length 0 eq { @@ -816,7 +816,7 @@ end def } { newpath } ifelse -} bdef +} bind executeonly def /f { OFFlevels length 0 eq { @@ -824,7 +824,7 @@ end def } { newpath } ifelse -} bdef +} bind executeonly def /f* { OFFlevels length 0 eq { @@ -832,11 +832,11 @@ end def } { newpath } ifelse -} bdef +} bind executeonly def -/n { newpath } bdef % don't allow n to get bound in +/n { newpath } bind executeonly def % don't allow n to get bound in -/s { closepath S } bdef +/s { closepath S } bind executeonly def /B { OFFlevels length 0 eq { @@ -860,9 +860,9 @@ end def } { newpath } ifelse -} bdef +} bind executeonly def -/b { closepath B } bdef +/b { closepath B } bind executeonly def /B* { OFFlevels length 0 eq { @@ -886,16 +886,16 @@ end def } { newpath } ifelse -} bdef +} bind executeonly def -/b* { closepath B* } bdef +/b* { closepath B* } bind executeonly def % Clipping: /Wdict 8 dict dup begin -/S { OFFlevels length 0 eq { gsave setstrokestate .swapcolors stroke .swapcolors grestore } if n } bdef -/f { OFFlevels length 0 eq { gsave setfillstate fill grestore } if n } bdef -/f* { OFFlevels length 0 eq { gsave setfillstate eofill grestore } if n } bdef +/S { OFFlevels length 0 eq { gsave setstrokestate .swapcolors stroke .swapcolors grestore } if n } bind executeonly def +/f { OFFlevels length 0 eq { gsave setfillstate fill grestore } if n } bind executeonly def +/f* { OFFlevels length 0 eq { gsave setfillstate eofill grestore } if n } bind executeonly def /B { OFFlevels length 0 eq { PDFusingtransparency { @@ -920,8 +920,8 @@ end def } ifelse } if n -} bdef -/b { closepath B } bdef +} bind executeonly def +/b { closepath B } bind executeonly def /B* { OFFlevels length 0 eq { PDFusingtransparency { @@ -943,16 +943,16 @@ end def } ifelse } if n -} bdef -/b { closepath B* } bdef -/n { end { currentpoint } stopped not { pop pop clip } if newpath } bdef +} bind executeonly def +/b { closepath B* } bind executeonly def +/n { end { currentpoint } stopped not { pop pop clip } if newpath } bind executeonly def end readonly def -/W { //Wdict begin } bdef +/W { //Wdict begin } bind executeonly def /W*dict 8 dict dup begin Wdict { def } forall -/n { end { currentpoint } stopped not { pop pop eoclip } if newpath } bdef +/n { end { currentpoint } stopped not { pop pop eoclip } if newpath } bind executeonly def end readonly def -/W* { //W*dict begin } bdef +/W* { //W*dict begin } bind executeonly def % ---------------- Text control ---------------- % /textbeginpage @@ -961,7 +961,7 @@ end readonly def /FontMatrixNonHV //false def /Show { showfirst } def /TextFillStateNeeded //true def - } bdef + } bind executeonly def /TestDegenerateCTM { matrix currentmatrix @@ -977,7 +977,7 @@ end readonly def }{ false } ifelse -} bdef +} bind executeonly def % Contrary to the statement in the PDF manual, BT and ET *can* be nested, % if the CharProc for a Type 3 font does a BT/ET itself. @@ -1001,7 +1001,7 @@ end readonly def 1 scale } if .currenttextrise 0 ne { 0 .currenttextrise translate } if -} bdef +} bind executeonly def /settextstate { % The text state can be set even outside BT/ET. @@ -1021,7 +1021,23 @@ end readonly def 6 array astore setmatrix settextmatrix } if -} bdef + currentdict /qTextSaveMatrix known { + qTextSaveMatrix + aload pop + 5 index 0 ne 3 index 0 ne and + 5 index 0 ne 5 index 0 ne and or not { + (\n **** Error: Invalid (0 scaling) text matrix for Tm ****\n) + pdfformaterror + ( Output may be incorrect.\n) pdfformaterror + % handle invalid scale by using a really small value + 2 -6 roll pop pop pop pop + 0.00000001 0 0 0.00000001 + 6 -2 roll + }if + 6 array astore + setmatrix settextmatrix + } if +} bind executeonly def /settextposition { % Update the TextMatrix translation. gsave TextSaveMatrix setmatrix @@ -1046,7 +1062,13 @@ end readonly def ( Ignroing error, output may be incorrect.\n) pdfformaterror grestore } ifelse -} bdef +} bind executeonly def + +%% Do not make the procedures here executeonly. The /m procedure is +%% tested in /.pdf_paintproc in pdf_draw.ps, we need to be able to +%% read the name of the procedure from here in order to determine +%% whether we are inside a text block. The procedures themselves +%% are already executeonly anyway. /switch_to_text_marking_ops { pdfopdict /m {inside_text_m} bind .forceput @@ -1055,7 +1077,7 @@ end readonly def pdfopdict /v {inside_text_v} bind .forceput pdfopdict /y {inside_text_y} bind .forceput pdfopdict /re {inside_text_re} bind .forceput -} bdef +} bind executeonly def /switch_to_normal_marking_ops { pdfopdict /m {normal_m} bind .forceput @@ -1064,7 +1086,7 @@ end readonly def pdfopdict /v {normal_v} bind .forceput pdfopdict /y {normal_y} bind .forceput pdfopdict /re {normal_re} bind .forceput -} bdef +} bind executeonly def /BT { currentdict /TextSaveMatrix known { @@ -1106,7 +1128,7 @@ end readonly def .begintransparencytextgroup } if -} bdef +} bind executeonly def /ET_NO_TXT_KO { currentdict /TextSaveMatrix known { @@ -1131,7 +1153,7 @@ end readonly def currentdict /qTextSaveMatrix known not { switch_to_normal_marking_ops } if -} bdef +} bind executeonly def /ET { //ET_NO_TXT_KO exec @@ -1139,13 +1161,13 @@ end readonly def PDFusingtransparency .currenttextknockout and { .endtransparencytextgroup } if -} bdef +} bind executeonly def -/Tc { .settextspacing { showfirst } /Show gput } bdef -/TL { .settextleading } bdef -/Tr { .settextrenderingmode { showfirst } /Show gput } bdef -/Ts { .settextrise settextstate } bdef -/Tw { .setwordspacing { showfirst } /Show gput } bdef +/Tc { .settextspacing { showfirst } /Show gput } bind executeonly def +/TL { .settextleading } bind executeonly def +/Tr { .settextrenderingmode { showfirst } /Show gput } bind executeonly def +/Ts { .settextrise settextstate } bind executeonly def +/Tw { .setwordspacing { showfirst } /Show gput } bind executeonly def /Tz { dup 0 eq { (\n **** Error: Invalid 0.0 horizontal text scaling given for Tz\n) @@ -1155,7 +1177,7 @@ end readonly def }{ 100 div }ifelse .settexthscaling %/TextHScaling gput - settextstate} bdef + settextstate} bind executeonly def % ---------------- Font control ---------------- % @@ -1175,7 +1197,7 @@ end readonly def } { //false } ifelse -} bdef +} bind executeonly def % Worker procedure for recursive checking of font matrices /?FontMatrixNonHV { % {self} ?horz <<font>> -- {self} ?horz ?nonhv 2 copy //?FontMatrixNonHV exec { % check the font's own FontMatrix @@ -1203,7 +1225,7 @@ end readonly def %stack: {testproc} ?nonhv {self} ?horz 4 2 roll exch pop } ifelse -} bdef +} bind executeonly def % Main procedure /?FontMatrixNonHV { % <<rootfont>> -- ?nonhv //?FontMatrixNonHV exch @@ -1213,7 +1235,7 @@ end readonly def % call the worker procedure //?FontMatrixNonHV exec exch pop exch pop -} bdef +} bind executeonly def /Tf { % <font> <scale> Tf - dup .setPDFfontsize @@ -1233,7 +1255,7 @@ end readonly def pop } ifelse setfont -} bdef +} bind executeonly def % Copy a font, removing its FID. If changed is true, also remove % the UniqueID and XUID, if any. If the original dictionary doesn't have @@ -1277,7 +1299,7 @@ end readonly def {dup 3 -1 roll /.OrigUniqueIDXUID exch put} ifelse -} bdef +} bind executeonly def % Insert a new Encoding or Metrics into a font if necessary. % Return a possibly updated font, and a flag to indicate whether @@ -1289,7 +1311,7 @@ end readonly def } { pop //false } ifelse -} bdef +} bind executeonly def /.updatefontencoding { % <font> <Encoding|null> .updatefontencoding % <font'> <copied> @@ -1298,7 +1320,7 @@ end readonly def } { pop //false } ifelse -} bdef +} bind executeonly def % Duplicate keys in CharString dictionary according to GlyphMap: <</new_glyph /old_glyph>> % We have to do this because PDF fonts can associate multiple widths with the same glyph @@ -1329,7 +1351,7 @@ end readonly def } { pop //false } ifelse -} bdef +} bind executeonly def /.updatefont { % <font> <Encoding|null> <Metrics|null> <GlyphMap|null> % .updatefont <font'> <copied> @@ -1340,7 +1362,7 @@ end readonly def 3 1 roll exch % bool bool <font> <Metrics|null> .updatefontmetrics % bool bool <font> bool 4 2 roll or or % <font> is_copied -} bdef +} bind executeonly def % ---------------- Text positioning ---------------- % @@ -1370,9 +1392,9 @@ end readonly def matrix .currenttextlinematrix .settextmatrix settextstate -} bdef -/TD { dup neg .settextleading Td } bdef -/T* { 0 .currenttextleading neg Td } bdef +} bind executeonly def +/TD { dup neg .settextleading Td } bind executeonly def +/T* { 0 .currenttextleading neg Td } bind executeonly def /Tm { 5 index 0 ne 3 index 0 ne and 5 index 0 ne 5 index 0 ne and or not { @@ -1387,27 +1409,27 @@ end readonly def matrix .currenttextlinematrix astore .settextlinematrix matrix .currenttextlinematrix .settextmatrix settextstate -} bdef +} bind executeonly def % ---------------- Text painting ---------------- % /Vexch { rootfont /WMode knownoget { 1 eq { exch } if } if -} bind def +} bind executeonly def /textrenderingprocs [ % (0 is handled specially) % Painting-only modes - { tf } { tS } { tB } { tn } + { tf } executeonly { tS } executeonly { tB } executeonly { tn } % Clipping modes - { gsave tf grestore tW } - { gsave tS grestore tW } - { gsave tB grestore tW } - { tW } + { gsave tf grestore tW } executeonly + { gsave tS grestore tW } executeonly + { gsave tB grestore tW } executeonly + { tW } executeonly ] readonly def /pdfwrite_textrenderingprocs [ % Tr 0 - Fill - { setfillstate show } bind + { setfillstate show } bind executeonly % Tr 1 - Stroke { currentlinewidth exch setstrokestate % Need to set the stroke width to a value which gives the correct @@ -1415,7 +1437,11 @@ end readonly def % CTM, so we need to calculate the stroke width which would result % if the CTM had been unity. currentlinewidth dup - matrix defaultmatrix idtransform TextSaveMatrix dtransform + currentdict /qTextSaveMatrix known { + matrix defaultmatrix idtransform qTextSaveMatrix dtransform + }{ + matrix defaultmatrix idtransform TextSaveMatrix dtransform + } ifelse abs 2 copy exch abs eq { pop }{ @@ -1423,7 +1449,7 @@ end readonly def % we can ignore it. (wrong answer, but consistent) pop pop currentlinewidth }ifelse setlinewidth - show setlinewidth} bind + show setlinewidth} bind executeonly % Tr 2 - Fill then Stroke { currentlinewidth exch setstrokestate % Need to set the stroke width to a value which gives the correct @@ -1431,7 +1457,11 @@ end readonly def % CTM, so we need to calculate the stroke width which would result % if the CTM had been unity. currentlinewidth dup - matrix defaultmatrix idtransform TextSaveMatrix dtransform + currentdict /qTextSaveMatrix known { + matrix defaultmatrix idtransform qTextSaveMatrix dtransform + }{ + matrix defaultmatrix idtransform TextSaveMatrix dtransform + } ifelse abs 2 copy exch abs eq { pop }{ @@ -1439,9 +1469,9 @@ end readonly def % we can ignore it. (wrong answer, but consistent) pop pop currentlinewidth }ifelse setlinewidth - setfillstate show setlinewidth} bind + setfillstate show setlinewidth} bind executeonly % Tr 3 - Neither fill nor stroke - { setfillstate show } bind + { setfillstate show } bind executeonly % % pdfwrite emits all text inside a gsave/grestore pair. As % a result we can't preserve any of the 'clip' modes, as the @@ -1450,7 +1480,7 @@ end readonly def % % Tr 4 - Fill, add to clip { gsave 0 .settextrenderingmode - setfillstate dup show grestore //true charpath } bind + setfillstate dup show grestore //true charpath } bind executeonly % Tr 5 - Stroke, add to clip { gsave 1 .settextrenderingmode currentlinewidth dup @@ -1463,11 +1493,15 @@ end readonly def pop pop currentlinewidth }ifelse setlinewidth setstrokestate dup show grestore - //true charpath} bind + //true charpath} bind executeonly % Tr 6 - Fill, stroke, add to clip { gsave 2 .settextrenderingmode currentlinewidth dup - matrix defaultmatrix idtransform TextSaveMatrix dtransform + currentdict /qTextSaveMatrix known { + matrix defaultmatrix idtransform qTextSaveMatrix dtransform + }{ + matrix defaultmatrix idtransform TextSaveMatrix dtransform + } ifelse abs 2 copy exch abs eq { pop }{ @@ -1476,9 +1510,9 @@ end readonly def pop pop currentlinewidth }ifelse setlinewidth setstrokestate setfillstate dup show grestore - //true charpath} bind + //true charpath} bind executeonly % Tr 7 - Add to clip - { //true charpath} bind + { //true charpath} bind executeonly ] readonly def /setstrokeforTrpreservation { @@ -1509,12 +1543,12 @@ end readonly def setlinewidth } if } if -} bind def +} bind executeonly def % conditionally set fillstate to avoid multiple operations during text operators /settextfillstate { TextFillStateNeeded { setfillstate //false /TextFillStateNeeded gput } if -} bind def +} bind executeonly def % If current path is not known to be valid, use the clip path /TextTransSetup { % showarg path_valid TextTransSetup false showarg @@ -1537,7 +1571,7 @@ end readonly def } { pop % discard path_valid boolean } ifelse -} bind def +} bind executeonly def /TextTransTeardown { % stack: path_valid .currentblendmode /CompatibleOverprint eq { @@ -1548,7 +1582,7 @@ end readonly def .currentSMask //null ne { .endtransparencygroup } if -} bind def +} bind executeonly def /setshowstate { @@ -1744,8 +1778,8 @@ end readonly def ifelse } ifelse /Show gput - } bdef -/showfirst { setshowstate Show } def + } bind executeonly def +/showfirst { setshowstate Show } executeonly def /Tj { { @@ -1758,9 +1792,9 @@ end readonly def gsave nulldevice exec grestore } ifelse //true /TextFillStateNeeded gput -} bdef -/' { T* Tj } bdef -/" { exch Tc exch Tw T* Tj } bdef +} bind executeonly def +/' { T* Tj } bind executeonly def +/" { exch Tc exch Tw T* Tj } bind executeonly def /TJ { { 0 0 moveto { dup type /stringtype eq { @@ -1778,7 +1812,7 @@ end readonly def gsave nulldevice exec grestore } ifelse //true /TextFillStateNeeded gput -} bdef +} bind executeonly def % NB: We don't need clippath when filling or stroking /tf { @@ -1786,7 +1820,7 @@ end readonly def //true /TextFillStateNeeded gput settextfillstate //true TextTransSetup currentpoint fill TextTransTeardown moveto } if -} bdef +} bind executeonly def /tn { currentpoint newpath moveto } bdef % Obsolete, never used. % For stroking characters, temporarily restore the graphics CTM so that % the line width will be transformed properly. @@ -1800,12 +1834,14 @@ end readonly def { .currentPDFfontsize 0 eq not { setstrokestate //true TextTransSetup - currentpoint //Tmatrix currentmatrix TextSaveMatrix setmatrix .swapcolors stroke TextTransTeardown .swapcolors + currentpoint //Tmatrix currentmatrix TextSaveMatrix setmatrix + currentdict /qTextSaveMatrix known {qTextSaveMatrix setmatrix} if + .swapcolors stroke TextTransTeardown .swapcolors setmatrix moveto } if } ifelse //true /TextFillStateNeeded gput - } bdef + } bind executeonly def % Handle transparency the same as /B operator /tB { @@ -1825,11 +1861,11 @@ end readonly def gsave tf grestore tS } ifelse //true /TextFillStateNeeded gput -} bdef +} bind executeonly def % This does the wrong thing if there have been multiple text operations % within a single BT/ET pair, but it's a start. -/tW { } bdef +/tW { } bind executeonly def %% split a string containing \r or \n into multiple strings) %% \r\n is also handled. @@ -1869,7 +1905,7 @@ end readonly def } { pop pop pop } ifelse -} bind def +} bind executeonly def % Text formatting and painting for the AcroForm field without appearance streams. /Tform { % <MaxLen> (V) <Ff> <Q> Tform - @@ -1995,7 +2031,7 @@ end readonly def Show % - } ifelse } ifelse -} bdef +} bind executeonly def end readonly put % GS_PDF_ProcSet diff --git a/Master/tlpkg/tlgs/Resource/Init/pdf_rbld.ps b/Master/tlpkg/tlgs/Resource/Init/pdf_rbld.ps index d5e2b11b51c..03654414065 100644 --- a/Master/tlpkg/tlgs/Resource/Init/pdf_rbld.ps +++ b/Master/tlpkg/tlgs/Resource/Init/pdf_rbld.ps @@ -87,7 +87,7 @@ % Set error flag if we have equal object and generation numbers Generations 4 index get 1 index eq { /dup_obj_gen_num //true def } if } 8 -1 roll { ifelse } { pop if } ifelse % Run 'else' only when rebuilding. -} bind def +} bind executeonly def % Print the contents of the xref array. This actually consists of three % arrays (Objects, Generations, and ObjectStream). @@ -102,7 +102,7 @@ Objects exch get === % print object location } for flush -} bind def +} bind executeonly def % Get token from string and check its type % <string> <type> typed_token <false> % no token or not match @@ -121,7 +121,7 @@ } { pop //false % no token - pop type, set exit status } ifelse % check if we got token -} bind def +} bind executeonly def % Allocate space for post_eof_count to be bound into procedures below. /post_eof_count 0 def @@ -153,7 +153,7 @@ } { pop 0 % no xref, should not happen, report it upstrem } ifelse -} bind def +} bind executeonly def %% Searches backwards from a specified point looking for a 'trailer' keyword. @@ -197,7 +197,7 @@ }if pop % renove the zero leaving the new start position } loop -} bind def +} bind executeonly def % We want the location of the trailer dictionary at the end of file. % We will read the last block of data and search for the final occurance @@ -223,7 +223,7 @@ } { pop pop 0 } ifelse -} bind def +} bind executeonly def % We want to find the trailer dictionary. There is a trailer dictionary % for each xref object list. We only want the trailer dictionary associated @@ -309,7 +309,7 @@ /Trailer exch def pop } ifelse -} bind def +} bind executeonly def % This routine will determine if there is stuff after the %%EOF. There is % supposed to be only a line termination. However many real life files @@ -343,7 +343,7 @@ % Can't even find startxref, assume it's all objects pop 0 } ifelse -} bind def +} bind executeonly def % This routine will scan a file searaching for object locations to build % an alternate version of the data in the xref tables. @@ -422,7 +422,7 @@ pdfformatwarning } if currentdict /Orig_Objects undef -} bind def +} bind executeonly def % Print warning message because we found a problem while reading the xref % tables @@ -436,7 +436,7 @@ ( **** Ghostscript will attempt to recover the data.\n) pdfformaterror ( **** However, the output may be incorrect.\n) pdfformaterror -} bind def +} bind executeonly def % Attempt to recover the XRef data. This is called if we have a failure % while reading the normal XRef tables. This routine usually works @@ -445,4 +445,4 @@ { print_xref_warning % Print warning message count pdfemptycount sub { pop } repeat % remove anything left by readxref search_objects % Search for objects -} bind def +} bind executeonly def diff --git a/Master/tlpkg/tlgs/Resource/Init/pdf_sec.ps b/Master/tlpkg/tlgs/Resource/Init/pdf_sec.ps index fe21c8f2b54..143efb7ea59 100644 --- a/Master/tlpkg/tlgs/Resource/Init/pdf_sec.ps +++ b/Master/tlpkg/tlgs/Resource/Init/pdf_sec.ps @@ -51,7 +51,7 @@ pdfdict begin 1 dict begin /Key exch def currentdict end /ArcfourDecode filter -} bind def +} bind executeonly def % <ciphertext> <key> arc4decode <plaintext> /arc4decode { @@ -60,7 +60,7 @@ pdfdict begin } { 1 index length string 3 1 roll arc4decodefilter exch readstring pop } ifelse -} bind def +} bind executeonly def % take a stream and aes decrypt it. % <stream> <key> aesdecodefilter <stream> @@ -69,7 +69,7 @@ pdfdict begin /Key exch def currentdict end /AESDecode filter -} bind def +} bind executeonly def % AES decrypt a string, returning a string. The second argument can % be a dictionary of the form << /Key key /Padding false >>, which @@ -92,24 +92,24 @@ pdfdict begin exch readstring pop } ifelse -} bind def +} bind executeonly def /md5 { 16 string dup /MD5Encode filter dup 4 3 roll writestring closefile -} bind def +} bind executeonly def /md5_trunk { md5 0 pdf_key_length getinterval -} bind def +} bind executeonly def /sha256 { 32 string dup /SHA256Encode filter dup 4 3 roll writestring closefile -} bind def +} bind executeonly def % <string> contains_non_ascii <bool> /contains_non_ascii { //false exch { 128 ge { pop //true exit } if } forall -} bind def +} bind executeonly def /pdf_padding_string <28bf4e5e4e758a41 64004e56fffa0108 @@ -122,7 +122,7 @@ def pdf_padding_string 0 32 3 index length sub getinterval concatstrings -} bind def +} bind executeonly def /pdf_xorbytes { % <iter-num> <key> pdf_xorbytes <xored-key> dup length dup string @@ -133,7 +133,7 @@ def 3 copy put pop pop } for 3 1 roll pop pop -} bind def +} bind executeonly def % Get length of encryption key in bytes /pdf_key_length { % pdf_key_length <key_length> @@ -142,7 +142,7 @@ def { pop 5 } % If V == 1 then always use 40 bits { /Length knownoget { -3 bitshift } { 5 } ifelse } ifelse -} bind def +} bind executeonly def % Algorithm 3.2 /pdf_compute_encryption_key { % <password> pdf_compute_encryption_key <key> @@ -198,14 +198,14 @@ def } ifelse % Step 9 - Done in md5_trunk. -} bind def +} bind executeonly def % Algorithm 3.4 /pdf_gen_user_password_R2 { % <filekey> pdf_gen_user_password_R2 <U> % Step 2. pdf_padding_string exch arc4decode -} bind def +} bind executeonly def % Algorithm 3.5 /pdf_gen_user_password_R3 { % <filekey> pdf_gen_user_password_R3 <U> @@ -230,7 +230,7 @@ def } for exch pop -} bind def +} bind executeonly def /pdf_gen_user_password { % <password> pdf_gen_user_password <filekey> <U> % common Step 1 of Algorithms 3.4 and 3.5. @@ -253,7 +253,7 @@ def } ifelse } ifelse } ifelse -} bind def +} bind executeonly def % Algorithm 3.6 % <password> pdf_check_pre_r5_user_password <filekey> true @@ -268,7 +268,7 @@ def } { pop //false } ifelse -} bind def +} bind executeonly def % Compute an owner key, ie the result of step 4 of Algorithm 3.3 /pdf_owner_key % <password> pdf_owner_key <owner-key> @@ -285,7 +285,7 @@ def } if % Step 4 - Done in md5_trunk. -} bind def +} bind executeonly def % Algorithm 3.7 % <password> pdf_check_pre_r5_owner_password <filekey> true @@ -308,7 +308,7 @@ def % <result-of-step-3> pdf_check_pre_r5_user_password -} bind def +} bind executeonly def % Algorithm 3.2a % <password> pdf_check_r5_password <filekey> true @@ -377,7 +377,7 @@ def } if end -} bind def +} bind executeonly def % <password> pdf_check_password <filekey> true % <password> pdf_check_password false @@ -443,7 +443,7 @@ def } ifelse } ifelse } ifelse -} bind def +} bind executeonly def % Process the encryption information in the Trailer. /pdf_process_Encrypt { @@ -511,7 +511,7 @@ def % /pdf_process_Encrypt cvx /invalidfileaccess signalerror % } % if -} bind def +} bind executeonly def % Calculate the key used to decrypt an object (to pass to .decpdfrun or % put into a stream dictionary). @@ -554,7 +554,7 @@ def } ifelse md5 0 FileKey length 5 add 2 index length .min getinterval } ifelse -} bind def +} bind executeonly def % As .pdfrun, but decrypt strings with key <key>. /PDFScanRules_true << /PDFScanRules //true >> def @@ -653,7 +653,7 @@ def /PDFsource PDFsource { store { stop } if } aload pop .packtomark cvx /PDFsource 3 -1 roll store exec - } bind def + } bind executeonly def currentdict /PDFScanRules_true undef currentdict /PDFScanRules_null undef @@ -719,7 +719,7 @@ currentdict /PDFScanRules_null undef } { % Else file is not encrypted PDFfile resolveopdict .pdfrun } ifelse % Ifelse encrypted -} bind def +} bind executeonly def % Prefix a decryption filter to a stream if needed. % Stack: readdata? dict parms file/string filternames @@ -745,7 +745,7 @@ currentdict /PDFScanRules_null undef ifelse exch } if - } bind def + } bind executeonly def end % pdfdict .setglobal diff --git a/Master/tlpkg/tlgs/bin/gsdll32.dll b/Master/tlpkg/tlgs/bin/gsdll32.dll Binary files differindex 9a58f8e811d..39f7ca1aea2 100755 --- a/Master/tlpkg/tlgs/bin/gsdll32.dll +++ b/Master/tlpkg/tlgs/bin/gsdll32.dll diff --git a/Master/tlpkg/tlgs/bin/gsdll32.lib b/Master/tlpkg/tlgs/bin/gsdll32.lib Binary files differindex c5ff1810b25..ea4247b31fe 100644 --- a/Master/tlpkg/tlgs/bin/gsdll32.lib +++ b/Master/tlpkg/tlgs/bin/gsdll32.lib diff --git a/Master/tlpkg/tlgs/bin/gswin32.exe b/Master/tlpkg/tlgs/bin/gswin32.exe Binary files differindex b3398eca0d0..2eee5263a8b 100755 --- a/Master/tlpkg/tlgs/bin/gswin32.exe +++ b/Master/tlpkg/tlgs/bin/gswin32.exe diff --git a/Master/tlpkg/tlgs/bin/gswin32c.exe b/Master/tlpkg/tlgs/bin/gswin32c.exe Binary files differindex fb12f8fbfeb..6ede8ff4869 100755 --- a/Master/tlpkg/tlgs/bin/gswin32c.exe +++ b/Master/tlpkg/tlgs/bin/gswin32c.exe diff --git a/Master/tlpkg/tlgs/lib/ps2epsi.ps b/Master/tlpkg/tlgs/lib/ps2epsi.ps index 3cd970aa686..4bc52174233 100644 --- a/Master/tlpkg/tlgs/lib/ps2epsi.ps +++ b/Master/tlpkg/tlgs/lib/ps2epsi.ps @@ -84,7 +84,6 @@ ps2edict begin userdict /showpage { ps2edict begin epsipage end } bind put userdict /setfont { ps2edict begin epsisetfont end } bind put userdict /setpagedevice /pop load put - //systemdict /.setsafe known { .setsafe } if } bind def /epsifontdict 100 dict def |