7b56d17467f6b742b93805f92a212c46c63fa0b2
[framework/graphics/cairo.git] / src / cairo-compositor-private.h
1 /* -*- Mode: c; tab-width: 8; c-basic-offset: 4; indent-tabs-mode: t; -*- */
2 /* cairo - a vector graphics library with display and print output
3  *
4  * Copyright © 2011 Intel Corporation
5  *
6  * This library is free software; you can redistribute it and/or
7  * modify it either under the terms of the GNU Lesser General Public
8  * License version 2.1 as published by the Free Software Foundation
9  * (the "LGPL") or, at your option, under the terms of the Mozilla
10  * Public License Version 1.1 (the "MPL"). If you do not alter this
11  * notice, a recipient may use your version of this file under either
12  * the MPL or the LGPL.
13  *
14  * You should have received a copy of the LGPL along with this library
15  * in the file COPYING-LGPL-2.1; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Suite 500, Boston, MA 02110-1335, USA
17  * You should have received a copy of the MPL along with this library
18  * in the file COPYING-MPL-1.1
19  *
20  * The contents of this file are subject to the Mozilla Public License
21  * Version 1.1 (the "License"); you may not use this file except in
22  * compliance with the License. You may obtain a copy of the License at
23  * http://www.mozilla.org/MPL/
24  *
25  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY
26  * OF ANY KIND, either express or implied. See the LGPL or the MPL for
27  * the specific language governing rights and limitations.
28  *
29  * The Original Code is the cairo graphics library.
30  *
31  * The Initial Developer of the Original Code is University of Southern
32  * California.
33  *
34  * Contributor(s):
35  *      Chris Wilson <chris@chris-wilson.co.uk>
36  */
37
38 #ifndef CAIRO_COMPOSITOR_PRIVATE_H
39 #define CAIRO_COMPOSITOR_PRIVATE_H
40
41 #include "cairo-composite-rectangles-private.h"
42
43 CAIRO_BEGIN_DECLS
44
45 typedef struct {
46     cairo_scaled_font_t *font;
47     cairo_glyph_t *glyphs;
48     int num_glyphs;
49     cairo_bool_t use_mask;
50     cairo_rectangle_int_t extents;
51 } cairo_composite_glyphs_info_t;
52
53 struct cairo_compositor {
54     const cairo_compositor_t *delegate;
55
56     cairo_warn cairo_int_status_t
57     (*paint)                    (const cairo_compositor_t       *compositor,
58                                  cairo_composite_rectangles_t   *extents);
59
60     cairo_warn cairo_int_status_t
61     (*mask)                     (const cairo_compositor_t       *compositor,
62                                  cairo_composite_rectangles_t   *extents);
63
64     cairo_warn cairo_int_status_t
65     (*stroke)                   (const cairo_compositor_t       *compositor,
66                                  cairo_composite_rectangles_t   *extents,
67                                  const cairo_path_fixed_t       *path,
68                                  const cairo_stroke_style_t     *style,
69                                  const cairo_matrix_t           *ctm,
70                                  const cairo_matrix_t           *ctm_inverse,
71                                  double                          tolerance,
72                                  cairo_antialias_t               antialias);
73
74     cairo_warn cairo_int_status_t
75     (*fill)                     (const cairo_compositor_t       *compositor,
76                                  cairo_composite_rectangles_t   *extents,
77                                  const cairo_path_fixed_t       *path,
78                                  cairo_fill_rule_t               fill_rule,
79                                  double                          tolerance,
80                                  cairo_antialias_t               antialias);
81
82     cairo_warn cairo_int_status_t
83     (*glyphs)                   (const cairo_compositor_t        *compositor,
84                                  cairo_composite_rectangles_t   *extents,
85                                  cairo_scaled_font_t            *scaled_font,
86                                  cairo_glyph_t                  *glyphs,
87                                  int                             num_glyphs,
88                                  cairo_bool_t                    overlap);
89     cairo_bool_t lazy_init;
90 };
91
92 struct cairo_mask_compositor {
93     cairo_compositor_t base;
94
95     cairo_int_status_t (*acquire) (void *surface);
96     cairo_int_status_t (*release) (void *surface);
97
98     cairo_int_status_t (*set_clip_region) (void          *surface,
99                                            cairo_region_t       *clip_region);
100
101     cairo_surface_t * (*pattern_to_surface) (cairo_surface_t *dst,
102                                              const cairo_pattern_t *pattern,
103                                              cairo_bool_t is_mask,
104                                              const cairo_rectangle_int_t *extents,
105                                              const cairo_rectangle_int_t *sample,
106                                              int *src_x, int *src_y);
107
108     cairo_int_status_t (*draw_image_boxes) (void *surface,
109                                             cairo_image_surface_t *image,
110                                             cairo_boxes_t *boxes,
111                                             int dx, int dy);
112
113     cairo_int_status_t (*copy_boxes) (void *surface,
114                                       cairo_surface_t *src,
115                                       cairo_boxes_t *boxes,
116                                       const cairo_rectangle_int_t *extents,
117                                       int dx, int dy);
118
119     cairo_int_status_t
120         (*fill_rectangles)      (void                    *surface,
121                                  cairo_operator_t         op,
122                                  const cairo_color_t     *color,
123                                  cairo_rectangle_int_t   *rectangles,
124                                  int                      num_rects);
125
126     cairo_int_status_t
127         (*fill_boxes)           (void                   *surface,
128                                  cairo_operator_t        op,
129                                  const cairo_color_t    *color,
130                                  cairo_boxes_t          *boxes);
131
132     cairo_int_status_t
133         (*composite)            (void                   *dst,
134                                  cairo_operator_t        op,
135                                  cairo_surface_t        *src,
136                                  cairo_surface_t        *mask,
137                                  int                     src_x,
138                                  int                     src_y,
139                                  int                     mask_x,
140                                  int                     mask_y,
141                                  int                     dst_x,
142                                  int                     dst_y,
143                                  unsigned int            width,
144                                  unsigned int            height);
145
146     cairo_int_status_t
147         (*composite_boxes)      (void                   *surface,
148                                  cairo_operator_t        op,
149                                  cairo_surface_t        *source,
150                                  cairo_surface_t        *mask,
151                                  int                     src_x,
152                                  int                     src_y,
153                                  int                     mask_x,
154                                  int                     mask_y,
155                                  int                     dst_x,
156                                  int                     dst_y,
157                                  cairo_boxes_t          *boxes,
158                                  const cairo_rectangle_int_t  *extents);
159
160     cairo_int_status_t
161         (*check_composite_glyphs) (const cairo_composite_rectangles_t *extents,
162                                    cairo_scaled_font_t *scaled_font,
163                                    cairo_glyph_t *glyphs,
164                                    int *num_glyphs);
165     cairo_int_status_t
166         (*composite_glyphs)     (void                           *surface,
167                                  cairo_operator_t                op,
168                                  cairo_surface_t                *src,
169                                  int                             src_x,
170                                  int                             src_y,
171                                  int                             dst_x,
172                                  int                             dst_y,
173                                  cairo_composite_glyphs_info_t  *info);
174 };
175
176 struct cairo_traps_compositor {
177     cairo_compositor_t base;
178
179     cairo_int_status_t
180         (*acquire) (void *surface);
181
182     cairo_int_status_t
183         (*release) (void *surface);
184
185     cairo_int_status_t
186         (*set_clip_region) (void                 *surface,
187                             cairo_region_t      *clip_region);
188
189     cairo_surface_t *
190         (*pattern_to_surface) (cairo_surface_t *dst,
191                                const cairo_pattern_t *pattern,
192                                cairo_bool_t is_mask,
193                                const cairo_rectangle_int_t *extents,
194                                const cairo_rectangle_int_t *sample,
195                                int *src_x, int *src_y);
196
197     cairo_int_status_t (*draw_image_boxes) (void *surface,
198                                             cairo_image_surface_t *image,
199                                             cairo_boxes_t *boxes,
200                                             int dx, int dy);
201
202     cairo_int_status_t (*copy_boxes) (void *surface,
203                                       cairo_surface_t *src,
204                                       cairo_boxes_t *boxes,
205                                       const cairo_rectangle_int_t *extents,
206                                       int dx, int dy);
207
208     cairo_int_status_t
209         (*fill_boxes)           (void                   *surface,
210                                  cairo_operator_t        op,
211                                  const cairo_color_t    *color,
212                                  cairo_boxes_t          *boxes);
213
214     cairo_int_status_t
215         (*check_composite) (const cairo_composite_rectangles_t *extents);
216
217     cairo_int_status_t
218         (*composite)            (void                   *dst,
219                                  cairo_operator_t        op,
220                                  cairo_surface_t        *src,
221                                  cairo_surface_t        *mask,
222                                  int                     src_x,
223                                  int                     src_y,
224                                  int                     mask_x,
225                                  int                     mask_y,
226                                  int                     dst_x,
227                                  int                     dst_y,
228                                  unsigned int            width,
229                                  unsigned int            height);
230     cairo_int_status_t
231             (*lerp)             (void                   *_dst,
232                                  cairo_surface_t        *abstract_src,
233                                  cairo_surface_t        *abstract_mask,
234                                  int                    src_x,
235                                  int                    src_y,
236                                  int                    mask_x,
237                                  int                    mask_y,
238                                  int                    dst_x,
239                                  int                    dst_y,
240                                  unsigned int           width,
241                                  unsigned int           height);
242
243     cairo_int_status_t
244         (*composite_boxes)      (void                   *surface,
245                                  cairo_operator_t        op,
246                                  cairo_surface_t        *source,
247                                  cairo_surface_t        *mask,
248                                  int                     src_x,
249                                  int                     src_y,
250                                  int                     mask_x,
251                                  int                     mask_y,
252                                  int                     dst_x,
253                                  int                     dst_y,
254                                  cairo_boxes_t          *boxes,
255                                  const cairo_rectangle_int_t  *extents);
256
257     cairo_int_status_t
258         (*composite_traps)      (void                   *dst,
259                                  cairo_operator_t        op,
260                                  cairo_surface_t        *source,
261                                  int                     src_x,
262                                  int                     src_y,
263                                  int                     dst_x,
264                                  int                     dst_y,
265                                  const cairo_rectangle_int_t *extents,
266                                  cairo_antialias_t       antialias,
267                                  cairo_traps_t          *traps);
268
269     cairo_int_status_t
270         (*composite_tristrip)   (void                   *dst,
271                                  cairo_operator_t        op,
272                                  cairo_surface_t        *source,
273                                  int                     src_x,
274                                  int                     src_y,
275                                  int                     dst_x,
276                                  int                     dst_y,
277                                  const cairo_rectangle_int_t *extents,
278                                  cairo_antialias_t       antialias,
279                                  cairo_tristrip_t       *tristrip);
280
281     cairo_int_status_t
282         (*check_composite_glyphs) (const cairo_composite_rectangles_t *extents,
283                                    cairo_scaled_font_t *scaled_font,
284                                    cairo_glyph_t *glyphs,
285                                    int *num_glyphs);
286     cairo_int_status_t
287         (*composite_glyphs)     (void                           *surface,
288                                  cairo_operator_t                op,
289                                  cairo_surface_t                *src,
290                                  int                             src_x,
291                                  int                             src_y,
292                                  int                             dst_x,
293                                  int                             dst_y,
294                                  cairo_composite_glyphs_info_t  *info);
295 };
296
297 cairo_private extern const cairo_compositor_t __cairo_no_compositor;
298 cairo_private extern const cairo_compositor_t _cairo_fallback_compositor;
299
300 cairo_private void
301 _cairo_mask_compositor_init (cairo_mask_compositor_t *compositor,
302                              const cairo_compositor_t *delegate);
303
304 cairo_private void
305 _cairo_shape_mask_compositor_init (cairo_compositor_t *compositor,
306                                    const cairo_compositor_t  *delegate);
307
308 cairo_private void
309 _cairo_traps_compositor_init (cairo_traps_compositor_t *compositor,
310                               const cairo_compositor_t *delegate);
311
312 cairo_private cairo_int_status_t
313 _cairo_compositor_paint (const cairo_compositor_t       *compositor,
314                          cairo_surface_t                *surface,
315                          cairo_operator_t                op,
316                          const cairo_pattern_t          *source,
317                          const cairo_clip_t             *clip);
318
319 cairo_private cairo_int_status_t
320 _cairo_compositor_mask (const cairo_compositor_t        *compositor,
321                         cairo_surface_t                 *surface,
322                         cairo_operator_t                 op,
323                         const cairo_pattern_t           *source,
324                         const cairo_pattern_t           *mask,
325                         const cairo_clip_t              *clip);
326
327 cairo_private cairo_int_status_t
328 _cairo_compositor_stroke (const cairo_compositor_t      *compositor,
329                           cairo_surface_t               *surface,
330                           cairo_operator_t               op,
331                           const cairo_pattern_t         *source,
332                           const cairo_path_fixed_t      *path,
333                           const cairo_stroke_style_t    *style,
334                           const cairo_matrix_t          *ctm,
335                           const cairo_matrix_t          *ctm_inverse,
336                           double                         tolerance,
337                           cairo_antialias_t              antialias,
338                           const cairo_clip_t            *clip);
339
340 cairo_private cairo_int_status_t
341 _cairo_compositor_fill (const cairo_compositor_t        *compositor,
342                         cairo_surface_t                 *surface,
343                         cairo_operator_t                 op,
344                         const cairo_pattern_t           *source,
345                         const cairo_path_fixed_t        *path,
346                         cairo_fill_rule_t                fill_rule,
347                         double                           tolerance,
348                         cairo_antialias_t                antialias,
349                         const cairo_clip_t              *clip);
350
351 cairo_private cairo_int_status_t
352 _cairo_compositor_glyphs (const cairo_compositor_t              *compositor,
353                           cairo_surface_t                       *surface,
354                           cairo_operator_t                       op,
355                           const cairo_pattern_t                 *source,
356                           cairo_glyph_t                         *glyphs,
357                           int                                    num_glyphs,
358                           cairo_scaled_font_t                   *scaled_font,
359                           const cairo_clip_t                    *clip);
360
361 CAIRO_END_DECLS
362
363 #endif /* CAIRO_COMPOSITOR_PRIVATE_H */