[prev in list] [next in list] [prev in thread] [next in thread] 

List:       cairo-commit
Subject:    [cairo-commit] src/cairo-surface-clipper.c
From:       ickle () kemper ! freedesktop ! org (Chris Wilson)
Date:       2011-07-29 10:58:51
Message-ID: 20110729105851.2C39BD8002 () kemper ! freedesktop ! org
[Download RAW message or body]

 src/cairo-surface-clipper.c |   34 ++++++++++++++++++++++++++++++----
 1 file changed, 30 insertions(+), 4 deletions(-)

New commits:
commit 74a86a76a9c32a74d63712b718c90669889820e6
Author: Chris Wilson <chris@chris-wilson.co.uk>
Date:   Fri Jul 29 11:57:01 2011 +0100

    clipper: Detect a incremental change in the general clip-path
    
    Signed-off-by: Chris Wilson <chris@chris-wilson.co.uk>

diff --git a/src/cairo-surface-clipper.c b/src/cairo-surface-clipper.c
index c1644b4..e730300 100644
--- a/src/cairo-surface-clipper.c
+++ b/src/cairo-surface-clipper.c
@@ -98,14 +98,16 @@ _cairo_surface_clipper_intersect_clip_boxes (cairo_surface_clipper_t *clipper,
 
 static cairo_status_t
 _cairo_surface_clipper_intersect_clip_path_recursive (cairo_surface_clipper_t *clipper,
-						      cairo_clip_path_t *clip_path)
+						      cairo_clip_path_t *clip_path,
+						      cairo_clip_path_t *end)
 {
     cairo_status_t status;
 
-    if (clip_path->prev != NULL) {
+    if (clip_path->prev != end) {
 	status =
 	    _cairo_surface_clipper_intersect_clip_path_recursive (clipper,
-								  clip_path->prev);
+								  clip_path->prev,
+								  end);
 	if (unlikely (status))
 	    return status;
     }
@@ -122,6 +124,7 @@ _cairo_surface_clipper_set_clip (cairo_surface_clipper_t *clipper,
 				 const cairo_clip_t *clip)
 {
     cairo_status_t status;
+    cairo_bool_t incremental = FALSE;
 
     if (_cairo_clip_equal (clip, clipper->clip))
 	return CAIRO_STATUS_SUCCESS;
@@ -129,9 +132,31 @@ _cairo_surface_clipper_set_clip (cairo_surface_clipper_t *clipper,
     /* all clipped out state should never propagate this far */
     assert (!_cairo_clip_is_all_clipped (clip));
 
+    /* XXX Is this an incremental clip? */
+    if (clipper->clip &&
+	clip->num_boxes == clipper->clip->num_boxes &&
+	memcmp (clip->boxes, clipper->clip->boxes,
+		sizeof (cairo_box_t) * clip->num_boxes) == 0)
+    {
+	cairo_clip_path_t *clip_path = clip->path;
+	while (clip_path != clipper->clip->path)
+	    clip_path = clip_path->prev;
+
+	if (clip_path) {
+	    assert (clip_path != clipper->clip->path);
+	    incremental = TRUE;
+	    status = _cairo_surface_clipper_intersect_clip_path_recursive (clipper,
+									   clip->path,
+									   clipper->clip->path);
+	}
+    }
+
     _cairo_clip_destroy (clipper->clip);
     clipper->clip = _cairo_clip_copy (clip);
 
+    if (incremental)
+	return status;
+
     status = clipper->intersect_clip_path (clipper, NULL, 0, 0, 0);
     if (unlikely (status))
 	return status;
@@ -145,7 +170,8 @@ _cairo_surface_clipper_set_clip (cairo_surface_clipper_t *clipper,
 
     if (clip->path != NULL) {
 	    status = _cairo_surface_clipper_intersect_clip_path_recursive (clipper,
-									   clip->path);
+									   clip->path,
+									   NULL);
     }
 
     return status;
_______________________________________________
cairo-commit mailing list
cairo-commit@lists.cairographics.org
http://lists.cairographics.org/mailman/listinfo/cairo-commit
[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic