summaryrefslogtreecommitdiff
path: root/gtk/gtkgradient.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2011-04-11 18:38:22 +0200
committerBenjamin Otte <otte@redhat.com>2011-05-18 21:58:43 +0200
commit8b6f92d08720f1fcbcb4a061db4c21212aaa185f (patch)
tree75647f41da612d6222ffcfb13c95543ce81ee6dd /gtk/gtkgradient.c
parentdc43239a6132f478b585d26b3ed6e5dc73211a7c (diff)
downloadgtk+-8b6f92d08720f1fcbcb4a061db4c21212aaa185f.tar.gz
API: Add gtk_gradient_to_string()
Diffstat (limited to 'gtk/gtkgradient.c')
-rw-r--r--gtk/gtkgradient.c100
1 files changed, 100 insertions, 0 deletions
diff --git a/gtk/gtkgradient.c b/gtk/gtkgradient.c
index a19b8fe583..3815860566 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);
+}