[gegl] opacity: generalize for grayscale rgb and cmyk
- From: Øyvind "pippin" Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gegl] opacity: generalize for grayscale rgb and cmyk
- Date: Tue, 4 Dec 2018 01:01:22 +0000 (UTC)
commit 83601142dcba93112899d28d34a19e31d739ae16
Author: Øyvind Kolås <pippin gimp org>
Date: Tue Dec 4 01:59:22 2018 +0100
opacity: generalize for grayscale rgb and cmyk
operations/common/opacity.c | 110 +++++++++++++++++---------------------------
1 file changed, 41 insertions(+), 69 deletions(-)
---
diff --git a/operations/common/opacity.c b/operations/common/opacity.c
index c3996818f..b62aef056 100644
--- a/operations/common/opacity.c
+++ b/operations/common/opacity.c
@@ -45,43 +45,9 @@ prepare (GeglOperation *self)
{
const Babl *space = gegl_operation_get_source_space (self, "input");
const Babl *fmt = gegl_operation_get_source_format (self, "input");
- GeglProperties *o = GEGL_PROPERTIES (self);
+ //GeglProperties *o = GEGL_PROPERTIES (self);
- if (fmt)
- {
- const Babl *model = babl_format_get_model (fmt);
-
- if (babl_model_is (model, "R'aG'aB'aA") ||
- babl_model_is (model, "Y'aA"))
- {
- o->user_data = NULL;
- fmt = babl_format_with_space ("R'aG'aB'aA float", space);
- }
- else if (babl_model_is (model, "RaGaBaA") ||
- babl_model_is (model, "YaA"))
- {
- o->user_data = NULL;
- fmt = babl_format_with_space ("RaGaBaA float", space);
- }
- else if (babl_model_is (model, "R'G'B'A") ||
- babl_model_is (model, "R'G'B'") ||
- babl_model_is (model, "Y'") ||
- babl_model_is (model, "Y'A"))
- {
- o->user_data = (void*)0xabc;
- fmt = babl_format_with_space ("R'G'B'A float", space);
- }
- else
- {
- o->user_data = (void*)0xabc;
- fmt = babl_format_with_space ("RGBA float", space);
- }
- }
- else
- {
- o->user_data = (void*)0xabc;
- fmt = babl_format_with_space ("RGBA float", space);
- }
+ fmt = gegl_babl_variant (fmt, GEGL_BABL_VARIANT_ALPHA);
gegl_operation_set_format (self, "input", fmt);
gegl_operation_set_format (self, "output", fmt);
@@ -91,13 +57,14 @@ prepare (GeglOperation *self)
}
static void
-process_RaGaBaAfloat (GeglOperation *op,
+process_premultiplied_float (GeglOperation *op,
void *in_buf,
void *aux_buf,
void *out_buf,
glong samples,
const GeglRectangle *roi,
- gint level)
+ gint level,
+ gint components)
{
gfloat *in = in_buf;
gfloat *out = out_buf;
@@ -109,20 +76,20 @@ process_RaGaBaAfloat (GeglOperation *op,
while (samples--)
{
gint j;
- for (j=0; j<4; j++)
+ for (j=0; j<components; j++)
out[j] = in[j] * value;
- in += 4;
- out += 4;
+ in += components;
+ out += components;
}
}
else if (fabsf (value - 1.0f) <= EPSILON)
while (samples--)
{
gint j;
- for (j=0; j<4; j++)
+ for (j=0; j<components; j++)
out[j] = in[j] * (*aux);
- in += 4;
- out += 4;
+ in += components;
+ out += components;
aux += 1;
}
else
@@ -130,26 +97,28 @@ process_RaGaBaAfloat (GeglOperation *op,
{
gfloat v = (*aux) * value;
gint j;
- for (j=0; j<4; j++)
+ for (j=0; j<components; j++)
out[j] = in[j] * v;
- in += 4;
- out += 4;
+ in += components;
+ out += components;
aux += 1;
}
}
static void
-process_RGBAfloat (GeglOperation *op,
- void *in_buf,
- void *aux_buf,
- void *out_buf,
- glong samples,
- const GeglRectangle *roi,
- gint level)
+process_with_alpha_float (GeglOperation *op,
+ void *in_buf,
+ void *aux_buf,
+ void *out_buf,
+ glong samples,
+ const GeglRectangle *roi,
+ gint level,
+ gint components)
{
gfloat *in = in_buf;
gfloat *out = out_buf;
gfloat *aux = aux_buf;
+ gint ccomponents = components - 1;
gfloat value = GEGL_PROPERTIES (op)->value;
if (aux == NULL)
@@ -157,22 +126,22 @@ process_RGBAfloat (GeglOperation *op,
while (samples--)
{
gint j;
- for (j=0; j<3; j++)
+ for (j=0; j<ccomponents; j++)
out[j] = in[j];
- out[3] = in[3] * value;
- in += 4;
- out += 4;
+ out[ccomponents] = in[ccomponents] * value;
+ in += components;
+ out += components;
}
}
else if (fabsf (value - 1.0f) <= EPSILON)
while (samples--)
{
gint j;
- for (j=0; j<3; j++)
+ for (j=0; j<ccomponents; j++)
out[j] = in[j];
- out[3] = in[3] * (*aux);
- in += 4;
- out += 4;
+ out[ccomponents] = in[ccomponents] * (*aux);
+ in += components;
+ out += components;
aux += 1;
}
else
@@ -180,11 +149,11 @@ process_RGBAfloat (GeglOperation *op,
{
gfloat v = (*aux) * value;
gint j;
- for (j=0; j<3; j++)
+ for (j=0; j<ccomponents; j++)
out[j] = in[j];
- out[3] = in[3] * v;
- in += 4;
- out += 4;
+ out[ccomponents] = in[ccomponents] * v;
+ in += components;
+ out += components;
aux += 1;
}
}
@@ -198,10 +167,13 @@ process (GeglOperation *op,
const GeglRectangle *roi,
gint level)
{
- if (GEGL_PROPERTIES (op)->user_data != NULL)
- process_RGBAfloat (op, in_buf, aux_buf, out_buf, samples, roi, level);
+ const Babl *format = gegl_operation_get_format (op, "output");
+ int components = babl_format_get_n_components (format);
+
+ if (babl_get_model_flags (format) & BABL_MODEL_FLAG_PREMULTIPLIED)
+ process_premultiplied_float (op, in_buf, aux_buf, out_buf, samples, roi, level, components);
else
- process_RaGaBaAfloat (op, in_buf, aux_buf, out_buf, samples, roi, level);
+ process_with_alpha_float (op, in_buf, aux_buf, out_buf, samples, roi, level, components);
return TRUE;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]