summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann Pedersen <ssp@redhat.com>2010-09-17 11:46:36 -0400
committerAndrea Canciani <ranma42@gmail.com>2010-12-13 17:22:36 +0100
commit7d81e07d732380eebe31b086863d945c3cb33ce5 (patch)
tree67c53b1e152d44ccf141bc34b04a9f4504d78fd1
parent47862b0abd7391a661628379d668bedaefdc3bcf (diff)
Split inner loop of Porter/Duff combiners out in an inline function rather than generating it in the macro
-rw-r--r--pixman/pixman-combine-float.c149
1 files changed, 80 insertions, 69 deletions
diff --git a/pixman/pixman-combine-float.c b/pixman/pixman-combine-float.c
index 484c77e..f58ce84 100644
--- a/pixman/pixman-combine-float.c
+++ b/pixman/pixman-combine-float.c
@@ -35,6 +35,84 @@
#define IS_ZERO(f) ((f) == 0.0f) /* FIXME? */
+typedef float (* combine_channel_t) (float sa, float s, float da, float d);
+
+static force_inline void
+combine_inner (pixman_bool_t component,
+ float *dest, const float *src, const float *mask, int n_pixels,
+ combine_channel_t combine_a, combine_channel_t combine_c)
+{
+ int i;
+
+ if (!mask)
+ {
+ for (i = 0; i < 4 * n_pixels; i += 4)
+ {
+ float sa = src[i + 0];
+ float sr = src[i + 1];
+ float sg = src[i + 2];
+ float sb = src[i + 3];
+
+ float da = dest[i + 0];
+ float dr = dest[i + 1];
+ float dg = dest[i + 2];
+ float db = dest[i + 3];
+
+ dest[i + 0] = combine_a (sa, sa, da, da);
+ dest[i + 1] = combine_c (sa, sr, da, dr);
+ dest[i + 2] = combine_c (sa, sg, da, dg);
+ dest[i + 3] = combine_c (sa, sb, da, db);
+ }
+ }
+ else
+ {
+ for (i = 0; i < 4 * n_pixels; i += 4)
+ {
+ float sa, sr, sg, sb;
+ float ma, mr, mg, mb;
+ float da, dr, dg, db;
+
+ sa = src[i + 0];
+ sr = src[i + 1];
+ sg = src[i + 2];
+ sb = src[i + 3];
+
+ if (component)
+ {
+ ma = mask[i + 0];
+ mr = mask[i + 1];
+ mg = mask[i + 2];
+ mb = mask[i + 3];
+
+ sr *= mr;
+ sg *= mg;
+ sb *= mb;
+
+ ma *= sa;
+ mr *= sa;
+ mg *= sa;
+ mb *= sa;
+
+ sa = ma;
+ }
+ else
+ {
+ ma = mr = mg = mb = sa = mask[i + 0] * sa;
+ }
+
+ da = dest[i + 0];
+ dr = dest[i + 1];
+ dg = dest[i + 2];
+ db = dest[i + 3];
+
+ dest[i + 0] = combine_a (ma, sa, da, da);
+ dest[i + 1] = combine_c (mr, sr, da, dr);
+ dest[i + 2] = combine_c (mg, sg, da, dg);
+ dest[i + 3] = combine_c (mb, sb, da, db);
+ }
+ }
+}
+
#define MAKE_COMBINER(name, component, combine_a, combine_c) \
static void \
combine_ ## name ## _float (pixman_implementation_t *imp, \
@@ -44,75 +122,8 @@
const float *mask, \
int n_pixels) \
{ \
- int i; \
- \
- if (!mask) \
- { \
- for (i = 0; i < 4 * n_pixels; i += 4) \
- { \
- float sa = src[i + 0]; \
- float sr = src[i + 1]; \
- float sg = src[i + 2]; \
- float sb = src[i + 3]; \
- \
- float da = dest[i + 0]; \
- float dr = dest[i + 1]; \
- float dg = dest[i + 2]; \
- float db = dest[i + 3]; \
- \
- dest[i + 0] = combine_a (sa, sa, da, da); \
- dest[i + 1] = combine_c (sa, sr, da, dr); \
- dest[i + 2] = combine_c (sa, sg, da, dg); \
- dest[i + 3] = combine_c (sa, sb, da, db); \
- } \
- } \
- else \
- { \
- for (i = 0; i < 4 * n_pixels; i += 4) \
- { \
- float sa, sr, sg, sb; \
- float ma, mr, mg, mb; \
- float da, dr, dg, db; \
- \
- sa = src[i + 0]; \
- sr = src[i + 1]; \
- sg = src[i + 2]; \
- sb = src[i + 3]; \
- \
- if (component) \
- { \
- ma = mask[i + 0]; \
- mr = mask[i + 1]; \
- mg = mask[i + 2]; \
- mb = mask[i + 3]; \
- \
- sr *= mr; \
- sg *= mg; \
- sb *= mb; \
- \
- ma *= sa; \
- mr *= sa; \
- mg *= sa; \
- mb *= sa; \
- \
- sa = ma; \
- } \
- else \
- { \
- ma = mr = mg = mb = sa = mask[i + 0] * sa; \
- } \
- \
- da = dest[i + 0]; \
- dr = dest[i + 1]; \
- dg = dest[i + 2]; \
- db = dest[i + 3]; \
- \
- dest[i + 0] = combine_a (ma, sa, da, da); \
- dest[i + 1] = combine_c (mr, sr, da, dr); \
- dest[i + 2] = combine_c (mg, sg, da, dg); \
- dest[i + 3] = combine_c (mb, sb, da, db); \
- } \
- } \
+ combine_inner (component, dest, src, mask, n_pixels, \
+ combine_a, combine_c); \
}
#define MAKE_COMBINERS(name, combine_a, combine_c) \