Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

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