summaryrefslogtreecommitdiffstats
path: root/qemu/pixman/demos/srgb-trap-test.c
blob: d5ae16a0625d1eda18f033d45bb37a39bafaf184 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
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;
}