diff --git a/src/blend.c b/src/blend.c index 8e39864..75fd546 100644 --- a/src/blend.c +++ b/src/blend.c @@ -31,7 +31,7 @@ /* Add tmp calculation variable. */ #define LOOP_START_0 \ - int tmp; \ + DATA32 tmp; \ LOOP_START /* Add variables to read pixel colors (no alpha) */ @@ -60,39 +60,6 @@ p2++; \ LOOP_END -/* - * These macros are handy for reading/writing pixel color information from/to - * packed integers. The packed ordering of both the input and output images - * is assumed to be ARGB. - */ - -/************************************************************************ - * ********************************************************************** -#define READ_RGB(p, r, g, b) \ - (r) = (*(p) >> 16) & 0xff; \ - (g) = (*(p) >> 8 ) & 0xff; \ - (b) = (*(p) ) & 0xff; - -#define READ_ALPHA(p, a) \ - (a) = ((*(p)) >> 24) & 0xff; - -#define READ_RGBA(p, r, g, b, a) \ - (a) = (*(p) >> 24) & 0xff; \ - (r) = (*(p) >> 16) & 0xff; \ - (g) = (*(p) >> 8 ) & 0xff; \ - (b) = (*(p) ) & 0xff; - -#define WRITE_RGB(p, r, g, b) \ - *(p) = ((r) << 16) | ((g) << 8) | (b); - -#define WRITE_RGB_PRESERVE_ALPHA(p, r, g, b) \ - *(p) = (*(p) & 0xff000000) | ((r) << 16) | ((g) << 8) | (b); - -#define WRITE_RGBA(p, r, g, b, a) \ - *(p) = ((a) << 24) | ((r) << 16) | ((g) << 8) | (b); - * ********************************************************************** -*************************************************************************/ - /* COPY OPS */ static void @@ -111,15 +78,11 @@ __imlib_BlendRGBAToRGB(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, "r" (p1), "r" (p2) }; -#else - READ_RGBA(p1, r, g, b, a); - READ_RGB(p2, rr, gg, bb); - - BLEND_COLOR(a, nr, r, rr); - BLEND_COLOR(a, ng, g, gg); - BLEND_COLOR(a, nb, b, bb); - - WRITE_RGB_PRESERVE_ALPHA(p2, nr, ng, nb); +#else + a = A_VAL(p1); + BLEND_COLOR(a, R_VAL(p2), R_VAL(p1), R_VAL(p2)); + BLEND_COLOR(a, G_VAL(p2), G_VAL(p1), G_VAL(p2)); + BLEND_COLOR(a, B_VAL(p2), B_VAL(p1), B_VAL(p2)); #endif LOOP_END_WITH_INCREMENT } @@ -130,16 +93,12 @@ __imlib_BlendRGBAToRGBA(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, { LOOP_START_3 - READ_RGBA(p1, r, g, b, a); - READ_RGBA(p2, rr, gg, bb, aa); - - BLEND_COLOR(a, nr, r, rr); - BLEND_COLOR(a, ng, g, gg); - BLEND_COLOR(a, nb, b, bb); - SATURATE_UPPER(na, a + aa); - - WRITE_RGBA(p2, nr, ng, nb, na); - + a = A_VAL(p1); + BLEND_COLOR(a, R_VAL(p2), R_VAL(p1), R_VAL(p2)); + BLEND_COLOR(a, G_VAL(p2), G_VAL(p1), G_VAL(p2)); + BLEND_COLOR(a, B_VAL(p2), B_VAL(p1), B_VAL(p2)); + SATURATE_UPPER(A_VAL(p2), a + A_VAL(p2)); + LOOP_END_WITH_INCREMENT } @@ -174,18 +133,10 @@ __imlib_AddBlendRGBAToRGB(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, { LOOP_START_2 - READ_ALPHA(p1, a); - if (a > 0) - { - READ_RGB(p1, r, g, b ); - READ_RGB(p2, rr, gg, bb); - - ADD_COLOR_WITH_ALPHA(a, nr, r, rr); - ADD_COLOR_WITH_ALPHA(a, ng, g, gg); - ADD_COLOR_WITH_ALPHA(a, nb, b, bb); - - WRITE_RGB_PRESERVE_ALPHA(p2, nr, ng, nb); - } + a = A_VAL(p1); + ADD_COLOR_WITH_ALPHA(a, R_VAL(p2), R_VAL(p1), R_VAL(p2)); + ADD_COLOR_WITH_ALPHA(a, G_VAL(p2), G_VAL(p1), G_VAL(p2)); + ADD_COLOR_WITH_ALPHA(a, B_VAL(p2), B_VAL(p1), B_VAL(p2)); LOOP_END_WITH_INCREMENT } @@ -196,19 +147,11 @@ __imlib_AddBlendRGBAToRGBA(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, { LOOP_START_3 - READ_ALPHA(p1, a); - if (a > 0) - { - READ_RGB (p1, r, g, b ); - READ_RGBA(p2, rr, gg, bb, aa); - - ADD_COLOR_WITH_ALPHA(a, nr, r, rr); - ADD_COLOR_WITH_ALPHA(a, ng, g, gg); - ADD_COLOR_WITH_ALPHA(a, nb, b, bb); - SATURATE_UPPER(na, a + aa); - - WRITE_RGBA(p2, nr, ng, nb, na); - } + a = A_VAL(p1); + ADD_COLOR_WITH_ALPHA(a, R_VAL(p2), R_VAL(p1), R_VAL(p2)); + ADD_COLOR_WITH_ALPHA(a, G_VAL(p2), G_VAL(p1), G_VAL(p2)); + ADD_COLOR_WITH_ALPHA(a, B_VAL(p2), B_VAL(p1), B_VAL(p2)); + SATURATE_UPPER(A_VAL(p2), a + A_VAL(p2)); LOOP_END_WITH_INCREMENT } @@ -219,14 +162,9 @@ __imlib_AddCopyRGBAToRGB(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, { LOOP_START_1 - READ_RGB(p1, r, g, b ); - READ_RGB(p2, rr, gg, bb); - - ADD_COLOR(nr, r, rr); - ADD_COLOR(ng, g, gg); - ADD_COLOR(nb, b, bb); - - WRITE_RGB_PRESERVE_ALPHA(p2, nr, ng, nb); + ADD_COLOR(R_VAL(p2), R_VAL(p1), R_VAL(p2)); + ADD_COLOR(G_VAL(p2), G_VAL(p1), G_VAL(p2)); + ADD_COLOR(B_VAL(p2), B_VAL(p1), B_VAL(p2)); LOOP_END_WITH_INCREMENT } @@ -237,15 +175,10 @@ __imlib_AddCopyRGBAToRGBA(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, { LOOP_START_3 - READ_RGBA(p1, r, g, b , a ); - READ_RGBA(p2, rr, gg, bb, aa); - - ADD_COLOR(nr, r, rr); - ADD_COLOR(ng, g, gg); - ADD_COLOR(nb, b, bb); - SATURATE_UPPER(na, a + aa); - - WRITE_RGBA(p2, nr, ng, nb, na); + ADD_COLOR(R_VAL(p2), R_VAL(p1), R_VAL(p2)); + ADD_COLOR(G_VAL(p2), G_VAL(p1), G_VAL(p2)); + ADD_COLOR(B_VAL(p2), B_VAL(p1), B_VAL(p2)); + SATURATE_UPPER(A_VAL(p2), a + A_VAL(p2)); LOOP_END_WITH_INCREMENT } @@ -258,18 +191,11 @@ __imlib_SubBlendRGBAToRGB(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, { LOOP_START_2 - READ_ALPHA(p1, a); - if (a > 0) - { - READ_RGB(p1, r, g, b ); - READ_RGB(p2, rr, gg, bb); + a = A_VAL(p1); - SUB_COLOR_WITH_ALPHA(a, nr, r, rr); - SUB_COLOR_WITH_ALPHA(a, ng, g, gg); - SUB_COLOR_WITH_ALPHA(a, nb, b, bb); - - WRITE_RGB_PRESERVE_ALPHA(p2, nr, ng, nb); - } + SUB_COLOR_WITH_ALPHA(a, R_VAL(p2), R_VAL(p1), R_VAL(p2)); + SUB_COLOR_WITH_ALPHA(a, G_VAL(p2), G_VAL(p1), G_VAL(p2)); + SUB_COLOR_WITH_ALPHA(a, B_VAL(p2), B_VAL(p1), B_VAL(p2)); LOOP_END_WITH_INCREMENT } @@ -280,19 +206,12 @@ __imlib_SubBlendRGBAToRGBA(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, { LOOP_START_3 - READ_ALPHA(p1, a); - if (a > 0) - { - READ_RGB (p1, r, g, b ); - READ_RGBA(p2, rr, gg, bb, aa); + a = A_VAL(p1); - SUB_COLOR_WITH_ALPHA(a, nr, r, rr); - SUB_COLOR_WITH_ALPHA(a, ng, g, gg); - SUB_COLOR_WITH_ALPHA(a, nb, b, bb); - SATURATE_UPPER(na, a + aa); - - WRITE_RGBA(p2, nr, ng, nb, na); - } + SUB_COLOR_WITH_ALPHA(a, R_VAL(p2), R_VAL(p1), R_VAL(p2)); + SUB_COLOR_WITH_ALPHA(a, G_VAL(p2), G_VAL(p1), G_VAL(p2)); + SUB_COLOR_WITH_ALPHA(a, B_VAL(p2), B_VAL(p1), B_VAL(p2)); + SATURATE_UPPER(A_VAL(p2), a + A_VAL(p2)); LOOP_END_WITH_INCREMENT } @@ -303,14 +222,9 @@ __imlib_SubCopyRGBAToRGB(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, { LOOP_START_1 - READ_RGB(p1, r, g, b ); - READ_RGB(p2, rr, gg, bb); - - SUB_COLOR(nr, r, rr); - SUB_COLOR(ng, g, gg); - SUB_COLOR(nb, b, bb); - - WRITE_RGB_PRESERVE_ALPHA(p2, nr, ng, nb); + SUB_COLOR(R_VAL(p2), R_VAL(p1), R_VAL(p2)); + SUB_COLOR(G_VAL(p2), G_VAL(p1), G_VAL(p2)); + SUB_COLOR(B_VAL(p2), B_VAL(p1), B_VAL(p2)); LOOP_END_WITH_INCREMENT } @@ -321,15 +235,10 @@ __imlib_SubCopyRGBAToRGBA(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, { LOOP_START_3 - READ_RGBA(p1, r, g, b , a ); - READ_RGBA(p2, rr, gg, bb, aa); - - SUB_COLOR(nr, r, rr); - SUB_COLOR(ng, g, gg); - SUB_COLOR(nb, b, bb); - SATURATE_UPPER(na, a + aa); - - WRITE_RGBA(p2, nr, ng, nb, na); + SUB_COLOR(R_VAL(p2), R_VAL(p1), R_VAL(p2)); + SUB_COLOR(G_VAL(p2), G_VAL(p1), G_VAL(p2)); + SUB_COLOR(B_VAL(p2), B_VAL(p1), B_VAL(p2)); + SATURATE_UPPER(A_VAL(p2), a + A_VAL(p2)); LOOP_END_WITH_INCREMENT } @@ -343,18 +252,13 @@ __imlib_ReBlendRGBAToRGB(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, { LOOP_START_2 - READ_ALPHA(p1, a); - if (a > 0) - { - READ_RGB(p1, r, g, b ); - READ_RGB(p2, rr, gg, bb); + a = A_VAL(p1); - RESHADE_COLOR_WITH_ALPHA(a, nr, r, rr); - RESHADE_COLOR_WITH_ALPHA(a, ng, g, gg); - RESHADE_COLOR_WITH_ALPHA(a, nb, b, bb); - - WRITE_RGB_PRESERVE_ALPHA(p2, nr, ng, nb); - } + RESHADE_COLOR_WITH_ALPHA(a, R_VAL(p2), R_VAL(p1), R_VAL(p2)); + RESHADE_COLOR_WITH_ALPHA(a, G_VAL(p2), G_VAL(p1), G_VAL(p2)); + RESHADE_COLOR_WITH_ALPHA(a, B_VAL(p2), B_VAL(p1), B_VAL(p2)); + + WRITE_RGB_PRESERVE_ALPHA(p2, nr, ng, nb); LOOP_END_WITH_INCREMENT } @@ -365,19 +269,12 @@ __imlib_ReBlendRGBAToRGBA(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, { LOOP_START_3 - READ_ALPHA(p1, a); - if (a > 0) - { - READ_RGB (p1, r, g, b ); - READ_RGBA(p2, rr, gg, bb, aa); - - RESHADE_COLOR_WITH_ALPHA(a, nr, r, rr); - RESHADE_COLOR_WITH_ALPHA(a, ng, g, gg); - RESHADE_COLOR_WITH_ALPHA(a, nb, b, bb); - SATURATE_UPPER(na, a + aa); - - WRITE_RGBA(p2, nr, ng, nb, na); - } + a = A_VAL(p1); + + RESHADE_COLOR_WITH_ALPHA(a, R_VAL(p2), R_VAL(p1), R_VAL(p2)); + RESHADE_COLOR_WITH_ALPHA(a, G_VAL(p2), G_VAL(p1), G_VAL(p2)); + RESHADE_COLOR_WITH_ALPHA(a, B_VAL(p2), B_VAL(p1), B_VAL(p2)); + SATURATE_UPPER(A_VAL(p2), a + A_VAL(p2)); LOOP_END_WITH_INCREMENT } @@ -388,14 +285,9 @@ __imlib_ReCopyRGBAToRGB(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, { LOOP_START_1 - READ_RGB(p1, r, g, b ); - READ_RGB(p2, rr, gg, bb); - - RESHADE_COLOR(nr, r, rr); - RESHADE_COLOR(ng, g, gg); - RESHADE_COLOR(nb, b, bb); - - WRITE_RGB_PRESERVE_ALPHA(p2, nr, ng, nb); + RESHADE_COLOR(R_VAL(p2), R_VAL(p1), R_VAL(p2)); + RESHADE_COLOR(G_VAL(p2), G_VAL(p1), G_VAL(p2)); + RESHADE_COLOR(B_VAL(p2), B_VAL(p1), B_VAL(p2)); LOOP_END_WITH_INCREMENT } @@ -406,15 +298,10 @@ __imlib_ReCopyRGBAToRGBA(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, { LOOP_START_3 - READ_RGBA(p1, r, g, b , a ); - READ_RGBA(p2, rr, gg, bb, aa); - - RESHADE_COLOR(nr, r, rr); - RESHADE_COLOR(ng, g, gg); - RESHADE_COLOR(nb, b, bb); - SATURATE_UPPER(na, a + aa); - - WRITE_RGBA(p2, nr, ng, nb, na); + RESHADE_COLOR(R_VAL(p2), R_VAL(p1), R_VAL(p2)); + RESHADE_COLOR(G_VAL(p2), G_VAL(p1), G_VAL(p2)); + RESHADE_COLOR(B_VAL(p2), B_VAL(p1), B_VAL(p2)); + SATURATE_UPPER(A_VAL(p2), a + A_VAL(p2)); LOOP_END_WITH_INCREMENT } @@ -432,35 +319,24 @@ __imlib_ReCopyRGBAToRGBA(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, -/* COLORMOD COPY OPS */ + + + + + +/* WITH COLOMOD */ +/* COPY OPS */ static void __imlib_BlendRGBAToRGBCmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, - int w, int h, ImlibColorModifier *cm) + int w, int h, ImlibColorModifier *cm) { LOOP_START_2 - READ_ALPHA(p1, a); - CMOD_APPLY_A(cm, a); - if (a == 255) - { - READ_RGB (p1, r, g, b); - CMOD_APPLY_RGB(cm, r, g, b); - WRITE_RGB_PRESERVE_ALPHA(p2, nr, ng, nb); - } - else if (a > 0) - { - READ_RGB (p1, r, g, b); - READ_RGB (p2, rr, gg, bb); - - CMOD_APPLY_RGB(cm, r, g, b); - - BLEND_COLOR(a, nr, r, rr); - BLEND_COLOR(a, ng, g, gg); - BLEND_COLOR(a, nb, b, bb); - - WRITE_RGB_PRESERVE_ALPHA(p2, nr, ng, nb); - } + a = A_CMOD(cm, A_VAL(p1)); + BLEND_COLOR(a, R_VAL(p2), R_CMOD(cm, R_VAL(p1)), R_VAL(p2)); + BLEND_COLOR(a, G_VAL(p2), G_CMOD(cm, G_VAL(p1)), G_VAL(p2)); + BLEND_COLOR(a, B_VAL(p2), B_CMOD(cm, B_VAL(p1)), B_VAL(p2)); LOOP_END_WITH_INCREMENT } @@ -471,61 +347,34 @@ __imlib_BlendRGBAToRGBACmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump { LOOP_START_3 - READ_ALPHA(p1, a); - CMOD_APPLY_A(cm, a); - if (a == 255) - { - READ_RGB (p1, r, g, b); - SATURATE_UPPER(na, a + aa); - CMOD_APPLY_RGB(cm, r, g, b); - WRITE_RGBA(p2, nr, ng, nb, na); - } - else if (a > 0) - { - READ_RGB(p1, r, g, b); - READ_RGBA(p2, rr, gg, bb, aa); - - CMOD_APPLY_RGB(cm, r, g, b); - - BLEND_COLOR(a, nr, r, rr); - BLEND_COLOR(a, ng, g, gg); - BLEND_COLOR(a, nb, b, bb); - SATURATE_UPPER(na, a + aa); - - WRITE_RGBA(p2, nr, ng, nb, na); - } + a = A_CMOD(cm, A_VAL(p1)); + BLEND_COLOR(a, R_VAL(p2), R_CMOD(cm, R_VAL(p1)), R_VAL(p2)); + BLEND_COLOR(a, G_VAL(p2), G_CMOD(cm, G_VAL(p1)), G_VAL(p2)); + BLEND_COLOR(a, B_VAL(p2), B_CMOD(cm, B_VAL(p1)), B_VAL(p2)); + SATURATE_UPPER(A_VAL(p2), a + A_VAL(p2)); LOOP_END_WITH_INCREMENT } static void __imlib_CopyRGBAToRGBCmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, - int w, int h, ImlibColorModifier *cm) + int w, int h, ImlibColorModifier *cm) { - DATA8 r, g, b; LOOP_START - READ_RGB(p1, r, g, b); - - CMOD_APPLY_RGB(cm, r, g, b); - - WRITE_RGB_PRESERVE_ALPHA(p2, r, g, b); + *p2 = (*p2 & 0xff000000) | (*p1 & 0x00ffffff); LOOP_END_WITH_INCREMENT } static void __imlib_CopyRGBAToRGBACmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, - int w, int h, ImlibColorModifier *cm) + int w, int h, ImlibColorModifier *cm) { - DATA8 r, g, b, a; + /* FIXME: This could be a memcpy operation. */ LOOP_START - READ_RGBA(p1, r, g, b, a); - - CMOD_APPLY_RGBA(cm, r, g, b, a); - - WRITE_RGBA(p2, r, g, b, a); + *p2 = *p1; LOOP_END_WITH_INCREMENT } @@ -534,92 +383,56 @@ __imlib_CopyRGBAToRGBACmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, static void __imlib_AddBlendRGBAToRGBCmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, - int w, int h, ImlibColorModifier *cm) + int w, int h, ImlibColorModifier *cm) { LOOP_START_2 - READ_ALPHA(p1, a); - CMOD_APPLY_A(cm, a); - if (a > 0) - { - READ_RGB(p1, r, g, b ); - READ_RGB(p2, rr, gg, bb); - - CMOD_APPLY_RGB(cm, r, g, b); - - ADD_COLOR_WITH_ALPHA(a, nr, r, rr); - ADD_COLOR_WITH_ALPHA(a, ng, g, gg); - ADD_COLOR_WITH_ALPHA(a, nb, b, bb); - - WRITE_RGB_PRESERVE_ALPHA(p2, nr, ng, nb); - } + a = A_CMOD(cm, A_VAL(p1)); + ADD_COLOR_WITH_ALPHA(a, R_VAL(p2), R_CMOD(cm, R_VAL(p1)), R_VAL(p2)); + ADD_COLOR_WITH_ALPHA(a, G_VAL(p2), G_CMOD(cm, G_VAL(p1)), G_VAL(p2)); + ADD_COLOR_WITH_ALPHA(a, B_VAL(p2), B_CMOD(cm, B_VAL(p1)), B_VAL(p2)); LOOP_END_WITH_INCREMENT } static void __imlib_AddBlendRGBAToRGBACmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, - int w, int h, ImlibColorModifier *cm) + int w, int h, ImlibColorModifier *cm) { LOOP_START_3 - READ_ALPHA(p1, a); - CMOD_APPLY_A(cm, a); - if (a > 0) - { - READ_RGB (p1, r, g, b ); - READ_RGBA(p2, rr, gg, bb, aa); - - CMOD_APPLY_RGB(cm, r, g, b); - - ADD_COLOR_WITH_ALPHA(a, nr, r, rr); - ADD_COLOR_WITH_ALPHA(a, ng, g, gg); - ADD_COLOR_WITH_ALPHA(a, nb, b, bb); - SATURATE_UPPER(na, a + aa); - - WRITE_RGBA(p2, nr, ng, nb, na); - } + a = A_CMOD(cm, A_VAL(p1)); + ADD_COLOR_WITH_ALPHA(a, R_VAL(p2), R_CMOD(cm, R_VAL(p1)), R_VAL(p2)); + ADD_COLOR_WITH_ALPHA(a, G_VAL(p2), G_CMOD(cm, G_VAL(p1)), G_VAL(p2)); + ADD_COLOR_WITH_ALPHA(a, B_VAL(p2), B_CMOD(cm, B_VAL(p1)), B_VAL(p2)); + SATURATE_UPPER(A_VAL(p2), a + A_VAL(p2)); LOOP_END_WITH_INCREMENT } static void __imlib_AddCopyRGBAToRGBCmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, - int w, int h, ImlibColorModifier *cm) + int w, int h, ImlibColorModifier *cm) { LOOP_START_1 - READ_RGB(p1, r, g, b ); - READ_RGB(p2, rr, gg, bb); - - CMOD_APPLY_RGB(cm, r, g, b); - - ADD_COLOR(nr, r, rr); - ADD_COLOR(ng, g, gg); - ADD_COLOR(nb, b, bb); - - WRITE_RGB_PRESERVE_ALPHA(p2, nr, ng, nb); + ADD_COLOR(R_VAL(p2), R_CMOD(cm, R_VAL(p1)), R_VAL(p2)); + ADD_COLOR(G_VAL(p2), G_CMOD(cm, G_VAL(p1)), G_VAL(p2)); + ADD_COLOR(B_VAL(p2), B_CMOD(cm, B_VAL(p1)), B_VAL(p2)); LOOP_END_WITH_INCREMENT } static void __imlib_AddCopyRGBAToRGBACmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, - int w, int h, ImlibColorModifier *cm) + int w, int h, ImlibColorModifier *cm) { LOOP_START_3 - READ_RGBA(p1, r, g, b, a); - READ_RGBA(p2, rr, gg, bb, aa); - - CMOD_APPLY_RGBA(cm, r, g, b, a); - - ADD_COLOR(nr, r, rr); - ADD_COLOR(ng, g, gg); - ADD_COLOR(nb, b, bb); - SATURATE_UPPER(na, a + aa); - - WRITE_RGBA(p2, nr, ng, nb, na); + ADD_COLOR(R_VAL(p2), R_CMOD(cm, R_VAL(p1)), R_VAL(p2)); + ADD_COLOR(G_VAL(p2), G_CMOD(cm, G_VAL(p1)), G_VAL(p2)); + ADD_COLOR(B_VAL(p2), B_CMOD(cm, B_VAL(p1)), B_VAL(p2)); + SATURATE_UPPER(A_VAL(p2), a + A_VAL(p2)); LOOP_END_WITH_INCREMENT } @@ -628,92 +441,58 @@ __imlib_AddCopyRGBAToRGBACmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_ju static void __imlib_SubBlendRGBAToRGBCmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, - int w, int h, ImlibColorModifier *cm) + int w, int h, ImlibColorModifier *cm) { LOOP_START_2 - READ_ALPHA(p1, a); - CMOD_APPLY_A(cm, a); - if (a > 0) - { - READ_RGB(p1, r, g, b); - READ_RGB(p2, rr, gg, bb); + a = A_CMOD(cm, A_VAL(p1)); - CMOD_APPLY_RGB(cm, r, g, b); - - SUB_COLOR_WITH_ALPHA(a, nr, r, rr); - SUB_COLOR_WITH_ALPHA(a, ng, g, gg); - SUB_COLOR_WITH_ALPHA(a, nb, b, bb); - - WRITE_RGB_PRESERVE_ALPHA(p2, nr, ng, nb); - } + SUB_COLOR_WITH_ALPHA(a, R_VAL(p2), R_CMOD(cm, R_VAL(p1)), R_VAL(p2)); + SUB_COLOR_WITH_ALPHA(a, G_VAL(p2), G_CMOD(cm, G_VAL(p1)), G_VAL(p2)); + SUB_COLOR_WITH_ALPHA(a, B_VAL(p2), B_CMOD(cm, B_VAL(p1)), B_VAL(p2)); LOOP_END_WITH_INCREMENT } static void __imlib_SubBlendRGBAToRGBACmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, - int w, int h, ImlibColorModifier *cm) + int w, int h, ImlibColorModifier *cm) { LOOP_START_3 - READ_ALPHA(p1, a); - CMOD_APPLY_A(cm, a); - if (a > 0) - { - READ_RGB (p1, r, g, b ); - READ_RGBA(p2, rr, gg, bb, aa); + a = A_CMOD(cm, A_VAL(p1)); - CMOD_APPLY_RGB(cm, r, g, b); - - SUB_COLOR_WITH_ALPHA(a, nr, r, rr); - SUB_COLOR_WITH_ALPHA(a, ng, g, gg); - SUB_COLOR_WITH_ALPHA(a, nb, b, bb); - SATURATE_UPPER(na, a + aa); - - WRITE_RGBA(p2, nr, ng, nb, na); - } + SUB_COLOR_WITH_ALPHA(a, R_VAL(p2), R_CMOD(cm, R_VAL(p1)), R_VAL(p2)); + SUB_COLOR_WITH_ALPHA(a, G_VAL(p2), G_CMOD(cm, G_VAL(p1)), G_VAL(p2)); + SUB_COLOR_WITH_ALPHA(a, B_VAL(p2), B_CMOD(cm, B_VAL(p1)), B_VAL(p2)); + SATURATE_UPPER(A_VAL(p2), a + A_VAL(p2)); LOOP_END_WITH_INCREMENT } static void __imlib_SubCopyRGBAToRGBCmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, - int w, int h, ImlibColorModifier *cm) + int w, int h, ImlibColorModifier *cm) { LOOP_START_1 - READ_RGB(p1, r, g, b ); - READ_RGB(p2, rr, gg, bb); - - CMOD_APPLY_RGB(cm, r, g, b); - - SUB_COLOR(nr, r, rr); - SUB_COLOR(ng, g, gg); - SUB_COLOR(nb, b, bb); - - WRITE_RGB_PRESERVE_ALPHA(p2, nr, ng, nb); + SUB_COLOR(R_VAL(p2), R_CMOD(cm, R_VAL(p1)), R_VAL(p2)); + SUB_COLOR(G_VAL(p2), G_CMOD(cm, G_VAL(p1)), G_VAL(p2)); + SUB_COLOR(B_VAL(p2), B_CMOD(cm, B_VAL(p1)), B_VAL(p2)); LOOP_END_WITH_INCREMENT } static void __imlib_SubCopyRGBAToRGBACmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, - int w, int h, ImlibColorModifier *cm) + int w, int h, ImlibColorModifier *cm) { LOOP_START_3 - READ_RGBA(p1, r, g, b, a); - READ_RGBA(p2, rr, gg, bb, aa); - - CMOD_APPLY_RGBA(cm, r, g, b, a); - - SUB_COLOR(nr, r, rr); - SUB_COLOR(ng, g, gg); - SUB_COLOR(nb, b, bb); - SATURATE_UPPER(na, a + aa); - - WRITE_RGBA(p2, nr, ng, nb, na); + SUB_COLOR(R_VAL(p2), R_CMOD(cm, R_VAL(p1)), R_VAL(p2)); + SUB_COLOR(G_VAL(p2), G_CMOD(cm, G_VAL(p1)), G_VAL(p2)); + SUB_COLOR(B_VAL(p2), B_CMOD(cm, B_VAL(p1)), B_VAL(p2)); + SATURATE_UPPER(A_VAL(p2), a + A_VAL(p2)); LOOP_END_WITH_INCREMENT } @@ -723,51 +502,33 @@ __imlib_SubCopyRGBAToRGBACmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_ju static void __imlib_ReBlendRGBAToRGBCmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, - int w, int h, ImlibColorModifier *cm) + int w, int h, ImlibColorModifier *cm) { LOOP_START_2 - READ_ALPHA(p1, a); - CMOD_APPLY_A(cm, a); - if (a > 0) - { - READ_RGB(p1, r, g, b); - READ_RGB(p2, rr, gg, bb); + a = A_CMOD(cm, A_VAL(p1)); - CMOD_APPLY_RGB(cm, r, g, b); - - RESHADE_COLOR_WITH_ALPHA(a, nr, r, rr); - RESHADE_COLOR_WITH_ALPHA(a, ng, g, gg); - RESHADE_COLOR_WITH_ALPHA(a, nb, b, bb); - - WRITE_RGB_PRESERVE_ALPHA(p2, nr, ng, nb); - } + RESHADE_COLOR_WITH_ALPHA(a, R_VAL(p2), R_CMOD(cm, R_VAL(p1)), R_VAL(p2)); + RESHADE_COLOR_WITH_ALPHA(a, G_VAL(p2), G_CMOD(cm, G_VAL(p1)), G_VAL(p2)); + RESHADE_COLOR_WITH_ALPHA(a, B_VAL(p2), B_CMOD(cm, B_VAL(p1)), B_VAL(p2)); + + WRITE_RGB_PRESERVE_ALPHA(p2, nr, ng, nb); LOOP_END_WITH_INCREMENT } static void __imlib_ReBlendRGBAToRGBACmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, - int w, int h, ImlibColorModifier *cm) + int w, int h, ImlibColorModifier *cm) { LOOP_START_3 - READ_ALPHA(p1, a); - CMOD_APPLY_A(cm, a); - if (a > 0) - { - READ_RGB (p1, r, g, b); - READ_RGBA(p2, rr, gg, bb, aa); - - CMOD_APPLY_RGB(cm, r, g, b); - - RESHADE_COLOR_WITH_ALPHA(a, nr, r, rr); - RESHADE_COLOR_WITH_ALPHA(a, ng, g, gg); - RESHADE_COLOR_WITH_ALPHA(a, nb, b, bb); - SATURATE_UPPER(na, a + aa); - - WRITE_RGBA(p2, nr, ng, nb, na); - } + a = A_CMOD(cm, A_VAL(p1)); + + RESHADE_COLOR_WITH_ALPHA(a, R_VAL(p2), R_CMOD(cm, R_VAL(p1)), R_VAL(p2)); + RESHADE_COLOR_WITH_ALPHA(a, G_VAL(p2), G_CMOD(cm, G_VAL(p1)), G_VAL(p2)); + RESHADE_COLOR_WITH_ALPHA(a, B_VAL(p2), B_CMOD(cm, B_VAL(p1)), B_VAL(p2)); + SATURATE_UPPER(A_VAL(p2), a + A_VAL(p2)); LOOP_END_WITH_INCREMENT } @@ -778,37 +539,23 @@ __imlib_ReCopyRGBAToRGBCmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump { LOOP_START_1 - READ_RGB(p1, r, g, b); - READ_RGB(p2, rr, gg, bb); - - CMOD_APPLY_RGB(cm, r, g, b); - - RESHADE_COLOR(nr, r, rr); - RESHADE_COLOR(ng, g, gg); - RESHADE_COLOR(nb, b, bb); - - WRITE_RGB_PRESERVE_ALPHA(p2, nr, ng, nb); + RESHADE_COLOR(R_VAL(p2), R_CMOD(cm, R_VAL(p1)), R_VAL(p2)); + RESHADE_COLOR(G_VAL(p2), G_CMOD(cm, G_VAL(p1)), G_VAL(p2)); + RESHADE_COLOR(B_VAL(p2), B_CMOD(cm, B_VAL(p1)), B_VAL(p2)); LOOP_END_WITH_INCREMENT } static void __imlib_ReCopyRGBAToRGBACmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_jump, - int w, int h, ImlibColorModifier *cm) + int w, int h, ImlibColorModifier *cm) { LOOP_START_3 - READ_RGBA(p1, r, g, b, a); - READ_RGBA(p2, rr, gg, bb, aa); - - CMOD_APPLY_RGBA(cm, r, g, b, a); - - RESHADE_COLOR(nr, r, rr); - RESHADE_COLOR(ng, g, gg); - RESHADE_COLOR(nb, b, bb); - SATURATE_UPPER(na, a + aa); - - WRITE_RGBA(p2, nr, ng, nb, na); + RESHADE_COLOR(R_VAL(p2), R_CMOD(cm, R_VAL(p1)), R_VAL(p2)); + RESHADE_COLOR(G_VAL(p2), G_CMOD(cm, G_VAL(p1)), G_VAL(p2)); + RESHADE_COLOR(B_VAL(p2), B_CMOD(cm, B_VAL(p1)), B_VAL(p2)); + SATURATE_UPPER(A_VAL(p2), a + A_VAL(p2)); LOOP_END_WITH_INCREMENT } @@ -817,6 +564,9 @@ __imlib_ReCopyRGBAToRGBACmod(DATA32 *src, int src_jump, DATA32 *dst, int dst_jum + + + ImlibBlendFunction __imlib_GetBlendFunction(ImlibOp op, char blend, char merge_alpha, ImlibColorModifier * cm) diff --git a/src/blend.h b/src/blend.h index bb70c24..70d0412 100644 --- a/src/blend.h +++ b/src/blend.h @@ -1,36 +1,50 @@ #ifndef __BLEND #define __BLEND 1 +#ifndef WORDS_BIGENDIAN + +#define A_VAL(p) ((DATA8 *)(p))[3] +#define R_VAL(p) ((DATA8 *)(p))[2] +#define G_VAL(p) ((DATA8 *)(p))[1] +#define B_VAL(p) ((DATA8 *)(p))[0] + +#else + +#define A_VAL(p) ((DATA8 *)(p))[0] +#define R_VAL(p) ((DATA8 *)(p))[1] +#define G_VAL(p) ((DATA8 *)(p))[2] +#define B_VAL(p) ((DATA8 *)(p))[3] + +#endif + /* FIXME: endian dependant */ #define READ_RGB(p, r, g, b) \ - (r) = ((DATA8 *)p)[2]; \ - (g) = ((DATA8 *)p)[1]; \ - (b) = ((DATA8 *)p)[0]; + (r) = R_VAL(p); \ + (g) = G_VAL(p); \ + (b) = B_VAL(p); #define READ_ALPHA(p, a) \ - (a) = ((DATA8 *)p)[3]; + (a) = A_VAL(p); #define READ_RGBA(p, r, g, b, a) \ - (a) = ((DATA8 *)p)[3]; \ - (r) = ((DATA8 *)p)[2]; \ - (g) = ((DATA8 *)p)[1]; \ - (b) = ((DATA8 *)p)[0]; + (r) = R_VAL(p); \ + (g) = G_VAL(p); \ + (b) = B_VAL(p); \ + (a) = A_VAL(p); #define WRITE_RGB(p, r, g, b) \ - ((DATA8 *)p)[2] = r; \ - ((DATA8 *)p)[1] = g; \ - ((DATA8 *)p)[0] = b; + R_VAL(p) = (r); \ + G_VAL(p) = (g); \ + B_VAL(p) = (b); #define WRITE_RGB_PRESERVE_ALPHA(p, r, g, b) \ - ((DATA8 *)p)[2] = r; \ - ((DATA8 *)p)[1] = g; \ - ((DATA8 *)p)[0] = b; + WRITE_RGB(p, r, g, b) #define WRITE_RGBA(p, r, g, b, a) \ - ((DATA8 *)p)[3] = a; \ - ((DATA8 *)p)[2] = r; \ - ((DATA8 *)p)[1] = g; \ - ((DATA8 *)p)[0] = b; + R_VAL(p) = (r); \ + G_VAL(p) = (g); \ + B_VAL(p) = (b); \ + A_VAL(p) = (a); /* @@ -252,9 +266,6 @@ * (-256, 512), and thus must be saturated at 0 and 255 (from above and below). */ -/* -nc = (((a) * ((cc) - (c))) + (c)) >> 8; -*/ #define BLEND_COLOR(a, nc, c, cc) \ tmp = ((c) - (cc)) * (a); \ nc = (cc) + ((tmp + (tmp >> 8) + 0x80) >> 8); @@ -284,35 +295,27 @@ tmp = (cc) + (((c) - 127) << 1); \ SATURATE_BOTH(nc, tmp); #define BLEND(r1, g1, b1, a1, dest) \ -READ_RGBA(dest, rr, gg, bb, aa); \ -BLEND_COLOR(a1, nr, r1, rr); \ -BLEND_COLOR(a1, ng, g1, gg); \ -BLEND_COLOR(a1, nb, b1, bb); \ -SATURATE_UPPER(na, (a1) + aa); \ -WRITE_RGBA(dest, nr, ng, nb, na); +BLEND_COLOR(a1, R_VAL(dest), r1, R_VAL(dest)); \ +BLEND_COLOR(a1, G_VAL(dest), g1, G_VAL(dest)); \ +BLEND_COLOR(a1, B_VAL(dest), b1, B_VAL(dest)); \ +SATURATE_UPPER(A_VAL(dest), (a1) + A_VAL(dest)); #define BLEND_ADD(r1, g1, b1, a1, dest) \ -READ_RGBA(dest, rr, gg, bb, aa); \ -ADD_COLOR_WITH_ALPHA(a1, nr, r1, rr); \ -ADD_COLOR_WITH_ALPHA(a1, ng, g1, gg); \ -ADD_COLOR_WITH_ALPHA(a1, nb, b1, bb); \ -SATURATE_UPPER(na, (a1) + aa); \ -WRITE_RGBA(dest, nr, ng, nb, na); +ADD_COLOR_WITH_ALPHA(a1, R_VAL(dest), r1, R_VAL(dest)); \ +ADD_COLOR_WITH_ALPHA(a1, G_VAL(dest), g1, G_VAL(dest)); \ +ADD_COLOR_WITH_ALPHA(a1, B_VAL(dest), b1, B_VAL(dest)); \ +SATURATE_UPPER(A_VAL(dest), (a1) + A_VAL(dest)); #define BLEND_SUB(r1, g1, b1, a1, dest) \ -READ_RGBA(dest, rr, gg, bb, aa); \ -SUB_COLOR_WITH_ALPHA(a1, nr, r1, rr); \ -SUB_COLOR_WITH_ALPHA(a1, ng, g1, gg); \ -SUB_COLOR_WITH_ALPHA(a1, nb, b1, bb); \ -SATURATE_UPPER(na, (a1) + aa); \ -WRITE_RGBA(dest, nr, ng, nb, na); +SUB_COLOR_WITH_ALPHA(a1, R_VAL(dest), r1, R_VAL(dest)); \ +SUB_COLOR_WITH_ALPHA(a1, G_VAL(dest), g1, G_VAL(dest)); \ +SUB_COLOR_WITH_ALPHA(a1, B_VAL(dest), b1, B_VAL(dest)); \ +SATURATE_UPPER(A_VAL(dest), (a1) + A_VAL(dest)); #define BLEND_RE(r1, g1, b1, a1, dest) \ -READ_RGBA(dest, rr, gg, bb, aa); \ -RESHADE_COLOR_WITH_ALPHA(a1, nr, r1, rr); \ -RESHADE_COLOR_WITH_ALPHA(a1, ng, g1, gg); \ -RESHADE_COLOR_WITH_ALPHA(a1, nb, b1, bb); \ -WRITE_RGBA(dest, nr, ng, nb, na); +RESHADE_COLOR_WITH_ALPHA(a1, R_VAL(dest), r1, R_VAL(dest)); \ +RESHADE_COLOR_WITH_ALPHA(a1, G_VAL(dest), g1, G_VAL(dest)); \ +RESHADE_COLOR_WITH_ALPHA(a1, B_VAL(dest), b1, B_VAL(dest)); enum _imlibop { diff --git a/src/colormod.c b/src/colormod.c index 3f1e4dc..f2ff679 100644 --- a/src/colormod.c +++ b/src/colormod.c @@ -88,9 +88,10 @@ __imlib_DataCmodApply(DATA32 *data, int w, int h, int jump, { for (x = 0; x < w; x++) { - READ_RGBA(p, r, g, b, a); - CMOD_APPLY_RGBA(cm, r, g, b, a); - WRITE_RGBA(p, r, g, b, a); + R_VAL(p) = R_CMOD(cm, R_VAL(p)); + G_VAL(p) = R_CMOD(cm, G_VAL(p)); + B_VAL(p) = R_CMOD(cm, B_VAL(p)); + A_VAL(p) = R_CMOD(cm, A_VAL(p)); p++; } p += jump; diff --git a/src/colormod.h b/src/colormod.h index d64d4d5..f1a0a86 100644 --- a/src/colormod.h +++ b/src/colormod.h @@ -23,9 +23,24 @@ struct _imlib_color_modifier (b) = (cm)->blue_mapping[(int)(b)]; \ (a) = (cm)->alpha_mapping[(int)(a)]; +#define CMOD_APPLY_R(cm, r) \ +(r) = (cm)->red_mapping[(int)(r)]; +#define CMOD_APPLY_G(cm, g) \ +(g) = (cm)->green_mapping[(int)(g)]; +#define CMOD_APPLY_B(cm, b) \ +(b) = (cm)->blue_mapping[(int)(b)]; #define CMOD_APPLY_A(cm, a) \ (a) = (cm)->alpha_mapping[(int)(a)]; +#define R_CMOD(cm, r) \ +(cm)->red_mapping[(int)(r)] +#define G_CMOD(cm, g) \ +(cm)->green_mapping[(int)(g)] +#define B_CMOD(cm, b) \ +(cm)->blue_mapping[(int)(b)] +#define A_CMOD(cm, a) \ +(cm)->alpha_mapping[(int)(a)] + ImlibColorModifier * __imlib_CreateCmod(void); void __imlib_FreeCmod(ImlibColorModifier *cm); void __imlib_CmodChanged(ImlibColorModifier *cm); diff --git a/src/rotate.h b/src/rotate.h index e30f36c..861f989 100644 --- a/src/rotate.h +++ b/src/rotate.h @@ -2,7 +2,6 @@ #define __ROTATE 1 #include -#include #include "image.h" #include "colormod.h" #include "blend.h" @@ -25,24 +24,4 @@ void __imlib_BlendImageToImageAtAngle(ImlibImage *im_src, ImlibImage *im_dst, ImlibColorModifier *cm, ImlibOp op); -/*\ bigendian and littleendian byte-from-int macro's \*/ -#if __BYTE_ORDER == __LITTLE_ENDIAN -# define R_VAL(x) (*(((DATA8 *)&(x))+(0))) -# define G_VAL(x) (*(((DATA8 *)&(x))+(1))) -# define B_VAL(x) (*(((DATA8 *)&(x))+(2))) -# define A_VAL(x) (*(((DATA8 *)&(x))+(3))) -#elif __BYTE_ORDER == __BIG_ENDIAN -# define A_VAL(x) (*(((DATA8 *)&(x))+(0))) -# define B_VAL(x) (*(((DATA8 *)&(x))+(1))) -# define G_VAL(x) (*(((DATA8 *)&(x))+(2))) -# define R_VAL(x) (*(((DATA8 *)&(x))+(3))) -#elif __BYTE_ORDER == __PDP_ENDIAN -# define B_VAL(x) (*(((DATA8 *)&(x))+(0))) -# define A_VAL(x) (*(((DATA8 *)&(x))+(1))) -# define R_VAL(x) (*(((DATA8 *)&(x))+(2))) -# define G_VAL(x) (*(((DATA8 *)&(x))+(3))) -#else -#error Unknown byte endianness. -#endif - #endif