From e1b8969e78eecf9abaaf2b317c10fddf64b02799 Mon Sep 17 00:00:00 2001 From: =?utf8?q?S=C3=B8ren=20Sandmann=20Pedersen?= Date: Wed, 12 Oct 2011 04:49:27 -0400 Subject: [PATCH] demos: Add checkerboard demo This is a simple demo that displays a checkboard with a projective transformation. --- demos/Makefile.am | 5 +++- demos/checkerboard.c | 71 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+), 1 deletion(-) create mode 100644 demos/checkerboard.c diff --git a/demos/Makefile.am b/demos/Makefile.am index 070c2d7..6049090 100644 --- a/demos/Makefile.am +++ b/demos/Makefile.am @@ -18,7 +18,9 @@ DEMOS = \ screen-test \ convolution-test \ trap-test \ - tri-test + tri-test \ + quad2quad \ + checkerboard gradient_test_SOURCES = gradient-test.c $(GTK_UTILS) alpha_test_SOURCES = alpha-test.c $(GTK_UTILS) @@ -30,6 +32,7 @@ screen_test_SOURCES = screen-test.c $(GTK_UTILS) convolution_test_SOURCES = convolution-test.c $(GTK_UTILS) radial_test_SOURCES = radial-test.c ../test/utils.c ../test/utils.h $(GTK_UTILS) tri_test_SOURCES = tri-test.c ../test/utils.c ../test/utils.h $(GTK_UTILS) +checkerboard_SOURCES = checkerboard.c $(GTK_UTILS) noinst_PROGRAMS = $(DEMOS) diff --git a/demos/checkerboard.c b/demos/checkerboard.c new file mode 100644 index 0000000..449fedb --- /dev/null +++ b/demos/checkerboard.c @@ -0,0 +1,71 @@ +#include +#include +#include "pixman.h" +#include "gtk-utils.h" + +int +main (int argc, char **argv) +{ +#define WIDTH 400 +#define HEIGHT 400 +#define TILE_SIZE 25 + + pixman_image_t *checkerboard; + pixman_image_t *destination; +#define D2F(d) (pixman_double_to_fixed(d)) + pixman_transform_t trans = { { + { D2F (-1.96830), D2F (-1.82250), D2F (512.12250)}, + { D2F (0.00000), D2F (-7.29000), D2F (1458.00000)}, + { D2F (0.00000), D2F (-0.00911), D2F (0.59231)}, + }}; + int i, j; + + checkerboard = pixman_image_create_bits (PIXMAN_a8r8g8b8, + WIDTH, HEIGHT, + NULL, 0); + + destination = pixman_image_create_bits (PIXMAN_a8r8g8b8, + WIDTH, HEIGHT, + NULL, 0); + + for (i = 0; i < HEIGHT / TILE_SIZE; ++i) + { + for (j = 0; j < WIDTH / TILE_SIZE; ++j) + { + double u = (double)(j + 1) / (WIDTH / TILE_SIZE); + double v = (double)(i + 1) / (HEIGHT / TILE_SIZE); + pixman_color_t black = { 0, 0, 0, 0xffff }; + pixman_color_t white = { + v * 0xffff, + u * 0xffff, + (1 - (double)u) * 0xffff, + 0xffff }; + pixman_color_t *c; + pixman_image_t *fill; + + if ((j & 1) != (i & 1)) + c = &black; + else + c = &white; + + fill = pixman_image_create_solid_fill (c); + + pixman_image_composite (PIXMAN_OP_SRC, fill, NULL, checkerboard, + 0, 0, 0, 0, j * TILE_SIZE, i * TILE_SIZE, + TILE_SIZE, TILE_SIZE); + } + } + + pixman_image_set_transform (checkerboard, &trans); + pixman_image_set_filter (checkerboard, PIXMAN_FILTER_BEST, NULL, 0); + pixman_image_set_repeat (checkerboard, PIXMAN_REPEAT_NONE); + + pixman_image_composite (PIXMAN_OP_SRC, + checkerboard, NULL, destination, + 0, 0, 0, 0, 0, 0, + WIDTH, HEIGHT); + + show_image (destination); + + return 0; +} -- 2.7.4