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_dps2.ps < prev    next >
Text File  |  2000-12-05  |  7KB  |  227 lines

  1. %    Copyright (C) 1990, 1996, 1997, 1998 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_dps2.ps,v 1.2 2000/09/19 18:29:11 lpd Exp $
  16. % Initialization file for basic Display PostScript functions
  17. % that are also included in Level 2.
  18.  
  19. level2dict begin
  20.  
  21. % ------ Halftones ------ %
  22.  
  23. /.makestackdict
  24.     { { counttomark -1 roll } forall .dicttomark
  25.     } bind def
  26. /currenthalftone        % - currenthalftone <dict>
  27.     { mark .currenthalftone
  28.        { { exch pop }        % halftone
  29.          { /HalftoneType 1        % screen
  30.         { /Frequency /Angle /SpotFunction }
  31.            .makestackdict
  32.          }
  33.          { /HalftoneType 2        % colorscreen
  34.         { /RedFrequency /RedAngle /RedSpotFunction
  35.           /GreenFrequency /GreenAngle /GreenSpotFunction
  36.           /BlueFrequency /BlueAngle /BlueSpotFunction
  37.           /GrayFrequency /GrayAngle /GraySpotFunction
  38.         }
  39.            .makestackdict
  40.          }
  41.        }
  42.       exch get exec
  43.     } odef
  44. % Define sethalftone so it converts types 1-4 to type 5.
  45. /.makehalftoneRGBV {    % <dict> <type> <keys> <keysRGBV>
  46.   4 -1 roll exch { 1 index exch get exch } forall 15 1 roll
  47.   14 -2 roll mark 15 1 roll { /Gray /Blue /Green /Red } {
  48.         % stack: v0 v1 v2 type keys comp
  49.     mark
  50.     2 index 0 get 8 -1 roll
  51.     4 index 1 get 9 -1 roll
  52.     6 index 2 get 10 -1 roll
  53.         % stack: type keys comp mark k0 v0 k1 v1 k2 v2
  54.     /HalftoneType 10 index .dicttomark
  55.     counttomark 2 roll
  56.   } forall pop pop
  57.   /Default 1 index .dicttomark exch pop { .sethalftone5 }
  58. } bind def
  59.  
  60. % The value of each entry in .halftonetypes is a procedure:
  61. %    <setdict> <htdict> <<proc>> <setdict'> <htdict'> <sethalftoneproc>
  62. % This allows us to use these procedures both for actually implementing
  63. % sethalftone and for converting subsidiary dictionaries of HalftoneType 5
  64. % halftones.
  65. systemdict begin
  66. 15 dict /.halftonetypes 1 index def begin
  67.   1 {
  68.     mark exch /Default exch .dicttomark { .sethalftone5 }
  69.   } bind def
  70.   2 {
  71.     1 { /Frequency /Angle /SpotFunction } {
  72.       /RedFrequency /RedAngle /RedSpotFunction
  73.       /GreenFrequency /GreenAngle /GreenSpotFunction
  74.       /BlueFrequency /BlueAngle /BlueSpotFunction
  75.       /GrayFrequency /GrayAngle /GraySpotFunction
  76.     } .makehalftoneRGBV
  77.   } bind def
  78.   3 {
  79.     mark exch /Default exch .dicttomark { .sethalftone5 }
  80.   } bind def
  81.   4 {
  82.     3 { /Width /Height /Thresholds } {
  83.       /RedWidth /RedHeight /RedThresholds
  84.       /GreenWidth /GreenHeight /GreenThresholds
  85.       /BlueWidth /BlueHeight /BlueThresholds
  86.       /GrayWidth /GrayHeight /GrayThresholds
  87.     } .makehalftoneRGBV
  88.   } bind def
  89.   5 {
  90.     pop dup length dict copy
  91.     mark 1 index {
  92.         % Even HalftoneType 5 dictionaries have entries other than
  93.         % subsidiary halftone dictionaries.
  94.       dup type /dicttype ne {
  95.     0
  96.       } {
  97.     dup /HalftoneType .knownget not { 0 } if
  98.       } ifelse dup 5 gt {
  99.         % Stack: dict mark ... keyN dictN httypeN
  100.         % Assume that all HalftoneTypes > 5 convert to 5.
  101.     1 index 3 1 roll
  102.     //.halftonetypes exch get exec pop /Default get
  103.         % Stack: dict mark ... keyN setdict'N htdict'N
  104.     counttomark 1 add index 3 index 4 -1 roll put
  105.       } {
  106.     pop
  107.       } ifelse
  108.     } forall .dicttomark { .sethalftone5 }
  109.   } bind def
  110. end
  111. end
  112. /sethalftone {        % <dict> sethalftone -
  113.     % We must create the new dictionary in the same VM as the
  114.     % operand; otherwise, invalidaccess errors may occur.
  115.   .currentglobal 1 index dup gcheck .setglobal
  116.   dup //.halftonetypes 1 index /HalftoneType get get exec exec
  117.   .setglobal pop
  118. } odef
  119. % Redefine setscreen and setcolorscreen to recognize halftone dictionaries,
  120. % and to insert the Frequency and Angle into Type 1 halftones, per
  121. % Adobe TN 5085.
  122. /.fixsethalftonescreen        % <freq> <angle> <dict> .fix...screen
  123.                 %   <freq> <angle> <dict> <dict'>
  124.  { dup dup /HalftoneType get 1 eq
  125.     { dup wcheck not { dup length .copydict } if
  126.       dup /Frequency 5 index put
  127.       dup /Angle 4 index put
  128.     }
  129.    if
  130.  } bind def
  131. /setscreen        % <ignore*2> <dict> setscreen -
  132.     { dup type /dicttype eq
  133.        { .fixsethalftonescreen sethalftone pop pop pop }
  134.        { //setscreen }
  135.       ifelse
  136.     } odef
  137. /setcolorscreen        % <ignore*11> <dict> setcolorscreen -
  138.     { dup type /dicttype eq
  139.        { .fixsethalftonescreen sethalftone 12 { pop } repeat }
  140.        { //setcolorscreen }
  141.       ifelse
  142.     } odef
  143. % Redefine currentscreen and currentcolorscreen to extract the Frequency
  144. % and Angle from Type 1 halftones, per Adobe TN 5085.
  145. /.fixcurrenthalftonescreen    % <dict> .fix... <freq> <angle> <proc>
  146.  { dup /HalftoneType get 1 eq
  147.     { dup /Frequency get 1 index /Angle get }
  148.     { 60 0 }
  149.    ifelse 3 2 roll
  150.  } bind def
  151. /currentscreen        % - currentscreen 60 0 <dict>
  152.     { .currenthalftone
  153.        { { .fixcurrenthalftonescreen }    % halftone
  154.          { }                % screen
  155.          { 12 3 roll 9 { pop } repeat    % colorscreen
  156.            dup type /dicttype eq { .fixcurrenthalftonescreen } if
  157.          }
  158.        }
  159.       exch get exec
  160.     } odef
  161. /currentcolorscreen    % - currentcolorscreen (60 0 <dict>)*4
  162.     { .currenthalftone
  163.        { { .fixcurrenthalftonescreen 3 copy 6 copy }    % halftone
  164.          { 3 copy 6 copy }            % screen
  165.          { }                % colorscreen
  166.        }
  167.       exch get exec
  168.     } odef
  169.  
  170. % ------ User objects ------ %
  171.  
  172. /.localarray where {
  173.   pop
  174. } {
  175.   /.localarray {
  176.     currentglobal false setglobal
  177.     exch array exch setglobal
  178.   } bind def
  179. } ifelse
  180. /.UserObjects {
  181.   .userdict /UserObjects
  182. } odef
  183. % In order to get proper error recovery behavior, we need to be careful
  184. % not to pop any operands from the stack until we're done.
  185. % The code below faithfully duplicates the apparent array-growing
  186. % behavior of Adobe interpreters.
  187. /defineuserobject {        % <index> <value> defineuserobject -
  188.   .UserObjects .knownget {
  189.     length dup 3 index le {
  190.         % Stack: index value len
  191.       2 index eq { 1 index 2 mul } { 1 index 1 add } ifelse
  192.       .localarray .UserObjects get
  193.       1 index copy pop
  194.       .UserObjects 3 -1 roll put
  195.     } {
  196.       pop
  197.     } ifelse
  198.   } {
  199.     .UserObjects 3 index 1 add 10 .max .localarray put
  200.   } ifelse
  201.   .UserObjects get 2 index 2 index put pop pop
  202. } odef
  203. /execuserobject {        % <index> execuserobject -
  204.   .UserObjects get 1 index get exch pop exec
  205. } odef
  206. /undefineuserobject {        % <index> undefineuserobject -
  207.   .UserObjects get 1 index null put pop
  208. } odef
  209.  
  210. % ------ Cache control ------ %
  211.  
  212. % Dummy definitions for cache control operators
  213.  
  214. /ucachestatus {            % - ucachestatus -mark- ? ? ? ? <size>
  215.     mark 0 0 0 0 .userdict /.ucachesize .knownget not { 0 } if
  216. } odef
  217. /setucacheparams {        % -mark- ... <size> setucacheparams -
  218.         % Provoke an appropriate error if needed.
  219.     counttomark 1 lt { () 0 get } if
  220.     0 or .userdict /.ucachesize 2 index 0 .max put cleartomark
  221. } odef
  222.  
  223. end                % level2dict
  224.