1 /***********************************************************
2 
3 Copyright 1987, 1998  The Open Group
4 
5 Permission to use, copy, modify, distribute, and sell this software and its
6 documentation for any purpose is hereby granted without fee, provided that
7 the above copyright notice appear in all copies and that both that
8 copyright notice and this permission notice appear in supporting
9 documentation.
10 
11 The above copyright notice and this permission notice shall be included in
12 all copies or substantial portions of the Software.
13 
14 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
17 OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18 AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19 CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20 
21 Except as contained in this notice, the name of The Open Group shall not be
22 used in advertising or otherwise to promote the sale, use or other dealings
23 in this Software without prior written authorization from The Open Group.
24 
25 Copyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
26 
27                         All Rights Reserved
28 
29 Permission to use, copy, modify, and distribute this software and its
30 documentation for any purpose and without fee is hereby granted,
31 provided that the above copyright notice appear in all copies and that
32 both that copyright notice and this permission notice appear in
33 supporting documentation, and that the name of Digital not be
34 used in advertising or publicity pertaining to distribution of the
35 software without specific, written prior permission.
36 
37 DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
38 ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
39 DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
40 ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
41 WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
42 ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
43 SOFTWARE.
44 
45 ******************************************************************/
46 /*
47  * Copyright © 1998, 2004 Keith Packard
48  * Copyright   2007 Red Hat, Inc.
49  *
50  * Permission to use, copy, modify, distribute, and sell this software and its
51  * documentation for any purpose is hereby granted without fee, provided that
52  * the above copyright notice appear in all copies and that both that
53  * copyright notice and this permission notice appear in supporting
54  * documentation, and that the name of Keith Packard not be used in
55  * advertising or publicity pertaining to distribution of the software without
56  * specific, written prior permission.  Keith Packard makes no
57  * representations about the suitability of this software for any purpose.  It
58  * is provided "as is" without express or implied warranty.
59  *
60  * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
61  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
62  * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
63  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
64  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
65  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
66  * PERFORMANCE OF THIS SOFTWARE.
67  */
68 
69 #ifndef PIXMAN_H__
70 #define PIXMAN_H__
71 
72 #include <pixman-version.h>
73 
74 #ifdef  __cplusplus
75 #define PIXMAN_BEGIN_DECLS extern "C" {
76 #define PIXMAN_END_DECLS }
77 #else
78 #define PIXMAN_BEGIN_DECLS
79 #define PIXMAN_END_DECLS
80 #endif
81 
82 PIXMAN_BEGIN_DECLS
83 
84 /*
85  * Standard integers
86  */
87 
88 #if !defined (PIXMAN_DONT_DEFINE_STDINT)
89 
90 #if defined (_SVR4) || defined (SVR4) || defined (__OpenBSD__) || defined (_sgi) || defined (__sun) || defined (sun) || defined (__digital__) || defined (__HP_cc)
91 #  include <inttypes.h>
92 /* VS 2010 (_MSC_VER 1600) has stdint.h */
93 #elif defined (_MSC_VER) && _MSC_VER < 1600
94 typedef __int8 int8_t;
95 typedef unsigned __int8 uint8_t;
96 typedef __int16 int16_t;
97 typedef unsigned __int16 uint16_t;
98 typedef __int32 int32_t;
99 typedef unsigned __int32 uint32_t;
100 typedef __int64 int64_t;
101 typedef unsigned __int64 uint64_t;
102 #elif defined (_AIX)
103 #  include <sys/inttypes.h>
104 #else
105 #  include <stdint.h>
106 #endif
107 
108 #endif
109 
110 /*
111  * Boolean
112  */
113 typedef int pixman_bool_t;
114 
115 /*
116  * Fixpoint numbers
117  */
118 typedef int64_t			pixman_fixed_32_32_t;
119 typedef pixman_fixed_32_32_t	pixman_fixed_48_16_t;
120 typedef uint32_t		pixman_fixed_1_31_t;
121 typedef uint32_t		pixman_fixed_1_16_t;
122 typedef int32_t			pixman_fixed_16_16_t;
123 typedef pixman_fixed_16_16_t	pixman_fixed_t;
124 
125 #define pixman_fixed_e			((pixman_fixed_t) 1)
126 #define pixman_fixed_1			(pixman_int_to_fixed(1))
127 #define pixman_fixed_1_minus_e		(pixman_fixed_1 - pixman_fixed_e)
128 #define pixman_fixed_minus_1		(pixman_int_to_fixed(-1))
129 #define pixman_fixed_to_int(f)		((int) ((f) >> 16))
130 #define pixman_int_to_fixed(i)		((pixman_fixed_t) ((uint32_t) (i) << 16))
131 #define pixman_fixed_to_double(f)	(double) ((f) / (double) pixman_fixed_1)
132 #define pixman_double_to_fixed(d)	((pixman_fixed_t) ((d) * 65536.0))
133 #define pixman_fixed_frac(f)		((f) & pixman_fixed_1_minus_e)
134 #define pixman_fixed_floor(f)		((f) & ~pixman_fixed_1_minus_e)
135 #define pixman_fixed_ceil(f)		pixman_fixed_floor ((f) + pixman_fixed_1_minus_e)
136 #define pixman_fixed_fraction(f)	((f) & pixman_fixed_1_minus_e)
137 #define pixman_fixed_mod_2(f)		((f) & (pixman_fixed1 | pixman_fixed_1_minus_e))
138 #define pixman_max_fixed_48_16		((pixman_fixed_48_16_t) 0x7fffffff)
139 #define pixman_min_fixed_48_16		(-((pixman_fixed_48_16_t) 1 << 31))
140 
141 /*
142  * Misc structs
143  */
144 typedef struct pixman_color pixman_color_t;
145 typedef struct pixman_point_fixed pixman_point_fixed_t;
146 typedef struct pixman_line_fixed pixman_line_fixed_t;
147 typedef struct pixman_vector pixman_vector_t;
148 typedef struct pixman_transform pixman_transform_t;
149 
150 struct pixman_color
151 {
152     uint16_t	red;
153     uint16_t    green;
154     uint16_t    blue;
155     uint16_t    alpha;
156 };
157 
158 struct pixman_point_fixed
159 {
160     pixman_fixed_t	x;
161     pixman_fixed_t	y;
162 };
163 
164 struct pixman_line_fixed
165 {
166     pixman_point_fixed_t	p1, p2;
167 };
168 
169 /*
170  * Fixed point matrices
171  */
172 
173 struct pixman_vector
174 {
175     pixman_fixed_t	vector[3];
176 };
177 
178 struct pixman_transform
179 {
180     pixman_fixed_t	matrix[3][3];
181 };
182 
183 /* forward declaration (sorry) */
184 struct pixman_box16;
185 typedef  union pixman_image		pixman_image_t;
186 
187 PIXMAN_API
188 void          pixman_transform_init_identity    (struct pixman_transform       *matrix);
189 
190 PIXMAN_API
191 pixman_bool_t pixman_transform_point_3d         (const struct pixman_transform *transform,
192 						 struct pixman_vector          *vector);
193 
194 PIXMAN_API
195 pixman_bool_t pixman_transform_point            (const struct pixman_transform *transform,
196 						 struct pixman_vector          *vector);
197 
198 PIXMAN_API
199 pixman_bool_t pixman_transform_multiply         (struct pixman_transform       *dst,
200 						 const struct pixman_transform *l,
201 						 const struct pixman_transform *r);
202 
203 PIXMAN_API
204 void          pixman_transform_init_scale       (struct pixman_transform       *t,
205 						 pixman_fixed_t                 sx,
206 						 pixman_fixed_t                 sy);
207 
208 PIXMAN_API
209 pixman_bool_t pixman_transform_scale            (struct pixman_transform       *forward,
210 						 struct pixman_transform       *reverse,
211 						 pixman_fixed_t                 sx,
212 						 pixman_fixed_t                 sy);
213 
214 PIXMAN_API
215 void          pixman_transform_init_rotate      (struct pixman_transform       *t,
216 						 pixman_fixed_t                 cos,
217 						 pixman_fixed_t                 sin);
218 
219 PIXMAN_API
220 pixman_bool_t pixman_transform_rotate           (struct pixman_transform       *forward,
221 						 struct pixman_transform       *reverse,
222 						 pixman_fixed_t                 c,
223 						 pixman_fixed_t                 s);
224 
225 PIXMAN_API
226 void          pixman_transform_init_translate   (struct pixman_transform       *t,
227 						 pixman_fixed_t                 tx,
228 						 pixman_fixed_t                 ty);
229 
230 PIXMAN_API
231 pixman_bool_t pixman_transform_translate        (struct pixman_transform       *forward,
232 						 struct pixman_transform       *reverse,
233 						 pixman_fixed_t                 tx,
234 						 pixman_fixed_t                 ty);
235 
236 PIXMAN_API
237 pixman_bool_t pixman_transform_bounds           (const struct pixman_transform *matrix,
238 						 struct pixman_box16           *b);
239 
240 PIXMAN_API
241 pixman_bool_t pixman_transform_invert           (struct pixman_transform       *dst,
242 						 const struct pixman_transform *src);
243 
244 PIXMAN_API
245 pixman_bool_t pixman_transform_is_identity      (const struct pixman_transform *t);
246 
247 PIXMAN_API
248 pixman_bool_t pixman_transform_is_scale         (const struct pixman_transform *t);
249 
250 PIXMAN_API
251 pixman_bool_t pixman_transform_is_int_translate (const struct pixman_transform *t);
252 
253 PIXMAN_API
254 pixman_bool_t pixman_transform_is_inverse       (const struct pixman_transform *a,
255 						 const struct pixman_transform *b);
256 
257 /*
258  * Floating point matrices
259  */
260 typedef struct pixman_f_transform pixman_f_transform_t;
261 typedef struct pixman_f_vector pixman_f_vector_t;
262 
263 struct pixman_f_vector
264 {
265     double  v[3];
266 };
267 
268 struct pixman_f_transform
269 {
270     double  m[3][3];
271 };
272 
273 
274 PIXMAN_API
275 pixman_bool_t pixman_transform_from_pixman_f_transform (struct pixman_transform         *t,
276 							const struct pixman_f_transform *ft);
277 
278 PIXMAN_API
279 void          pixman_f_transform_from_pixman_transform (struct pixman_f_transform       *ft,
280 							const struct pixman_transform   *t);
281 
282 PIXMAN_API
283 pixman_bool_t pixman_f_transform_invert                (struct pixman_f_transform       *dst,
284 							const struct pixman_f_transform *src);
285 
286 PIXMAN_API
287 pixman_bool_t pixman_f_transform_point                 (const struct pixman_f_transform *t,
288 							struct pixman_f_vector          *v);
289 
290 PIXMAN_API
291 void          pixman_f_transform_point_3d              (const struct pixman_f_transform *t,
292 							struct pixman_f_vector          *v);
293 
294 PIXMAN_API
295 void          pixman_f_transform_multiply              (struct pixman_f_transform       *dst,
296 							const struct pixman_f_transform *l,
297 							const struct pixman_f_transform *r);
298 
299 PIXMAN_API
300 void          pixman_f_transform_init_scale            (struct pixman_f_transform       *t,
301 							double                           sx,
302 							double                           sy);
303 
304 PIXMAN_API
305 pixman_bool_t pixman_f_transform_scale                 (struct pixman_f_transform       *forward,
306 							struct pixman_f_transform       *reverse,
307 							double                           sx,
308 							double                           sy);
309 
310 PIXMAN_API
311 void          pixman_f_transform_init_rotate           (struct pixman_f_transform       *t,
312 							double                           cos,
313 							double                           sin);
314 
315 PIXMAN_API
316 pixman_bool_t pixman_f_transform_rotate                (struct pixman_f_transform       *forward,
317 							struct pixman_f_transform       *reverse,
318 							double                           c,
319 							double                           s);
320 
321 PIXMAN_API
322 void          pixman_f_transform_init_translate        (struct pixman_f_transform       *t,
323 							double                           tx,
324 							double                           ty);
325 
326 PIXMAN_API
327 pixman_bool_t pixman_f_transform_translate             (struct pixman_f_transform       *forward,
328 							struct pixman_f_transform       *reverse,
329 							double                           tx,
330 							double                           ty);
331 
332 PIXMAN_API
333 pixman_bool_t pixman_f_transform_bounds                (const struct pixman_f_transform *t,
334 							struct pixman_box16             *b);
335 
336 PIXMAN_API
337 void          pixman_f_transform_init_identity         (struct pixman_f_transform       *t);
338 
339 typedef enum
340 {
341     PIXMAN_REPEAT_NONE,
342     PIXMAN_REPEAT_NORMAL,
343     PIXMAN_REPEAT_PAD,
344     PIXMAN_REPEAT_REFLECT
345 } pixman_repeat_t;
346 
347 typedef enum
348 {
349     PIXMAN_DITHER_NONE,
350     PIXMAN_DITHER_FAST,
351     PIXMAN_DITHER_GOOD,
352     PIXMAN_DITHER_BEST,
353     PIXMAN_DITHER_ORDERED_BAYER_8,
354     PIXMAN_DITHER_ORDERED_BLUE_NOISE_64,
355 } pixman_dither_t;
356 
357 typedef enum
358 {
359     PIXMAN_FILTER_FAST,
360     PIXMAN_FILTER_GOOD,
361     PIXMAN_FILTER_BEST,
362     PIXMAN_FILTER_NEAREST,
363     PIXMAN_FILTER_BILINEAR,
364     PIXMAN_FILTER_CONVOLUTION,
365 
366     /* The SEPARABLE_CONVOLUTION filter takes the following parameters:
367      *
368      *         width:           integer given as 16.16 fixpoint number
369      *         height:          integer given as 16.16 fixpoint number
370      *         x_phase_bits:	integer given as 16.16 fixpoint
371      *         y_phase_bits:	integer given as 16.16 fixpoint
372      *         xtables:         (1 << x_phase_bits) tables of size width
373      *         ytables:         (1 << y_phase_bits) tables of size height
374      *
375      * When sampling at (x, y), the location is first rounded to one of
376      * n_x_phases * n_y_phases subpixel positions. These subpixel positions
377      * determine an xtable and a ytable to use.
378      *
379      * Conceptually a width x height matrix is then formed in which each entry
380      * is the product of the corresponding entries in the x and y tables.
381      * This matrix is then aligned with the image pixels such that its center
382      * is as close as possible to the subpixel location chosen earlier. Then
383      * the image is convolved with the matrix and the resulting pixel returned.
384      */
385     PIXMAN_FILTER_SEPARABLE_CONVOLUTION
386 } pixman_filter_t;
387 
388 typedef enum
389 {
390     PIXMAN_OP_CLEAR			= 0x00,
391     PIXMAN_OP_SRC			= 0x01,
392     PIXMAN_OP_DST			= 0x02,
393     PIXMAN_OP_OVER			= 0x03,
394     PIXMAN_OP_OVER_REVERSE		= 0x04,
395     PIXMAN_OP_IN			= 0x05,
396     PIXMAN_OP_IN_REVERSE		= 0x06,
397     PIXMAN_OP_OUT			= 0x07,
398     PIXMAN_OP_OUT_REVERSE		= 0x08,
399     PIXMAN_OP_ATOP			= 0x09,
400     PIXMAN_OP_ATOP_REVERSE		= 0x0a,
401     PIXMAN_OP_XOR			= 0x0b,
402     PIXMAN_OP_ADD			= 0x0c,
403     PIXMAN_OP_SATURATE			= 0x0d,
404 
405     PIXMAN_OP_DISJOINT_CLEAR		= 0x10,
406     PIXMAN_OP_DISJOINT_SRC		= 0x11,
407     PIXMAN_OP_DISJOINT_DST		= 0x12,
408     PIXMAN_OP_DISJOINT_OVER		= 0x13,
409     PIXMAN_OP_DISJOINT_OVER_REVERSE	= 0x14,
410     PIXMAN_OP_DISJOINT_IN		= 0x15,
411     PIXMAN_OP_DISJOINT_IN_REVERSE	= 0x16,
412     PIXMAN_OP_DISJOINT_OUT		= 0x17,
413     PIXMAN_OP_DISJOINT_OUT_REVERSE	= 0x18,
414     PIXMAN_OP_DISJOINT_ATOP		= 0x19,
415     PIXMAN_OP_DISJOINT_ATOP_REVERSE	= 0x1a,
416     PIXMAN_OP_DISJOINT_XOR		= 0x1b,
417 
418     PIXMAN_OP_CONJOINT_CLEAR		= 0x20,
419     PIXMAN_OP_CONJOINT_SRC		= 0x21,
420     PIXMAN_OP_CONJOINT_DST		= 0x22,
421     PIXMAN_OP_CONJOINT_OVER		= 0x23,
422     PIXMAN_OP_CONJOINT_OVER_REVERSE	= 0x24,
423     PIXMAN_OP_CONJOINT_IN		= 0x25,
424     PIXMAN_OP_CONJOINT_IN_REVERSE	= 0x26,
425     PIXMAN_OP_CONJOINT_OUT		= 0x27,
426     PIXMAN_OP_CONJOINT_OUT_REVERSE	= 0x28,
427     PIXMAN_OP_CONJOINT_ATOP		= 0x29,
428     PIXMAN_OP_CONJOINT_ATOP_REVERSE	= 0x2a,
429     PIXMAN_OP_CONJOINT_XOR		= 0x2b,
430 
431     PIXMAN_OP_MULTIPLY                  = 0x30,
432     PIXMAN_OP_SCREEN                    = 0x31,
433     PIXMAN_OP_OVERLAY                   = 0x32,
434     PIXMAN_OP_DARKEN                    = 0x33,
435     PIXMAN_OP_LIGHTEN                   = 0x34,
436     PIXMAN_OP_COLOR_DODGE               = 0x35,
437     PIXMAN_OP_COLOR_BURN                = 0x36,
438     PIXMAN_OP_HARD_LIGHT                = 0x37,
439     PIXMAN_OP_SOFT_LIGHT                = 0x38,
440     PIXMAN_OP_DIFFERENCE                = 0x39,
441     PIXMAN_OP_EXCLUSION                 = 0x3a,
442     PIXMAN_OP_HSL_HUE			= 0x3b,
443     PIXMAN_OP_HSL_SATURATION		= 0x3c,
444     PIXMAN_OP_HSL_COLOR			= 0x3d,
445     PIXMAN_OP_HSL_LUMINOSITY		= 0x3e
446 
447 #ifdef PIXMAN_USE_INTERNAL_API
448     ,
449     PIXMAN_N_OPERATORS,
450     PIXMAN_OP_NONE = PIXMAN_N_OPERATORS
451 #endif
452 } pixman_op_t;
453 
454 /*
455  * Regions
456  */
457 typedef struct pixman_region16_data	pixman_region16_data_t;
458 typedef struct pixman_box16		pixman_box16_t;
459 typedef struct pixman_rectangle16	pixman_rectangle16_t;
460 typedef struct pixman_region16		pixman_region16_t;
461 
462 struct pixman_region16_data {
463     long		size;
464     long		numRects;
465 /*  pixman_box16_t	rects[size];   in memory but not explicitly declared */
466 };
467 
468 struct pixman_rectangle16
469 {
470     int16_t	x, y;
471     uint16_t	width, height;
472 };
473 
474 struct pixman_box16
475 {
476     int16_t x1, y1, x2, y2;
477 };
478 
479 struct pixman_region16
480 {
481     pixman_box16_t          extents;
482     pixman_region16_data_t *data;
483 };
484 
485 typedef enum
486 {
487     PIXMAN_REGION_OUT,
488     PIXMAN_REGION_IN,
489     PIXMAN_REGION_PART
490 } pixman_region_overlap_t;
491 
492 /* This function exists only to make it possible to preserve
493  * the X ABI - it should go away at first opportunity.
494  */
495 PIXMAN_API
496 void pixman_region_set_static_pointers (pixman_box16_t         *empty_box,
497 					pixman_region16_data_t *empty_data,
498 					pixman_region16_data_t *broken_data);
499 
500 /* creation/destruction */
501 PIXMAN_API
502 void                    pixman_region_init               (pixman_region16_t *region);
503 
504 PIXMAN_API
505 void                    pixman_region_init_rect          (pixman_region16_t *region,
506 							  int                x,
507 							  int                y,
508 							  unsigned int       width,
509 							  unsigned int       height);
510 
511 PIXMAN_API
512 pixman_bool_t           pixman_region_init_rects         (pixman_region16_t *region,
513 							  const pixman_box16_t *boxes,
514 							  int                count);
515 
516 PIXMAN_API
517 void                    pixman_region_init_with_extents  (pixman_region16_t *region,
518 							  pixman_box16_t    *extents);
519 
520 PIXMAN_API
521 void                    pixman_region_init_from_image    (pixman_region16_t *region,
522 							  pixman_image_t    *image);
523 
524 PIXMAN_API
525 void                    pixman_region_fini               (pixman_region16_t *region);
526 
527 
528 /* manipulation */
529 PIXMAN_API
530 void                    pixman_region_translate          (pixman_region16_t *region,
531 							  int                x,
532 							  int                y);
533 
534 PIXMAN_API
535 pixman_bool_t           pixman_region_copy               (pixman_region16_t *dest,
536 							  pixman_region16_t *source);
537 
538 PIXMAN_API
539 pixman_bool_t           pixman_region_intersect          (pixman_region16_t *new_reg,
540 							  pixman_region16_t *reg1,
541 							  pixman_region16_t *reg2);
542 
543 PIXMAN_API
544 pixman_bool_t           pixman_region_union              (pixman_region16_t *new_reg,
545 							  pixman_region16_t *reg1,
546 							  pixman_region16_t *reg2);
547 
548 PIXMAN_API
549 pixman_bool_t           pixman_region_union_rect         (pixman_region16_t *dest,
550 							  pixman_region16_t *source,
551 							  int                x,
552 							  int                y,
553 							  unsigned int       width,
554 							  unsigned int       height);
555 
556 PIXMAN_API
557 pixman_bool_t		pixman_region_intersect_rect     (pixman_region16_t *dest,
558 							  pixman_region16_t *source,
559 							  int                x,
560 							  int                y,
561 							  unsigned int       width,
562 							  unsigned int       height);
563 
564 PIXMAN_API
565 pixman_bool_t           pixman_region_subtract           (pixman_region16_t *reg_d,
566 							  pixman_region16_t *reg_m,
567 							  pixman_region16_t *reg_s);
568 
569 PIXMAN_API
570 pixman_bool_t           pixman_region_inverse            (pixman_region16_t *new_reg,
571 							  pixman_region16_t *reg1,
572 							  pixman_box16_t    *inv_rect);
573 
574 PIXMAN_API
575 pixman_bool_t           pixman_region_contains_point     (pixman_region16_t *region,
576 							  int                x,
577 							  int                y,
578 							  pixman_box16_t    *box);
579 
580 PIXMAN_API
581 pixman_region_overlap_t pixman_region_contains_rectangle (pixman_region16_t *region,
582 							  pixman_box16_t    *prect);
583 
584 PIXMAN_API
585 pixman_bool_t           pixman_region_not_empty          (pixman_region16_t *region);
586 
587 PIXMAN_API
588 pixman_box16_t *        pixman_region_extents            (pixman_region16_t *region);
589 
590 PIXMAN_API
591 int                     pixman_region_n_rects            (pixman_region16_t *region);
592 
593 PIXMAN_API
594 pixman_box16_t *        pixman_region_rectangles         (pixman_region16_t *region,
595 							  int               *n_rects);
596 
597 PIXMAN_API
598 pixman_bool_t           pixman_region_equal              (pixman_region16_t *region1,
599 							  pixman_region16_t *region2);
600 
601 PIXMAN_API
602 pixman_bool_t           pixman_region_selfcheck          (pixman_region16_t *region);
603 
604 PIXMAN_API
605 void                    pixman_region_reset              (pixman_region16_t *region,
606 							  pixman_box16_t    *box);
607 
608 PIXMAN_API
609 void			pixman_region_clear		 (pixman_region16_t *region);
610 /*
611  * 32 bit regions
612  */
613 typedef struct pixman_region32_data	pixman_region32_data_t;
614 typedef struct pixman_box32		pixman_box32_t;
615 typedef struct pixman_rectangle32	pixman_rectangle32_t;
616 typedef struct pixman_region32		pixman_region32_t;
617 
618 struct pixman_region32_data {
619     long		size;
620     long		numRects;
621 /*  pixman_box32_t	rects[size];   in memory but not explicitly declared */
622 };
623 
624 struct pixman_rectangle32
625 {
626     int32_t x, y;
627     uint32_t width, height;
628 };
629 
630 struct pixman_box32
631 {
632     int32_t x1, y1, x2, y2;
633 };
634 
635 struct pixman_region32
636 {
637     pixman_box32_t          extents;
638     pixman_region32_data_t  *data;
639 };
640 
641 /* creation/destruction */
642 PIXMAN_API
643 void                    pixman_region32_init               (pixman_region32_t *region);
644 
645 PIXMAN_API
646 void                    pixman_region32_init_rect          (pixman_region32_t *region,
647 							    int                x,
648 							    int                y,
649 							    unsigned int       width,
650 							    unsigned int       height);
651 
652 PIXMAN_API
653 pixman_bool_t           pixman_region32_init_rects         (pixman_region32_t *region,
654 							    const pixman_box32_t *boxes,
655 							    int                count);
656 
657 PIXMAN_API
658 void                    pixman_region32_init_with_extents  (pixman_region32_t *region,
659 							    pixman_box32_t    *extents);
660 
661 PIXMAN_API
662 void                    pixman_region32_init_from_image    (pixman_region32_t *region,
663 							    pixman_image_t    *image);
664 
665 PIXMAN_API
666 void                    pixman_region32_fini               (pixman_region32_t *region);
667 
668 
669 /* manipulation */
670 PIXMAN_API
671 void                    pixman_region32_translate          (pixman_region32_t *region,
672 							    int                x,
673 							    int                y);
674 
675 PIXMAN_API
676 pixman_bool_t           pixman_region32_copy               (pixman_region32_t *dest,
677 							    pixman_region32_t *source);
678 
679 PIXMAN_API
680 pixman_bool_t           pixman_region32_intersect          (pixman_region32_t *new_reg,
681 							    pixman_region32_t *reg1,
682 							    pixman_region32_t *reg2);
683 
684 PIXMAN_API
685 pixman_bool_t           pixman_region32_union              (pixman_region32_t *new_reg,
686 							    pixman_region32_t *reg1,
687 							    pixman_region32_t *reg2);
688 
689 PIXMAN_API
690 pixman_bool_t		pixman_region32_intersect_rect     (pixman_region32_t *dest,
691 							    pixman_region32_t *source,
692 							    int                x,
693 							    int                y,
694 							    unsigned int       width,
695 							    unsigned int       height);
696 
697 PIXMAN_API
698 pixman_bool_t           pixman_region32_union_rect         (pixman_region32_t *dest,
699 							    pixman_region32_t *source,
700 							    int                x,
701 							    int                y,
702 							    unsigned int       width,
703 							    unsigned int       height);
704 
705 PIXMAN_API
706 pixman_bool_t           pixman_region32_subtract           (pixman_region32_t *reg_d,
707 							    pixman_region32_t *reg_m,
708 							    pixman_region32_t *reg_s);
709 
710 PIXMAN_API
711 pixman_bool_t           pixman_region32_inverse            (pixman_region32_t *new_reg,
712 							    pixman_region32_t *reg1,
713 							    pixman_box32_t    *inv_rect);
714 
715 PIXMAN_API
716 pixman_bool_t           pixman_region32_contains_point     (pixman_region32_t *region,
717 							    int                x,
718 							    int                y,
719 							    pixman_box32_t    *box);
720 
721 PIXMAN_API
722 pixman_region_overlap_t pixman_region32_contains_rectangle (pixman_region32_t *region,
723 							    pixman_box32_t    *prect);
724 
725 PIXMAN_API
726 pixman_bool_t           pixman_region32_not_empty          (pixman_region32_t *region);
727 
728 PIXMAN_API
729 pixman_box32_t *        pixman_region32_extents            (pixman_region32_t *region);
730 
731 PIXMAN_API
732 int                     pixman_region32_n_rects            (pixman_region32_t *region);
733 
734 PIXMAN_API
735 pixman_box32_t *        pixman_region32_rectangles         (pixman_region32_t *region,
736 							    int               *n_rects);
737 
738 PIXMAN_API
739 pixman_bool_t           pixman_region32_equal              (pixman_region32_t *region1,
740 							    pixman_region32_t *region2);
741 
742 PIXMAN_API
743 pixman_bool_t           pixman_region32_selfcheck          (pixman_region32_t *region);
744 
745 PIXMAN_API
746 void                    pixman_region32_reset              (pixman_region32_t *region,
747 							    pixman_box32_t    *box);
748 
749 PIXMAN_API
750 void			pixman_region32_clear		   (pixman_region32_t *region);
751 
752 
753 /* Copy / Fill / Misc */
754 PIXMAN_API
755 pixman_bool_t pixman_blt                (uint32_t           *src_bits,
756 					 uint32_t           *dst_bits,
757 					 int                 src_stride,
758 					 int                 dst_stride,
759 					 int                 src_bpp,
760 					 int                 dst_bpp,
761 					 int                 src_x,
762 					 int                 src_y,
763 					 int                 dest_x,
764 					 int                 dest_y,
765 					 int                 width,
766 					 int                 height);
767 
768 PIXMAN_API
769 pixman_bool_t pixman_fill               (uint32_t           *bits,
770 					 int                 stride,
771 					 int                 bpp,
772 					 int                 x,
773 					 int                 y,
774 					 int                 width,
775 					 int                 height,
776 					 uint32_t            _xor);
777 
778 
779 PIXMAN_API
780 int           pixman_version            (void);
781 
782 PIXMAN_API
783 const char*   pixman_version_string     (void);
784 
785 /*
786  * Images
787  */
788 typedef struct pixman_indexed		pixman_indexed_t;
789 typedef struct pixman_gradient_stop	pixman_gradient_stop_t;
790 
791 typedef uint32_t (* pixman_read_memory_func_t) (const void *src, int size);
792 typedef void     (* pixman_write_memory_func_t) (void *dst, uint32_t value, int size);
793 
794 typedef void     (* pixman_image_destroy_func_t) (pixman_image_t *image, void *data);
795 
796 struct pixman_gradient_stop {
797     pixman_fixed_t x;
798     pixman_color_t color;
799 };
800 
801 #define PIXMAN_MAX_INDEXED  256 /* XXX depth must be <= 8 */
802 
803 #if PIXMAN_MAX_INDEXED <= 256
804 typedef uint8_t pixman_index_type;
805 #endif
806 
807 struct pixman_indexed
808 {
809     pixman_bool_t       color;
810     uint32_t		rgba[PIXMAN_MAX_INDEXED];
811     pixman_index_type	ent[32768];
812 };
813 
814 /*
815  * While the protocol is generous in format support, the
816  * sample implementation allows only packed RGB and GBR
817  * representations for data to simplify software rendering,
818  */
819 #define PIXMAN_FORMAT(bpp,type,a,r,g,b)	(((bpp) << 24) |  \
820 					 ((type) << 16) | \
821 					 ((a) << 12) |	  \
822 					 ((r) << 8) |	  \
823 					 ((g) << 4) |	  \
824 					 ((b)))
825 
826 #define PIXMAN_FORMAT_BYTE(bpp,type,a,r,g,b) \
827 	(((bpp >> 3) << 24) | \
828 	(3 << 22) | ((type) << 16) | \
829 	((a >> 3) << 12) | \
830 	((r >> 3) << 8) | \
831 	((g >> 3) << 4) | \
832 	((b >> 3)))
833 
834 #define PIXMAN_FORMAT_RESHIFT(val, ofs, num) \
835 	(((val >> (ofs)) & ((1 << (num)) - 1)) << ((val >> 22) & 3))
836 
837 #define PIXMAN_FORMAT_BPP(f)	PIXMAN_FORMAT_RESHIFT(f, 24, 8)
838 #define PIXMAN_FORMAT_SHIFT(f)	((uint32_t)((f >> 22) & 3))
839 #define PIXMAN_FORMAT_TYPE(f)	(((f) >> 16) & 0x3f)
840 #define PIXMAN_FORMAT_A(f)	PIXMAN_FORMAT_RESHIFT(f, 12, 4)
841 #define PIXMAN_FORMAT_R(f)	PIXMAN_FORMAT_RESHIFT(f, 8, 4)
842 #define PIXMAN_FORMAT_G(f)	PIXMAN_FORMAT_RESHIFT(f, 4, 4)
843 #define PIXMAN_FORMAT_B(f)	PIXMAN_FORMAT_RESHIFT(f, 0, 4)
844 #define PIXMAN_FORMAT_RGB(f)	(((f)      ) & 0xfff)
845 #define PIXMAN_FORMAT_VIS(f)	(((f)      ) & 0xffff)
846 #define PIXMAN_FORMAT_DEPTH(f)	(PIXMAN_FORMAT_A(f) +	\
847 				 PIXMAN_FORMAT_R(f) +	\
848 				 PIXMAN_FORMAT_G(f) +	\
849 				 PIXMAN_FORMAT_B(f))
850 
851 #define PIXMAN_TYPE_OTHER	0
852 #define PIXMAN_TYPE_A		1
853 #define PIXMAN_TYPE_ARGB	2
854 #define PIXMAN_TYPE_ABGR	3
855 #define PIXMAN_TYPE_COLOR	4
856 #define PIXMAN_TYPE_GRAY	5
857 #define PIXMAN_TYPE_YUY2	6
858 #define PIXMAN_TYPE_YV12	7
859 #define PIXMAN_TYPE_BGRA	8
860 #define PIXMAN_TYPE_RGBA	9
861 #define PIXMAN_TYPE_ARGB_SRGB	10
862 #define PIXMAN_TYPE_RGBA_FLOAT	11
863 
864 #define PIXMAN_FORMAT_COLOR(f)				\
865 	(PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_ARGB ||	\
866 	 PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_ABGR ||	\
867 	 PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_BGRA ||	\
868 	 PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_RGBA ||	\
869 	 PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_RGBA_FLOAT)
870 
871 typedef enum {
872 /* 128bpp formats */
873     PIXMAN_rgba_float =	PIXMAN_FORMAT_BYTE(128,PIXMAN_TYPE_RGBA_FLOAT,32,32,32,32),
874 /* 96bpp formats */
875     PIXMAN_rgb_float =	PIXMAN_FORMAT_BYTE(96,PIXMAN_TYPE_RGBA_FLOAT,0,32,32,32),
876 
877 /* 32bpp formats */
878     PIXMAN_a8r8g8b8 =	 PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,8,8,8,8),
879     PIXMAN_x8r8g8b8 =	 PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,0,8,8,8),
880     PIXMAN_a8b8g8r8 =	 PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,8,8,8,8),
881     PIXMAN_x8b8g8r8 =	 PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,0,8,8,8),
882     PIXMAN_b8g8r8a8 =	 PIXMAN_FORMAT(32,PIXMAN_TYPE_BGRA,8,8,8,8),
883     PIXMAN_b8g8r8x8 =	 PIXMAN_FORMAT(32,PIXMAN_TYPE_BGRA,0,8,8,8),
884     PIXMAN_r8g8b8a8 =	 PIXMAN_FORMAT(32,PIXMAN_TYPE_RGBA,8,8,8,8),
885     PIXMAN_r8g8b8x8 =	 PIXMAN_FORMAT(32,PIXMAN_TYPE_RGBA,0,8,8,8),
886     PIXMAN_x14r6g6b6 =	 PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,0,6,6,6),
887     PIXMAN_x2r10g10b10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,0,10,10,10),
888     PIXMAN_a2r10g10b10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,2,10,10,10),
889     PIXMAN_x2b10g10r10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,0,10,10,10),
890     PIXMAN_a2b10g10r10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,2,10,10,10),
891 
892 /* sRGB formats */
893     PIXMAN_a8r8g8b8_sRGB = PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB_SRGB,8,8,8,8),
894 
895 /* 24bpp formats */
896     PIXMAN_r8g8b8 =	 PIXMAN_FORMAT(24,PIXMAN_TYPE_ARGB,0,8,8,8),
897     PIXMAN_b8g8r8 =	 PIXMAN_FORMAT(24,PIXMAN_TYPE_ABGR,0,8,8,8),
898 
899 /* 16bpp formats */
900     PIXMAN_r5g6b5 =	 PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,0,5,6,5),
901     PIXMAN_b5g6r5 =	 PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,0,5,6,5),
902 
903     PIXMAN_a1r5g5b5 =	 PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,1,5,5,5),
904     PIXMAN_x1r5g5b5 =	 PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,0,5,5,5),
905     PIXMAN_a1b5g5r5 =	 PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,1,5,5,5),
906     PIXMAN_x1b5g5r5 =	 PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,0,5,5,5),
907     PIXMAN_a4r4g4b4 =	 PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,4,4,4,4),
908     PIXMAN_x4r4g4b4 =	 PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,0,4,4,4),
909     PIXMAN_a4b4g4r4 =	 PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,4,4,4,4),
910     PIXMAN_x4b4g4r4 =	 PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,0,4,4,4),
911 
912 /* 8bpp formats */
913     PIXMAN_a8 =		 PIXMAN_FORMAT(8,PIXMAN_TYPE_A,8,0,0,0),
914     PIXMAN_r3g3b2 =	 PIXMAN_FORMAT(8,PIXMAN_TYPE_ARGB,0,3,3,2),
915     PIXMAN_b2g3r3 =	 PIXMAN_FORMAT(8,PIXMAN_TYPE_ABGR,0,3,3,2),
916     PIXMAN_a2r2g2b2 =	 PIXMAN_FORMAT(8,PIXMAN_TYPE_ARGB,2,2,2,2),
917     PIXMAN_a2b2g2r2 =	 PIXMAN_FORMAT(8,PIXMAN_TYPE_ABGR,2,2,2,2),
918 
919     PIXMAN_c8 =		 PIXMAN_FORMAT(8,PIXMAN_TYPE_COLOR,0,0,0,0),
920     PIXMAN_g8 =		 PIXMAN_FORMAT(8,PIXMAN_TYPE_GRAY,0,0,0,0),
921 
922     PIXMAN_x4a4 =	 PIXMAN_FORMAT(8,PIXMAN_TYPE_A,4,0,0,0),
923 
924     PIXMAN_x4c4 =	 PIXMAN_FORMAT(8,PIXMAN_TYPE_COLOR,0,0,0,0),
925     PIXMAN_x4g4 =	 PIXMAN_FORMAT(8,PIXMAN_TYPE_GRAY,0,0,0,0),
926 
927 /* 4bpp formats */
928     PIXMAN_a4 =		 PIXMAN_FORMAT(4,PIXMAN_TYPE_A,4,0,0,0),
929     PIXMAN_r1g2b1 =	 PIXMAN_FORMAT(4,PIXMAN_TYPE_ARGB,0,1,2,1),
930     PIXMAN_b1g2r1 =	 PIXMAN_FORMAT(4,PIXMAN_TYPE_ABGR,0,1,2,1),
931     PIXMAN_a1r1g1b1 =	 PIXMAN_FORMAT(4,PIXMAN_TYPE_ARGB,1,1,1,1),
932     PIXMAN_a1b1g1r1 =	 PIXMAN_FORMAT(4,PIXMAN_TYPE_ABGR,1,1,1,1),
933 
934     PIXMAN_c4 =		 PIXMAN_FORMAT(4,PIXMAN_TYPE_COLOR,0,0,0,0),
935     PIXMAN_g4 =		 PIXMAN_FORMAT(4,PIXMAN_TYPE_GRAY,0,0,0,0),
936 
937 /* 1bpp formats */
938     PIXMAN_a1 =		 PIXMAN_FORMAT(1,PIXMAN_TYPE_A,1,0,0,0),
939 
940     PIXMAN_g1 =		 PIXMAN_FORMAT(1,PIXMAN_TYPE_GRAY,0,0,0,0),
941 
942 /* YUV formats */
943     PIXMAN_yuy2 =	 PIXMAN_FORMAT(16,PIXMAN_TYPE_YUY2,0,0,0,0),
944     PIXMAN_yv12 =	 PIXMAN_FORMAT(12,PIXMAN_TYPE_YV12,0,0,0,0)
945 } pixman_format_code_t;
946 
947 /* Querying supported format values. */
948 PIXMAN_API
949 pixman_bool_t pixman_format_supported_destination (pixman_format_code_t format);
950 
951 PIXMAN_API
952 pixman_bool_t pixman_format_supported_source      (pixman_format_code_t format);
953 
954 /* Constructors */
955 PIXMAN_API
956 pixman_image_t *pixman_image_create_solid_fill       (const pixman_color_t         *color);
957 
958 PIXMAN_API
959 pixman_image_t *pixman_image_create_linear_gradient  (const pixman_point_fixed_t   *p1,
960 						      const pixman_point_fixed_t   *p2,
961 						      const pixman_gradient_stop_t *stops,
962 						      int                           n_stops);
963 
964 PIXMAN_API
965 pixman_image_t *pixman_image_create_radial_gradient  (const pixman_point_fixed_t   *inner,
966 						      const pixman_point_fixed_t   *outer,
967 						      pixman_fixed_t                inner_radius,
968 						      pixman_fixed_t                outer_radius,
969 						      const pixman_gradient_stop_t *stops,
970 						      int                           n_stops);
971 
972 PIXMAN_API
973 pixman_image_t *pixman_image_create_conical_gradient (const pixman_point_fixed_t   *center,
974 						      pixman_fixed_t                angle,
975 						      const pixman_gradient_stop_t *stops,
976 						      int                           n_stops);
977 
978 PIXMAN_API
979 pixman_image_t *pixman_image_create_bits             (pixman_format_code_t          format,
980 						      int                           width,
981 						      int                           height,
982 						      uint32_t                     *bits,
983 						      int                           rowstride_bytes);
984 
985 PIXMAN_API
986 pixman_image_t *pixman_image_create_bits_no_clear    (pixman_format_code_t format,
987 						      int                  width,
988 						      int                  height,
989 						      uint32_t *           bits,
990 						      int                  rowstride_bytes);
991 
992 /* Destructor */
993 PIXMAN_API
994 pixman_image_t *pixman_image_ref                     (pixman_image_t               *image);
995 
996 PIXMAN_API
997 pixman_bool_t   pixman_image_unref                   (pixman_image_t               *image);
998 
999 
1000 PIXMAN_API
1001 void		pixman_image_set_destroy_function    (pixman_image_t		   *image,
1002 						      pixman_image_destroy_func_t   function,
1003 						      void			   *data);
1004 
1005 PIXMAN_API
1006 void *		pixman_image_get_destroy_data        (pixman_image_t		   *image);
1007 
1008 /* Set properties */
1009 PIXMAN_API
1010 pixman_bool_t   pixman_image_set_clip_region         (pixman_image_t               *image,
1011 						      pixman_region16_t            *region);
1012 
1013 PIXMAN_API
1014 pixman_bool_t   pixman_image_set_clip_region32       (pixman_image_t               *image,
1015 						      pixman_region32_t            *region);
1016 
1017 PIXMAN_API
1018 void		pixman_image_set_has_client_clip     (pixman_image_t               *image,
1019 						      pixman_bool_t		    clien_clip);
1020 
1021 PIXMAN_API
1022 pixman_bool_t   pixman_image_set_transform           (pixman_image_t               *image,
1023 						      const pixman_transform_t     *transform);
1024 
1025 PIXMAN_API
1026 void            pixman_image_set_repeat              (pixman_image_t               *image,
1027 						      pixman_repeat_t               repeat);
1028 
1029 PIXMAN_API
1030 void            pixman_image_set_dither              (pixman_image_t               *image,
1031 						      pixman_dither_t               dither);
1032 
1033 PIXMAN_API
1034 void            pixman_image_set_dither_offset       (pixman_image_t               *image,
1035 						      int                           offset_x,
1036 						      int                           offset_y);
1037 
1038 PIXMAN_API
1039 pixman_bool_t   pixman_image_set_filter              (pixman_image_t               *image,
1040 						      pixman_filter_t               filter,
1041 						      const pixman_fixed_t         *filter_params,
1042 						      int                           n_filter_params);
1043 
1044 PIXMAN_API
1045 void		pixman_image_set_source_clipping     (pixman_image_t		   *image,
1046 						      pixman_bool_t                 source_clipping);
1047 
1048 PIXMAN_API
1049 void            pixman_image_set_alpha_map           (pixman_image_t               *image,
1050 						      pixman_image_t               *alpha_map,
1051 						      int16_t                       x,
1052 						      int16_t                       y);
1053 
1054 PIXMAN_API
1055 void            pixman_image_set_component_alpha     (pixman_image_t               *image,
1056 						      pixman_bool_t                 component_alpha);
1057 
1058 PIXMAN_API
1059 pixman_bool_t   pixman_image_get_component_alpha     (pixman_image_t               *image);
1060 
1061 PIXMAN_API
1062 void		pixman_image_set_accessors	     (pixman_image_t		   *image,
1063 						      pixman_read_memory_func_t	    read_func,
1064 						      pixman_write_memory_func_t    write_func);
1065 
1066 PIXMAN_API
1067 void		pixman_image_set_indexed	     (pixman_image_t		   *image,
1068 						      const pixman_indexed_t	   *indexed);
1069 
1070 PIXMAN_API
1071 uint32_t       *pixman_image_get_data                (pixman_image_t               *image);
1072 
1073 PIXMAN_API
1074 int		pixman_image_get_width               (pixman_image_t               *image);
1075 
1076 PIXMAN_API
1077 int             pixman_image_get_height              (pixman_image_t               *image);
1078 
1079 PIXMAN_API
1080 int		pixman_image_get_stride              (pixman_image_t               *image); /* in bytes */
1081 
1082 PIXMAN_API
1083 int		pixman_image_get_depth               (pixman_image_t		   *image);
1084 
1085 PIXMAN_API
1086 pixman_format_code_t pixman_image_get_format	     (pixman_image_t		   *image);
1087 
1088 typedef enum
1089 {
1090     PIXMAN_KERNEL_IMPULSE,
1091     PIXMAN_KERNEL_BOX,
1092     PIXMAN_KERNEL_LINEAR,
1093     PIXMAN_KERNEL_CUBIC,
1094     PIXMAN_KERNEL_GAUSSIAN,
1095     PIXMAN_KERNEL_LANCZOS2,
1096     PIXMAN_KERNEL_LANCZOS3,
1097     PIXMAN_KERNEL_LANCZOS3_STRETCHED       /* Jim Blinn's 'nice' filter */
1098 } pixman_kernel_t;
1099 
1100 /* Create the parameter list for a SEPARABLE_CONVOLUTION filter
1101  * with the given kernels and scale parameters.
1102  */
1103 PIXMAN_API
1104 pixman_fixed_t *
1105 pixman_filter_create_separable_convolution (int             *n_values,
1106 					    pixman_fixed_t   scale_x,
1107 					    pixman_fixed_t   scale_y,
1108 					    pixman_kernel_t  reconstruct_x,
1109 					    pixman_kernel_t  reconstruct_y,
1110 					    pixman_kernel_t  sample_x,
1111 					    pixman_kernel_t  sample_y,
1112 					    int              subsample_bits_x,
1113 					    int              subsample_bits_y);
1114 
1115 
1116 PIXMAN_API
1117 pixman_bool_t	pixman_image_fill_rectangles	     (pixman_op_t		    op,
1118 						      pixman_image_t		   *image,
1119 						      const pixman_color_t	   *color,
1120 						      int			    n_rects,
1121 						      const pixman_rectangle16_t   *rects);
1122 
1123 PIXMAN_API
1124 pixman_bool_t   pixman_image_fill_boxes              (pixman_op_t                   op,
1125                                                       pixman_image_t               *dest,
1126                                                       const pixman_color_t         *color,
1127                                                       int                           n_boxes,
1128                                                       const pixman_box32_t         *boxes);
1129 
1130 /* Composite */
1131 PIXMAN_API
1132 pixman_bool_t pixman_compute_composite_region (pixman_region16_t *region,
1133 					       pixman_image_t    *src_image,
1134 					       pixman_image_t    *mask_image,
1135 					       pixman_image_t    *dest_image,
1136 					       int16_t            src_x,
1137 					       int16_t            src_y,
1138 					       int16_t            mask_x,
1139 					       int16_t            mask_y,
1140 					       int16_t            dest_x,
1141 					       int16_t            dest_y,
1142 					       uint16_t           width,
1143 					       uint16_t           height);
1144 
1145 PIXMAN_API
1146 void          pixman_image_composite          (pixman_op_t        op,
1147 					       pixman_image_t    *src,
1148 					       pixman_image_t    *mask,
1149 					       pixman_image_t    *dest,
1150 					       int16_t            src_x,
1151 					       int16_t            src_y,
1152 					       int16_t            mask_x,
1153 					       int16_t            mask_y,
1154 					       int16_t            dest_x,
1155 					       int16_t            dest_y,
1156 					       uint16_t           width,
1157 					       uint16_t           height);
1158 
1159 PIXMAN_API
1160 void          pixman_image_composite32        (pixman_op_t        op,
1161 					       pixman_image_t    *src,
1162 					       pixman_image_t    *mask,
1163 					       pixman_image_t    *dest,
1164 					       int32_t            src_x,
1165 					       int32_t            src_y,
1166 					       int32_t            mask_x,
1167 					       int32_t            mask_y,
1168 					       int32_t            dest_x,
1169 					       int32_t            dest_y,
1170 					       int32_t            width,
1171 					       int32_t            height);
1172 
1173 /* Executive Summary: This function is a no-op that only exists
1174  * for historical reasons.
1175  *
1176  * There used to be a bug in the X server where it would rely on
1177  * out-of-bounds accesses when it was asked to composite with a
1178  * window as the source. It would create a pixman image pointing
1179  * to some bogus position in memory, but then set a clip region
1180  * to the position where the actual bits were.
1181  *
1182  * Due to a bug in old versions of pixman, where it would not clip
1183  * against the image bounds when a clip region was set, this would
1184  * actually work. So when the pixman bug was fixed, a workaround was
1185  * added to allow certain out-of-bound accesses. This function disabled
1186  * those workarounds.
1187  *
1188  * Since 0.21.2, pixman doesn't do these workarounds anymore, so now this
1189  * function is a no-op.
1190  */
1191 PIXMAN_API
1192 void pixman_disable_out_of_bounds_workaround (void);
1193 
1194 /*
1195  * Glyphs
1196  */
1197 typedef struct pixman_glyph_cache_t pixman_glyph_cache_t;
1198 typedef struct
1199 {
1200     int		x, y;
1201     const void *glyph;
1202 } pixman_glyph_t;
1203 
1204 PIXMAN_API
1205 pixman_glyph_cache_t *pixman_glyph_cache_create       (void);
1206 
1207 PIXMAN_API
1208 void                  pixman_glyph_cache_destroy      (pixman_glyph_cache_t *cache);
1209 
1210 PIXMAN_API
1211 void                  pixman_glyph_cache_freeze       (pixman_glyph_cache_t *cache);
1212 
1213 PIXMAN_API
1214 void                  pixman_glyph_cache_thaw         (pixman_glyph_cache_t *cache);
1215 
1216 PIXMAN_API
1217 const void *          pixman_glyph_cache_lookup       (pixman_glyph_cache_t *cache,
1218 						       void                 *font_key,
1219 						       void                 *glyph_key);
1220 
1221 PIXMAN_API
1222 const void *          pixman_glyph_cache_insert       (pixman_glyph_cache_t *cache,
1223 						       void                 *font_key,
1224 						       void                 *glyph_key,
1225 						       int		     origin_x,
1226 						       int                   origin_y,
1227 						       pixman_image_t       *glyph_image);
1228 
1229 PIXMAN_API
1230 void                  pixman_glyph_cache_remove       (pixman_glyph_cache_t *cache,
1231 						       void                 *font_key,
1232 						       void                 *glyph_key);
1233 
1234 PIXMAN_API
1235 void                  pixman_glyph_get_extents        (pixman_glyph_cache_t *cache,
1236 						       int                   n_glyphs,
1237 						       pixman_glyph_t       *glyphs,
1238 						       pixman_box32_t       *extents);
1239 
1240 PIXMAN_API
1241 pixman_format_code_t  pixman_glyph_get_mask_format    (pixman_glyph_cache_t *cache,
1242 						       int		     n_glyphs,
1243 						       const pixman_glyph_t *glyphs);
1244 
1245 PIXMAN_API
1246 void                  pixman_composite_glyphs         (pixman_op_t           op,
1247 						       pixman_image_t       *src,
1248 						       pixman_image_t       *dest,
1249 						       pixman_format_code_t  mask_format,
1250 						       int32_t               src_x,
1251 						       int32_t               src_y,
1252 						       int32_t		     mask_x,
1253 						       int32_t		     mask_y,
1254 						       int32_t               dest_x,
1255 						       int32_t               dest_y,
1256 						       int32_t		     width,
1257 						       int32_t		     height,
1258 						       pixman_glyph_cache_t *cache,
1259 						       int		     n_glyphs,
1260 						       const pixman_glyph_t *glyphs);
1261 
1262 PIXMAN_API
1263 void                  pixman_composite_glyphs_no_mask (pixman_op_t           op,
1264 						       pixman_image_t       *src,
1265 						       pixman_image_t       *dest,
1266 						       int32_t               src_x,
1267 						       int32_t               src_y,
1268 						       int32_t               dest_x,
1269 						       int32_t               dest_y,
1270 						       pixman_glyph_cache_t *cache,
1271 						       int		     n_glyphs,
1272 						       const pixman_glyph_t *glyphs);
1273 
1274 /*
1275  * Trapezoids
1276  */
1277 typedef struct pixman_edge pixman_edge_t;
1278 typedef struct pixman_trapezoid pixman_trapezoid_t;
1279 typedef struct pixman_trap pixman_trap_t;
1280 typedef struct pixman_span_fix pixman_span_fix_t;
1281 typedef struct pixman_triangle pixman_triangle_t;
1282 
1283 /*
1284  * An edge structure.  This represents a single polygon edge
1285  * and can be quickly stepped across small or large gaps in the
1286  * sample grid
1287  */
1288 struct pixman_edge
1289 {
1290     pixman_fixed_t	x;
1291     pixman_fixed_t	e;
1292     pixman_fixed_t	stepx;
1293     pixman_fixed_t	signdx;
1294     pixman_fixed_t	dy;
1295     pixman_fixed_t	dx;
1296 
1297     pixman_fixed_t	stepx_small;
1298     pixman_fixed_t	stepx_big;
1299     pixman_fixed_t	dx_small;
1300     pixman_fixed_t	dx_big;
1301 };
1302 
1303 struct pixman_trapezoid
1304 {
1305     pixman_fixed_t	top, bottom;
1306     pixman_line_fixed_t	left, right;
1307 };
1308 
1309 struct pixman_triangle
1310 {
1311     pixman_point_fixed_t p1, p2, p3;
1312 };
1313 
1314 /* whether 't' is a well defined not obviously empty trapezoid */
1315 #define pixman_trapezoid_valid(t)				   \
1316     ((t)->left.p1.y != (t)->left.p2.y &&			   \
1317      (t)->right.p1.y != (t)->right.p2.y &&			   \
1318      ((t)->bottom > (t)->top))
1319 
1320 struct pixman_span_fix
1321 {
1322     pixman_fixed_t	l, r, y;
1323 };
1324 
1325 struct pixman_trap
1326 {
1327     pixman_span_fix_t	top, bot;
1328 };
1329 
1330 PIXMAN_API
1331 pixman_fixed_t pixman_sample_ceil_y        (pixman_fixed_t             y,
1332 					    int                        bpp);
1333 
1334 PIXMAN_API
1335 pixman_fixed_t pixman_sample_floor_y       (pixman_fixed_t             y,
1336 					    int                        bpp);
1337 
1338 PIXMAN_API
1339 void           pixman_edge_step            (pixman_edge_t             *e,
1340 					    int                        n);
1341 
1342 PIXMAN_API
1343 void           pixman_edge_init            (pixman_edge_t             *e,
1344 					    int                        bpp,
1345 					    pixman_fixed_t             y_start,
1346 					    pixman_fixed_t             x_top,
1347 					    pixman_fixed_t             y_top,
1348 					    pixman_fixed_t             x_bot,
1349 					    pixman_fixed_t             y_bot);
1350 
1351 PIXMAN_API
1352 void           pixman_line_fixed_edge_init (pixman_edge_t             *e,
1353 					    int                        bpp,
1354 					    pixman_fixed_t             y,
1355 					    const pixman_line_fixed_t *line,
1356 					    int                        x_off,
1357 					    int                        y_off);
1358 
1359 PIXMAN_API
1360 void           pixman_rasterize_edges      (pixman_image_t            *image,
1361 					    pixman_edge_t             *l,
1362 					    pixman_edge_t             *r,
1363 					    pixman_fixed_t             t,
1364 					    pixman_fixed_t             b);
1365 
1366 PIXMAN_API
1367 void           pixman_add_traps            (pixman_image_t            *image,
1368 					    int16_t                    x_off,
1369 					    int16_t                    y_off,
1370 					    int                        ntrap,
1371 					    const pixman_trap_t       *traps);
1372 
1373 PIXMAN_API
1374 void           pixman_add_trapezoids       (pixman_image_t            *image,
1375 					    int16_t                    x_off,
1376 					    int                        y_off,
1377 					    int                        ntraps,
1378 					    const pixman_trapezoid_t  *traps);
1379 
1380 PIXMAN_API
1381 void           pixman_rasterize_trapezoid  (pixman_image_t            *image,
1382 					    const pixman_trapezoid_t  *trap,
1383 					    int                        x_off,
1384 					    int                        y_off);
1385 
1386 PIXMAN_API
1387 void          pixman_composite_trapezoids (pixman_op_t		       op,
1388 					   pixman_image_t *	       src,
1389 					   pixman_image_t *	       dst,
1390 					   pixman_format_code_t	       mask_format,
1391 					   int			       x_src,
1392 					   int			       y_src,
1393 					   int			       x_dst,
1394 					   int			       y_dst,
1395 					   int			       n_traps,
1396 					   const pixman_trapezoid_t *  traps);
1397 
1398 PIXMAN_API
1399 void          pixman_composite_triangles (pixman_op_t		       op,
1400 					  pixman_image_t *	       src,
1401 					  pixman_image_t *	       dst,
1402 					  pixman_format_code_t	       mask_format,
1403 					  int			       x_src,
1404 					  int			       y_src,
1405 					  int			       x_dst,
1406 					  int			       y_dst,
1407 					  int			       n_tris,
1408 					  const pixman_triangle_t *    tris);
1409 
1410 PIXMAN_API
1411 void	      pixman_add_triangles       (pixman_image_t              *image,
1412 					  int32_t	               x_off,
1413 					  int32_t	               y_off,
1414 					  int	                       n_tris,
1415 					  const pixman_triangle_t     *tris);
1416 
1417 PIXMAN_END_DECLS
1418 
1419 #endif /* PIXMAN_H__ */
1420