Use MAKE_ACCESSORS() to generate accessors for the a1 format.
[profile/ivi/pixman.git] / pixman / pixman-combine.h.template
index 6ecd301..67ed309 100644 (file)
 #define RB_ONE_HALF
 #define RB_MASK_PLUS_ONE
 
-#define Alpha(x) ((x) >> A_SHIFT)
+#define ALPHA_c(x) ((x) >> A_SHIFT)
+#define RED_c(x) (((x) >> R_SHIFT) & MASK)
+#define GREEN_c(x) (((x) >> G_SHIFT) & MASK)
+#define BLUE_c(x) ((x) & MASK)
 
 /*
  * Helper macros.
  */
 
-#define IntMult(a,b,t) ( (t) = (a) * (b) + ONE_HALF, ( ( ( (t)>>G_SHIFT ) + (t) )>>G_SHIFT ) )
-#define IntDiv(a,b)    (((comp2_t) (a) * MASK) / (b))
+#define MUL_UNc(a, b, t)                                               \
+    ((t) = (a) * (b) + ONE_HALF, ((((t) >> G_SHIFT ) + (t) ) >> G_SHIFT ))
 
-#define GetComp(v,i)   ((comp2_t) (comp1_t) ((v) >> i))
+#define DIV_UNc(a, b)                                                  \
+    (((comp2_t) (a) * MASK) / (b))
 
-#define Add(x,y,i,t)   ((t) = GetComp(x,i) + GetComp(y,i),              \
-                        (comp4_t) ((comp1_t) ((t) | (0 - ((t) >> G_SHIFT)))) << (i))
+#define ADD_UNc(x, y, t)                                    \
+    ((t) = (x) + (y),                                       \
+     (comp4_t) (comp1_t) ((t) | (0 - ((t) >> G_SHIFT))))
 
