henesyinit from p9fd787fda5 years agoHistory
864 lines · 24.1 KB · Text
RawDownload
%    Copyright (C) 1994, 1995, 1997, 1998, 1999 Aladdin Enterprises.  All rights reserved.% % This file is part of Aladdin Ghostscript.% % Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author% or distributor accepts any responsibility for the consequences of using it,% or for whether it serves any particular purpose or works at all, unless he% or she says so in writing.  Refer to the Aladdin Ghostscript Free Public% License (the "License") for full details.% % Every copy of Aladdin Ghostscript must include a copy of the License,% normally in a plain ASCII text file named PUBLIC.  The License grants you% the right to copy, modify and redistribute Aladdin Ghostscript, but only% under certain conditions described in the License.  Among other things, the% License requires that the copyright notice and this notice be preserved on% all copies. % $Id: pdf_draw.ps,v 1.1 2000/03/09 08:40:40 lpd Exp $% pdf_draw.ps% PDF drawing operations (graphics, text, and images). /.setlanguagelevel where { pop 2 .setlanguagelevel } if.currentglobal true .setglobal/pdfdict where { pop } { /pdfdict 100 dict def } ifelseGS_PDF_ProcSet beginpdfdict begin % For simplicity, we use a single interpretation dictionary for all% PDF graphics operations, even though this is too liberal./drawopdict 100 dict def % ================================ Graphics ================================ % % ---------------- Functions ---------------- % /fnrdict mark  0 { .resolvefn0 }  2 { }  3 { .resolvefn3 }  4 { .resolvefn4 }.dicttomark readonly def /.pdfbuildfunction {  DEBUG { (%Function: ) print dup === flush } if  .buildfunction} bdef /.resolvefn0 {		% Don't lose our place in PDFfile.  PDFfile fileposition exch  dup true resolvestream		% The stream isn't positionable, so read all the data now.		% Stack: filepos fndict stream  1 index /Range oget length 2 idiv 2 index /BitsPerSample oget mul  2 index /Size oget { mul } forall  7 add 8 idiv string  1 index exch readstring pop exch closefile		% Stack: filepos fndict data  exch dup length 1 add dict .copydict  dup /DataSource 4 -1 roll put  .pdfbuildfunction  exch PDFfile exch setfileposition} bdef /.resolvefn3 {  dup length dict .copydict  dup /Functions 2 copy oget mark exch dup {    oforce resolvefunction  } forall  counttomark -1 roll astore exch pop put} bdef /tfopdict mark  /true /.true load  /false /.false load.dicttomark readonly def/.resolvefn4 {  PDFfile fileposition exch  dup true resolvestream 		% Stack: filepos fndict stream  1 index /Length oget string readstring pop  exch dup length dict copy dup /Function undef  exch token not {    () /rangecheck cvx signalerror  } if  exch token {    /rangecheck cvx signalerror  } if		% Use .bind to avoid idiom recognition.		% Use tfopdict to bind true and false.  //tfopdict begin .bind end  1 index /Function 3 -1 roll put  .pdfbuildfunction  exch PDFfile exch setfileposition} bdefcurrentdict /tfopdict undef /resolvefunction {	% <fndict> resolvefunction <function>  dup /FunctionType oget //fnrdict exch get exec} bdef /resolveidfunction {  dup /Identity eq { pop { } } { resolvefunction } ifelse} bdef /resolvedefaultfunction {	% <fndict> <default> resolved'f'n <function>  1 index /Default eq { exch pop } { pop resolveidfunction } ifelse} bdef % ---------------- Shadings ---------------- % /shrdict mark  /ColorSpace {    resolvecolorspace  }  /Function {    dup type /dicttype eq {      resolvefunction    } {      [ exch { resolvefunction } forall ]    } ifelse  }.dicttomark readonly def /resolveshading {	% <shname> resolveshading <shading>  Page /Shading rget {    mark exch {      oforce //shrdict 2 index .knownget { exec } if    } forall .dicttomark    dup /ShadingType get 4 ge {      dup dup true resolvestream /DataSource exch put    } if  } {    null  } ifelse} bdef % ---------------- Halftones ---------------- % /spotfunctions mark  /Round {    abs exch abs 2 copy add 1 le {      dup mul exch dup mul add 1 exch sub     } {      1 sub dup mul exch 1 sub dup mul add 1 sub    } ifelse  }  /Diamond {    abs exch abs 2 copy add .75 le {      dup mul exch dup mul add 1 exch sub    } {      2 copy add 1.23 le {	.85 mul add 1 exch sub      } {	1 sub dup mul exch 1 sub dup mul add 1 sub      } ifelse    } ifelse  }  /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    } {      dup 1 gt {	pop 1 exch sub dup mul exch 1 exch sub	.75 div dup mul add 4 div 1 sub      } {	.5 exch sub exch pop exch pop      } ifelse    } ifelse  }  /EllipseA { dup mul .9 mul exch dup mul add 1 exch sub }  /InvertedEllipseA { dup mul .9 mul exch dup mul add 1 sub }  /EllipseB { dup 5 mul 8 div mul exch dup mul exch add sqrt 1 exch sub }  /EllipseC { dup mul .9 mul exch dup mul add 1 exch sub }  /InvertedEllipseC { dup mul .9 mul exch dup mul add 1 sub }  /Line { exch pop abs neg }  /LineX { pop }  /LineY { exch pop }  /Square { abs exch abs 2 copy lt { exch } if pop neg }  /Cross { abs exch abs 2 copy gt { exch } if pop neg }  /Rhomboid { abs exch abs 0.9 mul add 2 div }  /DoubleDot { 2 {360 mul sin 2 div exch } repeat add }  /InvertedDoubleDot { 2 {360 mul sin 2 div exch } repeat add neg }  /SimpleDot { dup mul exch dup mul add 1 exch sub }  /InvertedSimpleDot { dup mul exch dup mul add 1 sub }  /CosineDot { 180 mul cos exch 180 mul cos add 2 div }  /Double { exch 2 div exch 2 { 360 mul sin 2 div exch } repeat add }  /InvertedDouble {    exch 2 div exch 2 { 360 mul sin 2 div exch } repeat add neg  }.dicttomark readonly def /htrdict mark  1 { .resolveht1 }  5 { .resolveht5 }	% We don't support types 6, 10, or 16 yet..dicttomark readonly def /.resolveht1 {  mark exch {    oforce    1 index /SpotFunction eq {      dup type /nametype eq	{ //spotfunctions exch get } { resolvefunction }      ifelse    } {      1 index /TransferFunction eq {	resolveidfunction      } if    } ifelse  } forall .dicttomark} bdef /.resolveht5 {  mark exch {    oforce dup type /dicttype eq { resolvehalftone } if  } forall .dicttomark} bdef /resolvehalftone {	% <dict> resolvehalftone <halftone>  dup /HalftoneType get //htrdict exch get exec} bdef % ---------------- Graphics state management ---------------- % /cmmatrix matrix defdrawopdict begin			% Graphics state stack  /q { q } def  /Q { Q } def			% Graphics state setting  /cm { //cmmatrix astore concat } def  /i /setflat load def  /J /setlinecap load def  /d /setdash load def  /j /setlinejoin load def  /w /setlinewidth load def  /M /setmiterlimit load def  /gs { gs } defend % Each entry in this dictionary is%	<gsres> <value> -proc- <gsres>/gsbg { /BGDefault load resolvedefaultfunction setblackgeneration } bdef/gsucr { /UCRDefault load resolvedefaultfunction setundercolorremoval } bdef	%****** DOESN'T IMPLEMENT THE ARRAY (colortransfer) CASE YET ******/gstr { /TRDefault load resolvedefaultfunction settransfer } bdef/gsparamdict mark  /SA { setstrokeadjust }  /op {	%****** STROKE OVERPRINT, NOT IMPLEMENTED YET ******	pop  }  /OP { setoverprint }  /OPM {	%****** OVERPRINT MODE, NOT IMPLEMENTED YET ******	pop  }	% 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 }  /BG2 { gsbg }  /UCR { 1 index /UCR2 known { pop } { gsucr } ifelse }  /UCR2 { gsucr }  /TR { 1 index /TR2 known { pop } { gstr } ifelse }  /TR2 { gstr }  /HT {    dup /Default eq {      pop .setdefaultscreen    } {	%****** DOESN'T IMPLEMENT THE STREAM CASE YET ******      resolvehalftone sethalftone    } ifelse  }	% HTP may be present even if this isn't a DPS interpreter.  /HTP {    /sethalftonephase where { pop aload pop sethalftonephase } { pop } ifelse  }	% SM may be present even if this is only a Level 2 interpreter.  /SM {    /setsmoothness where { pop setsmoothness } { pop } ifelse  }  /Font { aload pop Tf }  /LW { setlinewidth }  /LC { setlinecap }  /LJ { setlinejoin }  /ML { setmiterlimit }  /D { aload pop setdash }  /FL { setflat }  /RI { ri }.dicttomark readonly def/gs {			% <gsres> gs -  Page /ExtGState rget {	% We keep the dictionary on the stack during the forall so that	% keys that interact with each other have access to it.    dup {      oforce exch gsparamdict exch .knownget { exec } { pop } ifelse    } forall pop  } if} bdef % ---------------- Color setting ---------------- % /01_1 [0 1] readonly def/01_3 [0 1 0 1 0 1] readonly def/01_4 [0 1 0 1 0 1 0 1] readonly def % The keys here are resolved (PostScript, not PDF) color space names./csncompdict mark  /DeviceGray { pop 1 }  /DeviceRGB { pop 3 }  /DeviceCMYK { pop 4 }  /CIEBasedA { pop 1 }  /CIEBasedABC { pop 3 }  /Separation { pop 1 }  /DeviceN { 2 oget length }.dicttomark readonly def % Perhaps some of the values in the following need to be modified% depending on the WhitePoint value..../cslabinit mark  /DecodeABC [{16 add 116 div} bind {500 div} bind {200 div} bind]  /MatrixABC [1 1 1 1 0 0 0 0 -1]  /DecodeLMN [    {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse     0.9505 mul} bind    {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse     } bind    {dup 6 29 div ge {dup dup mul mul} {4 29 div sub 108 841 div mul} ifelse     1.0890 mul} bind  ].dicttomark readonly def /csrdict mark  /DeviceGray {    /DefaultGray Page /ColorSpace rget { exch pop resolvecolorspace } if  }  /DeviceRGB {    /DefaultRGB Page /ColorSpace rget { exch pop resolvecolorspace } if  }  /DeviceCMYK { }  /CalGray {    1 oget 6 dict begin    dup /Gamma knownoget {      /exp load 2 packedarray cvx /DecodeA exch def    } if    dup /BlackPoint knownoget { /BlackPoint exch def } if    dup /WhitePoint knownoget { /WhitePoint exch def } if    pop [ /CIEBasedA currentdict end ]  }  /CalRGB {    1 oget 6 dict begin    dup /Gamma knownoget {      [ exch { /exp load 2 packedarray cvx } forall      ] /DecodeABC exch def    } if    dup /Matrix knownoget { /MatrixABC exch def } if    dup /BlackPoint knownoget { /BlackPoint exch def } if    dup /WhitePoint knownoget { /WhitePoint exch def } if    pop [ /CIEBasedABC currentdict end ]  }  /CalCMYK {    pop /DeviceCMYK		% not defined by Adobe  }  /Lab {    1 oget 6 dict begin    dup /Range knownoget not { [-100 100 -100 100] } if    [0 100 null null null null] dup 2 4 -1 roll putinterval    /RangeABC exch def    //cslabinit { def } forall    dup /BlackPoint knownoget { /BlackPoint exch def } if    dup /WhitePoint knownoget { /WhitePoint exch def } if    pop [ /CIEBasedABC currentdict end ]  }  /ICCBased {		% Since the PostScript interpreter doesn't support these yet,		% always substitute an alternate space.    1 oget dup /Alternate knownoget {      exch pop    } {      /N get { null /DeviceGray null /DeviceRGB /DeviceCMYK } exch get    } ifelse resolvecolorspace  }  /Separation {    aload pop exch oforce resolvecolorspace exch oforce resolvefunction    4 array astore  }  /DeviceN {    aload pop 3 -1 roll oforce    3 -1 roll oforce resolvecolorspace    3 -1 roll oforce resolvefunction    4 array astore  }  /Indexed {    aload pop 3 -1 roll oforce resolvecolorspace		% If the underlying space is a Lab space, we must scale		% the output of the lookup table as part of DecodeABC.    dup dup type /arraytype eq { 0 get } if /CIEBasedABC eq {      dup 1 get /DecodeLMN known {	1 get dup length dict copy	begin /DecodeABC [ 0 2 4 {	  RangeABC 1 index 1 add get RangeABC 2 index get sub /mul load	  RangeABC 3 index get /add load	  DecodeABC 6 -1 roll 2 idiv get [ 6 1 roll aload pop ] cvx	} for ] def	/RangeABC //01_3 def	currentdict end /CIEBasedABC exch 2 array astore      } if    } if    3 1 roll    oforce dup type /stringtype ne {		% The color lookup table is a stream.		% Get its contents.  Don't lose our place in PDFfile.		% Stack: /Indexed basespace hival lookup	PDFfile fileposition 5 1 roll true resolvestream		% Stack: filepos /Indexed basespace hival lookupstream	1 index 1 add		% Stack: filepos /Indexed basespace hival lookupstream len	3 index	  dup dup type /arraytype eq { 0 get } if	  //csncompdict exch get exec mul	string readstring pop		% Stack: filepos /Indexed basespace hival table	5 -1 roll PDFfile exch setfileposition    }    if 4 array astore  }  /Pattern {    dup type /nametype ne {      dup length 1 gt {	1 oget resolvecolorspace	/Pattern exch 2 array astore      } if    } if  }.dicttomark readonly def /cssubst {		% <csname> cssubst <cspace'> true			% <csname> cssubst false  dup resolvecolorspace  dup 1 index ne { exch pop true } { pop pop false } ifelse} bdef /csnames mark  /DeviceGray dup  /DeviceRGB dup  /DeviceCMYK dup  /Pattern dup.dicttomark readonly def/csresolve {		% <csresourcename> csresolve <cspace>  dup Page /ColorSpace rget {    exch pop resolvecolorspace  } {    //csnames 1 index known not { /undefined cvx signalerror } if  } ifelse} bdef/resolvecolorspace {	% <cspace> resolvecolorspace <cspace'>  dup dup type /arraytype eq { 0 get } if  //csrdict exch .knownget {    exec dup type /nametype ne { dup length 1 eq { 0 get } if } if  } {    csresolve  } ifelse} bdef /scresolve {	% <c0> ... scresolve <multi>		% We can't really make sc[n] and SC[N] work, because		% the color space information isn't available at		% conversion time; so we hack it by assuming that		% all the operands on the stack are used, and that		% if the top operand is a name, it's a Pattern resource.  dup type /nametype eq    { Page /Pattern rget { resolvepattern } { null } ifelse }  if  dup type /dicttype eq {		% Check the PaintType    dup /PaintType get 2 eq  } {    .pdfcount 1 gt  } ifelse} bdef /.pdfpaintproc {         % <patdict> <resdict> .pdfpaintproc -  DEBUG { (%Begin PaintProc) = flush } if	% For uncolored patterns, we have to unbind the current	% color and color space before running the PaintProc.	% There's no harm in doing this for colored patterns,	% so for simplicity, we always do it.  q  null sc1 null SC1  exch false resolvestream pdfopdict .pdfruncontext  Q  DEBUG { (%End PaintProc) = flush } if} bdef /resolvepattern {	% <patternstreamdict> resolvepattern <patterndict>		% Don't do the resolvestream now: just capture the data		% from the file if necessary.  dup length dict copy  dup /FilePosition .knownget {    1 index /File get dup fileposition 3 1 roll

Lines 1–500 of 864.