1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
% Copyright (C) 2001-2018 Artifex Software, Inc.
% 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.
%
% Refer to licensing information at http://www.artifex.com or contact
% Artifex Software, Inc., 1305 Grant Avenue - Suite 200, Novato,
% CA 94945, U.S.A., +1(415)492-9861, for further information.
%
% 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).
/readimage { % <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
} {
% 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
|