45228323308477100d8503f6dcb5c2c2947b3ab3
[framework/graphics/cairo.git] / src / cairo-xlib-private.h
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 <chris@chris-wilson.co.uk>
34  *      Karl Tomlinson <karlt+@karlt.net>, 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"
49 #include "cairo-scaled-font-private.h"
50 #include "cairo-surface-private.h"
51
52 #include <pixman.h>
53
54 typedef struct _cairo_xlib_display cairo_xlib_display_t;
55 typedef struct _cairo_xlib_screen cairo_xlib_screen_t;
56 typedef struct _cairo_xlib_source cairo_xlib_source_t;
57 typedef struct _cairo_xlib_surface cairo_xlib_surface_t;
58
59 /* size of color cube */
60 #define CUBE_SIZE 6
61 /* size of gray ramp */
62 #define RAMP_SIZE 16
63 /* maximum number of cached GC's */
64 #define GC_CACHE_SIZE 4
65
66 struct _cairo_xlib_display {
67     cairo_device_t base;
68
69     cairo_xlib_display_t *next;
70
71     Display *display;
72     cairo_list_t screens;
73     cairo_list_t fonts;
74
75     const cairo_compositor_t *compositor;
76
77     int render_major;
78     int render_minor;
79     XRenderPictFormat *cached_xrender_formats[CAIRO_FORMAT_RGB16_565 + 1];
80
81     int force_precision;
82
83     cairo_surface_t *white;
84     cairo_surface_t *alpha[256];
85     cairo_surface_t *solid[32];
86     uint32_t solid_cache[32]; /* low 16 are opaque, high 16 transparent */
87     struct {
88         uint32_t color;
89         int index;
90     } last_solid_cache[2];
91
92     /* TRUE if the server has a bug with repeating pictures
93      *
94      *  https://bugs.freedesktop.org/show_bug.cgi?id=3566
95      *
96      * We can't test for this because it depends on whether the
97      * picture is in video memory or not.
98      *
99      * We also use this variable as a guard against a second
100      * independent bug with transformed repeating pictures:
101      *
102      * http://lists.freedesktop.org/archives/cairo/2004-September/001839.html
103      *
104      * Both are fixed in xorg >= 6.9 and hopefully in > 6.8.2, so
105      * we can reuse the test for now.
106      */
107     unsigned int buggy_gradients : 1;
108     unsigned int buggy_pad_reflect : 1;
109     unsigned int buggy_repeat : 1;
110     unsigned int closed :1;
111 };
112
113 typedef struct _cairo_xlib_visual_info {
114     cairo_list_t link;
115     VisualID visualid;
116     struct { uint8_t a, r, g, b; } colors[256];
117     uint8_t cube_to_pseudocolor[CUBE_SIZE][CUBE_SIZE][CUBE_SIZE];
118     uint8_t field8_to_cube[256];
119     int8_t  dither8_to_cube[256];
120     uint8_t gray8_to_pseudocolor[256];
121 } cairo_xlib_visual_info_t;
122
123 struct _cairo_xlib_screen {
124     cairo_list_t link;
125
126     cairo_device_t *device;
127     Screen *screen;
128
129     cairo_list_t surfaces;
130
131     cairo_bool_t has_font_options;
132     cairo_font_options_t font_options;
133
134     GC gc[GC_CACHE_SIZE];
135     uint8_t gc_depths[GC_CACHE_SIZE];
136
137     cairo_list_t visuals;
138 };
139
140 enum {
141     GLYPHSET_INDEX_ARGB32,
142     GLYPHSET_INDEX_A8,
143     GLYPHSET_INDEX_A1,
144     NUM_GLYPHSETS
145 };
146
147 typedef struct _cairo_xlib_font_glyphset {
148     GlyphSet            glyphset;
149     cairo_format_t      format;
150     XRenderPictFormat   *xrender_format;
151     struct _cairo_xlib_font_glyphset_free_glyphs {
152         int             count;
153         unsigned long   indices[128];
154     } to_free;
155 } cairo_xlib_font_glyphset_t;
156
157 typedef struct _cairo_xlib_font {
158     cairo_scaled_font_private_t         base;
159     cairo_scaled_font_t                 *font;
160     cairo_device_t                      *device;
161     cairo_list_t                        link;
162     cairo_xlib_font_glyphset_t          glyphset[NUM_GLYPHSETS];
163 } cairo_xlib_font_t;
164
165 struct _cairo_xlib_surface {
166     cairo_surface_t base;
167
168     Picture picture;
169
170     const cairo_compositor_t *compositor;
171
172     cairo_xlib_display_t *display;
173     cairo_xlib_screen_t *screen;
174     cairo_list_t link;
175
176     Display *dpy; /* only valid between acquire/release */
177     Drawable drawable;
178     cairo_bool_t owns_pixmap;
179     Visual *visual;
180
181     int use_pixmap;
182
183     int width;
184     int height;
185     int depth;
186
187     int precision;
188     XRenderPictFormat *xrender_format;
189     /* XXX pixman_format instead of masks? */
190     uint32_t a_mask;
191     uint32_t r_mask;
192     uint32_t g_mask;
193     uint32_t b_mask;
194
195     struct _cairo_xlib_source {
196         cairo_surface_t base;
197
198         Picture picture;
199         Display *dpy;
200
201         unsigned int filter:3;
202         unsigned int extend:3;
203         unsigned int has_matrix:1;
204         unsigned int has_component_alpha:1;
205     } embedded_source;
206 };
207
208 cairo_private cairo_status_t
209 _cairo_xlib_surface_get_gc (cairo_xlib_display_t *display,
210                             cairo_xlib_surface_t *surface,
211                             GC                   *gc);
212
213 cairo_private cairo_device_t *
214 _cairo_xlib_device_create (Display *display);
215
216 cairo_private cairo_xlib_screen_t *
217 _cairo_xlib_display_get_screen (cairo_xlib_display_t *display,
218                                 Screen *screen);
219
220 cairo_private cairo_status_t
221 _cairo_xlib_display_acquire (cairo_device_t *device,
222                              cairo_xlib_display_t **display);
223
224 cairo_private cairo_bool_t
225 _cairo_xlib_display_has_repeat (cairo_device_t *device);
226
227 cairo_private cairo_bool_t
228 _cairo_xlib_display_has_reflect (cairo_device_t *device);
229
230 cairo_private cairo_bool_t
231 _cairo_xlib_display_has_gradients (cairo_device_t *device);
232
233 cairo_private void
234 _cairo_xlib_display_set_precision(cairo_device_t *device,
235                                   int precision);
236
237 cairo_private XRenderPictFormat *
238 _cairo_xlib_display_get_xrender_format (cairo_xlib_display_t    *display,
239                                         cairo_format_t           format);
240
241 cairo_private XRenderPictFormat *
242 _cairo_xlib_display_get_xrender_format_for_pixman (cairo_xlib_display_t *display,
243                                                    pixman_format_code_t format);
244
245 cairo_private cairo_status_t
246 _cairo_xlib_screen_get (Display *dpy,
247                         Screen *screen,
248                         cairo_xlib_screen_t **out);
249
250 cairo_private void
251 _cairo_xlib_screen_destroy (cairo_xlib_display_t *display,
252                             cairo_xlib_screen_t *info);
253
254 cairo_private GC
255 _cairo_xlib_screen_get_gc (cairo_xlib_display_t *display,
256                            cairo_xlib_screen_t *info,
257                            int depth,
258                            Drawable drawable);
259 cairo_private void
260 _cairo_xlib_screen_put_gc (cairo_xlib_display_t *display,
261                            cairo_xlib_screen_t *info,
262                            int depth,
263                            GC gc);
264
265 cairo_private cairo_font_options_t *
266 _cairo_xlib_screen_get_font_options (cairo_xlib_screen_t *info);
267
268 cairo_private cairo_status_t
269 _cairo_xlib_screen_get_visual_info (cairo_xlib_display_t *display,
270                                     cairo_xlib_screen_t *info,
271                                     Visual *visual,
272                                     cairo_xlib_visual_info_t **out);
273
274 cairo_private cairo_status_t
275 _cairo_xlib_visual_info_create (Display *dpy,
276                                 int screen,
277                                 VisualID visualid,
278                                 cairo_xlib_visual_info_t **out);
279
280 cairo_private void
281 _cairo_xlib_visual_info_destroy (cairo_xlib_visual_info_t *info);
282
283 cairo_private const cairo_compositor_t *
284 _cairo_xlib_core_compositor_get (void);
285
286 cairo_private const cairo_compositor_t *
287 _cairo_xlib_fallback_compositor_get (void);
288
289 cairo_private const cairo_compositor_t *
290 _cairo_xlib_mask_compositor_get (void);
291
292 cairo_private const cairo_compositor_t *
293 _cairo_xlib_traps_compositor_get (void);
294
295 cairo_private void
296 _cairo_xlib_surface_ensure_picture (cairo_xlib_surface_t    *surface);
297
298 cairo_private void
299 _cairo_xlib_surface_set_precision (cairo_xlib_surface_t *surface,
300                                    cairo_antialias_t     antialias);
301
302 cairo_private cairo_int_status_t
303 _cairo_xlib_surface_set_attributes (cairo_xlib_display_t       *display,
304                                     cairo_xlib_surface_t       *surface,
305                                     cairo_surface_attributes_t *attributes,
306                                     double                      xc,
307                                     double                      yc);
308
309 cairo_private cairo_status_t
310 _cairo_xlib_surface_draw_image (cairo_xlib_surface_t   *surface,
311                                 cairo_image_surface_t  *image,
312                                 int                    src_x,
313                                 int                    src_y,
314                                 int                    width,
315                                 int                    height,
316                                 int                    dst_x,
317                                 int                    dst_y);
318
319 cairo_private cairo_surface_t *
320 _cairo_xlib_source_create_for_pattern (cairo_surface_t *dst,
321                                        const cairo_pattern_t *pattern,
322                                        cairo_bool_t is_mask,
323                                        const cairo_rectangle_int_t *extents,
324                                        const cairo_rectangle_int_t *sample,
325                                        int *src_x, int *src_y);
326
327 cairo_private void
328 _cairo_xlib_font_close (cairo_xlib_font_t *font);
329
330 #define CAIRO_RENDER_AT_LEAST(surface, major, minor)    \
331         (((surface)->render_major > major) ||                   \
332          (((surface)->render_major == major) && ((surface)->render_minor >= minor)))
333
334 #define CAIRO_RENDER_HAS_CREATE_PICTURE(surface)                CAIRO_RENDER_AT_LEAST((surface), 0, 0)
335 #define CAIRO_RENDER_HAS_COMPOSITE(surface)             CAIRO_RENDER_AT_LEAST((surface), 0, 0)
336 #define CAIRO_RENDER_HAS_COMPOSITE_TEXT(surface)        CAIRO_RENDER_AT_LEAST((surface), 0, 0)
337
338 #define CAIRO_RENDER_HAS_FILL_RECTANGLES(surface)               CAIRO_RENDER_AT_LEAST((surface), 0, 1)
339
340 #define CAIRO_RENDER_HAS_DISJOINT(surface)                      CAIRO_RENDER_AT_LEAST((surface), 0, 2)
341 #define CAIRO_RENDER_HAS_CONJOINT(surface)                      CAIRO_RENDER_AT_LEAST((surface), 0, 2)
342
343 #define CAIRO_RENDER_HAS_TRAPEZOIDS(surface)            CAIRO_RENDER_AT_LEAST((surface), 0, 4)
344 #define CAIRO_RENDER_HAS_TRIANGLES(surface)             CAIRO_RENDER_AT_LEAST((surface), 0, 4)
345 #define CAIRO_RENDER_HAS_TRISTRIP(surface)                      CAIRO_RENDER_AT_LEAST((surface), 0, 4)
346 #define CAIRO_RENDER_HAS_TRIFAN(surface)                        CAIRO_RENDER_AT_LEAST((surface), 0, 4)
347
348 #define CAIRO_RENDER_HAS_PICTURE_TRANSFORM(surface)     CAIRO_RENDER_AT_LEAST((surface), 0, 6)
349 #define CAIRO_RENDER_HAS_FILTERS(surface)       CAIRO_RENDER_AT_LEAST((surface), 0, 6)
350
351 #define CAIRO_RENDER_HAS_EXTENDED_REPEAT(surface)       CAIRO_RENDER_AT_LEAST((surface), 0, 10)
352 #define CAIRO_RENDER_HAS_GRADIENTS(surface)     CAIRO_RENDER_AT_LEAST((surface), 0, 10)
353
354 #define CAIRO_RENDER_HAS_PDF_OPERATORS(surface) CAIRO_RENDER_AT_LEAST((surface), 0, 11)
355
356 #define CAIRO_RENDER_SUPPORTS_OPERATOR(surface, op)     \
357      ((op) <= CAIRO_OPERATOR_SATURATE ||                        \
358       (CAIRO_RENDER_HAS_PDF_OPERATORS(surface) &&       \
359        (op) <= CAIRO_OPERATOR_HSL_LUMINOSITY))
360
361 /*
362  * Return whether two xlib surfaces share the same
363  * screen.  Both core and Render drawing require this
364  * when using multiple drawables in an operation.
365  */
366 static inline cairo_bool_t
367 _cairo_xlib_surface_same_screen (cairo_xlib_surface_t *dst,
368                                  cairo_xlib_surface_t *src)
369 {
370     return dst->screen == src->screen;
371 }
372
373 static inline void
374 _cairo_xlib_surface_put_gc (cairo_xlib_display_t *display,
375                             cairo_xlib_surface_t *surface,
376                             GC                    gc)
377 {
378     _cairo_xlib_screen_put_gc (display,
379                                surface->screen,
380                                surface->depth,
381                                gc);
382 }
383
384 #endif /* CAIRO_XLIB_PRIVATE_H */