[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