finer-grained-fallbacks.c [plain text]
#include "cairo-test.h"
#define CIRCLE_SIZE 10
#define PAD 2
#define WIDTH (CIRCLE_SIZE*6.5 + PAD)
#define HEIGHT (CIRCLE_SIZE*7.0 + PAD)
static void
draw_circle (cairo_t *cr, double x, double y)
{
cairo_save (cr);
cairo_translate (cr, x, y);
cairo_arc (cr, 0, 0, CIRCLE_SIZE / 2, 0., 2. * M_PI);
cairo_fill (cr);
cairo_restore (cr);
}
static void
draw_image_circle (cairo_t *cr, cairo_surface_t *source, double x, double y)
{
cairo_save (cr);
cairo_set_source_surface (cr, source, x, y);
cairo_pattern_set_extend (cairo_get_source (cr), CAIRO_EXTEND_REFLECT);
cairo_rectangle (cr, x, y, CIRCLE_SIZE, CIRCLE_SIZE);
cairo_fill (cr);
cairo_restore (cr);
}
static void
draw_circles (cairo_t *cr)
{
draw_circle (cr, 0, -CIRCLE_SIZE*0.1);
draw_circle (cr, CIRCLE_SIZE*0.4, CIRCLE_SIZE*0.25);
draw_circle (cr, CIRCLE_SIZE*2, 0);
draw_circle (cr, CIRCLE_SIZE*4, 0);
draw_circle (cr, CIRCLE_SIZE*6, 0);
}
static void
draw_image_circles (cairo_t *cr, cairo_surface_t *source)
{
draw_image_circle (cr, source, 0, -CIRCLE_SIZE*0.1);
draw_image_circle (cr, source, CIRCLE_SIZE*0.4, CIRCLE_SIZE*0.25);
draw_image_circle (cr, source, CIRCLE_SIZE*2, 0);
draw_image_circle (cr, source, CIRCLE_SIZE*4, 0);
draw_image_circle (cr, source, CIRCLE_SIZE*6, 0);
}
static cairo_surface_t *
surface_create (cairo_t *target)
{
cairo_surface_t *surface;
cairo_t *cr;
surface = cairo_surface_create_similar (cairo_get_target (target),
CAIRO_CONTENT_COLOR_ALPHA,
CIRCLE_SIZE, CIRCLE_SIZE);
cr = cairo_create (surface);
cairo_surface_destroy (surface);
cairo_set_source_rgb (cr, 1.0, 0.0, 0.0);
draw_circle (cr, CIRCLE_SIZE/2, CIRCLE_SIZE/2);
surface = cairo_surface_reference (cairo_get_target (cr));
cairo_destroy (cr);
return surface;
}
static cairo_test_status_t
draw (cairo_t *cr, int width, int height)
{
cairo_surface_t *surface;
cairo_translate (cr, PAD, PAD);
cairo_save (cr);
cairo_set_source_rgb (cr, 0.0, 1.0, 0.0);
cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
draw_circle (cr, CIRCLE_SIZE*0.5, CIRCLE_SIZE*1.5);
cairo_set_source_rgb (cr, 1.0, 0.0, 0.0);
cairo_set_operator (cr, CAIRO_OPERATOR_ADD);
draw_circle (cr, CIRCLE_SIZE*0.75, CIRCLE_SIZE*1.75);
cairo_set_source_rgb (cr, 0.0, 1.0, 0.0);
cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
cairo_translate (cr, CIRCLE_SIZE*2.5, CIRCLE_SIZE*0.6);
draw_circles (cr);
cairo_set_source_rgb (cr, 1.0, 0.0, 0.0);
cairo_set_operator (cr, CAIRO_OPERATOR_ADD);
cairo_translate (cr, 0, CIRCLE_SIZE*2);
draw_circles (cr);
cairo_restore (cr);
cairo_translate (cr, 0, CIRCLE_SIZE * 3.5);
surface = surface_create (cr);
cairo_set_source_rgb (cr, 0.0, 1.0, 0.0);
cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
draw_circle (cr, CIRCLE_SIZE*0.5, CIRCLE_SIZE*1.5);
cairo_set_operator (cr, CAIRO_OPERATOR_ADD);
draw_image_circle (cr, surface, CIRCLE_SIZE/4, CIRCLE_SIZE + CIRCLE_SIZE/4);
cairo_set_source_rgb (cr, 0.0, 1.0, 0.0);
cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
cairo_translate (cr, CIRCLE_SIZE*2.5, CIRCLE_SIZE*0.6);
draw_circles (cr);
cairo_set_operator (cr, CAIRO_OPERATOR_ADD);
cairo_translate (cr, -CIRCLE_SIZE/2, CIRCLE_SIZE*1.5);
draw_image_circles (cr, surface);
cairo_surface_destroy (surface);
return CAIRO_TEST_SUCCESS;
}
CAIRO_TEST (finer_grained_fallbacks,
"Test that multiple PS/PDF fallback images in various locations are correct",
"fallbacks",
NULL,
WIDTH, HEIGHT,
NULL, draw)