aboutsummaryrefslogtreecommitdiff
path: root/fiv-io.h
diff options
context:
space:
mode:
authorPřemysl Eric Janouch <p@janouch.name>2023-06-23 14:37:12 +0200
committerPřemysl Eric Janouch <p@janouch.name>2023-06-24 13:56:36 +0200
commitadd96b37a65fa40e87fd1f3eb9bead896fc2ae8f (patch)
tree78a7bfde8dbd776c1cb6002f33ddbd0ab1313648 /fiv-io.h
parentc2e8b65d0f77e7b93c4676df74bb0cf706e5665b (diff)
downloadfiv-add96b37a65fa40e87fd1f3eb9bead896fc2ae8f.tar.gz
fiv-add96b37a65fa40e87fd1f3eb9bead896fc2ae8f.tar.xz
fiv-add96b37a65fa40e87fd1f3eb9bead896fc2ae8f.zip
Stop abusing Cairo user data, part 1
This commit temporarily breaks multi-page images and animations.
Diffstat (limited to 'fiv-io.h')
-rw-r--r--fiv-io.h126
1 files changed, 90 insertions, 36 deletions
diff --git a/fiv-io.h b/fiv-io.h
index 582b907..9bddedc 100644
--- a/fiv-io.h
+++ b/fiv-io.h
@@ -33,12 +33,98 @@ void fiv_io_profile_free(FivIoProfile self);
// From libwebp, verified to exactly match [x * a / 255].
#define PREMULTIPLY8(a, x) (((uint32_t) (x) * (uint32_t) (a) * 32897U) >> 23)
+// --- Metadata ----------------------------------------------------------------
+
+// https://www.cipa.jp/std/documents/e/DC-008-2012_E.pdf Table 6
+typedef enum _FivIoOrientation {
+ FivIoOrientationUnknown = 0,
+ FivIoOrientation0 = 1,
+ FivIoOrientationMirror0 = 2,
+ FivIoOrientation180 = 3,
+ FivIoOrientationMirror180 = 4,
+ FivIoOrientationMirror270 = 5,
+ FivIoOrientation90 = 6,
+ FivIoOrientationMirror90 = 7,
+ FivIoOrientation270 = 8
+} FivIoOrientation;
+
+/// Returns a rendering matrix for a surface (user space to pattern space),
+/// and its target dimensions.
+cairo_matrix_t fiv_io_orientation_apply(cairo_surface_t *surface,
+ FivIoOrientation orientation, double *width, double *height);
+void fiv_io_orientation_dimensions(cairo_surface_t *surface,
+ FivIoOrientation orientation, double *width, double *height);
+
+/// Extracts the orientation field from Exif, if there's any.
+FivIoOrientation fiv_io_exif_orientation(const guint8 *exif, gsize len);
+
+/// Save metadata attached by this module in Exiv2 format.
+gboolean fiv_io_save_metadata(
+ cairo_surface_t *page, const char *path, GError **error);
+
// --- Loading -----------------------------------------------------------------
extern const char *fiv_io_supported_media_types[];
gchar **fiv_io_all_supported_media_types(void);
+typedef struct _FivIoRenderClosure {
+ /// The rendering is allowed to fail, returning NULL.
+ cairo_surface_t *(*render)(struct _FivIoRenderClosure *, double scale);
+ void (*destroy)(struct _FivIoRenderClosure *);
+} FivIoRenderClosure;
+
+typedef struct _FivIoImage {
+ uint8_t *data; ///< Raw image data
+ cairo_format_t format; ///< Data format
+ uint32_t width; ///< Width of the image in pixels
+ uint32_t stride; ///< Row stride in bytes
+ uint32_t height; ///< Height of the image in pixels
+
+ FivIoOrientation orientation; ///< Orientation to use for display
+
+ GBytes *exif; ///< Raw Exif/TIFF segment
+ GBytes *icc; ///< Raw ICC profile data
+ GBytes *xmp; ///< Raw XMP data
+ GBytes *thum; ///< WebP THUM chunk, for our thumbnails
+
+ /// A FivIoRenderClosure for parametrized re-rendering of vector formats.
+ /// This is attached at the page level.
+ FivIoRenderClosure *render;
+
+ /// The first frame of the next page, in a chain.
+ /// There is no wrap-around.
+ struct _FivIoImage *page_next;
+
+ /// The first frame of the previous page, in a chain.
+ /// There is no wrap-around. This is a weak pointer.
+ struct _FivIoImage *page_previous;
+
+ /// The next frame in a sequence, in a chain, pre-composited.
+ /// There is no wrap-around.
+ struct _FivIoImage *frame_next;
+
+ /// The previous frame in a sequence, in a chain, pre-composited.
+ /// This is a weak pointer that wraps around,
+ /// and needn't be present for static images.
+ struct _FivIoImage *frame_previous;
+
+ /// Frame duration in milliseconds.
+ int64_t frame_duration;
+
+ /// How many times to repeat the animation, or zero for +inf.
+ uint64_t loops;
+} FivIoImage;
+
+FivIoImage *fiv_io_image_ref(FivIoImage *image);
+void fiv_io_image_unref(FivIoImage *image);
+
+/// Return a new Cairo image surface referencing the same data as the image,
+/// eating the reference to it.
+cairo_surface_t *fiv_io_image_to_surface(FivIoImage *image);
+
+// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
+
// Userdata are typically attached to all Cairo surfaces in an animation.
/// GBytes with plain Exif/TIFF data.
@@ -51,6 +137,7 @@ extern cairo_user_data_key_t fiv_io_key_icc;
extern cairo_user_data_key_t fiv_io_key_xmp;
/// GBytes with a WebP's THUM chunk, used for our thumbnails.
extern cairo_user_data_key_t fiv_io_key_thum;
+
/// GHashTable with key-value pairs from PNG's tEXt, zTXt, iTXt chunks.
/// Currently only read by fiv_io_open_png_thumbnail().
extern cairo_user_data_key_t fiv_io_key_text;
@@ -74,11 +161,6 @@ extern cairo_user_data_key_t fiv_io_key_page_next;
/// There is no wrap-around. This is a weak pointer.
extern cairo_user_data_key_t fiv_io_key_page_previous;
-typedef struct _FivIoRenderClosure {
- /// The rendering is allowed to fail, returning NULL.
- cairo_surface_t *(*render)(struct _FivIoRenderClosure *, double scale);
-} FivIoRenderClosure;
-
/// A FivIoRenderClosure for parametrized re-rendering of vector formats.
/// This is attached at the page level.
/// The rendered image will not have this key.
@@ -93,9 +175,10 @@ typedef struct {
GPtrArray *warnings; ///< String vector for non-fatal errors
} FivIoOpenContext;
-cairo_surface_t *fiv_io_open(const FivIoOpenContext *ctx, GError **error);
-cairo_surface_t *fiv_io_open_from_data(
+FivIoImage *fiv_io_open(const FivIoOpenContext *ctx, GError **error);
+FivIoImage *fiv_io_open_from_data(
const char *data, size_t len, const FivIoOpenContext *ctx, GError **error);
+
cairo_surface_t *fiv_io_open_png_thumbnail(const char *path, GError **error);
// --- Thumbnail passing utilities ---------------------------------------------
@@ -118,32 +201,3 @@ unsigned char *fiv_io_encode_webp(
/// If no exact frame is specified, this potentially creates an animation.
gboolean fiv_io_save(cairo_surface_t *page, cairo_surface_t *frame,
FivIoProfile target, const char *path, GError **error);
-
-// --- Metadata ----------------------------------------------------------------
-
-// https://www.cipa.jp/std/documents/e/DC-008-2012_E.pdf Table 6
-typedef enum _FivIoOrientation {
- FivIoOrientationUnknown = 0,
- FivIoOrientation0 = 1,
- FivIoOrientationMirror0 = 2,
- FivIoOrientation180 = 3,
- FivIoOrientationMirror180 = 4,
- FivIoOrientationMirror270 = 5,
- FivIoOrientation90 = 6,
- FivIoOrientationMirror90 = 7,
- FivIoOrientation270 = 8
-} FivIoOrientation;
-
-/// Returns a rendering matrix for a surface (user space to pattern space),
-/// and its target dimensions.
-cairo_matrix_t fiv_io_orientation_apply(cairo_surface_t *surface,
- FivIoOrientation orientation, double *width, double *height);
-void fiv_io_orientation_dimensions(cairo_surface_t *surface,
- FivIoOrientation orientation, double *width, double *height);
-
-/// Extracts the orientation field from Exif, if there's any.
-FivIoOrientation fiv_io_exif_orientation(const guint8 *exif, gsize len);
-
-/// Save metadata attached by this module in Exiv2 format.
-gboolean fiv_io_save_metadata(
- cairo_surface_t *page, const char *path, GError **error);