summaryrefslogtreecommitdiff
path: root/test/pixman-rotate.c
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2005-02-07 09:38:43 +0000
committerKristian Høgsberg <krh@redhat.com>2005-02-07 09:38:43 +0000
commit7296349eaa23f2e697e5553d7a1fd0b818aad47f (patch)
treef33bb2ed7a66c08671b5820bf7b9c434a478a1db /test/pixman-rotate.c
parent67ffc273eff916f9b1a2f4cc308683c0e4c0660a (diff)
downloadcairo-7296349eaa23f2e697e5553d7a1fd0b818aad47f.tar.gz
New test case which exposes off-by-one rotation error in pixman.
Diffstat (limited to 'test/pixman-rotate.c')
-rw-r--r--test/pixman-rotate.c78
1 files changed, 78 insertions, 0 deletions
diff --git a/test/pixman-rotate.c b/test/pixman-rotate.c
new file mode 100644
index 000000000..6a64a9a77
--- /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);
+}