Subversion Repositories Kolibri OS

Rev

Rev 1892 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
1892 serge 1
/* Cairo - a vector graphics library with display and print output
2
 *
3
 * Copyright © 2005 Red Hat, Inc.
4
 *
5
 * This library is free software; you can redistribute it and/or
6
 * modify it either under the terms of the GNU Lesser General Public
7
 * License version 2.1 as published by the Free Software Foundation
8
 * (the "LGPL") or, at your option, under the terms of the Mozilla
9
 * Public License Version 1.1 (the "MPL"). If you do not alter this
10
 * notice, a recipient may use your version of this file under either
11
 * the MPL or the LGPL.
12
 *
13
 * You should have received a copy of the LGPL along with this library
14
 * in the file COPYING-LGPL-2.1; if not, write to the Free Software
15
 * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA
16
 * You should have received a copy of the MPL along with this library
17
 * in the file COPYING-MPL-1.1
18
 *
19
 * The contents of this file are subject to the Mozilla Public License
20
 * Version 1.1 (the "License"); you may not use this file except in
21
 * compliance with the License. You may obtain a copy of the License at
22
 * http://www.mozilla.org/MPL/
23
 *
24
 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
25
 * OF ANY KIND, either express or implied. See the LGPL or the MPL for
26
 * the specific language governing rights and limitations.
27
 *
28
 * The Original Code is the cairo graphics library.
29
 *
30
 * The Initial Developer of the Original Code is Red Hat, Inc.
31
 *
32
 * Contributors(s):
33
 *	Chris Wilson 
34
 *	Karl Tomlinson , Mozilla Corporation
35
 */
36
 
37
#ifndef CAIRO_XLIB_PRIVATE_H
38
#define CAIRO_XLIB_PRIVATE_H
39
 
40
#include "cairo-xlib.h"
41
#include "cairo-xlib-xrender-private.h"
42
 
43
#include "cairo-compiler-private.h"
44
#include "cairo-device-private.h"
45
#include "cairo-freelist-type-private.h"
46
#include "cairo-list-private.h"
47
#include "cairo-reference-count-private.h"
48
#include "cairo-types-private.h"
3959 Serge 49
#include "cairo-scaled-font-private.h"
50
#include "cairo-surface-private.h"
1892 serge 51
 
3959 Serge 52
#include 
53
#include 
54
 
1892 serge 55
typedef struct _cairo_xlib_display cairo_xlib_display_t;
3959 Serge 56
typedef struct _cairo_xlib_shm_display cairo_xlib_shm_display_t;
1892 serge 57
typedef struct _cairo_xlib_screen cairo_xlib_screen_t;
3959 Serge 58
typedef struct _cairo_xlib_source cairo_xlib_source_t;
59
typedef struct _cairo_xlib_proxy cairo_xlib_proxy_t;
60
typedef struct _cairo_xlib_surface cairo_xlib_surface_t;
1892 serge 61
 
62
/* size of color cube */
63
#define CUBE_SIZE 6
64
/* size of gray ramp */
65
#define RAMP_SIZE 16
3959 Serge 66
/* maximum number of cached GC's */
67
#define GC_CACHE_SIZE 4
1892 serge 68
 
69
struct _cairo_xlib_display {
70
    cairo_device_t base;
71
 
72
    cairo_xlib_display_t *next;
73
 
74
    Display *display;
75
    cairo_list_t screens;
3959 Serge 76
    cairo_list_t fonts;
1892 serge 77
 
3959 Serge 78
    cairo_xlib_shm_display_t *shm;
79
 
80
    const cairo_compositor_t *compositor;
81
 
1892 serge 82
    int render_major;
83
    int render_minor;
84
    XRenderPictFormat *cached_xrender_formats[CAIRO_FORMAT_RGB16_565 + 1];
85
 
3959 Serge 86
    int force_precision;
1892 serge 87
 
3959 Serge 88
    cairo_surface_t *white;
89
    cairo_surface_t *alpha[256];
90
    cairo_surface_t *solid[32];
91
    uint32_t solid_cache[32]; /* low 16 are opaque, high 16 transparent */
92
    struct {
93
	uint32_t color;
94
	int index;
95
    } last_solid_cache[2];
96
 
97
    /* TRUE if the server has a bug with repeating pictures
98
     *
99
     *  https://bugs.freedesktop.org/show_bug.cgi?id=3566
100
     *
101
     * We can't test for this because it depends on whether the
102
     * picture is in video memory or not.
103
     *
104
     * We also use this variable as a guard against a second
105
     * independent bug with transformed repeating pictures:
106
     *
107
     * http://lists.freedesktop.org/archives/cairo/2004-September/001839.html
108
     *
109
     * Both are fixed in xorg >= 6.9 and hopefully in > 6.8.2, so
110
     * we can reuse the test for now.
111
     */
112
    unsigned int buggy_gradients : 1;
113
    unsigned int buggy_pad_reflect : 1;
114
    unsigned int buggy_repeat : 1;
1892 serge 115
    unsigned int closed :1;
116
};
117
 
