Add qemu 2.4.0
[kvmfornfv.git] / qemu / pixman / demos / srgb-trap-test.c
1 #include <math.h>
2 #include "pixman.h"
3 #include "gtk-utils.h"
4
5 #define F(x)                                                            \
6     pixman_double_to_fixed (x)
7
8 #define WIDTH 600
9 #define HEIGHT 300
10
11 static uint16_t
12 convert_to_srgb (uint16_t in)
13 {
14     double d = in * (1/65535.0);
15     double a = 0.055;
16
17     if (d < 0.0031308)
18         d = 12.92 * d;
19     else
20         d = (1 + a) * pow (d, 1 / 2.4) - a;
21
22     return (d * 65535.0) + 0.5;
23 }
24
25 static void
26 convert_color (pixman_color_t *dest_srgb, pixman_color_t *linear)
27 {
28     dest_srgb->alpha = convert_to_srgb (linear->alpha);
29     dest_srgb->red = convert_to_srgb (linear->red);
30     dest_srgb->green = convert_to_srgb (linear->green);
31     dest_srgb->blue = convert_to_srgb (linear->blue);
32 }
33
34 int
35 main (int argc, char **argv)
36 {
37     static const pixman_trapezoid_t traps[] =
38     {
39         { F(10.10), F(280.0),
40           { { F(20.0), F(10.10) },
41             { F(5.3), F(280.0) } },
42           { { F(20.3), F(10.10) },
43             { F(5.6), F(280.0) } }
44         },
45         { F(10.10), F(280.0),
46           { { F(40.0), F(10.10) },
47             { F(15.3), F(280.0) } },
48           { { F(41.0), F(10.10) },
49             { F(16.3), F(280.0) } }
50         },
51         { F(10.10), F(280.0),
52           { { F(120.0), F(10.10) },
53             { F(5.3), F(280.0) } },
54           { { F(128.3), F(10.10) },
55             { F(6.6), F(280.0) } }
56         },
57         { F(10.10), F(280.0),
58           { { F(60.0), F(10.10) },
59             { F(25.3), F(280.0) } },
60           { { F(61.0), F(10.10) },
61             { F(26.3), F(280.0) } }
62         },
63         { F(10.10), F(280.0),
64           { { F(90.0), F(10.10) },
65             { F(55.3), F(280.0) } },
66           { { F(93.0), F(10.10) },
67             { F(58.3), F(280.0) } }
68         },
69         { F(130.10), F(150.0),
70           { { F(100.0), F(130.10) },
71             { F(250.3), F(150.0) } },
72           { { F(110.0), F(130.10) },
73             { F(260.3), F(150.0) } }
74         },
75         { F(170.10), F(240.0),
76           { { F(100.0), F(170.10) },
77             { F(120.3), F(240.0) } },
78           { { F(250.0), F(170.10) },
79             { F(250.3), F(240.0) } }
80         },
81     };
82
83     pixman_image_t *src, *dest_srgb, *dest_linear;
84     pixman_color_t bg = { 0x0000, 0x0000, 0x0000, 0xffff };
85     pixman_color_t fg = { 0xffff, 0xffff, 0xffff, 0xffff };
86     pixman_color_t fg_srgb;
87     uint32_t *d;
88
89     d = malloc (WIDTH * HEIGHT * 4);
90     
91     dest_srgb = pixman_image_create_bits (
92         PIXMAN_a8r8g8b8_sRGB, WIDTH, HEIGHT, d, WIDTH * 4);
93     dest_linear = pixman_image_create_bits (
94         PIXMAN_a8r8g8b8, WIDTH, HEIGHT, d, WIDTH * 4);
95     
96     src = pixman_image_create_solid_fill (&bg);
97     pixman_image_composite32 (PIXMAN_OP_SRC,
98                               src, NULL, dest_srgb,
99                               0, 0, 0, 0, 0, 0, WIDTH, HEIGHT);
100     
101     src = pixman_image_create_solid_fill (&fg);
102     
103     pixman_composite_trapezoids (PIXMAN_OP_OVER,
104                                  src, dest_srgb, PIXMAN_a8,
105                                  0, 0, 10, 10, G_N_ELEMENTS (traps), traps);
106
107     convert_color (&fg_srgb, &fg);
108     src = pixman_image_create_solid_fill (&fg_srgb);
109     
110     pixman_composite_trapezoids (PIXMAN_OP_OVER,
111                                  src, dest_linear, PIXMAN_a8,
112                                  0, 0, 310, 10, G_N_ELEMENTS (traps), traps);
113
114     show_image (dest_linear);
115     pixman_image_unref(dest_linear);
116     free(d);
117     
118     return 0;
119 }