summaryrefslogtreecommitdiff
path: root/gtk/gtkcsscornervalue.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2012-04-03 18:39:01 +0200
committerBenjamin Otte <otte@redhat.com>2012-04-17 08:59:18 +0200
commitedbc8e4f57b871ee151443fe867f6e347682fe8d (patch)
treeae72342aeecd43394de441a76e2db86893f4e68c /gtk/gtkcsscornervalue.c
parent05f2249d08384d27ceea1e44ee4034a973fabb0c (diff)
downloadgtk+-edbc8e4f57b871ee151443fe867f6e347682fe8d.tar.gz
cssvalue: Add a value for border-radius corner properties
... and convert those properties to this value.
Diffstat (limited to 'gtk/gtkcsscornervalue.c')
-rw-r--r--gtk/gtkcsscornervalue.c170
1 files changed, 170 insertions, 0 deletions
diff --git a/gtk/gtkcsscornervalue.c b/gtk/gtkcsscornervalue.c
new file mode 100644
index 0000000000..5cf497481f
--- /dev/null
+++ b/gtk/gtkcsscornervalue.c
@@ -0,0 +1,170 @@
+/* GTK - The GIMP Toolkit
+ * Copyright (C) 2011 Red Hat, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include "gtkcsscornervalueprivate.h"
+
+#include "gtkcssnumbervalueprivate.h"
+
+struct _GtkCssValue {
+ GTK_CSS_VALUE_BASE
+ GtkCssValue *x;
+ GtkCssValue *y;
+};
+
+static void
+gtk_css_value_corner_free (GtkCssValue *value)
+{
+ _gtk_css_value_unref (value->x);
+ _gtk_css_value_unref (value->y);
+
+ g_slice_free (GtkCssValue, value);
+}
+
+static gboolean
+gtk_css_value_corner_equal (const GtkCssValue *corner1,
+ const GtkCssValue *corner2)
+{
+ return _gtk_css_value_equal (corner1->x, corner2->x)
+ && _gtk_css_value_equal (corner1->y, corner2->y);
+}
+
+static GtkCssValue *
+gtk_css_value_corner_transition (GtkCssValue *start,
+ GtkCssValue *end,
+ double progress)
+{
+ GtkCssValue *x, *y;
+
+ x = _gtk_css_value_transition (start->x, end->x, progress);
+ if (x == NULL)
+ return NULL;
+ y = _gtk_css_value_transition (start->y, end->y, progress);
+ if (y == NULL)
+ {
+ _gtk_css_value_unref (x);
+ return NULL;
+ }
+
+ return _gtk_css_corner_value_new (x, y);
+}
+
+static void
+gtk_css_value_corner_print (const GtkCssValue *corner,
+ GString *string)
+{
+ _gtk_css_value_print (corner->x, string);
+ if (!_gtk_css_value_equal (corner->x, corner->y))
+ {
+ g_string_append_c (string, ' ');
+ _gtk_css_value_print (corner->y, string);
+ }
+}
+
+static const GtkCssValueClass GTK_CSS_VALUE_CORNER = {
+ gtk_css_value_corner_free,
+ gtk_css_value_corner_equal,
+ gtk_css_value_corner_transition,
+ gtk_css_value_corner_print
+};
+
+GtkCssValue *
+_gtk_css_corner_value_new (GtkCssValue *x,
+ GtkCssValue *y)
+{
+ GtkCssValue *result;
+
+ result = _gtk_css_value_new (GtkCssValue, &GTK_CSS_VALUE_CORNER);
+ result->x = x;
+ result->y = y;
+
+ return result;
+}
+
+GtkCssValue *
+_gtk_css_corner_value_parse (GtkCssParser *parser)
+{
+ GtkCssValue *x, *y;
+
+ x = _gtk_css_number_value_parse (parser,
+ GTK_CSS_POSITIVE_ONLY
+ | GTK_CSS_PARSE_PERCENT
+ | GTK_CSS_NUMBER_AS_PIXELS
+ | GTK_CSS_PARSE_LENGTH);
+ if (x == NULL)
+ return NULL;
+
+ if (!_gtk_css_parser_has_number (parser))
+ y = _gtk_css_value_ref (x);
+ else
+ {
+ y = _gtk_css_number_value_parse (parser,
+ GTK_CSS_POSITIVE_ONLY
+ | GTK_CSS_PARSE_PERCENT
+ | GTK_CSS_NUMBER_AS_PIXELS
+ | GTK_CSS_PARSE_LENGTH);
+ if (y == NULL)
+ {
+ _gtk_css_value_unref (x);
+ return NULL;
+ }
+ }
+
+ return _gtk_css_corner_value_new (x, y);
+}
+
+double
+_gtk_css_corner_value_get_x (const GtkCssValue *corner,
+ double one_hundred_percent)
+{
+ g_return_val_if_fail (corner != NULL, 0.0);
+ g_return_val_if_fail (corner->class == &GTK_CSS_VALUE_CORNER, 0.0);
+
+ return _gtk_css_number_value_get (corner->x, one_hundred_percent);
+}
+
+double
+_gtk_css_corner_value_get_y (const GtkCssValue *corner,
+ double one_hundred_percent)
+{
+ g_return_val_if_fail (corner != NULL, 0.0);
+ g_return_val_if_fail (corner->class == &GTK_CSS_VALUE_CORNER, 0.0);
+
+ return _gtk_css_number_value_get (corner->y, one_hundred_percent);
+}
+
+GtkCssValue *
+_gtk_css_corner_value_compute (GtkCssValue *corner,
+ GtkStyleContext *context)
+{
+ GtkCssValue *x, *y;
+
+ g_return_val_if_fail (corner->class == &GTK_CSS_VALUE_CORNER, NULL);
+
+ x = _gtk_css_number_value_compute (corner->x, context);
+ y = _gtk_css_number_value_compute (corner->y, context);
+ if (x == corner->x && y == corner->y)
+ {
+ _gtk_css_value_unref (x);
+ _gtk_css_value_unref (y);
+ return _gtk_css_value_ref (corner);
+ }
+
+ return _gtk_css_corner_value_new (x, y);
+}
+