check-formats.c revision f4f78bb6
1f4f78bb6Smrg#include <ctype.h>
2f4f78bb6Smrg#include "utils.h"
3f4f78bb6Smrg
4f4f78bb6Smrgstatic int
5f4f78bb6Smrgcheck_op (pixman_op_t          op,
6f4f78bb6Smrg          pixman_format_code_t src_format,
7f4f78bb6Smrg          pixman_format_code_t dest_format)
8f4f78bb6Smrg{
9f4f78bb6Smrg    uint32_t src_alpha_mask, src_green_mask;
10f4f78bb6Smrg    uint32_t dest_alpha_mask, dest_green_mask;
11f4f78bb6Smrg    pixel_checker_t src_checker, dest_checker;
12f4f78bb6Smrg    pixman_image_t *si, *di;
13f4f78bb6Smrg    uint32_t sa, sg, da, dg;
14f4f78bb6Smrg    uint32_t s, d;
15f4f78bb6Smrg    int retval = 0;
16f4f78bb6Smrg
17f4f78bb6Smrg    pixel_checker_init (&src_checker, src_format);
18f4f78bb6Smrg    pixel_checker_init (&dest_checker, dest_format);
19f4f78bb6Smrg
20f4f78bb6Smrg    pixel_checker_get_masks (
21f4f78bb6Smrg        &src_checker, &src_alpha_mask, NULL, &src_green_mask, NULL);
22f4f78bb6Smrg    pixel_checker_get_masks (
23f4f78bb6Smrg        &dest_checker, &dest_alpha_mask, NULL, &dest_green_mask, NULL);
24f4f78bb6Smrg
25f4f78bb6Smrg    /* printf ("masks: %x %x %x %x\n", */
26f4f78bb6Smrg    /* 	    src_alpha_mask, src_green_mask, */
27f4f78bb6Smrg    /* 	    dest_alpha_mask, dest_green_mask); */
28f4f78bb6Smrg
29f4f78bb6Smrg    si = pixman_image_create_bits (src_format, 1, 1, &s, 4);
30f4f78bb6Smrg    di = pixman_image_create_bits (dest_format, 1, 1, &d, 4);
31f4f78bb6Smrg
32f4f78bb6Smrg    sa = 0;
33f4f78bb6Smrg    do
34f4f78bb6Smrg    {
35f4f78bb6Smrg        sg = 0;
36f4f78bb6Smrg        do
37f4f78bb6Smrg        {
38f4f78bb6Smrg            da = 0;
39f4f78bb6Smrg            do
40f4f78bb6Smrg            {
41f4f78bb6Smrg                dg = 0;
42f4f78bb6Smrg                do
43f4f78bb6Smrg                {
44f4f78bb6Smrg                    color_t src_color, dest_color, result_color;
45f4f78bb6Smrg                    uint32_t orig_d;
46f4f78bb6Smrg
47f4f78bb6Smrg                    s = sa | sg;
48f4f78bb6Smrg                    d = da | dg;
49f4f78bb6Smrg
50f4f78bb6Smrg                    orig_d = d;
51f4f78bb6Smrg
52f4f78bb6Smrg		    pixel_checker_convert_pixel_to_color (&src_checker, s, &src_color);
53f4f78bb6Smrg		    pixel_checker_convert_pixel_to_color (&dest_checker, d, &dest_color);
54f4f78bb6Smrg
55f4f78bb6Smrg		    do_composite (op, &src_color, NULL, &dest_color, &result_color, FALSE);
56f4f78bb6Smrg
57f4f78bb6Smrg
58f4f78bb6Smrg		    if (!is_little_endian())
59f4f78bb6Smrg                    {
60f4f78bb6Smrg			s <<= 32 - PIXMAN_FORMAT_BPP (src_format);
61f4f78bb6Smrg			d <<= 32 - PIXMAN_FORMAT_BPP (dest_format);
62f4f78bb6Smrg                    }
63f4f78bb6Smrg
64f4f78bb6Smrg		    pixman_image_composite32 (op, si, NULL, di,
65f4f78bb6Smrg					      0, 0, 0, 0, 0, 0, 1, 1);
66f4f78bb6Smrg
67f4f78bb6Smrg		    if (!is_little_endian())
68f4f78bb6Smrg                        d >>= (32 - PIXMAN_FORMAT_BPP (dest_format));
69f4f78bb6Smrg
70f4f78bb6Smrg                    if (!pixel_checker_check (&dest_checker, d, &result_color))
71f4f78bb6Smrg                    {
72f4f78bb6Smrg                        printf ("---- test failed ----\n");
73f4f78bb6Smrg                        printf ("operator: %-32s\n", operator_name (op));
74f4f78bb6Smrg                        printf ("source:   %-12s pixel: %08x\n", format_name (src_format), s);
75f4f78bb6Smrg                        printf ("dest:     %-12s pixel: %08x\n", format_name (dest_format), orig_d);
76f4f78bb6Smrg                        printf ("got:      %-12s pixel: %08x\n", format_name (dest_format), d);
77f4f78bb6Smrg
78f4f78bb6Smrg                        retval = 1;
79f4f78bb6Smrg                    }
80f4f78bb6Smrg
81f4f78bb6Smrg                    dg -= dest_green_mask;
82f4f78bb6Smrg                    dg &= dest_green_mask;
83f4f78bb6Smrg                }
84f4f78bb6Smrg                while (dg != 0);
85f4f78bb6Smrg
86f4f78bb6Smrg                da -= dest_alpha_mask;
87f4f78bb6Smrg                da &= dest_alpha_mask;
88f4f78bb6Smrg            }
89f4f78bb6Smrg            while (da != 0);
90f4f78bb6Smrg
91f4f78bb6Smrg            sg -= src_green_mask;
92f4f78bb6Smrg            sg &= src_green_mask;
93f4f78bb6Smrg        }
94f4f78bb6Smrg        while (sg != 0);
95f4f78bb6Smrg
96f4f78bb6Smrg        sa -= src_alpha_mask;
97f4f78bb6Smrg        sa &= src_alpha_mask;
98f4f78bb6Smrg    }
99f4f78bb6Smrg    while (sa != 0);
100f4f78bb6Smrg
101f4f78bb6Smrg    pixman_image_unref (si);
102f4f78bb6Smrg    pixman_image_unref (di);
103f4f78bb6Smrg
104f4f78bb6Smrg    return retval;
105f4f78bb6Smrg}
106f4f78bb6Smrg
107f4f78bb6Smrgstatic const pixman_op_t op_list[] =
108f4f78bb6Smrg{
109f4f78bb6Smrg    PIXMAN_OP_CLEAR,
110f4f78bb6Smrg    PIXMAN_OP_SRC,
111f4f78bb6Smrg    PIXMAN_OP_DST,
112f4f78bb6Smrg    PIXMAN_OP_OVER,
113f4f78bb6Smrg    PIXMAN_OP_OVER_REVERSE,
114f4f78bb6Smrg    PIXMAN_OP_IN,
115f4f78bb6Smrg    PIXMAN_OP_IN_REVERSE,
116f4f78bb6Smrg    PIXMAN_OP_OUT,
117f4f78bb6Smrg    PIXMAN_OP_OUT_REVERSE,
118f4f78bb6Smrg    PIXMAN_OP_ATOP,
119f4f78bb6Smrg    PIXMAN_OP_ATOP_REVERSE,
120f4f78bb6Smrg    PIXMAN_OP_XOR,
121f4f78bb6Smrg    PIXMAN_OP_ADD,
122f4f78bb6Smrg    PIXMAN_OP_SATURATE,
123f4f78bb6Smrg
124f4f78bb6Smrg    PIXMAN_OP_DISJOINT_CLEAR,
125f4f78bb6Smrg    PIXMAN_OP_DISJOINT_SRC,
126f4f78bb6Smrg    PIXMAN_OP_DISJOINT_DST,
127f4f78bb6Smrg    PIXMAN_OP_DISJOINT_OVER,
128f4f78bb6Smrg    PIXMAN_OP_DISJOINT_OVER_REVERSE,
129f4f78bb6Smrg    PIXMAN_OP_DISJOINT_IN,
130f4f78bb6Smrg    PIXMAN_OP_DISJOINT_IN_REVERSE,
131f4f78bb6Smrg    PIXMAN_OP_DISJOINT_OUT,
132f4f78bb6Smrg    PIXMAN_OP_DISJOINT_OUT_REVERSE,
133f4f78bb6Smrg    PIXMAN_OP_DISJOINT_ATOP,
134f4f78bb6Smrg    PIXMAN_OP_DISJOINT_ATOP_REVERSE,
135f4f78bb6Smrg    PIXMAN_OP_DISJOINT_XOR,
136f4f78bb6Smrg
137f4f78bb6Smrg    PIXMAN_OP_CONJOINT_CLEAR,
138f4f78bb6Smrg    PIXMAN_OP_CONJOINT_SRC,
139f4f78bb6Smrg    PIXMAN_OP_CONJOINT_DST,
140f4f78bb6Smrg    PIXMAN_OP_CONJOINT_OVER,
141f4f78bb6Smrg    PIXMAN_OP_CONJOINT_OVER_REVERSE,
142f4f78bb6Smrg    PIXMAN_OP_CONJOINT_IN,
143f4f78bb6Smrg    PIXMAN_OP_CONJOINT_IN_REVERSE,
144f4f78bb6Smrg    PIXMAN_OP_CONJOINT_OUT,
145f4f78bb6Smrg    PIXMAN_OP_CONJOINT_OUT_REVERSE,
146f4f78bb6Smrg    PIXMAN_OP_CONJOINT_ATOP,
147f4f78bb6Smrg    PIXMAN_OP_CONJOINT_ATOP_REVERSE,
148f4f78bb6Smrg    PIXMAN_OP_CONJOINT_XOR,
149f4f78bb6Smrg};
150f4f78bb6Smrg
151f4f78bb6Smrgstatic const pixman_format_code_t format_list[] =
152f4f78bb6Smrg{
153f4f78bb6Smrg    PIXMAN_a8r8g8b8,
154f4f78bb6Smrg    PIXMAN_x8r8g8b8,
155f4f78bb6Smrg    PIXMAN_a8b8g8r8,
156f4f78bb6Smrg    PIXMAN_x8b8g8r8,
157f4f78bb6Smrg    PIXMAN_b8g8r8a8,
158f4f78bb6Smrg    PIXMAN_b8g8r8x8,
159f4f78bb6Smrg    PIXMAN_r8g8b8a8,
160f4f78bb6Smrg    PIXMAN_r8g8b8x8,
161f4f78bb6Smrg    PIXMAN_x14r6g6b6,
162f4f78bb6Smrg    PIXMAN_x2r10g10b10,
163f4f78bb6Smrg    PIXMAN_a2r10g10b10,
164f4f78bb6Smrg    PIXMAN_x2b10g10r10,
165f4f78bb6Smrg    PIXMAN_a2b10g10r10,
166f4f78bb6Smrg    PIXMAN_a8r8g8b8_sRGB,
167f4f78bb6Smrg    PIXMAN_r8g8b8,
168f4f78bb6Smrg    PIXMAN_b8g8r8,
169f4f78bb6Smrg    PIXMAN_r5g6b5,
170f4f78bb6Smrg    PIXMAN_b5g6r5,
171f4f78bb6Smrg    PIXMAN_a1r5g5b5,
172f4f78bb6Smrg    PIXMAN_x1r5g5b5,
173f4f78bb6Smrg    PIXMAN_a1b5g5r5,
174f4f78bb6Smrg    PIXMAN_x1b5g5r5,
175f4f78bb6Smrg    PIXMAN_a4r4g4b4,
176f4f78bb6Smrg    PIXMAN_x4r4g4b4,
177f4f78bb6Smrg    PIXMAN_a4b4g4r4,
178f4f78bb6Smrg    PIXMAN_x4b4g4r4,
179f4f78bb6Smrg    PIXMAN_a8,
180f4f78bb6Smrg    PIXMAN_r3g3b2,
181f4f78bb6Smrg    PIXMAN_b2g3r3,
182f4f78bb6Smrg    PIXMAN_a2r2g2b2,
183f4f78bb6Smrg    PIXMAN_a2b2g2r2,
184f4f78bb6Smrg    PIXMAN_x4a4,
185f4f78bb6Smrg    PIXMAN_a4,
186f4f78bb6Smrg    PIXMAN_r1g2b1,
187f4f78bb6Smrg    PIXMAN_b1g2r1,
188f4f78bb6Smrg    PIXMAN_a1r1g1b1,
189f4f78bb6Smrg    PIXMAN_a1b1g1r1,
190f4f78bb6Smrg    PIXMAN_a1,
191f4f78bb6Smrg};
192f4f78bb6Smrg
193f4f78bb6Smrgstatic pixman_format_code_t
194f4f78bb6Smrgformat_from_string (const char *s)
195f4f78bb6Smrg{
196f4f78bb6Smrg    int i;
197f4f78bb6Smrg
198f4f78bb6Smrg    for (i = 0; i < ARRAY_LENGTH (format_list); ++i)
199f4f78bb6Smrg    {
200f4f78bb6Smrg        if (strcasecmp (format_name (format_list[i]), s) == 0)
201f4f78bb6Smrg            return format_list[i];
202f4f78bb6Smrg    }
203f4f78bb6Smrg
204f4f78bb6Smrg    return PIXMAN_null;
205f4f78bb6Smrg}
206f4f78bb6Smrg
207f4f78bb6Smrgstatic void
208f4f78bb6Smrgemit (const char *s, int *n_chars)
209f4f78bb6Smrg{
210f4f78bb6Smrg    *n_chars += printf ("%s,", s);
211f4f78bb6Smrg    if (*n_chars > 60)
212f4f78bb6Smrg    {
213f4f78bb6Smrg        printf ("\n    ");
214f4f78bb6Smrg        *n_chars = 0;
215f4f78bb6Smrg    }
216f4f78bb6Smrg    else
217f4f78bb6Smrg    {
218f4f78bb6Smrg        printf (" ");
219f4f78bb6Smrg        (*n_chars)++;
220f4f78bb6Smrg    }
221f4f78bb6Smrg}
222f4f78bb6Smrg
223f4f78bb6Smrgstatic void
224f4f78bb6Smrglist_formats (void)
225f4f78bb6Smrg{
226f4f78bb6Smrg    int n_chars;
227f4f78bb6Smrg    int i;
228f4f78bb6Smrg
229f4f78bb6Smrg    printf ("Formats:\n    ");
230f4f78bb6Smrg
231f4f78bb6Smrg    n_chars = 0;
232f4f78bb6Smrg    for (i = 0; i < ARRAY_LENGTH (format_list); ++i)
233f4f78bb6Smrg        emit (format_name (format_list[i]), &n_chars);
234f4f78bb6Smrg
235f4f78bb6Smrg    printf ("\n\n");
236f4f78bb6Smrg}
237f4f78bb6Smrg
238f4f78bb6Smrgstatic void
239f4f78bb6Smrglist_operators (void)
240f4f78bb6Smrg{
241f4f78bb6Smrg    char short_name [128] = { 0 };
242f4f78bb6Smrg    int i, n_chars;
243f4f78bb6Smrg
244f4f78bb6Smrg    printf ("Operators:\n    ");
245f4f78bb6Smrg
246f4f78bb6Smrg    n_chars = 0;
247f4f78bb6Smrg    for (i = 0; i < ARRAY_LENGTH (op_list); ++i)
248f4f78bb6Smrg    {
249f4f78bb6Smrg        pixman_op_t op = op_list[i];
250f4f78bb6Smrg        int j;
251f4f78bb6Smrg
252f4f78bb6Smrg        snprintf (short_name, sizeof (short_name) - 1, "%s",
253f4f78bb6Smrg                  operator_name (op) + strlen ("PIXMAN_OP_"));
254f4f78bb6Smrg
255f4f78bb6Smrg        for (j = 0; short_name[j] != '\0'; ++j)
256f4f78bb6Smrg            short_name[j] = tolower (short_name[j]);
257f4f78bb6Smrg
258f4f78bb6Smrg        emit (short_name, &n_chars);
259f4f78bb6Smrg    }
260f4f78bb6Smrg
261f4f78bb6Smrg    printf ("\n\n");
262f4f78bb6Smrg}
263f4f78bb6Smrg
264f4f78bb6Smrgstatic pixman_op_t
265f4f78bb6Smrgoperator_from_string (const char *s)
266f4f78bb6Smrg{
267f4f78bb6Smrg    char full_name[128] = { 0 };
268f4f78bb6Smrg    int i;
269f4f78bb6Smrg
270f4f78bb6Smrg    snprintf (full_name, (sizeof full_name) - 1, "PIXMAN_OP_%s", s);
271f4f78bb6Smrg
272f4f78bb6Smrg    for (i = 0; i < ARRAY_LENGTH (op_list); ++i)
273f4f78bb6Smrg    {
274f4f78bb6Smrg        pixman_op_t op = op_list[i];
275f4f78bb6Smrg
276f4f78bb6Smrg        if (strcasecmp (operator_name (op), full_name) == 0)
277f4f78bb6Smrg            return op;
278f4f78bb6Smrg    }
279f4f78bb6Smrg
280f4f78bb6Smrg    return PIXMAN_OP_NONE;
281f4f78bb6Smrg}
282f4f78bb6Smrg
283f4f78bb6Smrgint
284f4f78bb6Smrgmain (int argc, char **argv)
285f4f78bb6Smrg{
286f4f78bb6Smrg    enum { OPTION_OP, OPTION_SRC, OPTION_DEST, LAST_OPTION } option;
287f4f78bb6Smrg    pixman_format_code_t src_fmt, dest_fmt;
288f4f78bb6Smrg    pixman_op_t op;
289f4f78bb6Smrg
290f4f78bb6Smrg    op = PIXMAN_OP_NONE;
291f4f78bb6Smrg    src_fmt = PIXMAN_null;
292f4f78bb6Smrg    dest_fmt = PIXMAN_null;
293f4f78bb6Smrg
294f4f78bb6Smrg    argc--;
295f4f78bb6Smrg    argv++;
296f4f78bb6Smrg
297f4f78bb6Smrg    for (option = OPTION_OP; option < LAST_OPTION; ++option)
298f4f78bb6Smrg    {
299f4f78bb6Smrg        char *arg = NULL;
300f4f78bb6Smrg
301f4f78bb6Smrg        if (argc)
302f4f78bb6Smrg        {
303f4f78bb6Smrg            argc--;
304f4f78bb6Smrg            arg = *argv++;
305f4f78bb6Smrg        }
306f4f78bb6Smrg
307f4f78bb6Smrg        switch (option)
308f4f78bb6Smrg        {
309f4f78bb6Smrg        case OPTION_OP:
310f4f78bb6Smrg            if (!arg)
311f4f78bb6Smrg                printf ("  - missing operator\n");
312f4f78bb6Smrg            else if ((op = operator_from_string (arg)) == PIXMAN_OP_NONE)
313f4f78bb6Smrg                printf ("  - unknown operator %s\n", arg);
314f4f78bb6Smrg            break;
315f4f78bb6Smrg
316f4f78bb6Smrg        case OPTION_SRC:
317f4f78bb6Smrg            if (!arg)
318f4f78bb6Smrg                printf ("  - missing source format\n");
319f4f78bb6Smrg            else if ((src_fmt = format_from_string (arg)) == PIXMAN_null)
320f4f78bb6Smrg                printf ("  - unknown source format %s\n", arg);
321f4f78bb6Smrg            break;
322f4f78bb6Smrg
323f4f78bb6Smrg        case OPTION_DEST:
324f4f78bb6Smrg            if (!arg)
325f4f78bb6Smrg                printf ("  - missing destination format\n");
326f4f78bb6Smrg            else if ((dest_fmt = format_from_string (arg)) == PIXMAN_null)
327f4f78bb6Smrg                printf ("  - unknown destination format %s\n", arg);
328f4f78bb6Smrg            break;
329f4f78bb6Smrg
330f4f78bb6Smrg        default:
331f4f78bb6Smrg            assert (0);
332f4f78bb6Smrg            break;
333f4f78bb6Smrg        }
334f4f78bb6Smrg    }
335f4f78bb6Smrg
336f4f78bb6Smrg    while (argc--)
337f4f78bb6Smrg    {
338f4f78bb6Smrg        op = PIXMAN_OP_NONE;
339f4f78bb6Smrg        printf ("  - unexpected argument: %s\n", *argv++);
340f4f78bb6Smrg    }
341f4f78bb6Smrg
342f4f78bb6Smrg    if (op == PIXMAN_OP_NONE || src_fmt == PIXMAN_null || dest_fmt == PIXMAN_null)
343f4f78bb6Smrg    {
344f4f78bb6Smrg        printf ("\nUsage:\n    check-formats <operator> <src-format> <dest-format>\n\n");
345f4f78bb6Smrg        list_operators();
346f4f78bb6Smrg        list_formats();
347f4f78bb6Smrg
348f4f78bb6Smrg        return -1;
349f4f78bb6Smrg    }
350f4f78bb6Smrg
351f4f78bb6Smrg    return check_op (op, src_fmt, dest_fmt);
352f4f78bb6Smrg}
353