mirror of https://github.com/GNOME/gimp.git
app: remove premultiplied blending code from the few ops that had it
Change GimpOperationPointLayerMode's "premultiplied" to "linear" and set format to "RGBA float" if it's TRUE. Everything defaults to FALSE so nothing changes.
This commit is contained in:
parent
0ff07fa385
commit
9b6703371e
|
@ -266,7 +266,7 @@ void
|
||||||
gimp_gegl_mode_node_set (GeglNode *node,
|
gimp_gegl_mode_node_set (GeglNode *node,
|
||||||
GimpLayerModeEffects mode,
|
GimpLayerModeEffects mode,
|
||||||
gdouble opacity,
|
gdouble opacity,
|
||||||
gboolean premultiplied)
|
gboolean linear)
|
||||||
{
|
{
|
||||||
const gchar *operation = "gimp:normal-mode";
|
const gchar *operation = "gimp:normal-mode";
|
||||||
|
|
||||||
|
@ -305,9 +305,9 @@ gimp_gegl_mode_node_set (GeglNode *node,
|
||||||
}
|
}
|
||||||
|
|
||||||
gegl_node_set (node,
|
gegl_node_set (node,
|
||||||
"operation", operation,
|
"operation", operation,
|
||||||
"opacity", opacity,
|
"opacity", opacity,
|
||||||
"premultiplied", premultiplied,
|
"linear", linear,
|
||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -49,7 +49,7 @@ GeglNode * gimp_gegl_add_buffer_source (GeglNode *parent,
|
||||||
void gimp_gegl_mode_node_set (GeglNode *node,
|
void gimp_gegl_mode_node_set (GeglNode *node,
|
||||||
GimpLayerModeEffects mode,
|
GimpLayerModeEffects mode,
|
||||||
gdouble opacity,
|
gdouble opacity,
|
||||||
gboolean premultiplied);
|
gboolean linear);
|
||||||
void gimp_gegl_node_set_matrix (GeglNode *node,
|
void gimp_gegl_node_set_matrix (GeglNode *node,
|
||||||
const GimpMatrix3 *matrix);
|
const GimpMatrix3 *matrix);
|
||||||
|
|
||||||
|
|
|
@ -83,63 +83,37 @@ gimp_operation_behind_mode_process (GeglOperation *operation,
|
||||||
gfloat *out = out_buf;
|
gfloat *out = out_buf;
|
||||||
const gboolean has_mask = mask != NULL;
|
const gboolean has_mask = mask != NULL;
|
||||||
|
|
||||||
if (point->premultiplied)
|
while (samples--)
|
||||||
{
|
{
|
||||||
while (samples--)
|
gint b;
|
||||||
|
gdouble value = opacity;
|
||||||
|
|
||||||
|
if (has_mask)
|
||||||
|
value *= *mask;
|
||||||
|
|
||||||
|
out[ALPHA] = in[ALPHA] + (1.0 - in[ALPHA]) * layer[ALPHA] * value;
|
||||||
|
|
||||||
|
if (out[ALPHA])
|
||||||
|
{
|
||||||
|
for (b = RED; b < ALPHA; b++)
|
||||||
|
{
|
||||||
|
out[b] = (in[b] * in[ALPHA] + layer[b] * value * layer[ALPHA] * value * (1.0 - in[ALPHA])) / out[ALPHA];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
gint b;
|
|
||||||
gdouble value = opacity;
|
|
||||||
|
|
||||||
if (has_mask)
|
|
||||||
value *= *mask;
|
|
||||||
|
|
||||||
for (b = RED; b <= ALPHA; b++)
|
for (b = RED; b <= ALPHA; b++)
|
||||||
{
|
{
|
||||||
out[b] = in[b] + layer[b] * value * (1.0 - in[ALPHA]);
|
out[b] = in[b];
|
||||||
}
|
}
|
||||||
|
|
||||||
in += 4;
|
|
||||||
layer += 4;
|
|
||||||
out += 4;
|
|
||||||
|
|
||||||
if (has_mask)
|
|
||||||
mask++;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
while (samples--)
|
|
||||||
{
|
|
||||||
gint b;
|
|
||||||
gdouble value = opacity;
|
|
||||||
|
|
||||||
if (has_mask)
|
in += 4;
|
||||||
value *= *mask;
|
layer += 4;
|
||||||
|
out += 4;
|
||||||
|
|
||||||
out[ALPHA] = in[ALPHA] + (1.0 - in[ALPHA]) * layer[ALPHA] * value;
|
if (has_mask)
|
||||||
|
mask++;
|
||||||
if (out[ALPHA])
|
|
||||||
{
|
|
||||||
for (b = RED; b < ALPHA; b++)
|
|
||||||
{
|
|
||||||
out[b] = (in[b] * in[ALPHA] + layer[b] * value * layer[ALPHA] * value * (1.0 - in[ALPHA])) / out[ALPHA];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
for (b = RED; b <= ALPHA; b++)
|
|
||||||
{
|
|
||||||
out[b] = in[b];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
in += 4;
|
|
||||||
layer += 4;
|
|
||||||
out += 4;
|
|
||||||
|
|
||||||
if (has_mask)
|
|
||||||
mask++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
|
@ -96,55 +96,27 @@ gimp_operation_erase_mode_process (GeglOperation *operation,
|
||||||
gfloat *out = out_buf;
|
gfloat *out = out_buf;
|
||||||
const gboolean has_mask = mask != NULL;
|
const gboolean has_mask = mask != NULL;
|
||||||
|
|
||||||
if (point->premultiplied)
|
while (samples--)
|
||||||
{
|
{
|
||||||
while (samples--)
|
gint b;
|
||||||
|
gdouble value = opacity;
|
||||||
|
|
||||||
|
if (has_mask)
|
||||||
|
value *= (*mask);
|
||||||
|
|
||||||
|
for (b = RED; b < ALPHA; b++)
|
||||||
{
|
{
|
||||||
gint b;
|
out[b] = in[b];
|
||||||
gdouble value = opacity;
|
|
||||||
|
|
||||||
if (has_mask)
|
|
||||||
value *= (*mask);
|
|
||||||
|
|
||||||
out[ALPHA] = in[ALPHA] - in[ALPHA] * layer[ALPHA] * value;
|
|
||||||
|
|
||||||
for (b = RED; b < ALPHA; b++)
|
|
||||||
{
|
|
||||||
out[b] = in[b] / in[ALPHA] * out[ALPHA];
|
|
||||||
}
|
|
||||||
|
|
||||||
in += 4;
|
|
||||||
layer += 4;
|
|
||||||
out += 4;
|
|
||||||
|
|
||||||
if (has_mask)
|
|
||||||
mask ++;
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
while (samples--)
|
|
||||||
{
|
|
||||||
gint b;
|
|
||||||
gdouble value = opacity;
|
|
||||||
|
|
||||||
if (has_mask)
|
out[ALPHA] = in[ALPHA] - in[ALPHA] * layer[ALPHA] * value;
|
||||||
value *= (*mask);
|
|
||||||
|
|
||||||
for (b = RED; b < ALPHA; b++)
|
in += 4;
|
||||||
{
|
layer += 4;
|
||||||
out[b] = in[b];
|
out += 4;
|
||||||
}
|
|
||||||
|
|
||||||
out[ALPHA] = in[ALPHA] - in[ALPHA] * layer[ALPHA] * value;
|
if (has_mask)
|
||||||
|
mask ++;
|
||||||
in += 4;
|
|
||||||
layer += 4;
|
|
||||||
out += 4;
|
|
||||||
|
|
||||||
if (has_mask)
|
|
||||||
mask ++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
|
@ -162,72 +162,41 @@ gimp_operation_normal_mode_process (GeglOperation *operation,
|
||||||
gfloat *out = out_buf;
|
gfloat *out = out_buf;
|
||||||
const gboolean has_mask = mask != NULL;
|
const gboolean has_mask = mask != NULL;
|
||||||
|
|
||||||
if (point->premultiplied)
|
while (samples--)
|
||||||
{
|
{
|
||||||
while (samples--)
|
gfloat aux_alpha;
|
||||||
{
|
|
||||||
gdouble value;
|
|
||||||
gfloat aux_alpha;
|
|
||||||
gint b;
|
|
||||||
|
|
||||||
value = opacity;
|
aux_alpha = aux[ALPHA] * opacity;
|
||||||
if (has_mask)
|
if (has_mask)
|
||||||
value *= *mask;
|
aux_alpha *= *mask;
|
||||||
aux_alpha = aux[ALPHA] * value;
|
|
||||||
|
out[ALPHA] = aux_alpha + in[ALPHA] - aux_alpha * in[ALPHA];
|
||||||
|
|
||||||
|
if (out[ALPHA])
|
||||||
|
{
|
||||||
|
gint b;
|
||||||
|
|
||||||
for (b = RED; b < ALPHA; b++)
|
for (b = RED; b < ALPHA; b++)
|
||||||
{
|
{
|
||||||
out[b] = aux[b] * value + in[b] * (1.0f - aux_alpha);
|
out[b] = (aux[b] * aux_alpha + in[b] * in[ALPHA] * (1.0f - aux_alpha)) / out[ALPHA];
|
||||||
}
|
}
|
||||||
|
|
||||||
out[ALPHA] = aux_alpha + in[ALPHA] - aux_alpha * in[ALPHA];
|
|
||||||
|
|
||||||
in += 4;
|
|
||||||
aux += 4;
|
|
||||||
out += 4;
|
|
||||||
|
|
||||||
if (has_mask)
|
|
||||||
mask++;
|
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
else
|
|
||||||
{
|
|
||||||
while (samples--)
|
|
||||||
{
|
{
|
||||||
gfloat aux_alpha;
|
gint b;
|
||||||
|
|
||||||
aux_alpha = aux[ALPHA] * opacity;
|
for (b = RED; b < ALPHA; b++)
|
||||||
if (has_mask)
|
|
||||||
aux_alpha *= *mask;
|
|
||||||
|
|
||||||
out[ALPHA] = aux_alpha + in[ALPHA] - aux_alpha * in[ALPHA];
|
|
||||||
|
|
||||||
if (out[ALPHA])
|
|
||||||
{
|
{
|
||||||
gint b;
|
out[b] = in[b];
|
||||||
|
|
||||||
for (b = RED; b < ALPHA; b++)
|
|
||||||
{
|
|
||||||
out[b] = (aux[b] * aux_alpha + in[b] * in[ALPHA] * (1.0f - aux_alpha)) / out[ALPHA];
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
{
|
|
||||||
gint b;
|
|
||||||
|
|
||||||
for (b = RED; b < ALPHA; b++)
|
|
||||||
{
|
|
||||||
out[b] = in[b];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
in += 4;
|
|
||||||
aux += 4;
|
|
||||||
out += 4;
|
|
||||||
|
|
||||||
if (has_mask)
|
|
||||||
mask++;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
in += 4;
|
||||||
|
aux += 4;
|
||||||
|
out += 4;
|
||||||
|
|
||||||
|
if (has_mask)
|
||||||
|
mask++;
|
||||||
}
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
|
@ -35,7 +35,7 @@
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
PROP_0,
|
PROP_0,
|
||||||
PROP_PREMULTIPLIED,
|
PROP_LINEAR,
|
||||||
PROP_OPACITY
|
PROP_OPACITY
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -73,8 +73,8 @@ gimp_operation_point_layer_mode_class_init (GimpOperationPointLayerModeClass *kl
|
||||||
"categories", "compositors",
|
"categories", "compositors",
|
||||||
NULL);
|
NULL);
|
||||||
|
|
||||||
g_object_class_install_property (object_class, PROP_PREMULTIPLIED,
|
g_object_class_install_property (object_class, PROP_LINEAR,
|
||||||
g_param_spec_boolean ("premultiplied",
|
g_param_spec_boolean ("linear",
|
||||||
NULL, NULL,
|
NULL, NULL,
|
||||||
FALSE,
|
FALSE,
|
||||||
GIMP_PARAM_READWRITE |
|
GIMP_PARAM_READWRITE |
|
||||||
|
@ -103,8 +103,8 @@ gimp_operation_point_layer_mode_set_property (GObject *object,
|
||||||
|
|
||||||
switch (property_id)
|
switch (property_id)
|
||||||
{
|
{
|
||||||
case PROP_PREMULTIPLIED:
|
case PROP_LINEAR:
|
||||||
self->premultiplied = g_value_get_boolean (value);
|
self->linear = g_value_get_boolean (value);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_OPACITY:
|
case PROP_OPACITY:
|
||||||
|
@ -127,8 +127,8 @@ gimp_operation_point_layer_mode_get_property (GObject *object,
|
||||||
|
|
||||||
switch (property_id)
|
switch (property_id)
|
||||||
{
|
{
|
||||||
case PROP_PREMULTIPLIED:
|
case PROP_LINEAR:
|
||||||
g_value_set_boolean (value, self->premultiplied);
|
g_value_set_boolean (value, self->linear);
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case PROP_OPACITY:
|
case PROP_OPACITY:
|
||||||
|
@ -147,8 +147,8 @@ gimp_operation_point_layer_mode_prepare (GeglOperation *operation)
|
||||||
GimpOperationPointLayerMode *self = GIMP_OPERATION_POINT_LAYER_MODE (operation);
|
GimpOperationPointLayerMode *self = GIMP_OPERATION_POINT_LAYER_MODE (operation);
|
||||||
const Babl *format;
|
const Babl *format;
|
||||||
|
|
||||||
if (self->premultiplied)
|
if (self->linear)
|
||||||
format = babl_format ("R'aG'aB'aA float");
|
format = babl_format ("RGBA float");
|
||||||
else
|
else
|
||||||
format = babl_format ("R'G'B'A float");
|
format = babl_format ("R'G'B'A float");
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ struct _GimpOperationPointLayerMode
|
||||||
{
|
{
|
||||||
GeglOperationPointComposer3 parent_instance;
|
GeglOperationPointComposer3 parent_instance;
|
||||||
|
|
||||||
gboolean premultiplied;
|
gboolean linear;
|
||||||
gdouble opacity;
|
gdouble opacity;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue