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