gtk-css-engine r160 - in trunk: . libccss/ccss src themes/gtk-css-test/gtk-2.0



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]