parse_texture (GtkCssParser *parser,
gpointer out_data)
{
- GFile *file;
GdkTexture *texture;
GError *error = NULL;
GtkCssLocation start_location;
+ char *url, *scheme;
start_location = *gtk_css_parser_get_start_location (parser);
- file = gtk_css_parser_consume_url (parser);
- if (file == NULL)
+ url = gtk_css_parser_consume_url (parser);
+ if (url == NULL)
return FALSE;
- if (g_file_has_uri_scheme (file, "data"))
+ scheme = g_uri_parse_scheme (url);
+ if (scheme && g_ascii_strcasecmp (scheme, "data") == 0)
{
GInputStream *stream;
- char *uri;
GdkPixbuf *pixbuf;
GBytes *bytes;
- uri = g_file_get_uri (file);
texture = NULL;
- bytes = gtk_css_data_url_parse (uri, NULL, &error);
+ bytes = gtk_css_data_url_parse (url, NULL, &error);
if (bytes)
{
stream = g_memory_input_stream_new_from_bytes (bytes);
g_object_unref (pixbuf);
}
}
-
- g_free (uri);
}
else
{
+ GFile *file;
+
+ file = gtk_css_parser_resolve_url (parser, url);
texture = gdk_texture_new_from_file (file, &error);
+ g_object_unref (file);
}
- g_object_unref (file);
+
+ g_free (scheme);
+ g_free (url);
if (texture == NULL)
{
*
* Returns: (nullable) (transfer full): the resulting URL or %NULL on error
**/
-GFile *
+char *
gtk_css_parser_consume_url (GtkCssParser *self)
{
const GtkCssToken *token;
- GFile *result;
char *url;
token = gtk_css_parser_get_token (self);
return NULL;
}
- result = gtk_css_parser_resolve_url (self, url);
- if (result == NULL)
- {
- gtk_css_parser_error_import (self, "Could not resolve \"%s\" to a valid URL", url);
- g_free (url);
- return NULL;
- }
- g_free (url);
-
- return result;
+ return url;
}
gboolean
char * gtk_css_parser_consume_ident (GtkCssParser *self) G_GNUC_WARN_UNUSED_RESULT;
char * gtk_css_parser_consume_string (GtkCssParser *self) G_GNUC_WARN_UNUSED_RESULT;
-GFile * gtk_css_parser_consume_url (GtkCssParser *self) G_GNUC_WARN_UNUSED_RESULT;
+char * gtk_css_parser_consume_url (GtkCssParser *self) G_GNUC_WARN_UNUSED_RESULT;
gboolean gtk_css_parser_consume_number (GtkCssParser *self,
double *number);
gboolean gtk_css_parser_consume_integer (GtkCssParser *self,
switch (arg)
{
case 0:
- self->file = gtk_css_parser_consume_url (parser);
- if (self->file == NULL)
- return 0;
- return 1;
+ {
+ char *url = gtk_css_parser_consume_url (parser);
+ if (url == NULL)
+ return 0;
+ self->file = gtk_css_parser_resolve_url (parser, url);
+ g_free (url);
+ if (self->file == NULL)
+ return 0;
+ return 1;
+ }
case 1:
self->palette = gtk_css_palette_value_parse (parser);
g_free (resource_path);
g_free (uri);
}
- else if (g_file_has_uri_scheme (url->file, "data"))
- {
- GInputStream *stream;
- char *uri;
- GdkPixbuf *pixbuf;
- GBytes *bytes;
-
- uri = g_file_get_uri (url->file);
- texture = NULL;
-
- bytes = gtk_css_data_url_parse (uri, NULL, &local_error);
- if (bytes)
- {
- stream = g_memory_input_stream_new_from_bytes (bytes);
- pixbuf = gdk_pixbuf_new_from_stream (stream, NULL, &local_error);
- g_object_unref (stream);
- if (pixbuf != NULL)
- {
- texture = gdk_texture_new_for_pixbuf (pixbuf);
- g_object_unref (pixbuf);
- }
- }
-
- g_free (uri);
- }
else
{
texture = gdk_texture_new_from_file (url->file, &local_error);
gtk_css_image_url_parse (GtkCssImage *image,
GtkCssParser *parser)
{
- GtkCssImageUrl *url = GTK_CSS_IMAGE_URL (image);
+ GtkCssImageUrl *self = GTK_CSS_IMAGE_URL (image);
+ char *url, *scheme;
- url->file = gtk_css_parser_consume_url (parser);
- if (url->file == NULL)
+ url = gtk_css_parser_consume_url (parser);
+ if (url == NULL)
return FALSE;
+ scheme = g_uri_parse_scheme (url);
+ if (scheme && g_ascii_strcasecmp (scheme, "data") == 0)
+ {
+ GInputStream *stream;
+ GdkPixbuf *pixbuf;
+ GBytes *bytes;
+ GError *error = NULL;
+
+ bytes = gtk_css_data_url_parse (url, NULL, &error);
+ if (bytes)
+ {
+ stream = g_memory_input_stream_new_from_bytes (bytes);
+ pixbuf = gdk_pixbuf_new_from_stream (stream, NULL, &error);
+ g_object_unref (stream);
+ if (pixbuf == NULL)
+ {
+ gtk_css_parser_emit_error (parser,
+ gtk_css_parser_get_start_location (parser),
+ gtk_css_parser_get_end_location (parser),
+ error);
+ g_clear_error (&error);
+ }
+ else
+ {
+ GdkTexture *texture = gdk_texture_new_for_pixbuf (pixbuf);
+ self->loaded_image = gtk_css_image_paintable_new (GDK_PAINTABLE (texture), GDK_PAINTABLE (texture));
+ g_object_unref (texture);
+ g_object_unref (pixbuf);
+ }
+ }
+ }
+ else
+ {
+ self->file = gtk_css_parser_resolve_url (parser, url);
+ }
+
+ g_free (url);
+ g_free (scheme);
+
return TRUE;
}
}
else
{
- file = gtk_css_parser_consume_url (scanner->parser);
+ char *url = gtk_css_parser_consume_url (scanner->parser);
+ if (url)
+ {
+ file = gtk_css_parser_resolve_url (scanner->parser, url);
+ g_free (url);
+ }
+ else
+ file = NULL;
}
if (file == NULL)