Subversion Repositories Kolibri OS

Rev

Rev 1892 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1892 Rev 3959
Line 44... Line 44...
44
#include "cairo-device-private.h"
44
#include "cairo-device-private.h"
45
#include "cairo-freelist-type-private.h"
45
#include "cairo-freelist-type-private.h"
46
#include "cairo-list-private.h"
46
#include "cairo-list-private.h"
47
#include "cairo-reference-count-private.h"
47
#include "cairo-reference-count-private.h"
48
#include "cairo-types-private.h"
48
#include "cairo-types-private.h"
-
 
49
#include "cairo-scaled-font-private.h"
-
 
50
#include "cairo-surface-private.h"
-
 
51
 
-
 
52
#include 
-
 
53
#include 
Line 49... Line 54...
49
 
54
 
-
 
55
typedef struct _cairo_xlib_display cairo_xlib_display_t;
50
typedef struct _cairo_xlib_display cairo_xlib_display_t;
56
typedef struct _cairo_xlib_shm_display cairo_xlib_shm_display_t;
51
typedef struct _cairo_xlib_screen cairo_xlib_screen_t;
-
 
52
 
57
typedef struct _cairo_xlib_screen cairo_xlib_screen_t;
53
typedef struct _cairo_xlib_hook cairo_xlib_hook_t;
58
typedef struct _cairo_xlib_source cairo_xlib_source_t;
54
typedef struct _cairo_xlib_job cairo_xlib_job_t;
59
typedef struct _cairo_xlib_proxy cairo_xlib_proxy_t;
55
typedef void (*cairo_xlib_notify_func) (Display *, void *);
-
 
56
typedef void (*cairo_xlib_notify_resource_func) (Display *, XID);
-
 
57
 
-
 
58
struct _cairo_xlib_hook {
-
 
59
    cairo_xlib_hook_t *prev, *next; /* private */
-
 
60
    void (*func) (cairo_xlib_display_t *display, void *data);
-
 
Line 61... Line 60...
61
};
60
typedef struct _cairo_xlib_surface cairo_xlib_surface_t;
62
 
61
 
63
/* size of color cube */
62
/* size of color cube */
64
#define CUBE_SIZE 6
63
#define CUBE_SIZE 6
-
 
64
/* size of gray ramp */
-
 
65
#define RAMP_SIZE 16
Line 65... Line 66...
65
/* size of gray ramp */
66
/* maximum number of cached GC's */
66
#define RAMP_SIZE 16
67
#define GC_CACHE_SIZE 4
Line 67... Line 68...
67
 
68
 
Line 68... Line 69...
68
struct _cairo_xlib_display {
69
struct _cairo_xlib_display {
69
    cairo_device_t base;
70
    cairo_device_t base;
-
 
71
 
-
 
72
    cairo_xlib_display_t *next;
-
 
73
 
-
 
74
    Display *display;
-
 
75
    cairo_list_t screens;
Line 70... Line 76...
70
 
76
    cairo_list_t fonts;
71
    cairo_xlib_display_t *next;
77
 
72
 
78
    cairo_xlib_shm_display_t *shm;
Line 73... Line -...
73
    Display *display;
-
 
74
    cairo_list_t screens;
79
 
Line -... Line 80...
-
 
80
    const cairo_compositor_t *compositor;
75
 
81
 
-
 
82
    int render_major;
-
 
83
    int render_minor;
-
 
84
    XRenderPictFormat *cached_xrender_formats[CAIRO_FORMAT_RGB16_565 + 1];
-
 
85
 
-
 
86
    int force_precision;
-
 
87
 
-
 
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
     *
76
    int render_major;
104
     * We also use this variable as a guard against a second
77
    int render_minor;
105
     * independent bug with transformed repeating pictures:
78
    XRenderPictFormat *cached_xrender_formats[CAIRO_FORMAT_RGB16_565 + 1];
106
     *
79
 
107
     * http://lists.freedesktop.org/archives/cairo/2004-September/001839.html
80
    cairo_xlib_job_t *workqueue;
108
     *
Line 101... Line 129...
101
    cairo_list_t link;
129
    cairo_list_t link;
Line 102... Line 130...
102
 
130
 
103
    cairo_device_t *device;
131
    cairo_device_t *device;
Line -... Line 132...
-
 
132
    Screen *screen;
-
 
133
 
104
    Screen *screen;
134
    cairo_list_t surfaces;
105
 
135
 
Line 106... Line 136...
106
    cairo_bool_t has_font_options;
136
    cairo_bool_t has_font_options;
107
    cairo_font_options_t font_options;
137
    cairo_font_options_t font_options;
Line 108... Line 138...
108
 
138
 
109
    GC gc[4];
139
    GC gc[GC_CACHE_SIZE];
Line -... Line 140...
-
 
140
    uint8_t gc_depths[GC_CACHE_SIZE];
-
 
141
 
-
 
142
    cairo_list_t visuals;
-
 
143
};
-
 
144
 
-
 
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
 
110
    cairo_atomic_int_t gc_depths; /* 4 x uint8_t */
228
cairo_private cairo_status_t
111
 
229
_cairo_xlib_surface_get_gc (cairo_xlib_display_t *display,
Line 112... Line -...
112
    cairo_list_t visuals;
-
 
113
};
-
 
114
 
-
 
115
cairo_private cairo_device_t *
-
 
116
_cairo_xlib_device_create (Display *display);
230
                            cairo_xlib_surface_t *surface,
117
 
231
                            GC                   *gc);
