Line data Source code
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 : * Contributor(s):
33 : * Carl D. Worth <cworth@redhat.com>
34 : */
35 :
36 : #ifndef CAIRO_GSTATE_PRIVATE_H
37 : #define CAIRO_GSTATE_PRIVATE_H
38 :
39 : #include "cairo-clip-private.h"
40 :
41 : struct _cairo_gstate {
42 : cairo_operator_t op;
43 :
44 : double tolerance;
45 : cairo_antialias_t antialias;
46 :
47 : cairo_stroke_style_t stroke_style;
48 :
49 : cairo_fill_rule_t fill_rule;
50 :
51 : cairo_font_face_t *font_face;
52 : cairo_scaled_font_t *scaled_font; /* Specific to the current CTM */
53 : cairo_scaled_font_t *previous_scaled_font; /* holdover */
54 : cairo_matrix_t font_matrix;
55 : cairo_font_options_t font_options;
56 :
57 : cairo_clip_t clip;
58 :
59 : cairo_surface_t *target; /* The target to which all rendering is directed */
60 : cairo_surface_t *parent_target; /* The previous target which was receiving rendering */
61 : cairo_surface_t *original_target; /* The original target the initial gstate was created with */
62 :
63 : /* the user is allowed to update the device after we have cached the matrices... */
64 : cairo_observer_t device_transform_observer;
65 :
66 : cairo_matrix_t ctm;
67 : cairo_matrix_t ctm_inverse;
68 : cairo_matrix_t source_ctm_inverse; /* At the time ->source was set */
69 : cairo_bool_t is_identity;
70 :
71 : cairo_pattern_t *source;
72 :
73 : struct _cairo_gstate *next;
74 : };
75 :
76 : /* cairo-gstate.c */
77 : cairo_private cairo_status_t
78 : _cairo_gstate_init (cairo_gstate_t *gstate,
79 : cairo_surface_t *target);
80 :
81 : cairo_private void
82 : _cairo_gstate_fini (cairo_gstate_t *gstate);
83 :
84 : cairo_private cairo_status_t
85 : _cairo_gstate_save (cairo_gstate_t **gstate, cairo_gstate_t **freelist);
86 :
87 : cairo_private cairo_status_t
88 : _cairo_gstate_restore (cairo_gstate_t **gstate, cairo_gstate_t **freelist);
89 :
90 : cairo_private cairo_bool_t
91 : _cairo_gstate_is_redirected (cairo_gstate_t *gstate);
92 :
93 : cairo_private cairo_status_t
94 : _cairo_gstate_redirect_target (cairo_gstate_t *gstate, cairo_surface_t *child);
95 :
96 : cairo_private cairo_surface_t *
97 : _cairo_gstate_get_target (cairo_gstate_t *gstate);
98 :
99 : cairo_private cairo_surface_t *
100 : _cairo_gstate_get_parent_target (cairo_gstate_t *gstate);
101 :
102 : cairo_private cairo_surface_t *
103 : _cairo_gstate_get_original_target (cairo_gstate_t *gstate);
104 :
105 : cairo_private cairo_clip_t *
106 : _cairo_gstate_get_clip (cairo_gstate_t *gstate);
107 :
108 : cairo_private cairo_status_t
109 : _cairo_gstate_set_source (cairo_gstate_t *gstate, cairo_pattern_t *source);
110 :
111 : cairo_private cairo_pattern_t *
112 : _cairo_gstate_get_source (cairo_gstate_t *gstate);
113 :
114 : cairo_private cairo_status_t
115 : _cairo_gstate_set_operator (cairo_gstate_t *gstate, cairo_operator_t op);
116 :
117 : cairo_private cairo_operator_t
118 : _cairo_gstate_get_operator (cairo_gstate_t *gstate);
119 :
120 : cairo_private cairo_status_t
121 : _cairo_gstate_set_tolerance (cairo_gstate_t *gstate, double tolerance);
122 :
123 : cairo_private double
124 : _cairo_gstate_get_tolerance (cairo_gstate_t *gstate);
125 :
126 : cairo_private cairo_status_t
127 : _cairo_gstate_set_fill_rule (cairo_gstate_t *gstate, cairo_fill_rule_t fill_rule);
128 :
129 : cairo_private cairo_fill_rule_t
130 : _cairo_gstate_get_fill_rule (cairo_gstate_t *gstate);
131 :
132 : cairo_private cairo_status_t
133 : _cairo_gstate_set_line_width (cairo_gstate_t *gstate, double width);
134 :
135 : cairo_private double
136 : _cairo_gstate_get_line_width (cairo_gstate_t *gstate);
137 :
138 : cairo_private cairo_status_t
139 : _cairo_gstate_set_line_cap (cairo_gstate_t *gstate, cairo_line_cap_t line_cap);
140 :
141 : cairo_private cairo_line_cap_t
142 : _cairo_gstate_get_line_cap (cairo_gstate_t *gstate);
143 :
144 : cairo_private cairo_status_t
145 : _cairo_gstate_set_line_join (cairo_gstate_t *gstate, cairo_line_join_t line_join);
146 :
147 : cairo_private cairo_line_join_t
148 : _cairo_gstate_get_line_join (cairo_gstate_t *gstate);
149 :
150 : cairo_private cairo_status_t
151 : _cairo_gstate_set_dash (cairo_gstate_t *gstate, const double *dash, int num_dashes, double offset);
152 :
153 : cairo_private void
154 : _cairo_gstate_get_dash (cairo_gstate_t *gstate, double *dash, int *num_dashes, double *offset);
155 :
156 : cairo_private cairo_status_t
157 : _cairo_gstate_set_miter_limit (cairo_gstate_t *gstate, double limit);
158 :
159 : cairo_private double
160 : _cairo_gstate_get_miter_limit (cairo_gstate_t *gstate);
161 :
162 : cairo_private void
163 : _cairo_gstate_get_matrix (cairo_gstate_t *gstate, cairo_matrix_t *matrix);
164 :
165 : cairo_private cairo_status_t
166 : _cairo_gstate_translate (cairo_gstate_t *gstate, double tx, double ty);
167 :
168 : cairo_private cairo_status_t
169 : _cairo_gstate_scale (cairo_gstate_t *gstate, double sx, double sy);
170 :
171 : cairo_private cairo_status_t
172 : _cairo_gstate_rotate (cairo_gstate_t *gstate, double angle);
173 :
174 : cairo_private cairo_status_t
175 : _cairo_gstate_transform (cairo_gstate_t *gstate,
176 : const cairo_matrix_t *matrix);
177 :
178 : cairo_private cairo_status_t
179 : _cairo_gstate_set_matrix (cairo_gstate_t *gstate,
180 : const cairo_matrix_t *matrix);
181 :
182 : cairo_private void
183 : _cairo_gstate_identity_matrix (cairo_gstate_t *gstate);
184 :
185 : cairo_private void
186 : _cairo_gstate_user_to_device (cairo_gstate_t *gstate, double *x, double *y);
187 :
188 : cairo_private void
189 : _cairo_gstate_user_to_device_distance (cairo_gstate_t *gstate, double *dx, double *dy);
190 :
191 : cairo_private void
192 : _cairo_gstate_device_to_user (cairo_gstate_t *gstate, double *x, double *y);
193 :
194 : cairo_private void
195 : _cairo_gstate_device_to_user_distance (cairo_gstate_t *gstate, double *dx, double *dy);
196 :
197 : cairo_private void
198 : _do_cairo_gstate_user_to_backend (cairo_gstate_t *gstate, double *x, double *y);
199 :
200 : static inline void
201 0 : _cairo_gstate_user_to_backend (cairo_gstate_t *gstate, double *x, double *y)
202 : {
203 0 : if (! gstate->is_identity)
204 0 : _do_cairo_gstate_user_to_backend (gstate, x, y);
205 0 : }
206 :
207 : cairo_private void
208 : _do_cairo_gstate_backend_to_user (cairo_gstate_t *gstate, double *x, double *y);
209 :
210 : static inline void
211 0 : _cairo_gstate_backend_to_user (cairo_gstate_t *gstate, double *x, double *y)
212 : {
213 0 : if (! gstate->is_identity)
214 0 : _do_cairo_gstate_backend_to_user (gstate, x, y);
215 0 : }
216 :
217 : cairo_private void
218 : _cairo_gstate_backend_to_user_rectangle (cairo_gstate_t *gstate,
219 : double *x1, double *y1,
220 : double *x2, double *y2,
221 : cairo_bool_t *is_tight);
222 :
223 : cairo_private void
224 : _cairo_gstate_path_extents (cairo_gstate_t *gstate,
225 : cairo_path_fixed_t *path,
226 : double *x1, double *y1,
227 : double *x2, double *y2);
228 :
229 : cairo_private cairo_status_t
230 : _cairo_gstate_paint (cairo_gstate_t *gstate);
231 :
232 : cairo_private cairo_status_t
233 : _cairo_gstate_mask (cairo_gstate_t *gstate,
234 : cairo_pattern_t *mask);
235 :
236 : cairo_private cairo_status_t
237 : _cairo_gstate_stroke (cairo_gstate_t *gstate, cairo_path_fixed_t *path);
238 :
239 : cairo_private cairo_status_t
240 : _cairo_gstate_fill (cairo_gstate_t *gstate, cairo_path_fixed_t *path);
241 :
242 : cairo_private cairo_status_t
243 : _cairo_gstate_copy_page (cairo_gstate_t *gstate);
244 :
245 : cairo_private cairo_status_t
246 : _cairo_gstate_show_page (cairo_gstate_t *gstate);
247 :
248 : cairo_private cairo_status_t
249 : _cairo_gstate_stroke_extents (cairo_gstate_t *gstate,
250 : cairo_path_fixed_t *path,
251 : double *x1, double *y1,
252 : double *x2, double *y2);
253 :
254 : cairo_private cairo_status_t
255 : _cairo_gstate_fill_extents (cairo_gstate_t *gstate,
256 : cairo_path_fixed_t *path,
257 : double *x1, double *y1,
258 : double *x2, double *y2);
259 :
260 : cairo_private cairo_status_t
261 : _cairo_gstate_in_stroke (cairo_gstate_t *gstate,
262 : cairo_path_fixed_t *path,
263 : double x,
264 : double y,
265 : cairo_bool_t *inside_ret);
266 :
267 : cairo_private cairo_bool_t
268 : _cairo_gstate_in_fill (cairo_gstate_t *gstate,
269 : cairo_path_fixed_t *path,
270 : double x,
271 : double y);
272 :
273 : cairo_private cairo_bool_t
274 : _cairo_gstate_in_clip (cairo_gstate_t *gstate,
275 : double x,
276 : double y);
277 :
278 : cairo_private cairo_status_t
279 : _cairo_gstate_clip (cairo_gstate_t *gstate, cairo_path_fixed_t *path);
280 :
281 : cairo_private cairo_status_t
282 : _cairo_gstate_reset_clip (cairo_gstate_t *gstate);
283 :
284 : cairo_private cairo_bool_t
285 : _cairo_gstate_clip_extents (cairo_gstate_t *gstate,
286 : double *x1,
287 : double *y1,
288 : double *x2,
289 : double *y2);
290 :
291 : cairo_private cairo_rectangle_list_t*
292 : _cairo_gstate_copy_clip_rectangle_list (cairo_gstate_t *gstate);
293 :
294 : cairo_private cairo_status_t
295 : _cairo_gstate_show_surface (cairo_gstate_t *gstate,
296 : cairo_surface_t *surface,
297 : double x,
298 : double y,
299 : double width,
300 : double height);
301 :
302 : cairo_private cairo_status_t
303 : _cairo_gstate_select_font_face (cairo_gstate_t *gstate,
304 : const char *family,
305 : cairo_font_slant_t slant,
306 : cairo_font_weight_t weight);
307 :
308 : cairo_private cairo_status_t
309 : _cairo_gstate_set_font_size (cairo_gstate_t *gstate,
310 : double size);
311 :
312 : cairo_private void
313 : _cairo_gstate_get_font_matrix (cairo_gstate_t *gstate,
314 : cairo_matrix_t *matrix);
315 :
316 : cairo_private cairo_status_t
317 : _cairo_gstate_set_font_matrix (cairo_gstate_t *gstate,
318 : const cairo_matrix_t *matrix);
319 :
320 : cairo_private void
321 : _cairo_gstate_get_font_options (cairo_gstate_t *gstate,
322 : cairo_font_options_t *options);
323 :
324 : cairo_private void
325 : _cairo_gstate_set_font_options (cairo_gstate_t *gstate,
326 : const cairo_font_options_t *options);
327 :
328 : cairo_private cairo_status_t
329 : _cairo_gstate_get_font_face (cairo_gstate_t *gstate,
330 : cairo_font_face_t **font_face);
331 :
332 : cairo_private cairo_status_t
333 : _cairo_gstate_get_scaled_font (cairo_gstate_t *gstate,
334 : cairo_scaled_font_t **scaled_font);
335 :
336 : cairo_private cairo_status_t
337 : _cairo_gstate_get_font_extents (cairo_gstate_t *gstate,
338 : cairo_font_extents_t *extents);
339 :
340 : cairo_private cairo_status_t
341 : _cairo_gstate_set_font_face (cairo_gstate_t *gstate,
342 : cairo_font_face_t *font_face);
343 :
344 : cairo_private cairo_status_t
345 : _cairo_gstate_text_to_glyphs (cairo_gstate_t *gstate,
346 : double x,
347 : double y,
348 : const char *utf8,
349 : int utf8_len,
350 : cairo_glyph_t **glyphs,
351 : int *num_glyphs,
352 : cairo_text_cluster_t **clusters,
353 : int *num_clusters,
354 : cairo_text_cluster_flags_t *cluster_flags);
355 :
356 : cairo_private cairo_status_t
357 : _cairo_gstate_glyph_extents (cairo_gstate_t *gstate,
358 : const cairo_glyph_t *glyphs,
359 : int num_glyphs,
360 : cairo_text_extents_t *extents);
361 :
362 : cairo_private cairo_status_t
363 : _cairo_gstate_show_text_glyphs (cairo_gstate_t *gstate,
364 : const char *utf8,
365 : int utf8_len,
366 : const cairo_glyph_t *glyphs,
367 : int num_glyphs,
368 : const cairo_text_cluster_t *clusters,
369 : int num_clusters,
370 : cairo_text_cluster_flags_t cluster_flags);
371 :
372 : cairo_private cairo_status_t
373 : _cairo_gstate_glyph_path (cairo_gstate_t *gstate,
374 : const cairo_glyph_t *glyphs,
375 : int num_glyphs,
376 : cairo_path_fixed_t *path);
377 :
378 : cairo_private cairo_status_t
379 : _cairo_gstate_set_antialias (cairo_gstate_t *gstate,
380 : cairo_antialias_t antialias);
381 :
382 : cairo_private cairo_antialias_t
383 : _cairo_gstate_get_antialias (cairo_gstate_t *gstate);
384 :
385 : #endif /* CAIRO_GSTATE_PRIVATE_H */
|