Branchless code for interlacing a texture
Mathias Gumz akira at fluxbox dot org
1 files changed,
15 insertions(+),
25 deletions(-)
jump to
M
src/FbTk/TextureRender.cc
→
src/FbTk/TextureRender.cc
@@ -85,12 +85,14 @@ color.g = PRE_MULTIPLY_0_75[color.g];
color.b = PRE_MULTIPLY_0_75[color.b]; } + static void noop(RGBA& color) { } typedef void (*colorFunc)(RGBA&); - static const colorFunc pseudoInterlaceFuncs[2]; + static const colorFunc pseudoInterlaceFuncs[3]; }; -const RGBA::colorFunc RGBA::pseudoInterlaceFuncs[2] = { +const RGBA::colorFunc RGBA::pseudoInterlaceFuncs[3] = { + RGBA::noop, RGBA::brighten_4, RGBA::darken };@@ -233,12 +235,11 @@ //
size_t half_size = (size >> 1) + (size & 1); prepare(half_size, &rgba[0], from, to, scale); - mirrorRGB(size, 1, rgba); // TODO!! + mirrorRGB(size, 1, rgba); } - -inline void pseudoInterlace(FbTk::RGBA& rgba, const size_t& y) { - FbTk::RGBA::pseudoInterlaceFuncs[y & 1](rgba); +inline void pseudoInterlace(FbTk::RGBA& rgba, const bool& do_interlace, const size_t& y) { + FbTk::RGBA::pseudoInterlaceFuncs[do_interlace + (do_interlace * (y & 1))](rgba); }@@ -367,11 +368,8 @@ size_t i;
for (i = 0, y = 0; y < height; ++y) { for (x = 0; x < width; ++x, ++i) { - rgba[i] = gradient[x]; - - if (interlaced) - pseudoInterlace(rgba[i], y); + pseudoInterlace(rgba[i], interlaced, y); } } }@@ -392,9 +390,7 @@
for (i = 0, y = 0; y < height; ++y) { for (x = 0; x < width; ++x, ++i) { rgba[i] = gradient[y]; - - if (interlaced) - pseudoInterlace(rgba[i], y); + pseudoInterlace(rgba[i], interlaced, y); } } }@@ -427,8 +423,7 @@ rgba[i].r = x_gradient[x].r + y_gradient[y].r;
rgba[i].g = x_gradient[x].g + y_gradient[y].g; rgba[i].b = x_gradient[x].b + y_gradient[y].b; - if (interlaced) - pseudoInterlace(rgba[i], y); + pseudoInterlace(rgba[i], interlaced, y); } } }@@ -482,8 +477,7 @@ } else {
rgba[i] = y_gradient[y]; } - if (interlaced) - pseudoInterlace(rgba[i], y); + pseudoInterlace(rgba[i], interlaced, y); } } }@@ -525,8 +519,7 @@ } else {
rgba[i] = y_gradient[y]; } - if (interlaced) - pseudoInterlace(rgba[i], y); + pseudoInterlace(rgba[i], interlaced, y); } } }@@ -562,8 +555,7 @@ rgba[i].r = x_gradient[x].r + y_gradient[y].r;
rgba[i].g = x_gradient[x].g + y_gradient[y].g; rgba[i].b = x_gradient[x].b + y_gradient[y].b; - if (interlaced) - pseudoInterlace(rgba[i], y); + pseudoInterlace(rgba[i], interlaced, y); } } }@@ -608,8 +600,7 @@ rgba[i].r = (unsigned char)(r - (d * dr));
rgba[i].g = (unsigned char)(g - (d * dg)); rgba[i].b = (unsigned char)(b - (d * db)); - if (interlaced) - pseudoInterlace(rgba[i], y); + pseudoInterlace(rgba[i], interlaced, y); } } }@@ -643,8 +634,7 @@ rgba[i].r = x_gradient[x].r + y_gradient[y].r;
rgba[i].g = x_gradient[x].g + y_gradient[y].g; rgba[i].b = x_gradient[x].b + y_gradient[y].b; - if (interlaced) - pseudoInterlace(rgba[i], y); + pseudoInterlace(rgba[i], interlaced, y); } } }