11176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include <ctype.h>
21176bdada62cabc6ec4b0308a930e83b679d5d36John Reck#include "utils.h"
31176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
41176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic int
51176bdada62cabc6ec4b0308a930e83b679d5d36John Reckcheck_op (pixman_op_t          op,
61176bdada62cabc6ec4b0308a930e83b679d5d36John Reck          pixman_format_code_t src_format,
71176bdada62cabc6ec4b0308a930e83b679d5d36John Reck          pixman_format_code_t dest_format)
81176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
91176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    uint32_t src_alpha_mask, src_green_mask;
101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    uint32_t dest_alpha_mask, dest_green_mask;
111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixel_checker_t src_checker, dest_checker;
121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_image_t *si, *di;
131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    uint32_t sa, sg, da, dg;
141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    uint32_t s, d;
151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    int retval = 0;
161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixel_checker_init (&src_checker, src_format);
181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixel_checker_init (&dest_checker, dest_format);
191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixel_checker_get_masks (
211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        &src_checker, &src_alpha_mask, NULL, &src_green_mask, NULL);
221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixel_checker_get_masks (
231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        &dest_checker, &dest_alpha_mask, NULL, &dest_green_mask, NULL);
241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    /* printf ("masks: %x %x %x %x\n", */
261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    /* 	    src_alpha_mask, src_green_mask, */
271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    /* 	    dest_alpha_mask, dest_green_mask); */
281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    si = pixman_image_create_bits (src_format, 1, 1, &s, 4);
301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    di = pixman_image_create_bits (dest_format, 1, 1, &d, 4);
311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    sa = 0;
331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    do
341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    {
351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        sg = 0;
361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        do
371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        {
381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            da = 0;
391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            do
401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            {
411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                dg = 0;
421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                do
431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                {
441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                    color_t src_color, dest_color, result_color;
451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                    uint32_t orig_d;
461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                    s = sa | sg;
481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                    d = da | dg;
491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                    orig_d = d;
511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck		    pixel_checker_convert_pixel_to_color (&src_checker, s, &src_color);
531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck		    pixel_checker_convert_pixel_to_color (&dest_checker, d, &dest_color);
541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck		    do_composite (op, &src_color, NULL, &dest_color, &result_color, FALSE);
561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck		    if (!is_little_endian())
591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                    {
601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck			s <<= 32 - PIXMAN_FORMAT_BPP (src_format);
611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck			d <<= 32 - PIXMAN_FORMAT_BPP (dest_format);
621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                    }
631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck		    pixman_image_composite32 (op, si, NULL, di,
651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck					      0, 0, 0, 0, 0, 0, 1, 1);
661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck		    if (!is_little_endian())
681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                        d >>= (32 - PIXMAN_FORMAT_BPP (dest_format));
691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                    if (!pixel_checker_check (&dest_checker, d, &result_color))
711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                    {
721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                        printf ("---- test failed ----\n");
731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                        printf ("operator: %-32s\n", operator_name (op));
741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                        printf ("source:   %-12s pixel: %08x\n", format_name (src_format), s);
751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                        printf ("dest:     %-12s pixel: %08x\n", format_name (dest_format), orig_d);
761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                        printf ("got:      %-12s pixel: %08x\n", format_name (dest_format), d);
771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                        retval = 1;
791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                    }
801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                    dg -= dest_green_mask;
821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                    dg &= dest_green_mask;
831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                }
841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                while (dg != 0);
851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                da -= dest_alpha_mask;
871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                da &= dest_alpha_mask;
881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            }
891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            while (da != 0);
901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            sg -= src_green_mask;
921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            sg &= src_green_mask;
931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        }
941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        while (sg != 0);
951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        sa -= src_alpha_mask;
971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        sa &= src_alpha_mask;
981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    }
991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    while (sa != 0);
1001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_image_unref (si);
1021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_image_unref (di);
1031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    return retval;
1051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}
1061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1071176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic const pixman_op_t op_list[] =
1081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
1091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_CLEAR,
1101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_SRC,
1111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_DST,
1121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_OVER,
1131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_OVER_REVERSE,
1141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_IN,
1151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_IN_REVERSE,
1161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_OUT,
1171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_OUT_REVERSE,
1181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_ATOP,
1191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_ATOP_REVERSE,
1201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_XOR,
1211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_ADD,
1221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_SATURATE,
1231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_DISJOINT_CLEAR,
1251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_DISJOINT_SRC,
1261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_DISJOINT_DST,
1271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_DISJOINT_OVER,
1281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_DISJOINT_OVER_REVERSE,
1291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_DISJOINT_IN,
1301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_DISJOINT_IN_REVERSE,
1311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_DISJOINT_OUT,
1321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_DISJOINT_OUT_REVERSE,
1331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_DISJOINT_ATOP,
1341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_DISJOINT_ATOP_REVERSE,
1351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_DISJOINT_XOR,
1361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_CONJOINT_CLEAR,
1381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_CONJOINT_SRC,
1391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_CONJOINT_DST,
1401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_CONJOINT_OVER,
1411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_CONJOINT_OVER_REVERSE,
1421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_CONJOINT_IN,
1431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_CONJOINT_IN_REVERSE,
1441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_CONJOINT_OUT,
1451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_CONJOINT_OUT_REVERSE,
1461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_CONJOINT_ATOP,
1471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_CONJOINT_ATOP_REVERSE,
1481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_OP_CONJOINT_XOR,
1491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck};
1501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1511176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic const pixman_format_code_t format_list[] =
1521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
1531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_a8r8g8b8,
1541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_x8r8g8b8,
1551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_a8b8g8r8,
1561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_x8b8g8r8,
1571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_b8g8r8a8,
1581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_b8g8r8x8,
1591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_r8g8b8a8,
1601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_r8g8b8x8,
1611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_x14r6g6b6,
1621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_x2r10g10b10,
1631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_a2r10g10b10,
1641176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_x2b10g10r10,
1651176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_a2b10g10r10,
1661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_a8r8g8b8_sRGB,
1671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_r8g8b8,
1681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_b8g8r8,
1691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_r5g6b5,
1701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_b5g6r5,
1711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_a1r5g5b5,
1721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_x1r5g5b5,
1731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_a1b5g5r5,
1741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_x1b5g5r5,
1751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_a4r4g4b4,
1761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_x4r4g4b4,
1771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_a4b4g4r4,
1781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_x4b4g4r4,
1791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_a8,
1801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_r3g3b2,
1811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_b2g3r3,
1821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_a2r2g2b2,
1831176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_a2b2g2r2,
1841176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_x4a4,
1851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_a4,
1861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_r1g2b1,
1871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_b1g2r1,
1881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_a1r1g1b1,
1891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_a1b1g1r1,
1901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    PIXMAN_a1,
1911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck};
1921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1931176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_format_code_t
1941176bdada62cabc6ec4b0308a930e83b679d5d36John Reckformat_from_string (const char *s)
1951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
1961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    int i;
1971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
1981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    for (i = 0; i < ARRAY_LENGTH (format_list); ++i)
1991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    {
2001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        if (strcasecmp (format_name (format_list[i]), s) == 0)
2011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            return format_list[i];
2021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    }
2031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    return PIXMAN_null;
2051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}
2061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2071176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic void
2081176bdada62cabc6ec4b0308a930e83b679d5d36John Reckemit (const char *s, int *n_chars)
2091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
2101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    *n_chars += printf ("%s,", s);
2111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    if (*n_chars > 60)
2121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    {
2131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        printf ("\n    ");
2141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        *n_chars = 0;
2151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    }
2161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    else
2171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    {
2181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        printf (" ");
2191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        (*n_chars)++;
2201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    }
2211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}
2221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2231176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic void
2241176bdada62cabc6ec4b0308a930e83b679d5d36John Recklist_formats (void)
2251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
2261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    int n_chars;
2271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    int i;
2281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    printf ("Formats:\n    ");
2301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    n_chars = 0;
2321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    for (i = 0; i < ARRAY_LENGTH (format_list); ++i)
2331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        emit (format_name (format_list[i]), &n_chars);
2341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    printf ("\n\n");
2361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}
2371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2381176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic void
2391176bdada62cabc6ec4b0308a930e83b679d5d36John Recklist_operators (void)
2401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
2411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    char short_name [128] = { 0 };
2421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    int i, n_chars;
2431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    printf ("Operators:\n    ");
2451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    n_chars = 0;
2471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    for (i = 0; i < ARRAY_LENGTH (op_list); ++i)
2481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    {
2491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        pixman_op_t op = op_list[i];
2501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        int j;
2511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        snprintf (short_name, sizeof (short_name) - 1, "%s",
2531176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                  operator_name (op) + strlen ("PIXMAN_OP_"));
2541176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2551176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        for (j = 0; short_name[j] != '\0'; ++j)
2561176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            short_name[j] = tolower (short_name[j]);
2571176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2581176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        emit (short_name, &n_chars);
2591176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    }
2601176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2611176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    printf ("\n\n");
2621176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}
2631176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2641176bdada62cabc6ec4b0308a930e83b679d5d36John Reckstatic pixman_op_t
2651176bdada62cabc6ec4b0308a930e83b679d5d36John Reckoperator_from_string (const char *s)
2661176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
2671176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    char full_name[128] = { 0 };
2681176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    int i;
2691176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2701176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    snprintf (full_name, (sizeof full_name) - 1, "PIXMAN_OP_%s", s);
2711176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2721176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    for (i = 0; i < ARRAY_LENGTH (op_list); ++i)
2731176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    {
2741176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        pixman_op_t op = op_list[i];
2751176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2761176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        if (strcasecmp (operator_name (op), full_name) == 0)
2771176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            return op;
2781176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    }
2791176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2801176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    return PIXMAN_OP_NONE;
2811176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}
2821176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2831176bdada62cabc6ec4b0308a930e83b679d5d36John Reckint
2841176bdada62cabc6ec4b0308a930e83b679d5d36John Reckmain (int argc, char **argv)
2851176bdada62cabc6ec4b0308a930e83b679d5d36John Reck{
2861176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    enum { OPTION_OP, OPTION_SRC, OPTION_DEST, LAST_OPTION } option;
2871176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_format_code_t src_fmt, dest_fmt;
2881176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    pixman_op_t op;
2891176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2901176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    op = PIXMAN_OP_NONE;
2911176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    src_fmt = PIXMAN_null;
2921176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    dest_fmt = PIXMAN_null;
2931176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2941176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    argc--;
2951176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    argv++;
2961176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
2971176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    for (option = OPTION_OP; option < LAST_OPTION; ++option)
2981176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    {
2991176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        char *arg = NULL;
3001176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
3011176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        if (argc)
3021176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        {
3031176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            argc--;
3041176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            arg = *argv++;
3051176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        }
3061176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
3071176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        switch (option)
3081176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        {
3091176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        case OPTION_OP:
3101176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            if (!arg)
3111176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                printf ("  - missing operator\n");
3121176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            else if ((op = operator_from_string (arg)) == PIXMAN_OP_NONE)
3131176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                printf ("  - unknown operator %s\n", arg);
3141176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            break;
3151176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
3161176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        case OPTION_SRC:
3171176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            if (!arg)
3181176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                printf ("  - missing source format\n");
3191176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            else if ((src_fmt = format_from_string (arg)) == PIXMAN_null)
3201176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                printf ("  - unknown source format %s\n", arg);
3211176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            break;
3221176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
3231176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        case OPTION_DEST:
3241176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            if (!arg)
3251176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                printf ("  - missing destination format\n");
3261176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            else if ((dest_fmt = format_from_string (arg)) == PIXMAN_null)
3271176bdada62cabc6ec4b0308a930e83b679d5d36John Reck                printf ("  - unknown destination format %s\n", arg);
3281176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            break;
3291176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
3301176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        default:
3311176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            assert (0);
3321176bdada62cabc6ec4b0308a930e83b679d5d36John Reck            break;
3331176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        }
3341176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    }
3351176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
3361176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    while (argc--)
3371176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    {
3381176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        op = PIXMAN_OP_NONE;
3391176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        printf ("  - unexpected argument: %s\n", *argv++);
3401176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    }
3411176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
3421176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    if (op == PIXMAN_OP_NONE || src_fmt == PIXMAN_null || dest_fmt == PIXMAN_null)
3431176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    {
3441176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        printf ("\nUsage:\n    check-formats <operator> <src-format> <dest-format>\n\n");
3451176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        list_operators();
3461176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        list_formats();
3471176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
3481176bdada62cabc6ec4b0308a930e83b679d5d36John Reck        return -1;
3491176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    }
3501176bdada62cabc6ec4b0308a930e83b679d5d36John Reck
3511176bdada62cabc6ec4b0308a930e83b679d5d36John Reck    return check_op (op, src_fmt, dest_fmt);
3521176bdada62cabc6ec4b0308a930e83b679d5d36John Reck}
353