gfx/cairo/libpixman/src/pixman-combine.h.template

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

mercurial