[cairo] [PATCH 47/51] drm: replace use of _cairo_clip_to_boxes()

Enrico Weigelt, metux IT consult enrico.weigelt at gr13.net
Fri Dec 18 05:29:26 PST 2015


_cairo_clip_to_boxes() doesnt exist anymore, but we also dont need to copy box lists at all.

Signed-off-by: Enrico Weigelt, metux IT consult <enrico.weigelt at gr13.net>
---
 src/drm/cairo-drm-i915-surface.c | 37 +++++++--------------------------
 src/drm/cairo-drm-i965-glyphs.c  | 10 ++++-----
 src/drm/cairo-drm-i965-surface.c | 45 ++++++----------------------------------
 3 files changed, 18 insertions(+), 74 deletions(-)

diff --git a/src/drm/cairo-drm-i915-surface.c b/src/drm/cairo-drm-i915-surface.c
index 211c964..675da80 100644
--- a/src/drm/cairo-drm-i915-surface.c
+++ b/src/drm/cairo-drm-i915-surface.c
@@ -102,6 +102,7 @@
 
 #include "cairo-boxes-private.h"
 #include "cairo-cache-private.h"
+#include "cairo-clip-inline.h"
 #include "cairo-composite-rectangles-private.h"
 #include "cairo-default-context-private.h"
 #include "cairo-error-private.h"
