From b78010ccb1e6663ced40d212c3239b07b0065365 Mon Sep 17 00:00:00 2001 From: Přemysl Eric Janouch Date: Sat, 18 Dec 2021 06:38:30 +0100 Subject: Adopt shorter identifiers Also, slightly reformat the source code according to clang-format. --- fiv-io.h | 122 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 122 insertions(+) create mode 100644 fiv-io.h (limited to 'fiv-io.h') 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 +// +// 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 +#include +#include + +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); -- cgit v1.2.3-54-g00ecf