forked from AuroraMiddleware/gtk
gdk_rgba_parse: Support HSL colors
This commit is contained in:
parent
3d27ff1177
commit
0782c8a051
@ -17,12 +17,12 @@
|
|||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
|
||||||
#include "gtkhslaprivate.h"
|
#include "gdkhslaprivate.h"
|
||||||
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
void
|
void
|
||||||
_gtk_hsla_init_from_rgba (GtkHSLA *hsla,
|
_gdk_hsla_init_from_rgba (GdkHSLA *hsla,
|
||||||
const GdkRGBA *rgba)
|
const GdkRGBA *rgba)
|
||||||
{
|
{
|
||||||
float min;
|
float min;
|
||||||
@ -92,7 +92,7 @@ _gtk_hsla_init_from_rgba (GtkHSLA *hsla,
|
|||||||
|
|
||||||
void
|
void
|
||||||
_gdk_rgba_init_from_hsla (GdkRGBA *rgba,
|
_gdk_rgba_init_from_hsla (GdkRGBA *rgba,
|
||||||
const GtkHSLA *hsla)
|
const GdkHSLA *hsla)
|
||||||
{
|
{
|
||||||
float hue;
|
float hue;
|
||||||
float lightness;
|
float lightness;
|
||||||
@ -166,8 +166,8 @@ _gdk_rgba_init_from_hsla (GdkRGBA *rgba,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
_gtk_hsla_shade (GtkHSLA *dest,
|
_gdk_hsla_shade (GdkHSLA *dest,
|
||||||
const GtkHSLA *src,
|
const GdkHSLA *src,
|
||||||
float factor)
|
float factor)
|
||||||
{
|
{
|
||||||
g_return_if_fail (dest != NULL);
|
g_return_if_fail (dest != NULL);
|
@ -22,23 +22,23 @@
|
|||||||
|
|
||||||
G_BEGIN_DECLS
|
G_BEGIN_DECLS
|
||||||
|
|
||||||
typedef struct _GtkHSLA GtkHSLA;
|
typedef struct _GdkHSLA GdkHSLA;
|
||||||
|
|
||||||
struct _GtkHSLA {
|
struct _GdkHSLA {
|
||||||
float hue;
|
float hue;
|
||||||
float saturation;
|
float saturation;
|
||||||
float lightness;
|
float lightness;
|
||||||
float alpha;
|
float alpha;
|
||||||
};
|
};
|
||||||
|
|
||||||
void _gtk_hsla_init_from_rgba (GtkHSLA *hsla,
|
void _gdk_hsla_init_from_rgba (GdkHSLA *hsla,
|
||||||
const GdkRGBA *rgba);
|
const GdkRGBA *rgba);
|
||||||
/* Yes, I can name that function like this! */
|
/* Yes, I can name that function like this! */
|
||||||
void _gdk_rgba_init_from_hsla (GdkRGBA *rgba,
|
void _gdk_rgba_init_from_hsla (GdkRGBA *rgba,
|
||||||
const GtkHSLA *hsla);
|
const GdkHSLA *hsla);
|
||||||
|
|
||||||
void _gtk_hsla_shade (GtkHSLA *dest,
|
void _gdk_hsla_shade (GdkHSLA *dest,
|
||||||
const GtkHSLA *src,
|
const GdkHSLA *src,
|
||||||
float factor);
|
float factor);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
@ -30,6 +30,7 @@
|
|||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
|
||||||
|
#include "gdkhslaprivate.h"
|
||||||
|
|
||||||
G_DEFINE_BOXED_TYPE (GdkRGBA, gdk_rgba,
|
G_DEFINE_BOXED_TYPE (GdkRGBA, gdk_rgba,
|
||||||
gdk_rgba_copy, gdk_rgba_free)
|
gdk_rgba_copy, gdk_rgba_free)
|
||||||
@ -186,6 +187,7 @@ gdk_rgba_parse (GdkRGBA *rgba,
|
|||||||
const char *spec)
|
const char *spec)
|
||||||
{
|
{
|
||||||
gboolean has_alpha;
|
gboolean has_alpha;
|
||||||
|
gboolean is_hsl;
|
||||||
double r, g, b, a;
|
double r, g, b, a;
|
||||||
char *str = (char *) spec;
|
char *str = (char *) spec;
|
||||||
char *p;
|
char *p;
|
||||||
@ -196,11 +198,26 @@ gdk_rgba_parse (GdkRGBA *rgba,
|
|||||||
if (strncmp (str, "rgba", 4) == 0)
|
if (strncmp (str, "rgba", 4) == 0)
|
||||||
{
|
{
|
||||||
has_alpha = TRUE;
|
has_alpha = TRUE;
|
||||||
|
is_hsl = FALSE;
|
||||||
str += 4;
|
str += 4;
|
||||||
}
|
}
|
||||||
else if (strncmp (str, "rgb", 3) == 0)
|
else if (strncmp (str, "rgb", 3) == 0)
|
||||||
{
|
{
|
||||||
has_alpha = FALSE;
|
has_alpha = FALSE;
|
||||||
|
is_hsl = FALSE;
|
||||||
|
a = 1;
|
||||||
|
str += 3;
|
||||||
|
}
|
||||||
|
else if (strncmp (str, "hsla", 4) == 0)
|
||||||
|
{
|
||||||
|
has_alpha = TRUE;
|
||||||
|
is_hsl = TRUE;
|
||||||
|
str += 4;
|
||||||
|
}
|
||||||
|
else if (strncmp (str, "hsl", 3) == 0)
|
||||||
|
{
|
||||||
|
has_alpha = FALSE;
|
||||||
|
is_hsl = TRUE;
|
||||||
a = 1;
|
a = 1;
|
||||||
str += 3;
|
str += 3;
|
||||||
}
|
}
|
||||||
@ -290,12 +307,24 @@ gdk_rgba_parse (GdkRGBA *rgba,
|
|||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
if (rgba)
|
if (rgba)
|
||||||
|
{
|
||||||
|
if (is_hsl)
|
||||||
|
{
|
||||||
|
GdkHSLA hsla;
|
||||||
|
hsla.hue = r * 255;
|
||||||
|
hsla.saturation = CLAMP (g, 0, 1);
|
||||||
|
hsla.lightness = CLAMP (b, 0, 1);
|
||||||
|
hsla.alpha = CLAMP (a, 0, 1);
|
||||||
|
_gdk_rgba_init_from_hsla (rgba, &hsla);
|
||||||
|
}
|
||||||
|
else
|
||||||
{
|
{
|
||||||
rgba->red = CLAMP (r, 0, 1);
|
rgba->red = CLAMP (r, 0, 1);
|
||||||
rgba->green = CLAMP (g, 0, 1);
|
rgba->green = CLAMP (g, 0, 1);
|
||||||
rgba->blue = CLAMP (b, 0, 1);
|
rgba->blue = CLAMP (b, 0, 1);
|
||||||
rgba->alpha = CLAMP (a, 0, 1);
|
rgba->alpha = CLAMP (a, 0, 1);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
@ -462,6 +491,47 @@ parse_color_channel (GtkCssParser *parser,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static guint
|
||||||
|
parse_hsla_color_channel (GtkCssParser *parser,
|
||||||
|
guint arg,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
GdkHSLA *hsla = data;
|
||||||
|
double dvalue;
|
||||||
|
|
||||||
|
switch (arg)
|
||||||
|
{
|
||||||
|
case 0:
|
||||||
|
if (!gtk_css_parser_consume_number (parser, &dvalue))
|
||||||
|
return 0;
|
||||||
|
hsla->hue = dvalue;
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
case 1:
|
||||||
|
if (!gtk_css_parser_consume_percentage (parser, &dvalue))
|
||||||
|
return 0;
|
||||||
|
hsla->saturation = CLAMP (dvalue, 0.0, 100.0) / 100.0;
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
case 2:
|
||||||
|
if (!gtk_css_parser_consume_percentage (parser, &dvalue))
|
||||||
|
return 0;
|
||||||
|
hsla->lightness = CLAMP (dvalue, 0.0, 100.0) / 100.0;
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
if (!gtk_css_parser_consume_number (parser, &dvalue))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
hsla->alpha = CLAMP (dvalue, 0.0, 1.0) / 1.0;
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
rgba_init_chars (GdkRGBA *rgba,
|
rgba_init_chars (GdkRGBA *rgba,
|
||||||
const char s[8])
|
const char s[8])
|
||||||
@ -501,6 +571,18 @@ gdk_rgba_parser_parse (GtkCssParser *parser,
|
|||||||
{
|
{
|
||||||
return gtk_css_parser_consume_function (parser, 4, 4, parse_color_channel, rgba);
|
return gtk_css_parser_consume_function (parser, 4, 4, parse_color_channel, rgba);
|
||||||
}
|
}
|
||||||
|
else if (gtk_css_token_is_function (token, "hsl") || gtk_css_token_is_function (token, "hsla"))
|
||||||
|
{
|
||||||
|
GdkHSLA hsla;
|
||||||
|
|
||||||
|
hsla.alpha = 1.0;
|
||||||
|
|
||||||
|
if (!gtk_css_parser_consume_function (parser, 3, 4, parse_hsla_color_channel, &hsla))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
_gdk_rgba_init_from_hsla (rgba, &hsla);
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
else if (gtk_css_token_is (token, GTK_CSS_TOKEN_HASH_ID) ||
|
else if (gtk_css_token_is (token, GTK_CSS_TOKEN_HASH_ID) ||
|
||||||
gtk_css_token_is (token, GTK_CSS_TOKEN_HASH_UNRESTRICTED))
|
gtk_css_token_is (token, GTK_CSS_TOKEN_HASH_UNRESTRICTED))
|
||||||
{
|
{
|
||||||
|
@ -27,6 +27,7 @@ gdk_public_sources = files([
|
|||||||
'gdkglcontext.c',
|
'gdkglcontext.c',
|
||||||
'gdkglobals.c',
|
'gdkglobals.c',
|
||||||
'gdkgltexture.c',
|
'gdkgltexture.c',
|
||||||
|
'gdkhsla.c',
|
||||||
'gdkkeys.c',
|
'gdkkeys.c',
|
||||||
'gdkkeyuni.c',
|
'gdkkeyuni.c',
|
||||||
'gdkmemorytexture.c',
|
'gdkmemorytexture.c',
|
||||||
@ -107,6 +108,7 @@ gdk_sources = gdk_public_sources
|
|||||||
gdk_private_h_sources = files([
|
gdk_private_h_sources = files([
|
||||||
'gdkeventsprivate.h',
|
'gdkeventsprivate.h',
|
||||||
'gdkdevicetoolprivate.h',
|
'gdkdevicetoolprivate.h',
|
||||||
|
'gdkhslaprivate.h',
|
||||||
'gdkmonitorprivate.h',
|
'gdkmonitorprivate.h',
|
||||||
'gdkseatdefaultprivate.h',
|
'gdkseatdefaultprivate.h',
|
||||||
'gdktoplevelsizeprivate.h',
|
'gdktoplevelsizeprivate.h',
|
||||||
|
@ -20,10 +20,10 @@
|
|||||||
#include "gtkcsscolorvalueprivate.h"
|
#include "gtkcsscolorvalueprivate.h"
|
||||||
|
|
||||||
#include "gtkcssstylepropertyprivate.h"
|
#include "gtkcssstylepropertyprivate.h"
|
||||||
#include "gtkhslaprivate.h"
|
|
||||||
#include "gtkprivate.h"
|
#include "gtkprivate.h"
|
||||||
#include "gtkstylepropertyprivate.h"
|
#include "gtkstylepropertyprivate.h"
|
||||||
|
|
||||||
|
#include "gdk/gdkhslaprivate.h"
|
||||||
#include "gdk/gdkrgbaprivate.h"
|
#include "gdk/gdkrgbaprivate.h"
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
@ -309,10 +309,10 @@ apply_shade (const GdkRGBA *in,
|
|||||||
GdkRGBA *out,
|
GdkRGBA *out,
|
||||||
double factor)
|
double factor)
|
||||||
{
|
{
|
||||||
GtkHSLA hsla;
|
GdkHSLA hsla;
|
||||||
|
|
||||||
_gtk_hsla_init_from_rgba (&hsla, in);
|
_gdk_hsla_init_from_rgba (&hsla, in);
|
||||||
_gtk_hsla_shade (&hsla, &hsla, factor);
|
_gdk_hsla_shade (&hsla, &hsla, factor);
|
||||||
|
|
||||||
_gdk_rgba_init_from_hsla (out, &hsla);
|
_gdk_rgba_init_from_hsla (out, &hsla);
|
||||||
}
|
}
|
||||||
@ -699,6 +699,8 @@ gtk_css_color_value_can_parse (GtkCssParser *parser)
|
|||||||
|| gtk_css_parser_has_function (parser, "shade")
|
|| gtk_css_parser_has_function (parser, "shade")
|
||||||
|| gtk_css_parser_has_function (parser, "alpha")
|
|| gtk_css_parser_has_function (parser, "alpha")
|
||||||
|| gtk_css_parser_has_function (parser, "mix")
|
|| gtk_css_parser_has_function (parser, "mix")
|
||||||
|
|| gtk_css_parser_has_function (parser, "hsl")
|
||||||
|
|| gtk_css_parser_has_function (parser, "hsla")
|
||||||
|| gtk_css_parser_has_function (parser, "rgb")
|
|| gtk_css_parser_has_function (parser, "rgb")
|
||||||
|| gtk_css_parser_has_function (parser, "rgba");
|
|| gtk_css_parser_has_function (parser, "rgba");
|
||||||
}
|
}
|
||||||
|
@ -33,10 +33,10 @@
|
|||||||
#include "gtkcssrepeatvalueprivate.h"
|
#include "gtkcssrepeatvalueprivate.h"
|
||||||
#include "gtkcsscolorvalueprivate.h"
|
#include "gtkcsscolorvalueprivate.h"
|
||||||
#include "gtkcssstyleprivate.h"
|
#include "gtkcssstyleprivate.h"
|
||||||
#include "gtkhslaprivate.h"
|
|
||||||
#include "gtkroundedboxprivate.h"
|
#include "gtkroundedboxprivate.h"
|
||||||
#include "gtksnapshotprivate.h"
|
#include "gtksnapshotprivate.h"
|
||||||
|
|
||||||
|
#include "gdk/gdkhslaprivate.h"
|
||||||
#include "gsk/gskroundedrectprivate.h"
|
#include "gsk/gskroundedrectprivate.h"
|
||||||
|
|
||||||
typedef struct _GtkBorderImage GtkBorderImage;
|
typedef struct _GtkBorderImage GtkBorderImage;
|
||||||
@ -513,10 +513,10 @@ color_shade (const GdkRGBA *color,
|
|||||||
double factor,
|
double factor,
|
||||||
GdkRGBA *color_return)
|
GdkRGBA *color_return)
|
||||||
{
|
{
|
||||||
GtkHSLA hsla;
|
GdkHSLA hsla;
|
||||||
|
|
||||||
_gtk_hsla_init_from_rgba (&hsla, color);
|
_gdk_hsla_init_from_rgba (&hsla, color);
|
||||||
_gtk_hsla_shade (&hsla, &hsla, factor);
|
_gdk_hsla_shade (&hsla, &hsla, factor);
|
||||||
_gdk_rgba_init_from_hsla (color_return, &hsla);
|
_gdk_rgba_init_from_hsla (color_return, &hsla);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -111,7 +111,6 @@ gtk_private_sources = files([
|
|||||||
'gtkfilechooserutils.c',
|
'gtkfilechooserutils.c',
|
||||||
'gtkfilesystemmodel.c',
|
'gtkfilesystemmodel.c',
|
||||||
'gtkgizmo.c',
|
'gtkgizmo.c',
|
||||||
'gtkhsla.c',
|
|
||||||
'gtkiconcache.c',
|
'gtkiconcache.c',
|
||||||
'gtkiconcachevalidator.c',
|
'gtkiconcachevalidator.c',
|
||||||
'gtkiconhelper.c',
|
'gtkiconhelper.c',
|
||||||
|
23
testsuite/css/parser/hsl.css
Normal file
23
testsuite/css/parser/hsl.css
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
a {
|
||||||
|
color: hsl(0, 0%, 0%);
|
||||||
|
}
|
||||||
|
|
||||||
|
b {
|
||||||
|
color: hsl(120, 100%, 50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
c {
|
||||||
|
color: hsl(360, 100%, 50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
d {
|
||||||
|
color: hsl(-314.159, 50%, 50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
e {
|
||||||
|
color: hsl(0, 0%, 0%, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
f {
|
||||||
|
color: hsl(1, 2, 3);
|
||||||
|
}
|
1
testsuite/css/parser/hsl.errors
Normal file
1
testsuite/css/parser/hsl.errors
Normal file
@ -0,0 +1 @@
|
|||||||
|
hsl.css:22:17-18: error: GTK_CSS_PARSER_ERROR_SYNTAX
|
19
testsuite/css/parser/hsl.ref.css
Normal file
19
testsuite/css/parser/hsl.ref.css
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
a {
|
||||||
|
color: rgb(0,0,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
b {
|
||||||
|
color: rgb(0,255,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
c {
|
||||||
|
color: rgb(255,0,0);
|
||||||
|
}
|
||||||
|
|
||||||
|
d {
|
||||||
|
color: rgb(191,161,64);
|
||||||
|
}
|
||||||
|
|
||||||
|
e {
|
||||||
|
color: rgba(0,0,0,0.5);
|
||||||
|
}
|
@ -358,6 +358,9 @@ test_data = [
|
|||||||
'freed-string-in-error-messages.css',
|
'freed-string-in-error-messages.css',
|
||||||
'freed-string-in-error-messages.errors',
|
'freed-string-in-error-messages.errors',
|
||||||
'freed-string-in-error-messages.ref.css',
|
'freed-string-in-error-messages.ref.css',
|
||||||
|
'hsl.css',
|
||||||
|
'hsl.errors',
|
||||||
|
'hsl.ref.css',
|
||||||
'import-cyclic-1.css',
|
'import-cyclic-1.css',
|
||||||
'import-cyclic-1.errors',
|
'import-cyclic-1.errors',
|
||||||
'import-cyclic-1.ref.css',
|
'import-cyclic-1.ref.css',
|
||||||
|
@ -65,6 +65,30 @@ test_color_parse (void)
|
|||||||
res = gdk_rgba_parse (&color, "#0080ff88");
|
res = gdk_rgba_parse (&color, "#0080ff88");
|
||||||
g_assert_true (res);
|
g_assert_true (res);
|
||||||
g_assert_true (gdk_rgba_equal (&color, &expected));
|
g_assert_true (gdk_rgba_equal (&color, &expected));
|
||||||
|
|
||||||
|
expected.red = 1.0;
|
||||||
|
expected.green = 0.0;
|
||||||
|
expected.blue = 0.0;
|
||||||
|
expected.alpha = 1.0;
|
||||||
|
res = gdk_rgba_parse (&color, "hsl (0, 100%, 50%)");
|
||||||
|
g_assert_true (res);
|
||||||
|
g_assert_true (gdk_rgba_equal (&color, &expected));
|
||||||
|
|
||||||
|
expected.red = 0.0;
|
||||||
|
expected.green = 1.0;
|
||||||
|
expected.blue = 0.0;
|
||||||
|
expected.alpha = 0.1;
|
||||||
|
res = gdk_rgba_parse (&color, "hsla (120, 255, 50%, 0.1)");
|
||||||
|
g_assert_true (res);
|
||||||
|
g_assert_true (gdk_rgba_equal (&color, &expected));
|
||||||
|
|
||||||
|
expected.red = 0.0;
|
||||||
|
expected.green = 0.5;
|
||||||
|
expected.blue = 0.5;
|
||||||
|
expected.alpha = 1.0;
|
||||||
|
res = gdk_rgba_parse (&color, "hsl(180, 100%, 25%)");
|
||||||
|
g_assert_true (res);
|
||||||
|
g_assert_true (gdk_rgba_equal (&color, &expected));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
Reference in New Issue
Block a user