app: improve performance of HSV value mode

No need to do full back and forth RGB/HSV conversions.
This commit is contained in:
Ell 2017-03-15 18:37:35 -04:00
parent 3fa2c91502
commit bcb242df64

View file

@ -1909,19 +1909,29 @@ blendfun_hsv_value (const float *dest,
{
if (dest[ALPHA] != 0.0f && src[ALPHA] != 0.0f)
{
GimpRGB dest_rgb = { dest[0], dest[1], dest[2] };
GimpRGB src_rgb = { src[0], src[1], src[2] };
GimpHSV src_hsv, dest_hsv;
gfloat dest_v;
gfloat src_v;
gimp_rgb_to_hsv (&dest_rgb, &dest_hsv);
gimp_rgb_to_hsv (&src_rgb, &src_hsv);
dest_v = MAX (dest[0], dest[1]);
dest_v = MAX (dest_v, dest[2]);
dest_hsv.v = src_hsv.v;
gimp_hsv_to_rgb (&dest_hsv, &dest_rgb);
src_v = MAX (src[0], src[1]);
src_v = MAX (src_v, src[2]);
out[RED] = dest_rgb.r;
out[GREEN] = dest_rgb.g;
out[BLUE] = dest_rgb.b;
if (dest_v != 0.0f)
{
gfloat ratio = src_v / dest_v;
gint c;
for (c = 0; c < 3; c++)
out[c] = dest[c] * ratio;
}
else
{
out[RED] = src_v;
out[GREEN] = src_v;
out[BLUE] = src_v;
}
}
out[ALPHA] = src[ALPHA];