1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/gfx/cairo/libpixman/src/pixman-combine64.h Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,230 @@ 1.4 +/* WARNING: This file is generated by combine.pl from combine.inc. 1.5 + Please edit one of those files rather than this one. */ 1.6 + 1.7 +#line 1 "pixman-combine.c.template" 1.8 + 1.9 +#define COMPONENT_SIZE 16 1.10 +#define MASK 0xffffULL 1.11 +#define ONE_HALF 0x8000ULL 1.12 + 1.13 +#define A_SHIFT 16 * 3 1.14 +#define R_SHIFT 16 * 2 1.15 +#define G_SHIFT 16 1.16 +#define A_MASK 0xffff000000000000ULL 1.17 +#define R_MASK 0xffff00000000ULL 1.18 +#define G_MASK 0xffff0000ULL 1.19 + 1.20 +#define RB_MASK 0xffff0000ffffULL 1.21 +#define AG_MASK 0xffff0000ffff0000ULL 1.22 +#define RB_ONE_HALF 0x800000008000ULL 1.23 +#define RB_MASK_PLUS_ONE 0x10000000010000ULL 1.24 + 1.25 +#define ALPHA_16(x) ((x) >> A_SHIFT) 1.26 +#define RED_16(x) (((x) >> R_SHIFT) & MASK) 1.27 +#define GREEN_16(x) (((x) >> G_SHIFT) & MASK) 1.28 +#define BLUE_16(x) ((x) & MASK) 1.29 + 1.30 +/* 1.31 + * Helper macros. 1.32 + */ 1.33 + 1.34 +#define MUL_UN16(a, b, t) \ 1.35 + ((t) = (a) * (uint32_t)(b) + ONE_HALF, ((((t) >> G_SHIFT ) + (t) ) >> G_SHIFT )) 1.36 + 1.37 +#define DIV_UN16(a, b) \ 1.38 + (((uint32_t) (a) * MASK + ((b) / 2)) / (b)) 1.39 + 1.40 +#define ADD_UN16(x, y, t) \ 1.41 + ((t) = (x) + (y), \ 1.42 + (uint64_t) (uint16_t) ((t) | (0 - ((t) >> G_SHIFT)))) 1.43 + 1.44 +#define DIV_ONE_UN16(x) \ 1.45 + (((x) + ONE_HALF + (((x) + ONE_HALF) >> G_SHIFT)) >> G_SHIFT) 1.46 + 1.47 +/* 1.48 + * The methods below use some tricks to be able to do two color 1.49 + * components at the same time. 1.50 + */ 1.51 + 1.52 +/* 1.53 + * x_rb = (x_rb * a) / 255 1.54 + */ 1.55 +#define UN16_rb_MUL_UN16(x, a, t) \ 1.56 + do \ 1.57 + { \ 1.58 + t = ((x) & RB_MASK) * (a); \ 1.59 + t += RB_ONE_HALF; \ 1.60 + x = (t + ((t >> G_SHIFT) & RB_MASK)) >> G_SHIFT; \ 1.61 + x &= RB_MASK; \ 1.62 + } while (0) 1.63 + 1.64 +/* 1.65 + * x_rb = min (x_rb + y_rb, 255) 1.66 + */ 1.67 +#define UN16_rb_ADD_UN16_rb(x, y, t) \ 1.68 + do \ 1.69 + { \ 1.70 + t = ((x) + (y)); \ 1.71 + t |= RB_MASK_PLUS_ONE - ((t >> G_SHIFT) & RB_MASK); \ 1.72 + x = (t & RB_MASK); \ 1.73 + } while (0) 1.74 + 1.75 +/* 1.76 + * x_rb = (x_rb * a_rb) / 255 1.77 + */ 1.78 +#define UN16_rb_MUL_UN16_rb(x, a, t) \ 1.79 + do \ 1.80 + { \ 1.81 + t = (x & MASK) * (a & MASK); \ 1.82 + t |= (x & R_MASK) * ((a >> R_SHIFT) & MASK); \ 1.83 + t += RB_ONE_HALF; \ 1.84 + t = (t + ((t >> G_SHIFT) & RB_MASK)) >> G_SHIFT; \ 1.85 + x = t & RB_MASK; \ 1.86 + } while (0) 1.87 + 1.88 +/* 1.89 + * x_c = (x_c * a) / 255 1.90 + */ 1.91 +#define UN16x4_MUL_UN16(x, a) \ 1.92 + do \ 1.93 + { \ 1.94 + uint64_t r1__, r2__, t__; \ 1.95 + \ 1.96 + r1__ = (x); \ 1.97 + UN16_rb_MUL_UN16 (r1__, (a), t__); \ 1.98 + \ 1.99 + r2__ = (x) >> G_SHIFT; \ 1.100 + UN16_rb_MUL_UN16 (r2__, (a), t__); \ 1.101 + \ 1.102 + (x) = r1__ | (r2__ << G_SHIFT); \ 1.103 + } while (0) 1.104 + 1.105 +/* 1.106 + * x_c = (x_c * a) / 255 + y_c 1.107 + */ 1.108 +#define UN16x4_MUL_UN16_ADD_UN16x4(x, a, y) \ 1.109 + do \ 1.110 + { \ 1.111 + uint64_t r1__, r2__, r3__, t__; \ 1.112 + \ 1.113 + r1__ = (x); \ 1.114 + r2__ = (y) & RB_MASK; \ 1.115 + UN16_rb_MUL_UN16 (r1__, (a), t__); \ 1.116 + UN16_rb_ADD_UN16_rb (r1__, r2__, t__); \ 1.117 + \ 1.118 + r2__ = (x) >> G_SHIFT; \ 1.119 + r3__ = ((y) >> G_SHIFT) & RB_MASK; \ 1.120 + UN16_rb_MUL_UN16 (r2__, (a), t__); \ 1.121 + UN16_rb_ADD_UN16_rb (r2__, r3__, t__); \ 1.122 + \ 1.123 + (x) = r1__ | (r2__ << G_SHIFT); \ 1.124 + } while (0) 1.125 + 1.126 +/* 1.127 + * x_c = (x_c * a + y_c * b) / 255 1.128 + */ 1.129 +#define UN16x4_MUL_UN16_ADD_UN16x4_MUL_UN16(x, a, y, b) \ 1.130 + do \ 1.131 + { \ 1.132 + uint64_t r1__, r2__, r3__, t__; \ 1.133 + \ 1.134 + r1__ = (x); \ 1.135 + r2__ = (y); \ 1.136 + UN16_rb_MUL_UN16 (r1__, (a), t__); \ 1.137 + UN16_rb_MUL_UN16 (r2__, (b), t__); \ 1.138 + UN16_rb_ADD_UN16_rb (r1__, r2__, t__); \ 1.139 + \ 1.140 + r2__ = ((x) >> G_SHIFT); \ 1.141 + r3__ = ((y) >> G_SHIFT); \ 1.142 + UN16_rb_MUL_UN16 (r2__, (a), t__); \ 1.143 + UN16_rb_MUL_UN16 (r3__, (b), t__); \ 1.144 + UN16_rb_ADD_UN16_rb (r2__, r3__, t__); \ 1.145 + \ 1.146 + (x) = r1__ | (r2__ << G_SHIFT); \ 1.147 + } while (0) 1.148 + 1.149 +/* 1.150 + * x_c = (x_c * a_c) / 255 1.151 + */ 1.152 +#define UN16x4_MUL_UN16x4(x, a) \ 1.153 + do \ 1.154 + { \ 1.155 + uint64_t r1__, r2__, r3__, t__; \ 1.156 + \ 1.157 + r1__ = (x); \ 1.158 + r2__ = (a); \ 1.159 + UN16_rb_MUL_UN16_rb (r1__, r2__, t__); \ 1.160 + \ 1.161 + r2__ = (x) >> G_SHIFT; \ 1.162 + r3__ = (a) >> G_SHIFT; \ 1.163 + UN16_rb_MUL_UN16_rb (r2__, r3__, t__); \ 1.164 + \ 1.165 + (x) = r1__ | (r2__ << G_SHIFT); \ 1.166 + } while (0) 1.167 + 1.168 +/* 1.169 + * x_c = (x_c * a_c) / 255 + y_c 1.170 + */ 1.171 +#define UN16x4_MUL_UN16x4_ADD_UN16x4(x, a, y) \ 1.172 + do \ 1.173 + { \ 1.174 + uint64_t r1__, r2__, r3__, t__; \ 1.175 + \ 1.176 + r1__ = (x); \ 1.177 + r2__ = (a); \ 1.178 + UN16_rb_MUL_UN16_rb (r1__, r2__, t__); \ 1.179 + r2__ = (y) & RB_MASK; \ 1.180 + UN16_rb_ADD_UN16_rb (r1__, r2__, t__); \ 1.181 + \ 1.182 + r2__ = ((x) >> G_SHIFT); \ 1.183 + r3__ = ((a) >> G_SHIFT); \ 1.184 + UN16_rb_MUL_UN16_rb (r2__, r3__, t__); \ 1.185 + r3__ = ((y) >> G_SHIFT) & RB_MASK; \ 1.186 + UN16_rb_ADD_UN16_rb (r2__, r3__, t__); \ 1.187 + \ 1.188 + (x) = r1__ | (r2__ << G_SHIFT); \ 1.189 + } while (0) 1.190 + 1.191 +/* 1.192 + * x_c = (x_c * a_c + y_c * b) / 255 1.193 + */ 1.194 +#define UN16x4_MUL_UN16x4_ADD_UN16x4_MUL_UN16(x, a, y, b) \ 1.195 + do \ 1.196 + { \ 1.197 + uint64_t r1__, r2__, r3__, t__; \ 1.198 + \ 1.199 + r1__ = (x); \ 1.200 + r2__ = (a); \ 1.201 + UN16_rb_MUL_UN16_rb (r1__, r2__, t__); \ 1.202 + r2__ = (y); \ 1.203 + UN16_rb_MUL_UN16 (r2__, (b), t__); \ 1.204 + UN16_rb_ADD_UN16_rb (r1__, r2__, t__); \ 1.205 + \ 1.206 + r2__ = (x) >> G_SHIFT; \ 1.207 + r3__ = (a) >> G_SHIFT; \ 1.208 + UN16_rb_MUL_UN16_rb (r2__, r3__, t__); \ 1.209 + r3__ = (y) >> G_SHIFT; \ 1.210 + UN16_rb_MUL_UN16 (r3__, (b), t__); \ 1.211 + UN16_rb_ADD_UN16_rb (r2__, r3__, t__); \ 1.212 + \ 1.213 + x = r1__ | (r2__ << G_SHIFT); \ 1.214 + } while (0) 1.215 + 1.216 +/* 1.217 + x_c = min(x_c + y_c, 255) 1.218 +*/ 1.219 +#define UN16x4_ADD_UN16x4(x, y) \ 1.220 + do \ 1.221 + { \ 1.222 + uint64_t r1__, r2__, r3__, t__; \ 1.223 + \ 1.224 + r1__ = (x) & RB_MASK; \ 1.225 + r2__ = (y) & RB_MASK; \ 1.226 + UN16_rb_ADD_UN16_rb (r1__, r2__, t__); \ 1.227 + \ 1.228 + r2__ = ((x) >> G_SHIFT) & RB_MASK; \ 1.229 + r3__ = ((y) >> G_SHIFT) & RB_MASK; \ 1.230 + UN16_rb_ADD_UN16_rb (r2__, r3__, t__); \ 1.231 + \ 1.232 + x = r1__ | (r2__ << G_SHIFT); \ 1.233 + } while (0)