pixman.h revision dc259aab
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/*
75 * Standard integers
76 */
77#if defined (_SVR4) || defined (SVR4) || defined (__OpenBSD__) || defined (_sgi) || defined (__sun) || defined (sun) || defined (__digital__)
78#  include <inttypes.h>
79#elif defined (_MSC_VER)
80typedef __int8 int8_t;
81typedef unsigned __int8 uint8_t;
82typedef __int16 int16_t;
83typedef unsigned __int16 uint16_t;
84typedef __int32 int32_t;
85typedef unsigned __int32 uint32_t;
86typedef __int64 int64_t;
87typedef unsigned __int64 uint64_t;
88#elif defined (_AIX)
89#  include <sys/inttypes.h>
90#else
91#  include <stdint.h>
92#endif
93
94/*
95 * Boolean
96 */
97typedef int pixman_bool_t;
98
99/*
100 * Fixpoint numbers
101 */
102typedef int64_t			pixman_fixed_32_32_t;
103typedef pixman_fixed_32_32_t	pixman_fixed_48_16_t;
104typedef uint32_t		pixman_fixed_1_31_t;
105typedef uint32_t		pixman_fixed_1_16_t;
106typedef int32_t			pixman_fixed_16_16_t;
107typedef pixman_fixed_16_16_t	pixman_fixed_t;
108
109#define pixman_fixed_e			((pixman_fixed_t) 1)
110#define pixman_fixed_1			(pixman_int_to_fixed(1))
111#define pixman_fixed_1_minus_e		(pixman_fixed_1 - pixman_fixed_e)
112#define pixman_fixed_to_int(f)		((int) ((f) >> 16))
113#define pixman_int_to_fixed(i)		((pixman_fixed_t) ((i) << 16))
114#define pixman_fixed_to_double(f)	(double) ((f) / (double) pixman_fixed_1)
115#define pixman_double_to_fixed(d)	((pixman_fixed_t) ((d) * 65536.0))
116#define pixman_fixed_frac(f)		((f) & pixman_fixed_1_minus_e)
117#define pixman_fixed_floor(f)		((f) & ~pixman_fixed_1_minus_e)
118#define pixman_fixed_ceil(f)		pixman_fixed_floor ((f) + pixman_fixed_1_minus_e)
119#define pixman_fixed_fraction(f)	((f) & pixman_fixed_1_minus_e)
120#define pixman_fixed_mod_2(f)		((f) & (pixman_fixed1 | pixman_fixed_1_minus_e))
121#define pixman_max_fixed_48_16		((pixman_fixed_48_16_t) 0x7fffffff)
122#define pixman_min_fixed_48_16		(-((pixman_fixed_48_16_t) 1 << 31))
123
124/*
125 * Misc structs
126 */
127typedef struct pixman_color pixman_color_t;
128typedef struct pixman_point_fixed pixman_point_fixed_t;
129typedef struct pixman_line_fixed pixman_line_fixed_t;
130typedef struct pixman_vector pixman_vector_t;
131typedef struct pixman_transform pixman_transform_t;
132
133struct pixman_color
134{
135    uint16_t	red;
136    uint16_t    green;
137    uint16_t    blue;
138    uint16_t    alpha;
139};
140
141struct pixman_point_fixed
142{
143    pixman_fixed_t	x;
144    pixman_fixed_t	y;
145};
146
147struct pixman_line_fixed
148{
149    pixman_point_fixed_t	p1, p2;
150};
151
152/*
153 * Fixed point matrices
154 */
155
156struct pixman_vector
157{
158    pixman_fixed_t	vector[3];
159};
160
161struct pixman_transform
162{
163    pixman_fixed_t	matrix[3][3];
164};
165
166/* forward declaration (sorry) */
167struct pixman_box16;
168
169void
170pixman_transform_init_identity(struct pixman_transform *matrix);
171
172pixman_bool_t
173pixman_transform_point_3d (const struct pixman_transform *transform,
174			   struct pixman_vector *vector);
175
176pixman_bool_t
177pixman_transform_point(const struct pixman_transform *transform,
178		       struct pixman_vector *vector);
179
180pixman_bool_t
181pixman_transform_multiply (struct pixman_transform *dst,
182			   const struct pixman_transform *l,
183			   const struct pixman_transform *r);
184
185void
186pixman_transform_init_scale (struct pixman_transform *t,
187			     pixman_fixed_t sx,
188			     pixman_fixed_t sy);
189
190pixman_bool_t
191pixman_transform_scale(struct pixman_transform *forward,
192		       struct pixman_transform *reverse,
193		       pixman_fixed_t sx, pixman_fixed_t sy);
194
195void
196pixman_transform_init_rotate(struct pixman_transform *t,
197			     pixman_fixed_t cos,
198			     pixman_fixed_t sin);
199
200pixman_bool_t
201pixman_transform_rotate(struct pixman_transform *forward,
202			struct pixman_transform *reverse,
203			pixman_fixed_t c, pixman_fixed_t s);
204
205void
206pixman_transform_init_translate(struct pixman_transform *t,
207				pixman_fixed_t tx, pixman_fixed_t ty);
208
209
210pixman_bool_t
211pixman_transform_translate(struct pixman_transform *forward,
212			   struct pixman_transform *reverse,
213			   pixman_fixed_t tx, pixman_fixed_t ty);
214
215pixman_bool_t
216pixman_transform_bounds(const struct pixman_transform *matrix,
217			struct pixman_box16 *b);
218
219
220pixman_bool_t
221pixman_transform_invert (struct pixman_transform *dst,
222			 const struct pixman_transform *src);
223
224pixman_bool_t
225pixman_transform_is_identity(const struct pixman_transform *t);
226
227pixman_bool_t
228pixman_transform_is_scale(const struct pixman_transform *t);
229
230pixman_bool_t
231pixman_transform_is_int_translate(const struct pixman_transform *t);
232
233pixman_bool_t
234pixman_transform_is_inverse (const struct pixman_transform *a,
235			     const struct pixman_transform *b);
236
237
238/*
239 * Floating point matrices
240 */
241struct pixman_f_vector {
242    double  v[3];
243};
244
245struct pixman_f_transform {
246    double  m[3][3];
247};
248
249pixman_bool_t
250pixman_transform_from_pixman_f_transform (struct pixman_transform *t,
251					  const struct pixman_f_transform *ft);
252
253void
254pixman_f_transform_from_pixman_transform (struct pixman_f_transform *ft,
255					  const struct pixman_transform *t);
256
257pixman_bool_t
258pixman_transform_from_pixman_f_transform (struct pixman_transform *t,
259					  const struct pixman_f_transform *ft);
260
261pixman_bool_t
262pixman_f_transform_invert (struct pixman_f_transform *dst,
263			   const struct pixman_f_transform *src);
264
265pixman_bool_t
266pixman_f_transform_point (const struct pixman_f_transform *t,
267			  struct pixman_f_vector *v);
268
269void
270pixman_f_transform_point_3d (const struct pixman_f_transform *t,
271			     struct pixman_f_vector	*v);
272
273
274void
275pixman_f_transform_multiply (struct pixman_f_transform *dst,
276			     const struct pixman_f_transform *l,
277			     const struct pixman_f_transform *r);
278
279void
280pixman_f_transform_init_scale (struct pixman_f_transform *t, double sx, double sy);
281
282pixman_bool_t
283pixman_f_transform_scale (struct pixman_f_transform *forward,
284			  struct pixman_f_transform *reverse,
285			  double sx, double sy);
286
287void
288pixman_f_transform_init_rotate (struct pixman_f_transform *t, double cos, double sin);
289
290pixman_bool_t
291pixman_f_transform_rotate (struct pixman_f_transform *forward,
292			   struct pixman_f_transform *reverse,
293			   double c, double s);
294
295void
296pixman_f_transform_init_translate (struct pixman_f_transform *t, double tx, double ty);
297
298pixman_bool_t
299pixman_f_transform_translate (struct pixman_f_transform *forward,
300			      struct pixman_f_transform *reverse,
301			      double tx, double ty);
302
303pixman_bool_t
304pixman_f_transform_bounds (const struct pixman_f_transform *t, struct pixman_box16 *b);
305
306void
307pixman_f_transform_init_identity (struct pixman_f_transform *t);
308
309/* Don't blame me, blame XRender */
310typedef enum
311{
312    PIXMAN_REPEAT_NONE,
313    PIXMAN_REPEAT_NORMAL,
314    PIXMAN_REPEAT_PAD,
315    PIXMAN_REPEAT_REFLECT
316} pixman_repeat_t;
317
318typedef enum
319{
320    PIXMAN_FILTER_FAST,
321    PIXMAN_FILTER_GOOD,
322    PIXMAN_FILTER_BEST,
323    PIXMAN_FILTER_NEAREST,
324    PIXMAN_FILTER_BILINEAR,
325    PIXMAN_FILTER_CONVOLUTION
326} pixman_filter_t;
327
328typedef enum
329{
330    PIXMAN_OP_CLEAR			= 0x00,
331    PIXMAN_OP_SRC			= 0x01,
332    PIXMAN_OP_DST			= 0x02,
333    PIXMAN_OP_OVER			= 0x03,
334    PIXMAN_OP_OVER_REVERSE		= 0x04,
335    PIXMAN_OP_IN			= 0x05,
336    PIXMAN_OP_IN_REVERSE		= 0x06,
337    PIXMAN_OP_OUT			= 0x07,
338    PIXMAN_OP_OUT_REVERSE		= 0x08,
339    PIXMAN_OP_ATOP			= 0x09,
340    PIXMAN_OP_ATOP_REVERSE		= 0x0a,
341    PIXMAN_OP_XOR			= 0x0b,
342    PIXMAN_OP_ADD			= 0x0c,
343    PIXMAN_OP_SATURATE			= 0x0d,
344
345    PIXMAN_OP_DISJOINT_CLEAR		= 0x10,
346    PIXMAN_OP_DISJOINT_SRC		= 0x11,
347    PIXMAN_OP_DISJOINT_DST		= 0x12,
348    PIXMAN_OP_DISJOINT_OVER		= 0x13,
349    PIXMAN_OP_DISJOINT_OVER_REVERSE	= 0x14,
350    PIXMAN_OP_DISJOINT_IN		= 0x15,
351    PIXMAN_OP_DISJOINT_IN_REVERSE	= 0x16,
352    PIXMAN_OP_DISJOINT_OUT		= 0x17,
353    PIXMAN_OP_DISJOINT_OUT_REVERSE	= 0x18,
354    PIXMAN_OP_DISJOINT_ATOP		= 0x19,
355    PIXMAN_OP_DISJOINT_ATOP_REVERSE	= 0x1a,
356    PIXMAN_OP_DISJOINT_XOR		= 0x1b,
357
358    PIXMAN_OP_CONJOINT_CLEAR		= 0x20,
359    PIXMAN_OP_CONJOINT_SRC		= 0x21,
360    PIXMAN_OP_CONJOINT_DST		= 0x22,
361    PIXMAN_OP_CONJOINT_OVER		= 0x23,
362    PIXMAN_OP_CONJOINT_OVER_REVERSE	= 0x24,
363    PIXMAN_OP_CONJOINT_IN		= 0x25,
364    PIXMAN_OP_CONJOINT_IN_REVERSE	= 0x26,
365    PIXMAN_OP_CONJOINT_OUT		= 0x27,
366    PIXMAN_OP_CONJOINT_OUT_REVERSE	= 0x28,
367    PIXMAN_OP_CONJOINT_ATOP		= 0x29,
368    PIXMAN_OP_CONJOINT_ATOP_REVERSE	= 0x2a,
369    PIXMAN_OP_CONJOINT_XOR		= 0x2b,
370
371    PIXMAN_OP_MULTIPLY                  = 0x30,
372    PIXMAN_OP_SCREEN                    = 0x31,
373    PIXMAN_OP_OVERLAY                   = 0x32,
374    PIXMAN_OP_DARKEN                    = 0x33,
375    PIXMAN_OP_LIGHTEN                   = 0x34,
376    PIXMAN_OP_COLOR_DODGE               = 0x35,
377    PIXMAN_OP_COLOR_BURN                = 0x36,
378    PIXMAN_OP_HARD_LIGHT                = 0x37,
379    PIXMAN_OP_SOFT_LIGHT                = 0x38,
380    PIXMAN_OP_DIFFERENCE                = 0x39,
381    PIXMAN_OP_EXCLUSION                 = 0x3a,
382    PIXMAN_OP_HSL_HUE			= 0x3b,
383    PIXMAN_OP_HSL_SATURATION		= 0x3c,
384    PIXMAN_OP_HSL_COLOR			= 0x3d,
385    PIXMAN_OP_HSL_LUMINOSITY		= 0x3e,
386
387    PIXMAN_OP_NONE,
388    PIXMAN_OP_LAST = PIXMAN_OP_NONE
389} pixman_op_t;
390
391/*
392 * Regions
393 */
394typedef struct pixman_region16_data	pixman_region16_data_t;
395typedef struct pixman_box16		pixman_box16_t;
396typedef struct pixman_rectangle16	pixman_rectangle16_t;
397typedef struct pixman_region16		pixman_region16_t;
398
399struct pixman_region16_data {
400    long		size;
401    long		numRects;
402/*  pixman_box16_t	rects[size];   in memory but not explicitly declared */
403};
404
405struct pixman_rectangle16
406{
407    int16_t x, y;
408    uint16_t width, height;
409};
410
411struct pixman_box16
412{
413    int16_t x1, y1, x2, y2;
414};
415
416struct pixman_region16
417{
418    pixman_box16_t          extents;
419    pixman_region16_data_t  *data;
420};
421
422typedef enum
423{
424    PIXMAN_REGION_OUT,
425    PIXMAN_REGION_IN,
426    PIXMAN_REGION_PART
427} pixman_region_overlap_t;
428
429/* This function exists only to make it possible to preserve the X ABI - it should
430 * go away at first opportunity.
431 */
432void                    pixman_region_set_static_pointers (pixman_box16_t         *empty_box,
433							   pixman_region16_data_t *empty_data,
434							   pixman_region16_data_t *broken_data);
435
436
437/* creation/destruction */
438void                    pixman_region_init                (pixman_region16_t      *region);
439void                    pixman_region_init_rect           (pixman_region16_t      *region,
440							   int                     x,
441							   int                     y,
442							   unsigned int            width,
443							   unsigned int            height);
444pixman_bool_t           pixman_region_init_rects          (pixman_region16_t      *region,
445							   pixman_box16_t         *boxes,
446							   int                     count);
447void                    pixman_region_init_with_extents   (pixman_region16_t      *region,
448							   pixman_box16_t         *extents);
449void                    pixman_region_fini                (pixman_region16_t      *region);
450
451
452/* manipulation */
453void                    pixman_region_translate           (pixman_region16_t      *region,
454							   int                     x,
455							   int                     y);
456pixman_bool_t           pixman_region_copy                (pixman_region16_t      *dest,
457							   pixman_region16_t      *source);
458pixman_bool_t           pixman_region_intersect           (pixman_region16_t      *newReg,
459							   pixman_region16_t      *reg1,
460							   pixman_region16_t      *reg2);
461pixman_bool_t           pixman_region_union               (pixman_region16_t      *newReg,
462							   pixman_region16_t      *reg1,
463							   pixman_region16_t      *reg2);
464pixman_bool_t           pixman_region_union_rect          (pixman_region16_t      *dest,
465							   pixman_region16_t      *source,
466							   int                     x,
467							   int                     y,
468							   unsigned int            width,
469							   unsigned int            height);
470pixman_bool_t           pixman_region_subtract            (pixman_region16_t      *regD,
471							   pixman_region16_t      *regM,
472							   pixman_region16_t      *regS);
473pixman_bool_t           pixman_region_inverse             (pixman_region16_t      *newReg,
474							   pixman_region16_t      *reg1,
475							   pixman_box16_t         *invRect);
476pixman_bool_t           pixman_region_contains_point      (pixman_region16_t      *region,
477							   int                     x,
478							   int                     y,
479							   pixman_box16_t         *box);
480pixman_region_overlap_t pixman_region_contains_rectangle  (pixman_region16_t      *pixman_region16_t,
481							   pixman_box16_t         *prect);
482pixman_bool_t           pixman_region_not_empty           (pixman_region16_t      *region);
483pixman_box16_t *        pixman_region_extents             (pixman_region16_t      *region);
484int                     pixman_region_n_rects             (pixman_region16_t      *region);
485pixman_box16_t *        pixman_region_rectangles          (pixman_region16_t      *region,
486							   int                    *n_rects);
487pixman_bool_t           pixman_region_equal               (pixman_region16_t      *region1,
488							   pixman_region16_t      *region2);
489pixman_bool_t           pixman_region_selfcheck           (pixman_region16_t      *region);
490void                    pixman_region_reset               (pixman_region16_t      *region,
491							   pixman_box16_t         *box);
492
493/*
494 * 32 bit regions
495 */
496typedef struct pixman_region32_data	pixman_region32_data_t;
497typedef struct pixman_box32		pixman_box32_t;
498typedef struct pixman_rectangle32	pixman_rectangle32_t;
499typedef struct pixman_region32		pixman_region32_t;
500
501struct pixman_region32_data {
502    long		size;
503    long		numRects;
504/*  pixman_box32_t	rects[size];   in memory but not explicitly declared */
505};
506
507struct pixman_rectangle32
508{
509    int32_t x, y;
510    uint32_t width, height;
511};
512
513struct pixman_box32
514{
515    int32_t x1, y1, x2, y2;
516};
517
518struct pixman_region32
519{
520    pixman_box32_t          extents;
521    pixman_region32_data_t  *data;
522};
523
524/* creation/destruction */
525void                    pixman_region32_init               (pixman_region32_t *region);
526void                    pixman_region32_init_rect          (pixman_region32_t *region,
527							    int                x,
528							    int                y,
529							    unsigned int       width,
530							    unsigned int       height);
531pixman_bool_t           pixman_region32_init_rects         (pixman_region32_t *region,
532							    pixman_box32_t    *boxes,
533							    int                count);
534void                    pixman_region32_init_with_extents  (pixman_region32_t *region,
535							    pixman_box32_t    *extents);
536void                    pixman_region32_fini               (pixman_region32_t *region);
537
538
539/* manipulation */
540void                    pixman_region32_translate          (pixman_region32_t *region,
541							    int                x,
542							    int                y);
543pixman_bool_t           pixman_region32_copy               (pixman_region32_t *dest,
544							    pixman_region32_t *source);
545pixman_bool_t           pixman_region32_intersect          (pixman_region32_t *newReg,
546							    pixman_region32_t *reg1,
547							    pixman_region32_t *reg2);
548pixman_bool_t           pixman_region32_union              (pixman_region32_t *newReg,
549							    pixman_region32_t *reg1,
550							    pixman_region32_t *reg2);
551pixman_bool_t           pixman_region32_union_rect         (pixman_region32_t *dest,
552							    pixman_region32_t *source,
553							    int                x,
554							    int                y,
555							    unsigned int       width,
556							    unsigned int       height);
557pixman_bool_t           pixman_region32_subtract           (pixman_region32_t *regD,
558							    pixman_region32_t *regM,
559							    pixman_region32_t *regS);
560pixman_bool_t           pixman_region32_inverse            (pixman_region32_t *newReg,
561							    pixman_region32_t *reg1,
562							    pixman_box32_t    *invRect);
563pixman_bool_t           pixman_region32_contains_point     (pixman_region32_t *region,
564							    int                x,
565							    int                y,
566							    pixman_box32_t    *box);
567pixman_region_overlap_t pixman_region32_contains_rectangle (pixman_region32_t *region,
568							    pixman_box32_t    *prect);
569pixman_bool_t           pixman_region32_not_empty          (pixman_region32_t *region);
570pixman_box32_t *        pixman_region32_extents            (pixman_region32_t *region);
571int                     pixman_region32_n_rects            (pixman_region32_t *region);
572pixman_box32_t *        pixman_region32_rectangles         (pixman_region32_t *region,
573							    int               *n_rects);
574pixman_bool_t           pixman_region32_equal              (pixman_region32_t *region1,
575							    pixman_region32_t *region2);
576pixman_bool_t           pixman_region32_selfcheck          (pixman_region32_t *region);
577void                    pixman_region32_reset              (pixman_region32_t *region,
578							    pixman_box32_t    *box);
579
580
581/* Copy / Fill / Misc */
582pixman_bool_t pixman_blt                (uint32_t           *src_bits,
583					 uint32_t           *dst_bits,
584					 int                 src_stride,
585					 int                 dst_stride,
586					 int                 src_bpp,
587					 int                 dst_bpp,
588					 int                 src_x,
589					 int                 src_y,
590					 int                 dst_x,
591					 int                 dst_y,
592					 int                 width,
593					 int                 height);
594pixman_bool_t pixman_fill               (uint32_t           *bits,
595					 int                 stride,
596					 int                 bpp,
597					 int                 x,
598					 int                 y,
599					 int                 width,
600					 int                 height,
601					 uint32_t            _xor);
602
603int           pixman_version            (void);
604const char*   pixman_version_string     (void);
605
606/*
607 * Images
608 */
609typedef  union pixman_image		pixman_image_t;
610typedef struct pixman_indexed		pixman_indexed_t;
611typedef struct pixman_gradient_stop	pixman_gradient_stop_t;
612
613typedef uint32_t (* pixman_read_memory_func_t) (const void *src, int size);
614typedef void     (* pixman_write_memory_func_t) (void *dst, uint32_t value, int size);
615
616typedef void     (* pixman_image_destroy_func_t) (pixman_image_t *image, void *data);
617
618struct pixman_gradient_stop {
619    pixman_fixed_t x;
620    pixman_color_t color;
621};
622
623#define PIXMAN_MAX_INDEXED  256 /* XXX depth must be <= 8 */
624
625#if PIXMAN_MAX_INDEXED <= 256
626typedef uint8_t pixman_index_type;
627#endif
628
629struct pixman_indexed
630{
631    pixman_bool_t       color;
632    uint32_t		rgba[PIXMAN_MAX_INDEXED];
633    pixman_index_type	ent[32768];
634};
635
636/*
637 * While the protocol is generous in format support, the
638 * sample implementation allows only packed RGB and GBR
639 * representations for data to simplify software rendering,
640 */
641#define PIXMAN_FORMAT(bpp,type,a,r,g,b)	(((bpp) << 24) |  \
642					 ((type) << 16) | \
643					 ((a) << 12) |	  \
644					 ((r) << 8) |	  \
645					 ((g) << 4) |	  \
646					 ((b)))
647
648#define PIXMAN_FORMAT_BPP(f)	(((f) >> 24)       )
649#define PIXMAN_FORMAT_TYPE(f)	(((f) >> 16) & 0xff)
650#define PIXMAN_FORMAT_A(f)	(((f) >> 12) & 0x0f)
651#define PIXMAN_FORMAT_R(f)	(((f) >>  8) & 0x0f)
652#define PIXMAN_FORMAT_G(f)	(((f) >>  4) & 0x0f)
653#define PIXMAN_FORMAT_B(f)	(((f)      ) & 0x0f)
654#define PIXMAN_FORMAT_RGB(f)	(((f)      ) & 0xfff)
655#define PIXMAN_FORMAT_VIS(f)	(((f)      ) & 0xffff)
656#define PIXMAN_FORMAT_DEPTH(f)	(PIXMAN_FORMAT_A(f) +	\
657				 PIXMAN_FORMAT_R(f) +	\
658				 PIXMAN_FORMAT_G(f) +	\
659				 PIXMAN_FORMAT_B(f))
660
661#define PIXMAN_TYPE_OTHER	0
662#define PIXMAN_TYPE_A		1
663#define PIXMAN_TYPE_ARGB	2
664#define PIXMAN_TYPE_ABGR	3
665#define PIXMAN_TYPE_COLOR	4
666#define PIXMAN_TYPE_GRAY	5
667#define PIXMAN_TYPE_YUY2	6
668#define PIXMAN_TYPE_YV12	7
669#define PIXMAN_TYPE_BGRA	8
670
671#define PIXMAN_FORMAT_COLOR(f)				\
672	(PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_ARGB ||	\
673	 PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_ABGR ||	\
674	 PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_BGRA)
675
676/* 32bpp formats */
677typedef enum {
678    PIXMAN_a8r8g8b8 =	PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,8,8,8,8),
679    PIXMAN_x8r8g8b8 =	PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,0,8,8,8),
680    PIXMAN_a8b8g8r8 =	PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,8,8,8,8),
681    PIXMAN_x8b8g8r8 =	PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,0,8,8,8),
682    PIXMAN_b8g8r8a8 =	PIXMAN_FORMAT(32,PIXMAN_TYPE_BGRA,8,8,8,8),
683    PIXMAN_b8g8r8x8 =	PIXMAN_FORMAT(32,PIXMAN_TYPE_BGRA,0,8,8,8),
684    PIXMAN_x2b10g10r10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,0,10,10,10),
685    PIXMAN_a2b10g10r10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,2,10,10,10),
686
687/* 24bpp formats */
688    PIXMAN_r8g8b8 =	PIXMAN_FORMAT(24,PIXMAN_TYPE_ARGB,0,8,8,8),
689    PIXMAN_b8g8r8 =	PIXMAN_FORMAT(24,PIXMAN_TYPE_ABGR,0,8,8,8),
690
691/* 16bpp formats */
692    PIXMAN_r5g6b5 =	PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,0,5,6,5),
693    PIXMAN_b5g6r5 =	PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,0,5,6,5),
694
695    PIXMAN_a1r5g5b5 =	PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,1,5,5,5),
696    PIXMAN_x1r5g5b5 =	PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,0,5,5,5),
697    PIXMAN_a1b5g5r5 =	PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,1,5,5,5),
698    PIXMAN_x1b5g5r5 =	PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,0,5,5,5),
699    PIXMAN_a4r4g4b4 =	PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,4,4,4,4),
700    PIXMAN_x4r4g4b4 =	PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,0,4,4,4),
701    PIXMAN_a4b4g4r4 =	PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,4,4,4,4),
702    PIXMAN_x4b4g4r4 =	PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,0,4,4,4),
703
704/* 8bpp formats */
705    PIXMAN_a8 =		PIXMAN_FORMAT(8,PIXMAN_TYPE_A,8,0,0,0),
706    PIXMAN_r3g3b2 =	PIXMAN_FORMAT(8,PIXMAN_TYPE_ARGB,0,3,3,2),
707    PIXMAN_b2g3r3 =	PIXMAN_FORMAT(8,PIXMAN_TYPE_ABGR,0,3,3,2),
708    PIXMAN_a2r2g2b2 =	PIXMAN_FORMAT(8,PIXMAN_TYPE_ARGB,2,2,2,2),
709    PIXMAN_a2b2g2r2 =	PIXMAN_FORMAT(8,PIXMAN_TYPE_ABGR,2,2,2,2),
710
711    PIXMAN_c8 =		PIXMAN_FORMAT(8,PIXMAN_TYPE_COLOR,0,0,0,0),
712    PIXMAN_g8 =		PIXMAN_FORMAT(8,PIXMAN_TYPE_GRAY,0,0,0,0),
713
714    PIXMAN_x4a4 =	PIXMAN_FORMAT(8,PIXMAN_TYPE_A,4,0,0,0),
715
716    PIXMAN_x4c4 =	PIXMAN_FORMAT(8,PIXMAN_TYPE_COLOR,0,0,0,0),
717    PIXMAN_x4g4 =	PIXMAN_FORMAT(8,PIXMAN_TYPE_GRAY,0,0,0,0),
718
719/* 4bpp formats */
720    PIXMAN_a4 =		PIXMAN_FORMAT(4,PIXMAN_TYPE_A,4,0,0,0),
721    PIXMAN_r1g2b1 =	PIXMAN_FORMAT(4,PIXMAN_TYPE_ARGB,0,1,2,1),
722    PIXMAN_b1g2r1 =	PIXMAN_FORMAT(4,PIXMAN_TYPE_ABGR,0,1,2,1),
723    PIXMAN_a1r1g1b1 =	PIXMAN_FORMAT(4,PIXMAN_TYPE_ARGB,1,1,1,1),
724    PIXMAN_a1b1g1r1 =	PIXMAN_FORMAT(4,PIXMAN_TYPE_ABGR,1,1,1,1),
725
726    PIXMAN_c4 =		PIXMAN_FORMAT(4,PIXMAN_TYPE_COLOR,0,0,0,0),
727    PIXMAN_g4 =		PIXMAN_FORMAT(4,PIXMAN_TYPE_GRAY,0,0,0,0),
728
729/* 1bpp formats */
730    PIXMAN_a1 =		PIXMAN_FORMAT(1,PIXMAN_TYPE_A,1,0,0,0),
731
732    PIXMAN_g1 =		PIXMAN_FORMAT(1,PIXMAN_TYPE_GRAY,0,0,0,0),
733
734/* YUV formats */
735    PIXMAN_yuy2 =	PIXMAN_FORMAT(16,PIXMAN_TYPE_YUY2,0,0,0,0),
736    PIXMAN_yv12 =	PIXMAN_FORMAT(12,PIXMAN_TYPE_YV12,0,0,0,0)
737} pixman_format_code_t;
738
739/* Querying supported format values. */
740pixman_bool_t pixman_format_supported_destination (pixman_format_code_t format);
741pixman_bool_t pixman_format_supported_source      (pixman_format_code_t format);
742
743/* Constructors */
744pixman_image_t *pixman_image_create_solid_fill       (pixman_color_t               *color);
745pixman_image_t *pixman_image_create_linear_gradient  (pixman_point_fixed_t         *p1,
746						      pixman_point_fixed_t         *p2,
747						      const pixman_gradient_stop_t *stops,
748						      int                           n_stops);
749pixman_image_t *pixman_image_create_radial_gradient  (pixman_point_fixed_t         *inner,
750						      pixman_point_fixed_t         *outer,
751						      pixman_fixed_t                inner_radius,
752						      pixman_fixed_t                outer_radius,
753						      const pixman_gradient_stop_t *stops,
754						      int                           n_stops);
755pixman_image_t *pixman_image_create_conical_gradient (pixman_point_fixed_t         *center,
756						      pixman_fixed_t                angle,
757						      const pixman_gradient_stop_t *stops,
758						      int                           n_stops);
759pixman_image_t *pixman_image_create_bits             (pixman_format_code_t          format,
760						      int                           width,
761						      int                           height,
762						      uint32_t                     *bits,
763						      int                           rowstride_bytes);
764
765/* Destructor */
766pixman_image_t *pixman_image_ref                     (pixman_image_t               *image);
767pixman_bool_t   pixman_image_unref                   (pixman_image_t               *image);
768
769void		pixman_image_set_destroy_function    (pixman_image_t		   *image,
770						      pixman_image_destroy_func_t   function,
771						      void			   *data);
772
773/* Set properties */
774pixman_bool_t   pixman_image_set_clip_region         (pixman_image_t               *image,
775						      pixman_region16_t            *region);
776pixman_bool_t   pixman_image_set_clip_region32       (pixman_image_t               *image,
777						      pixman_region32_t            *region);
778void		pixman_image_set_has_client_clip     (pixman_image_t               *image,
779						      pixman_bool_t		    clien_clip);
780pixman_bool_t   pixman_image_set_transform           (pixman_image_t               *image,
781						      const pixman_transform_t     *transform);
782void            pixman_image_set_repeat              (pixman_image_t               *image,
783						      pixman_repeat_t               repeat);
784pixman_bool_t   pixman_image_set_filter              (pixman_image_t               *image,
785						      pixman_filter_t               filter,
786						      const pixman_fixed_t         *filter_params,
787						      int                           n_filter_params);
788void		pixman_image_set_source_clipping     (pixman_image_t		   *image,
789						      pixman_bool_t                 source_clipping);
790void            pixman_image_set_alpha_map           (pixman_image_t               *image,
791						      pixman_image_t               *alpha_map,
792						      int16_t                       x,
793						      int16_t                       y);
794void            pixman_image_set_component_alpha     (pixman_image_t               *image,
795						      pixman_bool_t                 component_alpha);
796void		pixman_image_set_accessors	     (pixman_image_t		   *image,
797						      pixman_read_memory_func_t	    read_func,
798						      pixman_write_memory_func_t    write_func);
799void		pixman_image_set_indexed	     (pixman_image_t		   *image,
800						      const pixman_indexed_t	   *indexed);
801uint32_t       *pixman_image_get_data                (pixman_image_t               *image);
802int		pixman_image_get_width               (pixman_image_t               *image);
803int             pixman_image_get_height              (pixman_image_t               *image);
804int		pixman_image_get_stride              (pixman_image_t               *image); /* in bytes */
805int		pixman_image_get_depth               (pixman_image_t		   *image);
806pixman_bool_t	pixman_image_fill_rectangles	     (pixman_op_t		    op,
807						      pixman_image_t		   *image,
808						      pixman_color_t		   *color,
809						      int			    n_rects,
810						      const pixman_rectangle16_t   *rects);
811
812/* Composite */
813pixman_bool_t pixman_compute_composite_region (pixman_region16_t *pRegion,
814					       pixman_image_t    *pSrc,
815					       pixman_image_t    *pMask,
816					       pixman_image_t    *pDst,
817					       int16_t            xSrc,
818					       int16_t            ySrc,
819					       int16_t            xMask,
820					       int16_t            yMask,
821					       int16_t            xDst,
822					       int16_t            yDst,
823					       uint16_t           width,
824					       uint16_t           height);
825void          pixman_image_composite          (pixman_op_t        op,
826					       pixman_image_t    *src,
827					       pixman_image_t    *mask,
828					       pixman_image_t    *dest,
829					       int16_t            src_x,
830					       int16_t            src_y,
831					       int16_t            mask_x,
832					       int16_t            mask_y,
833					       int16_t            dest_x,
834					       int16_t            dest_y,
835					       uint16_t           width,
836					       uint16_t           height);
837
838/*
839 * Trapezoids
840 */
841typedef struct pixman_edge pixman_edge_t;
842typedef struct pixman_trapezoid pixman_trapezoid_t;
843typedef struct pixman_trap pixman_trap_t;
844typedef struct pixman_span_fix pixman_span_fix_t;
845
846/*
847 * An edge structure.  This represents a single polygon edge
848 * and can be quickly stepped across small or large gaps in the
849 * sample grid
850 */
851struct pixman_edge
852{
853    pixman_fixed_t	x;
854    pixman_fixed_t	e;
855    pixman_fixed_t   stepx;
856    pixman_fixed_t   signdx;
857    pixman_fixed_t   dy;
858    pixman_fixed_t   dx;
859
860    pixman_fixed_t   stepx_small;
861    pixman_fixed_t   stepx_big;
862    pixman_fixed_t   dx_small;
863    pixman_fixed_t   dx_big;
864};
865
866struct pixman_trapezoid
867{
868    pixman_fixed_t  top, bottom;
869    pixman_line_fixed_t	left, right;
870};
871
872
873/* whether 't' is a well defined not obviously empty trapezoid */
874#define pixman_trapezoid_valid(t)				\
875    ((t)->left.p1.y != (t)->left.p2.y &&			   \
876     (t)->right.p1.y != (t)->right.p2.y &&			   \
877     (int) ((t)->bottom - (t)->top) > 0)
878
879struct pixman_span_fix
880{
881    pixman_fixed_t	l, r, y;
882};
883
884struct pixman_trap
885{
886    pixman_span_fix_t	top, bot;
887};
888
889pixman_fixed_t pixman_sample_ceil_y        (pixman_fixed_t             y,
890					    int                        bpp);
891pixman_fixed_t pixman_sample_floor_y       (pixman_fixed_t             y,
892					    int                        bpp);
893void           pixman_edge_step            (pixman_edge_t             *e,
894					    int                        n);
895void           pixman_edge_init            (pixman_edge_t             *e,
896					    int                        bpp,
897					    pixman_fixed_t             y_start,
898					    pixman_fixed_t             x_top,
899					    pixman_fixed_t             y_top,
900					    pixman_fixed_t             x_bot,
901					    pixman_fixed_t             y_bot);
902void           pixman_line_fixed_edge_init (pixman_edge_t             *e,
903					    int                        bpp,
904					    pixman_fixed_t             y,
905					    const pixman_line_fixed_t *line,
906					    int                        x_off,
907					    int                        y_off);
908void           pixman_rasterize_edges      (pixman_image_t            *image,
909					    pixman_edge_t             *l,
910					    pixman_edge_t             *r,
911					    pixman_fixed_t             t,
912					    pixman_fixed_t             b);
913void           pixman_add_traps            (pixman_image_t            *image,
914					    int16_t                    x_off,
915					    int16_t                    y_off,
916					    int                        ntrap,
917					    pixman_trap_t             *traps);
918void           pixman_add_trapezoids       (pixman_image_t            *image,
919					    int16_t                    x_off,
920					    int                        y_off,
921					    int                        ntraps,
922					    const pixman_trapezoid_t  *traps);
923void           pixman_rasterize_trapezoid  (pixman_image_t            *image,
924					    const pixman_trapezoid_t  *trap,
925					    int                        x_off,
926					    int                        y_off);
927
928
929#endif /* PIXMAN_H__ */
930