summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorCarl Worth <cworth@cworth.org>2009-07-27 15:26:19 -0700
committerCarl Worth <cworth@cworth.org>2009-07-27 15:26:19 -0700
commit01acad1659caf766c57849f85dc3536fe2167608 (patch)
tree61dae14dbf75164a8c70eb23ae33ed241b4c012c /test
parent3cc9a6050d9704976d8efe373b913e5309bde6d2 (diff)
parentcf15aed0c4e843e7297c5a1979ac0318f6df4947 (diff)
Merge branch 'master' of git.cairographics.org:/git/cairo
Diffstat (limited to 'test')
-rw-r--r--test/Makefile.am4
-rw-r--r--test/Makefile.sources1
-rw-r--r--test/cairo-test.c7
-rw-r--r--test/meta-surface-pattern.pdf.argb32.ref.pngbin3868 -> 3919 bytes
-rw-r--r--test/meta-surface-pattern.pdf.rgb24.ref.pngbin3806 -> 3867 bytes
-rw-r--r--test/overlapping-glyphs.argb32.ref.pngbin0 -> 2696 bytes
-rw-r--r--test/overlapping-glyphs.c123
-rw-r--r--test/overlapping-glyphs.pdf.argb32.xfail.pngbin0 -> 2199 bytes
-rw-r--r--test/overlapping-glyphs.pdf.rgb24.xfail.pngbin0 -> 1692 bytes
-rw-r--r--test/overlapping-glyphs.rgb24.ref.pngbin0 -> 1650 bytes
-rw-r--r--test/radial-gradient.c36
-rw-r--r--test/radial-gradient.pdf.ref.pngbin79612 -> 277162 bytes
-rw-r--r--test/radial-gradient.ref.pngbin91159 -> 280971 bytes
-rw-r--r--test/scale-offset-image.pdf.xfail.pngbin8692 -> 8694 bytes
-rw-r--r--test/scale-offset-similar.pdf.xfail.pngbin9369 -> 9368 bytes
-rw-r--r--test/user-font-rescale.c13
16 files changed, 163 insertions, 21 deletions
diff --git a/test/Makefile.am b/test/Makefile.am
index ec5dfac90..b79428344 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -679,6 +679,10 @@ REFERENCE_IMAGES = \
over-between-source.svg12.rgb24.xfail.png \
over-between-source.xlib.ref.png \
over-between-source.xlib.rgb24.ref.png \
+ overlapping-glyphs.argb32.ref.png \
+ overlapping-glyphs.rgb24.ref.png \
+ overlapping-glyphs.pdf.argb32.xfail.png \
+ overlapping-glyphs.pdf.rgb24.xfail.png \
paint-repeat.ref.png \
paint-source-alpha.ref.png \
paint-source-alpha.svg.ref.png \
diff --git a/test/Makefile.sources b/test/Makefile.sources
index f8c63cd0a..b468bf266 100644
--- a/test/Makefile.sources
+++ b/test/Makefile.sources
@@ -132,6 +132,7 @@ test_sources = \
over-around-source.c \
over-below-source.c \
over-between-source.c \
+ overlapping-glyphs.c \
paint.c \
paint-repeat.c \
paint-source-alpha.c \
diff --git a/test/cairo-test.c b/test/cairo-test.c
index 34dd60020..430acc17c 100644
--- a/test/cairo-test.c
+++ b/test/cairo-test.c
@@ -1509,6 +1509,7 @@ _cairo_test_context_run_for_target (cairo_test_context_t *ctx,
#if defined(HAVE_SIGNAL_H) && defined(HAVE_SETJMP_H)
if (ctx->thread == 0 && ! RUNNING_ON_VALGRIND) {
void (* volatile old_segfault_handler)(int);
+ void (* volatile old_segfpe_handler)(int);
void (* volatile old_sigpipe_handler)(int);
void (* volatile old_sigabrt_handler)(int);
void (* volatile old_sigalrm_handler)(int);
@@ -1517,6 +1518,9 @@ _cairo_test_context_run_for_target (cairo_test_context_t *ctx,
#ifdef SIGSEGV
old_segfault_handler = signal (SIGSEGV, segfault_handler);
#endif
+#ifdef SIGFPE
+ old_segfpe_handler = signal (SIGFPE, segfault_handler);
+#endif
#ifdef SIGPIPE
old_sigpipe_handler = signal (SIGPIPE, segfault_handler);
#endif
@@ -1533,6 +1537,9 @@ _cairo_test_context_run_for_target (cairo_test_context_t *ctx,
#ifdef SIGSEGV
signal (SIGSEGV, old_segfault_handler);
#endif
+#ifdef SIGFPE
+ signal (SIGFPE, old_segfpe_handler);
+#endif
#ifdef SIGPIPE
signal (SIGPIPE, old_sigpipe_handler);
#endif
diff --git a/test/meta-surface-pattern.pdf.argb32.ref.png b/test/meta-surface-pattern.pdf.argb32.ref.png
index 786587c3f..043322280 100644
--- a/test/meta-surface-pattern.pdf.argb32.ref.png
+++ b/test/meta-surface-pattern.pdf.argb32.ref.png
Binary files differ
diff --git a/test/meta-surface-pattern.pdf.rgb24.ref.png b/test/meta-surface-pattern.pdf.rgb24.ref.png
index f542dabf2..b59a9caf8 100644
--- a/test/meta-surface-pattern.pdf.rgb24.ref.png
+++ b/test/meta-surface-pattern.pdf.rgb24.ref.png
Binary files differ
diff --git a/test/overlapping-glyphs.argb32.ref.png b/test/overlapping-glyphs.argb32.ref.png
new file mode 100644
index 000000000..2e2d60c00
--- /dev/null
+++ b/test/overlapping-glyphs.argb32.ref.png
Binary files differ
diff --git a/test/overlapping-glyphs.c b/test/overlapping-glyphs.c
new file mode 100644
index 000000000..690a6dd25
--- /dev/null
+++ b/test/overlapping-glyphs.c
@@ -0,0 +1,123 @@
+/*
+ * Copyright © 2009 Chris Wilson
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of
+ * Chris Wilson not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior
+ * permission. Chris Wilson makes no representations about the
+ * suitability of this software for any purpose. It is provided "as
+ * is" without express or implied warranty.
+ *
+ * CHRIS WILSON DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL CHRIS WILSON BE LIABLE FOR ANY SPECIAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+ * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Chris Wilson <chris@chris-wilson.co.uk>
+ */
+
+#include "cairo-test.h"
+
+#include <assert.h>
+
+#define TEXT_SIZE 12
+#define HEIGHT (TEXT_SIZE + 4)
+#define WIDTH 50
+
+#define MAX_GLYPHS 80
+
+static cairo_test_status_t
+draw (cairo_t *cr, int width, int height)
+{
+ cairo_glyph_t glyphs_stack[MAX_GLYPHS], *glyphs;
+ const char *cairo = "Cairo";
+ const char *giza = "Giza";
+ cairo_text_extents_t cairo_extents;
+ cairo_text_extents_t giza_extents;
+ int count, num_glyphs;
+ double x0, y0;
+
+ /* We draw in the default black, so paint white first. */
+ cairo_set_source_rgb (cr, 1.0, 1.0, 1.0); /* white */
+ 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);
+
+ /* We want to overlap two strings, so compute overlapping glyphs. */
+
+ cairo_text_extents (cr, cairo, &cairo_extents);
+ cairo_text_extents (cr, giza, &giza_extents);
+
+ x0 = WIDTH/2. - (cairo_extents.width/2. + cairo_extents.x_bearing);
+ y0 = HEIGHT/2. - (cairo_extents.height/2. + cairo_extents.y_bearing);
+ glyphs = glyphs_stack;
+ count = MAX_GLYPHS;
+ cairo_scaled_font_text_to_glyphs (cairo_get_scaled_font (cr),
+ x0, y0,
+ cairo, strlen (cairo),
+ &glyphs, &count,
+ NULL, NULL,
+ NULL);
+ assert (glyphs == glyphs_stack);
+ num_glyphs = count;
+
+ x0 = WIDTH/2. - (giza_extents.width/2. + giza_extents.x_bearing);
+ y0 = HEIGHT/2. - (giza_extents.height/2. + giza_extents.y_bearing);
+ glyphs = glyphs_stack + count;
+ count = MAX_GLYPHS - count;
+ cairo_scaled_font_text_to_glyphs (cairo_get_scaled_font (cr),
+ x0, y0,
+ giza, strlen (giza),
+ &glyphs, &count,
+ NULL, NULL,
+ NULL);
+ assert (glyphs == glyphs_stack + num_glyphs);
+ glyphs = glyphs_stack;
+ num_glyphs += count;
+
+ cairo_set_source_rgba (cr, 0, 0, 0, .5); /* translucent black, gray! */
+ cairo_show_glyphs (cr, glyphs, num_glyphs);
+
+ /* and compare with filling */
+ cairo_translate (cr, 0, HEIGHT);
+ cairo_glyph_path (cr, glyphs, num_glyphs);
+ cairo_fill (cr);
+
+ /* switch to using an unbounded operator for added complexity */
+ cairo_set_operator (cr, CAIRO_OPERATOR_IN);
+
+ cairo_translate (cr, WIDTH, -HEIGHT);
+ cairo_save (cr);
+ cairo_rectangle (cr, 0, 0, WIDTH, HEIGHT);
+ cairo_clip (cr);
+ cairo_show_glyphs (cr, glyphs, num_glyphs);
+ cairo_restore (cr);
+
+ cairo_translate (cr, 0, HEIGHT);
+ cairo_save (cr);
+ cairo_rectangle (cr, 0, 0, WIDTH, HEIGHT);
+ cairo_clip (cr);
+ cairo_glyph_path (cr, glyphs, num_glyphs);
+ cairo_fill (cr);
+ cairo_restore (cr);
+
+ return CAIRO_TEST_SUCCESS;
+}
+
+CAIRO_TEST (overlapping_glyphs,
+ "Test handing of overlapping glyphs",
+ "text, glyphs", /* keywords */
+ NULL, /* requirements */
+ 2 * WIDTH, 2 * HEIGHT,
+ NULL, draw)
+
diff --git a/test/overlapping-glyphs.pdf.argb32.xfail.png b/test/overlapping-glyphs.pdf.argb32.xfail.png
new file mode 100644
index 000000000..e3e433727
--- /dev/null
+++ b/test/overlapping-glyphs.pdf.argb32.xfail.png
Binary files differ
diff --git a/test/overlapping-glyphs.pdf.rgb24.xfail.png b/test/overlapping-glyphs.pdf.rgb24.xfail.png
new file mode 100644
index 000000000..a3f1d7047
--- /dev/null
+++ b/test/overlapping-glyphs.pdf.rgb24.xfail.png
Binary files differ
diff --git a/test/overlapping-glyphs.rgb24.ref.png b/test/overlapping-glyphs.rgb24.ref.png
new file mode 100644
index 000000000..d97813836
--- /dev/null
+++ b/test/overlapping-glyphs.rgb24.ref.png
Binary files differ
diff --git a/test/radial-gradient.c b/test/radial-gradient.c
index 9793feae8..a6d145c63 100644
--- a/test/radial-gradient.c
+++ b/test/radial-gradient.c
@@ -29,7 +29,7 @@
#define NUM_GRADIENTS 4
#define NUM_EXTEND 4
#define SIZE 60
-#define WIDTH (SIZE * NUM_GRADIENTS)
+#define WIDTH (SIZE * NUM_GRADIENTS * NUM_GRADIENTS)
#define HEIGHT (SIZE * NUM_EXTEND)
static void
@@ -37,18 +37,22 @@ draw_gradient (cairo_t *cr,
int x,
int y,
int size,
- double offset,
- double inner_radius,
+ double r1_offset,
+ double r1_radius,
+ double r2_offset,
+ double r2_radius,
cairo_extend_t extend)
{
cairo_pattern_t *pattern;
cairo_save (cr);
- pattern = cairo_pattern_create_radial (x + size/2.0 + offset,
- y + size/2.0 + offset, inner_radius,
- x + size/2.0,
- y + size/2.0, size/3.0);
+ pattern = cairo_pattern_create_radial (x + size/2.0 + r1_offset,
+ y + size/2.0 + r1_offset,
+ r1_radius,
+ x + size/2.0 + r2_offset,
+ y + size/2.0 + r2_offset,
+ r2_radius);
cairo_pattern_add_color_stop_rgba (pattern, 0.0,
1.0, 0.0, 0.0, 1.0);
cairo_pattern_add_color_stop_rgba (pattern, sqrt (1.0 / 2.0),
@@ -71,8 +75,7 @@ draw_gradient (cairo_t *cr,
static cairo_test_status_t
draw (cairo_t *cr, int width, int height)
{
- int i, j;
- double inner_radius, offset;
+ int i, j, k;
cairo_extend_t extend[NUM_EXTEND] = {
CAIRO_EXTEND_NONE,
CAIRO_EXTEND_REPEAT,
@@ -84,10 +87,17 @@ draw (cairo_t *cr, int width, int height)
for (j = 0; j < NUM_EXTEND; j++) {
for (i = 0; i < NUM_GRADIENTS; i++) {
- offset = i % 2 ? SIZE / 12.0 : 0.0;
- inner_radius = i >= NUM_EXTEND / 2 ? SIZE / 6.0 : 0.0;
- draw_gradient (cr, i * SIZE, j * SIZE, SIZE,
- offset, inner_radius, extend[j]);
+ double r1_offset = i % 2 ? SIZE / 12.0 : 0.0;
+ double r1_radius = i >= NUM_GRADIENTS / 2 ? SIZE / 6.0 : 0.0;
+ for (k = 0; k < NUM_GRADIENTS; k++) {
+ double r2_offset = k % 2 ? SIZE / 12.0 : 0.0;
+ double r2_radius = k >= NUM_GRADIENTS / 2 ? SIZE / 3.0 : SIZE / 12.;
+ draw_gradient (cr,
+ i * SIZE * NUM_GRADIENTS + k * SIZE, j * SIZE, SIZE,
+ r1_offset, r1_radius,
+ r2_offset, r2_radius,
+ extend[j]);
+ }
}
}
diff --git a/test/radial-gradient.pdf.ref.png b/test/radial-gradient.pdf.ref.png
index dbb7312a6..5bbd733f5 100644
--- a/test/radial-gradient.pdf.ref.png
+++ b/test/radial-gradient.pdf.ref.png
Binary files differ
diff --git a/test/radial-gradient.ref.png b/test/radial-gradient.ref.png
index ab1085816..bec83b7fa 100644
--- a/test/radial-gradient.ref.png
+++ b/test/radial-gradient.ref.png
Binary files differ
diff --git a/test/scale-offset-image.pdf.xfail.png b/test/scale-offset-image.pdf.xfail.png
index 4c7fe2831..3eacbbc86 100644
--- a/test/scale-offset-image.pdf.xfail.png
+++ b/test/scale-offset-image.pdf.xfail.png
Binary files differ
diff --git a/test/scale-offset-similar.pdf.xfail.png b/test/scale-offset-similar.pdf.xfail.png
index 4b600f4c9..7808aeb9a 100644
--- a/test/scale-offset-similar.pdf.xfail.png
+++ b/test/scale-offset-similar.pdf.xfail.png
Binary files differ
diff --git a/test/user-font-rescale.c b/test/user-font-rescale.c
index ae56ef849..54b3a20ca 100644
--- a/test/user-font-rescale.c
+++ b/test/user-font-rescale.c
@@ -257,11 +257,11 @@ get_user_font_face (cairo_font_face_t *substitute_font,
text, -1,
&glyphs, &num_glyphs,
NULL, NULL, NULL);
- if (status) {
- cairo_font_options_destroy (options);
- cairo_scaled_font_destroy (measure);
+ cairo_font_options_destroy (options);
+ cairo_scaled_font_destroy (measure);
+
+ if (status)
return status;
- }
/* find the glyph range the text covers */
max_index = glyphs[0].index;
@@ -274,7 +274,7 @@ get_user_font_face (cairo_font_face_t *substitute_font,
}
count = max_index - min_index + 1;
- widths = xmalloc (sizeof(double) * count);
+ widths = xcalloc (sizeof (double), count);
/* measure all of the necessary glyphs individually */
for (i=0; i<num_glyphs; i++) {
cairo_text_extents_t extents;
@@ -284,9 +284,6 @@ get_user_font_face (cairo_font_face_t *substitute_font,
cairo_glyph_free (glyphs);
- cairo_font_options_destroy (options);
- cairo_scaled_font_destroy (measure);
-
status = create_rescaled_font (substitute_font,
min_index, count, widths,
out);