[cairo] [PATCH 2/5] rectangle: Implement _cairo_rectangle_contains_rectangle()

Andrea Canciani ranma42 at gmail.com
Sun Jan 15 05:59:05 PST 2012


And reuse it.
---
 src/cairo-clip-boxes.c       |    7 +------
 src/cairo-image-source.c     |   10 ++--------
 src/cairo-pattern.c          |   26 ++++++--------------------
 src/cairo-spans-compositor.c |   10 +---------
 src/cairo-surface.c          |    5 +----
 src/cairo-traps-compositor.c |   10 +---------
 src/cairoint.h               |   10 ++++++++++
 7 files changed, 22 insertions(+), 56 deletions(-)

diff --git a/src/cairo-clip-boxes.c b/src/cairo-clip-boxes.c
index f42b53d..be4497c 100644
--- a/src/cairo-clip-boxes.c
+++ b/src/cairo-clip-boxes.c
@@ -82,13 +82,8 @@ _cairo_clip_contains_rectangle_box (const cairo_clip_t *clip,
     if (clip->path)
 	return FALSE;
 
-    if (clip->extents.x > rect->x ||
-	clip->extents.y > rect->y ||
-	clip->extents.x + clip->extents.width  < rect->x + rect->width ||
-	clip->extents.y + clip->extents.height < rect->y + rect->height)
-    {
+    if (! _cairo_rectangle_contains_rectangle (&clip->extents, rect))
 	return FALSE;
-    }
 
     /* Check for a clip-box that wholly contains the rectangle */
     for (i = 0; i < clip->num_boxes; i++) {
diff --git a/src/cairo-image-source.c b/src/cairo-image-source.c
index 26f245a..047a049 100644
--- a/src/cairo-image-source.c
+++ b/src/cairo-image-source.c
@@ -621,18 +621,12 @@ _pixman_image_for_recording (cairo_image_surface_t *dst,
 
     extend = pattern->base.extend;
     if (_cairo_surface_get_extents (source, &limit)) {
-	if (sample->x >= limit.x &&
-	    sample->y >= limit.y &&
-	    sample->x + sample->width  <= limit.x + limit.width &&
-	    sample->y + sample->height <= limit.y + limit.height)
+	if (_cairo_rectangle_contains_rectangle (&limit, sample))
 	{
 	    extend = CAIRO_EXTEND_NONE;
 	}
 	else if (extend == CAIRO_EXTEND_NONE &&
-		 (sample->x + sample->width <= limit.x ||
-		  sample->x >= limit.x + limit.width ||
-		  sample->y + sample->height <= limit.y ||
-		  sample->y >= limit.y + limit.height))
+		 ! _cairo_rectangle_intersects (&limit, sample))
 	{
 	    return _pixman_transparent_image ();
 	}
diff --git a/src/cairo-pattern.c b/src/cairo-pattern.c
index 41d7384..ea47b6a 100644
--- a/src/cairo-pattern.c
+++ b/src/cairo-pattern.c
@@ -3143,17 +3143,10 @@ _surface_is_opaque (const cairo_surface_pattern_t *pattern,
     if (! _cairo_surface_get_extents (pattern->surface, &extents))
 	return TRUE;
 
-    if (sample != NULL) {
-	if (sample->x >= extents.x &&
-	    sample->y >= extents.y &&
-	    sample->x + sample->width  <= extents.x + extents.width &&
-	    sample->y + sample->height <= extents.y + extents.height)
-	{
-	    return TRUE;
-	}
-    }
+    if (sample == NULL)
+	return FALSE;
 
-    return FALSE;
+    return _cairo_rectangle_contains_rectangle (&extents, sample);
 }
 
 static cairo_bool_t
@@ -3166,17 +3159,10 @@ _raster_source_is_opaque (const cairo_raster_source_pattern_t *pattern,
     if (pattern->base.extend != CAIRO_EXTEND_NONE)
 	return TRUE;
 
-    if (sample != NULL) {
-	if (sample->x >= pattern->extents.x &&
-	    sample->y >= pattern->extents.y &&
-	    sample->x + sample->width  <= pattern->extents.x + pattern->extents.width &&
-	    sample->y + sample->height <= pattern->extents.y + pattern->extents.height)
-	{
-	    return TRUE;
-	}
-    }
+    if (sample == NULL)
+	return FALSE;
 
-    return FALSE;
+    return _cairo_rectangle_contains_rectangle (&pattern->extents, sample);
 }
 
 static cairo_bool_t
diff --git a/src/cairo-spans-compositor.c b/src/cairo-spans-compositor.c
index 468f338..0e94be8 100644
--- a/src/cairo-spans-compositor.c
+++ b/src/cairo-spans-compositor.c
@@ -421,15 +421,7 @@ recording_pattern_contains_sample (const cairo_pattern_t *pattern,
     if (surface->unbounded)
 	return TRUE;
 
-    if (sample->x >= surface->extents.x &&
-	sample->y >= surface->extents.y &&
-	sample->x + sample->width <= surface->extents.x + surface->extents.width &&
-	sample->y + sample->height <= surface->extents.y + surface->extents.height)
-    {
-	return TRUE;
-    }
-
-    return FALSE;
+    return _cairo_rectangle_contains_rectangle (&surface->extents, sample);
 }
 
 static cairo_bool_t
diff --git a/src/cairo-surface.c b/src/cairo-surface.c
index 88f306a..2607f29 100644
--- a/src/cairo-surface.c
+++ b/src/cairo-surface.c
@@ -631,10 +631,7 @@ cairo_surface_map_to_image (cairo_surface_t  *surface,
 	/* If this surface is bounded, we can't map parts
 	 * that are outside of it. */
 	if (likely (surface->backend->get_extents (surface, &surface_extents))) {
-	    if (unlikely (extents->x < surface_extents.x ||
-			  extents->y < surface_extents.y ||
-			  extents->x + extents->width > surface_extents.x + surface_extents.width ||
-			  extents->y + extents->height > surface_extents.y + surface_extents.height))
+	    if (unlikely (! _cairo_rectangle_contains_rectangle (&surface_extents, extents)))
 		return _cairo_surface_create_in_error (CAIRO_STATUS_INVALID_SIZE);
 	}
     }
diff --git a/src/cairo-traps-compositor.c b/src/cairo-traps-compositor.c
index 0371c80..ac0a56f 100644
--- a/src/cairo-traps-compositor.c
+++ b/src/cairo-traps-compositor.c
@@ -959,15 +959,7 @@ recording_pattern_contains_sample (const cairo_pattern_t *pattern,
     if (surface->unbounded)
 	return TRUE;
 
-    if (sample->x >= surface->extents.x &&
-	sample->y >= surface->extents.y &&
-	sample->x + sample->width <= surface->extents.x + surface->extents.width &&
-	sample->y + sample->height <= surface->extents.y + surface->extents.height)
-    {
-	return TRUE;
-    }
-
-    return FALSE;
+    return _cairo_rectangle_contains_rectangle (&surface->extents, sample);
 }
 
 static cairo_bool_t
diff --git a/src/cairoint.h b/src/cairoint.h
index 8f4c370..f08462c 100644
--- a/src/cairoint.h
+++ b/src/cairoint.h
@@ -310,6 +310,16 @@ _cairo_rectangle_intersects (const cairo_rectangle_int_t *dst,
 	     src->y + (int) src->height <= dst->y);
 }
 
+static inline cairo_bool_t
+_cairo_rectangle_contains_rectangle (const cairo_rectangle_int_t *a,
+				     const cairo_rectangle_int_t *b)
+{
+    return (a->x <= b->x &&
+	    a->x + (int) a->width >= b->x + (int) b->width &&
+	    a->y <= b->y &&
+	    a->y + (int) a->height >= b->y + (int) b->height);
+}
+
 cairo_private void
 _cairo_rectangle_int_from_double (cairo_rectangle_int_t *recti,
 				  const cairo_rectangle_t *rectf);
-- 
1.7.5.4



More information about the cairo mailing list