pixman.h revision 317c648b
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_NONE,
372    PIXMAN_OP_LAST = PIXMAN_OP_NONE
373} pixman_op_t;
374
375/*
376 * Regions
377 */
378typedef struct pixman_region16_data	pixman_region16_data_t;
379typedef struct pixman_box16		pixman_box16_t;
380typedef struct pixman_rectangle16	pixman_rectangle16_t;
381typedef struct pixman_region16		pixman_region16_t;
382
383struct pixman_region16_data {
384    long		size;
385    long		numRects;
386/*  pixman_box16_t	rects[size];   in memory but not explicitly declared */
387};
388
389struct pixman_rectangle16
390{
391    int16_t x, y;
392    uint16_t width, height;
393};
394
395struct pixman_box16
396{
397    int16_t x1, y1, x2, y2;
398};
399
400struct pixman_region16
401{
402    pixman_box16_t          extents;
403    pixman_region16_data_t  *data;
404};
405
406typedef enum
407{
408    PIXMAN_REGION_OUT,
409    PIXMAN_REGION_IN,
410    PIXMAN_REGION_PART
411} pixman_region_overlap_t;
412
413/* This function exists only to make it possible to preserve the X ABI - it should
414 * go away at first opportunity.
415 */
416void                    pixman_region_set_static_pointers (pixman_box16_t         *empty_box,
417							   pixman_region16_data_t *empty_data,
418							   pixman_region16_data_t *broken_data);
419
420
421/* creation/destruction */
422void                    pixman_region_init                (pixman_region16_t      *region);
423void                    pixman_region_init_rect           (pixman_region16_t      *region,
424							   int                     x,
425							   int                     y,
426							   unsigned int            width,
427							   unsigned int            height);
428pixman_bool_t           pixman_region_init_rects          (pixman_region16_t      *region,
429							   pixman_box16_t         *boxes,
430							   int                     count);
431void                    pixman_region_init_with_extents   (pixman_region16_t      *region,
432							   pixman_box16_t         *extents);
433void                    pixman_region_fini                (pixman_region16_t      *region);
434
435
436/* manipulation */
437void                    pixman_region_translate           (pixman_region16_t      *region,
438							   int                     x,
439							   int                     y);
440pixman_bool_t           pixman_region_copy                (pixman_region16_t      *dest,
441							   pixman_region16_t      *source);
442pixman_bool_t           pixman_region_intersect           (pixman_region16_t      *newReg,
443							   pixman_region16_t      *reg1,
444							   pixman_region16_t      *reg2);
445pixman_bool_t           pixman_region_union               (pixman_region16_t      *newReg,
446							   pixman_region16_t      *reg1,
447							   pixman_region16_t      *reg2);
448pixman_bool_t           pixman_region_union_rect          (pixman_region16_t      *dest,
449							   pixman_region16_t      *source,
450							   int                     x,
451							   int                     y,
452							   unsigned int            width,
453							   unsigned int            height);
454pixman_bool_t           pixman_region_subtract            (pixman_region16_t      *regD,
455							   pixman_region16_t      *regM,
456							   pixman_region16_t      *regS);
457pixman_bool_t           pixman_region_inverse             (pixman_region16_t      *newReg,
458							   pixman_region16_t      *reg1,
459							   pixman_box16_t         *invRect);
460pixman_bool_t           pixman_region_contains_point      (pixman_region16_t      *region,
461							   int                     x,
462							   int                     y,
463							   pixman_box16_t         *box);
464pixman_region_overlap_t pixman_region_contains_rectangle  (pixman_region16_t      *pixman_region16_t,
465							   pixman_box16_t         *prect);
466pixman_bool_t           pixman_region_not_empty           (pixman_region16_t      *region);
467pixman_box16_t *        pixman_region_extents             (pixman_region16_t      *region);
468int                     pixman_region_n_rects             (pixman_region16_t      *region);
469pixman_box16_t *        pixman_region_rectangles          (pixman_region16_t      *region,
470							   int                    *n_rects);
471pixman_bool_t           pixman_region_equal               (pixman_region16_t      *region1,
472							   pixman_region16_t      *region2);
473pixman_bool_t           pixman_region_selfcheck           (pixman_region16_t      *region);
474void                    pixman_region_reset               (pixman_region16_t      *region,
475							   pixman_box16_t         *box);
476
477/*
478 * 32 bit regions
479 */
480typedef struct pixman_region32_data	pixman_region32_data_t;
481typedef struct pixman_box32		pixman_box32_t;
482typedef struct pixman_rectangle32	pixman_rectangle32_t;
483typedef struct pixman_region32		pixman_region32_t;
484
485struct pixman_region32_data {
486    long		size;
487    long		numRects;
488/*  pixman_box32_t	rects[size];   in memory but not explicitly declared */
489};
490
491struct pixman_rectangle32
492{
493    int32_t x, y;
494    uint32_t width, height;
495};
496
497struct pixman_box32
498{
499    int32_t x1, y1, x2, y2;
500};
501
502struct pixman_region32
503{
504    pixman_box32_t          extents;
505    pixman_region32_data_t  *data;
506};
507
508/* creation/destruction */
509void                    pixman_region32_init               (pixman_region32_t *region);
510void                    pixman_region32_init_rect          (pixman_region32_t *region,
511							    int                x,
512							    int                y,
513							    unsigned int       width,
514							    unsigned int       height);
515pixman_bool_t           pixman_region32_init_rects         (pixman_region32_t *region,
516							    pixman_box32_t    *boxes,
517							    int                count);
518void                    pixman_region32_init_with_extents  (pixman_region32_t *region,
519							    pixman_box32_t    *extents);
520void                    pixman_region32_fini               (pixman_region32_t *region);
521
522
523/* manipulation */
524void                    pixman_region32_translate          (pixman_region32_t *region,
525							    int                x,
526							    int                y);
527pixman_bool_t           pixman_region32_copy               (pixman_region32_t *dest,
528							    pixman_region32_t *source);
529pixman_bool_t           pixman_region32_intersect          (pixman_region32_t *newReg,
530							    pixman_region32_t *reg1,
531							    pixman_region32_t *reg2);
532pixman_bool_t           pixman_region32_union              (pixman_region32_t *newReg,
533							    pixman_region32_t *reg1,
534							    pixman_region32_t *reg2);
535pixman_bool_t           pixman_region32_union_rect         (pixman_region32_t *dest,
536							    pixman_region32_t *source,
537							    int                x,
538							    int                y,
539							    unsigned int       width,
540							    unsigned int       height);
541pixman_bool_t           pixman_region32_subtract           (pixman_region32_t *regD,
542							    pixman_region32_t *regM,
543							    pixman_region32_t *regS);
544pixman_bool_t           pixman_region32_inverse            (pixman_region32_t *newReg,
545							    pixman_region32_t *reg1,
546							    pixman_box32_t    *invRect);
547pixman_bool_t           pixman_region32_contains_point     (pixman_region32_t *region,
548							    int                x,
549							    int                y,
550							    pixman_box32_t    *box);
551pixman_region_overlap_t pixman_region32_contains_rectangle (pixman_region32_t *region,
552							    pixman_box32_t    *prect);
553pixman_bool_t           pixman_region32_not_empty          (pixman_region32_t *region);
554pixman_box32_t *        pixman_region32_extents            (pixman_region32_t *region);
555int                     pixman_region32_n_rects            (pixman_region32_t *region);
556pixman_box32_t *        pixman_region32_rectangles         (pixman_region32_t *region,
557							    int               *n_rects);
558pixman_bool_t           pixman_region32_equal              (pixman_region32_t *region1,
559							    pixman_region32_t *region2);
560pixman_bool_t           pixman_region32_selfcheck          (pixman_region32_t *region);
561void                    pixman_region32_reset              (pixman_region32_t *region,
562							    pixman_box32_t    *box);
563
564
565/* Copy / Fill / Misc */
566pixman_bool_t pixman_blt                (uint32_t           *src_bits,
567					 uint32_t           *dst_bits,
568					 int                 src_stride,
569					 int                 dst_stride,
570					 int                 src_bpp,
571					 int                 dst_bpp,
572					 int                 src_x,
573					 int                 src_y,
574					 int                 dst_x,
575					 int                 dst_y,
576					 int                 width,
577					 int                 height);
578pixman_bool_t pixman_fill               (uint32_t           *bits,
579					 int                 stride,
580					 int                 bpp,
581					 int                 x,
582					 int                 y,
583					 int                 width,
584					 int                 height,
585					 uint32_t            _xor);
586
587int           pixman_version            (void);
588const char*   pixman_version_string     (void);
589
590/*
591 * Images
592 */
593typedef  union pixman_image		pixman_image_t;
594typedef struct pixman_indexed		pixman_indexed_t;
595typedef struct pixman_gradient_stop	pixman_gradient_stop_t;
596
597typedef uint32_t (* pixman_read_memory_func_t) (const void *src, int size);
598typedef void     (* pixman_write_memory_func_t) (void *dst, uint32_t value, int size);
599
600struct pixman_gradient_stop {
601    pixman_fixed_t x;
602    pixman_color_t color;
603};
604
605#define PIXMAN_MAX_INDEXED  256 /* XXX depth must be <= 8 */
606
607#if PIXMAN_MAX_INDEXED <= 256
608typedef uint8_t pixman_index_type;
609#endif
610
611struct pixman_indexed
612{
613    pixman_bool_t       color;
614    uint32_t		rgba[PIXMAN_MAX_INDEXED];
615    pixman_index_type	ent[32768];
616};
617
618/*
619 * While the protocol is generous in format support, the
620 * sample implementation allows only packed RGB and GBR
621 * representations for data to simplify software rendering,
622 */
623#define PIXMAN_FORMAT(bpp,type,a,r,g,b)	(((bpp) << 24) |  \
624					 ((type) << 16) | \
625					 ((a) << 12) |	  \
626					 ((r) << 8) |	  \
627					 ((g) << 4) |	  \
628					 ((b)))
629
630#define PIXMAN_FORMAT_BPP(f)	(((f) >> 24)       )
631#define PIXMAN_FORMAT_TYPE(f)	(((f) >> 16) & 0xff)
632#define PIXMAN_FORMAT_A(f)	(((f) >> 12) & 0x0f)
633#define PIXMAN_FORMAT_R(f)	(((f) >>  8) & 0x0f)
634#define PIXMAN_FORMAT_G(f)	(((f) >>  4) & 0x0f)
635#define PIXMAN_FORMAT_B(f)	(((f)      ) & 0x0f)
636#define PIXMAN_FORMAT_RGB(f)	(((f)      ) & 0xfff)
637#define PIXMAN_FORMAT_VIS(f)	(((f)      ) & 0xffff)
638#define PIXMAN_FORMAT_DEPTH(f)	(PIXMAN_FORMAT_A(f) +	\
639				 PIXMAN_FORMAT_R(f) +	\
640				 PIXMAN_FORMAT_G(f) +	\
641				 PIXMAN_FORMAT_B(f))
642
643#define PIXMAN_TYPE_OTHER	0
644#define PIXMAN_TYPE_A		1
645#define PIXMAN_TYPE_ARGB	2
646#define PIXMAN_TYPE_ABGR	3
647#define PIXMAN_TYPE_COLOR	4
648#define PIXMAN_TYPE_GRAY	5
649#define PIXMAN_TYPE_YUY2	6
650#define PIXMAN_TYPE_YV12	7
651#define PIXMAN_TYPE_BGRA	8
652
653#define PIXMAN_FORMAT_COLOR(f)				\
654	(PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_ARGB ||	\
655	 PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_ABGR ||	\
656	 PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_BGRA)
657
658/* 32bpp formats */
659typedef enum {
660    PIXMAN_a8r8g8b8 =	PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,8,8,8,8),
661    PIXMAN_x8r8g8b8 =	PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,0,8,8,8),
662    PIXMAN_a8b8g8r8 =	PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,8,8,8,8),
663    PIXMAN_x8b8g8r8 =	PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,0,8,8,8),
664    PIXMAN_b8g8r8a8 =	PIXMAN_FORMAT(32,PIXMAN_TYPE_BGRA,8,8,8,8),
665    PIXMAN_b8g8r8x8 =	PIXMAN_FORMAT(32,PIXMAN_TYPE_BGRA,0,8,8,8),
666    PIXMAN_x2b10g10r10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,0,10,10,10),
667    PIXMAN_a2b10g10r10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,2,10,10,10),
668
669/* 24bpp formats */
670    PIXMAN_r8g8b8 =	PIXMAN_FORMAT(24,PIXMAN_TYPE_ARGB,0,8,8,8),
671    PIXMAN_b8g8r8 =	PIXMAN_FORMAT(24,PIXMAN_TYPE_ABGR,0,8,8,8),
672
673/* 16bpp formats */
674    PIXMAN_r5g6b5 =	PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,0,5,6,5),
675    PIXMAN_b5g6r5 =	PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,0,5,6,5),
676
677    PIXMAN_a1r5g5b5 =	PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,1,5,5,5),
678    PIXMAN_x1r5g5b5 =	PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,0,5,5,5),
679    PIXMAN_a1b5g5r5 =	PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,1,5,5,5),
680    PIXMAN_x1b5g5r5 =	PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,0,5,5,5),
681    PIXMAN_a4r4g4b4 =	PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,4,4,4,4),
682    PIXMAN_x4r4g4b4 =	PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,0,4,4,4),
683    PIXMAN_a4b4g4r4 =	PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,4,4,4,4),
684    PIXMAN_x4b4g4r4 =	PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,0,4,4,4),
685
686/* 8bpp formats */
687    PIXMAN_a8 =		PIXMAN_FORMAT(8,PIXMAN_TYPE_A,8,0,0,0),
688    PIXMAN_r3g3b2 =	PIXMAN_FORMAT(8,PIXMAN_TYPE_ARGB,0,3,3,2),
689    PIXMAN_b2g3r3 =	PIXMAN_FORMAT(8,PIXMAN_TYPE_ABGR,0,3,3,2),
690    PIXMAN_a2r2g2b2 =	PIXMAN_FORMAT(8,PIXMAN_TYPE_ARGB,2,2,2,2),
691    PIXMAN_a2b2g2r2 =	PIXMAN_FORMAT(8,PIXMAN_TYPE_ABGR,2,2,2,2),
692
693    PIXMAN_c8 =		PIXMAN_FORMAT(8,PIXMAN_TYPE_COLOR,0,0,0,0),
694    PIXMAN_g8 =		PIXMAN_FORMAT(8,PIXMAN_TYPE_GRAY,0,0,0,0),
695
696    PIXMAN_x4a4 =	PIXMAN_FORMAT(8,PIXMAN_TYPE_A,4,0,0,0),
697
698    PIXMAN_x4c4 =	PIXMAN_FORMAT(8,PIXMAN_TYPE_COLOR,0,0,0,0),
699    PIXMAN_x4g4 =	PIXMAN_FORMAT(8,PIXMAN_TYPE_GRAY,0,0,0,0),
700
701/* 4bpp formats */
702    PIXMAN_a4 =		PIXMAN_FORMAT(4,PIXMAN_TYPE_A,4,0,0,0),
703    PIXMAN_r1g2b1 =	PIXMAN_FORMAT(4,PIXMAN_TYPE_ARGB,0,1,2,1),
704    PIXMAN_b1g2r1 =	PIXMAN_FORMAT(4,PIXMAN_TYPE_ABGR,0,1,2,1),
705    PIXMAN_a1r1g1b1 =	PIXMAN_FORMAT(4,PIXMAN_TYPE_ARGB,1,1,1,1),
706    PIXMAN_a1b1g1r1 =	PIXMAN_FORMAT(4,PIXMAN_TYPE_ABGR,1,1,1,1),
707
708    PIXMAN_c4 =		PIXMAN_FORMAT(4,PIXMAN_TYPE_COLOR,0,0,0,0),
709    PIXMAN_g4 =		PIXMAN_FORMAT(4,PIXMAN_TYPE_GRAY,0,0,0,0),
710
711/* 1bpp formats */
712    PIXMAN_a1 =		PIXMAN_FORMAT(1,PIXMAN_TYPE_A,1,0,0,0),
713
714    PIXMAN_g1 =		PIXMAN_FORMAT(1,PIXMAN_TYPE_GRAY,0,0,0,0),
715
716/* YUV formats */
717    PIXMAN_yuy2 =	PIXMAN_FORMAT(16,PIXMAN_TYPE_YUY2,0,0,0,0),
718    PIXMAN_yv12 =	PIXMAN_FORMAT(12,PIXMAN_TYPE_YV12,0,0,0,0)
719} pixman_format_code_t;
720
721/* Querying supported format values. */
722pixman_bool_t pixman_format_supported_destination (pixman_format_code_t format);
723pixman_bool_t pixman_format_supported_source      (pixman_format_code_t format);
724
725/* Constructors */
726pixman_image_t *pixman_image_create_solid_fill       (pixman_color_t               *color);
727pixman_image_t *pixman_image_create_linear_gradient  (pixman_point_fixed_t         *p1,
728						      pixman_point_fixed_t         *p2,
729						      const pixman_gradient_stop_t *stops,
730						      int                           n_stops);
731pixman_image_t *pixman_image_create_radial_gradient  (pixman_point_fixed_t         *inner,
732						      pixman_point_fixed_t         *outer,
733						      pixman_fixed_t                inner_radius,
734						      pixman_fixed_t                outer_radius,
735						      const pixman_gradient_stop_t *stops,
736						      int                           n_stops);
737pixman_image_t *pixman_image_create_conical_gradient (pixman_point_fixed_t         *center,
738						      pixman_fixed_t                angle,
739						      const pixman_gradient_stop_t *stops,
740						      int                           n_stops);
741pixman_image_t *pixman_image_create_bits             (pixman_format_code_t          format,
742						      int                           width,
743						      int                           height,
744						      uint32_t                     *bits,
745						      int                           rowstride_bytes);
746
747/* Destructor */
748pixman_image_t *pixman_image_ref                     (pixman_image_t               *image);
749pixman_bool_t   pixman_image_unref                   (pixman_image_t               *image);
750
751
752/* Set properties */
753pixman_bool_t   pixman_image_set_clip_region         (pixman_image_t               *image,
754						      pixman_region16_t            *region);
755pixman_bool_t   pixman_image_set_clip_region32       (pixman_image_t               *image,
756						      pixman_region32_t            *region);
757void		pixman_image_set_has_client_clip     (pixman_image_t               *image,
758						      pixman_bool_t		    clien_clip);
759pixman_bool_t   pixman_image_set_transform           (pixman_image_t               *image,
760						      const pixman_transform_t     *transform);
761void            pixman_image_set_repeat              (pixman_image_t               *image,
762						      pixman_repeat_t               repeat);
763pixman_bool_t   pixman_image_set_filter              (pixman_image_t               *image,
764						      pixman_filter_t               filter,
765						      const pixman_fixed_t         *filter_params,
766						      int                           n_filter_params);
767void		pixman_image_set_source_clipping     (pixman_image_t		   *image,
768						      pixman_bool_t                 source_clipping);
769void            pixman_image_set_alpha_map           (pixman_image_t               *image,
770						      pixman_image_t               *alpha_map,
771						      int16_t                       x,
772						      int16_t                       y);
773void            pixman_image_set_component_alpha     (pixman_image_t               *image,
774						      pixman_bool_t                 component_alpha);
775void		pixman_image_set_accessors	     (pixman_image_t		   *image,
776						      pixman_read_memory_func_t	    read_func,
777						      pixman_write_memory_func_t    write_func);
778void		pixman_image_set_indexed	     (pixman_image_t		   *image,
779						      const pixman_indexed_t	   *indexed);
780uint32_t       *pixman_image_get_data                (pixman_image_t               *image);
781int		pixman_image_get_width               (pixman_image_t               *image);
782int             pixman_image_get_height              (pixman_image_t               *image);
783int		pixman_image_get_stride              (pixman_image_t               *image); /* in bytes */
784int		pixman_image_get_depth               (pixman_image_t		   *image);
785pixman_bool_t	pixman_image_fill_rectangles	     (pixman_op_t		    op,
786						      pixman_image_t		   *image,
787						      pixman_color_t		   *color,
788						      int			    n_rects,
789						      const pixman_rectangle16_t   *rects);
790
791/* Composite */
792pixman_bool_t pixman_compute_composite_region (pixman_region16_t *pRegion,
793					       pixman_image_t    *pSrc,
794					       pixman_image_t    *pMask,
795					       pixman_image_t    *pDst,
796					       int16_t            xSrc,
797					       int16_t            ySrc,
798					       int16_t            xMask,
799					       int16_t            yMask,
800					       int16_t            xDst,
801					       int16_t            yDst,
802					       uint16_t           width,
803					       uint16_t           height);
804void          pixman_image_composite          (pixman_op_t        op,
805					       pixman_image_t    *src,
806					       pixman_image_t    *mask,
807					       pixman_image_t    *dest,
808					       int16_t            src_x,
809					       int16_t            src_y,
810					       int16_t            mask_x,
811					       int16_t            mask_y,
812					       int16_t            dest_x,
813					       int16_t            dest_y,
814					       uint16_t           width,
815					       uint16_t           height);
816
817/*
818 * Trapezoids
819 */
820typedef struct pixman_edge pixman_edge_t;
821typedef struct pixman_trapezoid pixman_trapezoid_t;
822typedef struct pixman_trap pixman_trap_t;
823typedef struct pixman_span_fix pixman_span_fix_t;
824
825/*
826 * An edge structure.  This represents a single polygon edge
827 * and can be quickly stepped across small or large gaps in the
828 * sample grid
829 */
830struct pixman_edge
831{
832    pixman_fixed_t	x;
833    pixman_fixed_t	e;
834    pixman_fixed_t   stepx;
835    pixman_fixed_t   signdx;
836    pixman_fixed_t   dy;
837    pixman_fixed_t   dx;
838
839    pixman_fixed_t   stepx_small;
840    pixman_fixed_t   stepx_big;
841    pixman_fixed_t   dx_small;
842    pixman_fixed_t   dx_big;
843};
844
845struct pixman_trapezoid
846{
847    pixman_fixed_t  top, bottom;
848    pixman_line_fixed_t	left, right;
849};
850
851
852/* whether 't' is a well defined not obviously empty trapezoid */
853#define pixman_trapezoid_valid(t)				\
854    ((t)->left.p1.y != (t)->left.p2.y &&			   \
855     (t)->right.p1.y != (t)->right.p2.y &&			   \
856     (int) ((t)->bottom - (t)->top) > 0)
857
858struct pixman_span_fix
859{
860    pixman_fixed_t	l, r, y;
861};
862
863struct pixman_trap
864{
865    pixman_span_fix_t	top, bot;
866};
867
868pixman_fixed_t pixman_sample_ceil_y        (pixman_fixed_t             y,
869					    int                        bpp);
870pixman_fixed_t pixman_sample_floor_y       (pixman_fixed_t             y,
871					    int                        bpp);
872void           pixman_edge_step            (pixman_edge_t             *e,
873					    int                        n);
874void           pixman_edge_init            (pixman_edge_t             *e,
875					    int                        bpp,
876					    pixman_fixed_t             y_start,
877					    pixman_fixed_t             x_top,
878					    pixman_fixed_t             y_top,
879					    pixman_fixed_t             x_bot,
880					    pixman_fixed_t             y_bot);
881void           pixman_line_fixed_edge_init (pixman_edge_t             *e,
882					    int                        bpp,
883					    pixman_fixed_t             y,
884					    const pixman_line_fixed_t *line,
885					    int                        x_off,
886					    int                        y_off);
887void           pixman_rasterize_edges      (pixman_image_t            *image,
888					    pixman_edge_t             *l,
889					    pixman_edge_t             *r,
890					    pixman_fixed_t             t,
891					    pixman_fixed_t             b);
892void           pixman_add_traps            (pixman_image_t            *image,
893					    int16_t                    x_off,
894					    int16_t                    y_off,
895					    int                        ntrap,
896					    pixman_trap_t             *traps);
897void           pixman_add_trapezoids       (pixman_image_t            *image,
898					    int16_t                    x_off,
899					    int                        y_off,
900					    int                        ntraps,
901					    const pixman_trapezoid_t  *traps);
902void           pixman_rasterize_trapezoid  (pixman_image_t            *image,
903					    const pixman_trapezoid_t  *trap,
904					    int                        x_off,
905					    int                        y_off);
906
907
908#endif /* PIXMAN_H__ */
909