118
typedef struct _cairo_xlib_visual_info {
119
    cairo_list_t link;
120
    VisualID visualid;
121
    struct { uint8_t a, r, g, b; } colors[256];
122
    uint8_t cube_to_pseudocolor[CUBE_SIZE][CUBE_SIZE][CUBE_SIZE];
123
    uint8_t field8_to_cube[256];
124
    int8_t  dither8_to_cube[256];
125
    uint8_t gray8_to_pseudocolor[256];
126
} cairo_xlib_visual_info_t;
127
 
128
struct _cairo_xlib_screen {
129
    cairo_list_t link;
130
 
131
    cairo_device_t *device;
132
    Screen *screen;
133
 
3959 Serge 134
    cairo_list_t surfaces;
135
 
1892 serge 136
    cairo_bool_t has_font_options;
137
    cairo_font_options_t font_options;
138
 
3959 Serge 139
    GC gc[GC_CACHE_SIZE];
140
    uint8_t gc_depths[GC_CACHE_SIZE];
1892 serge 141
 
142
    cairo_list_t visuals;
143
};
144
 
3959 Serge 145
enum {
146
    GLYPHSET_INDEX_ARGB32,
147
    GLYPHSET_INDEX_A8,
148
    GLYPHSET_INDEX_A1,
149
    NUM_GLYPHSETS
150
};
151
 
152
typedef struct _cairo_xlib_font_glyphset {
153
    GlyphSet		glyphset;
154
    cairo_format_t	format;
155
    XRenderPictFormat	*xrender_format;
156
    struct _cairo_xlib_font_glyphset_free_glyphs {
157
	int		count;
158
	unsigned long	indices[128];
159
    } to_free;
160
} cairo_xlib_font_glyphset_t;
161
 
162
typedef struct _cairo_xlib_font {
163
    cairo_scaled_font_private_t		base;
164
    cairo_scaled_font_t			*font;
165
    cairo_device_t			*device;
166
    cairo_list_t			link;
167
    cairo_xlib_font_glyphset_t		glyphset[NUM_GLYPHSETS];
168
} cairo_xlib_font_t;
169
 
170
struct _cairo_xlib_surface {
171
    cairo_surface_t base;
172
 
173
    Picture picture;
174
    Drawable drawable;
175
 
176
    const cairo_compositor_t *compositor;
177
    cairo_surface_t *shm;
178
    int fallback;
179
 
180
    cairo_xlib_display_t *display;
181
    cairo_xlib_screen_t *screen;
182
    cairo_list_t link;
183
 
184
    Display *dpy; /* only valid between acquire/release */
185
    cairo_bool_t owns_pixmap;
186
    Visual *visual;
187
 
188
    int use_pixmap;
189
 
190
    int width;
191
    int height;
192
    int depth;
193
 
194
    int precision;
195
    XRenderPictFormat *xrender_format;
196
    /* XXX pixman_format instead of masks? */
197
    uint32_t a_mask;
198
    uint32_t r_mask;
199
    uint32_t g_mask;
200
    uint32_t b_mask;
201
 
202
    struct _cairo_xlib_source {
203
	cairo_surface_t base;
204
 
205
	Picture picture;
206
	Pixmap pixmap;
207
	Display *dpy;
208
 
209
	unsigned int filter:3;
210
	unsigned int extend:3;
211
	unsigned int has_matrix:1;
212
	unsigned int has_component_alpha:1;
213
    } embedded_source;
214
};
215
 
