Add qemu 2.4.0
[kvmfornfv.git] / qemu / pixman / demos / composite-test.c
1 #include <gtk/gtk.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include "pixman.h"
5 #include "gtk-utils.h"
6 #include "parrot.c"
7
8 #define WIDTH   80
9 #define HEIGHT  80
10
11 typedef struct {
12     const char *name;
13     pixman_op_t op;
14 } operator_t;
15
16 static const operator_t operators[] = {
17     { "CLEAR",          PIXMAN_OP_CLEAR },
18     { "SRC",            PIXMAN_OP_SRC },
19     { "DST",            PIXMAN_OP_DST },
20     { "OVER",           PIXMAN_OP_OVER },
21     { "OVER_REVERSE",   PIXMAN_OP_OVER_REVERSE },
22     { "IN",             PIXMAN_OP_IN },
23     { "IN_REVERSE",     PIXMAN_OP_IN_REVERSE },
24     { "OUT",            PIXMAN_OP_OUT },
25     { "OUT_REVERSE",    PIXMAN_OP_OUT_REVERSE },
26     { "ATOP",           PIXMAN_OP_ATOP },
27     { "ATOP_REVERSE",   PIXMAN_OP_ATOP_REVERSE },
28     { "XOR",            PIXMAN_OP_XOR },
29     { "ADD",            PIXMAN_OP_ADD },
30     { "SATURATE",       PIXMAN_OP_SATURATE },
31
32     { "MULTIPLY",       PIXMAN_OP_MULTIPLY },
33     { "SCREEN",         PIXMAN_OP_SCREEN },
34     { "OVERLAY",        PIXMAN_OP_OVERLAY },
35     { "DARKEN",         PIXMAN_OP_DARKEN },
36     { "LIGHTEN",        PIXMAN_OP_LIGHTEN },
37     { "COLOR_DODGE",    PIXMAN_OP_COLOR_DODGE },
38     { "COLOR_BURN",     PIXMAN_OP_COLOR_BURN },
39     { "HARD_LIGHT",     PIXMAN_OP_HARD_LIGHT },
40     { "SOFT_LIGHT",     PIXMAN_OP_SOFT_LIGHT },
41     { "DIFFERENCE",     PIXMAN_OP_DIFFERENCE },
42     { "EXCLUSION",      PIXMAN_OP_EXCLUSION },
43     { "HSL_HUE",        PIXMAN_OP_HSL_HUE },
44     { "HSL_SATURATION", PIXMAN_OP_HSL_SATURATION },
45     { "HSL_COLOR",      PIXMAN_OP_HSL_COLOR },
46     { "HSL_LUMINOSITY", PIXMAN_OP_HSL_LUMINOSITY },
47 };
48
49 static uint32_t
50 reader (const void *src, int size)
51 {
52     switch (size)
53     {
54     case 1:
55         return *(uint8_t *)src;
56     case 2:
57         return *(uint16_t *)src;
58     case 4:
59         return *(uint32_t *)src;
60     default:
61         g_assert_not_reached();
62     }
63 }
64
65 static void
66 writer (void *src, uint32_t value, int size)
67 {
68     switch (size)
69     {
70     case 1:
71         *(uint8_t *)src = value;
72         break;
73
74     case 2:
75         *(uint16_t *)src = value;
76         break;
77
78     case 4:
79         *(uint32_t *)src = value;
80         break;
81
82     default:
83         break;
84     }
85 }
86
87 int
88 main (int argc, char **argv)
89 {
90 #define d2f pixman_double_to_fixed
91
92     GtkWidget *window, *swindow;
93     GtkWidget *table;
94     uint32_t *dest = malloc (WIDTH * HEIGHT * 4);
95     uint32_t *src = malloc (WIDTH * HEIGHT * 4);
96     pixman_image_t *gradient, *parrot;
97     pixman_image_t *dest_img;
98     pixman_point_fixed_t p1 = { -10 << 16, 10 << 16 };
99     pixman_point_fixed_t p2 = { (WIDTH + 10) << 16, (HEIGHT - 10) << 16 };
100     uint16_t alpha = 0xdddd;
101     pixman_gradient_stop_t stops[6] =
102     {
103         { d2f (0.0), { 0xf2f2, 0x8787, 0x7d7d, alpha } },
104         { d2f (0.22), { 0xf3f3, 0xeaea, 0x8383, alpha } },
105         { d2f (0.42), { 0x6b6b, 0xc0c0, 0x7777, alpha } },
106         { d2f (0.57), { 0x4b4b, 0xc9c9, 0xf5f5, alpha } },
107         { d2f (0.75), { 0x6a6a, 0x7f7f, 0xbebe, alpha } },
108         { d2f (1.0), { 0xeded, 0x8282, 0xb0b0, alpha } },
109     };
110
111     int i;
112
113     gtk_init (&argc, &argv);
114
115     window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
116
117     gtk_window_set_default_size (GTK_WINDOW (window), 800, 600);
118
119     g_signal_connect (window, "delete-event",
120                       G_CALLBACK (gtk_main_quit),
121                       NULL);
122     table = gtk_table_new (G_N_ELEMENTS (operators) / 6, 6, TRUE);
123
124     gradient = pixman_image_create_linear_gradient (&p1, &p2, stops, G_N_ELEMENTS (stops));
125     parrot = pixman_image_create_bits (PIXMAN_a8r8g8b8, WIDTH, HEIGHT, (uint32_t *)parrot_bits, WIDTH * 4);
126
127     pixman_image_set_repeat (gradient, PIXMAN_REPEAT_PAD);
128
129     dest_img = pixman_image_create_bits (PIXMAN_a8r8g8b8,
130                                          WIDTH, HEIGHT,
131                                          NULL,
132                                          WIDTH * 4);
133     pixman_image_set_accessors (dest_img, reader, writer);
134
135     for (i = 0; i < G_N_ELEMENTS (operators); ++i)
136     {
137         GtkWidget *image;
138         GdkPixbuf *pixbuf;
139         GtkWidget *vbox;
140         GtkWidget *label;
141
142         vbox = gtk_vbox_new (FALSE, 0);
143
144         label = gtk_label_new (operators[i].name);
145         gtk_box_pack_start (GTK_BOX (vbox), label, FALSE, FALSE, 6);
146         gtk_widget_show (label);
147
148         pixman_image_composite (PIXMAN_OP_SRC, gradient, NULL, dest_img,
149                                 0, 0, 0, 0, 0, 0, WIDTH, HEIGHT);
150         pixman_image_composite (operators[i].op, parrot, NULL, dest_img,
151                                 0, 0, 0, 0, 0, 0, WIDTH, HEIGHT);
152         pixbuf = pixbuf_from_argb32 (pixman_image_get_data (dest_img),
153                                      WIDTH, HEIGHT, WIDTH * 4);
154         image = gtk_image_new_from_pixbuf (pixbuf);
155         gtk_box_pack_start (GTK_BOX (vbox), image, FALSE, FALSE, 0);
156         gtk_widget_show (image);
157
158         gtk_table_attach_defaults (GTK_TABLE (table), vbox,
159                                    i % 6, (i % 6) + 1, i / 6, (i / 6) + 1);
160         gtk_widget_show (vbox);
161
162         g_object_unref (pixbuf);
163     }
164
165     pixman_image_unref (gradient);
166     free (src);
167     pixman_image_unref (dest_img);
168     free (dest);
169
170     swindow = gtk_scrolled_window_new (NULL, NULL);
171     gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (swindow),
172                                     GTK_POLICY_AUTOMATIC,
173                                     GTK_POLICY_AUTOMATIC);
174
175     gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (swindow), table);
176     gtk_widget_show (table);
177
178     gtk_container_add (GTK_CONTAINER (window), swindow);
179     gtk_widget_show (swindow);
180
181     gtk_widget_show (window);
182
183     gtk_main ();
184
185     return 0;
186 }