[cairo-commit] 2 commits - src/cairoint.h src/cairo-meta-surface.c src/cairo-pattern.c src/cairo-surface.c test/.gitignore test/large-font.c test/large-font-ps-ref.png test/large-font-ref.png test/Makefile.am

Carl Worth cworth at kemper.freedesktop.org
Fri May 23 08:05:40 PDT 2008


 src/cairo-meta-surface.c   |   40 ++++++++++++++++---
 src/cairo-pattern.c        |    9 ++--
 src/cairo-surface.c        |   20 +++++++++
 src/cairoint.h             |   12 +++++
 test/.gitignore            |    1 
 test/Makefile.am           |    3 +
 test/large-font-ps-ref.png |binary
 test/large-font-ref.png    |binary
 test/large-font.c          |   93 +++++++++++++++++++++++++++++++++++++++++++++
 9 files changed, 169 insertions(+), 9 deletions(-)

New commits:
commit b957beb0df53a513b60cbcfc4e5e847980789b1f
Author: Carl Worth <cworth at cworth.org>
Date:   Fri May 23 08:05:18 2008 -0700

    Add large-font test to exercise a cairo-xlib bug.
    
    The original bug report is here:
    
    	corrupt glyph positions with large font
    	https://bugzilla.redhat.com/show_bug.cgi?id=448104

diff --git a/test/.gitignore b/test/.gitignore
index 65f9a77..8fddf60 100644
--- a/test/.gitignore
+++ b/test/.gitignore
@@ -92,6 +92,7 @@ infinite-join
 in-fill-empty-trapezoid
 in-fill-trapezoid
 invalid-matrix
+large-font
 large-source
 leaky-dash
 leaky-dashed-rectangle
diff --git a/test/Makefile.am b/test/Makefile.am
index 2b8e156..f444ff3 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -71,6 +71,7 @@ infinite-join$(EXEEXT)					\
 in-fill-empty-trapezoid$(EXEEXT)			\
 in-fill-trapezoid$(EXEEXT)				\
 invalid-matrix$(EXEEXT)					\
+large-font$(EXEEXT)					\
 large-source$(EXEEXT)					\
 leaky-dash$(EXEEXT)					\
 leaky-dashed-rectangle$(EXEEXT)				\
@@ -441,6 +442,8 @@ REFERENCE_IMAGES = \
 	image-surface-source-ref.png \
 	infinite-join-ref.png	\
 	infinite-join-ps-ref.png	\
+	large-font-ref.png	\
+	large-font-ps-ref.png	\
 	large-source-ref.png	\
 	leaky-dash-ps-argb32-ref.png	\
 	leaky-dash-ps-rgb24-ref.png	\
