[cairo] [PATCH] gl: Fix bug in render_glyphs_via_mask().

Chuanbo Weng strgnm at gmail.com
Tue Jun 19 13:04:43 PDT 2012


If the operator is unbounded and mask is not large enough, the area
affected by _cairo_surface_mask() in render_glyphs_via_mask() will
be too larger, then result in output error. Fixes overlapping-glyphs
and unbounded-operator test cases in cairo-test-suite.
---
 src/cairo-gl-glyphs.c |   41 +++++++++++++++++++++++++++++++++++------
 1 files changed, 35 insertions(+), 6 deletions(-)

diff --git a/src/cairo-gl-glyphs.c b/src/cairo-gl-glyphs.c
index c2660ac..b3ec4d1 100644
--- a/src/cairo-gl-glyphs.c
+++ b/src/cairo-gl-glyphs.c
@@ -372,6 +372,8 @@ render_glyphs_via_mask (cairo_gl_surface_t *dst,
     if (likely (status == CAIRO_STATUS_SUCCESS)) {
 	cairo_surface_pattern_t mask_pattern;
 	cairo_surface_pattern_t source_pattern;
+	cairo_gl_composite_t setup;
+	cairo_gl_context_t *ctx;
 
 	mask->is_clear = FALSE;
 	_cairo_pattern_init_for_surface (&mask_pattern, mask);
@@ -386,13 +388,40 @@ render_glyphs_via_mask (cairo_gl_surface_t *dst,
 	cairo_matrix_init_translate (&source_pattern.base.matrix,
 		                     dst_x-info->extents.x, dst_y-info->extents.y);
 
-	status = _cairo_surface_mask (&dst->base, op,
-		                      &source_pattern.base,
-				      &mask_pattern.base,
-				      clip);
+	status = _cairo_gl_composite_init (&setup, op, dst, FALSE);
+    	if (unlikely (status))
+            goto FAIL;
+
+	status = _cairo_gl_composite_set_source (&setup,
+						&source_pattern.base,
+						&_cairo_unbounded_rectangle,
+						&_cairo_unbounded_rectangle);
+	if (unlikely (status))
+            goto FAIL;
+
+	 status = _cairo_gl_composite_set_mask (&setup,
+                                               &mask_pattern.base,
+                                               &_cairo_unbounded_rectangle,
+                                               &_cairo_unbounded_rectangle);
+        if (unlikely (status))
+            goto FAIL;
+
+	status = _cairo_gl_composite_begin (&setup, &ctx);
+	if (unlikely (status))
+            goto FAIL;
+
+	_cairo_gl_composite_emit_rect (ctx, info->extents.x-dst_x, info->extents.y-dst_y, 
+				       info->extents.x-dst_x+info->extents.width,
+				       info->extents.y-dst_y+info->extents.height, 0);
+	status = _cairo_gl_context_release (ctx, CAIRO_STATUS_SUCCESS);
+
+	FAIL:
+	    _cairo_gl_composite_fini (&setup);
+	    _cairo_pattern_fini (&mask_pattern.base);
+	    _cairo_pattern_fini (&source_pattern.base);
+	    cairo_surface_destroy (mask);
+            return status;
 
-	_cairo_pattern_fini (&mask_pattern.base);
-	_cairo_pattern_fini (&source_pattern.base);
     }
 
     cairo_surface_destroy (mask);
-- 
1.7.5.4



More information about the cairo mailing list