optmize.. fix endianess stuff... :)

SVN revision: 2302
This commit is contained in:
Carsten Haitzler 2000-03-22 22:26:58 +00:00
parent 2e97f2795c
commit 2841de3a2d
5 changed files with 216 additions and 468 deletions

View File

@ -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)

View File

@ -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
{

View File

@ -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;

View File

@ -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);

View File

@ -2,7 +2,6 @@
#define __ROTATE 1
#include <X11/Xlib.h>
#include <endian.h>
#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