[Pixman] [PATCH 2/2] demos: Add srgb_trap_test.c

Søren Sandmann sandmann at cs.au.dk
Tue Jul 31 13:19:52 PDT 2012


From: Søren Sandmann Pedersen <ssp at redhat.com>

This demo program composites a bunch of trapezoids side by side with
and without gamma aware compositing.
---
 demos/Makefile.am      |    2 +
 demos/srgb-trap-test.c |  119 ++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 121 insertions(+), 0 deletions(-)
 create mode 100644 demos/srgb-trap-test.c

diff --git a/demos/Makefile.am b/demos/Makefile.am
index d8fb0da..f324f5f 100644
--- a/demos/Makefile.am
+++ b/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/demos/srgb-trap-test.c b/demos/srgb-trap-test.c
new file mode 100644
index 0000000..d5ae16a
--- /dev/null
+++ b/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;
+}
-- 
1.7.4



More information about the Pixman mailing list