gfx/cairo/libpixman/src/pixman-combine64.h

changeset 0
6474c204b198
     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)

mercurial