1#include <ctype.h> 2#include "utils.h" 3 4static int 5check_op (pixman_op_t op, 6 pixman_format_code_t src_format, 7 pixman_format_code_t dest_format) 8{ 9 uint32_t src_alpha_mask, src_green_mask; 10 uint32_t dest_alpha_mask, dest_green_mask; 11 pixel_checker_t src_checker, dest_checker; 12 pixman_image_t *si, *di; 13 uint32_t sa, sg, da, dg; 14 uint32_t s, d; 15 int retval = 0; 16 17 pixel_checker_init (&src_checker, src_format); 18 pixel_checker_init (&dest_checker, dest_format); 19 20 pixel_checker_get_masks ( 21 &src_checker, &src_alpha_mask, NULL, &src_green_mask, NULL); 22 pixel_checker_get_masks ( 23 &dest_checker, &dest_alpha_mask, NULL, &dest_green_mask, NULL); 24 25 /* printf ("masks: %x %x %x %x\n", */ 26 /* src_alpha_mask, src_green_mask, */ 27 /* dest_alpha_mask, dest_green_mask); */ 28 29 si = pixman_image_create_bits (src_format, 1, 1, &s, 4); 30 di = pixman_image_create_bits (dest_format, 1, 1, &d, 4); 31 32 sa = 0; 33 do 34 { 35 sg = 0; 36 do 37 { 38 da = 0; 39 do 40 { 41 dg = 0; 42 do 43 { 44 color_t src_color, dest_color, result_color; 45 uint32_t orig_d; 46 47 s = sa | sg; 48 d = da | dg; 49 50 orig_d = d; 51 52 pixel_checker_convert_pixel_to_color (&src_checker, s, &src_color); 53 pixel_checker_convert_pixel_to_color (&dest_checker, d, &dest_color); 54 55 do_composite (op, &src_color, NULL, &dest_color, &result_color, FALSE); 56 57 58 if (!is_little_endian()) 59 { 60 s <<= 32 - PIXMAN_FORMAT_BPP (src_format); 61 d <<= 32 - PIXMAN_FORMAT_BPP (dest_format); 62 } 63 64 pixman_image_composite32 (op, si, NULL, di, 65 0, 0, 0, 0, 0, 0, 1, 1); 66 67 if (!is_little_endian()) 68 d >>= (32 - PIXMAN_FORMAT_BPP (dest_format)); 69 70 if (!pixel_checker_check (&dest_checker, d, &result_color)) 71 { 72 printf ("---- test failed ----\n"); 73 printf ("operator: %-32s\n", operator_name (op)); 74 printf ("source: %-12s pixel: %08x\n", format_name (src_format), s); 75 printf ("dest: %-12s pixel: %08x\n", format_name (dest_format), orig_d); 76 printf ("got: %-12s pixel: %08x\n", format_name (dest_format), d); 77 78 retval = 1; 79 } 80 81 dg -= dest_green_mask; 82 dg &= dest_green_mask; 83 } 84 while (dg != 0); 85 86 da -= dest_alpha_mask; 87 da &= dest_alpha_mask; 88 } 89 while (da != 0); 90 91 sg -= src_green_mask; 92 sg &= src_green_mask; 93 } 94 while (sg != 0); 95 96 sa -= src_alpha_mask; 97 sa &= src_alpha_mask; 98 } 99 while (sa != 0); 100 101 pixman_image_unref (si); 102 pixman_image_unref (di); 103 104 return retval; 105} 106 107int 108main (int argc, char **argv) 109{ 110 enum { OPTION_OP, OPTION_SRC, OPTION_DEST, LAST_OPTION } option; 111 pixman_format_code_t src_fmt, dest_fmt; 112 pixman_op_t op; 113 114 op = PIXMAN_OP_NONE; 115 src_fmt = PIXMAN_null; 116 dest_fmt = PIXMAN_null; 117 118 argc--; 119 argv++; 120 121 for (option = OPTION_OP; option < LAST_OPTION; ++option) 122 { 123 char *arg = NULL; 124 125 if (argc) 126 { 127 argc--; 128 arg = *argv++; 129 } 130 131 switch (option) 132 { 133 case OPTION_OP: 134 if (!arg) 135 printf (" - missing operator\n"); 136 else if ((op = operator_from_string (arg)) == PIXMAN_OP_NONE) 137 printf (" - unknown operator %s\n", arg); 138 break; 139 140 case OPTION_SRC: 141 if (!arg) 142 printf (" - missing source format\n"); 143 else if ((src_fmt = format_from_string (arg)) == PIXMAN_null) 144 printf (" - unknown source format %s\n", arg); 145 break; 146 147 case OPTION_DEST: 148 if (!arg) 149 printf (" - missing destination format\n"); 150 else if ((dest_fmt = format_from_string (arg)) == PIXMAN_null) 151 printf (" - unknown destination format %s\n", arg); 152 break; 153 154 default: 155 assert (0); 156 break; 157 } 158 } 159 160 while (argc--) 161 { 162 op = PIXMAN_OP_NONE; 163 printf (" - unexpected argument: %s\n", *argv++); 164 } 165 166 if (op == PIXMAN_OP_NONE || src_fmt == PIXMAN_null || dest_fmt == PIXMAN_null) 167 { 168 printf ("\nUsage:\n check-formats <operator> <src-format> <dest-format>\n\n"); 169 list_operators(); 170 list_formats(); 171 172 return -1; 173 } 174 175 return check_op (op, src_fmt, dest_fmt); 176} 177