92 lines · 3.1 KB · Text
RawDownload
%    Copyright (C) 1995, 1996, 1998, 1999 Aladdin Enterprises.  All rights reserved.% % This software is provided AS-IS with no warranty, either express or% implied.% % This software is distributed under license and may not be copied,% modified or distributed except as expressly authorized under the terms% of the license contained in the file LICENSE in this distribution.% % For more information about licensing, please refer to% http://www.ghostscript.com/licensing/. For information on% commercial licensing, go to http://www.artifex.com/licensing/ or% contact Artifex Software, Inc., 101 Lucas Valley Road #110,% San Rafael, CA  94903, U.S.A., +1(415)492-9861. % $Id: gs_fform.ps,v 1.4 2002/02/21 21:49:28 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 localtrue 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