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