diff options
| author | Přemysl Eric Janouch <p@janouch.name> | 2023-06-23 14:37:12 +0200 | 
|---|---|---|
| committer | Přemysl Eric Janouch <p@janouch.name> | 2023-06-24 13:56:36 +0200 | 
| commit | add96b37a65fa40e87fd1f3eb9bead896fc2ae8f (patch) | |
| tree | 78a7bfde8dbd776c1cb6002f33ddbd0ab1313648 /fiv-io.h | |
| parent | c2e8b65d0f77e7b93c4676df74bb0cf706e5665b (diff) | |
| download | fiv-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.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);  | 
