diff options
Diffstat (limited to 'src/lib/blend.c')
-rw-r--r-- | src/lib/blend.c | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/src/lib/blend.c b/src/lib/blend.c index 76b6d04..648caea 100644 --- a/src/lib/blend.c +++ b/src/lib/blend.c @@ -20,17 +20,18 @@ RESHADE_COLOR(G_VAL(dest), g, G_VAL(dest)); \ RESHADE_COLOR(B_VAL(dest), b, B_VAL(dest)); -int pow_lut_initialized = 0; DATA8 pow_lut[256][256]; void __imlib_build_pow_lut(void) { + static char _pow_lut_initialized = 0; int i, j; - if (pow_lut_initialized) + if (_pow_lut_initialized) return; - pow_lut_initialized = 1; + _pow_lut_initialized = 1; + for (i = 0; i < 256; i++) { for (j = 0; j < 256; j++) @@ -1515,7 +1516,7 @@ __imlib_GetBlendFunction(ImlibOp op, char blend, char merge_alpha, char rgb_src, ImlibColorModifier * cm) { /*\ [ mmx ][ operation ][ cmod ][ merge_alpha ][ rgb_src ][ blend ] \ */ - static ImlibBlendFunction ibfuncs[][4][2][2][2][2] = { + static const ImlibBlendFunction ibfuncs[][4][2][2][2][2] = { /*\ OP_COPY \ */ {{{{{__imlib_CopyRGBAToRGB, __imlib_BlendRGBAToRGB}, {__imlib_CopyRGBToRGB, __imlib_BlendRGBToRGB}}, @@ -1714,12 +1715,10 @@ __imlib_GetBlendFunction(ImlibOp op, char blend, char merge_alpha, char rgb_src, #endif }; - int opi = (op == OP_COPY) ? 0 - : (op == OP_ADD) ? 1 - : (op == OP_SUBTRACT) ? 2 : (op == OP_RESHADE) ? 3 : -1; + ImlibBlendFunction bfun; int do_mmx = 0; - if (opi == -1) + if (op < OP_COPY || op > OP_RESHADE) return NULL; #ifdef DO_MMX_ASM @@ -1727,11 +1726,15 @@ __imlib_GetBlendFunction(ImlibOp op, char blend, char merge_alpha, char rgb_src, #elif DO_AMD64_ASM do_mmx = 1; // instruction set is always present #endif + if (cm && rgb_src && (A_CMOD(cm, 0xff) == 0xff)) blend = 0; if (blend && cm && rgb_src && (A_CMOD(cm, 0xff) == 0)) return NULL; - return ibfuncs[!!do_mmx][opi][!!cm][!!merge_alpha][!!rgb_src][!!blend]; + + bfun = ibfuncs[!!do_mmx][op][!!cm][!!merge_alpha][!!rgb_src][!!blend]; + + return bfun; } void |