forked from AuroraMiddleware/gtk
cssimageradial: Use gtk_css_parser_consume_function()
This commit is contained in:
parent
b830bdca37
commit
1fd339c46f
@ -233,11 +233,41 @@ gtk_css_image_radial_snapshot (GtkCssImage *image,
|
|||||||
cairo_destroy (cr);
|
cairo_destroy (cr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static guint
|
||||||
gtk_css_image_radial_parse (GtkCssImage *image,
|
gtk_css_image_radial_parse_color_stop (GtkCssImageRadial *radial,
|
||||||
GtkCssParser *parser)
|
GtkCssParser *parser)
|
||||||
|
{
|
||||||
|
GtkCssImageRadialColorStop stop;
|
||||||
|
|
||||||
|
stop.color = _gtk_css_color_value_parse (parser);
|
||||||
|
if (stop.color == NULL)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
if (gtk_css_number_value_can_parse (parser))
|
||||||
|
{
|
||||||
|
stop.offset = _gtk_css_number_value_parse (parser,
|
||||||
|
GTK_CSS_PARSE_PERCENT
|
||||||
|
| GTK_CSS_PARSE_LENGTH);
|
||||||
|
if (stop.offset == NULL)
|
||||||
|
{
|
||||||
|
_gtk_css_value_unref (stop.color);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
stop.offset = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_array_append_val (radial->stops, stop);
|
||||||
|
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static guint
|
||||||
|
gtk_css_image_radial_parse_first_arg (GtkCssImageRadial *radial,
|
||||||
|
GtkCssParser *parser)
|
||||||
{
|
{
|
||||||
GtkCssImageRadial *radial = GTK_CSS_IMAGE_RADIAL (image);
|
|
||||||
gboolean has_shape = FALSE;
|
gboolean has_shape = FALSE;
|
||||||
gboolean has_size = FALSE;
|
gboolean has_size = FALSE;
|
||||||
gboolean found_one = FALSE;
|
gboolean found_one = FALSE;
|
||||||
@ -252,18 +282,9 @@ gtk_css_image_radial_parse (GtkCssImage *image,
|
|||||||
{ "farthest-corner", GTK_CSS_FARTHEST_CORNER }
|
{ "farthest-corner", GTK_CSS_FARTHEST_CORNER }
|
||||||
};
|
};
|
||||||
|
|
||||||
if (_gtk_css_parser_try (parser, "repeating-radial-gradient(", TRUE))
|
found_one = FALSE;
|
||||||
radial->repeating = TRUE;
|
|
||||||
else if (_gtk_css_parser_try (parser, "radial-gradient(", TRUE))
|
|
||||||
radial->repeating = FALSE;
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_gtk_css_parser_error (parser, "Not a radial gradient");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
found_one = FALSE;
|
|
||||||
if (!has_shape && gtk_css_parser_try_ident (parser, "circle"))
|
if (!has_shape && gtk_css_parser_try_ident (parser, "circle"))
|
||||||
{
|
{
|
||||||
radial->circle = TRUE;
|
radial->circle = TRUE;
|
||||||
@ -278,7 +299,7 @@ gtk_css_image_radial_parse (GtkCssImage *image,
|
|||||||
{
|
{
|
||||||
for (i = 0; i < G_N_ELEMENTS (names); i++)
|
for (i = 0; i < G_N_ELEMENTS (names); i++)
|
||||||
{
|
{
|
||||||
if (_gtk_css_parser_try (parser, names[i].name, TRUE))
|
if (gtk_css_parser_try_ident (parser, names[i].name))
|
||||||
{
|
{
|
||||||
found_one = has_size = TRUE;
|
found_one = has_size = TRUE;
|
||||||
radial->size = names[i].value;
|
radial->size = names[i].value;
|
||||||
@ -286,40 +307,39 @@ gtk_css_image_radial_parse (GtkCssImage *image,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!has_size)
|
if (!has_size && gtk_css_number_value_can_parse (parser))
|
||||||
{
|
{
|
||||||
|
radial->sizes[0] = _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_LENGTH | GTK_CSS_PARSE_PERCENT);
|
||||||
|
if (radial->sizes[0] == NULL)
|
||||||
|
return 0;
|
||||||
if (gtk_css_number_value_can_parse (parser))
|
if (gtk_css_number_value_can_parse (parser))
|
||||||
radial->sizes[0] = _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_LENGTH | GTK_CSS_PARSE_PERCENT);
|
{
|
||||||
if (gtk_css_number_value_can_parse (parser))
|
radial->sizes[1] = _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_LENGTH | GTK_CSS_PARSE_PERCENT);
|
||||||
radial->sizes[1] = _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_LENGTH | GTK_CSS_PARSE_PERCENT);
|
if (radial->sizes[1] == NULL)
|
||||||
found_one = has_size = radial->sizes[0] != NULL;
|
return 0;
|
||||||
|
}
|
||||||
|
found_one = has_size = TRUE;
|
||||||
}
|
}
|
||||||
|
if (!has_size)
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
} while (!(has_shape && has_size));
|
||||||
|
|
||||||
} while (found_one && !(has_shape && has_size));
|
if (gtk_css_parser_try_ident (parser, "at"))
|
||||||
|
|
||||||
if (_gtk_css_parser_try (parser, "at", TRUE))
|
|
||||||
{
|
{
|
||||||
radial->position = _gtk_css_position_value_parse (parser);
|
radial->position = _gtk_css_position_value_parse (parser);
|
||||||
if (!radial->position)
|
if (!radial->position)
|
||||||
return FALSE;
|
return 0;
|
||||||
if (!_gtk_css_parser_try (parser, ",", TRUE))
|
found_one = TRUE;
|
||||||
{
|
|
||||||
_gtk_css_parser_error (parser, "Expected a comma here");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
radial->position = _gtk_css_position_value_new (_gtk_css_number_value_new (50, GTK_CSS_PERCENT),
|
radial->position = _gtk_css_position_value_new (_gtk_css_number_value_new (50, GTK_CSS_PERCENT),
|
||||||
_gtk_css_number_value_new (50, GTK_CSS_PERCENT));
|
_gtk_css_number_value_new (50, GTK_CSS_PERCENT));
|
||||||
|
|
||||||
if ((has_shape || has_size) &&
|
|
||||||
!_gtk_css_parser_try (parser, ",", TRUE))
|
|
||||||
{
|
|
||||||
_gtk_css_parser_error (parser, "Expected a comma here");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!has_size)
|
if (!has_size)
|
||||||
@ -340,13 +360,13 @@ gtk_css_image_radial_parse (GtkCssImage *image,
|
|||||||
if (radial->sizes[0] && radial->sizes[1])
|
if (radial->sizes[0] && radial->sizes[1])
|
||||||
{
|
{
|
||||||
_gtk_css_parser_error (parser, "Circular gradient can only have one size");
|
_gtk_css_parser_error (parser, "Circular gradient can only have one size");
|
||||||
return FALSE;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (radial->sizes[0] && gtk_css_number_value_has_percent (radial->sizes[0]))
|
if (radial->sizes[0] && gtk_css_number_value_has_percent (radial->sizes[0]))
|
||||||
{
|
{
|
||||||
_gtk_css_parser_error (parser, "Circular gradient cannot have percentage as size");
|
_gtk_css_parser_error (parser, "Circular gradient cannot have percentage as size");
|
||||||
return FALSE;
|
return 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -356,47 +376,46 @@ gtk_css_image_radial_parse (GtkCssImage *image,
|
|||||||
radial->sizes[1] = _gtk_css_value_ref (radial->sizes[0]);
|
radial->sizes[1] = _gtk_css_value_ref (radial->sizes[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
do {
|
if (found_one)
|
||||||
GtkCssImageRadialColorStop stop;
|
return 1;
|
||||||
|
|
||||||
stop.color = _gtk_css_color_value_parse (parser);
|
if (!gtk_css_image_radial_parse_color_stop (radial, parser))
|
||||||
if (stop.color == NULL)
|
return 0;
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
if (gtk_css_number_value_can_parse (parser))
|
return 2;
|
||||||
{
|
}
|
||||||
stop.offset = _gtk_css_number_value_parse (parser,
|
|
||||||
GTK_CSS_PARSE_PERCENT
|
|
||||||
| GTK_CSS_PARSE_LENGTH);
|
|
||||||
if (stop.offset == NULL)
|
|
||||||
{
|
|
||||||
_gtk_css_value_unref (stop.color);
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
stop.offset = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
g_array_append_val (radial->stops, stop);
|
static guint
|
||||||
|
gtk_css_image_radial_parse_arg (GtkCssParser *parser,
|
||||||
|
guint arg,
|
||||||
|
gpointer data)
|
||||||
|
{
|
||||||
|
GtkCssImageRadial *self = data;
|
||||||
|
|
||||||
} while (_gtk_css_parser_try (parser, ",", TRUE));
|
if (arg == 0)
|
||||||
|
return gtk_css_image_radial_parse_first_arg (self, parser);
|
||||||
|
else
|
||||||
|
return gtk_css_image_radial_parse_color_stop (self, parser);
|
||||||
|
|
||||||
if (radial->stops->len < 2)
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gtk_css_image_radial_parse (GtkCssImage *image,
|
||||||
|
GtkCssParser *parser)
|
||||||
|
{
|
||||||
|
GtkCssImageRadial *self = GTK_CSS_IMAGE_RADIAL (image);
|
||||||
|
|
||||||
|
if (gtk_css_parser_has_function (parser, "repeating-radial-gradient"))
|
||||||
|
self->repeating = TRUE;
|
||||||
|
else if (gtk_css_parser_has_function (parser, "radial-gradient"))
|
||||||
|
self->repeating = FALSE;
|
||||||
|
else
|
||||||
{
|
{
|
||||||
_gtk_css_parser_error (parser, "%s() needs at least 2 color stops.",
|
_gtk_css_parser_error (parser, "Not a radial gradient");
|
||||||
radial->repeating ? "repeating-radial-gradient" : "radial-gradient");
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_gtk_css_parser_try (parser, ")", TRUE))
|
return gtk_css_parser_consume_function (parser, 3, G_MAXUINT, gtk_css_image_radial_parse_arg, self);
|
||||||
{
|
|
||||||
_gtk_css_parser_error (parser, "Missing closing bracket at end of radial gradient");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TRUE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
Reference in New Issue
Block a user