Subversion Repositories Kolibri OS

Rev

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