diff --git a/test/large-font-ps-ref.png b/test/large-font-ps-ref.png
new file mode 100644
index 0000000..1dbd7cd
Binary files /dev/null and b/test/large-font-ps-ref.png differ
diff --git a/test/large-font-ref.png b/test/large-font-ref.png
new file mode 100644
index 0000000..8a555f1
Binary files /dev/null and b/test/large-font-ref.png differ
diff --git a/test/large-font.c b/test/large-font.c
new file mode 100644
index 0000000..7554a3e
--- /dev/null
+++ b/test/large-font.c
@@ -0,0 +1,93 @@
+/*
+ * Copyright © 2008 Red Hat, Inc.
+ *
+ * Permission is hereby granted, free of charge, to any person
+ * obtaining a copy of this software and associated documentation
+ * files (the "Software"), to deal in the Software without
+ * restriction, including without limitation the rights to use, copy,
+ * modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is
+ * furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be
+ * included in all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+ * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+ * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
+ * BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+ * ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+ * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ * Author: Carl D. Worth <cworth at cworth.org>
+ */
+
+/* Bug history:
+ *
+ * 2008-05-23: Caolan McNamara noticed a bug in OpenOffice.org where,
+ *             when using a very large font, space would be left for a
+ *	       glyph but it would actually be rendered in the wrong
+ *	       place. He wrote a minimal test case and posted the bug
+ *	       here:
+ *
+ *			corrupt glyph positions with large font
+ *			https://bugzilla.redhat.com/show_bug.cgi?id=448104
+ *
+ * 2008-05-23: Carl Worth wrote this test for the cairo test suite to
+ *             exercise the bug.k
+ */
+
+#include "cairo-test.h"
+
+#define WIDTH  400
+#define HEIGHT 200
+#define TEXT_SIZE 160
+
+static cairo_test_draw_function_t draw;
+
+cairo_test_t test = {
+    "large-font",
+    "Draws a very large font to exercise a glyph-positioning bug",
+    WIDTH, HEIGHT,
+    draw
+};
+
+static cairo_test_status_t
+draw (cairo_t *cr, int width, int height)
+{
+    cairo_font_options_t *font_options;
+
+    /* paint white so we don't need separate ref images for
+     * RGB24 and ARGB32 */
+    cairo_set_source_rgb (cr, 1., 1., 1.);
+    cairo_paint (cr);
+
+    cairo_select_font_face (cr, "Bitstream Vera Sans",
+			    CAIRO_FONT_SLANT_NORMAL,
+			    CAIRO_FONT_WEIGHT_NORMAL);
+    cairo_set_font_size (cr, TEXT_SIZE);
+
+    font_options = cairo_font_options_create ();
+
+    cairo_get_font_options (cr, font_options);
+    cairo_font_options_set_hint_metrics (font_options, CAIRO_HINT_METRICS_OFF);
+
+    cairo_set_font_options (cr, font_options);
+    cairo_font_options_destroy (font_options);
+
+    cairo_set_source_rgb (cr, 0, 0, 0);
+
+    cairo_set_font_size (cr, 160);
+    cairo_move_to (cr, 5, 160);
+    cairo_show_text (cr, "MoW");
+
+    return CAIRO_TEST_SUCCESS;
+}
+
+int
+main (void)
+{
+    return cairo_test (&test);
+}
commit ddcd6781a24463df5a1f25cd5ffdbce47f35cf2f
Author: Carl Worth <cworth at cworth.org>
Date:   Wed May 21 12:06:37 2008 -0700

    BUGGY: Add surface_backend->acquire_source_image_transformed
    
    This is an initial attempt at addressing the recently noticed
    fallback-resolution bug. It isn't working correctly yet.
    
    I'm just committing so that behdad can see what I'm up to.

diff --git a/src/cairo-meta-surface.c b/src/cairo-meta-surface.c
index 6abb29a..f652de7 100644
--- a/src/cairo-meta-surface.c
+++ b/src/cairo-meta-surface.c
@@ -182,17 +182,26 @@ _cairo_meta_surface_finish (void *abstract_surface)
 }
 
 static cairo_status_t
