pixman.h revision d0321353
1b4b94579Smrg/***********************************************************
2b4b94579Smrg
3b4b94579SmrgCopyright 1987, 1998  The Open Group
4b4b94579Smrg
5b4b94579SmrgPermission to use, copy, modify, distribute, and sell this software and its
6b4b94579Smrgdocumentation for any purpose is hereby granted without fee, provided that
7b4b94579Smrgthe above copyright notice appear in all copies and that both that
8b4b94579Smrgcopyright notice and this permission notice appear in supporting
9b4b94579Smrgdocumentation.
10b4b94579Smrg
11b4b94579SmrgThe above copyright notice and this permission notice shall be included in
12b4b94579Smrgall copies or substantial portions of the Software.
13b4b94579Smrg
14b4b94579SmrgTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15b4b94579SmrgIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16b4b94579SmrgFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
17b4b94579SmrgOPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
18b4b94579SmrgAN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
19b4b94579SmrgCONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
20b4b94579Smrg
21b4b94579SmrgExcept as contained in this notice, the name of The Open Group shall not be
22b4b94579Smrgused in advertising or otherwise to promote the sale, use or other dealings
23b4b94579Smrgin this Software without prior written authorization from The Open Group.
24b4b94579Smrg
25b4b94579SmrgCopyright 1987 by Digital Equipment Corporation, Maynard, Massachusetts.
26b4b94579Smrg
27b4b94579Smrg                        All Rights Reserved
28b4b94579Smrg
29b4b94579SmrgPermission to use, copy, modify, and distribute this software and its
30b4b94579Smrgdocumentation for any purpose and without fee is hereby granted,
31b4b94579Smrgprovided that the above copyright notice appear in all copies and that
32b4b94579Smrgboth that copyright notice and this permission notice appear in
33b4b94579Smrgsupporting documentation, and that the name of Digital not be
34b4b94579Smrgused in advertising or publicity pertaining to distribution of the
35b4b94579Smrgsoftware without specific, written prior permission.
36b4b94579Smrg
37b4b94579SmrgDIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
38b4b94579SmrgALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
39b4b94579SmrgDIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
40b4b94579SmrgANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
41b4b94579SmrgWHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
42b4b94579SmrgARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
43b4b94579SmrgSOFTWARE.
44b4b94579Smrg
45b4b94579Smrg******************************************************************/
46b4b94579Smrg/*
47b4b94579Smrg * Copyright © 1998, 2004 Keith Packard
48b4b94579Smrg * Copyright   2007 Red Hat, Inc.
49b4b94579Smrg *
50b4b94579Smrg * Permission to use, copy, modify, distribute, and sell this software and its
51b4b94579Smrg * documentation for any purpose is hereby granted without fee, provided that
52b4b94579Smrg * the above copyright notice appear in all copies and that both that
53b4b94579Smrg * copyright notice and this permission notice appear in supporting
54b4b94579Smrg * documentation, and that the name of Keith Packard not be used in
55b4b94579Smrg * advertising or publicity pertaining to distribution of the software without
56b4b94579Smrg * specific, written prior permission.  Keith Packard makes no
57b4b94579Smrg * representations about the suitability of this software for any purpose.  It
58b4b94579Smrg * is provided "as is" without express or implied warranty.
59b4b94579Smrg *
60b4b94579Smrg * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
61b4b94579Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
62b4b94579Smrg * EVENT SHALL KEITH PACKARD BE LIABLE FOR ANY SPECIAL, INDIRECT OR
63b4b94579Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
64b4b94579Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
65b4b94579Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
66b4b94579Smrg * PERFORMANCE OF THIS SOFTWARE.
67b4b94579Smrg */
68b4b94579Smrg
69b4b94579Smrg#ifndef PIXMAN_H__
70b4b94579Smrg#define PIXMAN_H__
71b4b94579Smrg
72b4b94579Smrg#include <pixman-version.h>
73b4b94579Smrg
74b4b94579Smrg/*
75b4b94579Smrg * Standard integers
76b4b94579Smrg */
77317c648bSmrg#if defined (_SVR4) || defined (SVR4) || defined (__OpenBSD__) || defined (_sgi) || defined (__sun) || defined (sun) || defined (__digital__)
78b4b94579Smrg#  include <inttypes.h>
79b4b94579Smrg#elif defined (_MSC_VER)
80b4b94579Smrgtypedef __int8 int8_t;
81b4b94579Smrgtypedef unsigned __int8 uint8_t;
82b4b94579Smrgtypedef __int16 int16_t;
83b4b94579Smrgtypedef unsigned __int16 uint16_t;
84b4b94579Smrgtypedef __int32 int32_t;
85b4b94579Smrgtypedef unsigned __int32 uint32_t;
86b4b94579Smrgtypedef __int64 int64_t;
87b4b94579Smrgtypedef unsigned __int64 uint64_t;
8827693ee9Sveego#elif defined (_AIX)
8927693ee9Sveego#  include <sys/inttypes.h>
90b4b94579Smrg#else
91b4b94579Smrg#  include <stdint.h>
92b4b94579Smrg#endif
93b4b94579Smrg
94b4b94579Smrg/*
95b4b94579Smrg * Boolean
96b4b94579Smrg */
97b4b94579Smrgtypedef int pixman_bool_t;
98b4b94579Smrg
99b4b94579Smrg/*
100b4b94579Smrg * Fixpoint numbers
101b4b94579Smrg */
102b4b94579Smrgtypedef int64_t			pixman_fixed_32_32_t;
103b4b94579Smrgtypedef pixman_fixed_32_32_t	pixman_fixed_48_16_t;
104b4b94579Smrgtypedef uint32_t		pixman_fixed_1_31_t;
105b4b94579Smrgtypedef uint32_t		pixman_fixed_1_16_t;
106b4b94579Smrgtypedef int32_t			pixman_fixed_16_16_t;
107b4b94579Smrgtypedef pixman_fixed_16_16_t	pixman_fixed_t;
108b4b94579Smrg
109b4b94579Smrg#define pixman_fixed_e			((pixman_fixed_t) 1)
110b4b94579Smrg#define pixman_fixed_1			(pixman_int_to_fixed(1))
111b4b94579Smrg#define pixman_fixed_1_minus_e		(pixman_fixed_1 - pixman_fixed_e)
112b4b94579Smrg#define pixman_fixed_to_int(f)		((int) ((f) >> 16))
113b4b94579Smrg#define pixman_int_to_fixed(i)		((pixman_fixed_t) ((i) << 16))
114b4b94579Smrg#define pixman_fixed_to_double(f)	(double) ((f) / (double) pixman_fixed_1)
115b4b94579Smrg#define pixman_double_to_fixed(d)	((pixman_fixed_t) ((d) * 65536.0))
116b4b94579Smrg#define pixman_fixed_frac(f)		((f) & pixman_fixed_1_minus_e)
117b4b94579Smrg#define pixman_fixed_floor(f)		((f) & ~pixman_fixed_1_minus_e)
118b4b94579Smrg#define pixman_fixed_ceil(f)		pixman_fixed_floor ((f) + pixman_fixed_1_minus_e)
119b4b94579Smrg#define pixman_fixed_fraction(f)	((f) & pixman_fixed_1_minus_e)
120b4b94579Smrg#define pixman_fixed_mod_2(f)		((f) & (pixman_fixed1 | pixman_fixed_1_minus_e))
121b4b94579Smrg#define pixman_max_fixed_48_16		((pixman_fixed_48_16_t) 0x7fffffff)
122b4b94579Smrg#define pixman_min_fixed_48_16		(-((pixman_fixed_48_16_t) 1 << 31))
123b4b94579Smrg
124b4b94579Smrg/*
125b4b94579Smrg * Misc structs
126b4b94579Smrg */
127b4b94579Smrgtypedef struct pixman_color pixman_color_t;
128b4b94579Smrgtypedef struct pixman_point_fixed pixman_point_fixed_t;
129b4b94579Smrgtypedef struct pixman_line_fixed pixman_line_fixed_t;
130b4b94579Smrgtypedef struct pixman_vector pixman_vector_t;
131b4b94579Smrgtypedef struct pixman_transform pixman_transform_t;
132b4b94579Smrg
133b4b94579Smrgstruct pixman_color
134b4b94579Smrg{
135b4b94579Smrg    uint16_t	red;
136b4b94579Smrg    uint16_t    green;
137b4b94579Smrg    uint16_t    blue;
138b4b94579Smrg    uint16_t    alpha;
139b4b94579Smrg};
140b4b94579Smrg
141b4b94579Smrgstruct pixman_point_fixed
142b4b94579Smrg{
143b4b94579Smrg    pixman_fixed_t	x;
144b4b94579Smrg    pixman_fixed_t	y;
145b4b94579Smrg};
146b4b94579Smrg
147b4b94579Smrgstruct pixman_line_fixed
148b4b94579Smrg{
149b4b94579Smrg    pixman_point_fixed_t	p1, p2;
150b4b94579Smrg};
151b4b94579Smrg
152317c648bSmrg/*
153317c648bSmrg * Fixed point matrices
154317c648bSmrg */
155317c648bSmrg
156b4b94579Smrgstruct pixman_vector
157b4b94579Smrg{
158b4b94579Smrg    pixman_fixed_t	vector[3];
159b4b94579Smrg};
160b4b94579Smrg
161b4b94579Smrgstruct pixman_transform
162b4b94579Smrg{
163b4b94579Smrg    pixman_fixed_t	matrix[3][3];
164b4b94579Smrg};
165b4b94579Smrg
166317c648bSmrg/* forward declaration (sorry) */
167317c648bSmrgstruct pixman_box16;
168317c648bSmrg
169d0321353Smrgvoid          pixman_transform_init_identity    (struct pixman_transform       *matrix);
170d0321353Smrgpixman_bool_t pixman_transform_point_3d         (const struct pixman_transform *transform,
171d0321353Smrg						 struct pixman_vector          *vector);
172d0321353Smrgpixman_bool_t pixman_transform_point            (const struct pixman_transform *transform,
173d0321353Smrg						 struct pixman_vector          *vector);
174d0321353Smrgpixman_bool_t pixman_transform_multiply         (struct pixman_transform       *dst,
175d0321353Smrg						 const struct pixman_transform *l,
176d0321353Smrg						 const struct pixman_transform *r);
177d0321353Smrgvoid          pixman_transform_init_scale       (struct pixman_transform       *t,
178d0321353Smrg						 pixman_fixed_t                 sx,
179d0321353Smrg						 pixman_fixed_t                 sy);
180d0321353Smrgpixman_bool_t pixman_transform_scale            (struct pixman_transform       *forward,
181d0321353Smrg						 struct pixman_transform       *reverse,
182d0321353Smrg						 pixman_fixed_t                 sx,
183d0321353Smrg						 pixman_fixed_t                 sy);
184d0321353Smrgvoid          pixman_transform_init_rotate      (struct pixman_transform       *t,
185d0321353Smrg						 pixman_fixed_t                 cos,
186d0321353Smrg						 pixman_fixed_t                 sin);
187d0321353Smrgpixman_bool_t pixman_transform_rotate           (struct pixman_transform       *forward,
188d0321353Smrg						 struct pixman_transform       *reverse,
189d0321353Smrg						 pixman_fixed_t                 c,
190d0321353Smrg						 pixman_fixed_t                 s);
191d0321353Smrgvoid          pixman_transform_init_translate   (struct pixman_transform       *t,
192d0321353Smrg						 pixman_fixed_t                 tx,
193d0321353Smrg						 pixman_fixed_t                 ty);
194d0321353Smrgpixman_bool_t pixman_transform_translate        (struct pixman_transform       *forward,
195d0321353Smrg						 struct pixman_transform       *reverse,
196d0321353Smrg						 pixman_fixed_t                 tx,
197d0321353Smrg						 pixman_fixed_t                 ty);
198d0321353Smrgpixman_bool_t pixman_transform_bounds           (const struct pixman_transform *matrix,
199d0321353Smrg						 struct pixman_box16           *b);
200d0321353Smrgpixman_bool_t pixman_transform_invert           (struct pixman_transform       *dst,
201d0321353Smrg						 const struct pixman_transform *src);
202d0321353Smrgpixman_bool_t pixman_transform_is_identity      (const struct pixman_transform *t);
203d0321353Smrgpixman_bool_t pixman_transform_is_scale         (const struct pixman_transform *t);
204d0321353Smrgpixman_bool_t pixman_transform_is_int_translate (const struct pixman_transform *t);
205d0321353Smrgpixman_bool_t pixman_transform_is_inverse       (const struct pixman_transform *a,
206d0321353Smrg						 const struct pixman_transform *b);
207317c648bSmrg
208317c648bSmrg/*
209317c648bSmrg * Floating point matrices
210317c648bSmrg */
211d0321353Smrgstruct pixman_f_vector
212d0321353Smrg{
213317c648bSmrg    double  v[3];
214317c648bSmrg};
215317c648bSmrg
216d0321353Smrgstruct pixman_f_transform
217d0321353Smrg{
218317c648bSmrg    double  m[3][3];
219317c648bSmrg};
220317c648bSmrg
221d0321353Smrgpixman_bool_t pixman_transform_from_pixman_f_transform (struct pixman_transform         *t,
222d0321353Smrg							const struct pixman_f_transform *ft);
223d0321353Smrgvoid          pixman_f_transform_from_pixman_transform (struct pixman_f_transform       *ft,
224d0321353Smrg							const struct pixman_transform   *t);
225d0321353Smrgpixman_bool_t pixman_transform_from_pixman_f_transform (struct pixman_transform         *t,
226d0321353Smrg							const struct pixman_f_transform *ft);
227d0321353Smrgpixman_bool_t pixman_f_transform_invert                (struct pixman_f_transform       *dst,
228d0321353Smrg							const struct pixman_f_transform *src);
229d0321353Smrgpixman_bool_t pixman_f_transform_point                 (const struct pixman_f_transform *t,
230d0321353Smrg							struct pixman_f_vector          *v);
231d0321353Smrgvoid          pixman_f_transform_point_3d              (const struct pixman_f_transform *t,
232d0321353Smrg							struct pixman_f_vector          *v);
233d0321353Smrgvoid          pixman_f_transform_multiply              (struct pixman_f_transform       *dst,
234d0321353Smrg							const struct pixman_f_transform *l,
235d0321353Smrg							const struct pixman_f_transform *r);
236d0321353Smrgvoid          pixman_f_transform_init_scale            (struct pixman_f_transform       *t,
237d0321353Smrg							double                           sx,
238d0321353Smrg							double                           sy);
239d0321353Smrgpixman_bool_t pixman_f_transform_scale                 (struct pixman_f_transform       *forward,
240d0321353Smrg							struct pixman_f_transform       *reverse,
241d0321353Smrg							double                           sx,
242d0321353Smrg							double                           sy);
243d0321353Smrgvoid          pixman_f_transform_init_rotate           (struct pixman_f_transform       *t,
244d0321353Smrg							double                           cos,
245d0321353Smrg							double                           sin);
246d0321353Smrgpixman_bool_t pixman_f_transform_rotate                (struct pixman_f_transform       *forward,
247d0321353Smrg							struct pixman_f_transform       *reverse,
248d0321353Smrg							double                           c,
249d0321353Smrg							double                           s);
250d0321353Smrgvoid          pixman_f_transform_init_translate        (struct pixman_f_transform       *t,
251d0321353Smrg							double                           tx,
252d0321353Smrg							double                           ty);
253d0321353Smrgpixman_bool_t pixman_f_transform_translate             (struct pixman_f_transform       *forward,
254d0321353Smrg							struct pixman_f_transform       *reverse,
255d0321353Smrg							double                           tx,
256d0321353Smrg							double                           ty);
257d0321353Smrgpixman_bool_t pixman_f_transform_bounds                (const struct pixman_f_transform *t,
258d0321353Smrg							struct pixman_box16             *b);
259d0321353Smrgvoid          pixman_f_transform_init_identity         (struct pixman_f_transform       *t);
260317c648bSmrg
261b4b94579Smrgtypedef enum
262b4b94579Smrg{
263b4b94579Smrg    PIXMAN_REPEAT_NONE,
264b4b94579Smrg    PIXMAN_REPEAT_NORMAL,
265b4b94579Smrg    PIXMAN_REPEAT_PAD,
266b4b94579Smrg    PIXMAN_REPEAT_REFLECT
267b4b94579Smrg} pixman_repeat_t;
268b4b94579Smrg
269b4b94579Smrgtypedef enum
270b4b94579Smrg{
271b4b94579Smrg    PIXMAN_FILTER_FAST,
272b4b94579Smrg    PIXMAN_FILTER_GOOD,
273b4b94579Smrg    PIXMAN_FILTER_BEST,
274b4b94579Smrg    PIXMAN_FILTER_NEAREST,
275b4b94579Smrg    PIXMAN_FILTER_BILINEAR,
276b4b94579Smrg    PIXMAN_FILTER_CONVOLUTION
277b4b94579Smrg} pixman_filter_t;
278b4b94579Smrg
279b4b94579Smrgtypedef enum
280b4b94579Smrg{
281b4b94579Smrg    PIXMAN_OP_CLEAR			= 0x00,
282b4b94579Smrg    PIXMAN_OP_SRC			= 0x01,
283b4b94579Smrg    PIXMAN_OP_DST			= 0x02,
284b4b94579Smrg    PIXMAN_OP_OVER			= 0x03,
285b4b94579Smrg    PIXMAN_OP_OVER_REVERSE		= 0x04,
286b4b94579Smrg    PIXMAN_OP_IN			= 0x05,
287b4b94579Smrg    PIXMAN_OP_IN_REVERSE		= 0x06,
288b4b94579Smrg    PIXMAN_OP_OUT			= 0x07,
289b4b94579Smrg    PIXMAN_OP_OUT_REVERSE		= 0x08,
290b4b94579Smrg    PIXMAN_OP_ATOP			= 0x09,
291b4b94579Smrg    PIXMAN_OP_ATOP_REVERSE		= 0x0a,
292b4b94579Smrg    PIXMAN_OP_XOR			= 0x0b,
293b4b94579Smrg    PIXMAN_OP_ADD			= 0x0c,
294b4b94579Smrg    PIXMAN_OP_SATURATE			= 0x0d,
295b4b94579Smrg
296b4b94579Smrg    PIXMAN_OP_DISJOINT_CLEAR		= 0x10,
297b4b94579Smrg    PIXMAN_OP_DISJOINT_SRC		= 0x11,
298b4b94579Smrg    PIXMAN_OP_DISJOINT_DST		= 0x12,
299b4b94579Smrg    PIXMAN_OP_DISJOINT_OVER		= 0x13,
300b4b94579Smrg    PIXMAN_OP_DISJOINT_OVER_REVERSE	= 0x14,
301b4b94579Smrg    PIXMAN_OP_DISJOINT_IN		= 0x15,
302b4b94579Smrg    PIXMAN_OP_DISJOINT_IN_REVERSE	= 0x16,
303b4b94579Smrg    PIXMAN_OP_DISJOINT_OUT		= 0x17,
304b4b94579Smrg    PIXMAN_OP_DISJOINT_OUT_REVERSE	= 0x18,
305b4b94579Smrg    PIXMAN_OP_DISJOINT_ATOP		= 0x19,
306b4b94579Smrg    PIXMAN_OP_DISJOINT_ATOP_REVERSE	= 0x1a,
307b4b94579Smrg    PIXMAN_OP_DISJOINT_XOR		= 0x1b,
308b4b94579Smrg
309b4b94579Smrg    PIXMAN_OP_CONJOINT_CLEAR		= 0x20,
310b4b94579Smrg    PIXMAN_OP_CONJOINT_SRC		= 0x21,
311b4b94579Smrg    PIXMAN_OP_CONJOINT_DST		= 0x22,
312b4b94579Smrg    PIXMAN_OP_CONJOINT_OVER		= 0x23,
313b4b94579Smrg    PIXMAN_OP_CONJOINT_OVER_REVERSE	= 0x24,
314b4b94579Smrg    PIXMAN_OP_CONJOINT_IN		= 0x25,
315b4b94579Smrg    PIXMAN_OP_CONJOINT_IN_REVERSE	= 0x26,
316b4b94579Smrg    PIXMAN_OP_CONJOINT_OUT		= 0x27,
317b4b94579Smrg    PIXMAN_OP_CONJOINT_OUT_REVERSE	= 0x28,
318b4b94579Smrg    PIXMAN_OP_CONJOINT_ATOP		= 0x29,
319b4b94579Smrg    PIXMAN_OP_CONJOINT_ATOP_REVERSE	= 0x2a,
320b4b94579Smrg    PIXMAN_OP_CONJOINT_XOR		= 0x2b,
321b4b94579Smrg
322dc259aabSmrg    PIXMAN_OP_MULTIPLY                  = 0x30,
323dc259aabSmrg    PIXMAN_OP_SCREEN                    = 0x31,
324dc259aabSmrg    PIXMAN_OP_OVERLAY                   = 0x32,
325dc259aabSmrg    PIXMAN_OP_DARKEN                    = 0x33,
326dc259aabSmrg    PIXMAN_OP_LIGHTEN                   = 0x34,
327dc259aabSmrg    PIXMAN_OP_COLOR_DODGE               = 0x35,
328dc259aabSmrg    PIXMAN_OP_COLOR_BURN                = 0x36,
329dc259aabSmrg    PIXMAN_OP_HARD_LIGHT                = 0x37,
330dc259aabSmrg    PIXMAN_OP_SOFT_LIGHT                = 0x38,
331dc259aabSmrg    PIXMAN_OP_DIFFERENCE                = 0x39,
332dc259aabSmrg    PIXMAN_OP_EXCLUSION                 = 0x3a,
333dc259aabSmrg    PIXMAN_OP_HSL_HUE			= 0x3b,
334dc259aabSmrg    PIXMAN_OP_HSL_SATURATION		= 0x3c,
335dc259aabSmrg    PIXMAN_OP_HSL_COLOR			= 0x3d,
336dc259aabSmrg    PIXMAN_OP_HSL_LUMINOSITY		= 0x3e,
337dc259aabSmrg
338317c648bSmrg    PIXMAN_OP_NONE,
339317c648bSmrg    PIXMAN_OP_LAST = PIXMAN_OP_NONE
340b4b94579Smrg} pixman_op_t;
341b4b94579Smrg
342b4b94579Smrg/*
343b4b94579Smrg * Regions
344b4b94579Smrg */
345b4b94579Smrgtypedef struct pixman_region16_data	pixman_region16_data_t;
346b4b94579Smrgtypedef struct pixman_box16		pixman_box16_t;
347b4b94579Smrgtypedef struct pixman_rectangle16	pixman_rectangle16_t;
348b4b94579Smrgtypedef struct pixman_region16		pixman_region16_t;
349b4b94579Smrg
350b4b94579Smrgstruct pixman_region16_data {
351b4b94579Smrg    long		size;
352b4b94579Smrg    long		numRects;
353b4b94579Smrg/*  pixman_box16_t	rects[size];   in memory but not explicitly declared */
354b4b94579Smrg};
355b4b94579Smrg
356b4b94579Smrgstruct pixman_rectangle16
357b4b94579Smrg{
358d0321353Smrg    int16_t	x, y;
359d0321353Smrg    uint16_t	width, height;
360b4b94579Smrg};
361b4b94579Smrg
362b4b94579Smrgstruct pixman_box16
363b4b94579Smrg{
364b4b94579Smrg    int16_t x1, y1, x2, y2;
365b4b94579Smrg};
366b4b94579Smrg
367b4b94579Smrgstruct pixman_region16
368b4b94579Smrg{
369b4b94579Smrg    pixman_box16_t          extents;
370d0321353Smrg    pixman_region16_data_t *data;
371b4b94579Smrg};
372b4b94579Smrg
373b4b94579Smrgtypedef enum
374b4b94579Smrg{
375b4b94579Smrg    PIXMAN_REGION_OUT,
376b4b94579Smrg    PIXMAN_REGION_IN,
377b4b94579Smrg    PIXMAN_REGION_PART
378b4b94579Smrg} pixman_region_overlap_t;
379b4b94579Smrg
380d0321353Smrg/* This function exists only to make it possible to preserve
381d0321353Smrg * the X ABI - it should go away at first opportunity.
382b4b94579Smrg */
383d0321353Smrgvoid pixman_region_set_static_pointers (pixman_box16_t         *empty_box,
384d0321353Smrg					pixman_region16_data_t *empty_data,
385d0321353Smrg					pixman_region16_data_t *broken_data);
386b4b94579Smrg
387b4b94579Smrg/* creation/destruction */
388d0321353Smrgvoid                    pixman_region_init               (pixman_region16_t *region);
389d0321353Smrgvoid                    pixman_region_init_rect          (pixman_region16_t *region,
390d0321353Smrg							  int                x,
391d0321353Smrg							  int                y,
392d0321353Smrg							  unsigned int       width,
393d0321353Smrg							  unsigned int       height);
394d0321353Smrgpixman_bool_t           pixman_region_init_rects         (pixman_region16_t *region,
395d0321353Smrg							  pixman_box16_t    *boxes,
396d0321353Smrg							  int                count);
397d0321353Smrgvoid                    pixman_region_init_with_extents  (pixman_region16_t *region,
398d0321353Smrg							  pixman_box16_t    *extents);
399d0321353Smrgvoid                    pixman_region_fini               (pixman_region16_t *region);
400b4b94579Smrg
401b4b94579Smrg
402b4b94579Smrg
403d0321353Smrg/* manipulation */
404d0321353Smrgvoid                    pixman_region_translate          (pixman_region16_t *region,
405d0321353Smrg							  int                x,
406d0321353Smrg							  int                y);
407d0321353Smrgpixman_bool_t           pixman_region_copy               (pixman_region16_t *dest,
408d0321353Smrg							  pixman_region16_t *source);
409d0321353Smrgpixman_bool_t           pixman_region_intersect          (pixman_region16_t *new_reg,
410d0321353Smrg							  pixman_region16_t *reg1,
411d0321353Smrg							  pixman_region16_t *reg2);
412d0321353Smrgpixman_bool_t           pixman_region_union              (pixman_region16_t *new_reg,
413d0321353Smrg							  pixman_region16_t *reg1,
414d0321353Smrg							  pixman_region16_t *reg2);
415d0321353Smrgpixman_bool_t           pixman_region_union_rect         (pixman_region16_t *dest,
416d0321353Smrg							  pixman_region16_t *source,
417d0321353Smrg							  int                x,
418d0321353Smrg							  int                y,
419d0321353Smrg							  unsigned int       width,
420d0321353Smrg							  unsigned int       height);
421d0321353Smrgpixman_bool_t           pixman_region_subtract           (pixman_region16_t *reg_d,
422d0321353Smrg							  pixman_region16_t *reg_m,
423d0321353Smrg							  pixman_region16_t *reg_s);
424d0321353Smrgpixman_bool_t           pixman_region_inverse            (pixman_region16_t *new_reg,
425d0321353Smrg							  pixman_region16_t *reg1,
426d0321353Smrg							  pixman_box16_t    *inv_rect);
427d0321353Smrgpixman_bool_t           pixman_region_contains_point     (pixman_region16_t *region,
428d0321353Smrg							  int                x,
429d0321353Smrg							  int                y,
430d0321353Smrg							  pixman_box16_t    *box);
431d0321353Smrgpixman_region_overlap_t pixman_region_contains_rectangle (pixman_region16_t *pixman_region16_t,
432d0321353Smrg							  pixman_box16_t    *prect);
433d0321353Smrgpixman_bool_t           pixman_region_not_empty          (pixman_region16_t *region);
434d0321353Smrgpixman_box16_t *        pixman_region_extents            (pixman_region16_t *region);
435d0321353Smrgint                     pixman_region_n_rects            (pixman_region16_t *region);
436d0321353Smrgpixman_box16_t *        pixman_region_rectangles         (pixman_region16_t *region,
437d0321353Smrg							  int               *n_rects);
438d0321353Smrgpixman_bool_t           pixman_region_equal              (pixman_region16_t *region1,
439d0321353Smrg							  pixman_region16_t *region2);
440d0321353Smrgpixman_bool_t           pixman_region_selfcheck          (pixman_region16_t *region);
441d0321353Smrgvoid                    pixman_region_reset              (pixman_region16_t *region,
442d0321353Smrg							  pixman_box16_t    *box);
443b4b94579Smrg/*
444b4b94579Smrg * 32 bit regions
445b4b94579Smrg */
446b4b94579Smrgtypedef struct pixman_region32_data	pixman_region32_data_t;
447b4b94579Smrgtypedef struct pixman_box32		pixman_box32_t;
448b4b94579Smrgtypedef struct pixman_rectangle32	pixman_rectangle32_t;
449b4b94579Smrgtypedef struct pixman_region32		pixman_region32_t;
450b4b94579Smrg
451b4b94579Smrgstruct pixman_region32_data {
452b4b94579Smrg    long		size;
453b4b94579Smrg    long		numRects;
454b4b94579Smrg/*  pixman_box32_t	rects[size];   in memory but not explicitly declared */
455b4b94579Smrg};
456b4b94579Smrg
457b4b94579Smrgstruct pixman_rectangle32
458b4b94579Smrg{
459b4b94579Smrg    int32_t x, y;
460b4b94579Smrg    uint32_t width, height;
461b4b94579Smrg};
462b4b94579Smrg
463b4b94579Smrgstruct pixman_box32
464b4b94579Smrg{
465b4b94579Smrg    int32_t x1, y1, x2, y2;
466b4b94579Smrg};
467b4b94579Smrg
468b4b94579Smrgstruct pixman_region32
469b4b94579Smrg{
470b4b94579Smrg    pixman_box32_t          extents;
471b4b94579Smrg    pixman_region32_data_t  *data;
472b4b94579Smrg};
473b4b94579Smrg
474b4b94579Smrg/* creation/destruction */
475b4b94579Smrgvoid                    pixman_region32_init               (pixman_region32_t *region);
476b4b94579Smrgvoid                    pixman_region32_init_rect          (pixman_region32_t *region,
477b4b94579Smrg							    int                x,
478b4b94579Smrg							    int                y,
479b4b94579Smrg							    unsigned int       width,
480b4b94579Smrg							    unsigned int       height);
481b4b94579Smrgpixman_bool_t           pixman_region32_init_rects         (pixman_region32_t *region,
482b4b94579Smrg							    pixman_box32_t    *boxes,
483b4b94579Smrg							    int                count);
484b4b94579Smrgvoid                    pixman_region32_init_with_extents  (pixman_region32_t *region,
485b4b94579Smrg							    pixman_box32_t    *extents);
486b4b94579Smrgvoid                    pixman_region32_fini               (pixman_region32_t *region);
487b4b94579Smrg
488b4b94579Smrg
489b4b94579Smrg/* manipulation */
490b4b94579Smrgvoid                    pixman_region32_translate          (pixman_region32_t *region,
491b4b94579Smrg							    int                x,
492b4b94579Smrg							    int                y);
493b4b94579Smrgpixman_bool_t           pixman_region32_copy               (pixman_region32_t *dest,
494b4b94579Smrg							    pixman_region32_t *source);
495d0321353Smrgpixman_bool_t           pixman_region32_intersect          (pixman_region32_t *new_reg,
496b4b94579Smrg							    pixman_region32_t *reg1,
497b4b94579Smrg							    pixman_region32_t *reg2);
498d0321353Smrgpixman_bool_t           pixman_region32_union              (pixman_region32_t *new_reg,
499b4b94579Smrg							    pixman_region32_t *reg1,
500b4b94579Smrg							    pixman_region32_t *reg2);
501b4b94579Smrgpixman_bool_t           pixman_region32_union_rect         (pixman_region32_t *dest,
502b4b94579Smrg							    pixman_region32_t *source,
503b4b94579Smrg							    int                x,
504b4b94579Smrg							    int                y,
505b4b94579Smrg							    unsigned int       width,
506b4b94579Smrg							    unsigned int       height);
507d0321353Smrgpixman_bool_t           pixman_region32_subtract           (pixman_region32_t *reg_d,
508d0321353Smrg							    pixman_region32_t *reg_m,
509d0321353Smrg							    pixman_region32_t *reg_s);
510d0321353Smrgpixman_bool_t           pixman_region32_inverse            (pixman_region32_t *new_reg,
511b4b94579Smrg							    pixman_region32_t *reg1,
512d0321353Smrg							    pixman_box32_t    *inv_rect);
513b4b94579Smrgpixman_bool_t           pixman_region32_contains_point     (pixman_region32_t *region,
514b4b94579Smrg							    int                x,
515b4b94579Smrg							    int                y,
516b4b94579Smrg							    pixman_box32_t    *box);
517b4b94579Smrgpixman_region_overlap_t pixman_region32_contains_rectangle (pixman_region32_t *region,
518b4b94579Smrg							    pixman_box32_t    *prect);
519b4b94579Smrgpixman_bool_t           pixman_region32_not_empty          (pixman_region32_t *region);
520b4b94579Smrgpixman_box32_t *        pixman_region32_extents            (pixman_region32_t *region);
521b4b94579Smrgint                     pixman_region32_n_rects            (pixman_region32_t *region);
522b4b94579Smrgpixman_box32_t *        pixman_region32_rectangles         (pixman_region32_t *region,
523b4b94579Smrg							    int               *n_rects);
524b4b94579Smrgpixman_bool_t           pixman_region32_equal              (pixman_region32_t *region1,
525b4b94579Smrg							    pixman_region32_t *region2);
526b4b94579Smrgpixman_bool_t           pixman_region32_selfcheck          (pixman_region32_t *region);
527b4b94579Smrgvoid                    pixman_region32_reset              (pixman_region32_t *region,
528b4b94579Smrg							    pixman_box32_t    *box);
529b4b94579Smrg
530b4b94579Smrg
531b4b94579Smrg/* Copy / Fill / Misc */
532b4b94579Smrgpixman_bool_t pixman_blt                (uint32_t           *src_bits,
533b4b94579Smrg					 uint32_t           *dst_bits,
534b4b94579Smrg					 int                 src_stride,
535b4b94579Smrg					 int                 dst_stride,
536b4b94579Smrg					 int                 src_bpp,
537b4b94579Smrg					 int                 dst_bpp,
538b4b94579Smrg					 int                 src_x,
539b4b94579Smrg					 int                 src_y,
540b4b94579Smrg					 int                 dst_x,
541b4b94579Smrg					 int                 dst_y,
542b4b94579Smrg					 int                 width,
543b4b94579Smrg					 int                 height);
544b4b94579Smrgpixman_bool_t pixman_fill               (uint32_t           *bits,
545b4b94579Smrg					 int                 stride,
546b4b94579Smrg					 int                 bpp,
547b4b94579Smrg					 int                 x,
548b4b94579Smrg					 int                 y,
549b4b94579Smrg					 int                 width,
550b4b94579Smrg					 int                 height,
551b4b94579Smrg					 uint32_t            _xor);
552b4b94579Smrg
553b4b94579Smrgint           pixman_version            (void);
554b4b94579Smrgconst char*   pixman_version_string     (void);
555b4b94579Smrg
556b4b94579Smrg/*
557b4b94579Smrg * Images
558b4b94579Smrg */
559b4b94579Smrgtypedef  union pixman_image		pixman_image_t;
560b4b94579Smrgtypedef struct pixman_indexed		pixman_indexed_t;
561b4b94579Smrgtypedef struct pixman_gradient_stop	pixman_gradient_stop_t;
562b4b94579Smrg
563b4b94579Smrgtypedef uint32_t (* pixman_read_memory_func_t) (const void *src, int size);
564b4b94579Smrgtypedef void     (* pixman_write_memory_func_t) (void *dst, uint32_t value, int size);
565b4b94579Smrg
566dc259aabSmrgtypedef void     (* pixman_image_destroy_func_t) (pixman_image_t *image, void *data);
567dc259aabSmrg
568b4b94579Smrgstruct pixman_gradient_stop {
569b4b94579Smrg    pixman_fixed_t x;
570b4b94579Smrg    pixman_color_t color;
571b4b94579Smrg};
572b4b94579Smrg
573b4b94579Smrg#define PIXMAN_MAX_INDEXED  256 /* XXX depth must be <= 8 */
574b4b94579Smrg
575b4b94579Smrg#if PIXMAN_MAX_INDEXED <= 256
576b4b94579Smrgtypedef uint8_t pixman_index_type;
577b4b94579Smrg#endif
578b4b94579Smrg
579b4b94579Smrgstruct pixman_indexed
580b4b94579Smrg{
581b4b94579Smrg    pixman_bool_t       color;
582b4b94579Smrg    uint32_t		rgba[PIXMAN_MAX_INDEXED];
583b4b94579Smrg    pixman_index_type	ent[32768];
584b4b94579Smrg};
585b4b94579Smrg
586b4b94579Smrg/*
587b4b94579Smrg * While the protocol is generous in format support, the
588b4b94579Smrg * sample implementation allows only packed RGB and GBR
589b4b94579Smrg * representations for data to simplify software rendering,
590b4b94579Smrg */
591b4b94579Smrg#define PIXMAN_FORMAT(bpp,type,a,r,g,b)	(((bpp) << 24) |  \
592b4b94579Smrg					 ((type) << 16) | \
593b4b94579Smrg					 ((a) << 12) |	  \
594b4b94579Smrg					 ((r) << 8) |	  \
595b4b94579Smrg					 ((g) << 4) |	  \
596b4b94579Smrg					 ((b)))
597b4b94579Smrg
598b4b94579Smrg#define PIXMAN_FORMAT_BPP(f)	(((f) >> 24)       )
599b4b94579Smrg#define PIXMAN_FORMAT_TYPE(f)	(((f) >> 16) & 0xff)
600b4b94579Smrg#define PIXMAN_FORMAT_A(f)	(((f) >> 12) & 0x0f)
601b4b94579Smrg#define PIXMAN_FORMAT_R(f)	(((f) >>  8) & 0x0f)
602b4b94579Smrg#define PIXMAN_FORMAT_G(f)	(((f) >>  4) & 0x0f)
603b4b94579Smrg#define PIXMAN_FORMAT_B(f)	(((f)      ) & 0x0f)
604b4b94579Smrg#define PIXMAN_FORMAT_RGB(f)	(((f)      ) & 0xfff)
605b4b94579Smrg#define PIXMAN_FORMAT_VIS(f)	(((f)      ) & 0xffff)
606b4b94579Smrg#define PIXMAN_FORMAT_DEPTH(f)	(PIXMAN_FORMAT_A(f) +	\
607b4b94579Smrg				 PIXMAN_FORMAT_R(f) +	\
608b4b94579Smrg				 PIXMAN_FORMAT_G(f) +	\
609b4b94579Smrg				 PIXMAN_FORMAT_B(f))
610b4b94579Smrg
611b4b94579Smrg#define PIXMAN_TYPE_OTHER	0
612b4b94579Smrg#define PIXMAN_TYPE_A		1
613b4b94579Smrg#define PIXMAN_TYPE_ARGB	2
614b4b94579Smrg#define PIXMAN_TYPE_ABGR	3
615b4b94579Smrg#define PIXMAN_TYPE_COLOR	4
616b4b94579Smrg#define PIXMAN_TYPE_GRAY	5
617b4b94579Smrg#define PIXMAN_TYPE_YUY2	6
618b4b94579Smrg#define PIXMAN_TYPE_YV12	7
619317c648bSmrg#define PIXMAN_TYPE_BGRA	8
620b4b94579Smrg
621317c648bSmrg#define PIXMAN_FORMAT_COLOR(f)				\
622317c648bSmrg	(PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_ARGB ||	\
623317c648bSmrg	 PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_ABGR ||	\
624317c648bSmrg	 PIXMAN_FORMAT_TYPE(f) == PIXMAN_TYPE_BGRA)
625b4b94579Smrg
626b4b94579Smrg/* 32bpp formats */
627b4b94579Smrgtypedef enum {
628d0321353Smrg    PIXMAN_a8r8g8b8 =	 PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,8,8,8,8),
629d0321353Smrg    PIXMAN_x8r8g8b8 =	 PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,0,8,8,8),
630d0321353Smrg    PIXMAN_a8b8g8r8 =	 PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,8,8,8,8),
631d0321353Smrg    PIXMAN_x8b8g8r8 =	 PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,0,8,8,8),
632d0321353Smrg    PIXMAN_b8g8r8a8 =	 PIXMAN_FORMAT(32,PIXMAN_TYPE_BGRA,8,8,8,8),
633d0321353Smrg    PIXMAN_b8g8r8x8 =	 PIXMAN_FORMAT(32,PIXMAN_TYPE_BGRA,0,8,8,8),
634d0321353Smrg    PIXMAN_x2r10g10b10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,0,10,10,10),
635d0321353Smrg    PIXMAN_a2r10g10b10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ARGB,2,10,10,10),
63627693ee9Sveego    PIXMAN_x2b10g10r10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,0,10,10,10),
63727693ee9Sveego    PIXMAN_a2b10g10r10 = PIXMAN_FORMAT(32,PIXMAN_TYPE_ABGR,2,10,10,10),
63827693ee9Sveego
639b4b94579Smrg/* 24bpp formats */
640d0321353Smrg    PIXMAN_r8g8b8 =	 PIXMAN_FORMAT(24,PIXMAN_TYPE_ARGB,0,8,8,8),
641d0321353Smrg    PIXMAN_b8g8r8 =	 PIXMAN_FORMAT(24,PIXMAN_TYPE_ABGR,0,8,8,8),
642b4b94579Smrg
643b4b94579Smrg/* 16bpp formats */
644d0321353Smrg    PIXMAN_r5g6b5 =	 PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,0,5,6,5),
645d0321353Smrg    PIXMAN_b5g6r5 =	 PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,0,5,6,5),
646b4b94579Smrg
647d0321353Smrg    PIXMAN_a1r5g5b5 =	 PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,1,5,5,5),
648d0321353Smrg    PIXMAN_x1r5g5b5 =	 PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,0,5,5,5),
649d0321353Smrg    PIXMAN_a1b5g5r5 =	 PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,1,5,5,5),
650d0321353Smrg    PIXMAN_x1b5g5r5 =	 PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,0,5,5,5),
651d0321353Smrg    PIXMAN_a4r4g4b4 =	 PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,4,4,4,4),
652d0321353Smrg    PIXMAN_x4r4g4b4 =	 PIXMAN_FORMAT(16,PIXMAN_TYPE_ARGB,0,4,4,4),
653d0321353Smrg    PIXMAN_a4b4g4r4 =	 PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,4,4,4,4),
654d0321353Smrg    PIXMAN_x4b4g4r4 =	 PIXMAN_FORMAT(16,PIXMAN_TYPE_ABGR,0,4,4,4),
655b4b94579Smrg
656b4b94579Smrg/* 8bpp formats */
657d0321353Smrg    PIXMAN_a8 =		 PIXMAN_FORMAT(8,PIXMAN_TYPE_A,8,0,0,0),
658d0321353Smrg    PIXMAN_r3g3b2 =	 PIXMAN_FORMAT(8,PIXMAN_TYPE_ARGB,0,3,3,2),
659d0321353Smrg    PIXMAN_b2g3r3 =	 PIXMAN_FORMAT(8,PIXMAN_TYPE_ABGR,0,3,3,2),
660d0321353Smrg    PIXMAN_a2r2g2b2 =	 PIXMAN_FORMAT(8,PIXMAN_TYPE_ARGB,2,2,2,2),
661d0321353Smrg    PIXMAN_a2b2g2r2 =	 PIXMAN_FORMAT(8,PIXMAN_TYPE_ABGR,2,2,2,2),
662b4b94579Smrg
663d0321353Smrg    PIXMAN_c8 =		 PIXMAN_FORMAT(8,PIXMAN_TYPE_COLOR,0,0,0,0),
664d0321353Smrg    PIXMAN_g8 =		 PIXMAN_FORMAT(8,PIXMAN_TYPE_GRAY,0,0,0,0),
665b4b94579Smrg
666d0321353Smrg    PIXMAN_x4a4 =	 PIXMAN_FORMAT(8,PIXMAN_TYPE_A,4,0,0,0),
667b4b94579Smrg
668d0321353Smrg    PIXMAN_x4c4 =	 PIXMAN_FORMAT(8,PIXMAN_TYPE_COLOR,0,0,0,0),
669d0321353Smrg    PIXMAN_x4g4 =	 PIXMAN_FORMAT(8,PIXMAN_TYPE_GRAY,0,0,0,0),
670b4b94579Smrg
671b4b94579Smrg/* 4bpp formats */
672d0321353Smrg    PIXMAN_a4 =		 PIXMAN_FORMAT(4,PIXMAN_TYPE_A,4,0,0,0),
673d0321353Smrg    PIXMAN_r1g2b1 =	 PIXMAN_FORMAT(4,PIXMAN_TYPE_ARGB,0,1,2,1),
674d0321353Smrg    PIXMAN_b1g2r1 =	 PIXMAN_FORMAT(4,PIXMAN_TYPE_ABGR,0,1,2,1),
675d0321353Smrg    PIXMAN_a1r1g1b1 =	 PIXMAN_FORMAT(4,PIXMAN_TYPE_ARGB,1,1,1,1),
676d0321353Smrg    PIXMAN_a1b1g1r1 =	 PIXMAN_FORMAT(4,PIXMAN_TYPE_ABGR,1,1,1,1),
677b4b94579Smrg
678d0321353Smrg    PIXMAN_c4 =		 PIXMAN_FORMAT(4,PIXMAN_TYPE_COLOR,0,0,0,0),
679d0321353Smrg    PIXMAN_g4 =		 PIXMAN_FORMAT(4,PIXMAN_TYPE_GRAY,0,0,0,0),
680b4b94579Smrg
681b4b94579Smrg/* 1bpp formats */
682d0321353Smrg    PIXMAN_a1 =		 PIXMAN_FORMAT(1,PIXMAN_TYPE_A,1,0,0,0),
683b4b94579Smrg
684d0321353Smrg    PIXMAN_g1 =		 PIXMAN_FORMAT(1,PIXMAN_TYPE_GRAY,0,0,0,0),
685b4b94579Smrg
686b4b94579Smrg/* YUV formats */
687d0321353Smrg    PIXMAN_yuy2 =	 PIXMAN_FORMAT(16,PIXMAN_TYPE_YUY2,0,0,0,0),
688d0321353Smrg    PIXMAN_yv12 =	 PIXMAN_FORMAT(12,PIXMAN_TYPE_YV12,0,0,0,0)
689b4b94579Smrg} pixman_format_code_t;
690b4b94579Smrg
691b4b94579Smrg/* Querying supported format values. */
692b4b94579Smrgpixman_bool_t pixman_format_supported_destination (pixman_format_code_t format);
693b4b94579Smrgpixman_bool_t pixman_format_supported_source      (pixman_format_code_t format);
694b4b94579Smrg
695b4b94579Smrg/* Constructors */
696b4b94579Smrgpixman_image_t *pixman_image_create_solid_fill       (pixman_color_t               *color);
697b4b94579Smrgpixman_image_t *pixman_image_create_linear_gradient  (pixman_point_fixed_t         *p1,
698b4b94579Smrg						      pixman_point_fixed_t         *p2,
699b4b94579Smrg						      const pixman_gradient_stop_t *stops,
700b4b94579Smrg						      int                           n_stops);
701b4b94579Smrgpixman_image_t *pixman_image_create_radial_gradient  (pixman_point_fixed_t         *inner,
702b4b94579Smrg						      pixman_point_fixed_t         *outer,
703b4b94579Smrg						      pixman_fixed_t                inner_radius,
704b4b94579Smrg						      pixman_fixed_t                outer_radius,
705b4b94579Smrg						      const pixman_gradient_stop_t *stops,
706b4b94579Smrg						      int                           n_stops);
707b4b94579Smrgpixman_image_t *pixman_image_create_conical_gradient (pixman_point_fixed_t         *center,
708b4b94579Smrg						      pixman_fixed_t                angle,
709b4b94579Smrg						      const pixman_gradient_stop_t *stops,
710b4b94579Smrg						      int                           n_stops);
711b4b94579Smrgpixman_image_t *pixman_image_create_bits             (pixman_format_code_t          format,
712b4b94579Smrg						      int                           width,
713b4b94579Smrg						      int                           height,
714b4b94579Smrg						      uint32_t                     *bits,
715b4b94579Smrg						      int                           rowstride_bytes);
716b4b94579Smrg
717b4b94579Smrg/* Destructor */
718b4b94579Smrgpixman_image_t *pixman_image_ref                     (pixman_image_t               *image);
719b4b94579Smrgpixman_bool_t   pixman_image_unref                   (pixman_image_t               *image);
720b4b94579Smrg
721dc259aabSmrgvoid		pixman_image_set_destroy_function    (pixman_image_t		   *image,
722dc259aabSmrg						      pixman_image_destroy_func_t   function,
723dc259aabSmrg						      void			   *data);
724b4b94579Smrg
725b4b94579Smrg/* Set properties */
726b4b94579Smrgpixman_bool_t   pixman_image_set_clip_region         (pixman_image_t               *image,
727b4b94579Smrg						      pixman_region16_t            *region);
728b4b94579Smrgpixman_bool_t   pixman_image_set_clip_region32       (pixman_image_t               *image,
729b4b94579Smrg						      pixman_region32_t            *region);
730b4b94579Smrgvoid		pixman_image_set_has_client_clip     (pixman_image_t               *image,
731b4b94579Smrg						      pixman_bool_t		    clien_clip);
732b4b94579Smrgpixman_bool_t   pixman_image_set_transform           (pixman_image_t               *image,
733b4b94579Smrg						      const pixman_transform_t     *transform);
734b4b94579Smrgvoid            pixman_image_set_repeat              (pixman_image_t               *image,
735b4b94579Smrg						      pixman_repeat_t               repeat);
736b4b94579Smrgpixman_bool_t   pixman_image_set_filter              (pixman_image_t               *image,
737b4b94579Smrg						      pixman_filter_t               filter,
738b4b94579Smrg						      const pixman_fixed_t         *filter_params,
739b4b94579Smrg						      int                           n_filter_params);
740b4b94579Smrgvoid		pixman_image_set_source_clipping     (pixman_image_t		   *image,
741b4b94579Smrg						      pixman_bool_t                 source_clipping);
742b4b94579Smrgvoid            pixman_image_set_alpha_map           (pixman_image_t               *image,
743b4b94579Smrg						      pixman_image_t               *alpha_map,
744b4b94579Smrg						      int16_t                       x,
745b4b94579Smrg						      int16_t                       y);
746b4b94579Smrgvoid            pixman_image_set_component_alpha     (pixman_image_t               *image,
747b4b94579Smrg						      pixman_bool_t                 component_alpha);
748b4b94579Smrgvoid		pixman_image_set_accessors	     (pixman_image_t		   *image,
749b4b94579Smrg						      pixman_read_memory_func_t	    read_func,
750b4b94579Smrg						      pixman_write_memory_func_t    write_func);
751b4b94579Smrgvoid		pixman_image_set_indexed	     (pixman_image_t		   *image,
752b4b94579Smrg						      const pixman_indexed_t	   *indexed);
753b4b94579Smrguint32_t       *pixman_image_get_data                (pixman_image_t               *image);
754b4b94579Smrgint		pixman_image_get_width               (pixman_image_t               *image);
755b4b94579Smrgint             pixman_image_get_height              (pixman_image_t               *image);
756317c648bSmrgint		pixman_image_get_stride              (pixman_image_t               *image); /* in bytes */
757b4b94579Smrgint		pixman_image_get_depth               (pixman_image_t		   *image);
758b4b94579Smrgpixman_bool_t	pixman_image_fill_rectangles	     (pixman_op_t		    op,
759b4b94579Smrg						      pixman_image_t		   *image,
760b4b94579Smrg						      pixman_color_t		   *color,
761b4b94579Smrg						      int			    n_rects,
762b4b94579Smrg						      const pixman_rectangle16_t   *rects);
763b4b94579Smrg
764b4b94579Smrg/* Composite */
765d0321353Smrgpixman_bool_t pixman_compute_composite_region (pixman_region16_t *region,
766d0321353Smrg					       pixman_image_t    *src_image,
767d0321353Smrg					       pixman_image_t    *mask_image,
768d0321353Smrg					       pixman_image_t    *dst_image,
769d0321353Smrg					       int16_t            src_x,
770d0321353Smrg					       int16_t            src_y,
771d0321353Smrg					       int16_t            mask_x,
772d0321353Smrg					       int16_t            mask_y,
773d0321353Smrg					       int16_t            dest_x,
774d0321353Smrg					       int16_t            dest_y,
775b4b94579Smrg					       uint16_t           width,
776b4b94579Smrg					       uint16_t           height);
777b4b94579Smrgvoid          pixman_image_composite          (pixman_op_t        op,
778b4b94579Smrg					       pixman_image_t    *src,
779b4b94579Smrg					       pixman_image_t    *mask,
780b4b94579Smrg					       pixman_image_t    *dest,
781b4b94579Smrg					       int16_t            src_x,
782b4b94579Smrg					       int16_t            src_y,
783b4b94579Smrg					       int16_t            mask_x,
784b4b94579Smrg					       int16_t            mask_y,
785b4b94579Smrg					       int16_t            dest_x,
786b4b94579Smrg					       int16_t            dest_y,
787b4b94579Smrg					       uint16_t           width,
788b4b94579Smrg					       uint16_t           height);
789b4b94579Smrg
790d0321353Smrg/* Old X servers rely on out-of-bounds accesses when they are asked
791d0321353Smrg * to composite with a window as the source. They create a pixman image
792d0321353Smrg * pointing to some bogus position in memory, but then they set a clip
793d0321353Smrg * region to the position where the actual bits are.
794d0321353Smrg *
795d0321353Smrg * Due to a bug in old versions of pixman, where it would not clip
796d0321353Smrg * against the image bounds when a clip region was set, this would
797d0321353Smrg * actually work. So by default we allow certain out-of-bound access
798d0321353Smrg * to happen unless explicitly disabled.
799d0321353Smrg *
800d0321353Smrg * Fixed X servers should call this function to disable the workaround.
801d0321353Smrg */
802d0321353Smrgvoid          pixman_disable_out_of_bounds_workaround (void);
803d0321353Smrg
804b4b94579Smrg/*
805b4b94579Smrg * Trapezoids
806b4b94579Smrg */
807b4b94579Smrgtypedef struct pixman_edge pixman_edge_t;
808b4b94579Smrgtypedef struct pixman_trapezoid pixman_trapezoid_t;
809b4b94579Smrgtypedef struct pixman_trap pixman_trap_t;
810b4b94579Smrgtypedef struct pixman_span_fix pixman_span_fix_t;
811b4b94579Smrg
812b4b94579Smrg/*
813b4b94579Smrg * An edge structure.  This represents a single polygon edge
814b4b94579Smrg * and can be quickly stepped across small or large gaps in the
815b4b94579Smrg * sample grid
816b4b94579Smrg */
817b4b94579Smrgstruct pixman_edge
818b4b94579Smrg{
819b4b94579Smrg    pixman_fixed_t	x;
820b4b94579Smrg    pixman_fixed_t	e;
821d0321353Smrg    pixman_fixed_t	stepx;
822d0321353Smrg    pixman_fixed_t	signdx;
823d0321353Smrg    pixman_fixed_t	dy;
824d0321353Smrg    pixman_fixed_t	dx;
825d0321353Smrg
826d0321353Smrg    pixman_fixed_t	stepx_small;
827d0321353Smrg    pixman_fixed_t	stepx_big;
828d0321353Smrg    pixman_fixed_t	dx_small;
829d0321353Smrg    pixman_fixed_t	dx_big;
830b4b94579Smrg};
831b4b94579Smrg
832b4b94579Smrgstruct pixman_trapezoid
833b4b94579Smrg{
834d0321353Smrg    pixman_fixed_t	top, bottom;
835b4b94579Smrg    pixman_line_fixed_t	left, right;
836b4b94579Smrg};
837b4b94579Smrg
838b4b94579Smrg
839b4b94579Smrg/* whether 't' is a well defined not obviously empty trapezoid */
840d0321353Smrg#define pixman_trapezoid_valid(t)				   \
841b4b94579Smrg    ((t)->left.p1.y != (t)->left.p2.y &&			   \
842b4b94579Smrg     (t)->right.p1.y != (t)->right.p2.y &&			   \
843b4b94579Smrg     (int) ((t)->bottom - (t)->top) > 0)
844b4b94579Smrg
845b4b94579Smrgstruct pixman_span_fix
846b4b94579Smrg{
847b4b94579Smrg    pixman_fixed_t	l, r, y;
848b4b94579Smrg};
849b4b94579Smrg
850b4b94579Smrgstruct pixman_trap
851b4b94579Smrg{
852b4b94579Smrg    pixman_span_fix_t	top, bot;
853b4b94579Smrg};
854b4b94579Smrg
855b4b94579Smrgpixman_fixed_t pixman_sample_ceil_y        (pixman_fixed_t             y,
856b4b94579Smrg					    int                        bpp);
857b4b94579Smrgpixman_fixed_t pixman_sample_floor_y       (pixman_fixed_t             y,
858b4b94579Smrg					    int                        bpp);
859b4b94579Smrgvoid           pixman_edge_step            (pixman_edge_t             *e,
860b4b94579Smrg					    int                        n);
861b4b94579Smrgvoid           pixman_edge_init            (pixman_edge_t             *e,
862b4b94579Smrg					    int                        bpp,
863b4b94579Smrg					    pixman_fixed_t             y_start,
864b4b94579Smrg					    pixman_fixed_t             x_top,
865b4b94579Smrg					    pixman_fixed_t             y_top,
866b4b94579Smrg					    pixman_fixed_t             x_bot,
867b4b94579Smrg					    pixman_fixed_t             y_bot);
868b4b94579Smrgvoid           pixman_line_fixed_edge_init (pixman_edge_t             *e,
869b4b94579Smrg					    int                        bpp,
870b4b94579Smrg					    pixman_fixed_t             y,
871b4b94579Smrg					    const pixman_line_fixed_t *line,
872b4b94579Smrg					    int                        x_off,
873b4b94579Smrg					    int                        y_off);
874b4b94579Smrgvoid           pixman_rasterize_edges      (pixman_image_t            *image,
875b4b94579Smrg					    pixman_edge_t             *l,
876b4b94579Smrg					    pixman_edge_t             *r,
877b4b94579Smrg					    pixman_fixed_t             t,
878b4b94579Smrg					    pixman_fixed_t             b);
879b4b94579Smrgvoid           pixman_add_traps            (pixman_image_t            *image,
880b4b94579Smrg					    int16_t                    x_off,
881b4b94579Smrg					    int16_t                    y_off,
882b4b94579Smrg					    int                        ntrap,
883b4b94579Smrg					    pixman_trap_t             *traps);
884b4b94579Smrgvoid           pixman_add_trapezoids       (pixman_image_t            *image,
885b4b94579Smrg					    int16_t                    x_off,
886b4b94579Smrg					    int                        y_off,
887b4b94579Smrg					    int                        ntraps,
888b4b94579Smrg					    const pixman_trapezoid_t  *traps);
889b4b94579Smrgvoid           pixman_rasterize_trapezoid  (pixman_image_t            *image,
890b4b94579Smrg					    const pixman_trapezoid_t  *trap,
891b4b94579Smrg					    int                        x_off,
892b4b94579Smrg					    int                        y_off);
893b4b94579Smrg
894b4b94579Smrg#endif /* PIXMAN_H__ */
895