216
struct _cairo_xlib_proxy {
217
    struct _cairo_xlib_source source;
218
    cairo_surface_t *owner;
219
};
220
 
221
inline static cairo_bool_t
222
_cairo_xlib_vendor_is_xorg (Display *dpy)
223
{
224
    const char *const vendor = ServerVendor (dpy);
225
    return strstr (vendor, "X.Org") || strstr (vendor, "Xorg");
226
}
227
 
228
cairo_private cairo_status_t
229
_cairo_xlib_surface_get_gc (cairo_xlib_display_t *display,
230
                            cairo_xlib_surface_t *surface,
231
                            GC                   *gc);
232
 
1892 serge 233
cairo_private cairo_device_t *
234
_cairo_xlib_device_create (Display *display);
235
 
3959 Serge 236
cairo_private void
237
_cairo_xlib_display_init_shm (cairo_xlib_display_t *display);
238
 
239
cairo_private void
240
_cairo_xlib_display_fini_shm (cairo_xlib_display_t *display);
241
 
1892 serge 242
cairo_private cairo_xlib_screen_t *
243
_cairo_xlib_display_get_screen (cairo_xlib_display_t *display,
244
				Screen *screen);
245
 
246
cairo_private cairo_status_t
247
_cairo_xlib_display_acquire (cairo_device_t *device,
248
                             cairo_xlib_display_t **display);
249
 
250
cairo_private cairo_bool_t
251
_cairo_xlib_display_has_repeat (cairo_device_t *device);
252
 
253
cairo_private cairo_bool_t
254
_cairo_xlib_display_has_reflect (cairo_device_t *device);
255
 
256
cairo_private cairo_bool_t
257
_cairo_xlib_display_has_gradients (cairo_device_t *device);
258
 
3959 Serge 259
cairo_private void
260
_cairo_xlib_display_set_precision(cairo_device_t *device,
261
				  int precision);
262
 
1892 serge 263
cairo_private XRenderPictFormat *
264
_cairo_xlib_display_get_xrender_format (cairo_xlib_display_t	*display,
265
	                                cairo_format_t		 format);
266
 
3959 Serge 267
cairo_private XRenderPictFormat *
268
_cairo_xlib_display_get_xrender_format_for_pixman (cairo_xlib_display_t *display,
269
						   pixman_format_code_t format);
270
 
1892 serge 271
cairo_private cairo_status_t
272
_cairo_xlib_screen_get (Display *dpy,
273
			Screen *screen,
274
			cairo_xlib_screen_t **out);
275
 
276
cairo_private void
3959 Serge 277
_cairo_xlib_screen_destroy (cairo_xlib_display_t *display,
278
			    cairo_xlib_screen_t *info);
1892 serge 279
 
280
cairo_private GC
281
_cairo_xlib_screen_get_gc (cairo_xlib_display_t *display,
282
                           cairo_xlib_screen_t *info,
283
			   int depth,
284
			   Drawable drawable);
285
cairo_private void
286
_cairo_xlib_screen_put_gc (cairo_xlib_display_t *display,
3959 Serge 287
			   cairo_xlib_screen_t *info,
1892 serge 288
			   int depth,
289
			   GC gc);
290
 
291
cairo_private cairo_font_options_t *
292
_cairo_xlib_screen_get_font_options (cairo_xlib_screen_t *info);
293
 
294
cairo_private cairo_status_t
295
_cairo_xlib_screen_get_visual_info (cairo_xlib_display_t *display,
296
                                    cairo_xlib_screen_t *info,
297
				    Visual *visual,
298
				    cairo_xlib_visual_info_t **out);
299
 
300
cairo_private cairo_status_t
301
_cairo_xlib_visual_info_create (Display *dpy,
302
	                        int screen,
303
				VisualID visualid,
304
				cairo_xlib_visual_info_t **out);
305
 
306
cairo_private void
307
_cairo_xlib_visual_info_destroy (cairo_xlib_visual_info_t *info);
308
 