-_cairo_meta_surface_acquire_source_image (void			 *abstract_surface,
-					  cairo_image_surface_t	**image_out,
-					  void			**image_extra)
+_cairo_meta_surface_acquire_source_image_transformed (
+    void			 *abstract_surface,
+    cairo_matrix_t		 *device_transform,
+    cairo_image_surface_t	**image_out,
+    void			**image_extra)
 {
     cairo_status_t status;
     cairo_meta_surface_t *surface = abstract_surface;
     cairo_surface_t *image;
+    double width = surface->width_pixels;
+    double height = surface->height_pixels;
+
+    cairo_matrix_transform_distance (device_transform, &width, &height);
 
     image = _cairo_image_surface_create_with_content (surface->content,
-						      surface->width_pixels,
-						      surface->height_pixels);
+						      ceil (width),
+						      ceil (height));
+
+    _cairo_surface_set_device_scale (image,
+				     device_transform->xx, device_transform->yy);
 
     status = _cairo_meta_surface_replay (&surface->base, image);
     if (status) {
@@ -206,6 +215,19 @@ _cairo_meta_surface_acquire_source_image (void			 *abstract_surface,
     return status;
 }
 
+static cairo_status_t
+_cairo_meta_surface_acquire_source_image (void			 *abstract_surface,
+					  cairo_image_surface_t	**image_out,
+					  void			**image_extra)
+{
+    cairo_matrix_t identity;
+
+    cairo_matrix_init_identity (&identity);
+
+    return _cairo_meta_surface_acquire_source_image_transformed (
+	abstract_surface, &identity, image_out, image_extra);
+}
+
 static void
 _cairo_meta_surface_release_source_image (void			*abstract_surface,
 					  cairo_image_surface_t	*image,
@@ -629,7 +651,13 @@ static const cairo_surface_backend_t cairo_meta_surface_backend = {
     _cairo_meta_surface_fill,
     _cairo_meta_surface_show_glyphs,
 
-    _cairo_meta_surface_snapshot
+    _cairo_meta_surface_snapshot,
+
+    NULL, /* is_similar */
+    NULL, /* reset */
+    NULL, /* fill_stroke */
+
+    _cairo_meta_surface_acquire_source_image_transformed
 };
 
 static cairo_path_fixed_t *
diff --git a/src/cairo-pattern.c b/src/cairo-pattern.c
index c0bfbaf..1975daf 100644
--- a/src/cairo-pattern.c
+++ b/src/cairo-pattern.c
@@ -1702,9 +1702,12 @@ _cairo_pattern_acquire_surface_for_surface (cairo_surface_pattern_t   *pattern,
     {
 	cairo_image_surface_t *image;
 
-	status = _cairo_surface_acquire_source_image (pattern->surface,
-						      &image,
-						      &attr->extra);
+	status = _cairo_surface_acquire_source_image_transformed (
+	    pattern->surface,
+	    &dst->device_transform,
+	    &image,
+	    &attr->extra);
+
 	if (status)
 	    return status;
 
diff --git a/src/cairo-surface.c b/src/cairo-surface.c
index ba39b9b..833737c 100644
--- a/src/cairo-surface.c
+++ b/src/cairo-surface.c
@@ -968,6 +968,26 @@ _cairo_surface_acquire_source_image (cairo_surface_t         *surface,
 						    image_out, image_extra));
 }
 
+cairo_status_t
+_cairo_surface_acquire_source_image_transformed (cairo_surface_t	 *surface,
+						 cairo_matrix_t		 *device_transform,
+						 cairo_image_surface_t  **image_out,
+						 void                   **image_extra)
+{
+    assert (!surface->finished);
+
+    if (surface->status)
+	return surface->status;
+
+    if (surface->backend->acquire_source_image_transformed == NULL)
+	return _cairo_surface_acquire_source_image (surface,
+						    image_out, image_extra);
+
+    return _cairo_surface_set_error (surface,
+	    surface->backend->acquire_source_image_transformed (
+		surface, device_transform, image_out, image_extra));
+}
+
 /**
  * _cairo_surface_release_source_image:
  * @surface: a #cairo_surface_t
diff --git a/src/cairoint.h b/src/cairoint.h
index 8716bd4..f930b51 100755
--- a/src/cairoint.h
+++ b/src/cairoint.h
@@ -738,6 +738,12 @@ struct _cairo_surface_backend {
 				 cairo_matrix_t		*stroke_ctm_inverse,
 				 double			 stroke_tolerance,
 				 cairo_antialias_t	 stroke_antialias);
+
+    cairo_warn cairo_status_t
+    (*acquire_source_image_transformed)	(void                    *abstract_surface,
+					 cairo_matrix_t		 *device_trasnform,
+					 cairo_image_surface_t  **image_out,
+					 void                   **image_extra);
 };
 
 #include "cairo-surface-private.h"
@@ -1721,6 +1727,12 @@ _cairo_surface_acquire_source_image (cairo_surface_t         *surface,
 				     cairo_image_surface_t  **image_out,
 				     void                   **image_extra);
 
+cairo_private cairo_status_t
+_cairo_surface_acquire_source_image_transformed (cairo_surface_t         *surface,
+						 cairo_matrix_t		 *device_trasnform,
+						 cairo_image_surface_t  **image_out,
+						 void                   **image_extra);
+
 cairo_private void
 _cairo_surface_release_source_image (cairo_surface_t        *surface,
 				     cairo_image_surface_t  *image,


More information about the cairo-commit mailing list