diff options
author | Søren Sandmann Pedersen <ssp@redhat.com> | 2010-09-17 11:46:36 -0400 |
---|---|---|
committer | Andrea Canciani <ranma42@gmail.com> | 2010-12-13 17:22:36 +0100 |
commit | 7d81e07d732380eebe31b086863d945c3cb33ce5 (patch) | |
tree | 67c53b1e152d44ccf141bc34b04a9f4504d78fd1 | |
parent | 47862b0abd7391a661628379d668bedaefdc3bcf (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.c | 149 |
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) \ |