@@ -1878,9 +1879,7 @@ i915_surface_fill_with_alpha (void			*abstract_dst,
     i915_surface_t *dst = abstract_dst;
     cairo_composite_rectangles_t extents;
     composite_polygon_info_t info;
-    cairo_box_t boxes_stack[32], *clip_boxes = boxes_stack;
     cairo_clip_t *local_clip = NULL;
-    int num_boxes = ARRAY_LENGTH (boxes_stack);
     cairo_int_status_t status;
 
     status = _cairo_composite_rectangles_init_for_fill (&extents,
@@ -1909,7 +1908,6 @@ i915_surface_fill_with_alpha (void			*abstract_dst,
     if (clip != NULL)
 	clip = local_clip = _cairo_clip_copy (clip);
 
-    status = _cairo_clip_to_boxes (&clip, &extents, &clip_boxes, &num_boxes);
     if (unlikely (status)) {
 	_cairo_clip_destroy (local_clip);
 
@@ -1922,7 +1920,7 @@ i915_surface_fill_with_alpha (void			*abstract_dst,
 	cairo_boxes_t boxes;
 
 	_cairo_boxes_init (&boxes);
-	_cairo_boxes_limit (&boxes, clip_boxes, num_boxes);
+	_cairo_boxes_limit (&boxes, extents.clip->boxes, extents.clip->num_boxes);
 	cairo_status_t stat = _cairo_path_fixed_fill_rectilinear_to_boxes (path,
 							      fill_rule,
 							      antialias,
@@ -1940,7 +1938,7 @@ i915_surface_fill_with_alpha (void			*abstract_dst,
 	    goto CLEANUP_BOXES;
     }
 
-    _cairo_polygon_init (&info.polygon, clip_boxes, num_boxes);
+    _cairo_polygon_init (&info.polygon, extents.clip->boxes, extents.clip->num_boxes);
 
     status = _cairo_path_fixed_fill_to_polygon (path, tolerance, &info.polygon);
     if (unlikely (status))
@@ -1971,9 +1969,6 @@ CLEANUP_POLYGON:
     _cairo_polygon_fini (&info.polygon);
 
 CLEANUP_BOXES:
-    if (clip_boxes != boxes_stack)
-	free (clip_boxes);
-
     _cairo_clip_destroy (local_clip);
 
     return status;
@@ -1991,9 +1986,6 @@ i915_surface_paint_with_alpha (void			*abstract_dst,
     cairo_composite_rectangles_t extents;
     cairo_clip_t *local_clip = NULL;
     cairo_clip_path_t *clip_path;
-    cairo_boxes_t boxes;
-    int num_boxes = ARRAY_LENGTH (boxes.boxes_embedded);
-    cairo_box_t *clip_boxes = boxes.boxes_embedded;
     cairo_status_t status;
 
     status = _cairo_composite_rectangles_init_for_paint (&extents,
@@ -2010,13 +2002,6 @@ i915_surface_paint_with_alpha (void			*abstract_dst,
     if (clip != NULL)
 	clip = local_clip = _cairo_clip_copy (clip);
 
-    status = _cairo_clip_to_boxes (&clip, &extents, &clip_boxes, &num_boxes);
-    if (unlikely (status)) {
-	_cairo_clip_destroy (local_clip);
-
-	return status;
-    }
-
     /* If the clip cannot be reduced to a set of boxes, we will need to
      * use a clipmask. Paint is special as it is the only operation that
      * does not implicitly use a mask, so we may be able to reduce this
@@ -2035,13 +2020,12 @@ i915_surface_paint_with_alpha (void			*abstract_dst,
     }
     else
     {
-	_cairo_boxes_init_for_array (&boxes, clip_boxes, num_boxes);
+	cairo_boxes_t boxes;
+	_cairo_boxes_init_for_array (&boxes, extents.clip->boxes, extents.clip->num_boxes);
 	status = _clip_and_composite_boxes (dst, op, source,
 					    &boxes, antialias,
 					    &extents, clip, opacity);
     }
-    if (clip_boxes != boxes.boxes_embedded)
-	free (clip_boxes);
 
     _cairo_clip_destroy (local_clip);
 
@@ -2215,8 +2199,6 @@ i915_surface_stroke (void			*abstract_dst,
     i915_surface_t *dst = abstract_dst;
     cairo_composite_rectangles_t extents;
     composite_polygon_info_t info;
-    cairo_box_t boxes_stack[32], *clip_boxes = boxes_stack;
-    int num_boxes = ARRAY_LENGTH (boxes_stack);
     cairo_clip_t *local_clip = NULL;
     cairo_int_status_t status;
 
@@ -2237,7 +2219,6 @@ i915_surface_stroke (void			*abstract_dst,
     if (clip != NULL)
 	clip = local_clip = _cairo_clip_copy (clip);
 
-    status = _cairo_clip_to_boxes (&clip, &extents, &clip_boxes, &num_boxes);
     if (unlikely (status)) {
 	_cairo_clip_destroy (local_clip);
 
@@ -2248,12 +2229,13 @@ i915_surface_stroke (void			*abstract_dst,
 	cairo_boxes_t boxes;
 
 	_cairo_boxes_init (&boxes);
-	_cairo_boxes_limit (&boxes, clip_boxes, num_boxes);
+	_cairo_boxes_limit (&boxes, extents.clip->boxes, extents.clip->num_boxes);
 	cairo_status_t stat = _cairo_path_fixed_stroke_rectilinear_to_boxes (path,
 								stroke_style,
 								ctm,
 								antialias,
 								&boxes);
+
 	if (likely (stat == CAIRO_STATUS_SUCCESS)) {
 	    status = _clip_and_composite_boxes (dst, op, source,
 						&boxes, antialias,
@@ -2266,7 +2248,7 @@ i915_surface_stroke (void			*abstract_dst,
 	    goto CLEANUP_BOXES;
     }
 
-    _cairo_polygon_init (&info.polygon, clip_boxes, num_boxes);
+    _cairo_polygon_init (&info.polygon, extents.clip->boxes, extents.clip->num_boxes);
 
     status = _cairo_path_fixed_stroke_to_polygon (path,
 						  stroke_style,
@@ -2301,9 +2283,6 @@ CLEANUP_POLYGON:
     _cairo_polygon_fini (&info.polygon);
 
 CLEANUP_BOXES:
-    if (clip_boxes != boxes_stack)
-	free (clip_boxes);
-
     _cairo_clip_destroy (local_clip);
 
     return status;
diff --git a/src/drm/cairo-drm-i965-glyphs.c b/src/drm/cairo-drm-i965-glyphs.c
index fd54cd4..5b4e1fa 100644
--- a/src/drm/cairo-drm-i965-glyphs.c
+++ b/src/drm/cairo-drm-i965-glyphs.c
@@ -165,13 +165,12 @@ i965_surface_mask_internal (i965_surface_t *dst,
     shader.mask.base.stride = mask->intel.drm.stride;
 
     if (clip != NULL) {
-	status = _cairo_clip_get_region (clip, &clip_region);
-	assert (status == CAIRO_STATUS_SUCCESS || status == CAIRO_INT_STATUS_UNSUPPORTED);
+	clip_region = _cairo_clip_get_region (clip);
 
 	if (clip_region != NULL && cairo_region_num_rectangles (clip_region) == 1)
 	    clip_region = NULL;
 
-	if (status == CAIRO_INT_STATUS_UNSUPPORTED)
+	if (clip_region == NULL)
 	    i965_shader_set_clip (&shader, clip);
     }
 
@@ -318,10 +317,9 @@ i965_surface_glyphs (void			*abstract_surface,
 	    return status;
 
 	if (clip != NULL) {
-	    status = _cairo_clip_get_region (clip, &clip_region);
-	    assert (status == CAIRO_STATUS_SUCCESS || status == CAIRO_INT_STATUS_UNSUPPORTED);
+	    clip_region = _cairo_clip_get_region (clip);
 
-	    if (status == CAIRO_INT_STATUS_UNSUPPORTED)
+	    if (clip_region == NULL)
 		i965_shader_set_clip (&glyphs.shader, clip);
 	}
     }
diff --git a/src/drm/cairo-drm-i965-surface.c b/src/drm/cairo-drm-i965-surface.c
index ef32e41..793686d 100644
--- a/src/drm/cairo-drm-i965-surface.c
+++ b/src/drm/cairo-drm-i965-surface.c
@@ -990,7 +990,6 @@ _composite_boxes (i965_surface_t *dst,
 		  const cairo_clip_t *clip,
 		  const cairo_composite_rectangles_t *extents)
 {
-    cairo_region_t *clip_region = NULL;
     const struct _cairo_boxes_chunk *chunk;
     cairo_int_status_t status;
     i965_shader_t shader;
@@ -1013,7 +1012,7 @@ _composite_boxes (i965_surface_t *dst,
 	return status;
 
     if (clip != NULL) {
-	clip_region = _cairo_clip_get_region (clip);
+	cairo_region_t *clip_region = _cairo_clip_get_region (clip);
 	if (clip_region == NULL)
 	    i965_shader_set_clip (&shader, clip);
     }
@@ -1091,9 +1090,7 @@ i965_surface_paint (void			*abstract_dst,
     i965_surface_t *dst = cairo_abstract_surface_cast_i965(abstract_dst);
     cairo_composite_rectangles_t extents;
     cairo_boxes_t boxes;
-    cairo_box_t *clip_boxes = boxes.boxes_embedded;
     cairo_clip_t *local_clip = NULL;
-    int num_boxes = ARRAY_LENGTH (boxes.boxes_embedded);
     cairo_status_t status;
 
     /* XXX unsupported operators? use pixel shader blending, eventually */
@@ -1111,18 +1108,10 @@ i965_surface_paint (void			*abstract_dst,
     if (clip != NULL)
 	clip = local_clip = _cairo_clip_copy (clip);
 
-    status = _cairo_clip_to_boxes (&clip, &extents, &clip_boxes, &num_boxes);
-    if (unlikely (status)) {
-	_cairo_clip_destroy (local_clip);
-	return status;
-    }
-
-    _cairo_boxes_init_for_array (&boxes, clip_boxes, num_boxes);
+    _cairo_boxes_init_for_array (&boxes, extents.clip->boxes, extents.clip->num_boxes);
     status = _clip_and_composite_boxes (dst, op, source,
 					&boxes, CAIRO_ANTIALIAS_DEFAULT,
 					&extents, clip);
-    if (clip_boxes != boxes.boxes_embedded)
-	free (clip_boxes);
 
     _cairo_clip_destroy (local_clip);
 
@@ -1267,8 +1256,6 @@ i965_surface_stroke (void			*abstract_dst,
     i965_surface_t *dst = abstract_dst;
     cairo_composite_rectangles_t extents;
     composite_polygon_info_t info;
-    cairo_box_t boxes_stack[32], *clip_boxes = boxes_stack;
-    int num_boxes = ARRAY_LENGTH (boxes_stack);
     cairo_clip_t *local_clip = NULL;
     cairo_int_status_t status;
 
@@ -1286,17 +1273,11 @@ i965_surface_stroke (void			*abstract_dst,
     if (clip != NULL)
 	clip = local_clip = _cairo_clip_copy (clip);
 
-    status = _cairo_clip_to_boxes (&clip, &extents, &clip_boxes, &num_boxes);
-    if (unlikely (status)) {
-	_cairo_clip_destroy (local_clip);
-	return status;
-    }
-
     if (_cairo_path_fixed_stroke_is_rectilinear (path)) {
 	cairo_boxes_t boxes;
 
 	_cairo_boxes_init (&boxes);
-	_cairo_boxes_limit (&boxes, clip_boxes, num_boxes);
+	_cairo_boxes_limit (&boxes, extents.clip->boxes, extents.clip->num_boxes);
 	status = _cairo_path_fixed_stroke_rectilinear_to_boxes (path,
 								stroke_style,
 								ctm,
@@ -1314,7 +1295,7 @@ i965_surface_stroke (void			*abstract_dst,
 	    goto CLEANUP_BOXES;
     }
 
-    _cairo_polygon_init (&info.polygon, clip_boxes, num_boxes);
+    _cairo_polygon_init (&info.polygon, extents.clip->boxes, extents.clip->num_boxes);
 
     status = _cairo_path_fixed_stroke_to_polygon (path,
 						  stroke_style,
@@ -1347,9 +1328,6 @@ CLEANUP_POLYGON:
     _cairo_polygon_fini (&info.polygon);
 
 CLEANUP_BOXES:
-    if (clip_boxes != boxes_stack)
-	free (clip_boxes);
-
     _cairo_clip_destroy (local_clip);
 
     return status;
@@ -1368,9 +1346,7 @@ i965_surface_fill (void			*abstract_dst,
     i965_surface_t *dst = cairo_abstract_surface_cast_i965(abstract_dst);
     cairo_composite_rectangles_t extents;
     composite_polygon_info_t info;
-    cairo_box_t boxes_stack[32], *clip_boxes = boxes_stack;
     cairo_clip_t *local_clip = NULL;
-    int num_boxes = ARRAY_LENGTH (boxes_stack);
     cairo_int_status_t status;
 
     status = _cairo_composite_rectangles_init_for_fill (&extents,
@@ -1388,19 +1364,13 @@ i965_surface_fill (void			*abstract_dst,
     if (clip != NULL)
 	clip = local_clip = _cairo_clip_copy (clip);
 
-    status = _cairo_clip_to_boxes (&clip, &extents, &clip_boxes, &num_boxes);
-    if (unlikely (status)) {
-	_cairo_clip_destroy (local_clip);
-	return status;
-    }
-
     assert (! _cairo_path_fixed_fill_is_empty (path));
 
     if (_cairo_path_fixed_fill_is_rectilinear (path)) {
 	cairo_boxes_t boxes;
 
 	_cairo_boxes_init (&boxes);
-	_cairo_boxes_limit (&boxes, clip_boxes, num_boxes);
+	_cairo_boxes_limit (&boxes, extents.clip->boxes, extents.clip->num_boxes);
 	status = _cairo_path_fixed_fill_rectilinear_to_boxes (path,
 							      fill_rule,
 							      antialias,
@@ -1417,7 +1387,7 @@ i965_surface_fill (void			*abstract_dst,
 	    goto CLEANUP_BOXES;
     }
 
-    _cairo_polygon_init (&info.polygon, clip_boxes, num_boxes);
+    _cairo_polygon_init (&info.polygon, extents.clip->boxes, extents.clip->num_boxes);
 
     status = _cairo_path_fixed_fill_to_polygon (path, tolerance, &info.polygon);
     if (unlikely (status))
@@ -1446,9 +1416,6 @@ CLEANUP_POLYGON:
     _cairo_polygon_fini (&info.polygon);
 
 CLEANUP_BOXES:
-    if (clip_boxes != boxes_stack)
-	free (clip_boxes);
-
     _cairo_clip_destroy (local_clip);
 
     return status;
-- 
2.6.4.442.g545299f



More information about the cairo mailing list