home *** CD-ROM | disk | FTP | other *** search
/ Acorn User 10 / AU_CD10.iso / Updates / GhostScript / !GhostScr / 6_01 / lib / gs_dpnxt.ps < prev    next >
Text File  |  2000-03-09  |  5KB  |  115 lines

  1. %    Copyright (C) 1997, 1998 Aladdin Enterprises.  All rights reserved.
  2. % This file is part of Aladdin Ghostscript.
  3. % Aladdin Ghostscript is distributed with NO WARRANTY OF ANY KIND.  No author
  4. % or distributor accepts any responsibility for the consequences of using it,
  5. % or for whether it serves any particular purpose or works at all, unless he
  6. % or she says so in writing.  Refer to the Aladdin Ghostscript Free Public
  7. % License (the "License") for full details.
  8. % Every copy of Aladdin Ghostscript must include a copy of the License,
  9. % normally in a plain ASCII text file named PUBLIC.  The License grants you
  10. % the right to copy, modify and redistribute Aladdin Ghostscript, but only
  11. % under certain conditions described in the License.  Among other things, the
  12. % License requires that the copyright notice and this notice be preserved on
  13. % all copies.
  14.  
  15. % $Id: gs_dpnxt.ps,v 1.1 2000/03/09 08:40:39 lpd Exp $
  16. % gs_dpnxt.ps
  17. % NeXT Display PostScript extensions
  18.  
  19. % Define the operation values for compositing.  These must match the values
  20. % in gsdpnext.h, which also are the ones from the NeXT documentation.
  21. % We put them in systemdict, which seems like as good a place as any.
  22. mark
  23.   /Clear /Copy /Sover /Sin /Sout /Satop /Dover /Din /Dout /Datop /Xor
  24.   /PlusD /PlusL /Highlight    % not sure about Highlight
  25. counttomark { counttomark 1 sub def } repeat pop
  26.  
  27. % We implement readimage and sizeimage using the following 3 otherwise
  28. % undocumented lower-level operators:
  29. %
  30. %    <x> <y> <width> <height> <matrix> .sizeimagebox
  31. %      <dev_x> <dev_y> <dev_width> <dev_height> <matrix>
  32. %
  33. %    - .sizeimageparams <bits/sample> <multiproc> <ncolors>
  34. %
  35. %    <device> <x> <y> <width> <max_height> <alpha?> <std_depth|null>
  36. %      <string> .getbitsrect <height> <substring>
  37. %
  38. % NOTE: These operators are subject to change without notice!
  39.  
  40. % Implement readimage using .getbitsrect.  Experimentation on a NeXT system
  41. % shows that the data is always returned in order of increasing device Y,
  42. % regardless of the CTM.
  43. %
  44. % Note that we can't make stack protection work for this operator,
  45. % because it must remove its operands from the stack before calling
  46. % the supplied procedure(s).
  47.  
  48. /readimage {        % <x> <y> <width> <height> <proc> [... <procN-1>]
  49.             %   <string> <alpha?> readimage -
  50.   .sizeimageparams exch {
  51.     % multiproc = true.  If N > 1, store the procedures in an array.
  52.     exch pop 1 index { 1 add } if
  53.     % Stack: ... string alpha? nprocs
  54.     dup 1 eq {
  55.       pop false        % only 1 procedure, multiproc is irrelevant
  56.     } {
  57.       dup array 4 1 roll 3 add 2 roll astore 3 1 roll true
  58.     } ifelse
  59.   } {
  60.     % multiproc = false.
  61.     pop pop false
  62.   } ifelse
  63.     % Map the rectangle to device coordinates.
  64.     % Stack: x y w h proc(s) str alpha? multi?
  65.   8 -4 roll matrix .sizeimagebox pop 8 4 roll
  66.     % Make sure we allocate the operand array in local VM
  67.     % to avoid a possible invalidaccess.
  68.   .currentglobal false .setglobal 9 1 roll
  69.   exch { 1 } { 0 } ifelse exch        % alpha is last, if present
  70.   exch 4 1 roll 8 array astore exch .setglobal
  71.   {    % Read out a block of scan lines and pass them to the procedure.
  72.     % Stack: [x y w h alpha? proc(s) str multi?] -- we must consume this.
  73.     dup 3 get 0 eq { pop exit } if
  74.     aload 9 1 roll pop exch pop currentdevice 7 1 roll
  75.     % Always read out the data as standard (not native) pixels.
  76.     .sizeimageparams pop pop exch .getbitsrect
  77.     % Stack: [x y w h alpha? proc(s) str multi?] hread substr
  78.     3 -1 roll
  79.     % Stack: hread substr [x y w h alpha? proc(s) str multi?]
  80.     dup 1 2 copy get 5 index add put
  81.     % Stack: hread substr [x y' w h alpha? proc(s) str multi?]
  82.     dup 3 2 copy get 6 -1 roll sub put
  83.     % Stack: substr [x y' w h' alpha? proc(s) str multi?]
  84.     dup 5 get exch 7 get {
  85.     % multiproc = true, pass each plane to a different procedure.
  86.     % Stack: substr procs
  87.       0 1 2 index length 1 sub {
  88.     % Push 1 plane and its procedure under the top 2 elements.
  89.     % Stack: ... substr procs plane#
  90.     2 index length 2 index length idiv    % bytes per plane
  91.     dup 2 index mul exch
  92.     % Stack: ... substr procs plane# start length
  93.     4 index 3 1 roll getinterval 4 1 roll
  94.     2 copy get 4 1 roll pop
  95.       } for
  96.       exch pop length 2 mul .execn
  97.     } {
  98.     % multiproc = false, just call the procedure.
  99.       exec
  100.     } ifelse
  101.   } //systemdict /exec get 3 packedarray cvx loop
  102. } bind odef
  103.  
  104. % Implement sizeimage using lower-level operators.
  105.  
  106. /sizeimage {        % <x> <y> <width> <height> <matrix> sizeimage
  107.             %   <devwidth> <devheight> <bits/sample> <matrix>
  108.             %   <multiproc> <ncolors>
  109.   .sizeimagebox 5 -2 roll pop pop
  110.   .sizeimageparams 3 -1 roll 4 1 roll
  111. } bind odef
  112.