diff options
author | Přemysl Eric Janouch <p@janouch.name> | 2021-11-26 00:46:00 +0100 |
---|---|---|
committer | Přemysl Eric Janouch <p@janouch.name> | 2021-11-26 00:46:19 +0100 |
commit | a5f64b1a65a60241d9529b26d3fea6ab16baddf4 (patch) | |
tree | 3f7c111a62bae202abd8c6b3d16f7f9e64416763 /fastiv-io.c | |
parent | f151fcb72ba587840595bb755d24b89f8bfb937b (diff) | |
download | fiv-a5f64b1a65a60241d9529b26d3fea6ab16baddf4.tar.gz fiv-a5f64b1a65a60241d9529b26d3fea6ab16baddf4.tar.xz fiv-a5f64b1a65a60241d9529b26d3fea6ab16baddf4.zip |
Extract ICC profiles from gdk-pixbuf
Diffstat (limited to 'fastiv-io.c')
-rw-r--r-- | fastiv-io.c | 16 |
1 files changed, 16 insertions, 0 deletions
diff --git a/fastiv-io.c b/fastiv-io.c index c6f835e..f76e817 100644 --- a/fastiv-io.c +++ b/fastiv-io.c @@ -983,6 +983,8 @@ open_xcursor(const gchar *data, gsize len, GError **error) static cairo_surface_t * open_gdkpixbuf(const gchar *data, gsize len, GError **error) { + // gdk-pixbuf controls the playback itself, there is no reliable method of + // extracting individual frames (due to loops). GInputStream *is = g_memory_input_stream_new_from_data(data, len, NULL); GdkPixbuf *pixbuf = gdk_pixbuf_new_from_stream(is, NULL, error); g_object_unref(is); @@ -991,6 +993,20 @@ open_gdkpixbuf(const gchar *data, gsize len, GError **error) cairo_surface_t *surface = gdk_cairo_surface_create_from_pixbuf(pixbuf, 1, NULL); + + // TODO(p): Also pass the pre-decoded Exif "orientation" option, + // which is an ASCII digit from 1 to 8. + const char *icc_profile = gdk_pixbuf_get_option(pixbuf, "icc-profile"); + if (icc_profile) { + gsize out_len = 0; + guchar *raw = g_base64_decode(icc_profile, &out_len); + if (raw) { + cairo_surface_set_user_data(surface, &fastiv_io_key_icc, + g_bytes_new_take(raw, out_len), + (cairo_destroy_func_t) g_bytes_unref); + } + } + g_object_unref(pixbuf); return surface; } |