aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPřemysl Eric Janouch <p@janouch.name>2022-06-06 15:22:23 +0200
committerPřemysl Eric Janouch <p@janouch.name>2022-06-08 02:51:54 +0200
commit930744e1652c9ec5ad6447c0a2a1e486cae9a2a9 (patch)
tree4353caf33e417faf30ab7d6eb2ee5330d6a4f835
parent4ca8825e02ff8959e3790df2d7818ecfb4134963 (diff)
downloadfiv-930744e1652c9ec5ad6447c0a2a1e486cae9a2a9.tar.gz
fiv-930744e1652c9ec5ad6447c0a2a1e486cae9a2a9.tar.xz
fiv-930744e1652c9ec5ad6447c0a2a1e486cae9a2a9.zip
Add flags to the serialization protocol
It still needs no versioning, as it's not really used by anyone. An alternative method of passing a "low-quality" flag would be perusing fiv_thumbnail_key_lq from fiv-thumbnail.c, which would create a circular dependency, unless fiv_io_{de,}serialize*() were moved to fiv-thumbnail.c.
-rw-r--r--fiv-io.c7
-rw-r--r--fiv-io.h6
-rw-r--r--fiv-thumbnail.h4
3 files changed, 11 insertions, 6 deletions
diff --git a/fiv-io.c b/fiv-io.c
index b0766b9..916715b 100644
--- a/fiv-io.c
+++ b/fiv-io.c
@@ -2891,11 +2891,12 @@ fiv_io_open_from_data(
// --- Thumbnail passing utilities ---------------------------------------------
typedef struct {
+ guint64 user_data;
int width, height, stride, format;
} CairoHeader;
void
-fiv_io_serialize_to_stdout(cairo_surface_t *surface)
+fiv_io_serialize_to_stdout(cairo_surface_t *surface, guint64 user_data)
{
if (!surface || cairo_surface_get_type(surface) != CAIRO_SURFACE_TYPE_IMAGE)
return;
@@ -2907,6 +2908,7 @@ fiv_io_serialize_to_stdout(cairo_surface_t *surface)
#endif
CairoHeader h = {
+ .user_data = user_data,
.width = cairo_image_surface_get_width(surface),
.height = cairo_image_surface_get_height(surface),
.stride = cairo_image_surface_get_stride(surface),
@@ -2921,7 +2923,7 @@ fiv_io_serialize_to_stdout(cairo_surface_t *surface)
}
cairo_surface_t *
-fiv_io_deserialize(GBytes *bytes)
+fiv_io_deserialize(GBytes *bytes, guint64 *user_data)
{
CairoHeader h = {};
GByteArray *array = g_bytes_unref_to_array(bytes);
@@ -2949,6 +2951,7 @@ fiv_io_deserialize(GBytes *bytes)
static cairo_user_data_key_t key;
cairo_surface_set_user_data(
surface, &key, array, (cairo_destroy_func_t) g_byte_array_unref);
+ *user_data = h.user_data;
return surface;
}
diff --git a/fiv-io.h b/fiv-io.h
index 0c23799..dccdd31 100644
--- a/fiv-io.h
+++ b/fiv-io.h
@@ -102,8 +102,10 @@ cairo_surface_t *fiv_io_open_png_thumbnail(const char *path, GError **error);
// --- Thumbnail passing utilities ---------------------------------------------
-void fiv_io_serialize_to_stdout(cairo_surface_t *surface);
-cairo_surface_t *fiv_io_deserialize(GBytes *bytes);
+enum { FIV_IO_SERIALIZE_LOW_QUALITY = 1 << 0 };
+
+void fiv_io_serialize_to_stdout(cairo_surface_t *surface, guint64 user_data);
+cairo_surface_t *fiv_io_deserialize(GBytes *bytes, guint64 *user_data);
// --- Filesystem --------------------------------------------------------------
diff --git a/fiv-thumbnail.h b/fiv-thumbnail.h
index 822e609..35b93fe 100644
--- a/fiv-thumbnail.h
+++ b/fiv-thumbnail.h
@@ -45,10 +45,10 @@ typedef struct _FivThumbnailSizeInfo {
const char *thumbnail_spec_name; ///< thumbnail-spec directory name
} FivThumbnailSizeInfo;
-extern FivThumbnailSizeInfo fiv_thumbnail_sizes[FIV_THUMBNAIL_SIZE_COUNT];
-
enum { FIV_THUMBNAIL_WIDE_COEFFICIENT = 2 };
+extern FivThumbnailSizeInfo fiv_thumbnail_sizes[FIV_THUMBNAIL_SIZE_COUNT];
+
/// If non-NULL, indicates a thumbnail of insufficient quality.
extern cairo_user_data_key_t fiv_thumbnail_key_lq;