app: fixed a bug in gegl legacy blending modes
This commit is contained in:

committed by
Michael Natterer

parent
fa0faf4254
commit
0ac531fa3b
@ -92,7 +92,7 @@ gimp_operation_addition_mode_process (GeglOperation *operation,
|
||||
while (samples--)
|
||||
{
|
||||
gint b;
|
||||
gfloat comp_alpha = in[ALPHA] * layer[ALPHA];
|
||||
gfloat comp_alpha = MIN (in[ALPHA], layer[ALPHA]);
|
||||
gfloat new_alpha = in[ALPHA] + (1 - in[ALPHA]) * comp_alpha;
|
||||
gfloat ratio = comp_alpha / new_alpha;
|
||||
|
||||
@ -101,7 +101,7 @@ gimp_operation_addition_mode_process (GeglOperation *operation,
|
||||
gfloat comp = in[b] + layer[b];
|
||||
comp = CLAMP (comp, 0, 1);
|
||||
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio);
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio) + 0.0001;
|
||||
}
|
||||
|
||||
out[ALPHA] = in[ALPHA];
|
||||
|
@ -92,7 +92,7 @@ gimp_operation_burn_mode_process (GeglOperation *operation,
|
||||
while (samples--)
|
||||
{
|
||||
gint b;
|
||||
gfloat comp_alpha = in[ALPHA] * layer[ALPHA];
|
||||
gfloat comp_alpha = MIN (in[ALPHA], layer[ALPHA]);
|
||||
gfloat new_alpha = in[ALPHA] + (1 - in[ALPHA]) * comp_alpha;
|
||||
gfloat ratio = comp_alpha / new_alpha;
|
||||
|
||||
@ -101,7 +101,7 @@ gimp_operation_burn_mode_process (GeglOperation *operation,
|
||||
gfloat comp = (1 - in[b]) / layer[b];
|
||||
comp = CLAMP (1 - comp, 0, 1);
|
||||
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio);
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio) + 0.0001;
|
||||
}
|
||||
|
||||
out[ALPHA] = in[ALPHA];
|
||||
|
@ -93,7 +93,7 @@ gimp_operation_darken_only_mode_process (GeglOperation *operation,
|
||||
while (samples--)
|
||||
{
|
||||
gint b;
|
||||
gfloat comp_alpha = in[ALPHA] * layer[ALPHA];
|
||||
gfloat comp_alpha = MIN (in[ALPHA], layer[ALPHA]);
|
||||
gfloat new_alpha = in[ALPHA] + (1 - in[ALPHA]) * comp_alpha;
|
||||
gfloat ratio = comp_alpha / new_alpha;
|
||||
|
||||
@ -101,7 +101,7 @@ gimp_operation_darken_only_mode_process (GeglOperation *operation,
|
||||
{
|
||||
gfloat comp = MIN (in[b], layer[b]);
|
||||
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio);
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio) + 0.0001;
|
||||
}
|
||||
|
||||
out[ALPHA] = in[ALPHA];
|
||||
|
@ -92,7 +92,7 @@ gimp_operation_difference_mode_process (GeglOperation *operation,
|
||||
while (samples--)
|
||||
{
|
||||
gint b;
|
||||
gfloat comp_alpha = in[ALPHA] * layer[ALPHA];
|
||||
gfloat comp_alpha = MIN (in[ALPHA], layer[ALPHA]);
|
||||
gfloat new_alpha = in[ALPHA] + (1 - in[ALPHA]) * comp_alpha;
|
||||
gfloat ratio = comp_alpha / new_alpha;
|
||||
|
||||
@ -101,7 +101,7 @@ gimp_operation_difference_mode_process (GeglOperation *operation,
|
||||
gfloat comp = in[b] - layer[b];
|
||||
comp = (comp < 0) ? -comp : comp;
|
||||
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio);
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio) + 0.0001;
|
||||
}
|
||||
|
||||
out[ALPHA] = in[ALPHA];
|
||||
|
@ -76,7 +76,6 @@ gimp_operation_divide_mode_prepare (GeglOperation *operation)
|
||||
gegl_operation_set_format (operation, "output", format);
|
||||
}
|
||||
|
||||
|
||||
static gboolean
|
||||
gimp_operation_divide_mode_process (GeglOperation *operation,
|
||||
void *in_buf,
|
||||
@ -93,16 +92,16 @@ gimp_operation_divide_mode_process (GeglOperation *operation,
|
||||
while (samples--)
|
||||
{
|
||||
gint b;
|
||||
gfloat comp_alpha = in[ALPHA] * layer[ALPHA];
|
||||
gfloat comp_alpha = MIN (in[ALPHA], layer[ALPHA]);
|
||||
gfloat new_alpha = in[ALPHA] + (1 - in[ALPHA]) * comp_alpha;
|
||||
gfloat ratio = comp_alpha / new_alpha;
|
||||
|
||||
for (b = RED; b < ALPHA; b++)
|
||||
{
|
||||
gfloat comp = in[b] / layer[b];
|
||||
gfloat comp = (256 / 255.0 * in[b]) / (1 / 255.0 + layer[b]);
|
||||
comp = MIN (comp, 1);
|
||||
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio);
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio) + 0.0001;
|
||||
}
|
||||
|
||||
out[ALPHA] = in[ALPHA];
|
||||
|
@ -92,7 +92,7 @@ gimp_operation_dodge_mode_process (GeglOperation *operation,
|
||||
while (samples--)
|
||||
{
|
||||
gint b;
|
||||
gfloat comp_alpha = in[ALPHA] * layer[ALPHA];
|
||||
gfloat comp_alpha = MIN (in[ALPHA], layer[ALPHA]);
|
||||
gfloat new_alpha = in[ALPHA] + (1 - in[ALPHA]) * comp_alpha;
|
||||
gfloat ratio = comp_alpha / new_alpha;
|
||||
|
||||
@ -101,7 +101,7 @@ gimp_operation_dodge_mode_process (GeglOperation *operation,
|
||||
gfloat comp = in[b] / (1 - layer[b]);
|
||||
comp = MIN (comp, 1);
|
||||
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio);
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio) + 0.0001;
|
||||
}
|
||||
|
||||
out[ALPHA] = in[ALPHA];
|
||||
|
@ -93,7 +93,7 @@ gimp_operation_grain_extract_mode_process (GeglOperation *operation,
|
||||
while (samples--)
|
||||
{
|
||||
gint b;
|
||||
gfloat comp_alpha = in[ALPHA] * layer[ALPHA];
|
||||
gfloat comp_alpha = MIN (in[ALPHA], layer[ALPHA]);
|
||||
gfloat new_alpha = in[ALPHA] + (1 - in[ALPHA]) * comp_alpha;
|
||||
gfloat ratio = comp_alpha / new_alpha;
|
||||
|
||||
@ -102,7 +102,7 @@ gimp_operation_grain_extract_mode_process (GeglOperation *operation,
|
||||
gfloat comp = in[b] - layer[b] + 0.5;
|
||||
comp = CLAMP (comp, 0, 1);
|
||||
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio);
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio) + 0.0001;
|
||||
}
|
||||
|
||||
out[ALPHA] = in[ALPHA];
|
||||
|
@ -93,7 +93,7 @@ gimp_operation_grain_merge_mode_process (GeglOperation *operation,
|
||||
while (samples--)
|
||||
{
|
||||
gint b;
|
||||
gfloat comp_alpha = in[ALPHA] * layer[ALPHA];
|
||||
gfloat comp_alpha = MIN (in[ALPHA], layer[ALPHA]);
|
||||
gfloat new_alpha = in[ALPHA] + (1 - in[ALPHA]) * comp_alpha;
|
||||
gfloat ratio = comp_alpha / new_alpha;
|
||||
|
||||
@ -102,7 +102,7 @@ gimp_operation_grain_merge_mode_process (GeglOperation *operation,
|
||||
gfloat comp = in[b] + layer[b] - 0.5;
|
||||
comp = CLAMP (comp, 0, 1);
|
||||
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio);
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio) + 0.0001;
|
||||
}
|
||||
|
||||
out[ALPHA] = in[ALPHA];
|
||||
|
@ -92,7 +92,7 @@ gimp_operation_hardlight_mode_process (GeglOperation *operation,
|
||||
while (samples--)
|
||||
{
|
||||
gint b;
|
||||
gfloat comp_alpha = in[ALPHA] * layer[ALPHA];
|
||||
gfloat comp_alpha = MIN (in[ALPHA], layer[ALPHA]);
|
||||
gfloat new_alpha = in[ALPHA] + (1 - in[ALPHA]) * comp_alpha;
|
||||
gfloat ratio = comp_alpha / new_alpha;
|
||||
|
||||
@ -111,7 +111,7 @@ gimp_operation_hardlight_mode_process (GeglOperation *operation,
|
||||
comp = MIN (comp, 1);
|
||||
}
|
||||
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio);
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio) + 0.0001;
|
||||
}
|
||||
|
||||
out[ALPHA] = in[ALPHA];
|
||||
|
@ -92,7 +92,7 @@ gimp_operation_lighten_only_mode_process (GeglOperation *operation,
|
||||
while (samples--)
|
||||
{
|
||||
gint b;
|
||||
gfloat comp_alpha = in[ALPHA] * layer[ALPHA];
|
||||
gfloat comp_alpha = MIN (in[ALPHA], layer[ALPHA]);
|
||||
gfloat new_alpha = in[ALPHA] + (1 - in[ALPHA]) * comp_alpha;
|
||||
gfloat ratio = comp_alpha / new_alpha;
|
||||
|
||||
@ -100,7 +100,7 @@ gimp_operation_lighten_only_mode_process (GeglOperation *operation,
|
||||
{
|
||||
gfloat comp = MAX (layer[b], in[b]);
|
||||
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio);
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio) + 0.0001;
|
||||
}
|
||||
|
||||
out[ALPHA] = in[ALPHA];
|
||||
|
@ -92,7 +92,7 @@ gimp_operation_multiply_mode_process (GeglOperation *operation,
|
||||
while (samples--)
|
||||
{
|
||||
gint b;
|
||||
gfloat comp_alpha = in[ALPHA] * layer[ALPHA];
|
||||
gfloat comp_alpha = MIN (in[ALPHA], layer[ALPHA]);
|
||||
gfloat new_alpha = in[ALPHA] + (1 - in[ALPHA]) * comp_alpha;
|
||||
gfloat ratio = comp_alpha / new_alpha;
|
||||
|
||||
@ -101,7 +101,7 @@ gimp_operation_multiply_mode_process (GeglOperation *operation,
|
||||
gfloat comp = layer[b] * in[b];
|
||||
comp = CLAMP (comp, 0, 1);
|
||||
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio);
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio) + 0.0001;
|
||||
}
|
||||
|
||||
out[ALPHA] = in[ALPHA];
|
||||
|
@ -93,7 +93,7 @@ gimp_operation_overlay_mode_process (GeglOperation *operation,
|
||||
while (samples--)
|
||||
{
|
||||
gint b;
|
||||
gfloat comp_alpha = in[ALPHA] * layer[ALPHA];
|
||||
gfloat comp_alpha = MIN (in[ALPHA], layer[ALPHA]);
|
||||
gfloat new_alpha = in[ALPHA] + (1 - in[ALPHA]) * comp_alpha;
|
||||
gfloat ratio = comp_alpha / new_alpha;
|
||||
|
||||
@ -101,7 +101,7 @@ gimp_operation_overlay_mode_process (GeglOperation *operation,
|
||||
{
|
||||
gfloat comp = in[b] * (in[b] + (2 * layer[b]) * (1 - in[b]));
|
||||
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio);
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio) + 0.0001;
|
||||
}
|
||||
|
||||
out[ALPHA] = in[ALPHA];
|
||||
|
@ -92,7 +92,7 @@ gimp_operation_screen_mode_process (GeglOperation *operation,
|
||||
while (samples--)
|
||||
{
|
||||
gint b;
|
||||
gfloat comp_alpha = in[ALPHA] * layer[ALPHA];
|
||||
gfloat comp_alpha = MIN (in[ALPHA], layer[ALPHA]);
|
||||
gfloat new_alpha = in[ALPHA] + (1 - in[ALPHA]) * comp_alpha;
|
||||
gfloat ratio = comp_alpha / new_alpha;
|
||||
|
||||
@ -100,7 +100,7 @@ gimp_operation_screen_mode_process (GeglOperation *operation,
|
||||
{
|
||||
gfloat comp = 1 - (1 - in[b]) * (1 - layer[b]);
|
||||
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio);
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio) + 0.0001;
|
||||
}
|
||||
|
||||
out[ALPHA] = in[ALPHA];
|
||||
|
@ -93,7 +93,7 @@ gimp_operation_softlight_mode_process (GeglOperation *operation,
|
||||
while (samples--)
|
||||
{
|
||||
gint b;
|
||||
gfloat comp_alpha = in[ALPHA] * layer[ALPHA];
|
||||
gfloat comp_alpha = MIN (in[ALPHA], layer[ALPHA]);
|
||||
gfloat new_alpha = in[ALPHA] + (1 - in[ALPHA]) * comp_alpha;
|
||||
gfloat ratio = comp_alpha / new_alpha;
|
||||
|
||||
@ -103,7 +103,7 @@ gimp_operation_softlight_mode_process (GeglOperation *operation,
|
||||
gfloat screen = 1 - (1 - in[b]) * (1 - layer[b]);
|
||||
gfloat comp = (1 - in[b]) * multiply + in[b] * screen;
|
||||
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio);
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio) + 0.0001;
|
||||
}
|
||||
|
||||
out[ALPHA] = in[ALPHA];
|
||||
|
@ -92,7 +92,7 @@ gimp_operation_subtract_mode_process (GeglOperation *operation,
|
||||
while (samples--)
|
||||
{
|
||||
gint b;
|
||||
gfloat comp_alpha = in[ALPHA] * layer[ALPHA];
|
||||
gfloat comp_alpha = MIN (in[ALPHA], layer[ALPHA]);
|
||||
gfloat new_alpha = in[ALPHA] + (1 - in[ALPHA]) * comp_alpha;
|
||||
gfloat ratio = comp_alpha / new_alpha;
|
||||
|
||||
@ -101,7 +101,7 @@ gimp_operation_subtract_mode_process (GeglOperation *operation,
|
||||
gfloat comp = in[b] - layer[b];
|
||||
comp = (comp < 0) ? 0 : comp;
|
||||
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio);
|
||||
out[b] = comp * ratio + in[b] * (1 - ratio) + 0.0001;
|
||||
}
|
||||
|
||||
out[ALPHA] = in[ALPHA];
|
||||
|
Reference in New Issue
Block a user