Finally adding layer blending modes Multiply, Divide, Screen, Overlay,
Difference, Addition, Subtraction, Darken, Lighten. Still to do: Hue, Saturation, Value, Color, Dissolve. SVN revision: 3337
This commit is contained in:
parent
cc59ec53ac
commit
cc551409ad
147
src/loader_xcf.c
147
src/loader_xcf.c
|
@ -297,10 +297,18 @@ static char xcf_file_init(char* filename);
|
||||||
static void xcf_cleanup(void);
|
static void xcf_cleanup(void);
|
||||||
static void xcf_to_imlib(ImlibImage *im);
|
static void xcf_to_imlib(ImlibImage *im);
|
||||||
|
|
||||||
/* Stuff for pixel merging:
|
/* Stuff for layer merging:
|
||||||
*/
|
*/
|
||||||
extern void combine_pixels (DATA8* src, int src_w, int src_h, DATA8* dest, int dest_w, int dest_h, int dest_x, int dest_y);
|
extern void combine_pixels_normal (DATA8* src, int src_w, int src_h, DATA8* dest, int dest_w, int dest_h, int dest_x, int dest_y);
|
||||||
/* ... */
|
extern void combine_pixels_add (DATA8* src, int src_w, int src_h, DATA8* dest, int dest_w, int dest_h, int dest_x, int dest_y);
|
||||||
|
extern void combine_pixels_sub (DATA8* src, int src_w, int src_h, DATA8* dest, int dest_w, int dest_h, int dest_x, int dest_y);
|
||||||
|
extern void combine_pixels_diff (DATA8* src, int src_w, int src_h, DATA8* dest, int dest_w, int dest_h, int dest_x, int dest_y);
|
||||||
|
extern void combine_pixels_darken (DATA8* src, int src_w, int src_h, DATA8* dest, int dest_w, int dest_h, int dest_x, int dest_y);
|
||||||
|
extern void combine_pixels_lighten (DATA8* src, int src_w, int src_h, DATA8* dest, int dest_w, int dest_h, int dest_x, int dest_y);
|
||||||
|
extern void combine_pixels_mult (DATA8* src, int src_w, int src_h, DATA8* dest, int dest_w, int dest_h, int dest_x, int dest_y);
|
||||||
|
extern void combine_pixels_div (DATA8* src, int src_w, int src_h, DATA8* dest, int dest_w, int dest_h, int dest_x, int dest_y);
|
||||||
|
extern void combine_pixels_screen (DATA8* src, int src_w, int src_h, DATA8* dest, int dest_w, int dest_h, int dest_x, int dest_y);
|
||||||
|
extern void combine_pixels_overlay (DATA8* src, int src_w, int src_h, DATA8* dest, int dest_w, int dest_h, int dest_x, int dest_y);
|
||||||
|
|
||||||
|
|
||||||
/* ---------------------------------------------------------------------------- globals ------------ */
|
/* ---------------------------------------------------------------------------- globals ------------ */
|
||||||
|
@ -1432,106 +1440,69 @@ flatten_image(void)
|
||||||
{
|
{
|
||||||
switch (l->mode)
|
switch (l->mode)
|
||||||
{
|
{
|
||||||
case DISSOLVE_MODE:
|
|
||||||
/*
|
|
||||||
if (! has_alpha2)
|
|
||||||
add_alpha_pixels (src2, *dest, length, bytes2);
|
|
||||||
|
|
||||||
dissolve_pixels (src2, *dest, x, y, opacity, length, bytes2,
|
|
||||||
((has_alpha2) ? bytes2 : bytes2 + 1), has_alpha2);
|
|
||||||
combine = (has_alpha1) ? COMBINE_INTEN_A_INTEN_A : COMBINE_INTEN_INTEN_A;
|
|
||||||
break;
|
|
||||||
*/
|
|
||||||
case MULTIPLY_MODE:
|
case MULTIPLY_MODE:
|
||||||
/*
|
combine_pixels_mult(l->data, l->width, l->height,
|
||||||
multiply_pixels (src1, src2, *dest, length, bytes1, bytes2, has_alpha1, has_alpha2);
|
image->data, image->width, image->height,
|
||||||
break;
|
l->offset_x, l->offset_y);
|
||||||
*/
|
break;
|
||||||
case DIVIDE_MODE:
|
case DIVIDE_MODE:
|
||||||
/*
|
combine_pixels_div(l->data, l->width, l->height,
|
||||||
divide_pixels (src1, src2, *dest, length, bytes1, bytes2, has_alpha1, has_alpha2);
|
image->data, image->width, image->height,
|
||||||
break;
|
l->offset_x, l->offset_y);
|
||||||
*/
|
break;
|
||||||
case SCREEN_MODE:
|
case SCREEN_MODE:
|
||||||
/*
|
combine_pixels_screen(l->data, l->width, l->height,
|
||||||
screen_pixels (src1, src2, *dest, length, bytes1, bytes2, has_alpha1, has_alpha2);
|
image->data, image->width, image->height,
|
||||||
break;
|
l->offset_x, l->offset_y);
|
||||||
*/
|
break;
|
||||||
case OVERLAY_MODE:
|
case OVERLAY_MODE:
|
||||||
/*
|
combine_pixels_overlay(l->data, l->width, l->height,
|
||||||
overlay_pixels (src1, src2, *dest, length, bytes1, bytes2, has_alpha1, has_alpha2);
|
image->data, image->width, image->height,
|
||||||
break;
|
l->offset_x, l->offset_y);
|
||||||
*/
|
break;
|
||||||
case DIFFERENCE_MODE:
|
case DIFFERENCE_MODE:
|
||||||
/*
|
combine_pixels_diff(l->data, l->width, l->height,
|
||||||
difference_pixels (src1, src2, *dest, length, bytes1, bytes2, has_alpha1, has_alpha2);
|
image->data, image->width, image->height,
|
||||||
break;
|
l->offset_x, l->offset_y);
|
||||||
*/
|
break;
|
||||||
case ADDITION_MODE:
|
case ADDITION_MODE:
|
||||||
/*
|
combine_pixels_add(l->data, l->width, l->height,
|
||||||
add_pixels (src1, src2, *dest, length, bytes1, bytes2, has_alpha1, has_alpha2);
|
image->data, image->width, image->height,
|
||||||
break;
|
l->offset_x, l->offset_y);
|
||||||
*/
|
break;
|
||||||
case SUBTRACT_MODE:
|
case SUBTRACT_MODE:
|
||||||
/*
|
combine_pixels_sub(l->data, l->width, l->height,
|
||||||
subtract_pixels (src1, src2, *dest, length, bytes1, bytes2, has_alpha1, has_alpha2);
|
image->data, image->width, image->height,
|
||||||
break;
|
l->offset_x, l->offset_y);
|
||||||
*/
|
break;
|
||||||
case DARKEN_ONLY_MODE:
|
case DARKEN_ONLY_MODE:
|
||||||
/*
|
combine_pixels_darken(l->data, l->width, l->height,
|
||||||
darken_pixels (src1, src2, *dest, length, bytes1, bytes2, has_alpha1, has_alpha2);
|
image->data, image->width, image->height,
|
||||||
break;
|
l->offset_x, l->offset_y);
|
||||||
*/
|
break;
|
||||||
case LIGHTEN_ONLY_MODE:
|
case LIGHTEN_ONLY_MODE:
|
||||||
/*
|
combine_pixels_lighten(l->data, l->width, l->height,
|
||||||
lighten_pixels (src1, src2, *dest, length, bytes1, bytes2, has_alpha1, has_alpha2);
|
image->data, image->width, image->height,
|
||||||
break;
|
l->offset_x, l->offset_y);
|
||||||
*/
|
break;
|
||||||
case HUE_MODE: case SATURATION_MODE: case VALUE_MODE:
|
|
||||||
/*
|
/* These are still to be finished ... */
|
||||||
if (bytes1 > 2)
|
case HUE_MODE:
|
||||||
hsv_only_pixels (src1, src2, *dest, mode, length, bytes1, bytes2, has_alpha1, has_alpha2);
|
case SATURATION_MODE:
|
||||||
else
|
case VALUE_MODE:
|
||||||
*dest = src2;
|
|
||||||
break;
|
|
||||||
*/
|
|
||||||
case COLOR_MODE:
|
case COLOR_MODE:
|
||||||
/*
|
case DISSOLVE_MODE:
|
||||||
if (bytes1 > 2)
|
|
||||||
color_only_pixels (src1, src2, *dest, mode, length, bytes1, bytes2, has_alpha1, has_alpha2);
|
/* None of those is actually valid for layer blending, fall through: */
|
||||||
else
|
|
||||||
*dest = src2;
|
|
||||||
break;
|
|
||||||
*/
|
|
||||||
case BEHIND_MODE:
|
case BEHIND_MODE:
|
||||||
/*
|
|
||||||
*dest = src2;
|
|
||||||
if (has_alpha1)
|
|
||||||
combine = BEHIND_INTEN;
|
|
||||||
else
|
|
||||||
combine = NO_COMBINATION;
|
|
||||||
break;
|
|
||||||
*/
|
|
||||||
case REPLACE_MODE:
|
case REPLACE_MODE:
|
||||||
/*
|
|
||||||
*dest = src2;
|
|
||||||
combine = REPLACE_INTEN;
|
|
||||||
break;
|
|
||||||
*/
|
|
||||||
case ERASE_MODE:
|
case ERASE_MODE:
|
||||||
/*
|
|
||||||
*dest = src2;
|
|
||||||
combine = ERASE_INTEN;
|
|
||||||
break;
|
|
||||||
*/
|
|
||||||
case ANTI_ERASE_MODE:
|
case ANTI_ERASE_MODE:
|
||||||
/*
|
|
||||||
*dest = src2;
|
|
||||||
combine = ANTI_ERASE_INTEN;
|
|
||||||
break;
|
|
||||||
*/
|
|
||||||
case NORMAL_MODE:
|
case NORMAL_MODE:
|
||||||
combine_pixels(l->data, l->width, l->height, image->data, image->width, image->height, l->offset_x, l->offset_y);
|
combine_pixels_normal(l->data, l->width, l->height,
|
||||||
|
image->data, image->width, image->height,
|
||||||
|
l->offset_x, l->offset_y);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -30,6 +30,9 @@
|
||||||
#define RANDOM_SEED 314159265
|
#define RANDOM_SEED 314159265
|
||||||
#define EPSILON 0.0001
|
#define EPSILON 0.0001
|
||||||
|
|
||||||
|
#define MAX(a, b) ((a > b) ? a : b)
|
||||||
|
#define MIN(a, b) ((a < b) ? a : b)
|
||||||
|
|
||||||
#define INT_MULT(a,b,t) ((t) = (a) * (b) + 0x80, ((((t) >> 8) + (t)) >> 8))
|
#define INT_MULT(a,b,t) ((t) = (a) * (b) + 0x80, ((((t) >> 8) + (t)) >> 8))
|
||||||
|
|
||||||
#define LINEAR(x,y,w) ((w*y + x)*4)
|
#define LINEAR(x,y,w) ((w*y + x)*4)
|
||||||
|
@ -48,8 +51,33 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* translate negative destinations */
|
||||||
|
void clip(int * src_tl_x, int * src_tl_y,
|
||||||
|
int * src_br_x, int * src_br_y,
|
||||||
|
int * dest_x, int * dest_y,
|
||||||
|
int dest_w, int dest_h)
|
||||||
|
{
|
||||||
|
if (*dest_x + *src_br_x >= dest_w)
|
||||||
|
{ *src_br_x -= (*dest_x + *src_br_x) - dest_w; }
|
||||||
|
|
||||||
|
if (*dest_y + *src_br_y >= dest_h)
|
||||||
|
{ *src_br_y -= (*dest_y + *src_br_y) - dest_h; }
|
||||||
|
|
||||||
|
if (*dest_x < 0)
|
||||||
|
{
|
||||||
|
*src_tl_x = -(*dest_x);
|
||||||
|
*dest_x = 0;
|
||||||
|
}
|
||||||
|
if (*dest_y < 0)
|
||||||
|
{
|
||||||
|
*src_tl_y = -(*dest_y);
|
||||||
|
*dest_y = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
combine_pixels (DATA8* src, int src_w, int src_h, DATA8* dest, int dest_w, int dest_h, int dest_x, int dest_y)
|
combine_pixels_normal (DATA8* src, int src_w, int src_h, DATA8* dest, int dest_w, int dest_h, int dest_x, int dest_y)
|
||||||
{
|
{
|
||||||
int x, y, s_idx, d_idx;
|
int x, y, s_idx, d_idx;
|
||||||
int src_tl_x = 0, src_tl_y = 0;
|
int src_tl_x = 0, src_tl_y = 0;
|
||||||
|
@ -60,51 +88,275 @@ combine_pixels (DATA8* src, int src_w, int src_h, DATA8* dest, int dest_w, int d
|
||||||
unsigned char new_alpha;
|
unsigned char new_alpha;
|
||||||
float ratio, compl_ratio;
|
float ratio, compl_ratio;
|
||||||
long tmp;
|
long tmp;
|
||||||
|
|
||||||
/*printf ("Blending %ix%i onto %ix%i at %i, %i -->", src_w, src_h, dest_w, dest_h, dest_x, dest_y);*/
|
clip(&src_tl_x, &src_tl_y, &src_br_x, &src_br_y, &dest_x, &dest_y, dest_w, dest_h);
|
||||||
|
|
||||||
/* translate negative destinations */
|
|
||||||
if (dest_x + src_br_x >= dest_w)
|
|
||||||
src_br_x -= (dest_x + src_br_x) - dest_w;
|
|
||||||
|
|
||||||
if (dest_y + src_br_y >= dest_h)
|
|
||||||
src_br_y -= (dest_y + src_br_y) - dest_h;
|
|
||||||
|
|
||||||
if (dest_x < 0)
|
|
||||||
{
|
|
||||||
src_tl_x = -dest_x;
|
|
||||||
dest_x = 0;
|
|
||||||
}
|
|
||||||
if (dest_y < 0)
|
|
||||||
{
|
|
||||||
src_tl_y = -dest_y;
|
|
||||||
dest_y = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (y = src_tl_y; y < src_br_y; y++)
|
for (y = src_tl_y; y < src_br_y; y++)
|
||||||
{
|
for (x = src_tl_x; x < src_br_x; x++)
|
||||||
for (x = src_tl_x; x < src_br_x; x++)
|
{
|
||||||
{
|
d_idx = LINEAR((dest_x + x - src_tl_x), (dest_y + y - src_tl_y), dest_w);
|
||||||
d_idx = LINEAR((dest_x + x - src_tl_x), (dest_y + y - src_tl_y), dest_w);
|
s_idx = LINEAR(x, y, src_w);
|
||||||
s_idx = LINEAR(x, y, src_w);
|
|
||||||
|
src_alpha = A_VAL(src + s_idx);
|
||||||
src_alpha = A_VAL(src + s_idx);
|
|
||||||
|
if (src_alpha != 0)
|
||||||
if (src_alpha != 0)
|
{
|
||||||
{
|
if (src_alpha == 255)
|
||||||
if (src_alpha == 255)
|
{
|
||||||
{
|
new_alpha = src_alpha;
|
||||||
new_alpha = src_alpha;
|
alphify (src_alpha, new_alpha);
|
||||||
alphify (src_alpha, new_alpha);
|
A_VAL(dest + d_idx) = new_alpha;
|
||||||
A_VAL(dest + d_idx) = new_alpha;
|
}
|
||||||
}
|
else
|
||||||
else
|
{
|
||||||
{
|
new_alpha = A_VAL(dest + d_idx) + INT_MULT((255 - A_VAL(dest + d_idx)), src_alpha, tmp);
|
||||||
new_alpha = A_VAL(dest + d_idx) + INT_MULT((255 - A_VAL(dest + d_idx)), src_alpha, tmp);
|
alphify (src_alpha, new_alpha);
|
||||||
alphify (src_alpha, new_alpha);
|
A_VAL(dest + d_idx) = new_alpha;
|
||||||
A_VAL(dest + d_idx) = new_alpha;
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
combine_pixels_add (DATA8* src, int src_w, int src_h, DATA8* dest, int dest_w, int dest_h, int dest_x, int dest_y)
|
||||||
|
{
|
||||||
|
int x, y, s_idx, d_idx;
|
||||||
|
int src_tl_x = 0, src_tl_y = 0;
|
||||||
|
int src_br_x = src_w, src_br_y = src_h;
|
||||||
|
int tmp;
|
||||||
|
|
||||||
|
clip(&src_tl_x, &src_tl_y, &src_br_x, &src_br_y, &dest_x, &dest_y, dest_w, dest_h);
|
||||||
|
|
||||||
|
for (y = src_tl_y; y < src_br_y; y++)
|
||||||
|
for (x = src_tl_x; x < src_br_x; x++)
|
||||||
|
{
|
||||||
|
d_idx = LINEAR((dest_x + x - src_tl_x), (dest_y + y - src_tl_y), dest_w);
|
||||||
|
s_idx = LINEAR(x, y, src_w);
|
||||||
|
|
||||||
|
tmp = R_VAL(dest + d_idx) + R_VAL(src + s_idx);
|
||||||
|
R_VAL(dest + d_idx) = (tmp > 255 ? 255 : tmp);
|
||||||
|
|
||||||
|
tmp = G_VAL(dest + d_idx) + G_VAL(src + s_idx);
|
||||||
|
G_VAL(dest + d_idx) = (tmp > 255 ? 255 : tmp);
|
||||||
|
|
||||||
|
tmp = B_VAL(dest + d_idx) + B_VAL(src + s_idx);
|
||||||
|
B_VAL(dest + d_idx) = (tmp > 255 ? 255 : tmp);
|
||||||
|
|
||||||
|
A_VAL(dest + d_idx) = A_VAL(src + s_idx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
combine_pixels_sub (DATA8* src, int src_w, int src_h, DATA8* dest, int dest_w, int dest_h, int dest_x, int dest_y)
|
||||||
|
{
|
||||||
|
int x, y, s_idx, d_idx;
|
||||||
|
int src_tl_x = 0, src_tl_y = 0;
|
||||||
|
int src_br_x = src_w, src_br_y = src_h;
|
||||||
|
int tmp;
|
||||||
|
|
||||||
|
clip(&src_tl_x, &src_tl_y, &src_br_x, &src_br_y, &dest_x, &dest_y, dest_w, dest_h);
|
||||||
|
|
||||||
|
for (y = src_tl_y; y < src_br_y; y++)
|
||||||
|
for (x = src_tl_x; x < src_br_x; x++)
|
||||||
|
{
|
||||||
|
d_idx = LINEAR((dest_x + x - src_tl_x), (dest_y + y - src_tl_y), dest_w);
|
||||||
|
s_idx = LINEAR(x, y, src_w);
|
||||||
|
|
||||||
|
tmp = R_VAL(dest + d_idx) - R_VAL(src + s_idx);
|
||||||
|
R_VAL(dest + d_idx) = (tmp < 0 ? 0 : tmp);
|
||||||
|
|
||||||
|
tmp = G_VAL(dest + d_idx) - G_VAL(src + s_idx);
|
||||||
|
G_VAL(dest + d_idx) = (tmp < 0 ? 0 : tmp);
|
||||||
|
|
||||||
|
tmp = B_VAL(dest + d_idx) - B_VAL(src + s_idx);
|
||||||
|
B_VAL(dest + d_idx) = (tmp < 0 ? 0 : tmp);
|
||||||
|
|
||||||
|
A_VAL(dest + d_idx) = A_VAL(src + s_idx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
combine_pixels_diff (DATA8* src, int src_w, int src_h, DATA8* dest, int dest_w, int dest_h, int dest_x, int dest_y)
|
||||||
|
{
|
||||||
|
int x, y, s_idx, d_idx;
|
||||||
|
int src_tl_x = 0, src_tl_y = 0;
|
||||||
|
int src_br_x = src_w, src_br_y = src_h;
|
||||||
|
int tmp;
|
||||||
|
|
||||||
|
clip(&src_tl_x, &src_tl_y, &src_br_x, &src_br_y, &dest_x, &dest_y, dest_w, dest_h);
|
||||||
|
|
||||||
|
for (y = src_tl_y; y < src_br_y; y++)
|
||||||
|
for (x = src_tl_x; x < src_br_x; x++)
|
||||||
|
{
|
||||||
|
d_idx = LINEAR((dest_x + x - src_tl_x), (dest_y + y - src_tl_y), dest_w);
|
||||||
|
s_idx = LINEAR(x, y, src_w);
|
||||||
|
|
||||||
|
tmp = R_VAL(dest + d_idx) - R_VAL(src + s_idx);
|
||||||
|
R_VAL(dest + d_idx) = (tmp < 0 ? -tmp : tmp);
|
||||||
|
|
||||||
|
tmp = G_VAL(dest + d_idx) - G_VAL(src + s_idx);
|
||||||
|
G_VAL(dest + d_idx) = (tmp < 0 ? -tmp : tmp);
|
||||||
|
|
||||||
|
tmp = B_VAL(dest + d_idx) - B_VAL(src + s_idx);
|
||||||
|
B_VAL(dest + d_idx) = (tmp < 0 ? -tmp : tmp);
|
||||||
|
|
||||||
|
A_VAL(dest + d_idx) = A_VAL(src + s_idx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
combine_pixels_darken (DATA8* src, int src_w, int src_h, DATA8* dest, int dest_w, int dest_h, int dest_x, int dest_y)
|
||||||
|
{
|
||||||
|
int x, y, s_idx, d_idx;
|
||||||
|
int src_tl_x = 0, src_tl_y = 0;
|
||||||
|
int src_br_x = src_w, src_br_y = src_h;
|
||||||
|
|
||||||
|
clip(&src_tl_x, &src_tl_y, &src_br_x, &src_br_y, &dest_x, &dest_y, dest_w, dest_h);
|
||||||
|
|
||||||
|
for (y = src_tl_y; y < src_br_y; y++)
|
||||||
|
for (x = src_tl_x; x < src_br_x; x++)
|
||||||
|
{
|
||||||
|
d_idx = LINEAR((dest_x + x - src_tl_x), (dest_y + y - src_tl_y), dest_w);
|
||||||
|
s_idx = LINEAR(x, y, src_w);
|
||||||
|
|
||||||
|
R_VAL(dest + d_idx) = MIN(R_VAL(dest + d_idx), R_VAL(src + s_idx));
|
||||||
|
G_VAL(dest + d_idx) = MIN(G_VAL(dest + d_idx), G_VAL(src + s_idx));
|
||||||
|
B_VAL(dest + d_idx) = MIN(B_VAL(dest + d_idx), B_VAL(src + s_idx));
|
||||||
|
|
||||||
|
A_VAL(dest + d_idx) = A_VAL(src + s_idx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
combine_pixels_lighten (DATA8* src, int src_w, int src_h, DATA8* dest, int dest_w, int dest_h, int dest_x, int dest_y)
|
||||||
|
{
|
||||||
|
int x, y, s_idx, d_idx;
|
||||||
|
int src_tl_x = 0, src_tl_y = 0;
|
||||||
|
int src_br_x = src_w, src_br_y = src_h;
|
||||||
|
|
||||||
|
clip(&src_tl_x, &src_tl_y, &src_br_x, &src_br_y, &dest_x, &dest_y, dest_w, dest_h);
|
||||||
|
|
||||||
|
for (y = src_tl_y; y < src_br_y; y++)
|
||||||
|
for (x = src_tl_x; x < src_br_x; x++)
|
||||||
|
{
|
||||||
|
d_idx = LINEAR((dest_x + x - src_tl_x), (dest_y + y - src_tl_y), dest_w);
|
||||||
|
s_idx = LINEAR(x, y, src_w);
|
||||||
|
|
||||||
|
R_VAL(dest + d_idx) = MAX(R_VAL(dest + d_idx), R_VAL(src + s_idx));
|
||||||
|
G_VAL(dest + d_idx) = MAX(G_VAL(dest + d_idx), G_VAL(src + s_idx));
|
||||||
|
B_VAL(dest + d_idx) = MAX(B_VAL(dest + d_idx), B_VAL(src + s_idx));
|
||||||
|
|
||||||
|
A_VAL(dest + d_idx) = A_VAL(src + s_idx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
combine_pixels_mult (DATA8* src, int src_w, int src_h, DATA8* dest, int dest_w, int dest_h, int dest_x, int dest_y)
|
||||||
|
{
|
||||||
|
int x, y, s_idx, d_idx;
|
||||||
|
int src_tl_x = 0, src_tl_y = 0;
|
||||||
|
int src_br_x = src_w, src_br_y = src_h;
|
||||||
|
|
||||||
|
clip(&src_tl_x, &src_tl_y, &src_br_x, &src_br_y, &dest_x, &dest_y, dest_w, dest_h);
|
||||||
|
|
||||||
|
for (y = src_tl_y; y < src_br_y; y++)
|
||||||
|
for (x = src_tl_x; x < src_br_x; x++)
|
||||||
|
{
|
||||||
|
d_idx = LINEAR((dest_x + x - src_tl_x), (dest_y + y - src_tl_y), dest_w);
|
||||||
|
s_idx = LINEAR(x, y, src_w);
|
||||||
|
|
||||||
|
R_VAL(dest + d_idx) = (R_VAL(dest + d_idx) * R_VAL(src + s_idx)) >> 8;
|
||||||
|
G_VAL(dest + d_idx) = (G_VAL(dest + d_idx) * G_VAL(src + s_idx)) >> 8;
|
||||||
|
B_VAL(dest + d_idx) = (B_VAL(dest + d_idx) * B_VAL(src + s_idx)) >> 8;
|
||||||
|
|
||||||
|
A_VAL(dest + d_idx) = A_VAL(src + s_idx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
combine_pixels_div (DATA8* src, int src_w, int src_h, DATA8* dest, int dest_w, int dest_h, int dest_x, int dest_y)
|
||||||
|
{
|
||||||
|
int x, y, s_idx, d_idx;
|
||||||
|
int src_tl_x = 0, src_tl_y = 0;
|
||||||
|
int src_br_x = src_w, src_br_y = src_h;
|
||||||
|
|
||||||
|
clip(&src_tl_x, &src_tl_y, &src_br_x, &src_br_y, &dest_x, &dest_y, dest_w, dest_h);
|
||||||
|
|
||||||
|
for (y = src_tl_y; y < src_br_y; y++)
|
||||||
|
for (x = src_tl_x; x < src_br_x; x++)
|
||||||
|
{
|
||||||
|
d_idx = LINEAR((dest_x + x - src_tl_x), (dest_y + y - src_tl_y), dest_w);
|
||||||
|
s_idx = LINEAR(x, y, src_w);
|
||||||
|
|
||||||
|
R_VAL(dest + d_idx) = MIN(255, ((float)R_VAL(dest + d_idx) / (R_VAL(src + s_idx) + 1)) * 256);
|
||||||
|
G_VAL(dest + d_idx) = MIN(255, ((float)G_VAL(dest + d_idx) / (G_VAL(src + s_idx) + 1)) * 256);
|
||||||
|
B_VAL(dest + d_idx) = MIN(255, ((float)B_VAL(dest + d_idx) / (B_VAL(src + s_idx) + 1)) * 256);
|
||||||
|
|
||||||
|
A_VAL(dest + d_idx) = A_VAL(src + s_idx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
combine_pixels_screen (DATA8* src, int src_w, int src_h, DATA8* dest, int dest_w, int dest_h, int dest_x, int dest_y)
|
||||||
|
{
|
||||||
|
int x, y, s_idx, d_idx;
|
||||||
|
int src_tl_x = 0, src_tl_y = 0;
|
||||||
|
int src_br_x = src_w, src_br_y = src_h;
|
||||||
|
|
||||||
|
clip(&src_tl_x, &src_tl_y, &src_br_x, &src_br_y, &dest_x, &dest_y, dest_w, dest_h);
|
||||||
|
|
||||||
|
for (y = src_tl_y; y < src_br_y; y++)
|
||||||
|
for (x = src_tl_x; x < src_br_x; x++)
|
||||||
|
{
|
||||||
|
d_idx = LINEAR((dest_x + x - src_tl_x), (dest_y + y - src_tl_y), dest_w);
|
||||||
|
s_idx = LINEAR(x, y, src_w);
|
||||||
|
|
||||||
|
R_VAL(dest + d_idx) = 255 - (((255 - R_VAL(dest + d_idx)) * (255 - R_VAL(src + s_idx))) >> 8);
|
||||||
|
G_VAL(dest + d_idx) = 255 - (((255 - G_VAL(dest + d_idx)) * (255 - G_VAL(src + s_idx))) >> 8);
|
||||||
|
B_VAL(dest + d_idx) = 255 - (((255 - B_VAL(dest + d_idx)) * (255 - B_VAL(src + s_idx))) >> 8);
|
||||||
|
|
||||||
|
A_VAL(dest + d_idx) = A_VAL(src + s_idx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void
|
||||||
|
combine_pixels_overlay (DATA8* src, int src_w, int src_h, DATA8* dest, int dest_w, int dest_h, int dest_x, int dest_y)
|
||||||
|
{
|
||||||
|
int x, y, s_idx, d_idx;
|
||||||
|
int src_tl_x = 0, src_tl_y = 0;
|
||||||
|
int src_br_x = src_w, src_br_y = src_h;
|
||||||
|
int tmp_screen, tmp_mult;
|
||||||
|
|
||||||
|
clip(&src_tl_x, &src_tl_y, &src_br_x, &src_br_y, &dest_x, &dest_y, dest_w, dest_h);
|
||||||
|
|
||||||
|
for (y = src_tl_y; y < src_br_y; y++)
|
||||||
|
for (x = src_tl_x; x < src_br_x; x++)
|
||||||
|
{
|
||||||
|
d_idx = LINEAR((dest_x + x - src_tl_x), (dest_y + y - src_tl_y), dest_w);
|
||||||
|
s_idx = LINEAR(x, y, src_w);
|
||||||
|
|
||||||
|
tmp_screen = 255 - (((255 - R_VAL(dest + d_idx)) * (255 - R_VAL(src + s_idx))) >> 8);
|
||||||
|
tmp_mult = (R_VAL(dest + d_idx) * R_VAL(src + s_idx)) >> 8;
|
||||||
|
R_VAL(dest + d_idx) = (R_VAL(dest + d_idx) * tmp_screen + (255 - R_VAL(dest + d_idx)) * tmp_mult) >> 8;
|
||||||
|
|
||||||
|
tmp_screen = 255 - (((255 - G_VAL(dest + d_idx)) * (255 - G_VAL(src + s_idx))) >> 8);
|
||||||
|
tmp_mult = (G_VAL(dest + d_idx) * G_VAL(src + s_idx)) >> 8;
|
||||||
|
G_VAL(dest + d_idx) = (G_VAL(dest + d_idx) * tmp_screen + (255 - G_VAL(dest + d_idx)) * tmp_mult) >> 8;
|
||||||
|
|
||||||
|
tmp_screen = 255 - (((255 - B_VAL(dest + d_idx)) * (255 - B_VAL(src + s_idx))) >> 8);
|
||||||
|
tmp_mult = (B_VAL(dest + d_idx) * B_VAL(src + s_idx)) >> 8;
|
||||||
|
B_VAL(dest + d_idx) = (B_VAL(dest + d_idx) * tmp_screen + (255 - B_VAL(dest + d_idx)) * tmp_mult) >> 8;
|
||||||
|
|
||||||
|
A_VAL(dest + d_idx) = A_VAL(src + s_idx);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue