1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 2011 Red Hat, Inc.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library. If not, see <http://www.gnu.org/licenses/>.
20 #include "gtkcssrepeatvalueprivate.h"
22 #include "gtkcssnumbervalueprivate.h"
31 gtk_css_value_repeat_free (GtkCssValue *value)
33 g_slice_free (GtkCssValue, value);
37 gtk_css_value_repeat_compute (GtkCssValue *value,
39 GtkStyleContext *context,
40 GtkCssDependencies *dependencies)
42 return _gtk_css_value_ref (value);
46 gtk_css_value_repeat_equal (const GtkCssValue *repeat1,
47 const GtkCssValue *repeat2)
49 return repeat1->x == repeat2->x
50 && repeat1->y == repeat2->y;
54 gtk_css_value_repeat_transition (GtkCssValue *start,
63 gtk_css_value_background_repeat_print (const GtkCssValue *repeat,
66 static const char *names[] = {
73 if (repeat->x == repeat->y)
75 g_string_append (string, names[repeat->x]);
77 else if (repeat->x == GTK_CSS_REPEAT_STYLE_REPEAT &&
78 repeat->y == GTK_CSS_REPEAT_STYLE_NO_REPEAT)
80 g_string_append (string, "repeat-x");
82 else if (repeat->x == GTK_CSS_REPEAT_STYLE_NO_REPEAT &&
83 repeat->y == GTK_CSS_REPEAT_STYLE_REPEAT)
85 g_string_append (string, "repeat-y");
89 g_string_append (string, names[repeat->x]);
90 g_string_append_c (string, ' ');
91 g_string_append (string, names[repeat->y]);
96 gtk_css_value_border_repeat_print (const GtkCssValue *repeat,
99 static const char *names[] = {
106 g_string_append (string, names[repeat->x]);
107 if (repeat->x != repeat->y)
109 g_string_append_c (string, ' ');
110 g_string_append (string, names[repeat->y]);
114 static const GtkCssValueClass GTK_CSS_VALUE_BACKGROUND_REPEAT = {
115 gtk_css_value_repeat_free,
116 gtk_css_value_repeat_compute,
117 gtk_css_value_repeat_equal,
118 gtk_css_value_repeat_transition,
119 gtk_css_value_background_repeat_print
122 static const GtkCssValueClass GTK_CSS_VALUE_BORDER_REPEAT = {
123 gtk_css_value_repeat_free,
124 gtk_css_value_repeat_compute,
125 gtk_css_value_repeat_equal,
126 gtk_css_value_repeat_transition,
127 gtk_css_value_border_repeat_print
129 /* BACKGROUND REPEAT */
133 GtkCssValue values[4];
134 } background_repeat_values[4] = {
136 { { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_NO_REPEAT },
137 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_REPEAT },
138 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_ROUND },
139 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_SPACE }
142 { { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_NO_REPEAT },
143 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_REPEAT },
144 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_ROUND },
145 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_SPACE }
148 { { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_NO_REPEAT },
149 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_REPEAT },
150 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_ROUND },
151 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_SPACE }
154 { { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_NO_REPEAT },
155 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_REPEAT },
156 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_ROUND },
157 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_SPACE }
162 _gtk_css_background_repeat_value_new (GtkCssRepeatStyle x,
165 return _gtk_css_value_ref (&background_repeat_values[x].values[y]);
169 _gtk_css_background_repeat_style_try (GtkCssParser *parser,
170 GtkCssRepeatStyle *result)
174 for (i = 0; i < G_N_ELEMENTS (background_repeat_values); i++)
176 if (_gtk_css_parser_try (parser, background_repeat_values[i].name, TRUE))
187 _gtk_css_background_repeat_value_try_parse (GtkCssParser *parser)
189 GtkCssRepeatStyle x, y;
191 g_return_val_if_fail (parser != NULL, NULL);
193 if (_gtk_css_parser_try (parser, "repeat-x", TRUE))
194 return _gtk_css_background_repeat_value_new (GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_NO_REPEAT);
195 if (_gtk_css_parser_try (parser, "repeat-y", TRUE))
196 return _gtk_css_background_repeat_value_new (GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_REPEAT);
198 if (!_gtk_css_background_repeat_style_try (parser, &x))
201 if (!_gtk_css_background_repeat_style_try (parser, &y))
204 return _gtk_css_background_repeat_value_new (x, y);
208 _gtk_css_background_repeat_value_get_x (const GtkCssValue *repeat)
210 g_return_val_if_fail (repeat->class == >K_CSS_VALUE_BACKGROUND_REPEAT, GTK_CSS_REPEAT_STYLE_NO_REPEAT);
216 _gtk_css_background_repeat_value_get_y (const GtkCssValue *repeat)
218 g_return_val_if_fail (repeat->class == >K_CSS_VALUE_BACKGROUND_REPEAT, GTK_CSS_REPEAT_STYLE_NO_REPEAT);
223 /* BORDER IMAGE REPEAT */
227 GtkCssValue values[4];
228 } border_repeat_values[4] = {
230 { { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_STRETCH, GTK_CSS_REPEAT_STYLE_STRETCH },
231 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_STRETCH, GTK_CSS_REPEAT_STYLE_REPEAT },
232 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_STRETCH, GTK_CSS_REPEAT_STYLE_ROUND },
233 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_STRETCH, GTK_CSS_REPEAT_STYLE_SPACE }
236 { { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_STRETCH },
237 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_REPEAT },
238 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_ROUND },
239 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_SPACE }
242 { { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_STRETCH },
243 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_REPEAT },
244 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_ROUND },
245 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_SPACE }
248 { { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_STRETCH },
249 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_REPEAT },
250 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_ROUND },
251 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_SPACE }
256 _gtk_css_border_repeat_value_new (GtkCssRepeatStyle x,
259 return _gtk_css_value_ref (&border_repeat_values[x].values[y]);
263 _gtk_css_border_repeat_style_try (GtkCssParser *parser,
264 GtkCssRepeatStyle *result)
268 for (i = 0; i < G_N_ELEMENTS (border_repeat_values); i++)
270 if (_gtk_css_parser_try (parser, border_repeat_values[i].name, TRUE))
281 _gtk_css_border_repeat_value_try_parse (GtkCssParser *parser)
283 GtkCssRepeatStyle x, y;
285 g_return_val_if_fail (parser != NULL, NULL);
287 if (!_gtk_css_border_repeat_style_try (parser, &x))
290 if (!_gtk_css_border_repeat_style_try (parser, &y))
293 return _gtk_css_border_repeat_value_new (x, y);
297 _gtk_css_border_repeat_value_get_x (const GtkCssValue *repeat)
299 g_return_val_if_fail (repeat->class == >K_CSS_VALUE_BORDER_REPEAT, GTK_CSS_REPEAT_STYLE_STRETCH);
305 _gtk_css_border_repeat_value_get_y (const GtkCssValue *repeat)
307 g_return_val_if_fail (repeat->class == >K_CSS_VALUE_BORDER_REPEAT, GTK_CSS_REPEAT_STYLE_STRETCH);