[gtk+/parser: 8/79] API: Add gtk_gradient_to_string()



commit b346113996c3f4350101bacaa8c858ceaa456d93
Author: Benjamin Otte <otte redhat com>
Date:   Mon Apr 11 18:38:22 2011 +0200

    API: Add gtk_gradient_to_string()

 docs/reference/gtk/gtk3-sections.txt |    1 +
 gtk/gtk.symbols                      |    1 +
 gtk/gtkgradient.c                    |  100 ++++++++++++++++++++++++++++++++++
 gtk/gtkgradient.h                    |    2 +
 4 files changed, 104 insertions(+), 0 deletions(-)
---
diff --git a/docs/reference/gtk/gtk3-sections.txt b/docs/reference/gtk/gtk3-sections.txt
index 2932c48..95f5715 100644
--- a/docs/reference/gtk/gtk3-sections.txt
+++ b/docs/reference/gtk/gtk3-sections.txt
@@ -5745,6 +5745,7 @@ gtk_gradient_add_color_stop
 gtk_gradient_ref
 gtk_gradient_unref
 gtk_gradient_resolve
+gtk_gradient_to_string
 
 <SUBSECTION Standard>
 GTK_TYPE_GRADIENT
diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols
index 0afa74f..83a2d21 100644
--- a/gtk/gtk.symbols
+++ b/gtk/gtk.symbols
@@ -709,6 +709,7 @@ gtk_gradient_new_linear
 gtk_gradient_new_radial
 gtk_gradient_ref
 gtk_gradient_resolve
+gtk_gradient_to_string
 gtk_gradient_unref
 gtk_dialog_add_action_widget
 gtk_dialog_add_button
diff --git a/gtk/gtkgradient.c b/gtk/gtkgradient.c
index a19b8fe..3815860 100644
--- a/gtk/gtkgradient.c
+++ b/gtk/gtkgradient.c
@@ -280,3 +280,103 @@ gtk_gradient_resolve (GtkGradient         *gradient,
   *resolved_gradient = pattern;
   return TRUE;
 }
+
+static void
+append_number (GString    *str,
+               double      d,
+               const char *zero,
+               const char *half,
+               const char *one)
+{
+  if (zero && d == 0.0)
+    g_string_append (str, zero);
+  else if (half && d == 0.5)
+    g_string_append (str, half);
+  else if (one && d == 1.0)
+    g_string_append (str, one);
+  else
+    {
+      char buf[G_ASCII_DTOSTR_BUF_SIZE];
+
+      g_ascii_dtostr (buf, sizeof (buf), d);
+      g_string_append (str, buf);
+    }
+}
+
+/**
+ * gtk_gradient_to_string:
+ * @gradient: the gradient to print
+ *
+ * Creates a string representation for @gradient that is suitable
+ * for using in GTK CSS files.
+ *
+ * Returns: A string representation for @gradient
+ **/
+char *
+gtk_gradient_to_string (GtkGradient *gradient)
+{
+  GString *str;
+  guint i;
+
+  g_return_val_if_fail (gradient != NULL, NULL);
+
+  str = g_string_new ("-gtk-gradient (");
+
+  if (gradient->radius0 == 0 && gradient->radius1 == 0)
+    {
+      g_string_append (str, "linear, ");
+      append_number (str, gradient->x0, "left", "center", "right");
+      g_string_append_c (str, ' ');
+      append_number (str, gradient->y0, "top", "center", "bottom");
+      g_string_append (str, ", ");
+      append_number (str, gradient->x1, "left", "center", "right");
+      g_string_append_c (str, ' ');
+      append_number (str, gradient->y1, "top", "center", "bottom");
+    }
+  else
+    {
+      g_string_append (str, "radial, ");
+      append_number (str, gradient->x0, "left", "center", "right");
+      g_string_append_c (str, ' ');
+      append_number (str, gradient->y0, "top", "center", "bottom");
+      g_string_append (str, ", ");
+      append_number (str, gradient->radius0, NULL, NULL, NULL);
+      g_string_append (str, ", ");
+      append_number (str, gradient->x1, "left", "center", "right");
+      g_string_append_c (str, ' ');
+      append_number (str, gradient->y1, "top", "center", "bottom");
+      g_string_append (str, ", ");
+      append_number (str, gradient->radius1, NULL, NULL, NULL);
+    }
+  
+  for (i = 0; i < gradient->stops->len; i++)
+    {
+      ColorStop *stop;
+      char *s;
+
+      stop = &g_array_index (gradient->stops, ColorStop, i);
+
+      g_string_append (str, ", ");
+
+      if (stop->offset == 0.0)
+        g_string_append (str, "from (");
+      else if (stop->offset == 1.0)
+        g_string_append (str, "to (");
+      else
+        {
+          g_string_append (str, "color-stop (");
+          append_number (str, stop->offset, NULL, NULL, NULL);
+          g_string_append (str, ", ");
+        }
+
+      s = gtk_symbolic_color_to_string (stop->color);
+      g_string_append (str, s);
+      g_free (s);
+
+      g_string_append (str, ")");
+    }
+
+  g_string_append (str, ")");
+
+  return g_string_free (str, FALSE);
+}
diff --git a/gtk/gtkgradient.h b/gtk/gtkgradient.h
index f097c40..7d54030 100644
--- a/gtk/gtkgradient.h
+++ b/gtk/gtkgradient.h
@@ -56,6 +56,8 @@ gboolean      gtk_gradient_resolve        (GtkGradient         *gradient,
                                            GtkStyleProperties  *props,
                                            cairo_pattern_t    **resolved_gradient);
 
+char *        gtk_gradient_to_string      (GtkGradient         *gradient);
+
 G_END_DECLS
 
 #endif /* __GTK_GRADIENT_H__ */



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