diff options
author | Benjamin Otte <otte@redhat.com> | 2011-04-11 18:38:22 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2011-05-18 21:58:43 +0200 |
commit | 8b6f92d08720f1fcbcb4a061db4c21212aaa185f (patch) | |
tree | 75647f41da612d6222ffcfb13c95543ce81ee6dd /gtk/gtkgradient.c | |
parent | dc43239a6132f478b585d26b3ed6e5dc73211a7c (diff) | |
download | gtk+-8b6f92d08720f1fcbcb4a061db4c21212aaa185f.tar.gz |
API: Add gtk_gradient_to_string()
Diffstat (limited to 'gtk/gtkgradient.c')
-rw-r--r-- | gtk/gtkgradient.c | 100 |
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); +} |