summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2010-03-23 16:43:39 +0000
committerChris Wilson <chris@chris-wilson.co.uk>2010-03-23 16:43:39 +0000
commit1ddcd5cf31bb47e9ff18ddf94d0a4648fa70a617 (patch)
tree1f507a9cd24dc52138c01ba1a8730c7a02f734af
parent61ad28fe7d334c63197ae3881d5edd074d63cfec (diff)
clip: Remove the redundant _cairo_clip_init_rectangle()
As _cairo_clip_init_rectangle() is equivalent and more importantly more clearly written as: _cairo_clip_init(&clip); if (status = _cairo_clip_rectangle(&clip, &rect)) { _cairo_clip_fini(&fini); return status; } perform the transformation and in the process catch a few mistakes along error paths.
-rw-r--r--src/cairo-clip-private.h4
-rw-r--r--src/cairo-clip.c30
-rw-r--r--src/cairo-paginated-surface.c18
-rw-r--r--src/cairo-recording-surface.c11
-rw-r--r--src/cairo-surface-wrapper.c14
5 files changed, 30 insertions, 47 deletions
diff --git a/src/cairo-clip-private.h b/src/cairo-clip-private.h
index b9a39ae7..05a10e67 100644
--- a/src/cairo-clip-private.h
+++ b/src/cairo-clip-private.h
@@ -76,10 +76,6 @@ struct _cairo_clip {
cairo_private void
_cairo_clip_init (cairo_clip_t *clip);
-cairo_private cairo_status_t
-_cairo_clip_init_rectangle (cairo_clip_t *clip,
- const cairo_rectangle_int_t *rect);
-
cairo_private_no_warn cairo_clip_t *
_cairo_clip_init_copy (cairo_clip_t *clip, cairo_clip_t *other);
diff --git a/src/cairo-clip.c b/src/cairo-clip.c
index fdb94701..19be8120 100644
--- a/src/cairo-clip.c
+++ b/src/cairo-clip.c
@@ -164,35 +164,25 @@ _cairo_clip_intersect_rectangle (cairo_clip_t *clip,
status = _cairo_path_fixed_close_path (&clip_path->path);
assert (status == CAIRO_STATUS_SUCCESS);
- clip_path->extents = *rect;
clip_path->fill_rule = CAIRO_FILL_RULE_WINDING;
clip_path->tolerance = 1;
clip_path->antialias = CAIRO_ANTIALIAS_DEFAULT;
clip_path->flags |= CAIRO_CLIP_PATH_IS_BOX;
+ clip_path->extents = *rect;
+ if (clip_path->prev != NULL) {
+ if (! _cairo_rectangle_intersect (&clip_path->extents,
+ &clip_path->prev->extents))
+ {
+ _cairo_clip_set_all_clipped (clip);
+ }
+ }
+
/* could preallocate the region if it proves worthwhile */
return CAIRO_STATUS_SUCCESS;
}
-/* XXX consider accepting a matrix, no users yet. */
-cairo_status_t
-_cairo_clip_init_rectangle (cairo_clip_t *clip,
- const cairo_rectangle_int_t *rect)
-{
- _cairo_clip_init (clip);
-
- if (rect == NULL)
- return CAIRO_STATUS_SUCCESS;
-
- if (rect->width == 0 || rect->height == 0) {
- _cairo_clip_set_all_clipped (clip);
- return CAIRO_STATUS_SUCCESS;
- }
-
- return _cairo_clip_intersect_rectangle (clip, rect);
-}
-
cairo_clip_t *
_cairo_clip_init_copy (cairo_clip_t *clip, cairo_clip_t *other)
{
@@ -361,6 +351,7 @@ _cairo_clip_path_reapply_clip_path_transform (cairo_clip_t *clip,
status = _cairo_path_fixed_init_copy (&clip_path->path,
&other_path->path);
if (unlikely (status)) {
+ clip->path = clip->path->prev;
_cairo_clip_path_destroy (clip_path);
return status;
}
@@ -403,6 +394,7 @@ _cairo_clip_path_reapply_clip_path_translate (cairo_clip_t *clip,
status = _cairo_path_fixed_init_copy (&clip_path->path,
&other_path->path);
if (unlikely (status)) {
+ clip->path = clip->path->prev;
_cairo_clip_path_destroy (clip_path);
return status;
}
diff --git a/src/cairo-paginated-surface.c b/src/cairo-paginated-surface.c
index 4d7dc8fe..f8c99f83 100644
--- a/src/cairo-paginated-surface.c
+++ b/src/cairo-paginated-surface.c
@@ -277,17 +277,17 @@ _paint_fallback_image (cairo_paginated_surface_t *surface,
* filtering (if possible) to avoid introducing potential artifacts. */
pattern.base.filter = CAIRO_FILTER_NEAREST;
- status = _cairo_clip_init_rectangle (&clip, rect);
- if (unlikely (status))
- goto CLEANUP_IMAGE;
-
- status = _cairo_surface_paint (surface->target,
- CAIRO_OPERATOR_SOURCE,
- &pattern.base, &clip);
-
- _cairo_clip_reset (&clip);
+ _cairo_clip_init (&clip);
+ status = _cairo_clip_rectangle (&clip, rect);
+ if (likely (status == CAIRO_STATUS_SUCCESS)) {
+ status = _cairo_surface_paint (surface->target,
+ CAIRO_OPERATOR_SOURCE,
+ &pattern.base, &clip);
+ }
+ _cairo_clip_fini (&clip);
_cairo_pattern_fini (&pattern.base);
+
CLEANUP_IMAGE:
cairo_surface_destroy (image);
diff --git a/src/cairo-recording-surface.c b/src/cairo-recording-surface.c
index 5f0a2989..973b15ce 100644
--- a/src/cairo-recording-surface.c
+++ b/src/cairo-recording-surface.c
@@ -130,6 +130,9 @@ cairo_recording_surface_create (cairo_content_t content,
recording_surface->content = content;
+ recording_surface->unbounded = TRUE;
+ _cairo_clip_init (&recording_surface->clip);
+
/* unbounded -> 'infinite' extents */
if (extents != NULL) {
recording_surface->extents_pixels = *extents;
@@ -140,16 +143,14 @@ cairo_recording_surface_create (cairo_content_t content,
recording_surface->extents.width = ceil (extents->x + extents->width) - recording_surface->extents.x;
recording_surface->extents.height = ceil (extents->y + extents->height) - recording_surface->extents.y;
- status = _cairo_clip_init_rectangle (&recording_surface->clip, &recording_surface->extents);
+ status = _cairo_clip_rectangle (&recording_surface->clip,
+ &recording_surface->extents);
if (unlikely (status)) {
free (recording_surface);
return _cairo_surface_create_in_error (status);
}
recording_surface->unbounded = FALSE;
- } else {
- recording_surface->unbounded = TRUE;
- _cairo_clip_init (&recording_surface->clip);
}
_cairo_array_init (&recording_surface->commands, sizeof (cairo_command_t *));
@@ -191,8 +192,6 @@ _cairo_recording_surface_finish (void *abstract_surface)
for (i = 0; i < num_elements; i++) {
cairo_command_t *command = elements[i];
- _cairo_clip_reset (&command->header.clip);
-
switch (command->header.type) {
case CAIRO_COMMAND_PAINT:
_cairo_pattern_fini_snapshot (&command->paint.source.base);
diff --git a/src/cairo-surface-wrapper.c b/src/cairo-surface-wrapper.c
index f970e7d0..ae594dca 100644
--- a/src/cairo-surface-wrapper.c
+++ b/src/cairo-surface-wrapper.c
@@ -113,11 +113,9 @@ _cairo_surface_wrapper_paint (cairo_surface_wrapper_t *wrapper,
&wrapper->target->device_transform);
if (unlikely (status))
goto FINISH;
- } else {
- _cairo_clip_init_copy (&clip_copy, clip);
- }
- dev_clip = &clip_copy;
+ dev_clip = &clip_copy;
+ }
_copy_transformed_pattern (&source_copy.base, source, &wrapper->target->device_transform_inverse);
source = &source_copy.base;
@@ -156,12 +154,9 @@ _cairo_surface_wrapper_mask (cairo_surface_wrapper_t *wrapper,
if (unlikely (status))
goto FINISH;
- } else {
- _cairo_clip_init_copy (&clip_copy, clip);
+ dev_clip = &clip_copy;
}
- dev_clip = &clip_copy;
-
_copy_transformed_pattern (&source_copy.base, source, &wrapper->target->device_transform_inverse);
source = &source_copy.base;
@@ -422,11 +417,12 @@ _cairo_surface_wrapper_show_text_glyphs (cairo_surface_wrapper_t *wrapper,
int i;
if (clip != NULL) {
- dev_clip = &clip_copy;
status = _cairo_clip_init_copy_transformed (&clip_copy, clip,
&wrapper->target->device_transform);
if (unlikely (status))
goto FINISH;
+
+ dev_clip = &clip_copy;
}
dev_glyphs = _cairo_malloc_ab (num_glyphs, sizeof (cairo_glyph_t));