1 /* Cairo - a vector graphics library with display and print output
3 * Copyright © 2005 Red Hat, Inc.
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.
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
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/
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.
28 * The Original Code is the cairo graphics library.
30 * The Initial Developer of the Original Code is Red Hat, Inc.
33 * Chris Wilson <chris@chris-wilson.co.uk>
34 * Karl Tomlinson <karlt+@karlt.net>, Mozilla Corporation
37 #ifndef CAIRO_XLIB_PRIVATE_H
38 #define CAIRO_XLIB_PRIVATE_H
40 #include "cairo-xlib.h"
41 #include "cairo-xlib-xrender-private.h"
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"
49 #include "cairo-scaled-font-private.h"
50 #include "cairo-surface-private.h"
54 typedef struct _cairo_xlib_display cairo_xlib_display_t;
55 typedef struct _cairo_xlib_shm_display cairo_xlib_shm_display_t;
56 typedef struct _cairo_xlib_screen cairo_xlib_screen_t;
57 typedef struct _cairo_xlib_source cairo_xlib_source_t;
58 typedef struct _cairo_xlib_proxy cairo_xlib_proxy_t;
59 typedef struct _cairo_xlib_surface cairo_xlib_surface_t;
61 /* size of color cube */
63 /* size of gray ramp */
65 /* maximum number of cached GC's */
66 #define GC_CACHE_SIZE 4
68 struct _cairo_xlib_display {
71 cairo_xlib_display_t *next;
77 cairo_xlib_shm_display_t *shm;
79 const cairo_compositor_t *compositor;
83 XRenderPictFormat *cached_xrender_formats[CAIRO_FORMAT_RGB16_565 + 1];
87 cairo_surface_t *white;
88 cairo_surface_t *alpha[256];
89 cairo_surface_t *solid[32];
90 uint32_t solid_cache[32]; /* low 16 are opaque, high 16 transparent */
94 } last_solid_cache[2];
96 /* TRUE if the server has a bug with repeating pictures
98 * https://bugs.freedesktop.org/show_bug.cgi?id=3566
100 * We can't test for this because it depends on whether the
101 * picture is in video memory or not.
103 * We also use this variable as a guard against a second
104 * independent bug with transformed repeating pictures:
106 * http://lists.freedesktop.org/archives/cairo/2004-September/001839.html
108 * Both are fixed in xorg >= 6.9 and hopefully in > 6.8.2, so
109 * we can reuse the test for now.
111 unsigned int buggy_gradients : 1;
112 unsigned int buggy_pad_reflect : 1;
113 unsigned int buggy_repeat : 1;
114 unsigned int closed :1;
117 typedef struct _cairo_xlib_visual_info {
120 struct { uint8_t a, r, g, b; } colors[256];
121 uint8_t cube_to_pseudocolor[CUBE_SIZE][CUBE_SIZE][CUBE_SIZE];
122 uint8_t field8_to_cube[256];
123 int8_t dither8_to_cube[256];
124 uint8_t gray8_to_pseudocolor[256];
125 } cairo_xlib_visual_info_t;
127 struct _cairo_xlib_screen {
130 cairo_device_t *device;
133 cairo_list_t surfaces;
135 cairo_bool_t has_font_options;
136 cairo_font_options_t font_options;
138 GC gc[GC_CACHE_SIZE];
139 uint8_t gc_depths[GC_CACHE_SIZE];
141 cairo_list_t visuals;
145 GLYPHSET_INDEX_ARGB32,
151 typedef struct _cairo_xlib_font_glyphset {
153 cairo_format_t format;
154 XRenderPictFormat *xrender_format;
155 struct _cairo_xlib_font_glyphset_free_glyphs {
157 unsigned long indices[128];
159 } cairo_xlib_font_glyphset_t;
161 typedef struct _cairo_xlib_font {
162 cairo_scaled_font_private_t base;
163 cairo_scaled_font_t *font;
164 cairo_device_t *device;
166 cairo_xlib_font_glyphset_t glyphset[NUM_GLYPHSETS];
169 struct _cairo_xlib_surface {
170 cairo_surface_t base;
174 const cairo_compositor_t *compositor;
175 cairo_surface_t *shm;
178 cairo_xlib_display_t *display;
179 cairo_xlib_screen_t *screen;
182 Display *dpy; /* only valid between acquire/release */
184 cairo_bool_t owns_pixmap;
194 XRenderPictFormat *xrender_format;
195 /* XXX pixman_format instead of masks? */
201 struct _cairo_xlib_source {
202 cairo_surface_t base;
207 unsigned int filter:3;
208 unsigned int extend:3;
209 unsigned int has_matrix:1;
210 unsigned int has_component_alpha:1;
214 struct _cairo_xlib_proxy {
215 struct _cairo_xlib_source source;
216 cairo_surface_t *owner;
219 cairo_private cairo_status_t
220 _cairo_xlib_surface_get_gc (cairo_xlib_display_t *display,
221 cairo_xlib_surface_t *surface,
224 cairo_private cairo_device_t *
225 _cairo_xlib_device_create (Display *display);
228 _cairo_xlib_display_init_shm (cairo_xlib_display_t *display);
231 _cairo_xlib_display_fini_shm (cairo_xlib_display_t *display);
233 cairo_private cairo_xlib_screen_t *
234 _cairo_xlib_display_get_screen (cairo_xlib_display_t *display,
237 cairo_private cairo_status_t
238 _cairo_xlib_display_acquire (cairo_device_t *device,
239 cairo_xlib_display_t **display);
241 cairo_private cairo_bool_t
242 _cairo_xlib_display_has_repeat (cairo_device_t *device);
244 cairo_private cairo_bool_t
245 _cairo_xlib_display_has_reflect (cairo_device_t *device);
247 cairo_private cairo_bool_t
248 _cairo_xlib_display_has_gradients (cairo_device_t *device);
251 _cairo_xlib_display_set_precision(cairo_device_t *device,
254 cairo_private XRenderPictFormat *
255 _cairo_xlib_display_get_xrender_format (cairo_xlib_display_t *display,
256 cairo_format_t format);
258 cairo_private XRenderPictFormat *
259 _cairo_xlib_display_get_xrender_format_for_pixman (cairo_xlib_display_t *display,
260 pixman_format_code_t format);
262 cairo_private cairo_status_t
263 _cairo_xlib_screen_get (Display *dpy,
265 cairo_xlib_screen_t **out);
268 _cairo_xlib_screen_destroy (cairo_xlib_display_t *display,
269 cairo_xlib_screen_t *info);
272 _cairo_xlib_screen_get_gc (cairo_xlib_display_t *display,
273 cairo_xlib_screen_t *info,
277 _cairo_xlib_screen_put_gc (cairo_xlib_display_t *display,
278 cairo_xlib_screen_t *info,
282 cairo_private cairo_font_options_t *
283 _cairo_xlib_screen_get_font_options (cairo_xlib_screen_t *info);
285 cairo_private cairo_status_t
286 _cairo_xlib_screen_get_visual_info (cairo_xlib_display_t *display,
287 cairo_xlib_screen_t *info,
289 cairo_xlib_visual_info_t **out);
291 cairo_private cairo_status_t
292 _cairo_xlib_visual_info_create (Display *dpy,
295 cairo_xlib_visual_info_t **out);
298 _cairo_xlib_visual_info_destroy (cairo_xlib_visual_info_t *info);
300 cairo_private const cairo_compositor_t *
301 _cairo_xlib_core_compositor_get (void);
303 cairo_private const cairo_compositor_t *
304 _cairo_xlib_fallback_compositor_get (void);
306 cairo_private const cairo_compositor_t *
307 _cairo_xlib_mask_compositor_get (void);
309 cairo_private const cairo_compositor_t *
310 _cairo_xlib_traps_compositor_get (void);
313 _cairo_xlib_surface_ensure_picture (cairo_xlib_surface_t *surface);
316 _cairo_xlib_surface_set_precision (cairo_xlib_surface_t *surface,
317 cairo_antialias_t antialias);
319 cairo_private cairo_int_status_t
320 _cairo_xlib_surface_set_attributes (cairo_xlib_display_t *display,
321 cairo_xlib_surface_t *surface,
322 cairo_surface_attributes_t *attributes,
326 cairo_private cairo_status_t
327 _cairo_xlib_surface_draw_image (cairo_xlib_surface_t *surface,
328 cairo_image_surface_t *image,
336 cairo_private cairo_surface_t *
337 _cairo_xlib_source_create_for_pattern (cairo_surface_t *dst,
338 const cairo_pattern_t *pattern,
339 cairo_bool_t is_mask,
340 const cairo_rectangle_int_t *extents,
341 const cairo_rectangle_int_t *sample,
342 int *src_x, int *src_y);
345 _cairo_xlib_font_close (cairo_xlib_font_t *font);
347 #define CAIRO_RENDER_AT_LEAST(surface, major, minor) \
348 (((surface)->render_major > major) || \
349 (((surface)->render_major == major) && ((surface)->render_minor >= minor)))
351 #define CAIRO_RENDER_HAS_CREATE_PICTURE(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 0)
352 #define CAIRO_RENDER_HAS_COMPOSITE(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 0)
353 #define CAIRO_RENDER_HAS_COMPOSITE_TEXT(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 0)
355 #define CAIRO_RENDER_HAS_FILL_RECTANGLES(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 1)
357 #define CAIRO_RENDER_HAS_DISJOINT(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 2)
358 #define CAIRO_RENDER_HAS_CONJOINT(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 2)
360 #define CAIRO_RENDER_HAS_TRAPEZOIDS(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 4)
361 #define CAIRO_RENDER_HAS_TRIANGLES(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 4)
362 #define CAIRO_RENDER_HAS_TRISTRIP(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 4)
363 #define CAIRO_RENDER_HAS_TRIFAN(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 4)
365 #define CAIRO_RENDER_HAS_PICTURE_TRANSFORM(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 6)
366 #define CAIRO_RENDER_HAS_FILTERS(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 6)
368 #define CAIRO_RENDER_HAS_EXTENDED_REPEAT(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 10)
369 #define CAIRO_RENDER_HAS_GRADIENTS(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 10)
371 #define CAIRO_RENDER_HAS_PDF_OPERATORS(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 11)
373 #define CAIRO_RENDER_SUPPORTS_OPERATOR(surface, op) \
374 ((op) <= CAIRO_OPERATOR_SATURATE || \
375 (CAIRO_RENDER_HAS_PDF_OPERATORS(surface) && \
376 (op) <= CAIRO_OPERATOR_HSL_LUMINOSITY))
379 * Return whether two xlib surfaces share the same
380 * screen. Both core and Render drawing require this
381 * when using multiple drawables in an operation.
383 static inline cairo_bool_t
384 _cairo_xlib_surface_same_screen (cairo_xlib_surface_t *dst,
385 cairo_xlib_surface_t *src)
387 return dst->screen == src->screen;
391 _cairo_xlib_surface_put_gc (cairo_xlib_display_t *display,
392 cairo_xlib_surface_t *surface,
395 _cairo_xlib_screen_put_gc (display,
401 cairo_private cairo_surface_t *
402 _cairo_xlib_surface_create_similar_shm (void *surface,
403 cairo_format_t format,
404 int width, int height);
406 cairo_private cairo_surface_t *
407 _cairo_xlib_surface_get_shm (cairo_xlib_surface_t *surface,
408 cairo_bool_t overwrite);
410 cairo_private cairo_int_status_t
411 _cairo_xlib_surface_put_shm (cairo_xlib_surface_t *surface);
413 cairo_private cairo_surface_t *
414 _cairo_xlib_surface_create_shm (cairo_xlib_surface_t *other,
415 pixman_format_code_t format,
416 int width, int height);
418 cairo_private cairo_surface_t *
419 _cairo_xlib_surface_create_shm__image (cairo_xlib_surface_t *surface,
420 pixman_format_code_t format,
421 int width, int height);
424 _cairo_xlib_shm_surface_get_ximage (cairo_surface_t *surface,
428 _cairo_xlib_shm_surface_get_obdata (cairo_surface_t *surface);
431 _cairo_xlib_shm_surface_mark_active (cairo_surface_t *shm);
433 cairo_private cairo_bool_t
434 _cairo_xlib_shm_surface_is_active (cairo_surface_t *surface);
436 cairo_private cairo_bool_t
437 _cairo_xlib_shm_surface_is_idle (cairo_surface_t *surface);
440 _cairo_xlib_shm_surface_get_pixmap (cairo_surface_t *surface);
442 cairo_private XRenderPictFormat *
443 _cairo_xlib_shm_surface_get_xrender_format (cairo_surface_t *surface);
445 cairo_private pixman_format_code_t
446 _pixman_format_for_xlib_surface (cairo_xlib_surface_t *surface);
449 #endif /* CAIRO_XLIB_PRIVATE_H */