Line 118... Line 232...
118
cairo_private cairo_xlib_screen_t *
232
 
119
_cairo_xlib_display_get_screen (cairo_xlib_display_t *display,
233
cairo_private cairo_device_t *
-
 
234
_cairo_xlib_device_create (Display *display);
-
 
235
 
-
 
236
cairo_private void
-
 
237
_cairo_xlib_display_init_shm (cairo_xlib_display_t *display);
Line 120... Line -...
120
				Screen *screen);
-
 
121
 
-
 
122
cairo_private void
-
 
123
_cairo_xlib_add_close_display_hook (cairo_xlib_display_t *display, cairo_xlib_hook_t *hook);
-
 
124
 
-
 
125
cairo_private void
-
 
126
_cairo_xlib_remove_close_display_hook (cairo_xlib_display_t *display, cairo_xlib_hook_t *hook);
-
 
127
 
-
 
128
cairo_private cairo_status_t
-
 
129
_cairo_xlib_display_queue_work (cairo_xlib_display_t *display,
238
 
130
	                        cairo_xlib_notify_func notify,
239
cairo_private void
131
				void *data,
240
_cairo_xlib_display_fini_shm (cairo_xlib_display_t *display);
Line 132... Line -...
132
				void (*destroy)(void *));
-
 
133
cairo_private cairo_status_t
-
 
134
_cairo_xlib_display_queue_resource (cairo_xlib_display_t *display,
-
 
135
	                           cairo_xlib_notify_resource_func notify,
-
 
136
				   XID resource);
241
 
137
cairo_private cairo_status_t
242
cairo_private cairo_xlib_screen_t *
Line 138... Line 243...
138
_cairo_xlib_display_acquire (cairo_device_t *device,
243
_cairo_xlib_display_get_screen (cairo_xlib_display_t *display,
139
                             cairo_xlib_display_t **display);
244
				Screen *screen);
Line 140... Line 245...
140
 
245
 
141
cairo_private void
246
cairo_private cairo_status_t
Line -... Line 247...
-
 
247
_cairo_xlib_display_acquire (cairo_device_t *device,
-
 
248
                             cairo_xlib_display_t **display);
-
 
249
 
-
 
250
cairo_private cairo_bool_t
142
_cairo_xlib_display_get_xrender_version (cairo_xlib_display_t *display,
251
_cairo_xlib_display_has_repeat (cairo_device_t *device);
143
					 int *major, int *minor);
252
 
144
 
253
cairo_private cairo_bool_t
Line -... Line 254...
-
 
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);
145
cairo_private cairo_bool_t
258
 
146
_cairo_xlib_display_has_repeat (cairo_device_t *device);
259
cairo_private void
147
 
260
_cairo_xlib_display_set_precision(cairo_device_t *device,
148
cairo_private cairo_bool_t
261
				  int precision);
Line 149... Line 262...
149
_cairo_xlib_display_has_reflect (cairo_device_t *device);
262
 
150
 
-
 
151
cairo_private cairo_bool_t
-
 
152
_cairo_xlib_display_has_gradients (cairo_device_t *device);
-
 
153
 
263
cairo_private XRenderPictFormat *
154
cairo_private XRenderPictFormat *
264
_cairo_xlib_display_get_xrender_format (cairo_xlib_display_t	*display,
Line 155... Line 265...
155
_cairo_xlib_display_get_xrender_format (cairo_xlib_display_t	*display,
265
	                                cairo_format_t		 format);
156
	                                cairo_format_t		 format);
266
 
157
 
267
cairo_private XRenderPictFormat *
158
cairo_private cairo_status_t
268
_cairo_xlib_display_get_xrender_format_for_pixman (cairo_xlib_display_t *display,
159
_cairo_xlib_screen_get (Display *dpy,
269
						   pixman_format_code_t format);
160
			Screen *screen,
-
 
161
			cairo_xlib_screen_t **out);
270
 
162
 
271
cairo_private cairo_status_t
163
cairo_private void
272
_cairo_xlib_screen_get (Display *dpy,
164
_cairo_xlib_screen_destroy (cairo_xlib_screen_t *info);
273
			Screen *screen,
165
 
274
			cairo_xlib_screen_t **out);
Line 195... Line 304...
195
				cairo_xlib_visual_info_t **out);
304
				cairo_xlib_visual_info_t **out);
Line 196... Line 305...
196
 
305
 
197
cairo_private void
306
cairo_private void
Line -... Line 307...
-
 
307
_cairo_xlib_visual_info_destroy (cairo_xlib_visual_info_t *info);
-
 
308
 
-
 
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
198
_cairo_xlib_visual_info_destroy (cairo_xlib_visual_info_t *info);
466
_pixman_format_for_xlib_surface (cairo_xlib_surface_t *surface);