[Cogl] [PATCH 1/3] color: Add HSL conversion functions
Robert Bragg
robert at sixbynine.org
Tue May 28 06:30:51 PDT 2013
These look like good additions to me, and would save us duplicating
the same kind of code in Rig too. Maybe later we might even want to
consider the _init_from_string(), _to_string() and _interpolate() apis
we have in Rig.
Comparing with the similar code we have in Rig, I noticed that
cogl_color_init_from_hsl() doesn't initialize the alpha component, so
I think it needs a color->alpha = 1.0; at the end.
As a minor detail we have also switched to updating the gtk-doc
"Since:" attributes to reflect the actual cogl version we next expect
to release with the api (i.e. 1.16) instead of the more vague "2.0"
value since we were getting lots of apis bundled under "2.0" and it
wasn't very meaningful.
With those small tweaks though I think this patch looks good to land to me:
Reviewed-by: Robert Bragg <robert at linux.intel.com>
thanks,
- Robert
On Sun, May 19, 2013 at 6:04 AM, Damien Lespiau
<damien.lespiau at intel.com> wrote:
> This allows to easily caculate shades of the same color or pick colors
> with the same saturation/luminance. In short, all sorts of interesting
> things.
> ---
> cogl/cogl-color.c | 129 +++++++++++++++++++++++++++++++++
> cogl/cogl-color.h | 38 ++++++++++
> doc/reference/cogl2/cogl2-sections.txt | 4 +
> 3 files changed, 171 insertions(+)
>
> diff --git a/cogl/cogl-color.c b/cogl/cogl-color.c
> index 9ed1e15..0dba9da 100644
> --- a/cogl/cogl-color.c
> +++ b/cogl/cogl-color.c
> @@ -266,6 +266,135 @@ cogl_color_free (CoglColor *color)
> }
>
> void
> +cogl_color_to_hsl (const CoglColor *color,
> + float *hue,
> + float *luminance,
> + float *saturation)
> +{
> + float red, green, blue;
> + float min, max, delta;
> + float h, l, s;
> +
> + red = color->red;
> + green = color->green;
> + blue = color->blue;
> +
> + if (red > green)
> + {
> + if (red > blue)
> + max = red;
> + else
> + max = blue;
> +
> + if (green < blue)
> + min = green;
> + else
> + min = blue;
> + }
> + else
> + {
> + if (green > blue)
> + max = green;
> + else
> + max = blue;
> +
> + if (red < blue)
> + min = red;
> + else
> + min = blue;
> + }
> +
> + l = (max + min) / 2;
> + s = 0;
> + h = 0;
> +
> + if (max != min)
> + {
> + if (l <= 0.5)
> + s = (max - min) / (max + min);
> + else
> + s = (max - min) / (2.0 - max - min);
> +
> + delta = max - min;
> +
> + if (red == max)
> + h = (green - blue) / delta;
> + else if (green == max)
> + h = 2.0 + (blue - red) / delta;
> + else if (blue == max)
> + h = 4.0 + (red - green) / delta;
> +
> + h *= 60;
> +
> + if (h < 0)
> + h += 360.0;
> + }
> +
> + if (hue)
> + *hue = h;
> +
> + if (luminance)
> + *luminance = l;
> +
> + if (saturation)
> + *saturation = s;
> +}
> +
> +void
> +cogl_color_init_from_hsl (CoglColor *color,
> + float hue,
> + float luminance,
> + float saturation)
> +{
> + float tmp1, tmp2;
> + float tmp3[3];
> + float clr[3];
> + int i;
> +
> + hue /= 360.0;
> +
> + if (saturation == 0)
> + {
> + color->red = color->green = color->blue = (luminance * 255);
> +
> + return;
> + }
> +
> + if (luminance <= 0.5)
> + tmp2 = luminance * (1.0 + saturation);
> + else
> + tmp2 = luminance + saturation - (luminance * saturation);
> +
> + tmp1 = 2.0 * luminance - tmp2;
> +
> + tmp3[0] = hue + 1.0 / 3.0;
> + tmp3[1] = hue;
> + tmp3[2] = hue - 1.0 / 3.0;
> +
> + for (i = 0; i < 3; i++)
> + {
> + if (tmp3[i] < 0)
> + tmp3[i] += 1.0;
> +
> + if (tmp3[i] > 1)
> + tmp3[i] -= 1.0;
> +
> + if (6.0 * tmp3[i] < 1.0)
> + clr[i] = tmp1 + (tmp2 - tmp1) * tmp3[i] * 6.0;
> + else if (2.0 * tmp3[i] < 1.0)
> + clr[i] = tmp2;
> + else if (3.0 * tmp3[i] < 2.0)
> + clr[i] = (tmp1 + (tmp2 - tmp1) * ((2.0 / 3.0) - tmp3[i]) * 6.0);
> + else
> + clr[i] = tmp1;
> + }
> +
> + color->red = clr[0];
> + color->green = clr[1];
> + color->blue = clr[2];
> +}
> +
> +void
> _cogl_color_get_rgba_4fv (const CoglColor *color,
> float *dest)
> {
> diff --git a/cogl/cogl-color.h b/cogl/cogl-color.h
> index 94726a4..7e520a9 100644
> --- a/cogl/cogl-color.h
> +++ b/cogl/cogl-color.h
> @@ -485,6 +485,44 @@ cogl_color_copy (const CoglColor *color);
> void
> cogl_color_free (CoglColor *color);
>
> +/**
> + * cogl_color_to_hsl:
> + * @color: a #CoglColor
> + * @hue: (out): return location for the hue value or %NULL
> + * @luminance: (out): return location for the luminance value or %NULL
> + * @saturation: (out): return location for the saturation value or %NULL
> + *
> + * Converts @color to the HLS format.
> + *
> + * The @hue value is in the 0 .. 360 range. The @luminance and
> + * @saturation values are in the 0 .. 1 range.
> + *
> + * Since: 2.0
> + */
> +void
> +cogl_color_to_hsl (const CoglColor *color,
> + float *hue,
> + float *luminance,
> + float *saturation);
> +
> +/**
> + * cogl_color_init_from_hsl:
> + * @color: (out): return location for a #CoglColor
> + * @hue: hue value, in the 0 .. 360 range
> + * @luminance: luminance value, in the 0 .. 1 range
> + * @saturation: saturation value, in the 0 .. 1 range
> + *
> + * Converts a color expressed in HLS (hue, luminance and saturation)
> + * values into a #CoglColor.
> + *
> + * Since: 2.0
> + */
> +void
> +cogl_color_init_from_hsl (CoglColor *color,
> + float hue,
> + float luminance,
> + float saturation);
> +
> COGL_END_DECLS
>
> #endif /* __COGL_COLOR_H__ */
> diff --git a/doc/reference/cogl2/cogl2-sections.txt b/doc/reference/cogl2/cogl2-sections.txt
> index 68769bd..4ac1148 100644
> --- a/doc/reference/cogl2/cogl2-sections.txt
> +++ b/doc/reference/cogl2/cogl2-sections.txt
> @@ -628,6 +628,10 @@ cogl_color_set_alpha_float
> cogl_color_premultiply
> cogl_color_unpremultiply
> cogl_color_equal
> +
> +<SUBSECTION>
> +cogl_color_init_from_hls
> +cogl_color_to_hls
> </SECTION>
>
> <SECTION>
> --
> 1.8.1.4
>
> _______________________________________________
> Cogl mailing list
> Cogl at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/cogl
More information about the Cogl
mailing list