diff options
author | Kristian Høgsberg <krh@redhat.com> | 2005-02-07 09:38:43 +0000 |
---|---|---|
committer | Kristian Høgsberg <krh@redhat.com> | 2005-02-07 09:38:43 +0000 |
commit | 7296349eaa23f2e697e5553d7a1fd0b818aad47f (patch) | |
tree | f33bb2ed7a66c08671b5820bf7b9c434a478a1db /test/pixman-rotate.c | |
parent | 67ffc273eff916f9b1a2f4cc308683c0e4c0660a (diff) |
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.c | 78 |
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); +} |