diff options
Diffstat (limited to 'pixman/demos')
-rw-r--r-- | pixman/demos/Makefile.am | 2 | ||||
-rw-r--r-- | pixman/demos/composite-test.c | 2 | ||||
-rw-r--r-- | pixman/demos/gtk-utils.c | 51 | ||||
-rw-r--r-- | pixman/demos/gtk-utils.h | 1 | ||||
-rw-r--r-- | pixman/demos/srgb-test.c | 9 | ||||
-rw-r--r-- | pixman/demos/srgb-trap-test.c | 119 |
6 files changed, 158 insertions, 26 deletions
diff --git a/pixman/demos/Makefile.am b/pixman/demos/Makefile.am index d8fb0dab2..f324f5f5b 100644 --- a/pixman/demos/Makefile.am +++ b/pixman/demos/Makefile.am @@ -21,6 +21,7 @@ DEMOS = \ tri-test \ quad2quad \ checkerboard \ + srgb-trap-test \ srgb-test EXTRA_DIST = parrot.c parrot.jpg @@ -37,6 +38,7 @@ radial_test_SOURCES = radial-test.c $(GTK_UTILS) tri_test_SOURCES = tri-test.c $(GTK_UTILS) checkerboard_SOURCES = checkerboard.c $(GTK_UTILS) srgb_test_SOURCES = srgb-test.c $(GTK_UTILS) +srgb_trap_test_SOURCES = srgb-trap-test.c $(GTK_UTILS) noinst_PROGRAMS = $(DEMOS) diff --git a/pixman/demos/composite-test.c b/pixman/demos/composite-test.c index dc24f8ef1..8213e2f9d 100644 --- a/pixman/demos/composite-test.c +++ b/pixman/demos/composite-test.c @@ -149,7 +149,7 @@ main (int argc, char **argv) 0, 0, 0, 0, 0, 0, WIDTH, HEIGHT); pixman_image_composite (operators[i].op, parrot, NULL, dest_img, 0, 0, 0, 0, 0, 0, WIDTH, HEIGHT); - pixbuf = pixbuf_from_argb32 (pixman_image_get_data (dest_img), TRUE, + pixbuf = pixbuf_from_argb32 (pixman_image_get_data (dest_img), WIDTH, HEIGHT, WIDTH * 4); image = gtk_image_new_from_pixbuf (pixbuf); gtk_box_pack_start (GTK_BOX (vbox), image, FALSE, FALSE, 0); diff --git a/pixman/demos/gtk-utils.c b/pixman/demos/gtk-utils.c index 1ff89ebd3..8291a1ed2 100644 --- a/pixman/demos/gtk-utils.c +++ b/pixman/demos/gtk-utils.c @@ -5,7 +5,6 @@ GdkPixbuf * pixbuf_from_argb32 (uint32_t *bits, - gboolean has_alpha, int width, int height, int stride) @@ -47,12 +46,12 @@ show_image (pixman_image_t *image) { GtkWidget *window; GdkPixbuf *pixbuf; - int width, height, stride; + int width, height; int argc; char **argv; char *arg0 = g_strdup ("pixman-test-program"); - gboolean has_alpha; pixman_format_code_t format; + pixman_image_t *copy; argc = 1; argv = (char **)&arg0; @@ -62,21 +61,43 @@ show_image (pixman_image_t *image) window = gtk_window_new (GTK_WINDOW_TOPLEVEL); width = pixman_image_get_width (image); height = pixman_image_get_height (image); - stride = pixman_image_get_stride (image); gtk_window_set_default_size (GTK_WINDOW (window), width, height); - + format = pixman_image_get_format (image); - - if (format == PIXMAN_a8r8g8b8) - has_alpha = TRUE; - else if (format == PIXMAN_x8r8g8b8) - has_alpha = FALSE; - else - g_error ("Can't deal with this format: %x\n", format); - - pixbuf = pixbuf_from_argb32 (pixman_image_get_data (image), has_alpha, - width, height, stride); + + /* Three cases: + * + * - image is a8r8g8b8_sRGB: we will display without modification + * under the assumption that the monitor is sRGB + * + * - image is a8r8g8b8: we will display without modification + * under the assumption that whoever created the image + * probably did it wrong by using sRGB inputs + * + * - other: we will convert to a8r8g8b8 under the assumption that + * whoever created the image probably did it wrong. + */ + switch (format) + { + case PIXMAN_a8r8g8b8_sRGB: + case PIXMAN_a8r8g8b8: + copy = pixman_image_ref (image); + break; + + default: + copy = pixman_image_create_bits (PIXMAN_a8r8g8b8, + width, height, NULL, -1); + pixman_image_composite32 (PIXMAN_OP_SRC, + image, NULL, copy, + 0, 0, 0, 0, 0, 0, + width, height); + break; + } + + pixbuf = pixbuf_from_argb32 (pixman_image_get_data (copy), + width, height, + pixman_image_get_stride (copy)); g_signal_connect (window, "expose_event", G_CALLBACK (on_expose), pixbuf); g_signal_connect (window, "delete_event", G_CALLBACK (gtk_main_quit), NULL); diff --git a/pixman/demos/gtk-utils.h b/pixman/demos/gtk-utils.h index 2cb13bcf0..55cb7018a 100644 --- a/pixman/demos/gtk-utils.h +++ b/pixman/demos/gtk-utils.h @@ -7,7 +7,6 @@ void show_image (pixman_image_t *image); GdkPixbuf *pixbuf_from_argb32 (uint32_t *bits, - gboolean has_alpha, int width, int height, int stride); diff --git a/pixman/demos/srgb-test.c b/pixman/demos/srgb-test.c index bc073491e..681d52181 100644 --- a/pixman/demos/srgb-test.c +++ b/pixman/demos/srgb-test.c @@ -79,15 +79,6 @@ main (int argc, char **argv) pixman_image_unref (src1_img); free (src1); - pixman_image_unref (dest_img); - - /* Now that the picture has been correctly constructed, - * we hand it over to our support library as argb which it - * knows how to handle (it doesn't understand _sRGB format). */ - dest_img = pixman_image_create_bits (PIXMAN_a8r8g8b8, - WIDTH, HEIGHT, - dest, - WIDTH * 4); show_image (dest_img); pixman_image_unref (dest_img); free (dest); diff --git a/pixman/demos/srgb-trap-test.c b/pixman/demos/srgb-trap-test.c new file mode 100644 index 000000000..d5ae16a06 --- /dev/null +++ b/pixman/demos/srgb-trap-test.c @@ -0,0 +1,119 @@ +#include <math.h> +#include "pixman.h" +#include "gtk-utils.h" + +#define F(x) \ + pixman_double_to_fixed (x) + +#define WIDTH 600 +#define HEIGHT 300 + +static uint16_t +convert_to_srgb (uint16_t in) +{ + double d = in * (1/65535.0); + double a = 0.055; + + if (d < 0.0031308) + d = 12.92 * d; + else + d = (1 + a) * pow (d, 1 / 2.4) - a; + + return (d * 65535.0) + 0.5; +} + +static void +convert_color (pixman_color_t *dest_srgb, pixman_color_t *linear) +{ + dest_srgb->alpha = convert_to_srgb (linear->alpha); + dest_srgb->red = convert_to_srgb (linear->red); + dest_srgb->green = convert_to_srgb (linear->green); + dest_srgb->blue = convert_to_srgb (linear->blue); +} + +int +main (int argc, char **argv) +{ + static const pixman_trapezoid_t traps[] = + { + { F(10.10), F(280.0), + { { F(20.0), F(10.10) }, + { F(5.3), F(280.0) } }, + { { F(20.3), F(10.10) }, + { F(5.6), F(280.0) } } + }, + { F(10.10), F(280.0), + { { F(40.0), F(10.10) }, + { F(15.3), F(280.0) } }, + { { F(41.0), F(10.10) }, + { F(16.3), F(280.0) } } + }, + { F(10.10), F(280.0), + { { F(120.0), F(10.10) }, + { F(5.3), F(280.0) } }, + { { F(128.3), F(10.10) }, + { F(6.6), F(280.0) } } + }, + { F(10.10), F(280.0), + { { F(60.0), F(10.10) }, + { F(25.3), F(280.0) } }, + { { F(61.0), F(10.10) }, + { F(26.3), F(280.0) } } + }, + { F(10.10), F(280.0), + { { F(90.0), F(10.10) }, + { F(55.3), F(280.0) } }, + { { F(93.0), F(10.10) }, + { F(58.3), F(280.0) } } + }, + { F(130.10), F(150.0), + { { F(100.0), F(130.10) }, + { F(250.3), F(150.0) } }, + { { F(110.0), F(130.10) }, + { F(260.3), F(150.0) } } + }, + { F(170.10), F(240.0), + { { F(100.0), F(170.10) }, + { F(120.3), F(240.0) } }, + { { F(250.0), F(170.10) }, + { F(250.3), F(240.0) } } + }, + }; + + pixman_image_t *src, *dest_srgb, *dest_linear; + pixman_color_t bg = { 0x0000, 0x0000, 0x0000, 0xffff }; + pixman_color_t fg = { 0xffff, 0xffff, 0xffff, 0xffff }; + pixman_color_t fg_srgb; + uint32_t *d; + + d = malloc (WIDTH * HEIGHT * 4); + + dest_srgb = pixman_image_create_bits ( + PIXMAN_a8r8g8b8_sRGB, WIDTH, HEIGHT, d, WIDTH * 4); + dest_linear = pixman_image_create_bits ( + PIXMAN_a8r8g8b8, WIDTH, HEIGHT, d, WIDTH * 4); + + src = pixman_image_create_solid_fill (&bg); + pixman_image_composite32 (PIXMAN_OP_SRC, + src, NULL, dest_srgb, + 0, 0, 0, 0, 0, 0, WIDTH, HEIGHT); + + src = pixman_image_create_solid_fill (&fg); + + pixman_composite_trapezoids (PIXMAN_OP_OVER, + src, dest_srgb, PIXMAN_a8, + 0, 0, 10, 10, G_N_ELEMENTS (traps), traps); + + convert_color (&fg_srgb, &fg); + src = pixman_image_create_solid_fill (&fg_srgb); + + pixman_composite_trapezoids (PIXMAN_OP_OVER, + src, dest_linear, PIXMAN_a8, + 0, 0, 310, 10, G_N_ELEMENTS (traps), traps); + + show_image (dest_linear); + pixman_image_unref(dest_linear); + free(d); + + return 0; +} |