3959 Serge 309
cairo_private const cairo_compositor_t *
310
_cairo_xlib_core_compositor_get (void);
311
 
312
cairo_private const cairo_compositor_t *
313
_cairo_xlib_fallback_compositor_get (void);
314
 
315
cairo_private const cairo_compositor_t *
316
_cairo_xlib_mask_compositor_get (void);
317
 
318
cairo_private const cairo_compositor_t *
319
_cairo_xlib_traps_compositor_get (void);
320
 
321
cairo_private void
322
_cairo_xlib_surface_ensure_picture (cairo_xlib_surface_t    *surface);
323
 
324
cairo_private void
325
_cairo_xlib_surface_set_precision (cairo_xlib_surface_t	*surface,
326
				   cairo_antialias_t	 antialias);
327
 
328
cairo_private cairo_int_status_t
329
_cairo_xlib_surface_set_attributes (cairo_xlib_display_t       *display,
330
                                    cairo_xlib_surface_t       *surface,
331
				    cairo_surface_attributes_t *attributes,
332
				    double			xc,
333
				    double			yc);
334
 
335
cairo_private cairo_status_t
336
_cairo_xlib_surface_draw_image (cairo_xlib_surface_t   *surface,
337
				cairo_image_surface_t  *image,
338
				int                    src_x,
339
				int                    src_y,
340
				int                    width,
341
				int                    height,
342
				int                    dst_x,
343
				int                    dst_y);
344
 
345
cairo_private cairo_surface_t *
346
_cairo_xlib_source_create_for_pattern (cairo_surface_t *dst,
347
				       const cairo_pattern_t *pattern,
348
				       cairo_bool_t is_mask,
349
				       const cairo_rectangle_int_t *extents,
350
				       const cairo_rectangle_int_t *sample,
351
				       int *src_x, int *src_y);
352
 
353
cairo_private void
354
_cairo_xlib_font_close (cairo_xlib_font_t *font);
355
 
356
#define CAIRO_RENDER_AT_LEAST(surface, major, minor)	\
357
	(((surface)->render_major > major) ||			\
358
	 (((surface)->render_major == major) && ((surface)->render_minor >= minor)))
359
 
360
#define CAIRO_RENDER_HAS_CREATE_PICTURE(surface)		CAIRO_RENDER_AT_LEAST((surface), 0, 0)
361
#define CAIRO_RENDER_HAS_COMPOSITE(surface)		CAIRO_RENDER_AT_LEAST((surface), 0, 0)
362
#define CAIRO_RENDER_HAS_COMPOSITE_TEXT(surface)	CAIRO_RENDER_AT_LEAST((surface), 0, 0)
363
 
364
#define CAIRO_RENDER_HAS_FILL_RECTANGLES(surface)		CAIRO_RENDER_AT_LEAST((surface), 0, 1)
365
 
366
#define CAIRO_RENDER_HAS_DISJOINT(surface)			CAIRO_RENDER_AT_LEAST((surface), 0, 2)
367
#define CAIRO_RENDER_HAS_CONJOINT(surface)			CAIRO_RENDER_AT_LEAST((surface), 0, 2)
368
 
369
#define CAIRO_RENDER_HAS_TRAPEZOIDS(surface)		CAIRO_RENDER_AT_LEAST((surface), 0, 4)
370
#define CAIRO_RENDER_HAS_TRIANGLES(surface)		CAIRO_RENDER_AT_LEAST((surface), 0, 4)
371
#define CAIRO_RENDER_HAS_TRISTRIP(surface)			CAIRO_RENDER_AT_LEAST((surface), 0, 4)
372
#define CAIRO_RENDER_HAS_TRIFAN(surface)			CAIRO_RENDER_AT_LEAST((surface), 0, 4)
373
 
374
#define CAIRO_RENDER_HAS_PICTURE_TRANSFORM(surface)	CAIRO_RENDER_AT_LEAST((surface), 0, 6)
375
#define CAIRO_RENDER_HAS_FILTERS(surface)	CAIRO_RENDER_AT_LEAST((surface), 0, 6)
376
 
