home *** CD-ROM | disk | FTP | other *** search
/ PC World 2001 April / PCWorld_2001-04_cd.bin / Software / Vyzkuste / gs / gs650w32.exe / gs6.50 / lib / gs_ll3.ps < prev    next >
Text File  |  2000-12-05  |  14KB  |  418 lines

  1. %    Copyright (C) 1997, 2000 Aladdin Enterprises.  All rights reserved.
  2. % This file is part of AFPL Ghostscript.
  3. % AFPL Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author or
  4. % distributor accepts any responsibility for the consequences of using it, or
  5. % for whether it serves any particular purpose or works at all, unless he or
  6. % she says so in writing.  Refer to the Aladdin Free Public License (the
  7. % "License") for full details.
  8. % Every copy of AFPL Ghostscript must include a copy of the License, normally
  9. % in a plain ASCII text file named PUBLIC.  The License grants you the right
  10. % to copy, modify and redistribute AFPL Ghostscript, but only under certain
  11. % conditions described in the License.  Among other things, the License
  12. % requires that the copyright notice and this notice be preserved on all
  13. % copies.
  14.  
  15. % $Id: gs_ll3.ps,v 1.6.2.1 2000/11/16 00:37:03 raph Exp $
  16. % Initialization file for PostScript LanguageLevel 3 functions.
  17. % This file must be loaded after gs_lev2.ps and gs_res.ps.
  18. % These definitions go into ll3dict or various ProcSets.
  19. % NOTE: the interpreter creates ll3dict.
  20.  
  21. ll3dict begin
  22.  
  23. % We need LanguageLevel 2 or higher in order to have setuserparams and
  24. % defineresource.
  25. languagelevel dup 2 max .setlanguagelevel
  26.  
  27. % ------ Idiom recognition ------ %
  28.  
  29. /IdiomRecognition false .definepsuserparam
  30.  
  31. % Modify `bind' to apply idiom recognition afterwards.
  32. /.bindscratch 128 string def
  33. % Do the right thing if NOBIND or DELAYBIND is in effect.
  34. % Note also that since this definition of `bind' may get bound in,
  35. % it has to function properly even at lower language levels,
  36. % where IdiomRecognition may not be defined.
  37. /bind load /.bind load ne
  38. /bind {        % <proc> bind <proc'>
  39.   //.bind currentuserparams /IdiomRecognition
  40.   .knownget not { false } if {
  41.     (*) {
  42.       /IdiomSet findresource
  43.       false exch {
  44.         % Stack: proc false dummykey [template substitute]
  45.     exch pop dup 1 get exch 0 get
  46.         % Stack: proc false substitute template
  47.     3 index .eqproc {
  48.       2 index gcheck 1 index gcheck not and {
  49.         pop
  50.       } {
  51.         3 -1 roll pop exch not exit
  52.       } ifelse
  53.     } {
  54.       pop
  55.     } ifelse
  56.       } forall { exit } if
  57.     } //.bindscratch /IdiomSet resourceforall
  58.   } if
  59. } odef
  60. { /.bind /bind load def
  61.   /bind { } def
  62. } if
  63. currentdict /.bindscratch .undef
  64.  
  65. % ------ HalftoneTypes 6, 10, 16 and HalftoneMode ------ %
  66.  
  67. % This code depends on an internal HalftoneType 7 with the following keys:
  68. %    Width, Height, Width2, Height2, TransferFunction:
  69. %      as for HalftoneType 16.
  70. %    Thresholds: a string or bytestring holding the thresholds,
  71. %      (Width x Height + Width2 x Height2) x BitsPerSample / 8 bytes,
  72. %      as for HalftoneType 16 except that the samples may be either
  73. %      8 or 16 bits wide.
  74. %    BitsPerSample: 8 or 16.
  75.  
  76. % Note that this HalftoneType never appears in halftone dictionaries given
  77. % to sethalftone, only as a component in those given to .sethalftone5,
  78. % so its numeric value can be chosen ad lib as long as it differs from the
  79. % other values that are legal in component dictionaries for .sethalftone5
  80. % (currently only 1 and 3).
  81.  
  82. /.makehalftone7 {    % <dict> <dict> <source> <Width> <Height>
  83.             %   (<Width2> <Height2> | null) <BPS> .makehalftone7
  84.             %   <setdict> <dict5> { .sethalftone5 }
  85.   8 dict begin
  86.   /HalftoneType 7 def
  87.   /BitsPerSample exch def
  88.   dup null eq {
  89.     pop 0
  90.   } {
  91.     /Height2 1 index def /Width2 2 index def mul
  92.   } ifelse 3 1 roll
  93.   /Height 1 index def
  94.   /Width 2 index def
  95.   mul add BitsPerSample 8 idiv mul .bigstring
  96.         % Stack: dict dict source str
  97.   dup type /stringtype eq { readstring } { .readbytestring } ifelse
  98.   not { /sethalftone load /rangecheck signalerror exit } if
  99.   readonly /Thresholds exch def
  100.   /TransferFunction .knownget { /TransferFunction exch def } if
  101.         % If the original Thresholds was a file, replace it with
  102.         % a new one.
  103.   dup /Thresholds get type /filetype eq {
  104.     dup /Thresholds [ Thresholds ] cvx 0 () .subfiledecode put
  105.   } if
  106.   mark /HalftoneType 5 /Default currentdict end .dicttomark
  107.   { .sethalftone5 }
  108. } bind def
  109.  
  110. /.bigstring {    % <size> .bigstring <string|bytestring>
  111.   dup 65400 gt { .bytestring } { string } ifelse
  112. } bind def
  113.  
  114. /.readbytestring {    % <source> <bytestring> .readbytestring
  115.             %   <bytestring> <filled>
  116.         % Note that since bytestrings don't implement getinterval,
  117.         % if filled is false, there is no way to tell how much
  118.         % was read.
  119.   true exch 0 1 2 index length 1 sub {
  120.         % Stack: source true str index
  121.     3 index read not { pop exch not exch exit } if
  122.     3 copy put pop pop
  123.   } for 3 -1 roll pop exch
  124. } bind def
  125.  
  126. /.sethalftone6 {    % <dict> <dict> .sethalftone6 <setdict> <dict5>
  127.             %   { .sethalftone5 }
  128.             % Keys: Width, Height, Thresholds, T'Function
  129.   dup /Thresholds get
  130.   1 index /Width get 2 index /Height get
  131.   null 8 .makehalftone7
  132. } bind def
  133.  
  134. /.sethalftone10 {    % <dict> <dict> .sethalftone10 <setdict> <dict5>
  135.             %   { .sethalftone5 }
  136.             % Keys: Xsquare, Ysquare, Thresholds, T'Function
  137.         % Note that this is the only one of these three HalftoneTypes
  138.         % that allows either a file or a string for Thresholds.
  139.   dup /Thresholds get dup type /stringtype eq { 0 () .subfiledecode } if
  140.   1 index /Xsquare get dup 3 index /Ysquare get dup
  141.   8 .makehalftone7
  142. } bind def
  143.  
  144. /.sethalftone16 {    % <dict> <dict> .sethalftone16 <setdict> <dict5>
  145.             %   { .sethalftone5 }
  146.             % Keys: Width, Height, Width2, Height2,
  147.             %   Thresholds, T'Function
  148.   dup /Thresholds get
  149.   1 index /Width get 2 index /Height get
  150.   3 index /Width2 .knownget {  % 2-rectangle case
  151.     4 index /Height2 get
  152.   } {            % 1-rectangle case
  153.     null
  154.   } ifelse 16 .makehalftone7
  155. } bind def
  156.  
  157. .halftonetypes begin
  158.   6 /.sethalftone6 load def
  159.   10 /.sethalftone10 load def
  160.   16 /.sethalftone16 load def
  161. end
  162.  
  163. % Redefine the halftone-setting operators to honor HalftoneMode.
  164. /setcolorscreen {
  165.   /HalftoneMode getuserparam 0 eq {
  166.     //setcolorscreen
  167.   } {
  168.     12 { pop } repeat .getdefaulthalftone
  169.     { //sethalftone }
  170.     { .setdefaulthalftone }
  171.     ifelse
  172.   } ifelse
  173. } odef
  174. /setscreen {
  175.   /HalftoneMode getuserparam 0 eq {
  176.     //setscreen
  177.   } {
  178.     pop pop pop .getdefaulthalftone
  179.     { //sethalftone }
  180.     { .setdefaulthalftone }
  181.     ifelse
  182.   } ifelse
  183. } odef
  184. /sethalftone {
  185.   /HalftoneMode getuserparam 0 eq {
  186.     //sethalftone
  187.   } {
  188.     pop .getdefaulthalftone
  189.     { //sethalftone }
  190.     { .setdefaulthalftone }
  191.     ifelse
  192.   } ifelse
  193. } odef
  194.  
  195. % ------ ImageTypes 3 and 4 (masked images) ------ %
  196.  
  197. .imagetypes
  198.   dup 3 /.image3 load put
  199.   dup 4 /.image4 load put
  200. % We also detect ImageType 103 here: it isn't worth making a separate file
  201. % just for this.
  202.   /.image3x where { pop dup 103 /.image3x load put } if
  203. pop
  204.  
  205. % ------ Functions ------ %
  206.  
  207. % Define the FunctionType resource category.
  208. /Generic /Category findresource dup maxlength 3 add dict .copydict begin
  209.   /InstanceType /integertype def
  210. /FunctionType currentdict end /Category defineresource pop
  211.  
  212. {0 2 3} { dup /FunctionType defineresource pop } forall
  213.  
  214. % ------ Smooth shading ------ %
  215.  
  216. % Define the ShadingType resource category.
  217. /Generic /Category findresource dup maxlength 3 add dict .copydict begin
  218.   /InstanceType /integertype def
  219. /ShadingType currentdict end /Category defineresource pop
  220.  
  221. systemdict /.shadingtypes mark        % not ll3dict
  222.   1 /.buildshading1 load
  223.   2 /.buildshading2 load
  224.   3 /.buildshading3 load
  225.   4 /.buildshading4 load
  226.   5 /.buildshading5 load
  227.   6 /.buildshading6 load
  228.   7 /.buildshading7 load
  229. .dicttomark put
  230.  
  231. systemdict /.reuseparamdict mark
  232.   /Intent 2
  233.   /AsyncRead false
  234.   /CloseSource true
  235. .dicttomark readonly put
  236. /.buildshading {    % <shadingdict> .buildshading <shading>
  237.         % Unfortunately, we always need to make the DataSource reusable,
  238.         % because if clipping is involved, even shfill may need to read
  239.         % the source data multiple times.  If it weren't for this,
  240.         % we would only need to create a reusable stream if the ultimate
  241.         % source of the data is a procedure (since the library can't
  242.         % suspend shading to do a procedure callout).
  243.   dup /DataSource .knownget {
  244.     dup type /filetype eq {
  245.       //.reuseparamdict /ReusableStreamDecode filter
  246.       .currentglobal 1 index gcheck .setglobal
  247.         % Stack: shdict rsdfile saveglobal
  248.       2 index dup length dict copy exch .setglobal
  249.       dup /DataSource 4 -1 roll put exch pop
  250.     } {
  251.       pop
  252.     } ifelse
  253.   } if
  254.     % The .buildshading operators use the current color space
  255.     % for ColorSpace.
  256.   dup /ShadingType get //.shadingtypes exch get
  257.   1 index /ColorSpace get setcolorspace exec
  258. } bind def
  259. systemdict /.reuseparamdict undef
  260.  
  261. /.buildpattern2 {    % <template> <matrix> .buildpattern2
  262.             %   <template> <pattern>
  263.     % We want to build the pattern without doing gsave/grestore,
  264.     % since we want it to load the CIE caches.
  265.   1 index /Shading get
  266.   mark currentcolor currentcolorspace
  267.   counttomark 4 add -3 roll mark 4 1 roll
  268.     % Stack: -mark- ..color.. cspace -mark- template matrix shadingdict
  269.   { .buildshading } stopped {
  270.     cleartomark setcolorspace setcolor pop stop
  271.   } if
  272.   .buildshadingpattern
  273.   3 -1 roll pop counttomark 1 add 2 roll setcolorspace setcolor pop
  274. } bind def
  275.  
  276. .patterntypes
  277.   2 /.buildpattern2 load put
  278.  
  279. /shfill {        % <shadingdict> shfill -
  280.     % Currently, .shfill requires that the color space
  281.     % in the pattern be the current color space.
  282.   dup gsave { .buildshading .shfill } stopped grestore { stop } if
  283.   pop
  284. } odef
  285.  
  286. % Establish an initial smoothness value that matches Adobe RIPs.
  287. 0.02 setsmoothness
  288.  
  289. % ------ UseCIEColor ------ %
  290.  
  291. % The library maintains and detects the UseCIEColor device parameter,
  292. % but it doesn't have access to the resource dictionaries.  We also
  293. % want color space substitution to work in systems without a PostScript
  294. % interpreter.  Therefore, we eagerly inform the library of changes in
  295. % the (effective) ColorSpace category that might affect the operation of
  296. % UseCIEColor.  We must notice the following events:
  297. %    1) defineresource and undefineresource of the Default ColorSpaces.
  298. %    2) restore.
  299. %    3) Changes in current VM, which cause a different set of resources
  300. %    to become visible.
  301. % #1 is rare.  #2 is handled in C code.  If checking the ColorSpace
  302. % category on #3 turns out to be expensive, we can cache more information
  303. % about whether these operations actually affect UseCIEColor.
  304.  
  305. % This operator implements color space substitution in the library:
  306. %    <index> <bool> .setsubstitutecolorspace -
  307. % <bool> = true means substitute the current color space for the one given
  308. % by <index>; <bool> = false means stop substituting.  Substitution is not
  309. % affected by grestore/setgstate, but it is affected by restore.
  310.  
  311. % ColorSpace defineresource and undefineresource for the Default keys
  312. % call .definedefaultcs and .undefinedefaultcs.  See gs_res.ps.
  313.  
  314. /.useciecolorkeydict mark
  315.   /UseCIEColor null
  316. .dicttomark readonly def
  317. /.definedefaultcs {    % <index> <value> .definedefaultcs -
  318.   currentcolorspace
  319.     % Temporarily disable color substitution, in case the substitute
  320.     % color space is or mentions a color space that is currently
  321.     %  being substituted.
  322.   currentdevice //.useciecolorkeydict .getdeviceparams exch pop exch pop
  323.   mark 5 -2 roll
  324.     % Stack: cspace UseCIEColor mark index value
  325.    { setcolorspace true .setsubstitutecolorspace }
  326.   stopped counttomark 1 add 1 roll cleartomark
  327.     % Stack: cspace UseCIEColor stopped?
  328.   3 1 roll
  329.   currentdevice null true mark /UseCIEColor 6 -1 roll .putdeviceparams pop pop
  330.   setcolorspace { stop } if
  331. } bind def
  332. currentdict /.useciecolorkeydict undef
  333.  
  334. /.undefinedefaultcs {    % <index> .undefinedefaultcs -
  335.   false .setsubstitutecolorspace
  336. } bind def
  337.  
  338. /.setdefaultcs {    % <index> <value|null> .setdefaultcs -
  339.   dup null eq { pop .undefinedefaultcs } { .definedefaultcs } ifelse
  340. } bind def
  341.  
  342. /.getdefaultcs {    % <key> .getdefaultcs <value|null>
  343.   .GetInstance { 0 get } { null } ifelse
  344. } bind def
  345.  
  346. /.setglobal {        % <bool> .setglobal -
  347.   dup .currentglobal ne {
  348.     % If there are no local definitions of the Default keys,
  349.     % changing VM can't affect the definition of any resource.
  350.     /.localcsdefaults .uservar {
  351.     % We only want to change substitutions for color spaces
  352.     % whose definitions are actually changing.
  353.       /ColorSpace /Category findresource begin
  354.       /DefaultGray .getdefaultcs
  355.       /DefaultRGB .getdefaultcs
  356.       /DefaultCMYK .getdefaultcs
  357.       end
  358.       3 index .setglobal
  359.       /ColorSpace /Category findresource begin
  360.       /DefaultGray .getdefaultcs
  361.       /DefaultRGB .getdefaultcs
  362.       /DefaultCMYK .getdefaultcs
  363.       end
  364.             % Stack: bool oldgray oldrgb oldcmyk
  365.             %   newgray newrgb newcmyk
  366.       dup 4 index ne { 2 exch .setdefaultcs } { pop } ifelse
  367.       dup 4 index ne { 1 exch .setdefaultcs } { pop } ifelse
  368.       dup 4 index ne { 0 exch .setdefaultcs } { pop } ifelse
  369.       pop pop pop pop
  370.     } {
  371.       .setglobal
  372.     } ifelse
  373.   } {
  374.     .setglobal
  375.   } ifelse
  376. } .bind odef        % bind in .setglobal
  377.  
  378. % ------ DeviceN color space ------ %
  379.  
  380. % This isn't quite right, because the ColorSpaceFamily resource will exist
  381. % even with languagelevel < 3, but it's close enough.
  382.  
  383. /.setdevicenspace where {
  384.   pop colorspacedict /DeviceN {
  385.     dup 2 get setcolorspace dup
  386.     dup 1 get length        % # of components
  387.     .converttinttransform .setdevicenspace
  388.   } bind put
  389. } if
  390.  
  391. % ------ Miscellaneous ------ %
  392.  
  393. % Define additional user and system parameters.
  394. /HalftoneMode 0 .definepsuserparam
  395. /MaxSuperScreen 1016 .definepsuserparam
  396. pssystemparams begin        % read-only, so use .forcedef
  397.   /MaxDisplayAndSourceList 160000 .forcedef
  398. end
  399.  
  400. % Define the IdiomSet resource category.
  401. { /IdiomSet } {
  402.   /Generic /Category findresource dup maxlength 3 add dict .copydict begin
  403.     /InstanceType /dicttype def
  404.   currentdict end /Category defineresource pop
  405. } forall
  406.  
  407. /languagelevel 3 def
  408. % When running in LanguageLevel 3 mode, this interpreter is supposed to be
  409. % compatible with Adobe version 3010.
  410. /version (3010) readonly def
  411.  
  412. .setlanguagelevel
  413.  
  414. end            % ll3dict
  415.