-#define FbGen(x,y,i,ax,ay,t,u,v) ((t) = (IntMult(GetComp(y,i),ay,(u)) + \
-                                        IntMult(GetComp(x,i),ax,(v))), \
-                                 (comp4_t) ((comp1_t) ((t) |           \
-                                                        (0 - ((t) >> G_SHIFT)))) << (i))
+#define DIV_ONE_UNc(x)                                                 \
+    (((x) + ONE_HALF + (((x) + ONE_HALF) >> G_SHIFT)) >> G_SHIFT)
 
 /*
-  The methods below use some tricks to be able to do two color
-  components at the same time.
-*/
* The methods below use some tricks to be able to do two color
* components at the same time.
+ */
 
 /*
-  x_c = (x_c * a) / 255
-*/
-#define FbByteMul(x, a) do {                                            \
-        comp4_t t = ((x & RB_MASK) * a) + RB_ONE_HALF;                  \
-        t = (t + ((t >> COMPONENT_SIZE) & RB_MASK)) >> COMPONENT_SIZE;  \
-        t &= RB_MASK;                                                   \
-                                                                        \
-        x = (((x >> COMPONENT_SIZE) & RB_MASK) * a) + RB_ONE_HALF;      \
-        x = (x + ((x >> COMPONENT_SIZE) & RB_MASK));                    \
-        x &= RB_MASK << COMPONENT_SIZE;                                 \
-        x += t;                                                         \
+ * x_rb = (x_rb * a) / 255
+ */
+#define UNc_rb_MUL_UNc(x, a, t)                                                \
+    do                                                                 \
+    {                                                                  \
+       t  = ((x) & RB_MASK) * (a);                                     \
+       t += RB_ONE_HALF;                                               \
+       x = (t + ((t >> G_SHIFT) & RB_MASK)) >> G_SHIFT;                \
+       x &= RB_MASK;                                                   \
     } while (0)
 
 /*
-  x_c = (x_c * a) / 255 + y
-*/
-#define FbByteMulAdd(x, a, y) do {                                      \
-        /* multiply and divide: trunc((i + 128)*257/65536) */           \
-        comp4_t t = ((x & RB_MASK) * a) + RB_ONE_HALF;                  \
-        t = (t + ((t >> COMPONENT_SIZE) & RB_MASK)) >> COMPONENT_SIZE;  \
-        t &= RB_MASK;                                                   \
-                                                                        \
-        /* add */                                                       \
-        t += y & RB_MASK;                                               \
-                                                                        \
-        /* saturate */                                                  \
-        t |= RB_MASK_PLUS_ONE - ((t >> COMPONENT_SIZE) & RB_MASK);      \
-        t &= RB_MASK;                                                   \
-                                                                        \
-        /* multiply and divide */                                       \
-        x = (((x >> COMPONENT_SIZE) & RB_MASK) * a) + RB_ONE_HALF;      \
-        x = (x + ((x >> COMPONENT_SIZE) & RB_MASK)) >> COMPONENT_SIZE;  \
-        x &= RB_MASK;                                                   \
-                                                                        \
-        /* add */                                                       \
-        x += (y >> COMPONENT_SIZE) & RB_MASK;                           \
-                                                                        \
-        /* saturate */                                                  \
-        x |= RB_MASK_PLUS_ONE - ((x >> COMPONENT_SIZE) & RB_MASK);      \
-        x &= RB_MASK;                                                   \
-                                                                        \
-        /* recombine */                                                 \
-        x <<= COMPONENT_SIZE;                                           \
-        x += t;                                                         \
+ * x_rb = min (x_rb + y_rb, 255)
+ */
+#define UNc_rb_ADD_UNc_rb(x, y, t)                                     \
+    do                                                                 \
+    {                                                                  \
+       t = ((x) + (y));                                                \
+       t |= RB_MASK_PLUS_ONE - ((t >> G_SHIFT) & RB_MASK);             \
+       x = (t & RB_MASK);                                              \
     } while (0)
 
 /*
-  x_c = (x_c * a + y_c * b) / 255
-*/
-#define FbByteAddMul(x, a, y, b) do {                                   \
-        comp4_t t;                                                      \
-        comp4_t r = (x >> A_SHIFT) * a + (y >> A_SHIFT) * b + ONE_HALF; \
-        r += (r >> G_SHIFT);                                            \
-        r >>= G_SHIFT;                                                  \
-                                                                        \
-        t = (x & G_MASK) * a + (y & G_MASK) * b;                        \
-        t += (t >> G_SHIFT) + (ONE_HALF << G_SHIFT);                    \
-        t >>= R_SHIFT;                                                  \
-                                                                        \
-        t |= r << R_SHIFT;                                              \
-        t |= RB_MASK_PLUS_ONE - ((t >> G_SHIFT) & RB_MASK);             \
-        t &= RB_MASK;                                                   \
-        t <<= G_SHIFT;                                                  \
-                                                                        \
-        r = ((x >> R_SHIFT) & MASK) * a +                               \
-            ((y >> R_SHIFT) & MASK) * b + ONE_HALF;                     \
-        r += (r >> G_SHIFT);                                            \
-        r >>= G_SHIFT;                                                  \
-                                                                        \
-        x = (x & MASK) * a + (y & MASK) * b + ONE_HALF;                 \
-        x += (x >> G_SHIFT);                                            \
-        x >>= G_SHIFT;                                                  \
-        x |= r << R_SHIFT;                                              \
-        x |= RB_MASK_PLUS_ONE - ((x >> G_SHIFT) & RB_MASK);             \
-        x &= RB_MASK;                                                   \
-        x |= t;                                                         \
+ * x_rb = (x_rb * a_rb) / 255
+ */
+#define UNc_rb_MUL_UNc_rb(x, a, t)                                     \
+    do                                                                 \
+    {                                                                  \
+       t  = (x & MASK) * (a & MASK);                                   \
+       t |= (x & R_MASK) * ((a >> R_SHIFT) & MASK);                    \
+       t += RB_ONE_HALF;                                               \
+       t = (t + ((t >> G_SHIFT) & RB_MASK)) >> G_SHIFT;                \
+       x = t & RB_MASK;                                                \
     } while (0)
 
 /*
-  x_c = (x_c * a_c) / 255
-*/
-#define FbByteMulC(x, a) do {                                           \
-        comp4_t t;                                                      \
-        comp4_t r = (x & MASK) * (a & MASK);                            \
-        r |= (x & R_MASK) * ((a >> R_SHIFT) & MASK);                    \
-        r += RB_ONE_HALF;                                               \
-        r = (r + ((r >> G_SHIFT) & RB_MASK)) >> G_SHIFT;                \
-        r &= RB_MASK;                                                   \
-                                                                        \
-        x >>= G_SHIFT;                                                  \
-        t = (x & MASK) * ((a >> G_SHIFT) & MASK);                       \
-        t |= (x & R_MASK) * (a >> A_SHIFT);                             \
-        t += RB_ONE_HALF;                                               \
-        t = t + ((t >> G_SHIFT) & RB_MASK);                             \
-        x = r | (t & AG_MASK);                                          \
+ * x_c = (x_c * a) / 255
+ */
+#define UNcx4_MUL_UNc(x, a)                                            \
+    do                                                                 \
+    {                                                                  \
+       comp4_t r1__, r2__, t__;                                        \
+                                                                       \
+       r1__ = (x);                                                     \
+       UNc_rb_MUL_UNc (r1__, (a), t__);                                \
+                                                                       \
+       r2__ = (x) >> G_SHIFT;                                          \
+       UNc_rb_MUL_UNc (r2__, (a), t__);                                \
+                                                                       \
+       (x) = r1__ | (r2__ << G_SHIFT);                                 \
     } while (0)
 
 /*
-  x_c = (x_c * a) / 255 + y
-*/
-#define FbByteMulAddC(x, a, y) do {                                     \
-        comp4_t t;                                                      \
-        comp4_t r = (x & MASK) * (a & MASK);                            \
-        r |= (x & R_MASK) * ((a >> R_SHIFT) & MASK);                    \
-        r += RB_ONE_HALF;                                               \
-        r = (r + ((r >> G_SHIFT) & RB_MASK)) >> G_SHIFT;                \
-        r &= RB_MASK;                                                   \
-        r += y & RB_MASK;                                               \
-        r |= RB_MASK_PLUS_ONE - ((r >> G_SHIFT) & RB_MASK);             \
-        r &= RB_MASK;                                                   \
-                                                                        \
-        x >>= G_SHIFT;                                                  \
-        t = (x & MASK) * ((a >> G_SHIFT) & MASK);                       \
-        t |= (x & R_MASK) * (a >> A_SHIFT);                             \
-        t += RB_ONE_HALF;                                               \
-        t = (t + ((t >> G_SHIFT) & RB_MASK)) >> G_SHIFT;                \
-        t &= RB_MASK;                                                   \
-        t += (y >> G_SHIFT) & RB_MASK;                                  \
-        t |= RB_MASK_PLUS_ONE - ((t >> G_SHIFT) & RB_MASK);             \
-        t &= RB_MASK;                                                   \
-        x = r | (t << G_SHIFT);                                         \
+ * x_c = (x_c * a) / 255 + y_c
+ */
+#define UNcx4_MUL_UNc_ADD_UNcx4(x, a, y)                               \
+    do                                                                 \
+    {                                                                  \
+       comp4_t r1__, r2__, r3__, t__;                                  \
+                                                                       \
+       r1__ = (x);                                                     \
+       r2__ = (y) & RB_MASK;                                           \
+       UNc_rb_MUL_UNc (r1__, (a), t__);                                \
+       UNc_rb_ADD_UNc_rb (r1__, r2__, t__);                            \
+                                                                       \
+       r2__ = (x) >> G_SHIFT;                                          \
+       r3__ = ((y) >> G_SHIFT) & RB_MASK;                              \
+       UNc_rb_MUL_UNc (r2__, (a), t__);                                \
+       UNc_rb_ADD_UNc_rb (r2__, r3__, t__);                            \
+                                                                       \
+       (x) = r1__ | (r2__ << G_SHIFT);                                 \
     } while (0)
 
 /*
-  x_c = (x_c * a_c + y_c * b) / 255
-*/
-#define FbByteAddMulC(x, a, y, b) do {                                  \
-        comp4_t t;                                                      \
-        comp4_t r = (x >> A_SHIFT) * (a >> A_SHIFT) +                   \
-                     (y >> A_SHIFT) * b;                                \
-        r += (r >> G_SHIFT) + ONE_HALF;                                 \
-        r >>= G_SHIFT;                                                  \
-                                                                        \
-        t = (x & G_MASK) * ((a >> G_SHIFT) & MASK) + (y & G_MASK) * b;  \
-        t += (t >> G_SHIFT) + (ONE_HALF << G_SHIFT);                    \
-        t >>= R_SHIFT;                                                  \
-                                                                        \
-        t |= r << R_SHIFT;                                              \
-        t |= RB_MASK_PLUS_ONE - ((t >> G_SHIFT) & RB_MASK);             \
-        t &= RB_MASK;                                                   \
-        t <<= G_SHIFT;                                                  \
-                                                                        \
-        r = ((x >> R_SHIFT) & MASK) * ((a >> R_SHIFT) & MASK) +         \
-            ((y >> R_SHIFT) & MASK) * b + ONE_HALF;                     \
-        r += (r >> G_SHIFT);                                            \
-        r >>= G_SHIFT;                                                  \
-                                                                        \
-        x = (x & MASK) * (a & MASK) + (y & MASK) * b + ONE_HALF;        \
-        x += (x >> G_SHIFT);                                            \
-        x >>= G_SHIFT;                                                  \
-        x |= r << R_SHIFT;                                              \
-        x |= RB_MASK_PLUS_ONE - ((x >> G_SHIFT) & RB_MASK);             \
-        x &= RB_MASK;                                                   \
-        x |= t;                                                         \
+ * x_c = (x_c * a + y_c * b) / 255
+ */
+#define UNcx4_MUL_UNc_ADD_UNcx4_MUL_UNc(x, a, y, b)                    \
+    do                                                                 \
+    {                                                                  \
+       comp4_t r1__, r2__, r3__, t__;                                  \
+                                                                       \
+       r1__ = (x);                                                     \
+       r2__ = (y);                                                     \
+       UNc_rb_MUL_UNc (r1__, (a), t__);                                \
+       UNc_rb_MUL_UNc (r2__, (b), t__);                                \
+       UNc_rb_ADD_UNc_rb (r1__, r2__, t__);                            \
+                                                                       \
+       r2__ = ((x) >> G_SHIFT);                                        \
+       r3__ = ((y) >> G_SHIFT);                                        \
+       UNc_rb_MUL_UNc (r2__, (a), t__);                                \
+       UNc_rb_MUL_UNc (r3__, (b), t__);                                \
+       UNc_rb_ADD_UNc_rb (r2__, r3__, t__);                            \
+                                                                       \
+       (x) = r1__ | (r2__ << G_SHIFT);                                 \
+    } while (0)
+
+/*
+ * x_c = (x_c * a_c) / 255
+ */
+#define UNcx4_MUL_UNcx4(x, a)                                          \
+    do                                                                 \
+    {                                                                  \
+       comp4_t r1__, r2__, r3__, t__;                                  \
+                                                                       \
+       r1__ = (x);                                                     \
+       r2__ = (a);                                                     \
+       UNc_rb_MUL_UNc_rb (r1__, r2__, t__);                            \
+                                                                       \
+       r2__ = (x) >> G_SHIFT;                                          \
+       r3__ = (a) >> G_SHIFT;                                          \
+       UNc_rb_MUL_UNc_rb (r2__, r3__, t__);                            \
+                                                                       \
+       (x) = r1__ | (r2__ << G_SHIFT);                                 \
+    } while (0)
+
+/*
+ * x_c = (x_c * a_c) / 255 + y_c
+ */
+#define UNcx4_MUL_UNcx4_ADD_UNcx4(x, a, y)                             \
+    do                                                                 \
+    {                                                                  \
+       comp4_t r1__, r2__, r3__, t__;                                  \
+                                                                       \
+       r1__ = (x);                                                     \
+       r2__ = (a);                                                     \
+       UNc_rb_MUL_UNc_rb (r1__, r2__, t__);                            \
+       r2__ = (y) & RB_MASK;                                           \
+       UNc_rb_ADD_UNc_rb (r1__, r2__, t__);                            \
+                                                                       \
+       r2__ = ((x) >> G_SHIFT);                                        \
+       r3__ = ((a) >> G_SHIFT);                                        \
+       UNc_rb_MUL_UNc_rb (r2__, r3__, t__);                            \
+       r3__ = ((y) >> G_SHIFT) & RB_MASK;                              \
+       UNc_rb_ADD_UNc_rb (r2__, r3__, t__);                            \
+                                                                       \
+       (x) = r1__ | (r2__ << G_SHIFT);                                 \
+    } while (0)
+
+/*
+ * x_c = (x_c * a_c + y_c * b) / 255
+ */
+#define UNcx4_MUL_UNcx4_ADD_UNcx4_MUL_UNc(x, a, y, b)                  \
+    do                                                                 \
+    {                                                                  \
+       comp4_t r1__, r2__, r3__, t__;                                  \
+                                                                       \
+       r1__ = (x);                                                     \
+       r2__ = (a);                                                     \
+       UNc_rb_MUL_UNc_rb (r1__, r2__, t__);                            \
+       r2__ = (y);                                                     \
+       UNc_rb_MUL_UNc (r2__, (b), t__);                                \
+       UNc_rb_ADD_UNc_rb (r1__, r2__, t__);                            \
+                                                                       \
+       r2__ = (x) >> G_SHIFT;                                          \
+       r3__ = (a) >> G_SHIFT;                                          \
+       UNc_rb_MUL_UNc_rb (r2__, r3__, t__);                            \
+       r3__ = (y) >> G_SHIFT;                                          \
+       UNc_rb_MUL_UNc (r3__, (b), t__);                                \
+       UNc_rb_ADD_UNc_rb (r2__, r3__, t__);                            \
+                                                                       \
+       x = r1__ | (r2__ << G_SHIFT);                                   \
     } while (0)
 
 /*
   x_c = min(x_c + y_c, 255)
 */
-#define FbByteAdd(x, y) do {                                            \
-        comp4_t t;                                                      \
-        comp4_t r = (x & RB_MASK) + (y & RB_MASK);                      \
-        r |= RB_MASK_PLUS_ONE - ((r >> G_SHIFT) & RB_MASK);             \
-        r &= RB_MASK;                                                   \
-                                                                        \
-        t = ((x >> G_SHIFT) & RB_MASK) + ((y >> G_SHIFT) & RB_MASK);    \
-        t |= RB_MASK_PLUS_ONE - ((t >> G_SHIFT) & RB_MASK);             \
-        r |= (t & RB_MASK) << G_SHIFT;                                  \
-        x = r;                                                          \
+#define UNcx4_ADD_UNcx4(x, y)                                          \
+    do                                                                 \
+    {                                                                  \
+       comp4_t r1__, r2__, r3__, t__;                                  \
+                                                                       \
+       r1__ = (x) & RB_MASK;                                           \
+       r2__ = (y) & RB_MASK;                                           \
+       UNc_rb_ADD_UNc_rb (r1__, r2__, t__);                            \
+                                                                       \
+       r2__ = ((x) >> G_SHIFT) & RB_MASK;                              \
+       r3__ = ((y) >> G_SHIFT) & RB_MASK;                              \
+       UNc_rb_ADD_UNc_rb (r2__, r3__, t__);                            \
+                                                                       \
+       x = r1__ | (r2__ << G_SHIFT);                                   \
     } while (0)
-