diff options
Diffstat (limited to 'Master/xemtex/gslib/gs_fform.ps')
-rw-r--r-- | Master/xemtex/gslib/gs_fform.ps | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/Master/xemtex/gslib/gs_fform.ps b/Master/xemtex/gslib/gs_fform.ps new file mode 100644 index 00000000000..1042b014514 --- /dev/null +++ b/Master/xemtex/gslib/gs_fform.ps @@ -0,0 +1,93 @@ +% Copyright (C) 1995, 1996, 1998, 1999 Aladdin Enterprises. All rights reserved. +% +% This program is free software; you can redistribute it and/or modify it +% under the terms of the GNU General Public License as published by the +% Free Software Foundation; either version 2 of the License, or (at your +% option) any later version. +% +% This program is distributed in the hope that it will be useful, but +% WITHOUT ANY WARRANTY; without even the implied warranty of +% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +% Public License for more details. +% +% You should have received a copy of the GNU General Public License along +% with this program; if not, write to the Free Software Foundation, Inc., +% 59 Temple Place, Suite 330, Boston, MA, 02111-1307. + +% $Id: gs_fform.ps,v 1.2.6.1.2.1 2003/04/12 14:02:38 giles Exp $ +% Form caching implemented in PostScript. + +% This implementation doesn't do the right thing about halftone or +% Pattern phase, but the Pattern cache doesn't either.... + +% The Form cache key is the Form dictionary; the value is an array +% of 2 elements [CTM pattern_instance]. +% +% In order to prevent restore from clearing the cache, we explicitly +% push the cache entries on the stack before a restore and reinstall them. +currentglobal false setglobal +/.formcachedict 20 dict def % must be local +true setglobal +/restore { + mark .formcachedict { } forall + counttomark 1 add index { //restore } .internalstopped + { cleartomark //restore } + { counttomark 2 idiv { .formcachedict 3 1 roll put } repeat pop pop } + ifelse +} bind odef + +/.execform1 { + dup /Implementation known not { + dup /FormType get 1 ne { /rangecheck signalerror } if + % The Implementation is a Pattern that will draw the form. + currentglobal 1 index gcheck setglobal + % Stack: form global + 10 dict begin + /PatternType 1 def + /PaintType 1 def % colored + /TilingType 1 def % irrelevant + % Copy the BBox to the correct VM. + /BBox 2 index /BBox get 4 array copy exch 1 index def + % Set XStep and YStep to very large numbers, + % so we won't get multiple copies of the form. + /XStep 1 index dup 2 get exch 0 get sub 100 mul def + /YStep exch dup 3 get exch 1 get sub 100 mul def + /PaintProc 2 index /PaintProc get def + currentdict end readonly + % Stack: form global impl + exch setglobal + 1 index /Implementation 3 -1 roll .forceput + } if + .formcachedict 1 index .knownget { + % Check whether we can use the cached value. + % Stack: form cachevalue + matrix currentmatrix true 0 1 3 { + % Stack: form cachevalue curmat true index + 3 index 0 get 1 index get exch 3 index exch get ne { + pop pop false exit + } if + } for exch pop + } { + false + } ifelse not + { % Make a new cache entry. + gsave + matrix currentmatrix dup 4 0 put dup 5 0 put dup setmatrix + % Stack: form mat + 1 index /Implementation get + 2 index /Matrix get + makepattern 2 array astore + .formcachedict 2 index 2 index put + grestore + } if + % Stack: form cachevalue + -1 0 0 transform + 2 { exch round cvi } repeat .setscreenphase + 1 get setpattern + /BBox get aload pop + exch 3 index sub exch 2 index sub rectfill +} .bind odef % must bind .forceput + +.formtypes 1 /.execform1 load put + +setglobal |