|
Packit |
5e0819 |
/*
|
|
Packit |
5e0819 |
* Copyright (C) 2001 Havoc Pennington
|
|
Packit |
5e0819 |
* Copyright (C) 2016 Alberts Muktupāvels
|
|
Packit |
5e0819 |
*
|
|
Packit |
5e0819 |
* This program is free software: you can redistribute it and/or modify
|
|
Packit |
5e0819 |
* it under the terms of the GNU General Public License as published by
|
|
Packit |
5e0819 |
* the Free Software Foundation, either version 2 of the License, or
|
|
Packit |
5e0819 |
* (at your option) any later version.
|
|
Packit |
5e0819 |
*
|
|
Packit |
5e0819 |
* This program is distributed in the hope that it will be useful,
|
|
Packit |
5e0819 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
5e0819 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit |
5e0819 |
* GNU General Public License for more details.
|
|
Packit |
5e0819 |
*
|
|
Packit |
5e0819 |
* You should have received a copy of the GNU General Public License
|
|
Packit |
5e0819 |
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
5e0819 |
*/
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
#include "config.h"
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
#include "meta-hsla-private.h"
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
/**
|
|
Packit |
5e0819 |
* meta_hsla_from_rgba:
|
|
Packit |
5e0819 |
* @hsla: (out): location to store #MetaHSLA color
|
|
Packit |
5e0819 |
* @rgba: #GdkRGBA color
|
|
Packit |
5e0819 |
*
|
|
Packit |
5e0819 |
* Convert RGBA color to HSLA color.
|
|
Packit |
5e0819 |
*/
|
|
Packit |
5e0819 |
void
|
|
Packit |
5e0819 |
meta_hsla_from_rgba (MetaHSLA *hsla,
|
|
Packit |
5e0819 |
const GdkRGBA *rgba)
|
|
Packit |
5e0819 |
{
|
|
Packit |
5e0819 |
gdouble min;
|
|
Packit |
5e0819 |
gdouble max;
|
|
Packit |
5e0819 |
gdouble red;
|
|
Packit |
5e0819 |
gdouble green;
|
|
Packit |
5e0819 |
gdouble blue;
|
|
Packit |
5e0819 |
gdouble delta;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
g_return_if_fail (hsla != NULL || rgba != NULL);
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
red = rgba->red;
|
|
Packit |
5e0819 |
green = rgba->green;
|
|
Packit |
5e0819 |
blue = rgba->blue;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
if (red > green)
|
|
Packit |
5e0819 |
{
|
|
Packit |
5e0819 |
if (red > blue)
|
|
Packit |
5e0819 |
max = red;
|
|
Packit |
5e0819 |
else
|
|
Packit |
5e0819 |
max = blue;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
if (green < blue)
|
|
Packit |
5e0819 |
min = green;
|
|
Packit |
5e0819 |
else
|
|
Packit |
5e0819 |
min = blue;
|
|
Packit |
5e0819 |
}
|
|
Packit |
5e0819 |
else
|
|
Packit |
5e0819 |
{
|
|
Packit |
5e0819 |
if (green > blue)
|
|
Packit |
5e0819 |
max = green;
|
|
Packit |
5e0819 |
else
|
|
Packit |
5e0819 |
max = blue;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
if (red < blue)
|
|
Packit |
5e0819 |
min = red;
|
|
Packit |
5e0819 |
else
|
|
Packit |
5e0819 |
min = blue;
|
|
Packit |
5e0819 |
}
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
hsla->hue = 0;
|
|
Packit |
5e0819 |
hsla->saturation = 0;
|
|
Packit |
5e0819 |
hsla->lightness = (max + min) / 2;
|
|
Packit |
5e0819 |
hsla->alpha = rgba->alpha;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
if (max != min)
|
|
Packit |
5e0819 |
{
|
|
Packit |
5e0819 |
if (hsla->lightness <= 0.5)
|
|
Packit |
5e0819 |
hsla->saturation = (max - min) / (max + min);
|
|
Packit |
5e0819 |
else
|
|
Packit |
5e0819 |
hsla->saturation = (max - min) / (2 - max - min);
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
delta = max - min;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
if (red == max)
|
|
Packit |
5e0819 |
hsla->hue = (green - blue) / delta;
|
|
Packit |
5e0819 |
else if (green == max)
|
|
Packit |
5e0819 |
hsla->hue = 2 + (blue - red) / delta;
|
|
Packit |
5e0819 |
else if (blue == max)
|
|
Packit |
5e0819 |
hsla->hue = 4 + (red - green) / delta;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
hsla->hue *= 60;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
if (hsla->hue < 0.0)
|
|
Packit |
5e0819 |
hsla->hue += 360;
|
|
Packit |
5e0819 |
}
|
|
Packit |
5e0819 |
}
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
/**
|
|
Packit |
5e0819 |
* meta_hsla_to_rgba:
|
|
Packit |
5e0819 |
* @hsla: #MetaHSLA color
|
|
Packit |
5e0819 |
* @rgba: (out): location to store #GdkRGBA color
|
|
Packit |
5e0819 |
*
|
|
Packit |
5e0819 |
* Convert HSLA color to RGBA color.
|
|
Packit |
5e0819 |
*/
|
|
Packit |
5e0819 |
void
|
|
Packit |
5e0819 |
meta_hsla_to_rgba (const MetaHSLA *hsla,
|
|
Packit |
5e0819 |
GdkRGBA *rgba)
|
|
Packit |
5e0819 |
{
|
|
Packit |
5e0819 |
gdouble hue;
|
|
Packit |
5e0819 |
gdouble saturation;
|
|
Packit |
5e0819 |
gdouble lightness;
|
|
Packit |
5e0819 |
gdouble m1;
|
|
Packit |
5e0819 |
gdouble m2;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
g_return_if_fail (hsla != NULL || rgba != NULL);
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
saturation = hsla->saturation;
|
|
Packit |
5e0819 |
lightness = hsla->lightness;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
if (lightness <= 0.5)
|
|
Packit |
5e0819 |
m2 = lightness * (1 + saturation);
|
|
Packit |
5e0819 |
else
|
|
Packit |
5e0819 |
m2 = lightness + saturation - lightness * saturation;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
m1 = 2 * lightness - m2;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
if (saturation == 0)
|
|
Packit |
5e0819 |
{
|
|
Packit |
5e0819 |
rgba->red = lightness;
|
|
Packit |
5e0819 |
rgba->green = lightness;
|
|
Packit |
5e0819 |
rgba->blue = lightness;
|
|
Packit |
5e0819 |
}
|
|
Packit |
5e0819 |
else
|
|
Packit |
5e0819 |
{
|
|
Packit |
5e0819 |
hue = hsla->hue + 120;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
while (hue > 360)
|
|
Packit |
5e0819 |
hue -= 360;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
while (hue < 0)
|
|
Packit |
5e0819 |
hue += 360;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
if (hue < 60)
|
|
Packit |
5e0819 |
rgba->red = m1 + (m2 - m1) * hue / 60;
|
|
Packit |
5e0819 |
else if (hue < 180)
|
|
Packit |
5e0819 |
rgba->red = m2;
|
|
Packit |
5e0819 |
else if (hue < 240)
|
|
Packit |
5e0819 |
rgba->red = m1 + (m2 - m1) * (240 - hue) / 60;
|
|
Packit |
5e0819 |
else
|
|
Packit |
5e0819 |
rgba->red = m1;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
hue = hsla->hue;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
while (hue > 360)
|
|
Packit |
5e0819 |
hue -= 360;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
while (hue < 0)
|
|
Packit |
5e0819 |
hue += 360;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
if (hue < 60)
|
|
Packit |
5e0819 |
rgba->green = m1 + (m2 - m1) * hue / 60;
|
|
Packit |
5e0819 |
else if (hue < 180)
|
|
Packit |
5e0819 |
rgba->green = m2;
|
|
Packit |
5e0819 |
else if (hue < 240)
|
|
Packit |
5e0819 |
rgba->green = m1 + (m2 - m1) * (240 - hue) / 60;
|
|
Packit |
5e0819 |
else
|
|
Packit |
5e0819 |
rgba->green = m1;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
hue = hsla->hue - 120;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
while (hue > 360)
|
|
Packit |
5e0819 |
hue -= 360;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
while (hue < 0)
|
|
Packit |
5e0819 |
hue += 360;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
if (hue < 60)
|
|
Packit |
5e0819 |
rgba->blue = m1 + (m2 - m1) * hue / 60;
|
|
Packit |
5e0819 |
else if (hue < 180)
|
|
Packit |
5e0819 |
rgba->blue = m2;
|
|
Packit |
5e0819 |
else if (hue < 240)
|
|
Packit |
5e0819 |
rgba->blue = m1 + (m2 - m1) * (240 - hue) / 60;
|
|
Packit |
5e0819 |
else
|
|
Packit |
5e0819 |
rgba->blue = m1;
|
|
Packit |
5e0819 |
}
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
rgba->alpha = hsla->alpha;
|
|
Packit |
5e0819 |
}
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
/**
|
|
Packit |
5e0819 |
* meta_hsla_shade:
|
|
Packit |
5e0819 |
* @source: #MetaHSLA color
|
|
Packit |
5e0819 |
* @factor: amount to scale saturation and lightness
|
|
Packit |
5e0819 |
* @destination: (out): location to store #MetaHSLA color
|
|
Packit |
5e0819 |
*
|
|
Packit |
5e0819 |
* Takes a @source color, scales saturation and lightness by @factor and
|
|
Packit |
5e0819 |
* sets @destionation to the resulting color.
|
|
Packit |
5e0819 |
*/
|
|
Packit |
5e0819 |
void
|
|
Packit |
5e0819 |
meta_hsla_shade (const MetaHSLA *source,
|
|
Packit |
5e0819 |
const gdouble factor,
|
|
Packit |
5e0819 |
MetaHSLA *destination)
|
|
Packit |
5e0819 |
{
|
|
Packit |
5e0819 |
g_return_if_fail (source != NULL || destination != NULL);
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
destination->hue = source->hue;
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
destination->saturation = source->saturation * factor;
|
|
Packit |
5e0819 |
destination->saturation = CLAMP (destination->saturation, 0.0, 1.0);
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
destination->lightness = source->lightness * factor;
|
|
Packit |
5e0819 |
destination->lightness = CLAMP (destination->lightness, 0.0, 1.0);
|
|
Packit |
5e0819 |
|
|
Packit |
5e0819 |
destination->alpha = source->alpha;
|
|
Packit |
5e0819 |
}
|