Download as txt, pdf, or txt
Download as txt, pdf, or txt
You are on page 1of 3

% % % % % % % % % % % % % %

Copyright (C) 1997, 1998 Aladdin Enterprises. All rights reserved. This software is provided AS-IS with no warranty, either express or implied. This software is distributed under license and may not be copied, modified or distributed except as expressly authorized under the terms of the license contained in the file LICENSE in this distribution. For more information about licensing, please refer to http://www.ghostscript.com/licensing/. For information on commercial licensing, go to http://www.artifex.com/licensing/ or contact Artifex Software, Inc., 101 Lucas Valley Road #110, San Rafael, CA 94903, U.S.A., +1(415)492-9861.

% $Id: gs_dpnxt.ps 9246 2008-11-27 01:58:54Z alexcher $ % gs_dpnxt.ps % NeXT Display PostScript extensions % Define the operation values for compositing. These must match the values % in gsdpnext.h, which also are the ones from the NeXT documentation. % We put them in systemdict, which seems like as good a place as any. mark /Clear /Copy /Sover /Sin /Sout /Satop /Dover /Din /Dout /Datop /Xor /PlusD /PlusL /Highlight % not sure about Highlight counttomark { counttomark 1 sub def } repeat pop % We implement readimage and sizeimage using the following 3 otherwise % undocumented lower-level operators: % % <x> <y> <width> <height> <matrix> .sizeimagebox % <dev_x> <dev_y> <dev_width> <dev_height> <matrix> % % - .sizeimageparams <bits/sample> <multiproc> <ncolors> % % <device> <x> <y> <width> <max_height> <alpha?> <std_depth|null> % <string> .getbitsrect <height> <substring> % % NOTE: These operators are subject to change without notice! % % % % % % % Implement readimage using .getbitsrect. Experimentation on a NeXT system shows that the data is always returned in order of increasing device Y, regardless of the CTM. Note that we can't make stack protection work for this operator, because it must remove its operands from the stack before calling the supplied procedure(s). % <x> <y> <width> <height> <proc> [... <procN-1>] % <string> <alpha?> readimage .sizeimageparams exch { % multiproc = true. If N > 1, store the procedures in an array. exch pop 1 index { 1 add } if % Stack: ... string alpha? nprocs dup 1 eq { pop false % only 1 procedure, multiproc is irrelevant } { dup array 4 1 roll 3 add 2 roll astore 3 1 roll true } ifelse } {

/readimage {

% multiproc = false. pop pop false } ifelse % Map the rectangle to device coordinates. % Stack: x y w h proc(s) str alpha? multi? 8 -4 roll matrix .sizeimagebox pop 8 4 roll % Make sure we allocate the operand array in local VM % to avoid a possible invalidaccess. .currentglobal false .setglobal 9 1 roll exch { 1 } { 0 } ifelse exch % alpha is last, if present exch 4 1 roll 8 array astore exch .setglobal { % Read out a block of scan lines and pass them to the procedure. % Stack: [x y w h alpha? proc(s) str multi?] -- we must consume this. dup 3 get 0 eq { pop exit } if aload 9 1 roll pop exch pop currentdevice 7 1 roll % Always read out the data as standard (not native) pixels. .sizeimageparams pop pop exch .getbitsrect % Stack: [x y w h alpha? proc(s) str multi?] hread substr 3 -1 roll % Stack: hread substr [x y w h alpha? proc(s) str multi?] dup 1 2 copy get 5 index add put % Stack: hread substr [x y' w h alpha? proc(s) str multi?] dup 3 2 copy get 6 -1 roll sub put % Stack: substr [x y' w h' alpha? proc(s) str multi?] dup 5 get exch 7 get { % multiproc = true, pass each plane to a different procedure. % Stack: substr procs 0 1 2 index length 1 sub { % Push 1 plane and its procedure under the top 2 elements. % Stack: ... substr procs plane# 2 index length 2 index length idiv % bytes per plane dup 2 index mul exch % Stack: ... substr procs plane# start length 4 index 3 1 roll getinterval 4 1 roll 2 copy get 4 1 roll pop } for exch pop length 2 mul .execn } { % multiproc = false, just call the procedure. exec } ifelse } //systemdict /exec get 3 packedarray cvx loop } bind odef % % <w> <h> <bpc> <mtx> <dsrc0> ... <multi> <ncomp> alphaimage % img_utils_dict begin /.alphaimage where { pop .currentglobal true .setglobal /alphaimage { //true //.colorimage stopped { /alphaimage .systemvar $error /errorname get signalerror } if }

.bind systemdict begin odef end .setglobal } if end % Implement sizeimage using lower-level operators. /sizeimage { % <x> <y> <width> <height> <matrix> sizeimage % <devwidth> <devheight> <bits/sample> <matrix> % <multiproc> <ncolors> .sizeimagebox 5 -2 roll pop pop .sizeimageparams 3 -1 roll 4 1 roll } bind odef

You might also like