summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/Makefile.am7
-rw-r--r--test/pixman-rotate-ref.pngbin0 -> 260 bytes
-rw-r--r--test/pixman-rotate.c78
-rw-r--r--test/pixman_rotate-ref.pngbin0 -> 260 bytes
-rw-r--r--test/pixman_rotate.c78
5 files changed, 161 insertions, 2 deletions
diff --git a/test/Makefile.am b/test/Makefile.am
index 564abeb1..aa3d0604 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -7,7 +7,8 @@ move_to_show_surface \
text_cache_crash \
text_rotate \
coverage \
-clip_twice
+clip_twice \
+pixman_rotate
# And all new test go here too. I really don't like having to repeat
# this list. Anyone know a good way to avoid it? Can I use a wildcard
@@ -18,7 +19,8 @@ leaky_polygon-ref.png \
line_width-ref.png \
move_to_show_surface-ref.png \
coverage-ref.png \
-clip_twice-ref.png
+clip_twice-ref.png \
+pixman_rotate-ref.png
# Once we can draw the text_rotate.c test case correctly, we should
# create and add text_rotate-ref.png to the list of reference PNGs.
@@ -71,6 +73,7 @@ text_cache_crash_SOURCES = text_cache_crash.c $(cairo_test_lib)
text_rotate_SOURCES = text_rotate.c $(cairo_test_lib)
coverage_SOURCES = coverage.c $(cairo_test_lib)
clip_twice_SOURCES = clip_twice.c $(cairo_test_lib)
+pixman_rotate_SOURCES = pixman_rotate.c $(cairo_test_lib)
noinst_PROGRAMS = imagediff
imagediff_SOURCES = imagediff.c $(cairo_test_lib)
diff --git a/test/pixman-rotate-ref.png b/test/pixman-rotate-ref.png
new file mode 100644
index 00000000..7e47a4d8
--- /dev/null
+++ b/test/pixman-rotate-ref.png
Binary files differ
diff --git a/test/pixman-rotate.c b/test/pixman-rotate.c
new file mode 100644
index 00000000..6a64a9a7
--- /dev/null
+++ b/test/pixman-rotate.c
@@ -0,0 +1,78 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include <cairo.h>
+#include <cairo-png.h>
+#include <cairo-pdf.h>
+
+#include "cairo_test.h"
+
+#define WIDTH 32
+#define HEIGHT WIDTH
+
+#define IMAGE_WIDTH (3 * WIDTH)
+#define IMAGE_HEIGHT IMAGE_WIDTH
+
+cairo_test_t test = {
+ "pixman_rotate",
+ "Exposes pixman off-by-one error when rotating",
+ IMAGE_WIDTH, IMAGE_HEIGHT
+};
+
+/* Draw the word cairo at NUM_TEXT different angles */
+static void
+draw (cairo_t *cr, int width, int height)
+{
+ cairo_surface_t *target, *stamp;
+
+ target = cairo_current_target_surface (cr);
+ cairo_surface_reference (target);
+
+ stamp = cairo_surface_create_similar (target, CAIRO_FORMAT_ARGB32,
+ WIDTH, HEIGHT);
+ cairo_set_target_surface (cr, stamp);
+ cairo_new_path (cr);
+ cairo_rectangle (cr, WIDTH / 4, HEIGHT / 4, WIDTH / 2, HEIGHT / 2);
+ cairo_set_rgb_color (cr, 1, 0, 0);
+ cairo_set_alpha (cr, 0.8);
+ cairo_fill (cr);
+
+ cairo_rectangle (cr, 0, 0, WIDTH, HEIGHT);
+ cairo_set_line_width (cr, 2);
+ cairo_set_rgb_color (cr, 0, 0, 0);
+ cairo_set_alpha (cr, 1);
+ cairo_stroke (cr);
+
+ cairo_set_target_surface (cr, target);
+
+ /* Draw a translucent rectangle for reference where the rotated
+ * image should be. */
+ cairo_new_path (cr);
+ cairo_rectangle (cr, WIDTH, HEIGHT, WIDTH, HEIGHT);
+ cairo_set_rgb_color (cr, 1, 1, 0);
+ cairo_set_alpha (cr, 0.3);
+ cairo_fill (cr);
+
+#if 1 /* Set to 0 to generate reference image */
+ cairo_translate (cr, 2 * WIDTH, 2 * HEIGHT);
+ cairo_rotate (cr, M_PI);
+#else
+ cairo_translate (cr, WIDTH, HEIGHT);
+#endif
+
+ cairo_set_alpha (cr, 1);
+ cairo_show_surface (cr, stamp, WIDTH + 2, HEIGHT + 2);
+
+ cairo_show_page (cr);
+
+ cairo_surface_destroy (stamp);
+ cairo_surface_destroy (target);
+}
+
+int
+main (void)
+{
+ return cairo_test (&test, draw);
+}
diff --git a/test/pixman_rotate-ref.png b/test/pixman_rotate-ref.png
new file mode 100644
index 00000000..7e47a4d8
--- /dev/null
+++ b/test/pixman_rotate-ref.png
Binary files differ
diff --git a/test/pixman_rotate.c b/test/pixman_rotate.c
new file mode 100644
index 00000000..6a64a9a7
--- /dev/null
+++ b/test/pixman_rotate.c
@@ -0,0 +1,78 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <math.h>
+
+#include <cairo.h>
+#include <cairo-png.h>
+#include <cairo-pdf.h>
+
+#include "cairo_test.h"
+
+#define WIDTH 32
+#define HEIGHT WIDTH
+
+#define IMAGE_WIDTH (3 * WIDTH)
+#define IMAGE_HEIGHT IMAGE_WIDTH
+
+cairo_test_t test = {
+ "pixman_rotate",
+ "Exposes pixman off-by-one error when rotating",
+ IMAGE_WIDTH, IMAGE_HEIGHT
+};
+
+/* Draw the word cairo at NUM_TEXT different angles */
+static void
+draw (cairo_t *cr, int width, int height)
+{
+ cairo_surface_t *target, *stamp;
+
+ target = cairo_current_target_surface (cr);
+ cairo_surface_reference (target);
+
+ stamp = cairo_surface_create_similar (target, CAIRO_FORMAT_ARGB32,
+ WIDTH, HEIGHT);
+ cairo_set_target_surface (cr, stamp);
+ cairo_new_path (cr);
+ cairo_rectangle (cr, WIDTH / 4, HEIGHT / 4, WIDTH / 2, HEIGHT / 2);
+ cairo_set_rgb_color (cr, 1, 0, 0);
+ cairo_set_alpha (cr, 0.8);
+ cairo_fill (cr);
+
+ cairo_rectangle (cr, 0, 0, WIDTH, HEIGHT);
+ cairo_set_line_width (cr, 2);
+ cairo_set_rgb_color (cr, 0, 0, 0);
+ cairo_set_alpha (cr, 1);
+ cairo_stroke (cr);
+
+ cairo_set_target_surface (cr, target);
+
+ /* Draw a translucent rectangle for reference where the rotated
+ * image should be. */
+ cairo_new_path (cr);
+ cairo_rectangle (cr, WIDTH, HEIGHT, WIDTH, HEIGHT);
+ cairo_set_rgb_color (cr, 1, 1, 0);
+ cairo_set_alpha (cr, 0.3);
+ cairo_fill (cr);
+
+#if 1 /* Set to 0 to generate reference image */
+ cairo_translate (cr, 2 * WIDTH, 2 * HEIGHT);
+ cairo_rotate (cr, M_PI);
+#else
+ cairo_translate (cr, WIDTH, HEIGHT);
+#endif
+
+ cairo_set_alpha (cr, 1);
+ cairo_show_surface (cr, stamp, WIDTH + 2, HEIGHT + 2);
+
+ cairo_show_page (cr);
+
+ cairo_surface_destroy (stamp);
+ cairo_surface_destroy (target);
+}
+
+int
+main (void)
+{
+ return cairo_test (&test, draw);
+}