Improve librsvg integration

Let it load external <image>s and not rescale images.
This commit is contained in:
Přemysl Eric Janouch 2021-11-10 00:45:36 +01:00
parent 1c5cc50939
commit 7ef4a06def
Signed by: p
GPG Key ID: A0420B94F92B9493
2 changed files with 12 additions and 7 deletions

View File

@ -400,10 +400,14 @@ open_libraw(const gchar *data, gsize len, GError **error)
// FIXME: librsvg rasterizes filters, so this method isn't fully appropriate. // FIXME: librsvg rasterizes filters, so this method isn't fully appropriate.
static cairo_surface_t * static cairo_surface_t *
open_librsvg(const gchar *data, gsize len, GError **error) open_librsvg(const gchar *data, gsize len, const gchar *path, GError **error)
{ {
RsvgHandle *handle = GFile *base_file = g_file_new_for_path(path);
rsvg_handle_new_from_data((const guint8 *) data, len, error); GInputStream *is = g_memory_input_stream_new_from_data(data, len, NULL);
RsvgHandle *handle = rsvg_handle_new_from_stream_sync(is, base_file,
RSVG_HANDLE_FLAG_KEEP_IMAGE_DATA, NULL, error);
g_object_unref(base_file);
g_object_unref(is);
if (!handle) if (!handle)
return NULL; return NULL;
@ -481,13 +485,14 @@ fastiv_io_open(const gchar *path, GError **error)
if (!g_file_get_contents(path, &data, &len, error)) if (!g_file_get_contents(path, &data, &len, error))
return NULL; return NULL;
cairo_surface_t *surface = fastiv_io_open_from_data(data, len, error); cairo_surface_t *surface = fastiv_io_open_from_data(data, len, path, error);
free(data); free(data);
return surface; return surface;
} }
cairo_surface_t * cairo_surface_t *
fastiv_io_open_from_data(const char *data, size_t len, GError **error) fastiv_io_open_from_data(const char *data, size_t len, const gchar *path,
GError **error)
{ {
wuffs_base__slice_u8 prefix = wuffs_base__slice_u8 prefix =
wuffs_base__make_slice_u8((uint8_t *) data, len); wuffs_base__make_slice_u8((uint8_t *) data, len);
@ -524,7 +529,7 @@ fastiv_io_open_from_data(const char *data, size_t len, GError **error)
g_clear_error(error); g_clear_error(error);
#endif // HAVE_LIBRAW --------------------------------------------------------- #endif // HAVE_LIBRAW ---------------------------------------------------------
#ifdef HAVE_LIBRSVG // -------------------------------------------------------- #ifdef HAVE_LIBRSVG // --------------------------------------------------------
if ((surface = open_librsvg(data, len, error))) if ((surface = open_librsvg(data, len, path, error)))
break; break;
// XXX: It doesn't look like librsvg can return sensible errors. // XXX: It doesn't look like librsvg can return sensible errors.

View File

@ -24,5 +24,5 @@ extern const char *fastiv_io_supported_media_types[];
cairo_surface_t *fastiv_io_open(const gchar *path, GError **error); cairo_surface_t *fastiv_io_open(const gchar *path, GError **error);
cairo_surface_t *fastiv_io_open_from_data( cairo_surface_t *fastiv_io_open_from_data(
const char *data, size_t len, GError **error); const char *data, size_t len, const gchar *path, GError **error);
cairo_surface_t *fastiv_io_lookup_thumbnail(const gchar *target); cairo_surface_t *fastiv_io_lookup_thumbnail(const gchar *target);