henesyinit from p9f0ed2a895 years agoHistory
1109 lines · 32.2 KB · Text
RawDownload
%    Copyright (C) 1994, 2000 Aladdin Enterprises.  All rights reserved.% % This file is part of AFPL Ghostscript.% % AFPL 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 Free Public License (the% "License") for full details.% % Every copy of AFPL 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 AFPL 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.22.2.1 2000/10/26 13:04:54 igorm 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 ---------------- % % Note that resolvefunction converts a PDF Function to a PostScript Function;% resolve*fnproc converts a PDF function to a PostScript procedure. /fnrdict mark  0 { .resolvefn0 }  2 { }  3 { .resolvefn3 }  4 { .resolvefn4 }.dicttomark readonly def /.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  exch PDFfile exch setfileposition} bdef /.resolvefn3 {  dup length dict .copydict  dup /Bounds 2 copy knownoget { put } { pop pop } ifelse  dup /Encode 2 copy knownoget { put } { pop pop } ifelse  dup /Functions 2 copy oget mark exch dup {    oforce .resolvefn  } forall  counttomark -1 roll astore exch pop put} bdef /.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.  .bind  1 index /Function 3 -1 roll put  exch PDFfile exch setfileposition} bdefcurrentdict /tfopdict undef /.resolvefn {		% <fndict> .resolvefn <fndict'>  dup /FunctionType oget //fnrdict exch get exec} bdef /resolvefunction {	% <fndict> resolvefunction <function>  .resolvefn  DEBUG { (%Function: ) print dup === flush } if} bdef /resolvefnproc {	% <fndict> resolvefnproc <proc>  resolvefunction .buildfunction} bdef /resolveidfnproc {	% <fndict> resolveidfnproc <proc>  dup /Identity eq { pop { } } { resolvefnproc } ifelse} bdef /resolvedefaultfnproc {	% <fndict> <default> resolved'fnproc <proc>  1 index /Default eq { exch pop } { pop resolveidfnproc } ifelse} bdef % ---------------- Shadings ---------------- % /shrdict mark  /ColorSpace {    resolvecolorspace  }  /Function {    dup type /dicttype eq {      resolvefunction    } {      [ exch { resolvefunction } forall ]    } ifelse  }.dicttomark readonly def /resolveshading {	% <shadingstream> resolveshading <shading>  PDFfile fileposition exch  mark exch {    oforce //shrdict 2 index .knownget { exec } if  } forall .dicttomark  dup /ShadingType get 4 ge {    dup dup true resolvestream		% Make a reusable stream so that the shading doesn't		% reposition PDFfile at unexpected times.    /ReusableStreamDecode filter /DataSource exch put  } if exch PDFfile exch setfileposition} bdef/resolvesh {		% <shname> resolveshading <shading>  Page /Shading rget {    resolveshading  } {    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 } { resolvefnproc }      ifelse    } {      1 index /TransferFunction eq {	resolveidfnproc      } 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 resolvedefaultfnproc setblackgeneration} bdef/gsucr {  /UCRDefault load resolvedefaultfnproc setundercolorremoval} bdef/gstr {  dup type /arraytype eq {    { oforce /TRDefault load resolvedefaultfnproc } forall    setcolortransfer  } {    /TRDefault load resolvedefaultfnproc settransfer  } ifelse} bdef/gsparamdict mark  /SA { setstrokeadjust }  /OP { 1 index /op known not { dup op } if OP }	% 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 }  /HT {    dup /Default eq {      pop .setdefaultscreen    } {	%****** DOESN'T IMPLEMENT THE STREAM CASE YET ******      resolvehalftone sethalftone    } ifelse  }  /HTP {	% HTP may be present even if this isn't a DPS interpreter.    /sethalftonephase where { pop aload pop sethalftonephase } { pop } ifelse  }	% PDF 1.3  /Font { aload pop Tf }  /LW { setlinewidth }  /LC { setlinecap }  /LJ { setlinejoin }  /ML { setmiterlimit }  /D { aload pop setdash }  /RI { ri }  /op { op }  /OPM { OPM }  /BG2 { gsbg }  /UCR2 { gsucr }  /TR2 { gstr }  /FL { setflat }  /SM {	% SM may be present even if this is only a Level 2 interpreter.    /setsmoothness where { pop setsmoothness } { pop } ifelse  }	% PDF 1.4	% All of these require the "transparency" feature in the interpreter.  /ca { ca }  /CA { CA }  /SMask { gssmask }  /AIS { AIS }  /BM { BM }  /TK { TK }.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 % ------ Transparency support ------ % /gssmask {  dup /None eq {    null  } {	% Preprocess the SMask value into a parameter dictionary for	% .begintransparencymask, with added /BBox and /Draw keys.    mark exch		% Stack: mark smaskdict    dup /S oget /Subtype exch 3 2 roll			% Stack: mark ... smaskdict    dup /BC knownoget { /Background exch 3 2 roll } if    dup /TR knownoget {      resolveidfnproc /TransferFunction exch 3 2 roll    } if        dup /G oget dup /BBox oget /BBox exch 4 2 roll    /.execmaskgroup cvx 2 packedarray cvx /Draw exch 3 2 roll    pop .dicttomark  } ifelse SMask} bdef % This procedure is called to actually render the soft mask./.execmaskgroup {	% <masknum> <paramdict> <formdict> .execmaskgroup -	% Save our place in PDFfile, and do a gsave to avoid resetting	% the color space.  gsave PDFfile fileposition 4 1 roll	% We have to select the group's color space so that the	% background color will be interpreted correctly.  dup /Group oget /CS knownoget { csresolve setcolorspace } if  exch dup /BBox get aload pop .begintransparencymask {    dup /Resources knownoget { oforce } { 0 dict } ifelse    exch false resolvestream    .execgroup .endtransparencymask  } .internalstopped {    .discardtransparencymask stop  } if  PDFfile exch setfileposition grestore} bdef% Paint a Form+Group XObject, either for a transparency mask or for a Do./.execgroup {		% <resdict> <stream> .execgroup -  gsave  1 .setopacityalpha 1 .setshapealpha  0 .inittransparencymask 1 .inittransparencymask  /Compatible .setblendmode	% Execute the body of the Form, similar to DoForm.  pdfopdict .pdfruncontext  grestore} bdef % .paintgroupform implements the Form PaintProc in the case where the% Form XObject dictionary includes a Group key.  See .paintform below./.paintgroupform {	% <resdict> <stream> <formdict> .paintform -  mark exch dup /Group oget  dup /CS knownoget { csresolve setcolorspace } if  dup /I knownoget { /Isolated exch 4 2 roll } if  dup /K knownoget { /Knockout exch 4 2 roll } if  pop counttomark 1 add 1 roll .dicttomark		% Stack: resdict stream formdict paramdict  exch /BBox oget aload pop  .begintransparencygroup {    .execgroup  } .internalstopped {    .discardtransparencygroup stop  } if .endtransparencygroup} bdef % Make an ImageType 103 (soft-masked) image./makesoftmaskimage {	% <datasource> <imagemask> <SMask> makesoftmaskimage			%   <datasource> <imagemask>, updates currentdict =			%   imagedict		% See the ImageType 3 case of makemaskimage below.		% SMask is a stream, another Image XObject.		% Stack: datasource imagemask(false) smaskstreamdict  PDFfile fileposition exch  dup /Matte knownoget { /Matte exch def } if  dup length dict makeimagedict pop		% In order to prevent the two data sources from being		% aliased, we need to make at least one a reusable stream.		% We pick the mask, since it's smaller (in case we need to		% read all its data now).		% Stack: datasource imagemask(false) savedpos		% maskdict is currentdict  /DataSource DataSource mark    /Intent 1    /AsyncRead true  .dicttomark .reusablestreamdecode def  PDFfile exch setfileposition  currentdict end currentdict end  5 dict begin  /ImageType 103 def  /DataDict exch def  dup /InterleaveType 3 put  DataDict /Matte .knownget {    /Matte exch def  } if  AlphaIsShape { /ShapeMaskDict } { /OpacityMaskDict } ifelse exch def  /ColorSpace DataDict /ColorSpace get def} 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.

Lines 1–500 of 1109.