Commit ee0d2376 authored by Jonas Smedegaard's avatar Jonas Smedegaard

Imported Upstream version 9.16~dfsg

parent 4604e414
......@@ -25,8 +25,8 @@ granted by the ITU/ISO/IEC but it is not Affero GPL
compatible - see jpegxr/COPYRIGHT.txt for details.
GPL Ghostscript is free software; you can redistribute it and/or
modify it under the terms the GNU Affero General Public License as
published by the Free Software Foundation, either version 3
modify it under the terms of the GNU Affero General Public License
as published by the Free Software Foundation, either version 3
of the License, or (at your option) any later version.
GPL Ghostscript is distributed in the hope that it will be useful,
......
# Copyright (C) 2001-2014 Artifex Software, Inc.
# Copyright (C) 2001-2015 Artifex Software, Inc.
# All Rights Reserved.
#
# This software is provided AS-IS with no warranty, either express or
......@@ -142,7 +142,7 @@ GENOPT=
# -DHAVE_SSE2
# use sse2 intrinsics
CAPOPT= @HAVE_MKSTEMP@ @HAVE_FILE64@ @HAVE_FSEEKO@ @HAVE_MKSTEMP64@ @HAVE_FONTCONFIG@ @HAVE_LIBIDN@ @HAVE_SETLOCALE@ @HAVE_SSE2@ @HAVE_DBUS@ @HAVE_BSWAP32@ @HAVE_BYTESWAP_H@ @HAVE_STRERROR@
CAPOPT= @HAVE_MKSTEMP@ @HAVE_FILE64@ @HAVE_FSEEKO@ @HAVE_MKSTEMP64@ @HAVE_FONTCONFIG@ @HAVE_LIBIDN@ @HAVE_SETLOCALE@ @HAVE_SSE2@ @HAVE_DBUS@ @HAVE_BSWAP32@ @HAVE_BYTESWAP_H@ @HAVE_STRERROR@ @HAVE_PREAD_PWRITE@ @RECURSIVE_MUTEXATTR@
# Define the name of the executable file.
......@@ -267,10 +267,8 @@ JPX_CFLAGS=@JPX_AUTOCONF_CFLAGS@
# options for lcms color management library
SHARE_LCMS=@SHARELCMS@
LCMSSRCDIR=@LCMSDIR@
LCMS2SRCDIR=@LCMS2DIR@
LCMS_CFLAGS=-DSHARE_LCMS=$(SHARE_LCMS) @LCMS_ENDIAN@
LCMS2_CFLAGS=-DSHARE_LCMS=$(SHARE_LCMS) @LCMS2_ENDIAN@ @SQRTF_SUBST@
LCMS2_CFLAGS=-DSHARE_LCMS=$(SHARE_LCMS) @LCMS2_ENDIAN@ @SQRTF_SUBST@ @LCMS2_PTR_ALIGNMENT@
# Which CMS are we using?
# Options are currently lcms or lcms2
......
......@@ -18,7 +18,7 @@ currentuserparams /IdiomRecognition get
}{
//false
}ifelse
{ gsave sBdx 2 div dup 0.05 setlinewidth currentcolor currentcolorspace .swapcolors setcolorspace setcolor .swapcolors rmoveto 2 .settextrenderingmode xshow currentpoint grestore moveto}
{ gsave sBdx 2 div dup 0.2 setlinewidth currentcolor currentcolorspace .swapcolors setcolorspace setcolor .swapcolors rmoveto 2 .settextrenderingmode xshow currentpoint grestore moveto}
{2 copy 2 copy 2 copy gsave sBdx 0 rmoveto xshow grestore gsave 0 sBdx rmoveto xshow grestore gsave sBdx dup rmoveto xshow grestore xshow} bind
ifelse
} bind
......@@ -31,7 +31,7 @@ currentuserparams /IdiomRecognition get
}{
//false
}ifelse
{ gsave sBdx 2 div dup 0.05 setlinewidth currentcolor currentcolorspace .swapcolors setcolorspace setcolor .swapcolors rmoveto 2 .settextrenderingmode yshow currentpoint grestore moveto}
{ gsave sBdx 2 div dup 0.2 setlinewidth currentcolor currentcolorspace .swapcolors setcolorspace setcolor .swapcolors rmoveto 2 .settextrenderingmode yshow currentpoint grestore moveto}
{2 copy 2 copy 2 copy gsave sBdx 0 rmoveto yshow grestore gsave 0 sBdx rmoveto yshow grestore gsave sBdx dup rmoveto yshow grestore yshow} bind
ifelse
} bind
......@@ -44,7 +44,7 @@ currentuserparams /IdiomRecognition get
}{
//false
}ifelse
{ gsave sBdx 2 div dup 0.05 setlinewidth currentcolor currentcolorspace .swapcolors setcolorspace setcolor .swapcolors rmoveto 2 .settextrenderingmode xyshow currentpoint grestore moveto}
{ gsave sBdx 2 div dup 0.2 setlinewidth currentcolor currentcolorspace .swapcolors setcolorspace setcolor .swapcolors rmoveto 2 .settextrenderingmode xyshow currentpoint grestore moveto}
{2 copy 2 copy 2 copy gsave sBdx 0 rmoveto xyshow grestore gsave 0 sBdx rmoveto xyshow grestore gsave sBdx dup rmoveto xyshow grestore xyshow} bind
ifelse
} bind
......@@ -57,7 +57,7 @@ currentuserparams /IdiomRecognition get
}{
//false
}ifelse
{ gsave sBdx 2 div dup 0.05 setlinewidth currentcolor currentcolorspace .swapcolors setcolorspace setcolor .swapcolors rmoveto 2 .settextrenderingmode show currentpoint grestore moveto}
{ gsave sBdx 2 div dup 0.2 setlinewidth currentcolor currentcolorspace .swapcolors setcolorspace setcolor .swapcolors rmoveto 2 .settextrenderingmode show currentpoint grestore moveto}
{1 copy 2 copy gsave sBdx 0 rmoveto show grestore gsave 0 sBdx rmoveto show grestore gsave sBdx dup rmoveto show grestore show} bind
ifelse
} bind
......@@ -70,7 +70,7 @@ currentuserparams /IdiomRecognition get
}{
//false
}ifelse
{ gsave sBdx 2 div dup 0.05 setlinewidth currentcolor currentcolorspace .swapcolors setcolorspace setcolor .swapcolors rmoveto 2 .settextrenderingmode ashow currentpoint grestore moveto}
{ gsave sBdx 2 div dup 0.2 setlinewidth currentcolor currentcolorspace .swapcolors setcolorspace setcolor .swapcolors rmoveto 2 .settextrenderingmode ashow currentpoint grestore moveto}
{3 copy 3 copy 3 copy gsave sBdx 0 rmoveto ashow grestore gsave 0 sBdx rmoveto ashow grestore gsave sBdx dup rmoveto ashow grestore ashow} bind
ifelse
} bind
......@@ -83,7 +83,7 @@ currentuserparams /IdiomRecognition get
}{
//false
}ifelse
{ gsave sBdx 2 div dup 0.05 setlinewidth currentcolor currentcolorspace .swapcolors setcolorspace setcolor .swapcolors rmoveto 2 .settextrenderingmode widthshow currentpoint grestore moveto}
{ gsave sBdx 2 div dup 0.2 setlinewidth currentcolor currentcolorspace .swapcolors setcolorspace setcolor .swapcolors rmoveto 2 .settextrenderingmode widthshow currentpoint grestore moveto}
{3 copy 3 copy 3 copy gsave sBdx 0 rmoveto widthshow grestore gsave 0 sBdx rmoveto widthshow grestore gsave sBdx dup rmoveto widthshow grestore widthshow} bind
ifelse
} bind
......@@ -97,7 +97,7 @@ currentuserparams /IdiomRecognition get
}{
//false
}ifelse
{ gsave sBdx 2 div dup 0.05 setlinewidth currentcolor currentcolorspace .swapcolors setcolorspace setcolor .swapcolors rmoveto 2 .settextrenderingmode awidthshow currentpoint grestore moveto}
{ gsave sBdx 2 div dup 0.2 setlinewidth currentcolor currentcolorspace .swapcolors setcolorspace setcolor .swapcolors rmoveto 2 .settextrenderingmode awidthshow currentpoint grestore moveto}
{3 copy 3 copy 3 copy gsave sBdx 0 rmoveto awidthshow grestore gsave 0 sBdx rmoveto awidthshow grestore gsave sBdx dup rmoveto awidthshow grestore awidthshow} bind
ifelse
} bind
......
......@@ -81,49 +81,49 @@
% Aliases
/Bookman-Demi /URWBookmanL-DemiBold ;
/Bookman-DemiItalic /URWBookmanL-DemiBoldItal ;
/Bookman-Light /URWBookmanL-Ligh ;
/Bookman-LightItalic /URWBookmanL-LighItal ;
/Courier /NimbusMonL-Regu ;
/Courier-Oblique /NimbusMonL-ReguObli ;
/Courier-Bold /NimbusMonL-Bold ;
/Courier-BoldOblique /NimbusMonL-BoldObli ;
/AvantGarde-Book /URWGothicL-Book ;
/AvantGarde-BookOblique /URWGothicL-BookObli ;
/AvantGarde-Demi /URWGothicL-Demi ;
/AvantGarde-DemiOblique /URWGothicL-DemiObli ;
/Helvetica /NimbusSanL-Regu ;
/Helvetica-Oblique /NimbusSanL-ReguItal ;
/Helvetica-Bold /NimbusSanL-Bold ;
/Helvetica-BoldOblique /NimbusSanL-BoldItal ;
/Helvetica-Narrow /NimbusSanL-ReguCond ;
/Helvetica-Narrow-Oblique /NimbusSanL-ReguCondItal ;
/Helvetica-Narrow-Bold /NimbusSanL-BoldCond ;
/Helvetica-Narrow-BoldOblique /NimbusSanL-BoldCondItal ;
/Palatino-Roman /URWPalladioL-Roma ;
/Palatino-Italic /URWPalladioL-Ital ;
/Palatino-Bold /URWPalladioL-Bold ;
/Palatino-BoldItalic /URWPalladioL-BoldItal ;
/NewCenturySchlbk-Roman /CenturySchL-Roma ;
/NewCenturySchlbk-Italic /CenturySchL-Ital ;
/NewCenturySchlbk-Bold /CenturySchL-Bold ;
/NewCenturySchlbk-BoldItalic /CenturySchL-BoldItal ;
/Times-Roman /NimbusRomNo9L-Regu ;
/Times-Italic /NimbusRomNo9L-ReguItal ;
/Times-Bold /NimbusRomNo9L-Medi ;
/Times-BoldItalic /NimbusRomNo9L-MediItal ;
/Bookman-Demi /BookmanURW-DemBol ;
/Bookman-DemiItalic /BookmanURW-DemBolIta ;
/Bookman-Light /BookmanURW-Lig ;
/Bookman-LightItalic /BookmanURW-LigIta ;
/Courier /NimbusMon-Reg ;
/Courier-Oblique /NimbusMon-Obl ;
/Courier-Bold /NimbusMon-Bol ;
/Courier-BoldOblique /NimbusMon-BolObl ;
/AvantGarde-Book /URWGothic-Boo ;
/AvantGarde-BookOblique /URWGothic-BooObl ;
/AvantGarde-Demi /URWGothic-Dem ;
/AvantGarde-DemiOblique /URWGothic-DemObl ;
/Helvetica /NimbusSan-Reg ;
/Helvetica-Oblique /NimbusSan-Ita ;
/Helvetica-Bold /NimbusSan-Bol ;
/Helvetica-BoldOblique /NimbusSan-BolIta ;
/Helvetica-Narrow /NimbusSanNar-Reg ;
/Helvetica-Narrow-Oblique /NimbusSanNar-Ita ;
/Helvetica-Narrow-Bold /NimbusSanNar-Bol ;
/Helvetica-Narrow-BoldOblique /NimbusSanNar-BolIta ;
/Palatino-Roman /PalladioURW-Rom ;
/Palatino-Italic /PalladioURW-Ita ;
/Palatino-Bold /PalladioURW-Bol ;
/Palatino-BoldItalic /PalladioURW-BolIta ;
/NewCenturySchlbk-Roman /CenturySchURW-Rom ;
/NewCenturySchlbk-Italic /CenturySchURW-Ita ;
/NewCenturySchlbk-Bold /CenturySchURW-Bol ;
/NewCenturySchlbk-BoldItalic /CenturySchURW-BolIta ;
/Times-Roman /NimbusRom-Reg ;
/Times-Italic /NimbusRom-Ita ;
/Times-Bold /NimbusRom-Med ;
/Times-BoldItalic /NimbusRom-MedIta ;
/Symbol /StandardSymL ;
/ZapfChancery-MediumItalic /URWChanceryL-MediItal ;
/ZapfChancery-MediumItalic /ChanceryURW-MedIta ;
/ZapfDingbats /Dingbats ;
......
......@@ -138,17 +138,44 @@ currentdict end def
% Remove any mappings for which we cannot find the font file
dup
{
dup type /dicttype eq
% if we have a name1->name2 mapping, follow the "trail",
% so if the name2 mapping is known in the .map dict, retrieve
% that map value and loop round until we either reach a map
% which references a TTF (i.e. a dictionary record) or we have
% a name not known in the .map, in which case we have to resort
% to the normal Postscript "resourcestatus".
{
/Path .knownget
dup type /nametype eq
{
status {pop pop pop pop pop}
{2 index exch undef} ifelse
dup 3 index exch .knownget
{ exch pop }
{
/CIDFont resourcestatus
{ pop pop pop }
{ 2 index exch .undef }
ifelse
exit
} ifelse
}
{2 index exch undef}
ifelse
}
{pop pop} ifelse
{
dup type /dicttype eq
{
/Path .knownget
{
.libfile
{closefile pop}
{
{(r) file} .internalstopped
{pop pop 2 index exch .undef}
{closefile pop} ifelse
} ifelse
}
{2 index exch .undef}
ifelse
exit
} if
} ifelse
} loop
} forall
% This is where we insert the default fallback into the map
......@@ -203,7 +230,7 @@ currentdict end def
pop 1 index exch undef % <<map>> <<temp>>
} loop
} loop
pop pop %
pop pop
} bind def
/PreprocessRecord % <map> <Name> <raw_record> PreprocessRecord <map> <Name> <record> <bool>
......
......@@ -369,17 +369,17 @@ bind def
/FAPIhook_aux % <string|name> <font_dict> .FAPIhook <string|name> <font>
{ % name <<font>>
{ (FAPIhook ) print 1 index = } //FAPI_hook_debug exec
{ (\nFAPIhook ) print 1 index = flush } //FAPI_hook_debug exec
dup /FAPI known {
{ //PrintFontRef exec ( is mapped to FAPI=) print dup /FAPI get = } //FAPI_hook_debug exec
{ //PrintFontRef exec ( is mapped to FAPI=) print dup /FAPI get = flush } //FAPI_hook_debug exec
//true //.FAPIrebuildfont //ChooseDecoding exec
} {
dup /PathLoad known dup {
{ (PathLoad known for the font ) print //PrintFontRef exec (.) = } //FAPI_hook_debug exec
{ (PathLoad known for the font ) print //PrintFontRef exec (.\n) print flush} //FAPI_hook_debug exec
} {
pop //FAPI_is_hook_disabled exec dup
{ pop
{ (FAPIhook is in .loadfont context for the font ) print //PrintFontRef exec (.) = } //FAPI_hook_debug exec
{ (FAPIhook is in .loadfont context for the font ) print //PrintFontRef exec (.\n) print flush } //FAPI_hook_debug exec
//true
} if
} ifelse
......@@ -402,15 +402,15 @@ bind def
1 index //GetFontType exec //FindInArray exec % name <<font>> bHook
} ifelse
{ { (Trying to render the font ) print //PrintFontRef exec ( with FAPI...) = } //FAPI_hook_debug exec
{ { (Trying to render the font ) print //PrintFontRef exec ( with FAPI...\n) print flush } //FAPI_hook_debug exec
//.FAPIpassfont {
{ //PrintFontRef exec ( is being rendered with FAPI=) print dup /FAPI get = } //FAPI_hook_debug exec
{ //PrintFontRef exec ( is being rendered with FAPI=) print dup /FAPI get = flush } //FAPI_hook_debug exec
//false //.FAPIrebuildfont //ChooseDecoding exec
} {
{ (Can't render ) print //PrintFontRef exec ( with FAPI, will do with native GS renderer.) = } //FAPI_hook_warn exec
{ (Can't render ) print //PrintFontRef exec ( with FAPI, will do with native GS renderer.\n) print flush } //FAPI_hook_warn exec
} ifelse
} {
{ (The font ) print //PrintFontRef exec ( doesn't need to render with FAPI.) = } //FAPI_hook_debug exec
{ (The font ) print //PrintFontRef exec ( doesn't need to render with FAPI.\n) print flush } //FAPI_hook_debug exec
} ifelse
% Remove the plugin request from the font dictionary
......@@ -422,7 +422,7 @@ bind def
{ //is_device_compatible_to_FAPI exec
{ //FAPIhook_aux exec
} {
{ (FAPIhook is disabled for the current device.) = } //FAPI_hook_debug exec
{ (FAPIhook is disabled for the current device.\n) print flush } //FAPI_hook_debug exec
} ifelse
} bind def
......
......@@ -68,6 +68,7 @@ end def
% Load a font name -> font file name map.
userdict /Fontmap .FontDirectory maxlength dict put
userdict /.nativeFontmap .FontDirectory maxlength dict put
/.loadFontmap { % <file> .loadFontmap -
% We would like to simply execute .definefontmap as we read,
% but we have to maintain backward compatibility with an older
......@@ -115,7 +116,7 @@ userdict /Fontmap .FontDirectory maxlength dict put
} bind def
% Add an entry in Fontmap. We redefine this if the Level 2
% resource machinery is loaded.
/.definefontmap % <fontname> <file|alias> .definefontmap -
/.definefontmapaux % <bool> <fontname> <file|alias> .definefontmapaux -
{ % Since Fontmap is global, make sure the values are storable.
% If the fontname contains Unicode (first byte == \000) and
% this is not an alias definition, define an alias using ASCII
......@@ -135,7 +136,7 @@ userdict /Fontmap .FontDirectory maxlength dict put
} for
exch {
DEBUG { (\nAdding alias for: ) print 1 index ==only ( as: ) print dup //== exec flush } if
cvn exch cvn .definefontmap % recurse with an alias
cvn exch cvn .definefontmapaux % recurse with an alias
} {
pop pop % discard the name
} ifelse
......@@ -148,7 +149,9 @@ userdict /Fontmap .FontDirectory maxlength dict put
{ dup .gcheck not { dup length string copy } if
}
if
Fontmap 3 -1 roll 2 copy .knownget
4 -1 roll {.nativeFontmap}{Fontmap} ifelse
3 -1 roll 2 copy .knownget
{ % Add an element to the end of the existing value,
% unless it's the same as the current last element.
mark exch aload pop counttomark 4 add -1 roll
......@@ -160,6 +163,16 @@ userdict /Fontmap .FontDirectory maxlength dict put
ifelse .setglobal
} bind def
/.definefontmap % <fontname> <file|alias> .definefontmap -
{
//false 3 1 roll //.definefontmapaux exec
} bind def
/.definenativefontmap % <fontname> <file|alias> .definenativefontmap -
{
//true 3 1 roll //.definefontmapaux exec
} bind def
% Parse a font file just enough to find the FontName or FontType.
/.findfontvalue { % <file> <key> .findfontvalue <value> true
% <file> <key> .findfontvalue false
......@@ -322,12 +335,12 @@ FONTPATH length 0 eq { (%END FONTPATH) .skipeof } if
{ % stack: <fontcount> <scancount+1> <filecount+1> <filename>
% <file>
dup 0 setfileposition .findfontname
{ dup Fontmap exch known
{ dup .nativeFontmap exch known
{ pop pop
}
{ exch copystring exch
DEBUG { ( ) print dup =only flush } if
1 index .definefontmap
1 index .definenativefontmap
.splitfilename pop //true .scanfontdict 3 1 roll .growput
% Increment fontcount.
3 -1 roll 1 add 3 1 roll
......@@ -369,41 +382,47 @@ FONTPATH length 0 eq { (%END FONTPATH) .skipeof } if
} .bind executeonly def
systemdict /NONATIVEFONTMAP known .setnativefontmapbuilt
/.buildnativefontmap { % - .buildnativefontmap <bool>
QUIET not {
(Querying operating system for font files...\n)
print flush
} if
.getnativefonts dup
systemdict /.nativefontmapbuilt .knownget not
{ //false} if
{//false}
{
exch
QUIET not {
(Querying operating system for font files...\n)
print flush
} if
.getnativefonts dup
{
% stack: [ (name) (path) ]
% verify the font name ourselves
dup 1 get (r) { file } stopped
exch
{
% skip the entry if we can't open the returned path
pop pop pop
}{
% we could open the font file
mark 2 1 roll
{.findfontname} stopped
% stack: [ (name) (path) ]
% verify the font name ourselves
dup 1 get (r) { file } .internalstopped
{
cleartomark
pop pop
}
{
3 -1 roll pop
not { dup 0 get } if % stack: (newname) [ (name) (path) ]
% DEBUG { ( found ) print dup print (\n) print flush } if
% add entry to the fontmap
1 index exch 0 exch dup type /nametype ne {cvn} if put
aload pop .definefontmap
% skip the entry if we can't open the returned path
pop pop pop
}{
% we could open the font file
mark 2 1 roll
{.findfontname} .internalstopped
{
cleartomark
pop
}
{
3 -1 roll pop
not { dup 0 get } if % stack: (newname) [ (name) (path) ]
% DEBUG { ( found ) print dup print (\n) print flush } if
% add entry to the fontmap
1 index exch 0 exch dup type /nametype ne {cvn} if put
aload pop .definenativefontmap
} ifelse
} ifelse
} ifelse
} forall
} if
% record that we've been run
//true .setnativefontmapbuilt
} forall
} if
% record that we've been run
//true .setnativefontmapbuilt
} ifelse
} bind def
% Create the dictionary that registers the .buildfont procedure
......@@ -738,7 +757,11 @@ buildfontdict 3 /.buildfont3 cvx put
/.substitutefont { % <fontname> .substitutefont <altname>
dup 0 exch .fontnameproperties .substitutefontname
% Only accept fonts known in the Fontmap.
Fontmap 1 index known not { pop defaultfontname } if
Fontmap 1 index known not
{
.nativeFontmap 1 index known not
{pop defaultfontname } if
} if
} bind def
% If requested, make (and recognize) fake entries in FontDirectory for fonts
......@@ -892,7 +915,7 @@ $error /SubstituteFont { } put
} {
% No more directories to scan. Try building the native
% font map entries if we haven't already done so.
systemdict /.nativefontmapbuilt get not { .buildnativefontmap } { //false } ifelse {
.buildnativefontmap {
% Same stack as at the beginning of .dofindfont.
.dofindfont % start over
} {
......@@ -931,12 +954,23 @@ $error /SubstituteFont { } put
{ % Already loaded
exch pop //true
}
{ dup Fontmap exch .knownget not
{
dup Fontmap exch .knownget
{ //true //true }
{ % Unknown font name. Look for a file with the
% same name as the requested font.
.tryloadfont
}
dup .tryloadfont
{ exch pop //true //false }
{
% if we can't load by name check the native font map
dup .nativeFontmap exch .knownget
{ //true //true }
{ //false //false } ifelse
} ifelse
} ifelse
{ % Try each element of the Fontmap in turn.
pop
//false exch % (in case we exhaust the list)
% Stack: fontname false fontmaplist
{ exch pop
......@@ -970,7 +1004,7 @@ $error /SubstituteFont { } put
}
ifelse
}
ifelse
if
}
ifelse
} bind def
......@@ -1130,8 +1164,9 @@ currentdict /.putgstringcopy .undef
% Define a procedure to load all known fonts.
% This isn't likely to be very useful.
/loadallfonts
{ Fontmap { pop findfont pop } forall
} bind def
{
[Fontmap .nativeFontmap] { { pop findfont pop } forall } forall
} bind def
% If requested, load all the fonts defined in the Fontmap into FontDirectory
% as "fake" fonts i.e., font dicts with only FontName and FontType defined.
......@@ -1146,15 +1181,18 @@ currentdict /.putgstringcopy .undef
}
{
(gs_fonts FAKEFONTS) VMDEBUG
Fontmap {
pop dup type /stringtype eq { cvn } if
.FontDirectory 1 index known not {
2 dict dup /FontName 3 index put
dup /FontType 1 put
.FontDirectory 3 1 roll { put } //superexec % readonly
} {
pop
} ifelse
[Fontmap .nativeFontmap ]
{
{
pop dup type /stringtype eq { cvn } if
.FontDirectory 1 index known not {
2 dict dup /FontName 3 index put
dup /FontType 1 put
.FontDirectory 3 1 roll { put } //superexec % readonly
} {
pop
} ifelse
} forall
} forall
}
FAKEFONTS { exch } if pop def % don't bind, .current/setglobal get redefined
......
......@@ -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!
915
916
% Check the interpreter revision.
dup revision ne
......
......@@ -938,8 +938,35 @@ mark
1 index dup /Implementation //null .forceput readonly pop
} if
/UNROLLFORMS where {/UNROLLFORMS get}{false}ifelse not
%% [CTM] <<Form>> .beginform -
{3 -1 roll 2 index .beginform exec .endform}{exec} ifelse
%% [CTM] <<Form>> PaintProc .beginform -