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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
|
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License, Version 1.0 only
* (the "License"). You may not use this file except in compliance
* with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2004 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _SYS_PIXRECT_H
#define _SYS_PIXRECT_H
#pragma ident "%Z%%M% %I% %E% SMI" /* SunOS4.1.2 1.51 */
#include <sys/types.h> /* system type defs */
#ifdef __cplusplus
extern "C" {
#endif
/*
* This file defines the programmer interface to the pixrect abstraction.
* A pixrect is a rectangular array of pixels on which a number of
* operations are defined.
*
* Each pixrect has as visible attributes its height and width in
* pixels and the number of bits stored for each pixel. It also supports
* several operations. The proper way to think of the operations is
* that they are messages sent to the pixrect. The operations are:
*
* pr_destroy Destroy a pixrect.
* pr_rop Raster operation from another pixrect to the
* destination pixrect. The case where the source
* and destination overlap is properly handled.
* pr_stencil Raster operation from source pixrect to the
* dest pixrect using a stencil pixrect as a 'cookie
* cutter' to perform a spatial write enable.
* pr_batchrop Like pr_rop, but source is an array of pixrects,
* and an offset to be applied before each pixrect.
* This is specifically designed for operations like
* putting up text, which consists of a number of
* characters from a font, each given by a pixrect.
* pr_get Get the value of a single pixel from a pixrect.
* pr_put Change a single pixel value in a pixrect.
* pr_vector Draw a vector in a pixrect
* pr_region Create a new pixrect which describes a rectangular
* sub-region of an existing pixrect.
* pr_putcolormap Write a portion of the colormap.
* pr_getcolormap Read a portion of the colormap.
* pr_putattributes Set the plane mask.
* pr_getattributes Get the plane mask.
*/
/*
* There are a number of structures used in the arguments to pixrects:
*
* struct pr_pos A position within a pixrect is a pair of
* integers giving the offset from the upper
* left corner. The pixels within a pixrect
* are numbered with (0, 0) at the upper left
* and (width-1, height-1) at the lower right.
* struct pr_prpos A pixrect and a position within it.
* struct pr_size A pair of integers representing the
* size of a rectangle within a pixrect.
* struct pr_subregion A pixrect, a position and a size,
* specifying a rectangular sub-region.
*/
struct pr_size {
int x, y;
};
typedef struct pixrect {
struct pixrectops *pr_ops; /* operations appropriate to this pr */
struct pr_size pr_size; /* pixels per dimension */
int pr_depth; /* bits per pixel */
caddr_t pr_data; /* device-dependent data */
} Pixrect;
#define pr_width pr_size.x
#define pr_height pr_size.y
struct pr_pos {
int x, y;
};
struct pr_prpos {
Pixrect *pr;
struct pr_pos pos;
};
struct pr_subregion {
Pixrect *pr;
struct pr_pos pos;
struct pr_size size;
};
/*
* Pr_product is used when doing multiplications involving pixrects,
* and casts its arguments to that the compiler will use 16 by 16 multiplies.
*/
#ifndef pr_product
#if defined(__sun) && !defined(__sparc)
#define pr_product(a, b) ((short)(a) * (short)(b))
#else
#define pr_product(a, b) ((a) * (b))
#endif
#endif
#ifndef _KERNEL
/*
* Takes device file name. This is how a screen pixrect is created.
*/
extern Pixrect *pr_open();
#endif /* !_KERNEL */
/*
* Pixrect ops vector, used by pr_ macros below to call the appropriate
* device dependent function for the destination pixrect.
*/
struct pixrectops {
int (*pro_rop)();
#ifndef _KERNEL
int (*pro_stencil)();
int (*pro_batchrop)();
int (*pro_nop)(); /* place holder */
int (*pro_destroy)();
int (*pro_get)();
int (*pro_put)();
int (*pro_vector)();
Pixrect * (*pro_region)();
#endif /* !_KERNEL */
int (*pro_putcolormap)();
#ifndef _KERNEL
int (*pro_getcolormap)();
#endif /* !_KERNEL */
int (*pro_putattributes)();
#ifndef _KERNEL
int (*pro_getattributes)();
#endif /* !_KERNEL */
#ifdef _KERNEL
int (*pro_nop)(); /* place holder */
#endif /* _KERNEL */
};
#if !defined(__lint) || defined(_KERNEL)
#define pr_rop(dpr, dx, dy, w, h, op, spr, sx, sy) \
(*(dpr)->pr_ops->pro_rop)((dpr), (dx), (dy), (w), (h), (op), \
(spr), (sx), (sy))
#define pr_putcolormap(pr, ind, cnt, red, grn, blu) \
(*(pr)->pr_ops->pro_putcolormap)((pr), (ind), (cnt), \
(red), (grn), (blu))
#define pr_putattributes(pr, planes) \
(*(pr)->pr_ops->pro_putattributes)((pr), (planes))
#define _PR_IOCTL_KERNEL_DEFINED
#define pr_ioctl(pr, cmd, data) \
((pr)->pr_ops->pro_nop ? \
(*(pr)->pr_ops->pro_nop)((pr), (cmd), (data)) : -1)
#ifndef _KERNEL
#define pr_stencil(dpr, dx, dy, w, h, op, stpr, stx, sty, spr, sx, sy) \
(*(dpr)->pr_ops->pro_stencil)((dpr), (dx), (dy), (w), (h), (op), \
(stpr), (stx), (sty), (spr), (sx), (sy))
#define pr_batchrop(dpr, x, y, op, sbp, n) \
(*(dpr)->pr_ops->pro_batchrop)((dpr), (x), (y), (op), (sbp), (n))
#define pr_destroy(pr) \
(*(pr)->pr_ops->pro_destroy)(pr)
#define pr_get(pr, x, y) \
(*(pr)->pr_ops->pro_get)((pr), (x), (y))
#define pr_put(pr, x, y, val) \
(*(pr)->pr_ops->pro_put)((pr), (x), (y), (val))
#define pr_vector(pr, x0, y0, x1, y1, op, color) \
(*(pr)->pr_ops->pro_vector)((pr), (x0), (y0), (x1), (y1), (op), \
(color))
#define pr_region(pr, x, y, w, h) \
(*(pr)->pr_ops->pro_region)((pr), (x), (y), (w), (h))
#define pr_getcolormap(pr, ind, cnt, red, grn, blu) \
(*(pr)->pr_ops->pro_getcolormap)((pr), (ind), (cnt), \
(red), (grn), (blu))
#define pr_getattributes(pr, planes) \
(*(pr)->pr_ops->pro_getattributes)((pr), (planes))
#endif /* !_KERNEL */
#else /* !__lint || _KERNEL */
extern pr_rop();
extern pr_stencil();
extern pr_batchrop();
extern pr_destroy();
extern pr_get();
extern pr_put();
extern pr_vector();
extern Pixrect *pr_region();
extern pr_putcolormap();
extern pr_getcolormap();
extern pr_putattributes();
extern pr_getattributes();
#endif /* __lint */
/*
* Several of the above operations return a common, distinguished value when
* an error arises. That value is defined as follows:
*/
#define PIX_ERR -1
/*
* Operations. The 'op' in 'rasterop' may be any binary Boolean function,
* encoded as an integer from 0 to 15 (the op code) shifted left by one bit.
* The function is applied per-pixel.
*
* The following permit the op to be expressed as Boolean combinations
* of the two inputs 'src' and 'dst'. Thus oring the source and destination
* together is written as PIX_SRC|PIX_DST, while xoring the source with the
* destination is PIX_SRC^PIX_DST. Since ~op would set the color and clip
* bits, the macro PIX_NOT is provided for use in place of ~.
*/
#define PIX_SRC (0xC << 1)
#define PIX_DST (0xA << 1)
#define PIX_NOT(op) ((op) ^ 0x1E)
#define PIX_CLR (0x0 << 1)
#define PIX_SET (0xF << 1)
/* macros which tell whether a rasterop needs SRC or DST values */
#define PIXOP_NEEDS_DST(op) ((((op)>>1)^(op)) & PIX_NOT(PIX_DST))
#define PIXOP_NEEDS_SRC(op) ((((op)>>2)^(op)) & PIX_NOT(PIX_SRC))
/* macros for encoding and extracting color field */
#define PIX_COLOR(c) ((c)<<5)
#define PIX_OPCOLOR(op) ((op)>>5)
#define PIX_OP_CLIP(op) ((op)&0x1f)
#define PIX_OP(op) ((op)&0x1e)
/*
* The pseudo-operation PIX_DONTCLIP specifies that clipping should not
* be performed. PIX_CLIP is also provided, although unnecessary.
*/
#define PIX_DONTCLIP 0x1
#define PIX_CLIP 0x0
/*
* The following structured definitions, all prefixed with prs_, correspond
* to the unstructured definitions above prefixed with pr_.
*/
#if !defined(__lint) || defined(_KERNEL)
#define prs_rop(dstreg, op, srcprpos) \
pr_rop((dstreg).pr, (dstreg).pos.x, (dstreg).pos.y, \
(dstreg).size.x, (dstreg).size.y, (op), \
(srcprpos).pr, (srcprpos).pos.x, (srcprpos).pos.y)
#define prs_stencil(dstreg, op, stenprpos, srcprpos) \
pr_stencil((dstreg).pr, (dstreg).pos.x, (dstreg).pos.y, \
(dstreg).size.x, (dstreg).size.y, (op), \
(stenprpos).pr, (stenprpos).pos.x, (stenprpos).pos.y, \
(srcprpos).pr, (srcprpos).pos.x, (srcprpos).pos.y)
#define prs_batchrop(dstprpos, op, items, n) \
pr_batchrop((dstprpos).pr, (dstprpos).pos.x, (dstprpos).pos.y, \
(op), (items), (n))
#define prs_destroy(pr) pr_destroy(pr)
#define prs_get(srcprpos) \
pr_get((srcprpos).pr, (srcprpos).pos.x, (srcprpos).pos.y)
#define prs_put(dstprpos, val) \
pr_put((dstprpos).pr, (dstprpos).pos.x, (dstprpos).pos.y, (val))
#define prs_vector(pr, pos0, pos1, op, color) \
pr_vector((pr), (pos0).x, (pos0).y, (pos1).x, (pos1).y, (op), (color))
#define prs_region(dstreg) \
pr_region((dstreg).pr, (dstreg).pos.x, (dstreg).pos.y, \
(dstreg).size.x, (dstreg).size.y)
#define prs_putcolormap(pr, ind, cnt, red, grn, blu) \
pr_putcolormap((pr), (ind), (cnt), (red), (grn), (blu))
#define prs_getcolormap(pr, ind, cnt, red, grn, blu) \
pr_getcolormap((pr), (ind), (cnt), (red), (grn), (blu))
#define prs_putattributes(pr, planes) pr_putattributes((pr), (planes))
#define prs_getattributes(pr, planes) pr_getattributes((pr), (planes))
/* pr_replrop is not currently in the ops vector */
#define prs_replrop(dstreg, op, srcprpos) \
pr_replrop((dstreg).pr, (dstreg).pos.x, (dstreg).pos.y, \
(dstreg).size.x, (dstreg).size.y, (op), \
(srcprpos).pr, (srcprpos).pos.x, (srcprpos).pos.y)
/* pr_close is a synonym for pr_destroy */
#define pr_close(pr) pr_destroy(pr)
/* textured line macro */
#define pr_line(pr, x0, y0, x1, y1, brush, tex, op) \
pro_line((pr), (x0), (y0), (x1), (y1), (brush), (tex), (op), 0)
#else /* !__lint || _KERNEL */
extern prs_rop();
extern prs_stencil();
extern prs_batchrop();
extern prs_destroy();
extern prs_get();
extern prs_put();
extern prs_vector();
extern Pixrect *prs_region();
extern prs_putcolormap();
extern prs_getcolormap();
extern prs_putattributes();
extern prs_getattributes();
extern prs_replrop();
extern pr_close();
extern pr_line();
#endif /* !__lint || _KERNEL */
/*
* magic flag passed to true color frame buffer to force updating the
* colormap. Yes, a kludge.
* Value defined to be the same as PIX_DONT_SET_PLANES purposedly
*/
#define PR_FORCE_UPDATE (1 << 24)
/*
* Yet another magic flag - to explicitly not use the
* inverse gamma table.
*/
#define PR_DONT_DEGAMMA (1 << 23)
#define PR_DEGAMMA (1 << 22)
#ifdef ROUNDUP
#undef ROUNDUP
#endif
#define ROUNDUP(val, gran) (((val) - 1 | (gran) - 1) + 1)
/* structure used to specify fields in a 32-bit pixel */
union fbunit {
unsigned int packed; /* whole-sale deal */
struct {
unsigned int A:8; /* unused, for now */
unsigned int B:8; /* blue channel */
unsigned int G:8; /* green channel */
unsigned int R:8; /* red channel */
} channel; /* access per channel */
};
#define pr_putlut(pr, ind, cnt, red, grn, blu) \
(*(pr)->pr_ops->pro_putcolormap)((pr), PR_FORCE_UPDATE | (ind), \
(cnt), (red), (grn), (blu))
#ifndef _KERNEL
#define pr_getlut(pr, ind, cnt, red, grn, blu) \
(*(pr)->pr_ops->pro_getcolormap)((pr), PR_FORCE_UPDATE | (ind), \
(cnt), (red), (grn), (blu))
#endif /* !_KERNEL */
#ifdef __cplusplus
}
#endif
#endif /* _SYS_PIXRECT_H */
|