377
#define CAIRO_RENDER_HAS_EXTENDED_REPEAT(surface)	CAIRO_RENDER_AT_LEAST((surface), 0, 10)
378
#define CAIRO_RENDER_HAS_GRADIENTS(surface)	CAIRO_RENDER_AT_LEAST((surface), 0, 10)
379
 
380
#define CAIRO_RENDER_HAS_PDF_OPERATORS(surface)	CAIRO_RENDER_AT_LEAST((surface), 0, 11)
381
 
382
#define CAIRO_RENDER_SUPPORTS_OPERATOR(surface, op)	\
383
     ((op) <= CAIRO_OPERATOR_SATURATE ||			\
384
      (CAIRO_RENDER_HAS_PDF_OPERATORS(surface) &&	\
385
       (op) <= CAIRO_OPERATOR_HSL_LUMINOSITY))
386
 
387
/*
388
 * Return whether two xlib surfaces share the same
389
 * screen.  Both core and Render drawing require this
390
 * when using multiple drawables in an operation.
391
 */
392
static inline cairo_bool_t
393
_cairo_xlib_surface_same_screen (cairo_xlib_surface_t *dst,
394
				 cairo_xlib_surface_t *src)
395
{
396
    return dst->screen == src->screen;
397
}
398
 
399
cairo_private cairo_int_status_t
400
_cairo_xlib_core_fill_boxes (cairo_xlib_surface_t    *dst,
401
			     const cairo_color_t     *color,
402
			     cairo_boxes_t	    *boxes);
403
 
404
cairo_private cairo_int_status_t
405
_cairo_xlib_core_fill_rectangles (cairo_xlib_surface_t    *dst,
406
				  const cairo_color_t     *color,
407
				  int num_rects,
408
				  cairo_rectangle_int_t *rects);
409
 
410
static inline void
411
_cairo_xlib_surface_put_gc (cairo_xlib_display_t *display,
412
                            cairo_xlib_surface_t *surface,
413
                            GC                    gc)
414
{
415
    _cairo_xlib_screen_put_gc (display,
416
                               surface->screen,
417
			       surface->depth,
418
			       gc);
419
}
420
 
421
cairo_private cairo_surface_t *
422
_cairo_xlib_surface_create_similar_shm (void *surface,
423
					cairo_format_t format,
424
					int width, int height);
425
 
426
cairo_private cairo_surface_t *
427
_cairo_xlib_surface_get_shm (cairo_xlib_surface_t *surface,
428
			     cairo_bool_t overwrite);
429
 
430
cairo_private cairo_int_status_t
431
_cairo_xlib_surface_put_shm (cairo_xlib_surface_t *surface);
432
 
433
cairo_private cairo_surface_t *
434
_cairo_xlib_surface_create_shm (cairo_xlib_surface_t *other,
435
				pixman_format_code_t format,
436
				int width, int height);
437
 
438
cairo_private cairo_surface_t *
439
_cairo_xlib_surface_create_shm__image (cairo_xlib_surface_t *surface,
440
				       pixman_format_code_t format,
441
				       int width, int height);
442
 
443
cairo_private void
444
_cairo_xlib_shm_surface_get_ximage (cairo_surface_t *surface,
445
				    XImage *ximage);
446
 
447
cairo_private void *
448
_cairo_xlib_shm_surface_get_obdata (cairo_surface_t *surface);
449
 
450
cairo_private void
451
_cairo_xlib_shm_surface_mark_active (cairo_surface_t *shm);
452
 
453
cairo_private cairo_bool_t
454
_cairo_xlib_shm_surface_is_active (cairo_surface_t *surface);
455
 
456
cairo_private cairo_bool_t
457
_cairo_xlib_shm_surface_is_idle (cairo_surface_t *surface);
458
 
459
cairo_private Pixmap
460
_cairo_xlib_shm_surface_get_pixmap (cairo_surface_t *surface);
461
 
462
cairo_private XRenderPictFormat *
463
_cairo_xlib_shm_surface_get_xrender_format (cairo_surface_t *surface);
464
 
465
cairo_private pixman_format_code_t
466
_pixman_format_for_xlib_surface (cairo_xlib_surface_t *surface);
467
 
1892 serge 468
#endif /* CAIRO_XLIB_PRIVATE_H */