|
Packit Service |
c6b782 |
/* dzl-rgba.c
|
|
Packit Service |
c6b782 |
*
|
|
Packit Service |
c6b782 |
* Copyright (C) 2014 Christian Hergert <christian@hergert.me>
|
|
Packit Service |
c6b782 |
*
|
|
Packit Service |
c6b782 |
* This program is free software: you can redistribute it and/or modify
|
|
Packit Service |
c6b782 |
* it under the terms of the GNU General Public License as published by
|
|
Packit Service |
c6b782 |
* the Free Software Foundation, either version 3 of the License, or
|
|
Packit Service |
c6b782 |
* (at your option) any later version.
|
|
Packit Service |
c6b782 |
*
|
|
Packit Service |
c6b782 |
* This program is distributed in the hope that it will be useful,
|
|
Packit Service |
c6b782 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
c6b782 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
Packit Service |
c6b782 |
* GNU General Public License for more details.
|
|
Packit Service |
c6b782 |
*
|
|
Packit Service |
c6b782 |
* You should have received a copy of the GNU General Public License
|
|
Packit Service |
c6b782 |
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
Packit Service |
c6b782 |
*/
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
#define G_LOG_DOMAIN "dzl-rgba"
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
#include "config.h"
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
#include "dzl-rgba.h"
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
/*
|
|
Packit Service |
c6b782 |
* The following code is borrowed ultimately upstream through Clearlooks
|
|
Packit Service |
c6b782 |
* theme engine in 2.x days. It has been ported to use GdkRGBA. It exists
|
|
Packit Service |
c6b782 |
* all over the place, feel free to use this under any license compatible
|
|
Packit Service |
c6b782 |
* with upstream.
|
|
Packit Service |
c6b782 |
*/
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
/* Clearlooks - a cairo based GTK+ engine
|
|
Packit Service |
c6b782 |
* Copyright (C) 2006 Andrew Johnson <acjgenius@earthlink.net>
|
|
Packit Service |
c6b782 |
* Copyright (C) 2007 Benjamin Berg <benjamin@sipsolutions.net>
|
|
Packit Service |
c6b782 |
*
|
|
Packit Service |
c6b782 |
* This library is free software; you can redistribute it and/or
|
|
Packit Service |
c6b782 |
* modify it under the terms of the GNU Lesser General Public
|
|
Packit Service |
c6b782 |
* License as published by the Free Software Foundation; either
|
|
Packit Service |
c6b782 |
* version 2.1 of the License, or (at your option) any later version.
|
|
Packit Service |
c6b782 |
*
|
|
Packit Service |
c6b782 |
* This library is distributed in the hope that it will be useful,
|
|
Packit Service |
c6b782 |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit Service |
c6b782 |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit Service |
c6b782 |
* Lesser General Public License for more details.
|
|
Packit Service |
c6b782 |
*
|
|
Packit Service |
c6b782 |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit Service |
c6b782 |
* License along with this library; if not, write to the Free Software
|
|
Packit Service |
c6b782 |
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
Packit Service |
c6b782 |
*/
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
static void
|
|
Packit Service |
c6b782 |
rgb_to_hls (gdouble *r,
|
|
Packit Service |
c6b782 |
gdouble *g,
|
|
Packit Service |
c6b782 |
gdouble *b)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
gdouble min;
|
|
Packit Service |
c6b782 |
gdouble max;
|
|
Packit Service |
c6b782 |
gdouble red;
|
|
Packit Service |
c6b782 |
gdouble green;
|
|
Packit Service |
c6b782 |
gdouble blue;
|
|
Packit Service |
c6b782 |
gdouble h, l, s;
|
|
Packit Service |
c6b782 |
gdouble delta;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
red = *r;
|
|
Packit Service |
c6b782 |
green = *g;
|
|
Packit Service |
c6b782 |
blue = *b;
|
|
Packit Service |
c6b782 |
if (red > green)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
if (red > blue)
|
|
Packit Service |
c6b782 |
max = red;
|
|
Packit Service |
c6b782 |
else
|
|
Packit Service |
c6b782 |
max = blue;
|
|
Packit Service |
c6b782 |
if (green < blue)
|
|
Packit Service |
c6b782 |
min = green;
|
|
Packit Service |
c6b782 |
else
|
|
Packit Service |
c6b782 |
min = blue;
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
else
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
if (green > blue)
|
|
Packit Service |
c6b782 |
max = green;
|
|
Packit Service |
c6b782 |
else
|
|
Packit Service |
c6b782 |
max = blue;
|
|
Packit Service |
c6b782 |
if (red < blue)
|
|
Packit Service |
c6b782 |
min = red;
|
|
Packit Service |
c6b782 |
else
|
|
Packit Service |
c6b782 |
min = blue;
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
l = (max + min) / 2;
|
|
Packit Service |
c6b782 |
s = 0;
|
|
Packit Service |
c6b782 |
h = 0;
|
|
Packit Service |
c6b782 |
if (max != min)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
if (l <= 0.5)
|
|
Packit Service |
c6b782 |
s = (max - min) / (max + min);
|
|
Packit Service |
c6b782 |
else
|
|
Packit Service |
c6b782 |
s = (max - min) / (2 - max - min);
|
|
Packit Service |
c6b782 |
delta = max - min;
|
|
Packit Service |
c6b782 |
if (red == max)
|
|
Packit Service |
c6b782 |
h = (green - blue) / delta;
|
|
Packit Service |
c6b782 |
else if (green == max)
|
|
Packit Service |
c6b782 |
h = 2 + (blue - red) / delta;
|
|
Packit Service |
c6b782 |
else if (blue == max)
|
|
Packit Service |
c6b782 |
h = 4 + (red - green) / delta;
|
|
Packit Service |
c6b782 |
h *= 60;
|
|
Packit Service |
c6b782 |
if (h < 0.0)
|
|
Packit Service |
c6b782 |
h += 360;
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
*r = h;
|
|
Packit Service |
c6b782 |
*g = l;
|
|
Packit Service |
c6b782 |
*b = s;
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
static void
|
|
Packit Service |
c6b782 |
hls_to_rgb (gdouble *h,
|
|
Packit Service |
c6b782 |
gdouble *l,
|
|
Packit Service |
c6b782 |
gdouble *s)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
gdouble hue;
|
|
Packit Service |
c6b782 |
gdouble lightness;
|
|
Packit Service |
c6b782 |
gdouble saturation;
|
|
Packit Service |
c6b782 |
gdouble m1, m2;
|
|
Packit Service |
c6b782 |
gdouble r, g, b;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
lightness = *l;
|
|
Packit Service |
c6b782 |
saturation = *s;
|
|
Packit Service |
c6b782 |
if (lightness <= 0.5)
|
|
Packit Service |
c6b782 |
m2 = lightness * (1 + saturation);
|
|
Packit Service |
c6b782 |
else
|
|
Packit Service |
c6b782 |
m2 = lightness + saturation - lightness * saturation;
|
|
Packit Service |
c6b782 |
m1 = 2 * lightness - m2;
|
|
Packit Service |
c6b782 |
if (saturation == 0)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
*h = lightness;
|
|
Packit Service |
c6b782 |
*l = lightness;
|
|
Packit Service |
c6b782 |
*s = lightness;
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
else
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
hue = *h + 120;
|
|
Packit Service |
c6b782 |
while (hue > 360)
|
|
Packit Service |
c6b782 |
hue -= 360;
|
|
Packit Service |
c6b782 |
while (hue < 0)
|
|
Packit Service |
c6b782 |
hue += 360;
|
|
Packit Service |
c6b782 |
if (hue < 60)
|
|
Packit Service |
c6b782 |
r = m1 + (m2 - m1) * hue / 60;
|
|
Packit Service |
c6b782 |
else if (hue < 180)
|
|
Packit Service |
c6b782 |
r = m2;
|
|
Packit Service |
c6b782 |
else if (hue < 240)
|
|
Packit Service |
c6b782 |
r = m1 + (m2 - m1) * (240 - hue) / 60;
|
|
Packit Service |
c6b782 |
else
|
|
Packit Service |
c6b782 |
r = m1;
|
|
Packit Service |
c6b782 |
hue = *h;
|
|
Packit Service |
c6b782 |
while (hue > 360)
|
|
Packit Service |
c6b782 |
hue -= 360;
|
|
Packit Service |
c6b782 |
while (hue < 0)
|
|
Packit Service |
c6b782 |
hue += 360;
|
|
Packit Service |
c6b782 |
if (hue < 60)
|
|
Packit Service |
c6b782 |
g = m1 + (m2 - m1) * hue / 60;
|
|
Packit Service |
c6b782 |
else if (hue < 180)
|
|
Packit Service |
c6b782 |
g = m2;
|
|
Packit Service |
c6b782 |
else if (hue < 240)
|
|
Packit Service |
c6b782 |
g = m1 + (m2 - m1) * (240 - hue) / 60;
|
|
Packit Service |
c6b782 |
else
|
|
Packit Service |
c6b782 |
g = m1;
|
|
Packit Service |
c6b782 |
hue = *h - 120;
|
|
Packit Service |
c6b782 |
while (hue > 360)
|
|
Packit Service |
c6b782 |
hue -= 360;
|
|
Packit Service |
c6b782 |
while (hue < 0)
|
|
Packit Service |
c6b782 |
hue += 360;
|
|
Packit Service |
c6b782 |
if (hue < 60)
|
|
Packit Service |
c6b782 |
b = m1 + (m2 - m1) * hue / 60;
|
|
Packit Service |
c6b782 |
else if (hue < 180)
|
|
Packit Service |
c6b782 |
b = m2;
|
|
Packit Service |
c6b782 |
else if (hue < 240)
|
|
Packit Service |
c6b782 |
b = m1 + (m2 - m1) * (240 - hue) / 60;
|
|
Packit Service |
c6b782 |
else
|
|
Packit Service |
c6b782 |
b = m1;
|
|
Packit Service |
c6b782 |
*h = r;
|
|
Packit Service |
c6b782 |
*l = g;
|
|
Packit Service |
c6b782 |
*s = b;
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
}
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
void
|
|
Packit Service |
c6b782 |
dzl_rgba_shade (const GdkRGBA *rgba,
|
|
Packit Service |
c6b782 |
GdkRGBA *dst,
|
|
Packit Service |
c6b782 |
gdouble k)
|
|
Packit Service |
c6b782 |
{
|
|
Packit Service |
c6b782 |
gdouble red;
|
|
Packit Service |
c6b782 |
gdouble green;
|
|
Packit Service |
c6b782 |
gdouble blue;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
red = rgba->red;
|
|
Packit Service |
c6b782 |
green = rgba->green;
|
|
Packit Service |
c6b782 |
blue = rgba->blue;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
rgb_to_hls (&red, &green, &blue);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
green *= k;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
if (green > 1.0)
|
|
Packit Service |
c6b782 |
green = 1.0;
|
|
Packit Service |
c6b782 |
else if (green < 0.0)
|
|
Packit Service |
c6b782 |
green = 0.0;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
blue *= k;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
if (blue > 1.0)
|
|
Packit Service |
c6b782 |
blue = 1.0;
|
|
Packit Service |
c6b782 |
else if (blue < 0.0)
|
|
Packit Service |
c6b782 |
blue = 0.0;
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
hls_to_rgb (&red, &green, &blue);
|
|
Packit Service |
c6b782 |
|
|
Packit Service |
c6b782 |
dst->red = red;
|
|
Packit Service |
c6b782 |
dst->green = green;
|
|
Packit Service |
c6b782 |
dst->blue = blue;
|
|
Packit Service |
c6b782 |
dst->alpha = rgba->alpha;
|
|
Packit Service |
c6b782 |
}
|