summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSøren Sandmann <sandmann@redhat.com>2009-03-27 08:48:42 -0400
committerSøren Sandmann Pedersen <sandmann@daimi.au.dk>2009-03-28 18:02:58 -0400
commit26999e5aa8b5d353596e31d4b3823cafe007125c (patch)
treedcc2528d3387ab3c48d13409a2482525d0d83b4a /src
parent4b3245481cfbf96388c140421a071fd1f79ad601 (diff)
[region] Add cairo_region_intersect_rectangle() and _subtract_rectangle()
Intersecting with and subtracting rectangles is quite common, and we already have cairo_union_rectangle().
Diffstat (limited to 'src')
-rw-r--r--src/cairo-clip.c27
-rw-r--r--src/cairo-region.c45
-rw-r--r--src/cairo-surface.c9
-rw-r--r--src/cairo.h11
-rw-r--r--src/cairoint.h2
5 files changed, 61 insertions, 33 deletions
diff --git a/src/cairo-clip.c b/src/cairo-clip.c
index 8ee6a644..cc43c037 100644
--- a/src/cairo-clip.c
+++ b/src/cairo-clip.c
@@ -198,17 +198,8 @@ _cairo_clip_intersect_to_region (cairo_clip_t *clip,
if (!clip)
return CAIRO_STATUS_SUCCESS;
- if (clip->all_clipped) {
- cairo_region_t *clip_rect;
-
- clip_rect = cairo_region_create_rectangle (&clip->surface_rect);
-
- status = cairo_region_intersect (region, clip_rect);
-
- cairo_region_destroy (clip_rect);
-
- return status;
- }
+ if (clip->all_clipped)
+ return cairo_region_intersect_rectangle (region, &clip->surface_rect);
if (clip->path) {
/* Intersect clip path into region. */
@@ -220,18 +211,8 @@ _cairo_clip_intersect_to_region (cairo_clip_t *clip,
return status;
}
- if (clip->surface) {
- cairo_region_t *clip_rect;
-
- clip_rect = cairo_region_create_rectangle (&clip->surface_rect);
-
- status = cairo_region_intersect (region, clip_rect);
-
- cairo_region_destroy (clip_rect);
-
- if (unlikely (status))
- return status;
- }
+ if (clip->surface)
+ return cairo_region_intersect_rectangle (region, &clip->surface_rect);
return CAIRO_STATUS_SUCCESS;
}
diff --git a/src/cairo-region.c b/src/cairo-region.c
index a2a7a825..55898d9c 100644
--- a/src/cairo-region.c
+++ b/src/cairo-region.c
@@ -178,6 +178,28 @@ cairo_region_subtract (cairo_region_t *dst, cairo_region_t *other)
}
cairo_status_t
+cairo_region_subtract_rectangle (cairo_region_t *dst,
+ cairo_rectangle_int_t *rectangle)
+{
+ cairo_status_t status = CAIRO_STATUS_SUCCESS;
+ pixman_region32_t region;
+
+ if (dst->status)
+ return dst->status;
+
+ pixman_region32_init_rect (&region,
+ rectangle->x, rectangle->y,
+ rectangle->width, rectangle->height);
+
+ if (!pixman_region32_subtract (&dst->rgn, &dst->rgn, &region))
+ status = cairo_region_set_error (dst, CAIRO_STATUS_NO_MEMORY);
+
+ pixman_region32_fini (&region);
+
+ return status;
+}
+
+cairo_status_t
cairo_region_intersect (cairo_region_t *dst, cairo_region_t *other)
{
if (dst->status)
@@ -193,6 +215,27 @@ cairo_region_intersect (cairo_region_t *dst, cairo_region_t *other)
}
cairo_status_t
+cairo_region_intersect_rectangle (cairo_region_t *dst,
+ const cairo_rectangle_int_t *rect)
+{
+ cairo_status_t result = CAIRO_STATUS_SUCCESS;
+ pixman_region32_t region;
+
+ if (dst->status)
+ return dst->status;
+
+ pixman_region32_init_rect (&region,
+ rect->x, rect->y, rect->width, rect->height);
+
+ if (!pixman_region32_intersect (&dst->rgn, &dst->rgn, &region))
+ result = _cairo_error (CAIRO_STATUS_NO_MEMORY);
+
+ pixman_region32_fini (&region);
+
+ return result;
+}
+
+cairo_status_t
cairo_region_union (cairo_region_t *dst,
cairo_region_t *other)
{
@@ -210,7 +253,7 @@ cairo_region_union (cairo_region_t *dst,
cairo_status_t
cairo_region_union_rectangle (cairo_region_t *dst,
- cairo_rectangle_int_t *rect)
+ const cairo_rectangle_int_t *rect)
{
if (!pixman_region32_union_rect (&dst->rgn, &dst->rgn,
rect->x, rect->y,
diff --git a/src/cairo-surface.c b/src/cairo-surface.c
index 82cd57ea..1c8445f9 100644
--- a/src/cairo-surface.c
+++ b/src/cairo-surface.c
@@ -2679,8 +2679,6 @@ _cairo_surface_composite_fixup_unbounded_internal (cairo_surface_t *dst,
{
cairo_rectangle_int_t dst_rectangle;
cairo_rectangle_int_t drawn_rectangle;
- cairo_bool_t has_drawn_region = FALSE;
- cairo_region_t *drawn_region = NULL;
cairo_region_t *clear_region = NULL;
cairo_status_t status;
@@ -2708,10 +2706,7 @@ _cairo_surface_composite_fixup_unbounded_internal (cairo_surface_t *dst,
/* Now compute the area that is in dst_rectangle but not in drawn_rectangle
*/
- drawn_region = cairo_region_create_rectangle (&drawn_rectangle);
- has_drawn_region = TRUE;
-
- status = cairo_region_subtract (clear_region, drawn_region);
+ status = cairo_region_subtract_rectangle (clear_region, &drawn_rectangle);
if (unlikely (status))
goto CLEANUP_REGIONS;
@@ -2721,8 +2716,6 @@ _cairo_surface_composite_fixup_unbounded_internal (cairo_surface_t *dst,
clear_region);
CLEANUP_REGIONS:
- if (drawn_region)
- cairo_region_destroy (drawn_region);
cairo_region_destroy (clear_region);
return _cairo_surface_set_error (dst, status);
diff --git a/src/cairo.h b/src/cairo.h
index 7a5a4d3d..269fe4d9 100644
--- a/src/cairo.h
+++ b/src/cairo.h
@@ -2408,13 +2408,22 @@ cairo_public cairo_status_t
cairo_region_subtract (cairo_region_t *dst, cairo_region_t *other);
cairo_public cairo_status_t
+cairo_region_subtract_rectangle (cairo_region_t *dst,
+ cairo_rectangle_int_t *rectangle);
+
+cairo_public cairo_status_t
cairo_region_intersect (cairo_region_t *dst, cairo_region_t *other);
cairo_public cairo_status_t
+cairo_region_intersect_rectangle (cairo_region_t *dst,
+ const cairo_rectangle_int_t *rect);
+
+cairo_public cairo_status_t
cairo_region_union (cairo_region_t *dst, cairo_region_t *other);
cairo_public cairo_status_t
-cairo_region_union_rectangle (cairo_region_t *dst, cairo_rectangle_int_t *rectangle);
+cairo_region_union_rectangle (cairo_region_t *dst,
+ const cairo_rectangle_int_t *rectangle);
/* Functions to be used while debugging (not intended for use in production code) */
diff --git a/src/cairoint.h b/src/cairoint.h
index 1f209a76..6c5fd5a6 100644
--- a/src/cairoint.h
+++ b/src/cairoint.h
@@ -2707,7 +2707,9 @@ slim_hidden_proto (cairo_region_contains_rectangle);
slim_hidden_proto (cairo_region_contains_point);
slim_hidden_proto (cairo_region_translate);
slim_hidden_proto (cairo_region_subtract);
+slim_hidden_proto (cairo_region_subtract_rectangle);
slim_hidden_proto (cairo_region_intersect);
+slim_hidden_proto (cairo_region_intersect_rectangle);
slim_hidden_proto (cairo_region_union);
slim_hidden_proto (cairo_region_union_rectangle);