[goocanvas] Add GdkRGBA properties. #651125.



commit 36746309d3ebd51655bfe4a363e27f966b60003e
Author: Damon Chaplin <damon gnome org>
Date:   Sat Sep 24 12:17:20 2011 +0100

    	Add GdkRGBA properties. #651125.
    
    2011-09-24  Krzesimir Nowak  <qdlacz gmail com>
    
    	    Add GdkRGBA properties. #651125.
    
    	    * src/goocanvasutils.c: Added helper functions for GdkRGBA.
    	    * src/goocanvasprivate: Ditto.
    	    * src/goocanvas.c: Added GdkRGBA version color properties.
    	    * src/goocanvasgrid.c: Ditto.
    	    * src/goocanvasitemsimple.c: Ditto.
    
    	    (committed by Damon with a few minor changes)

 ChangeLog                 |   12 +++++++++++
 src/goocanvas.c           |   24 +++++++++++++++++----
 src/goocanvasgrid.c       |   45 ++++++++++++++++++++++++++++++++++++++++++
 src/goocanvasitemsimple.c |   36 +++++++++++++++++++++++++++++++++
 src/goocanvasprivate.h    |   10 ++++++--
 src/goocanvasutils.c      |   48 ++++++++++++++++++++++++++++++++++++++------
 6 files changed, 160 insertions(+), 15 deletions(-)
---
diff --git a/ChangeLog b/ChangeLog
index f1046fb..b227667 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,15 @@
+2011-09-24  Krzesimir Nowak  <qdlacz gmail com>
+
+	Add GdkRGBA properties. #651125.
+
+	* src/goocanvasutils.c: Added helper functions for GdkRGBA.
+	* src/goocanvasprivate: Ditto.
+	* src/goocanvas.c: Added GdkRGBA version color properties.
+	* src/goocanvasgrid.c: Ditto.
+	* src/goocanvasitemsimple.c: Ditto.
+
+	(committed by Damon with a few minor changes)
+
 2011-09-07  Murray Cumming  <murrayc murrayc com>
 
 	GooCanvasImage: Correct the size when using units other than pixels.
diff --git a/src/goocanvas.c b/src/goocanvas.c
index 61eb635..2f7569c 100644
--- a/src/goocanvas.c
+++ b/src/goocanvas.c
@@ -135,6 +135,7 @@ enum {
   PROP_RESOLUTION_Y,
   PROP_BACKGROUND_COLOR,
   PROP_BACKGROUND_COLOR_RGB,
+  PROP_BACKGROUND_COLOR_GDK_RGBA,
   PROP_INTEGER_LAYOUT,
   PROP_CLEAR_BACKGROUND,
   PROP_REDRAW_WHEN_SCROLLED,
@@ -418,6 +419,13 @@ goo_canvas_class_init (GooCanvasClass *klass)
 						      0, G_MAXUINT, 0,
 						      G_PARAM_WRITABLE));
 
