aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPřemysl Eric Janouch <p@janouch.name>2021-11-26 00:46:00 +0100
committerPřemysl Eric Janouch <p@janouch.name>2021-11-26 00:46:19 +0100
commita5f64b1a65a60241d9529b26d3fea6ab16baddf4 (patch)
tree3f7c111a62bae202abd8c6b3d16f7f9e64416763
parentf151fcb72ba587840595bb755d24b89f8bfb937b (diff)
downloadfiv-a5f64b1a65a60241d9529b26d3fea6ab16baddf4.tar.gz
fiv-a5f64b1a65a60241d9529b26d3fea6ab16baddf4.tar.xz
fiv-a5f64b1a65a60241d9529b26d3fea6ab16baddf4.zip
Extract ICC profiles from gdk-pixbuf
-rw-r--r--fastiv-io.c16
-rw-r--r--fastiv-io.h2
2 files changed, 17 insertions, 1 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;
}
diff --git a/fastiv-io.h b/fastiv-io.h
index aed235b..3aed342 100644
--- a/fastiv-io.h
+++ b/fastiv-io.h
@@ -37,7 +37,7 @@ extern cairo_user_data_key_t fastiv_io_key_icc;
extern cairo_user_data_key_t fastiv_io_key_frame_next;
/// Frame duration in milliseconds as an intptr_t.
extern cairo_user_data_key_t fastiv_io_key_frame_duration;
-/// How many times to repeat the animation, or zero for +inf, as an uintptr_t.
+/// How many times to repeat the animation, or zero for +inf, as a uintptr_t.
extern cairo_user_data_key_t fastiv_io_key_loops;
cairo_surface_t *fastiv_io_open(const gchar *path, GError **error);