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