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 35... | Line 35... | ||
35 | * Chris Wilson |
35 | * Chris Wilson |
36 | */ |
36 | */ |
Line 37... | Line 37... | ||
37 | 37 | ||
Line -... | Line 38... | ||
- | 38 | #include "cairoint.h" |
|
38 | #include "cairoint.h" |
39 | |
- | 40 | #include "cairo-clip-inline.h" |
|
39 | 41 | #include "cairo-error-private.h" |
|
Line 40... | Line 42... | ||
40 | #include "cairo-error-private.h" |
42 | #include "cairo-pattern-private.h" |
Line 41... | Line 43... | ||
41 | #include "cairo-surface-offset-private.h" |
43 | #include "cairo-surface-offset-private.h" |
Line 56... | Line 58... | ||
56 | cairo_status_t |
58 | cairo_status_t |
57 | _cairo_surface_offset_paint (cairo_surface_t *target, |
59 | _cairo_surface_offset_paint (cairo_surface_t *target, |
58 | int x, int y, |
60 | int x, int y, |
59 | cairo_operator_t op, |
61 | cairo_operator_t op, |
60 | const cairo_pattern_t *source, |
62 | const cairo_pattern_t *source, |
61 | cairo_clip_t *clip) |
63 | const cairo_clip_t *clip) |
62 | { |
64 | { |
63 | cairo_status_t status; |
65 | cairo_status_t status; |
64 | cairo_clip_t clip_copy, *dev_clip = clip; |
66 | cairo_clip_t *dev_clip = (cairo_clip_t *) clip; |
65 | cairo_pattern_union_t source_copy; |
67 | cairo_pattern_union_t source_copy; |
Line 66... | Line 68... | ||
66 | 68 | ||
67 | if (unlikely (target->status)) |
69 | if (unlikely (target->status)) |
Line 68... | Line 70... | ||
68 | return target->status; |
70 | return target->status; |
69 | 71 | ||
Line 70... | Line 72... | ||
70 | if (clip && clip->all_clipped) |
72 | if (_cairo_clip_is_all_clipped (clip)) |
71 | return CAIRO_STATUS_SUCCESS; |
73 | return CAIRO_STATUS_SUCCESS; |
Line 72... | Line -... | ||
72 | - | ||
73 | if (x | y) { |
74 | |
74 | cairo_matrix_t m; |
- | |
75 | - | ||
76 | if (clip != NULL) { |
- | |
77 | cairo_matrix_init_translate (&m, -x, -y); |
- | |
78 | status = _cairo_clip_init_copy_transformed (&clip_copy, clip, &m); |
- | |
79 | if (unlikely (status)) |
- | |
Line 80... | Line 75... | ||
80 | goto FINISH; |
75 | if (x | y) { |
81 | 76 | cairo_matrix_t m; |
|
82 | dev_clip = &clip_copy; |
77 | |
83 | } |
78 | dev_clip = _cairo_clip_copy_with_translation (clip, -x, -y); |
Line 84... | Line 79... | ||
84 | 79 | ||
Line 85... | Line -... | ||
85 | cairo_matrix_init_translate (&m, x, y); |
- | |
86 | _copy_transformed_pattern (&source_copy.base, source, &m); |
80 | cairo_matrix_init_translate (&m, x, y); |
87 | source = &source_copy.base; |
81 | _copy_transformed_pattern (&source_copy.base, source, &m); |
Line 88... | Line 82... | ||
88 | } |
82 | source = &source_copy.base; |
89 | 83 | } |
|
Line 90... | Line 84... | ||
90 | status = _cairo_surface_paint (target, op, source, dev_clip); |
84 | |
91 | 85 | status = _cairo_surface_paint (target, op, source, dev_clip); |
|
92 | FINISH: |
86 | |
93 | if (dev_clip != clip) |
87 | if (dev_clip != clip) |
94 | _cairo_clip_reset (dev_clip); |
88 | _cairo_clip_destroy (dev_clip); |
95 | 89 | ||
96 | return status; |
90 | return status; |
97 | } |
91 | } |
98 | 92 | ||
99 | cairo_status_t |
93 | cairo_status_t |
100 | _cairo_surface_offset_mask (cairo_surface_t *target, |
94 | _cairo_surface_offset_mask (cairo_surface_t *target, |
101 | int x, int y, |
95 | int x, int y, |
Line 102... | Line 96... | ||
102 | cairo_operator_t op, |
96 | cairo_operator_t op, |
103 | const cairo_pattern_t *source, |
97 | const cairo_pattern_t *source, |
Line 104... | Line 98... | ||
104 | const cairo_pattern_t *mask, |
98 | const cairo_pattern_t *mask, |
105 | cairo_clip_t *clip) |
99 | const cairo_clip_t *clip) |
Line 106... | Line 100... | ||
106 | { |
100 | { |
107 | cairo_status_t status; |
101 | cairo_status_t status; |
Line 108... | Line -... | ||
108 | cairo_clip_t clip_copy, *dev_clip = clip; |
- | |
109 | cairo_pattern_union_t source_copy; |
102 | cairo_clip_t *dev_clip = (cairo_clip_t *) clip; |
110 | cairo_pattern_union_t mask_copy; |
- | |
111 | - | ||
112 | if (unlikely (target->status)) |
- | |
113 | return target->status; |
- | |
114 | - | ||
115 | if (clip && clip->all_clipped) |
- | |
Line 116... | Line 103... | ||
116 | return CAIRO_STATUS_SUCCESS; |
103 | cairo_pattern_union_t source_copy; |
117 | 104 | cairo_pattern_union_t mask_copy; |
|
118 | if (x | y) { |
105 | |
119 | cairo_matrix_t m; |
106 | if (unlikely (target->status)) |
Line 136... | Line 123... | ||
136 | 123 | ||
137 | status = _cairo_surface_mask (target, op, |
124 | status = _cairo_surface_mask (target, op, |
138 | source, mask, |
125 | source, mask, |
Line 139... | Line -... | ||
139 | dev_clip); |
- | |
140 | 126 | dev_clip); |
|
141 | FINISH: |
127 | |
Line 142... | Line 128... | ||
142 | if (dev_clip != clip) |
128 | if (dev_clip != clip) |
143 | _cairo_clip_reset (dev_clip); |
129 | _cairo_clip_destroy (dev_clip); |
Line 144... | Line 130... | ||
144 | 130 | ||
145 | return status; |
131 | return status; |
146 | } |
132 | } |
147 | 133 | ||
148 | cairo_status_t |
134 | cairo_status_t |
149 | _cairo_surface_offset_stroke (cairo_surface_t *surface, |
135 | _cairo_surface_offset_stroke (cairo_surface_t *surface, |
150 | int x, int y, |
136 | int x, int y, |
151 | cairo_operator_t op, |
137 | cairo_operator_t op, |
152 | const cairo_pattern_t *source, |
138 | const cairo_pattern_t *source, |
153 | cairo_path_fixed_t *path, |
139 | const cairo_path_fixed_t *path, |
154 | const cairo_stroke_style_t*stroke_style, |
140 | const cairo_stroke_style_t*stroke_style, |
155 | const cairo_matrix_t *ctm, |
141 | const cairo_matrix_t *ctm, |
156 | const cairo_matrix_t *ctm_inverse, |
142 | const cairo_matrix_t *ctm_inverse, |
157 | double tolerance, |
143 | double tolerance, |
158 | cairo_antialias_t antialias, |
144 | cairo_antialias_t antialias, |
159 | cairo_clip_t *clip) |
145 | const cairo_clip_t *clip) |
160 | { |
146 | { |
161 | cairo_path_fixed_t path_copy, *dev_path = path; |
147 | cairo_path_fixed_t path_copy, *dev_path = (cairo_path_fixed_t *) path; |
162 | cairo_clip_t clip_copy, *dev_clip = clip; |
148 | cairo_clip_t *dev_clip = (cairo_clip_t *) clip; |
Line 163... | Line 149... | ||
163 | cairo_matrix_t dev_ctm = *ctm; |
149 | cairo_matrix_t dev_ctm = *ctm; |
164 | cairo_matrix_t dev_ctm_inverse = *ctm_inverse; |
150 | cairo_matrix_t dev_ctm_inverse = *ctm_inverse; |
Line 165... | Line 151... | ||
165 | cairo_pattern_union_t source_copy; |
151 | cairo_pattern_union_t source_copy; |
166 | cairo_status_t status; |
152 | cairo_status_t status; |
Line 167... | Line 153... | ||
167 | 153 | ||
168 | if (unlikely (surface->status)) |
154 | if (unlikely (surface->status)) |
Line -... | Line 155... | ||
- | 155 | return surface->status; |
|
- | 156 | ||
169 | return surface->status; |
157 | if (_cairo_clip_is_all_clipped (clip)) |
170 | 158 | return CAIRO_STATUS_SUCCESS; |
|
171 | if (clip && clip->all_clipped) |
159 | |
Line 172... | Line 160... | ||
172 | return CAIRO_STATUS_SUCCESS; |
160 | if (x | y) { |
Line 183... | Line 171... | ||
183 | _cairo_fixed_from_int (-y)); |
171 | _cairo_fixed_from_int (-y)); |
184 | dev_path = &path_copy; |
172 | dev_path = &path_copy; |
Line 185... | Line 173... | ||
185 | 173 | ||
186 | cairo_matrix_init_translate (&m, -x, -y); |
174 | cairo_matrix_init_translate (&m, -x, -y); |
187 | cairo_matrix_multiply (&dev_ctm, &dev_ctm, &m); |
- | |
188 | if (clip != NULL) { |
- | |
189 | status = _cairo_clip_init_copy_transformed (&clip_copy, clip, &m); |
- | |
190 | if (unlikely (status)) |
- | |
191 | goto FINISH; |
- | |
192 | - | ||
193 | dev_clip = &clip_copy; |
- | |
Line 194... | Line 175... | ||
194 | } |
175 | cairo_matrix_multiply (&dev_ctm, &dev_ctm, &m); |
195 | 176 | ||
196 | cairo_matrix_init_translate (&m, x, y); |
177 | cairo_matrix_init_translate (&m, x, y); |
197 | _copy_transformed_pattern (&source_copy.base, source, &m); |
178 | _copy_transformed_pattern (&source_copy.base, source, &m); |
Line 207... | Line 188... | ||
207 | 188 | ||
208 | FINISH: |
189 | FINISH: |
209 | if (dev_path != path) |
190 | if (dev_path != path) |
210 | _cairo_path_fixed_fini (dev_path); |
191 | _cairo_path_fixed_fini (dev_path); |
211 | if (dev_clip != clip) |
192 | if (dev_clip != clip) |
Line 212... | Line 193... | ||
212 | _cairo_clip_reset (dev_clip); |
193 | _cairo_clip_destroy (dev_clip); |
213 | 194 | ||
Line 214... | Line 195... | ||
214 | return status; |
195 | return status; |
215 | } |
196 | } |
216 | 197 | ||
217 | cairo_status_t |
198 | cairo_status_t |
218 | _cairo_surface_offset_fill (cairo_surface_t *surface, |
199 | _cairo_surface_offset_fill (cairo_surface_t *surface, |
219 | int x, int y, |
200 | int x, int y, |
220 | cairo_operator_t op, |
201 | cairo_operator_t op, |
221 | const cairo_pattern_t*source, |
202 | const cairo_pattern_t*source, |
222 | cairo_path_fixed_t *path, |
203 | const cairo_path_fixed_t *path, |
223 | cairo_fill_rule_t fill_rule, |
204 | cairo_fill_rule_t fill_rule, |
224 | double tolerance, |
205 | double tolerance, |
225 | cairo_antialias_t antialias, |
206 | cairo_antialias_t antialias, |
226 | cairo_clip_t *clip) |
207 | const cairo_clip_t *clip) |
227 | { |
208 | { |
228 | cairo_status_t status; |
209 | cairo_status_t status; |
Line 229... | Line 210... | ||
229 | cairo_path_fixed_t path_copy, *dev_path = path; |
210 | cairo_path_fixed_t path_copy, *dev_path = (cairo_path_fixed_t *) path; |
230 | cairo_clip_t clip_copy, *dev_clip = clip; |
211 | cairo_clip_t *dev_clip = (cairo_clip_t *) clip; |
Line 231... | Line 212... | ||
231 | cairo_pattern_union_t source_copy; |
212 | cairo_pattern_union_t source_copy; |
232 | 213 | ||
Line 233... | Line 214... | ||
233 | if (unlikely (surface->status)) |
214 | if (unlikely (surface->status)) |
234 | return surface->status; |
215 | return surface->status; |
Line -... | Line 216... | ||
- | 216 | ||
- | 217 | if (_cairo_clip_is_all_clipped (clip)) |
|
235 | 218 | return CAIRO_STATUS_SUCCESS; |
|
236 | if (clip && clip->all_clipped) |
219 | |
237 | return CAIRO_STATUS_SUCCESS; |
220 | if (x | y) { |
Line 238... | Line 221... | ||
238 | 221 | cairo_matrix_t m; |
|
239 | if (x | y) { |
222 | |
240 | cairo_matrix_t m; |
223 | dev_clip = _cairo_clip_copy_with_translation (clip, -x, -y); |
241 | 224 | ||
Line 242... | Line -... | ||
242 | status = _cairo_path_fixed_init_copy (&path_copy, dev_path); |
- | |
243 | if (unlikely (status)) |
- | |
244 | goto FINISH; |
- | |
245 | - | ||
246 | _cairo_path_fixed_translate (&path_copy, |
- | |
247 | _cairo_fixed_from_int (-x), |
- | |
248 | _cairo_fixed_from_int (-y)); |
- | |
249 | dev_path = &path_copy; |
- | |
250 | - | ||
251 | if (clip != NULL) { |
225 | status = _cairo_path_fixed_init_copy (&path_copy, dev_path); |
252 | cairo_matrix_init_translate (&m, -x, -y); |
226 | if (unlikely (status)) |
253 | status = _cairo_clip_init_copy_transformed (&clip_copy, clip, &m); |
227 | goto FINISH; |
254 | if (unlikely (status)) |
228 | |
Line 269... | Line 243... | ||
269 | 243 | ||
270 | FINISH: |
244 | FINISH: |
271 | if (dev_path != path) |
245 | if (dev_path != path) |
272 | _cairo_path_fixed_fini (dev_path); |
246 | _cairo_path_fixed_fini (dev_path); |
273 | if (dev_clip != clip) |
247 | if (dev_clip != clip) |
Line 274... | Line 248... | ||
274 | _cairo_clip_reset (dev_clip); |
248 | _cairo_clip_destroy (dev_clip); |
275 | 249 | ||
Line 276... | Line 250... | ||
276 | return status; |
250 | return status; |
Line 282... | Line 256... | ||
282 | cairo_operator_t op, |
256 | cairo_operator_t op, |
283 | const cairo_pattern_t *source, |
257 | const cairo_pattern_t *source, |
284 | cairo_scaled_font_t *scaled_font, |
258 | cairo_scaled_font_t *scaled_font, |
285 | cairo_glyph_t *glyphs, |
259 | cairo_glyph_t *glyphs, |
286 | int num_glyphs, |
260 | int num_glyphs, |
287 | cairo_clip_t *clip) |
261 | const cairo_clip_t *clip) |
288 | { |
262 | { |
289 | cairo_status_t status; |
263 | cairo_status_t status; |
290 | cairo_clip_t clip_copy, *dev_clip = clip; |
264 | cairo_clip_t *dev_clip = (cairo_clip_t *) clip; |
291 | cairo_pattern_union_t source_copy; |
265 | cairo_pattern_union_t source_copy; |
292 | cairo_glyph_t *dev_glyphs; |
266 | cairo_glyph_t *dev_glyphs; |
293 | int i; |
267 | int i; |
Line 294... | Line 268... | ||
294 | 268 | ||
295 | if (unlikely (surface->status)) |
269 | if (unlikely (surface->status)) |
Line 296... | Line 270... | ||
296 | return surface->status; |
270 | return surface->status; |
297 | 271 | ||
Line 298... | Line 272... | ||
298 | if (clip && clip->all_clipped) |
272 | if (_cairo_clip_is_all_clipped (clip)) |
299 | return CAIRO_STATUS_SUCCESS; |
273 | return CAIRO_STATUS_SUCCESS; |
300 | 274 | ||
Line 305... | Line 279... | ||
305 | memcpy (dev_glyphs, glyphs, sizeof (cairo_glyph_t) * num_glyphs); |
279 | memcpy (dev_glyphs, glyphs, sizeof (cairo_glyph_t) * num_glyphs); |
Line 306... | Line 280... | ||
306 | 280 | ||
307 | if (x | y) { |
281 | if (x | y) { |
Line 308... | Line -... | ||
308 | cairo_matrix_t m; |
- | |
309 | 282 | cairo_matrix_t m; |
|
310 | if (clip != NULL) { |
- | |
311 | cairo_matrix_init_translate (&m, -x, -y); |
- | |
312 | status = _cairo_clip_init_copy_transformed (&clip_copy, clip, &m); |
- | |
313 | if (unlikely (status)) |
- | |
314 | goto FINISH; |
- | |
315 | - | ||
Line 316... | Line 283... | ||
316 | dev_clip = &clip_copy; |
283 | |
317 | } |
284 | dev_clip = _cairo_clip_copy_with_translation (clip, -x, -y); |
318 | 285 | ||
Line 331... | Line 298... | ||
331 | dev_glyphs, num_glyphs, |
298 | dev_glyphs, num_glyphs, |
332 | NULL, 0, 0, |
299 | NULL, 0, 0, |
333 | scaled_font, |
300 | scaled_font, |
334 | dev_clip); |
301 | dev_clip); |
Line 335... | Line -... | ||
335 | - | ||
336 | FINISH: |
302 | |
337 | if (dev_clip != clip) |
303 | if (dev_clip != clip) |
338 | _cairo_clip_reset (dev_clip); |
304 | _cairo_clip_destroy (dev_clip); |
Line 339... | Line 305... | ||
339 | free (dev_glyphs); |
305 | free (dev_glyphs); |
340 | 306 |