gtk-css-engine r160 - in trunk: . libccss/ccss src themes/gtk-css-test/gtk-2.0
- From: robsta svn gnome org
- To: svn-commits-list gnome org
- Subject: gtk-css-engine r160 - in trunk: . libccss/ccss src themes/gtk-css-test/gtk-2.0
- Date: Fri, 3 Oct 2008 17:22:14 +0000 (UTC)
Author: robsta
Date: Fri Oct 3 17:22:14 2008
New Revision: 160
URL: http://svn.gnome.org/viewvc/gtk-css-engine?rev=160&view=rev
Log:
* libccss/ccss/ccss-color.c:
* src/Makefile.am:
* src/gce-color.c (added):
* src/gce-color.h (added):
* src/gce-functions.c:
Initial gtk color mixing support (mix(), shade(), darker(), lighter()). Not completely hooked up yet.
Added:
trunk/src/gce-color.c
trunk/src/gce-color.h
Modified:
trunk/ChangeLog
trunk/libccss/ccss/ccss-color.c
trunk/src/Makefile.am
trunk/src/gce-functions.c
trunk/themes/gtk-css-test/gtk-2.0/styles.css
Modified: trunk/libccss/ccss/ccss-color.c
==============================================================================
--- trunk/libccss/ccss/ccss-color.c (original)
+++ trunk/libccss/ccss/ccss-color.c Fri Oct 3 17:22:14 2008
@@ -309,6 +309,7 @@
return CCSS_PROPERTY_SPEC_SET;
case TERM_FUNCTION:
/* FIXME: ATM only "hex" representation can be fed back. */
+ /* TODO: recurse to set up the functions. */
function = cr_string_peek_raw_str ((*value)->content.str);
color = ccss_function_invoke (function, (*value)->ext_content.func_param);
if (color) {
Modified: trunk/src/Makefile.am
==============================================================================
--- trunk/src/Makefile.am (original)
+++ trunk/src/Makefile.am Fri Oct 3 17:22:14 2008
@@ -24,6 +24,8 @@
./../libccss/ccss/libccss-1.la
libcss_la_SOURCES = \
+ gce-color.c \
+ gce-color.h \
gce-functions.c \
gce-functions.h \
gce-maps.c \
Added: trunk/src/gce-color.c
==============================================================================
--- (empty file)
+++ trunk/src/gce-color.c Fri Oct 3 17:22:14 2008
@@ -0,0 +1,252 @@
+/* The Cairo CSS Drawing Library.
+ * Copyright (C) 2008 Robert Staudinger
+ *
+ * Portions of this file are derived from gtkrc.c, licensed under
+ * the GNU Lesser General Public License; either version 2 of the
+ * License, or (at your option) any later version. Copyright (C)
+ * the GTK+ Team, see the ChangeLog at ftp://ftp.gtk.org/pub/gtk/.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ */
+
+#include <gtk/gtk.h>
+#include "gce-color.h"
+
+gboolean
+gce_color_lookup (char const *spec,
+ GdkColor *color)
+{
+ GtkSettings *settings;
+ GHashTable *colors;
+ GdkColor *system_color;
+
+ g_return_val_if_fail (spec, NULL);
+
+ settings = gtk_settings_get_default ();
+ colors = NULL;
+ g_object_get (G_OBJECT (settings), "color-hash", &colors, NULL);
+ g_return_val_if_fail (colors, NULL);
+
+ system_color = (GdkColor *) g_hash_table_lookup (colors, spec);
+ if (system_color) {
+ color->red = system_color->red;
+ color->green = system_color->green;
+ color->blue = system_color->blue;
+ return TRUE;
+ }
+
+ /* Try to parse the color. */
+ return gdk_color_parse (spec, color);
+}
+
+static void
+rgb_to_hls (gdouble *r,
+ gdouble *g,
+ gdouble *b)
+{
+ gdouble min;
+ gdouble max;
+ gdouble red;
+ gdouble green;
+ gdouble blue;
+ gdouble h, l, s;
+ gdouble delta;
+
+ red = *r;
+ green = *g;
+ blue = *b;
+
+ 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 - max - min);
+
+ delta = max -min;
+ if (red == max)
+ h = (green - blue) / delta;
+ else if (green == max)
+ h = 2 + (blue - red) / delta;
+ else if (blue == max)
+ h = 4 + (red - green) / delta;
+
+ h *= 60;
+ if (h < 0.0)
+ h += 360;
+ }
+
+ *r = h;
+ *g = l;
+ *b = s;
+}
+
+static void
+hls_to_rgb (gdouble *h,
+ gdouble *l,
+ gdouble *s)
+{
+ gdouble hue;
+ gdouble lightness;
+ gdouble saturation;
+ gdouble m1, m2;
+ gdouble r, g, b;
+
+ lightness = *l;
+ saturation = *s;
+
+ if (lightness <= 0.5)
+ m2 = lightness * (1 + saturation);
+ else
+ m2 = lightness + saturation - lightness * saturation;
+ m1 = 2 * lightness - m2;
+
+ if (saturation == 0)
+ {
+ *h = lightness;
+ *l = lightness;
+ *s = lightness;
+ }
+ else
+ {
+ hue = *h + 120;
+ while (hue > 360)
+ hue -= 360;
+ while (hue < 0)
+ hue += 360;
+
+ if (hue < 60)
+ r = m1 + (m2 - m1) * hue / 60;
+ else if (hue < 180)
+ r = m2;
+ else if (hue < 240)
+ r = m1 + (m2 - m1) * (240 - hue) / 60;
+ else
+ r = m1;
+
+ hue = *h;
+ while (hue > 360)
+ hue -= 360;
+ while (hue < 0)
+ hue += 360;
+
+ if (hue < 60)
+ g = m1 + (m2 - m1) * hue / 60;
+ else if (hue < 180)
+ g = m2;
+ else if (hue < 240)
+ g = m1 + (m2 - m1) * (240 - hue) / 60;
+ else
+ g = m1;
+
+ hue = *h - 120;
+ while (hue > 360)
+ hue -= 360;
+ while (hue < 0)
+ hue += 360;
+
+ if (hue < 60)
+ b = m1 + (m2 - m1) * hue / 60;
+ else if (hue < 180)
+ b = m2;
+ else if (hue < 240)
+ b = m1 + (m2 - m1) * (240 - hue) / 60;
+ else
+ b = m1;
+
+ *h = r;
+ *l = g;
+ *s = b;
+ }
+}
+
+gboolean
+gce_color_mix (double factor,
+ GdkColor const *color1,
+ GdkColor const *color2,
+ GdkColor *result)
+{
+ result->red = factor * color1->red + (1.0 - factor) * color2->red;
+ result->green = factor * color1->green + (1.0 - factor) * color2->green;
+ result->blue = factor * color1->blue + (1.0 - factor) * color2->blue;
+
+ return TRUE;
+}
+
+gboolean
+gce_color_shade (double factor,
+ GdkColor *color)
+{
+ gdouble red;
+ gdouble green;
+ gdouble blue;
+
+ red = (gdouble) color->red / 65535.0;
+ green = (gdouble) color->green / 65535.0;
+ blue = (gdouble) color->blue / 65535.0;
+
+ rgb_to_hls (&red, &green, &blue);
+
+ green *= factor;
+ if (green > 1.0)
+ green = 1.0;
+ else if (green < 0.0)
+ green = 0.0;
+
+ blue *= factor;
+ if (blue > 1.0)
+ blue = 1.0;
+ else if (blue < 0.0)
+ blue = 0.0;
+
+ hls_to_rgb (&red, &green, &blue);
+
+ color->red = (guint16) (red * 65535.0);
+ color->green = (guint16) (green * 65535.0);
+ color->blue = (guint16) (blue * 65535.0);
+
+ return TRUE;
+}
+
Added: trunk/src/gce-color.h
==============================================================================
--- (empty file)
+++ trunk/src/gce-color.h Fri Oct 3 17:22:14 2008
@@ -0,0 +1,37 @@
+/* The CSS Theme Engine for Gtk+.
+ * Copyright (C) 2008 Robert Staudinger
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston,
+ * MA 02110-1301, USA.
+ */
+
+#ifndef GCE_COLOR_H
+#define GCE_COLOR_H
+
+#include <glib.h>
+#include <gdk/gdk.h>
+
+G_BEGIN_DECLS
+
+gboolean gce_color_lookup (char const *spec, GdkColor *color);
+
+gboolean gce_color_mix (double factor, GdkColor const *color1, GdkColor const *color2, GdkColor *result);
+
+gboolean gce_color_shade (double factor, GdkColor *color);
+
+G_END_DECLS
+
+#endif /* GCE_COLOR_H */
+
Modified: trunk/src/gce-functions.c
==============================================================================
--- trunk/src/gce-functions.c (original)
+++ trunk/src/gce-functions.c Fri Oct 3 17:22:14 2008
@@ -25,6 +25,7 @@
#endif
#include "gce-functions.h"
+#include "gce-color.h"
/*
* TODO make this bullet proof wrt uri scheme.
@@ -61,32 +62,173 @@
return ret;
}
+static gboolean
+_color_walk (GdkColor *color,
+ GSList const **args)
+{
+ double factor;
+ char const *token;
+
+ g_return_val_if_fail (*args && (*args)->data, FALSE);
+
+ token = (char const *) (*args)->data;
+
+ if (0 == g_strcmp0 ("rgb(", token)) {
+
+ double red, green, blue;
+
+ /* red */
+ *args = (*args)->next; if (!*args) return FALSE;
+ red = g_ascii_strtod ((char const *) (*args)->data, NULL);
+
+ /* "," */
+ *args = (*args)->next; if (!*args) return FALSE;
+ if (0 != g_strcmp0(",", (char const *) (*args)->data)) return FALSE;
+
+ /* green */
+ *args = (*args)->next; if (!*args) return FALSE;
+ green = g_ascii_strtod ((char const *) (*args)->data, NULL);
+
+ /* "," */
+ *args = (*args)->next; if (!*args) return FALSE;
+ if (0 != g_strcmp0(",", (char const *) (*args)->data)) return FALSE;
+
+ /* blue */
+ *args = (*args)->next; if (!*args) return FALSE;
+ blue = g_ascii_strtod ((char const *) (*args)->data, NULL);
+
+ /* ")" */
+ *args = (*args)->next; if (!*args) return FALSE;
+ if (0 != g_strcmp0(")", (char const *) (*args)->data)) return FALSE;
+
+ color->red = (guint16) (red * 65535.0);
+ color->green = (guint16) (green * 65535.0);
+ color->blue = (guint16) (blue * 65535.0);
+
+ return TRUE;
+
+ } else if (0 == g_strcmp0 ("gtk-color(", token)) {
+
+ gboolean ret;
+
+ /* color */
+ *args = (*args)->next; if (!*args) return FALSE;
+ ret = gce_color_lookup ((char const *) (*args)->data, color);
+
+ /* ")" */
+ *args = (*args)->next; if (!*args) return FALSE;
+ if (0 != g_strcmp0(")", (char const *) (*args)->data)) return FALSE;
+
+ return ret;
+
+ } else if (0 == g_strcmp0 ("gtk-mix(", token)) {
+
+ GdkColor color1;
+ GdkColor color2;
+
+ /* factor */
+ *args = (*args)->next; if (!*args) return FALSE;
+ factor = g_ascii_strtod ((char const *) (*args)->data, NULL);
+
+ /* "," */
+ *args = (*args)->next; if (!*args) return FALSE;
+ if (0 != g_strcmp0(",", (char const *) (*args)->data)) return FALSE;
+
+ /* color1 */
+ *args = (*args)->next; if (!*args) return FALSE;
+ if (!_color_walk (&color1, args)) return FALSE;
+
+ /* "," */
+ *args = (*args)->next; if (!*args) return FALSE;
+ if (0 != g_strcmp0(",", (char const *) (*args)->data)) return FALSE;
+
+ /* color2 */
+ *args = (*args)->next; if (!*args) return FALSE;
+ if (!_color_walk (&color2, args)) return FALSE;
+
+ /* ")" */
+ *args = (*args)->next; if (!*args) return FALSE;
+ if (0 != g_strcmp0(")", (char const *) (*args)->data)) return FALSE;
+
+ return gce_color_mix (factor, &color1, &color2, color);
+
+ } else if (0 == g_strcmp0 ("gtk-shade(", token)) {
+
+ /* factor */
+ *args = (*args)->next; if (!*args) return FALSE;
+ factor = g_ascii_strtod ((char const *) (*args)->data, NULL);
+
+ /* "," */
+ *args = (*args)->next; if (!*args) return FALSE;
+ if (0 != g_strcmp0(",", (char const *) (*args)->data)) return FALSE;
+
+ /* color */
+ *args = (*args)->next; if (!*args) return FALSE;
+ if (!_color_walk (color, args)) return FALSE;
+
+ /* ")" */
+ *args = (*args)->next; if (!*args) return FALSE;
+ if (0 != g_strcmp0(")", (char const *) (*args)->data)) return FALSE;
+
+ return gce_color_shade (factor, color);
+
+ } else if (0 == g_strcmp0 ("gtk-darker(", token)) {
+
+ /* color */
+ *args = (*args)->next; if (!*args) return FALSE;
+ if (!_color_walk (color, args)) return FALSE;
+
+ /* ")" */
+ *args = (*args)->next; if (!*args) return FALSE;
+ if (0 != g_strcmp0(")", (char const *) (*args)->data)) return FALSE;
+
+ return gce_color_shade (0.7, color);
+
+ } else if (0 == g_strcmp0 ("gtk-lighter(", token)) {
+
+ /* color */
+ *args = (*args)->next; if (!*args) return FALSE;
+ if (!_color_walk (color, args)) return FALSE;
+
+ /* ")" */
+ *args = (*args)->next; if (!*args) return FALSE;
+ if (0 != g_strcmp0(")", (char const *) (*args)->data)) return FALSE;
+
+ return gce_color_shade (1.3, color);
+
+ } else {
+
+ /* Color. */
+ return gce_color_lookup (token, color);
+ }
+
+ return FALSE;
+}
+
static char *
-lookup_color (GSList const *args)
+color (GSList const *args)
{
- GtkSettings *settings;
- GHashTable *colors;
- GdkColor *color;
-
- settings = gtk_settings_get_default ();
- colors = NULL;
- g_object_get (G_OBJECT (settings), "color-hash", &colors, NULL);
- g_return_val_if_fail (colors, NULL);
+ GdkColor result;
+ gboolean ret;
g_return_val_if_fail (args && args->data, NULL);
- color = (GdkColor *) g_hash_table_lookup (colors, args->data);
- g_return_val_if_fail (color, NULL);
- return g_strdup_printf ("#%0x%0x%0x", color->red >> 8,
- color->green >> 8,
- color->blue >> 8);
+ ret = _color_walk (&result, &args);
+
+ return g_strdup_printf ("#%0x%0x%0x", result.red >> 8,
+ result.green >> 8,
+ result.blue >> 8);
}
static ccss_function_t const _functions[] =
{
- { "url", url },
- { "gtk-color", lookup_color },
- { NULL }
+ { "url", url },
+ { "gtk-color", color },
+ { "gtk-mix", color },
+ { "gtk-shade", color },
+ { "gtk-lighter", color },
+ { "gtk-darker", color },
+ { NULL }
};
ccss_function_t const *
Modified: trunk/themes/gtk-css-test/gtk-2.0/styles.css
==============================================================================
--- trunk/themes/gtk-css-test/gtk-2.0/styles.css (original)
+++ trunk/themes/gtk-css-test/gtk-2.0/styles.css Fri Oct 3 17:22:14 2008
@@ -1,7 +1,6 @@
* {
- background-color: gtk-color(bg_color);
-/* background-color: khaki;
+ background-color: gtk-mix(0.5, bg_color, fg_color);
color: black;
}
@@ -144,4 +143,4 @@
GtkButton:normal {
background-color: darkkhaki;
}
-*/
+
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]