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

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     2 #define COMPONENT_SIZE
     3 #define MASK
     4 #define ONE_HALF
     6 #define A_SHIFT
     7 #define R_SHIFT
     8 #define G_SHIFT
     9 #define A_MASK
    10 #define R_MASK
    11 #define G_MASK
    13 #define RB_MASK
    14 #define AG_MASK
    15 #define RB_ONE_HALF
    16 #define RB_MASK_PLUS_ONE
    18 #define ALPHA_c(x) ((x) >> A_SHIFT)
    19 #define RED_c(x) (((x) >> R_SHIFT) & MASK)
    20 #define GREEN_c(x) (((x) >> G_SHIFT) & MASK)
    21 #define BLUE_c(x) ((x) & MASK)
    23 /*
    24  * Helper macros.
    25  */
    27 #define MUL_UNc(a, b, t)						\
    28     ((t) = (a) * (comp2_t)(b) + ONE_HALF, ((((t) >> G_SHIFT ) + (t) ) >> G_SHIFT ))
    30 #define DIV_UNc(a, b)							\
    31     (((comp2_t) (a) * MASK + ((b) / 2)) / (b))
    33 #define ADD_UNc(x, y, t)				     \
    34     ((t) = (x) + (y),					     \
    35      (comp4_t) (comp1_t) ((t) | (0 - ((t) >> G_SHIFT))))
    37 #define DIV_ONE_UNc(x)							\
    38     (((x) + ONE_HALF + (((x) + ONE_HALF) >> G_SHIFT)) >> G_SHIFT)
    40 /*
    41  * The methods below use some tricks to be able to do two color
    42  * components at the same time.
    43  */
    45 /*
    46  * x_rb = (x_rb * a) / 255
    47  */
    48 #define UNc_rb_MUL_UNc(x, a, t)						\
    49     do									\
    50     {									\
    51 	t  = ((x) & RB_MASK) * (a);					\
    52 	t += RB_ONE_HALF;						\
    53 	x = (t + ((t >> G_SHIFT) & RB_MASK)) >> G_SHIFT;		\
    54 	x &= RB_MASK;							\
    55     } while (0)
    57 /*
    58  * x_rb = min (x_rb + y_rb, 255)
    59  */
    60 #define UNc_rb_ADD_UNc_rb(x, y, t)					\
    61     do									\
    62     {									\
    63 	t = ((x) + (y));						\
    64 	t |= RB_MASK_PLUS_ONE - ((t >> G_SHIFT) & RB_MASK);		\
    65 	x = (t & RB_MASK);						\
    66     } while (0)
    68 /*
    69  * x_rb = (x_rb * a_rb) / 255
    70  */
    71 #define UNc_rb_MUL_UNc_rb(x, a, t)					\
    72     do									\
    73     {									\
    74 	t  = (x & MASK) * (a & MASK);					\
    75 	t |= (x & R_MASK) * ((a >> R_SHIFT) & MASK);			\
    76 	t += RB_ONE_HALF;						\
    77 	t = (t + ((t >> G_SHIFT) & RB_MASK)) >> G_SHIFT;		\
    78 	x = t & RB_MASK;						\
    79     } while (0)
    81 /*
    82  * x_c = (x_c * a) / 255
    83  */
    84 #define UNcx4_MUL_UNc(x, a)						\
    85     do									\
    86     {									\
    87 	comp4_t r1__, r2__, t__;					\
    88 									\
    89 	r1__ = (x);							\
    90 	UNc_rb_MUL_UNc (r1__, (a), t__);				\
    91 									\
    92 	r2__ = (x) >> G_SHIFT;						\
    93 	UNc_rb_MUL_UNc (r2__, (a), t__);				\
    94 									\
    95 	(x) = r1__ | (r2__ << G_SHIFT);					\
    96     } while (0)
    98 /*
    99  * x_c = (x_c * a) / 255 + y_c
   100  */
   101 #define UNcx4_MUL_UNc_ADD_UNcx4(x, a, y)				\
   102     do									\
   103     {									\
   104 	comp4_t r1__, r2__, r3__, t__;					\
   105 									\
   106 	r1__ = (x);							\
   107 	r2__ = (y) & RB_MASK;						\
   108 	UNc_rb_MUL_UNc (r1__, (a), t__);				\
   109 	UNc_rb_ADD_UNc_rb (r1__, r2__, t__);				\
   110 									\
   111 	r2__ = (x) >> G_SHIFT;						\
   112 	r3__ = ((y) >> G_SHIFT) & RB_MASK;				\
   113 	UNc_rb_MUL_UNc (r2__, (a), t__);				\
   114 	UNc_rb_ADD_UNc_rb (r2__, r3__, t__);				\
   115 									\
   116 	(x) = r1__ | (r2__ << G_SHIFT);					\
   117     } while (0)
   119 /*
   120  * x_c = (x_c * a + y_c * b) / 255
   121  */
   122 #define UNcx4_MUL_UNc_ADD_UNcx4_MUL_UNc(x, a, y, b)			\
   123     do									\
   124     {									\
   125 	comp4_t r1__, r2__, r3__, t__;					\
   126 									\
   127 	r1__ = (x);							\
   128 	r2__ = (y);							\
   129 	UNc_rb_MUL_UNc (r1__, (a), t__);				\
   130 	UNc_rb_MUL_UNc (r2__, (b), t__);				\
   131 	UNc_rb_ADD_UNc_rb (r1__, r2__, t__);				\
   132 									\
   133 	r2__ = ((x) >> G_SHIFT);					\
   134 	r3__ = ((y) >> G_SHIFT);					\
   135 	UNc_rb_MUL_UNc (r2__, (a), t__);				\
   136 	UNc_rb_MUL_UNc (r3__, (b), t__);				\
   137 	UNc_rb_ADD_UNc_rb (r2__, r3__, t__);				\
   138 									\
   139 	(x) = r1__ | (r2__ << G_SHIFT);					\
   140     } while (0)
   142 /*
   143  * x_c = (x_c * a_c) / 255
   144  */
   145 #define UNcx4_MUL_UNcx4(x, a)						\
   146     do									\
   147     {									\
   148 	comp4_t r1__, r2__, r3__, t__;					\
   149 									\
   150 	r1__ = (x);							\
   151 	r2__ = (a);							\
   152 	UNc_rb_MUL_UNc_rb (r1__, r2__, t__);				\
   153 									\
   154 	r2__ = (x) >> G_SHIFT;						\
   155 	r3__ = (a) >> G_SHIFT;						\
   156 	UNc_rb_MUL_UNc_rb (r2__, r3__, t__);				\
   157 									\
   158 	(x) = r1__ | (r2__ << G_SHIFT);					\
   159     } while (0)
   161 /*
   162  * x_c = (x_c * a_c) / 255 + y_c
   163  */
   164 #define UNcx4_MUL_UNcx4_ADD_UNcx4(x, a, y)				\
   165     do									\
   166     {									\
   167 	comp4_t r1__, r2__, r3__, t__;					\
   168 									\
   169 	r1__ = (x);							\
   170 	r2__ = (a);							\
   171 	UNc_rb_MUL_UNc_rb (r1__, r2__, t__);				\
   172 	r2__ = (y) & RB_MASK;						\
   173 	UNc_rb_ADD_UNc_rb (r1__, r2__, t__);				\
   174 									\
   175 	r2__ = ((x) >> G_SHIFT);					\
   176 	r3__ = ((a) >> G_SHIFT);					\
   177 	UNc_rb_MUL_UNc_rb (r2__, r3__, t__);				\
   178 	r3__ = ((y) >> G_SHIFT) & RB_MASK;				\
   179 	UNc_rb_ADD_UNc_rb (r2__, r3__, t__);				\
   180 									\
   181 	(x) = r1__ | (r2__ << G_SHIFT);					\
   182     } while (0)
   184 /*
   185  * x_c = (x_c * a_c + y_c * b) / 255
   186  */
   187 #define UNcx4_MUL_UNcx4_ADD_UNcx4_MUL_UNc(x, a, y, b)			\
   188     do									\
   189     {									\
   190 	comp4_t r1__, r2__, r3__, t__;					\
   191 									\
   192 	r1__ = (x);							\
   193 	r2__ = (a);							\
   194 	UNc_rb_MUL_UNc_rb (r1__, r2__, t__);				\
   195 	r2__ = (y);							\
   196 	UNc_rb_MUL_UNc (r2__, (b), t__);				\
   197 	UNc_rb_ADD_UNc_rb (r1__, r2__, t__);				\
   198 									\
   199 	r2__ = (x) >> G_SHIFT;						\
   200 	r3__ = (a) >> G_SHIFT;						\
   201 	UNc_rb_MUL_UNc_rb (r2__, r3__, t__);				\
   202 	r3__ = (y) >> G_SHIFT;						\
   203 	UNc_rb_MUL_UNc (r3__, (b), t__);				\
   204 	UNc_rb_ADD_UNc_rb (r2__, r3__, t__);				\
   205 									\
   206 	x = r1__ | (r2__ << G_SHIFT);					\
   207     } while (0)
   209 /*
   210   x_c = min(x_c + y_c, 255)
   211 */
   212 #define UNcx4_ADD_UNcx4(x, y)						\
   213     do									\
   214     {									\
   215 	comp4_t r1__, r2__, r3__, t__;					\
   216 									\
   217 	r1__ = (x) & RB_MASK;						\
   218 	r2__ = (y) & RB_MASK;						\
   219 	UNc_rb_ADD_UNc_rb (r1__, r2__, t__);				\
   220 									\
   221 	r2__ = ((x) >> G_SHIFT) & RB_MASK;				\
   222 	r3__ = ((y) >> G_SHIFT) & RB_MASK;				\
   223 	UNc_rb_ADD_UNc_rb (r2__, r3__, t__);				\
   224 									\
   225 	x = r1__ | (r2__ << G_SHIFT);					\
   226     } while (0)

mercurial