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_equal (const GtkCssValue *repeat1,
38 const GtkCssValue *repeat2)
40 return repeat1->x == repeat2->x
41 && repeat1->y == repeat2->y;
45 gtk_css_value_repeat_transition (GtkCssValue *start,
53 gtk_css_value_background_repeat_print (const GtkCssValue *repeat,
56 static const char *names[] = {
63 if (repeat->x == repeat->y)
65 g_string_append (string, names[repeat->x]);
67 else if (repeat->x == GTK_CSS_REPEAT_STYLE_REPEAT &&
68 repeat->y == GTK_CSS_REPEAT_STYLE_NO_REPEAT)
70 g_string_append (string, "repeat-x");
72 else if (repeat->x == GTK_CSS_REPEAT_STYLE_NO_REPEAT &&
73 repeat->y == GTK_CSS_REPEAT_STYLE_REPEAT)
75 g_string_append (string, "repeat-y");
79 g_string_append (string, names[repeat->x]);
80 g_string_append_c (string, ' ');
81 g_string_append (string, names[repeat->y]);
86 gtk_css_value_border_repeat_print (const GtkCssValue *repeat,
89 static const char *names[] = {
96 g_string_append (string, names[repeat->x]);
97 if (repeat->x != repeat->y)
99 g_string_append_c (string, ' ');
100 g_string_append (string, names[repeat->y]);
104 static const GtkCssValueClass GTK_CSS_VALUE_BACKGROUND_REPEAT = {
105 gtk_css_value_repeat_free,
106 gtk_css_value_repeat_equal,
107 gtk_css_value_repeat_transition,
108 gtk_css_value_background_repeat_print
111 static const GtkCssValueClass GTK_CSS_VALUE_BORDER_REPEAT = {
112 gtk_css_value_repeat_free,
113 gtk_css_value_repeat_equal,
114 gtk_css_value_repeat_transition,
115 gtk_css_value_border_repeat_print
117 /* BACKGROUND REPEAT */
121 GtkCssValue values[4];
122 } background_repeat_values[4] = {
124 { { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_NO_REPEAT },
125 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_REPEAT },
126 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_ROUND },
127 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_SPACE }
130 { { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_NO_REPEAT },
131 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_REPEAT },
132 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_ROUND },
133 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_SPACE }
136 { { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_NO_REPEAT },
137 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_REPEAT },
138 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_ROUND },
139 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_SPACE }
142 { { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_NO_REPEAT },
143 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_REPEAT },
144 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_ROUND },
145 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_SPACE }
150 _gtk_css_background_repeat_value_new (GtkCssRepeatStyle x,
153 return _gtk_css_value_ref (&background_repeat_values[x].values[y]);
157 _gtk_css_background_repeat_style_try (GtkCssParser *parser,
158 GtkCssRepeatStyle *result)
162 for (i = 0; i < G_N_ELEMENTS (background_repeat_values); i++)
164 if (_gtk_css_parser_try (parser, background_repeat_values[i].name, TRUE))
175 _gtk_css_background_repeat_value_try_parse (GtkCssParser *parser)
177 GtkCssRepeatStyle x, y;
179 g_return_val_if_fail (parser != NULL, NULL);
181 if (_gtk_css_parser_try (parser, "repeat-x", TRUE))
182 return _gtk_css_background_repeat_value_new (GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_NO_REPEAT);
183 if (_gtk_css_parser_try (parser, "repeat-y", TRUE))
184 return _gtk_css_background_repeat_value_new (GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_REPEAT);
186 if (!_gtk_css_background_repeat_style_try (parser, &x))
189 if (!_gtk_css_background_repeat_style_try (parser, &y))
192 return _gtk_css_background_repeat_value_new (x, y);
196 _gtk_css_background_repeat_value_get_x (const GtkCssValue *repeat)
198 g_return_val_if_fail (repeat->class == >K_CSS_VALUE_BACKGROUND_REPEAT, GTK_CSS_REPEAT_STYLE_NO_REPEAT);
204 _gtk_css_background_repeat_value_get_y (const GtkCssValue *repeat)
206 g_return_val_if_fail (repeat->class == >K_CSS_VALUE_BACKGROUND_REPEAT, GTK_CSS_REPEAT_STYLE_NO_REPEAT);
211 /* BORDER IMAGE REPEAT */
215 GtkCssValue values[4];
216 } border_repeat_values[4] = {
218 { { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_STRETCH, GTK_CSS_REPEAT_STYLE_STRETCH },
219 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_STRETCH, GTK_CSS_REPEAT_STYLE_REPEAT },
220 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_STRETCH, GTK_CSS_REPEAT_STYLE_ROUND },
221 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_STRETCH, GTK_CSS_REPEAT_STYLE_SPACE }
224 { { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_STRETCH },
225 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_REPEAT },
226 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_ROUND },
227 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_SPACE }
230 { { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_STRETCH },
231 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_REPEAT },
232 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_ROUND },
233 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_SPACE }
236 { { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_STRETCH },
237 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_REPEAT },
238 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_ROUND },
239 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_SPACE }
244 _gtk_css_border_repeat_value_new (GtkCssRepeatStyle x,
247 return _gtk_css_value_ref (&border_repeat_values[x].values[y]);
251 _gtk_css_border_repeat_style_try (GtkCssParser *parser,
252 GtkCssRepeatStyle *result)
256 for (i = 0; i < G_N_ELEMENTS (border_repeat_values); i++)
258 if (_gtk_css_parser_try (parser, border_repeat_values[i].name, TRUE))
269 _gtk_css_border_repeat_value_try_parse (GtkCssParser *parser)
271 GtkCssRepeatStyle x, y;
273 g_return_val_if_fail (parser != NULL, NULL);
275 if (!_gtk_css_border_repeat_style_try (parser, &x))
278 if (!_gtk_css_border_repeat_style_try (parser, &y))
281 return _gtk_css_border_repeat_value_new (x, y);
285 _gtk_css_border_repeat_value_get_x (const GtkCssValue *repeat)
287 g_return_val_if_fail (repeat->class == >K_CSS_VALUE_BORDER_REPEAT, GTK_CSS_REPEAT_STYLE_STRETCH);
293 _gtk_css_border_repeat_value_get_y (const GtkCssValue *repeat)
295 g_return_val_if_fail (repeat->class == >K_CSS_VALUE_BORDER_REPEAT, GTK_CSS_REPEAT_STYLE_STRETCH);