From: Sven Neumann <sven@xxxxxxxx>
Date: Thu, 11 Jan 2007 18:55:44 +0100
On Thu, 2007-01-11 at 07:23 -0500, Robert L Krawitz wrote:
> I'll try to get to it tonight, although I think it would be
> useful to have the floating point version also -- if someone's
> writing a plugin that's doing multiple transformations, it keeps
> more precision to do the math in floating point vs. with chars.
> In this case, I suggest that the other floating point variants
> should be marked deprecated.
But gimp_rgb_to_hsl() and gimp_hsl_to_rgb() are floating point
versions. What's your point?
Uh, maybe that I didn't look closely enough :-? Here's an updated
patch.
BTW, in the process of preparing this diff, I notice that the tarball
contains devel-docs/app/Makefile, which almost surely it shouldn't.
diff -ru src/gimp-2.3.13/plug-ins/common/compose.c sandbox/gimp-2.3.13/plug-ins/common/compose.c
--- src/gimp-2.3.13/plug-ins/common/compose.c 2006-09-01 07:14:34.000000000 -0400
+++ sandbox/gimp-2.3.13/plug-ins/common/compose.c 2007-01-11 20:56:22.000000000 -0500
@@ -93,6 +93,11 @@
gint numpix,
guchar *dst,
gboolean dst_has_alpha);
+static void compose_hsl (guchar **src,
+ gint *incr,
+ gint numpix,
+ guchar *dst,
+ gboolean dst_has_alpha);
static void compose_cmy (guchar **src,
gint *incr,
gint numpix,
@@ -211,6 +216,14 @@
{ NULL, NULL, NULL, NULL },
"hsv-compose", compose_hsv },
+ { N_("HSL"), 3,
+ { N_("_Hue:"),
+ N_("_Saturation:"),
+ N_("_Lightness:"),
+ NULL },
+ { NULL, NULL, NULL, NULL },
+ "hsl-compose", compose_hsl },
+
{ N_("CMY"), 3,
{ N_("_Cyan:"),
N_("_Magenta:"),
@@ -337,7 +350,7 @@
{ GIMP_PDB_IMAGE, "image2", "Second input image" },
{ GIMP_PDB_IMAGE, "image3", "Third input image" },
{ GIMP_PDB_IMAGE, "image4", "Fourth input image" },
- { GIMP_PDB_STRING, "compose-type", "What to compose: RGB, RGBA, HSV, CMY, CMYK" },
+ { GIMP_PDB_STRING, "compose-type", "What to compose: RGB, RGBA, HSV, HSL, CMY, CMYK" },
{ GIMP_PDB_INT8, "value1", "Mask value if image 1 is -1" },
{ GIMP_PDB_INT8, "value2", "Mask value if image 2 is -1" },
{ GIMP_PDB_INT8, "value3", "Mask value if image 3 is -1" },
@@ -357,7 +370,7 @@
{ GIMP_PDB_DRAWABLE, "drawable2", "Second input drawable" },
{ GIMP_PDB_DRAWABLE, "drawable3", "Third input drawable" },
{ GIMP_PDB_DRAWABLE, "drawable4", "Fourth input drawable" },
- { GIMP_PDB_STRING, "compose-type", "What to compose: RGB, RGBA, HSV, CMY, CMYK" },
+ { GIMP_PDB_STRING, "compose-type", "What to compose: RGB, RGBA, HSV, HSL, CMY, CMYK" },
{ GIMP_PDB_INT8, "value1", "Mask value if image 1 is -1" },
{ GIMP_PDB_INT8, "value2", "Mask value if image 2 is -1" },
{ GIMP_PDB_INT8, "value3", "Mask value if image 3 is -1" },
@@ -1035,6 +1048,44 @@
static void
+compose_hsl (guchar **src,
+ gint *incr_src,
+ gint numpix,
+ guchar *dst,
+ gboolean dst_has_alpha)
+{
+ register const guchar *hue_src = src[0];
+ register const guchar *sat_src = src[1];
+ register const guchar *lum_src = src[2];
+ register guchar *rgb_dst = dst;
+ register gint count = numpix;
+ gint hue_incr = incr_src[0];
+ gint sat_incr = incr_src[1];
+ gint lum_incr = incr_src[2];
+ GimpHSL hsl;
+ GimpRGB rgb;
+
+ while (count-- > 0)
+ {
+ hsl.h = (gdouble) *hue_src / 255.0;
+ hsl.s = (gdouble) *sat_src / 255.0;
+ hsl.l = (gdouble) *lum_src / 255.0;
+ gimp_hsl_to_rgb (&hsl, &rgb);
+ rgb_dst[0] = (guchar) (rgb.r * 255.999);
+ rgb_dst[1] = (guchar) (rgb.g * 255.999);
+ rgb_dst[2] = (guchar) (rgb.b * 255.999);
+ rgb_dst += 3;
+ hue_src += hue_incr;
+ sat_src += sat_incr;
+ lum_src += lum_incr;
+
+ if (dst_has_alpha)
+ rgb_dst++;
+ }
+}
+
+
+static void
compose_cmy (guchar **src,
gint *incr_src,
gint numpix,
diff -ru src/gimp-2.3.13/plug-ins/common/decompose.c sandbox/gimp-2.3.13/plug-ins/common/decompose.c
--- src/gimp-2.3.13/plug-ins/common/decompose.c 2006-06-27 06:33:49.000000000 -0400
+++ sandbox/gimp-2.3.13/plug-ins/common/decompose.c 2007-01-11 20:55:51.000000000 -0500
@@ -100,12 +100,20 @@
gint bpp, gint numpix, guchar **dst);
static void extract_hsv (const guchar *src,
gint bpp, gint numpix, guchar **dst);
+static void extract_hsl (const guchar *src,
+ gint bpp, gint numpix, guchar **dst);
static void extract_hue (const guchar *src,
gint bpp, gint numpix, guchar **dst);
static void extract_sat (const guchar *src,
gint bpp, gint numpix, guchar **dst);
static void extract_val (const guchar *src,
gint bpp, gint numpix, guchar **dst);
+static void extract_huel (const guchar *src,
+ gint bpp, gint numpix, guchar **dst);
+static void extract_satl (const guchar *src,
+ gint bpp, gint numpix, guchar **dst);
+static void extract_lightness (const guchar *src,
+ gint bpp, gint numpix, guchar **dst);
static void extract_cmy (const guchar *src,
gint bpp, gint numpix, guchar **dst);
static void extract_cyan (const guchar *src,
@@ -182,6 +190,15 @@
{ N_("Value"), FALSE, 1, { N_("value") }, extract_val },
+ { N_("HSL"), TRUE, 3, { N_("hue_l"),
+ N_("saturation_l"),
+ N_("lightness") }, extract_hsl },
+
+ { N_("Hue (HSL)"), FALSE, 1, { N_("hue_l") }, extract_huel },
+ { N_("Saturation (HSL)"), FALSE, 1, { N_("saturation_l") }, extract_satl },
+ { N_("Lightness"), FALSE, 1, { N_("lightness")}, extract_lightness },
+
+
{ N_("CMY"), TRUE, 3, { N_("cyan"),
N_("magenta"),
N_("yellow") }, extract_cmy },
@@ -957,6 +974,106 @@
static void
+extract_hsl (const guchar *src,
+ gint bpp,
+ gint numpix,
+ guchar **dst)
+{
+ register const guchar *rgb_src = src;
+ register guchar *hue_dst = dst[0];
+ register guchar *sat_dst = dst[1];
+ register guchar *lum_dst = dst[2];
+ register gint count = numpix, offset = bpp;
+ GimpRGB rgb;
+ GimpHSL hsl;
+
+ while (count-- > 0)
+ {
+ rgb.r = (gdouble) rgb_src[0] / 255.0;
+ rgb.g = (gdouble) rgb_src[1] / 255.0;
+ rgb.b = (gdouble) rgb_src[2] / 255.0;
+ gimp_rgb_to_hsl (&rgb, &hsl);
+ *hue_dst++ = (guchar) (hsl.h * 255.999);
+ *sat_dst++ = (guchar) (hsl.s * 255.999);
+ *lum_dst++ = (guchar) (hsl.l * 255.999);
+ rgb_src += offset;
+ }
+}
+
+
+static void
+extract_huel (const guchar *src,
+ gint bpp,
+ gint numpix,
+ guchar **dst)
+{
+ register const guchar *rgb_src = src;
+ register guchar *hue_dst = dst[0];
+ register gint count = numpix, offset = bpp;
+ GimpRGB rgb;
+ GimpHSL hsl;
+
+ while (count-- > 0)
+ {
+ rgb.r = (gdouble) rgb_src[0] / 255.0;
+ rgb.g = (gdouble) rgb_src[1] / 255.0;
+ rgb.b = (gdouble) rgb_src[2] / 255.0;
+ gimp_rgb_to_hsl (&rgb, &hsl);
+ *hue_dst++ = (guchar) (hsl.h * 255.999);
+ rgb_src += offset;
+ }
+}
+
+
+static void
+extract_satl (const guchar *src,
+ gint bpp,
+ gint numpix,
+ guchar **dst)
+{
+ register const guchar *rgb_src = src;
+ register guchar *sat_dst = dst[0];
+ register gint count = numpix, offset = bpp;
+ GimpRGB rgb;
+ GimpHSL hsl;
+
+ while (count-- > 0)
+ {
+ rgb.r = (gdouble) rgb_src[0] / 255.0;
+ rgb.g = (gdouble) rgb_src[1] / 255.0;
+ rgb.b = (gdouble) rgb_src[2] / 255.0;
+ gimp_rgb_to_hsl (&rgb, &hsl);
+ *sat_dst++ = (guchar) (hsl.s * 255.999);
+ rgb_src += offset;
+ }
+}
+
+
+static void
+extract_lightness (const guchar *src,
+ gint bpp,
+ gint numpix,
+ guchar **dst)
+{
+ register const guchar *rgb_src = src;
+ register guchar *lum_dst = dst[0];
+ register gint count = numpix, offset = bpp;
+ GimpRGB rgb;
+ GimpHSL hsl;
+
+ while (count-- > 0)
+ {
+ rgb.r = (gdouble) rgb_src[0] / 255.0;
+ rgb.g = (gdouble) rgb_src[1] / 255.0;
+ rgb.b = (gdouble) rgb_src[2] / 255.0;
+ gimp_rgb_to_hsl (&rgb, &hsl);
+ *lum_dst++ = (guchar) (hsl.l * 255.999);
+ rgb_src += offset;
+ }
+}
+
+
+static void
extract_cyan (const guchar *src,
gint bpp,
gint numpix,
_______________________________________________
Gimp-developer mailing list
Gimp-developer@xxxxxxxxxxxxxxxxxxxxxx
https://lists.XCF.Berkeley.EDU/mailman/listinfo/gimp-developer