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 GtkStyleProviderPrivate *provider,
40 GtkCssComputedValues *values,
41 GtkCssComputedValues *parent_values,
42 GtkCssDependencies *dependencies)
44 return _gtk_css_value_ref (value);
48 gtk_css_value_repeat_equal (const GtkCssValue *repeat1,
49 const GtkCssValue *repeat2)
51 return repeat1->x == repeat2->x
52 && repeat1->y == repeat2->y;
56 gtk_css_value_repeat_transition (GtkCssValue *start,
65 gtk_css_value_background_repeat_print (const GtkCssValue *repeat,
68 static const char *names[] = {
75 if (repeat->x == repeat->y)
77 g_string_append (string, names[repeat->x]);
79 else if (repeat->x == GTK_CSS_REPEAT_STYLE_REPEAT &&
80 repeat->y == GTK_CSS_REPEAT_STYLE_NO_REPEAT)
82 g_string_append (string, "repeat-x");
84 else if (repeat->x == GTK_CSS_REPEAT_STYLE_NO_REPEAT &&
85 repeat->y == GTK_CSS_REPEAT_STYLE_REPEAT)
87 g_string_append (string, "repeat-y");
91 g_string_append (string, names[repeat->x]);
92 g_string_append_c (string, ' ');
93 g_string_append (string, names[repeat->y]);
98 gtk_css_value_border_repeat_print (const GtkCssValue *repeat,
101 static const char *names[] = {
108 g_string_append (string, names[repeat->x]);
109 if (repeat->x != repeat->y)
111 g_string_append_c (string, ' ');
112 g_string_append (string, names[repeat->y]);
116 static const GtkCssValueClass GTK_CSS_VALUE_BACKGROUND_REPEAT = {
117 gtk_css_value_repeat_free,
118 gtk_css_value_repeat_compute,
119 gtk_css_value_repeat_equal,
120 gtk_css_value_repeat_transition,
121 gtk_css_value_background_repeat_print
124 static const GtkCssValueClass GTK_CSS_VALUE_BORDER_REPEAT = {
125 gtk_css_value_repeat_free,
126 gtk_css_value_repeat_compute,
127 gtk_css_value_repeat_equal,
128 gtk_css_value_repeat_transition,
129 gtk_css_value_border_repeat_print
131 /* BACKGROUND REPEAT */
135 GtkCssValue values[4];
136 } background_repeat_values[4] = {
138 { { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_NO_REPEAT },
139 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_REPEAT },
140 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_ROUND },
141 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_SPACE }
144 { { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_NO_REPEAT },
145 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_REPEAT },
146 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_ROUND },
147 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_SPACE }
150 { { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_NO_REPEAT },
151 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_REPEAT },
152 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_ROUND },
153 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_SPACE }
156 { { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_NO_REPEAT },
157 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_REPEAT },
158 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_ROUND },
159 { >K_CSS_VALUE_BACKGROUND_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_SPACE }
164 _gtk_css_background_repeat_value_new (GtkCssRepeatStyle x,
167 return _gtk_css_value_ref (&background_repeat_values[x].values[y]);
171 _gtk_css_background_repeat_style_try (GtkCssParser *parser,
172 GtkCssRepeatStyle *result)
176 for (i = 0; i < G_N_ELEMENTS (background_repeat_values); i++)
178 if (_gtk_css_parser_try (parser, background_repeat_values[i].name, TRUE))
189 _gtk_css_background_repeat_value_try_parse (GtkCssParser *parser)
191 GtkCssRepeatStyle x, y;
193 g_return_val_if_fail (parser != NULL, NULL);
195 if (_gtk_css_parser_try (parser, "repeat-x", TRUE))
196 return _gtk_css_background_repeat_value_new (GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_NO_REPEAT);
197 if (_gtk_css_parser_try (parser, "repeat-y", TRUE))
198 return _gtk_css_background_repeat_value_new (GTK_CSS_REPEAT_STYLE_NO_REPEAT, GTK_CSS_REPEAT_STYLE_REPEAT);
200 if (!_gtk_css_background_repeat_style_try (parser, &x))
203 if (!_gtk_css_background_repeat_style_try (parser, &y))
206 return _gtk_css_background_repeat_value_new (x, y);
210 _gtk_css_background_repeat_value_get_x (const GtkCssValue *repeat)
212 g_return_val_if_fail (repeat->class == >K_CSS_VALUE_BACKGROUND_REPEAT, GTK_CSS_REPEAT_STYLE_NO_REPEAT);
218 _gtk_css_background_repeat_value_get_y (const GtkCssValue *repeat)
220 g_return_val_if_fail (repeat->class == >K_CSS_VALUE_BACKGROUND_REPEAT, GTK_CSS_REPEAT_STYLE_NO_REPEAT);
225 /* BORDER IMAGE REPEAT */
229 GtkCssValue values[4];
230 } border_repeat_values[4] = {
232 { { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_STRETCH, GTK_CSS_REPEAT_STYLE_STRETCH },
233 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_STRETCH, GTK_CSS_REPEAT_STYLE_REPEAT },
234 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_STRETCH, GTK_CSS_REPEAT_STYLE_ROUND },
235 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_STRETCH, GTK_CSS_REPEAT_STYLE_SPACE }
238 { { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_STRETCH },
239 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_REPEAT },
240 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_ROUND },
241 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_REPEAT, GTK_CSS_REPEAT_STYLE_SPACE }
244 { { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_STRETCH },
245 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_REPEAT },
246 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_ROUND },
247 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_ROUND, GTK_CSS_REPEAT_STYLE_SPACE }
250 { { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_STRETCH },
251 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_REPEAT },
252 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_ROUND },
253 { >K_CSS_VALUE_BORDER_REPEAT, 1, GTK_CSS_REPEAT_STYLE_SPACE, GTK_CSS_REPEAT_STYLE_SPACE }
258 _gtk_css_border_repeat_value_new (GtkCssRepeatStyle x,
261 return _gtk_css_value_ref (&border_repeat_values[x].values[y]);
265 _gtk_css_border_repeat_style_try (GtkCssParser *parser,
266 GtkCssRepeatStyle *result)
270 for (i = 0; i < G_N_ELEMENTS (border_repeat_values); i++)
272 if (_gtk_css_parser_try (parser, border_repeat_values[i].name, TRUE))
283 _gtk_css_border_repeat_value_try_parse (GtkCssParser *parser)
285 GtkCssRepeatStyle x, y;
287 g_return_val_if_fail (parser != NULL, NULL);
289 if (!_gtk_css_border_repeat_style_try (parser, &x))
292 if (!_gtk_css_border_repeat_style_try (parser, &y))
295 return _gtk_css_border_repeat_value_new (x, y);
299 _gtk_css_border_repeat_value_get_x (const GtkCssValue *repeat)
301 g_return_val_if_fail (repeat->class == >K_CSS_VALUE_BORDER_REPEAT, GTK_CSS_REPEAT_STYLE_STRETCH);
307 _gtk_css_border_repeat_value_get_y (const GtkCssValue *repeat)
309 g_return_val_if_fail (repeat->class == >K_CSS_VALUE_BORDER_REPEAT, GTK_CSS_REPEAT_STYLE_STRETCH);