1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/cairo/libpixman/src/pixman-combine16.c Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,114 @@ 1.4 +#ifdef HAVE_CONFIG_H 1.5 +#include <config.h> 1.6 +#endif 1.7 + 1.8 +#include <math.h> 1.9 +#include <string.h> 1.10 + 1.11 +#include "pixman-private.h" 1.12 + 1.13 +#include "pixman-combine32.h" 1.14 + 1.15 +static force_inline uint32_t 1.16 +combine_mask (const uint32_t src, const uint32_t mask) 1.17 +{ 1.18 + uint32_t s, m; 1.19 + 1.20 + m = mask >> A_SHIFT; 1.21 + 1.22 + if (!m) 1.23 + return 0; 1.24 + s = src; 1.25 + 1.26 + UN8x4_MUL_UN8 (s, m); 1.27 + 1.28 + return s; 1.29 +} 1.30 + 1.31 +static void 1.32 +combine_src_u (pixman_implementation_t *imp, 1.33 + pixman_op_t op, 1.34 + uint32_t * dest, 1.35 + const uint32_t * src, 1.36 + const uint32_t * mask, 1.37 + int width) 1.38 +{ 1.39 + int i; 1.40 + 1.41 + if (!mask) 1.42 + memcpy (dest, src, width * sizeof (uint16_t)); 1.43 + else 1.44 + { 1.45 + uint16_t *d = (uint16_t*)dest; 1.46 + uint16_t *src16 = (uint16_t*)src; 1.47 + for (i = 0; i < width; ++i) 1.48 + { 1.49 + if ((*mask & 0xff000000) == 0xff000000) { 1.50 + // it's likely worth special casing 1.51 + // fully opaque because it avoids 1.52 + // the cost of conversion as well the multiplication 1.53 + *(d + i) = *src16; 1.54 + } else { 1.55 + // the mask is still 32bits 1.56 + uint32_t s = combine_mask (convert_0565_to_8888(*src16), *mask); 1.57 + *(d + i) = convert_8888_to_0565(s); 1.58 + } 1.59 + mask++; 1.60 + src16++; 1.61 + } 1.62 + } 1.63 + 1.64 +} 1.65 + 1.66 +static void 1.67 +combine_over_u (pixman_implementation_t *imp, 1.68 + pixman_op_t op, 1.69 + uint32_t * dest, 1.70 + const uint32_t * src, 1.71 + const uint32_t * mask, 1.72 + int width) 1.73 +{ 1.74 + int i; 1.75 + 1.76 + if (!mask) 1.77 + memcpy (dest, src, width * sizeof (uint16_t)); 1.78 + else 1.79 + { 1.80 + uint16_t *d = (uint16_t*)dest; 1.81 + uint16_t *src16 = (uint16_t*)src; 1.82 + for (i = 0; i < width; ++i) 1.83 + { 1.84 + if ((*mask & 0xff000000) == 0xff000000) { 1.85 + // it's likely worth special casing 1.86 + // fully opaque because it avoids 1.87 + // the cost of conversion as well the multiplication 1.88 + *(d + i) = *src16; 1.89 + } else if ((*mask & 0xff000000) == 0x00000000) { 1.90 + // keep the dest the same 1.91 + } else { 1.92 + // the mask is still 32bits 1.93 + uint32_t s = combine_mask (convert_0565_to_8888(*src16), *mask); 1.94 + uint32_t ia = ALPHA_8 (~s); 1.95 + uint32_t d32 = convert_0565_to_8888(*(d + i)); 1.96 + UN8x4_MUL_UN8_ADD_UN8x4 (d32, ia, s); 1.97 + *(d + i) = convert_8888_to_0565(d32); 1.98 + } 1.99 + mask++; 1.100 + src16++; 1.101 + } 1.102 + } 1.103 + 1.104 +} 1.105 + 1.106 + 1.107 +void 1.108 +_pixman_setup_combiner_functions_16 (pixman_implementation_t *imp) 1.109 +{ 1.110 + int i; 1.111 + for (i = 0; i < PIXMAN_N_OPERATORS; i++) { 1.112 + imp->combine_16[i] = NULL; 1.113 + } 1.114 + imp->combine_16[PIXMAN_OP_SRC] = combine_src_u; 1.115 + imp->combine_16[PIXMAN_OP_OVER] = combine_over_u; 1.116 +} 1.117 +