diff options
| author | Přemysl Eric Janouch <p@janouch.name> | 2021-12-18 06:38:30 +0100 | 
|---|---|---|
| committer | Přemysl Eric Janouch <p@janouch.name> | 2021-12-18 07:04:01 +0100 | 
| commit | b78010ccb1e6663ced40d212c3239b07b0065365 (patch) | |
| tree | 8cac8917563c4e3a87f690fd0c09d6391077f2a0 /fiv-io.h | |
| parent | c136c089fab3e5aff6ef8339f8aea93cf142d1c7 (diff) | |
| download | fiv-b78010ccb1e6663ced40d212c3239b07b0065365.tar.gz fiv-b78010ccb1e6663ced40d212c3239b07b0065365.tar.xz fiv-b78010ccb1e6663ced40d212c3239b07b0065365.zip  | |
Adopt shorter identifiers
Also, slightly reformat the source code according to clang-format.
Diffstat (limited to 'fiv-io.h')
| -rw-r--r-- | fiv-io.h | 122 | 
1 files changed, 122 insertions, 0 deletions
diff --git a/fiv-io.h b/fiv-io.h new file mode 100644 index 0000000..5fbe276 --- /dev/null +++ b/fiv-io.h @@ -0,0 +1,122 @@ +// +// fiv-io.h: image operations +// +// Copyright (c) 2021, Přemysl Eric Janouch <p@janouch.name> +// +// Permission to use, copy, modify, and/or distribute this software for any +// purpose with or without fee is hereby granted. +// +// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +// WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +// MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY +// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION +// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN +// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +// + +#pragma once + +#include <cairo.h> +#include <gio/gio.h> +#include <glib.h> + +extern const char *fiv_io_supported_media_types[]; + +char **fiv_io_all_supported_media_types(void); + +// Userdata are typically attached to all Cairo surfaces in an animation. + +/// GBytes with plain Exif/TIFF data. +extern cairo_user_data_key_t fiv_io_key_exif; +/// FivIoOrientation, as a uintptr_t. +extern cairo_user_data_key_t fiv_io_key_orientation; +/// GBytes with plain ICC profile data. +extern cairo_user_data_key_t fiv_io_key_icc; +/// GBytes with plain XMP data. +extern cairo_user_data_key_t fiv_io_key_xmp; + +/// The next frame in a sequence, as a surface, in a chain, pre-composited. +/// There is no wrap-around. +extern cairo_user_data_key_t fiv_io_key_frame_next; +/// The previous frame in a sequence, as a surface, in a chain, pre-composited. +/// This is a weak pointer that wraps around, and needn't be present +/// for static images. +extern cairo_user_data_key_t fiv_io_key_frame_previous; +/// Frame duration in milliseconds as an intptr_t. +extern cairo_user_data_key_t fiv_io_key_frame_duration; +/// How many times to repeat the animation, or zero for +inf, as a uintptr_t. +extern cairo_user_data_key_t fiv_io_key_loops; + +/// The first frame of the next page, as a surface, in a chain. +/// There is no wrap-around. +extern cairo_user_data_key_t fiv_io_key_page_next; +/// The first frame of the previous page, as a surface, in a chain. +/// There is no wrap-around. This is a weak pointer. +extern cairo_user_data_key_t fiv_io_key_page_previous; + +cairo_surface_t *fiv_io_open(const gchar *path, GError **error); +cairo_surface_t *fiv_io_open_from_data( +	const char *data, size_t len, const gchar *path, GError **error); + +int fiv_io_filecmp(GFile *f1, GFile *f2); + +// --- Export ------------------------------------------------------------------ + +/// Requires libwebp. +/// If no exact frame is specified, this potentially creates an animation. +gboolean fiv_io_save(cairo_surface_t *page, cairo_surface_t *frame, +	const gchar *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; + +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 gchar *path, GError **error); + +// --- Thumbnails -------------------------------------------------------------- + +// And this is how you avoid glib-mkenums. +typedef enum _FivIoThumbnailSize { +#define FIV_IO_THUMBNAIL_SIZES(XX) \ +	XX(SMALL,  128, "normal") \ +	XX(NORMAL, 256, "large") \ +	XX(LARGE,  512, "x-large") \ +	XX(HUGE,  1024, "xx-large") +#define XX(name, value, dir) FIV_IO_THUMBNAIL_SIZE_ ## name, +	FIV_IO_THUMBNAIL_SIZES(XX) +#undef XX +	FIV_IO_THUMBNAIL_SIZE_COUNT, + +	FIV_IO_THUMBNAIL_SIZE_MIN = 0, +	FIV_IO_THUMBNAIL_SIZE_MAX = FIV_IO_THUMBNAIL_SIZE_COUNT - 1 +} FivIoThumbnailSize; + +GType fiv_io_thumbnail_size_get_type(void) G_GNUC_CONST; +#define FIV_TYPE_IO_THUMBNAIL_SIZE (fiv_io_thumbnail_size_get_type()) + +typedef struct _FivIoThumbnailSizeInfo { +	int size;                           ///< Nominal size in pixels +	const char *thumbnail_spec_name;    ///< thumbnail-spec directory name +} FivIoThumbnailSizeInfo; + +extern FivIoThumbnailSizeInfo +	fiv_io_thumbnail_sizes[FIV_IO_THUMBNAIL_SIZE_COUNT]; + +cairo_surface_t *fiv_io_lookup_thumbnail( +	GFile *target, FivIoThumbnailSize size);  | 
