diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/Makefile.am | 7 | ||||
-rw-r--r-- | test/pixman-rotate-ref.png | bin | 0 -> 260 bytes | |||
-rw-r--r-- | test/pixman-rotate.c | 78 | ||||
-rw-r--r-- | test/pixman_rotate-ref.png | bin | 0 -> 260 bytes | |||
-rw-r--r-- | test/pixman_rotate.c | 78 |
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 Binary files differnew file mode 100644 index 00000000..7e47a4d8 --- /dev/null +++ b/test/pixman-rotate-ref.png 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 Binary files differnew file mode 100644 index 00000000..7e47a4d8 --- /dev/null +++ b/test/pixman_rotate-ref.png 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); +} |