diff options
author | Benjamin Otte <otte@redhat.com> | 2012-04-03 18:39:01 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2012-04-17 08:59:18 +0200 |
commit | edbc8e4f57b871ee151443fe867f6e347682fe8d (patch) | |
tree | ae72342aeecd43394de441a76e2db86893f4e68c /gtk/gtkcsscornervalue.c | |
parent | 05f2249d08384d27ceea1e44ee4034a973fabb0c (diff) | |
download | gtk+-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.c | 170 |
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, >K_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 == >K_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 == >K_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 == >K_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); +} + |