forked from old/legacy-imlib2
parent
2e97f2795c
commit
2841de3a2d
550
src/blend.c
550
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)
|
||||
|
|
91
src/blend.h
91
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
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
21
src/rotate.h
21
src/rotate.h
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue