]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkgradient.c
Change FSF Address
[~andy/gtk] / gtk / gtkgradient.c
index a19b8fe58360e9faf7d02d616e2dab7fc7064d21..ffbadc85f342ba19502e6b3d2767973decce0bc5 100644 (file)
  * 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., 59 Temple Place - Suite 330,
- * Boston, MA 02111-1307, USA.
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
  */
 
 #include "config.h"
 #include "gtkgradient.h"
+#include "gtkstylecontextprivate.h"
 #include "gtkstyleproperties.h"
 #include "gtkintl.h"
 
@@ -280,3 +279,141 @@ gtk_gradient_resolve (GtkGradient         *gradient,
   *resolved_gradient = pattern;
   return TRUE;
 }
+
+cairo_pattern_t *
+gtk_gradient_resolve_for_context (GtkGradient     *gradient,
+                                  GtkStyleContext *context)
+{
+  cairo_pattern_t *pattern;
+  guint i;
+
+  g_return_val_if_fail (gradient != NULL, FALSE);
+  g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), FALSE);
+
+  if (gradient->radius0 == 0 && gradient->radius1 == 0)
+    pattern = cairo_pattern_create_linear (gradient->x0, gradient->y0,
+                                           gradient->x1, gradient->y1);
+  else
+    pattern = cairo_pattern_create_radial (gradient->x0, gradient->y0,
+                                           gradient->radius0,
+                                           gradient->x1, gradient->y1,
+                                           gradient->radius1);
+
+  for (i = 0; i < gradient->stops->len; i++)
+    {
+      ColorStop *stop;
+      GdkRGBA rgba;
+
+      stop = &g_array_index (gradient->stops, ColorStop, i);
+
+      /* if color resolving fails, assume transparency */
+      if (!_gtk_style_context_resolve_color (context, stop->color, &rgba))
+        rgba.red = rgba.green = rgba.blue = rgba.alpha = 0.0;
+
+      cairo_pattern_add_color_stop_rgba (pattern, stop->offset,
+                                         rgba.red, rgba.green,
+                                         rgba.blue, rgba.alpha);
+    }
+
+  return pattern;
+}
+
+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);
+}