+  g_object_class_install_property (gobject_class, PROP_BACKGROUND_COLOR_GDK_RGBA,
+                                   g_param_spec_boxed ("background-color-gdk-rgba",
+                                                       _("Background Color GdkRGBA"),
+                                                       _("The color to use for the canvas background, specified as a GdkRGBA"),
+                                                       GDK_TYPE_RGBA,
+                                                       G_PARAM_WRITABLE));
+
   g_object_class_install_property (gobject_class, PROP_INTEGER_LAYOUT,
                                    g_param_spec_boolean ("integer-layout",
 							 _("Integer Layout"),
@@ -799,6 +807,8 @@ goo_canvas_set_property    (GObject            *object,
   gboolean need_reconfigure = FALSE;
   gboolean need_update_automatic_bounds = FALSE;
   guint rgb;
+  GdkRGBA rgba = { 0, 0, 0, 0 };
+  const char *color_string;
 
   switch (prop_id)
     {
@@ -861,12 +871,13 @@ goo_canvas_set_property    (GObject            *object,
       need_reconfigure = TRUE;
       break;
     case PROP_BACKGROUND_COLOR:
-      if (!g_value_get_string (value))
-	gtk_widget_modify_bg ((GtkWidget*) canvas, GTK_STATE_NORMAL, NULL);
-      else if (gdk_color_parse (g_value_get_string (value), &color))
-	gtk_widget_modify_bg ((GtkWidget*) canvas, GTK_STATE_NORMAL, &color);
+      color_string = g_value_get_string (value);
+      if (!color_string)
+	gtk_widget_override_background_color ((GtkWidget*) canvas, GTK_STATE_FLAG_NORMAL, NULL);
+      else if (gdk_rgba_parse (&rgba, color_string))
+        gtk_widget_override_background_color ((GtkWidget*) canvas, GTK_STATE_FLAG_NORMAL, &rgba);
       else
-	g_warning ("Unknown color: %s", g_value_get_string (value));
+	g_warning ("Unknown color: %s", color_string);
       break;
     case PROP_BACKGROUND_COLOR_RGB:
       rgb = g_value_get_uint (value);
@@ -875,6 +886,9 @@ goo_canvas_set_property    (GObject            *object,
       color.blue  = ((rgb)       & 0xFF) * 257;
       gtk_widget_modify_bg  ((GtkWidget*) canvas, GTK_STATE_NORMAL, &color);
       break;
+    case PROP_BACKGROUND_COLOR_GDK_RGBA:
+      gtk_widget_override_background_color ((GtkWidget*) canvas, GTK_STATE_FLAG_NORMAL, g_value_get_boxed (value));
+      break;
     case PROP_INTEGER_LAYOUT:
       canvas->integer_layout = g_value_get_boolean (value);
       canvas->need_entire_subtree_update = TRUE;
diff --git a/src/goocanvasgrid.c b/src/goocanvasgrid.c
index 80190dd..f3c0e99 100644
--- a/src/goocanvasgrid.c
+++ b/src/goocanvasgrid.c
@@ -80,12 +80,15 @@ enum {
   /* Convenience properties. */
   PROP_HORZ_GRID_LINE_COLOR,
   PROP_HORZ_GRID_LINE_COLOR_RGBA,
+  PROP_HORZ_GRID_LINE_COLOR_GDK_RGBA,
   PROP_HORZ_GRID_LINE_PIXBUF,
   PROP_VERT_GRID_LINE_COLOR,
   PROP_VERT_GRID_LINE_COLOR_RGBA,
+  PROP_VERT_GRID_LINE_COLOR_GDK_RGBA,
   PROP_VERT_GRID_LINE_PIXBUF,
   PROP_BORDER_COLOR,
   PROP_BORDER_COLOR_RGBA,
+  PROP_BORDER_COLOR_GDK_RGBA,
   PROP_BORDER_PIXBUF
 };
 
@@ -243,6 +246,13 @@ goo_canvas_grid_install_common_properties (GObjectClass *gobject_class)
 						      0, G_MAXUINT, 0,
 						      G_PARAM_READWRITE));
 
+  g_object_class_install_property (gobject_class, PROP_HORZ_GRID_LINE_COLOR_GDK_RGBA,
+                                   g_param_spec_boxed ("horz-grid-line-color-gdk-rgba",
+                                                       _("Horizontal Grid Line Color GdkRGBA"),
+                                                       _("The color to use for the horizontal grid lines, specified as a GdkRGBA"),
+                                                       GDK_TYPE_RGBA,
+                                                       G_PARAM_READWRITE));
+
   g_object_class_install_property (gobject_class, PROP_HORZ_GRID_LINE_PIXBUF,
                                    g_param_spec_object ("horz-grid-line-pixbuf",
 							_("Horizontal Grid Line Pixbuf"),
@@ -264,6 +274,13 @@ goo_canvas_grid_install_common_properties (GObjectClass *gobject_class)
 						      0, G_MAXUINT, 0,
 						      G_PARAM_READWRITE));
 
+  g_object_class_install_property (gobject_class, PROP_VERT_GRID_LINE_COLOR_GDK_RGBA,
+                                   g_param_spec_boxed ("vert-grid-line-color-gdk-rgba",
+                                                       _("Vertical Grid Line Color GdkRGBA"),
+                                                       _("The color to use for the vertical grid lines, specified as a GdkRGBA"),
+                                                       GDK_TYPE_RGBA,
+                                                       G_PARAM_READWRITE));
+
   g_object_class_install_property (gobject_class, PROP_VERT_GRID_LINE_PIXBUF,
                                    g_param_spec_object ("vert-grid-line-pixbuf",
 							_("Vertical Grid Line Pixbuf"),
@@ -285,6 +302,13 @@ goo_canvas_grid_install_common_properties (GObjectClass *gobject_class)
 						      0, G_MAXUINT, 0,
 						      G_PARAM_READWRITE));
 
+  g_object_class_install_property (gobject_class, PROP_BORDER_COLOR_GDK_RGBA,
+                                   g_param_spec_boxed ("border-color-gdk-rgba",
+                                                       _("Border Color GdkRGBA"),
+                                                       _("The color to use for the border, specified as a GdkRGBA"),
+                                                       GDK_TYPE_RGBA,
+                                                       G_PARAM_READWRITE));
+
   g_object_class_install_property (gobject_class, PROP_BORDER_PIXBUF,
                                    g_param_spec_object ("border-pixbuf",
 							_("Border Pixbuf"),
@@ -501,12 +525,21 @@ goo_canvas_grid_get_common_property (GObject              *object,
     case PROP_HORZ_GRID_LINE_COLOR_RGBA:
       goo_canvas_get_rgba_value_from_pattern (grid_data->horz_grid_line_pattern, value);
       break;
+    case PROP_HORZ_GRID_LINE_COLOR_GDK_RGBA:
+      goo_canvas_get_gdk_rgba_value_from_pattern (grid_data->horz_grid_line_pattern, value);
+      break;
     case PROP_VERT_GRID_LINE_COLOR_RGBA:
       goo_canvas_get_rgba_value_from_pattern (grid_data->vert_grid_line_pattern, value);
       break;
+    case PROP_VERT_GRID_LINE_COLOR_GDK_RGBA:
+      goo_canvas_get_gdk_rgba_value_from_pattern (grid_data->vert_grid_line_pattern, value);
+      break;
     case PROP_BORDER_COLOR_RGBA:
       goo_canvas_get_rgba_value_from_pattern (grid_data->border_pattern, value);
       break;
+    case PROP_BORDER_COLOR_GDK_RGBA:
+      goo_canvas_get_gdk_rgba_value_from_pattern (grid_data->border_pattern, value);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -603,6 +636,10 @@ goo_canvas_grid_set_common_property (GObject              *object,
       cairo_pattern_destroy (grid_data->horz_grid_line_pattern);
       grid_data->horz_grid_line_pattern = goo_canvas_create_pattern_from_rgba_value (value);
       break;
+    case PROP_HORZ_GRID_LINE_COLOR_GDK_RGBA:
+      cairo_pattern_destroy (grid_data->horz_grid_line_pattern);
+      grid_data->horz_grid_line_pattern = goo_canvas_create_pattern_from_gdk_rgba_value (value);
+      break;
     case PROP_HORZ_GRID_LINE_PIXBUF:
       cairo_pattern_destroy (grid_data->horz_grid_line_pattern);
       grid_data->horz_grid_line_pattern = goo_canvas_create_pattern_from_pixbuf_value (value);
@@ -616,6 +653,10 @@ goo_canvas_grid_set_common_property (GObject              *object,
       cairo_pattern_destroy (grid_data->vert_grid_line_pattern);
       grid_data->vert_grid_line_pattern = goo_canvas_create_pattern_from_rgba_value (value);
       break;
+    case PROP_VERT_GRID_LINE_COLOR_GDK_RGBA:
+      cairo_pattern_destroy (grid_data->vert_grid_line_pattern);
+      grid_data->vert_grid_line_pattern = goo_canvas_create_pattern_from_gdk_rgba_value (value);
+      break;
     case PROP_VERT_GRID_LINE_PIXBUF:
       cairo_pattern_destroy (grid_data->vert_grid_line_pattern);
       grid_data->vert_grid_line_pattern = goo_canvas_create_pattern_from_pixbuf_value (value);
@@ -629,6 +670,10 @@ goo_canvas_grid_set_common_property (GObject              *object,
       cairo_pattern_destroy (grid_data->border_pattern);
       grid_data->border_pattern = goo_canvas_create_pattern_from_rgba_value (value);
       break;
+    case PROP_BORDER_COLOR_GDK_RGBA:
+      cairo_pattern_destroy (grid_data->border_pattern);
+      grid_data->border_pattern = goo_canvas_create_pattern_from_gdk_rgba_value (value);
+      break;
     case PROP_BORDER_PIXBUF:
       cairo_pattern_destroy (grid_data->border_pattern);
       grid_data->border_pattern = goo_canvas_create_pattern_from_pixbuf_value (value);
diff --git a/src/goocanvasitemsimple.c b/src/goocanvasitemsimple.c
index e5e8941..d46c552 100644
--- a/src/goocanvasitemsimple.c
+++ b/src/goocanvasitemsimple.c
@@ -63,9 +63,11 @@ enum {
   /* Convenience properties. */
   PROP_STROKE_COLOR,
   PROP_STROKE_COLOR_RGBA,
+  PROP_STROKE_COLOR_GDK_RGBA,
   PROP_STROKE_PIXBUF,
   PROP_FILL_COLOR,
   PROP_FILL_COLOR_RGBA,
+  PROP_FILL_COLOR_GDK_RGBA,
   PROP_FILL_PIXBUF,
 
   /* Other properties. Note that the order here is important PROP_TRANSFORM
@@ -235,6 +237,13 @@ goo_canvas_item_simple_install_common_properties (GObjectClass *gobject_class)
 						      0, G_MAXUINT, 0,
 						      G_PARAM_READWRITE));
 
+  g_object_class_install_property (gobject_class, PROP_STROKE_COLOR_GDK_RGBA,
+                                   g_param_spec_boxed ("stroke-color-gdk-rgba",
+                                                       _("Stroke Color GdkRGBA"),
+                                                       _("The color to use for the item's perimeter, specified as a GdkRGBA. To disable painting set the 'stroke-pattern' property to NULL"),
+                                                       GDK_TYPE_RGBA,
+                                                       G_PARAM_READWRITE));
+
   g_object_class_install_property (gobject_class, PROP_STROKE_PIXBUF,
                                    g_param_spec_object ("stroke-pixbuf",
 							_("Stroke Pixbuf"),
@@ -256,6 +265,13 @@ goo_canvas_item_simple_install_common_properties (GObjectClass *gobject_class)
 						      0, G_MAXUINT, 0,
 						      G_PARAM_READWRITE));
 
+  g_object_class_install_property (gobject_class, PROP_FILL_COLOR_GDK_RGBA,
+                                   g_param_spec_boxed ("fill-color-gdk-rgba",
+                                                       _("Fill Color GdkRGBA"),
+                                                       _("The color to use to paint the interior of the item, specified as a GdkRGBA. To disable painting set the 'fill-pattern' property to NULL"),
+                                                       GDK_TYPE_RGBA,
+                                                       G_PARAM_READWRITE));
+
   g_object_class_install_property (gobject_class, PROP_FILL_PIXBUF,
                                    g_param_spec_object ("fill-pixbuf",
 							_("Fill Pixbuf"),
@@ -523,12 +539,24 @@ goo_canvas_item_simple_get_common_property (GObject                 *object,
 	goo_canvas_get_rgba_value_from_pattern (svalue->data[0].v_pointer,
 						value);
       break;
+    case PROP_STROKE_COLOR_GDK_RGBA:
+      svalue = goo_canvas_style_get_property (style, goo_canvas_style_stroke_pattern_id);
+      if (svalue)
+        goo_canvas_get_gdk_rgba_value_from_pattern (svalue->data[0].v_pointer,
+                                                    value);
+      break;
     case PROP_FILL_COLOR_RGBA:
       svalue = goo_canvas_style_get_property (style, goo_canvas_style_fill_pattern_id);
       if (svalue)
 	goo_canvas_get_rgba_value_from_pattern (svalue->data[0].v_pointer,
 						value);
       break;
+    case PROP_FILL_COLOR_GDK_RGBA:
+      svalue = goo_canvas_style_get_property (style, goo_canvas_style_fill_pattern_id);
+      if (svalue)
+        goo_canvas_get_gdk_rgba_value_from_pattern (svalue->data[0].v_pointer,
+                                                    value);
+      break;
 
       /* Other properties. */
     case PROP_TRANSFORM:
@@ -694,6 +722,10 @@ goo_canvas_item_simple_set_common_property (GObject                 *object,
       pattern = goo_canvas_create_pattern_from_rgba_value (value);
       goo_canvas_set_style_property_from_pattern (style, goo_canvas_style_stroke_pattern_id, pattern);
       break;
+    case PROP_STROKE_COLOR_GDK_RGBA:
+      pattern = goo_canvas_create_pattern_from_gdk_rgba_value (value);
+      goo_canvas_set_style_property_from_pattern (style, goo_canvas_style_stroke_pattern_id, pattern);
+      break;
     case PROP_STROKE_PIXBUF:
       pattern = goo_canvas_create_pattern_from_pixbuf_value (value);
       goo_canvas_set_style_property_from_pattern (style, goo_canvas_style_stroke_pattern_id, pattern);
@@ -707,6 +739,10 @@ goo_canvas_item_simple_set_common_property (GObject                 *object,
       pattern = goo_canvas_create_pattern_from_rgba_value (value);
       goo_canvas_set_style_property_from_pattern (style, goo_canvas_style_fill_pattern_id, pattern);
       break;
+    case PROP_FILL_COLOR_GDK_RGBA:
+      pattern = goo_canvas_create_pattern_from_gdk_rgba_value (value);
+      goo_canvas_set_style_property_from_pattern (style, goo_canvas_style_fill_pattern_id, pattern);
+      break;
     case PROP_FILL_PIXBUF:
       pattern = goo_canvas_create_pattern_from_pixbuf_value (value);
       goo_canvas_set_style_property_from_pattern (style, goo_canvas_style_fill_pattern_id, pattern);
diff --git a/src/goocanvasprivate.h b/src/goocanvasprivate.h
index 423f37e..b62c54a 100644
--- a/src/goocanvasprivate.h
+++ b/src/goocanvasprivate.h
@@ -39,13 +39,17 @@ guint goo_canvas_convert_colors_to_rgba (double red,
 void goo_canvas_get_rgba_value_from_pattern (cairo_pattern_t *pattern,
 					     GValue          *value);
 
+void goo_canvas_get_gdk_rgba_value_from_pattern (cairo_pattern_t *pattern,
+                                                 GValue          *value);
+
 void goo_canvas_set_style_property_from_pattern (GooCanvasStyle  *style,
 						 GQuark           property_id,
 						 cairo_pattern_t *pattern);
 
-cairo_pattern_t* goo_canvas_create_pattern_from_color_value  (const GValue *value);
-cairo_pattern_t* goo_canvas_create_pattern_from_rgba_value   (const GValue *value);
-cairo_pattern_t* goo_canvas_create_pattern_from_pixbuf_value (const GValue *value);
+cairo_pattern_t* goo_canvas_create_pattern_from_color_value    (const GValue *value);
+cairo_pattern_t* goo_canvas_create_pattern_from_rgba_value     (const GValue *value);
+cairo_pattern_t* goo_canvas_create_pattern_from_gdk_rgba_value (const GValue *value);
+cairo_pattern_t* goo_canvas_create_pattern_from_pixbuf_value   (const GValue *value);
 
 
 gboolean goo_canvas_boolean_handled_accumulator (GSignalInvocationHint *ihint,
diff --git a/src/goocanvasutils.c b/src/goocanvasutils.c
index ca07559..983d911 100644
--- a/src/goocanvasutils.c
+++ b/src/goocanvasutils.c
@@ -14,6 +14,7 @@
  */
 #include <config.h>
 #include <math.h>
+#include <gdk/gdk.h>
 #include <gtk/gtk.h>
 #include "goocanvas.h"
 
@@ -1233,6 +1234,20 @@ goo_canvas_get_rgba_value_from_pattern (cairo_pattern_t *pattern,
 }
 
 
+void
+goo_canvas_get_gdk_rgba_value_from_pattern (cairo_pattern_t *pattern,
+                                            GValue          *value)
+{
+  GdkRGBA rgba = {0, 0, 0, 0};
+
+  if (pattern && cairo_pattern_get_type (pattern) == CAIRO_PATTERN_TYPE_SOLID)
+    {
+      cairo_pattern_get_rgba (pattern, &rgba.red, &rgba.green, &rgba.blue, &rgba.alpha);
+    }
+  g_value_set_boxed (value, &rgba);
+}
+
+
 /* Sets a style property to the given pattern, taking ownership of it. */
 void
 goo_canvas_set_style_property_from_pattern (GooCanvasStyle  *style,
@@ -1251,16 +1266,20 @@ goo_canvas_set_style_property_from_pattern (GooCanvasStyle  *style,
 cairo_pattern_t*
 goo_canvas_create_pattern_from_color_value (const GValue *value)
 {
-  GdkColor color = { 0, 0, 0, 0, };
+  GdkRGBA rgba = { 0, 0, 0, 0 };
+  const char *color_string;
 
-  if (g_value_get_string (value))
-    gdk_color_parse (g_value_get_string (value), &color);
+  color_string = g_value_get_string (value);
+
+  if (color_string)
+    {
+      gdk_rgba_parse (&rgba, color_string);
+    }
 
-  return cairo_pattern_create_rgb (color.red / 65535.0,
-				   color.green / 65535.0,
-				   color.blue / 65535.0);
+  return cairo_pattern_create_rgba (rgba.red, rgba.green, rgba.blue,
+                                    rgba.alpha);
 }
-  
+
 
 cairo_pattern_t*
 goo_canvas_create_pattern_from_rgba_value (const GValue *value)
@@ -1279,6 +1298,21 @@ goo_canvas_create_pattern_from_rgba_value (const GValue *value)
 
 
 cairo_pattern_t*
+goo_canvas_create_pattern_from_gdk_rgba_value (const GValue *value)
+{
+  GdkRGBA* rgba;
+
+  rgba = g_value_get_boxed (value);
+
+  if (rgba)
+    return cairo_pattern_create_rgba (rgba->red, rgba->green, rgba->blue,
+                                      rgba->alpha);
+  else
+    return cairo_pattern_create_rgba (0, 0, 0, 0);
+}
+
+
+cairo_pattern_t*
 goo_canvas_create_pattern_from_pixbuf_value (const GValue *value)
 {
   GdkPixbuf *pixbuf;



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]