diff options
author | Søren Sandmann <sandmann@redhat.com> | 2009-03-27 08:48:42 -0400 |
---|---|---|
committer | Søren Sandmann Pedersen <sandmann@daimi.au.dk> | 2009-03-28 18:02:58 -0400 |
commit | 26999e5aa8b5d353596e31d4b3823cafe007125c (patch) | |
tree | dcc2528d3387ab3c48d13409a2482525d0d83b4a /src | |
parent | 4b3245481cfbf96388c140421a071fd1f79ad601 (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.c | 27 | ||||
-rw-r--r-- | src/cairo-region.c | 45 | ||||
-rw-r--r-- | src/cairo-surface.c | 9 | ||||
-rw-r--r-- | src/cairo.h | 11 | ||||
-rw-r--r-- | src/cairoint.h | 2 |
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 (®ion, + rectangle->x, rectangle->y, + rectangle->width, rectangle->height); + + if (!pixman_region32_subtract (&dst->rgn, &dst->rgn, ®ion)) + status = cairo_region_set_error (dst, CAIRO_STATUS_NO_MEMORY); + + pixman_region32_fini (®ion); + + 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 (®ion, + rect->x, rect->y, rect->width, rect->height); + + if (!pixman_region32_intersect (&dst->rgn, &dst->rgn, ®ion)) + result = _cairo_error (CAIRO_STATUS_NO_MEMORY); + + pixman_region32_fini (®ion); + + 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); |