[gimp] Bug 755270 - Decompose/Compose LAB: scaling code produces odd L, a, and b values
- From: Michael Natterer <mitch src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gimp] Bug 755270 - Decompose/Compose LAB: scaling code produces odd L, a, and b values
- Date: Tue, 24 Nov 2015 11:45:47 +0000 (UTC)
commit f78dec232a643c4b44ac849f1889ba80a4db470e
Author: Elle Stone <ellestone ninedegreesbelow com>
Date: Mon Sep 21 14:40:04 2015 -0400
Bug 755270 - Decompose/Compose LAB: scaling code produces odd L, a, and b values
Decompose/compose to/from LCH: remove unconditional CLAMP (only clamp
if the component really needs clamping), change LAB AB range.
plug-ins/common/compose.c | 15 ++++++++++++-
plug-ins/common/decompose.c | 45 ++++++++++++++++++++++++++++++++----------
2 files changed, 47 insertions(+), 13 deletions(-)
---
diff --git a/plug-ins/common/compose.c b/plug-ins/common/compose.c
index e8c0fb9..b1bfd52 100644
--- a/plug-ins/common/compose.c
+++ b/plug-ins/common/compose.c
@@ -173,8 +173,12 @@ static void type_combo_callback (GimpIntComboBox *combo,
#define CPN_CMY_Y {"yellow", N_("_Yellow:"), NULL, 0.0, 1.0, TRUE}
#define CPN_LAB_L {"CIE L", N_("_L:"), NULL, 0.0, 100.0, TRUE}
-#define CPN_LAB_A {"CIE a", N_("_A:"), NULL, -128.0, 127.0, TRUE}
-#define CPN_LAB_B {"CIE b", N_("_B:"), NULL, -128.0, 127.0, TRUE}
+#define CPN_LAB_A {"CIE a", N_("_A:"), NULL, -127.5, 127.5, TRUE}
+#define CPN_LAB_B {"CIE b", N_("_B:"), NULL, -127.5, 127.5, TRUE}
+
+#define CPN_LCH_L {"CIE L", N_("_L"), NULL, 0.0, 100.0, TRUE}
+#define CPN_LCH_C {"CIE C(ab)", N_("_C"), NULL, 0.0, 200.0, TRUE}
+#define CPN_LCH_H {"CIE H(ab)", N_("_H"), NULL, 0.0, 360.0, TRUE}
#define CPN_YCBCR_Y {"Y'", N_("_Luma y470:"), NULL, 0.0, 1.0, TRUE}
#define CPN_YCBCR_CB {"Cb", N_("_Blueness cb470:"), NULL, -0.5, 0.5, TRUE}
@@ -238,6 +242,13 @@ static COMPOSE_DSC compose_dsc[] =
CPN_LAB_B },
"lab-compose" },
+ { "CIE LCH(ab)",
+ N_("LCH"), 3,
+ { CPN_LCH_L,
+ CPN_LCH_C,
+ CPN_LCH_H },
+ "lch-compose" },
+
{ "Y'CbCr",
N_("YCbCr_ITU_R470"), 3,
{ CPN_YCBCR_Y,
diff --git a/plug-ins/common/decompose.c b/plug-ins/common/decompose.c
index 59c8524..7bcb2f0 100644
--- a/plug-ins/common/decompose.c
+++ b/plug-ins/common/decompose.c
@@ -121,7 +121,8 @@ static void transfer_registration_color (GeglBuffer *src,
gint count);
static void cpn_affine_transform_clamp (GeglBuffer *buffer,
gdouble min,
- gdouble max);
+ gdouble max,
+ gboolean clamp);
static void copy_n_components (GeglBuffer *src,
GeglBuffer **dst,
EXTRACT ext);
@@ -159,8 +160,12 @@ static gchar * generate_filename (guint32 image_ID,
#define CPN_CMY_Y {"yellow", N_("yellow"), 0.0, 1.0, TRUE}
#define CPN_LAB_L {"CIE L", N_("L"), 0.0, 100.0, TRUE}
-#define CPN_LAB_A {"CIE a", N_("A"), -128.0, 127.0, TRUE}
-#define CPN_LAB_B {"CIE b", N_("B"), -128.0, 127.0, TRUE}
+#define CPN_LAB_A {"CIE a", N_("A"), -127.5, 127.5, TRUE}
+#define CPN_LAB_B {"CIE b", N_("B"), -127.5, 127.5, TRUE}
+
+#define CPN_LCH_L {"CIE L", N_("L"), 0.0, 100.0, TRUE}
+#define CPN_LCH_C {"CIE C(ab)", N_("C"), 0.0, 200.0, TRUE}
+#define CPN_LCH_H {"CIE H(ab)", N_("H"), 0.0, 360.0, TRUE}
#define CPN_YCBCR_Y {"Y'", N_("luma-y470"), 0.0, 1.0, TRUE}
#define CPN_YCBCR_CB {"Cb", N_("blueness-cb470"), -0.5, 0.5, TRUE}
@@ -202,6 +207,8 @@ static const EXTRACT extract[] =
{ N_("LAB"), "CIE Lab", TRUE, 3, FALSE, {CPN_LAB_L, CPN_LAB_A, CPN_LAB_B} },
+ { N_("LCH"), "CIE LCH(ab)", TRUE, 3, FALSE, {CPN_LCH_L, CPN_LCH_C, CPN_LCH_H} },
+
{ N_("YCbCr_ITU_R470"), "Y'CbCr", TRUE, 3, FALSE, { CPN_YCBCR_Y, CPN_YCBCR_CB, CPN_YCBCR_CR} },
{ N_("YCbCr_ITU_R470_256"), "Y'CbCr", TRUE, 3, TRUE, { CPN_YCBCR_Y, CPN_YCBCR_CB, CPN_YCBCR_CR} },
@@ -672,12 +679,12 @@ transfer_registration_color (GeglBuffer *src,
static void
cpn_affine_transform_clamp (GeglBuffer *buffer,
gdouble min,
- gdouble max)
+ gdouble max,
+ gboolean clamp)
{
GeglBufferIterator *gi;
-
- gdouble scale = 1.0 / (max - min);
- gdouble offset = - min;
+ gdouble scale = 1.0 / (max - min);
+ gdouble offset = - min;
/* We want to scale values linearly, regardless of the format of the buffer */
gegl_buffer_set_format (buffer, babl_format ("Y double"));
@@ -692,9 +699,19 @@ cpn_affine_transform_clamp (GeglBuffer *buffer,
data = (double*) gi->data[0];
- for (k = 0; k < gi->length; k++)
+ if (clamp)
+ {
+ for (k = 0; k < gi->length; k++)
+ {
+ data[k] = CLAMP ((data[k] + offset) * scale, 0.0, 1.0);
+ }
+ }
+ else
{
- data[k] = CLAMP ((data[k] + offset) * scale, 0.0, 1.0);
+ for (k = 0; k < gi->length; k++)
+ {
+ data[k] = (data[k] + offset) * scale;
+ }
}
}
}
@@ -747,8 +764,14 @@ copy_one_component (GeglBuffer *src,
gegl_buffer_set_format (temp, component_format);
gegl_buffer_copy (src, NULL, GEGL_ABYSS_NONE, temp, NULL);
- if (component.range_min != 0.0 || component.range_max != 1.0 || clamp)
- cpn_affine_transform_clamp (temp, component.range_min, component.range_max);
+ if (component.range_min != 0.0 ||
+ component.range_max != 1.0 ||
+ clamp)
+ {
+ cpn_affine_transform_clamp (temp,
+ component.range_min, component.range_max,
+ clamp);
+ }
/* This is our new "Y(') double" component buffer */
gegl_buffer_set_format (temp, NULL);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]