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