diff options
Diffstat (limited to 'fiv-io.h')
-rw-r--r-- | fiv-io.h | 126 |
1 files changed, 90 insertions, 36 deletions
@@ -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); |