Use util_clip_triangle() in pan_item_tri_new()
[geeqie.git] / src / image-load.h
index 176a790..3454161 100644 (file)
 #ifndef IMAGE_LOAD_H
 #define IMAGE_LOAD_H
 
+#include <memory>
+
+#include <gdk-pixbuf/gdk-pixbuf.h>
+#include <glib-object.h>
+#include <glib.h>
+
+struct FileData;
+
 #define TYPE_IMAGE_LOADER              (image_loader_get_type())
 
-typedef void (*ImageLoaderBackendCbAreaPrepared)(gpointer loader, gpointer data);
-typedef void (*ImageLoaderBackendCbSize)(gpointer loader, gint width, gint height, gpointer data);
-typedef void (*ImageLoaderBackendCbAreaUpdated)(gpointer loader, guint x, guint y, guint w, guint h, gpointer data);
-
-typedef gpointer (*ImageLoaderBackendFuncLoaderNew)(ImageLoaderBackendCbAreaUpdated, ImageLoaderBackendCbSize, ImageLoaderBackendCbAreaPrepared, gpointer data);
-typedef void (*ImageLoaderBackendFuncSetSize)(gpointer loader, int width, int height);
-typedef gboolean (*ImageLoaderBackendFuncLoad)(gpointer loader, const guchar *buf, gsize count, GError **error); /* optional, load whole image at once */
-typedef gboolean (*ImageLoaderBackendFuncWrite)(gpointer loader, const guchar *buf, gsize count, GError **error);
-typedef GdkPixbuf* (*ImageLoaderBackendFuncGetPixbuf)(gpointer loader);
-typedef gboolean (*ImageLoaderBackendFuncClose)(gpointer loader, GError **error);
-typedef void (*ImageLoaderBackendFuncAbort)(gpointer loader);
-typedef void (*ImageLoaderBackendFuncFree)(gpointer loader);
-typedef gchar* (*ImageLoaderBackendFuncGetFormatName)(gpointer loader);
-typedef gchar** (*ImageLoaderBackendFuncGetFormatMimeTypes)(gpointer loader);
-typedef void (*ImageLoaderBackendFuncSetPageNum)(gpointer loader, gint page_num);
-typedef gint (*ImageLoaderBackendFuncGetPageTotal)(gpointer loader);
-
-typedef struct _ImageLoaderBackend ImageLoaderBackend;
-struct _ImageLoaderBackend
+struct ImageLoaderBackend
 {
-       ImageLoaderBackendFuncLoaderNew loader_new;
-       ImageLoaderBackendFuncSetSize set_size;
-       ImageLoaderBackendFuncLoad load;
-       ImageLoaderBackendFuncWrite write;
-       ImageLoaderBackendFuncGetPixbuf get_pixbuf;
-       ImageLoaderBackendFuncClose close;
-       ImageLoaderBackendFuncAbort abort;
-       ImageLoaderBackendFuncFree free;
-       ImageLoaderBackendFuncGetFormatName get_format_name;
-       ImageLoaderBackendFuncGetFormatMimeTypes get_format_mime_types;
-       ImageLoaderBackendFuncSetPageNum set_page_num;
-       ImageLoaderBackendFuncGetPageTotal get_page_total;
+public:
+       virtual ~ImageLoaderBackend() = default;
+
+       using AreaUpdatedCb = void (*)(gpointer, guint, guint, guint, guint, gpointer);
+       using SizePreparedCb = void (*)(gpointer, gint, gint, gpointer);
+       using AreaPreparedCb = void (*)(gpointer, gpointer);
+
+       virtual void init(AreaUpdatedCb area_updated_cb, SizePreparedCb size_prepared_cb, AreaPreparedCb area_prepared_cb, gpointer data) = 0;
+       virtual void set_size(int /*width*/, int /*height*/) {};
+       virtual gboolean write(const guchar *buf, gsize &chunk_size, gsize count, GError **error) = 0;
+       virtual GdkPixbuf *get_pixbuf() = 0;
+       virtual gboolean close(GError **/*error*/) { return TRUE; };
+       virtual void abort() {};
+       virtual gchar *get_format_name() = 0;
+       virtual gchar **get_format_mime_types() = 0;
+       virtual void set_page_num(gint /*page_num*/) {};
+       virtual gint get_page_total() { return 0; };
 };
 
+enum ImageLoaderPreview {
+       IMAGE_LOADER_PREVIEW_NONE = 0,
+       IMAGE_LOADER_PREVIEW_EXIF = 1,
+       IMAGE_LOADER_PREVIEW_LIBRAW = 2
+};
 
-//typedef struct _ImageLoader ImageLoader;
-typedef struct _ImageLoaderClass ImageLoaderClass;
 
-struct _ImageLoader
+struct ImageLoader
 {
        GObject parent;
 
@@ -74,7 +72,7 @@ struct _ImageLoader
        gsize bytes_read;
        gsize bytes_total;
 
-       gboolean preview;
+       ImageLoaderPreview preview;
 
        gint requested_width;
        gint requested_height;
@@ -88,9 +86,8 @@ struct _ImageLoader
        guint idle_id; /**< event source id */
        gint idle_priority;
 
-       gpointer *loader;
        GError *error;
-       ImageLoaderBackend backend;
+       std::unique_ptr<ImageLoaderBackend> backend;
 
        guint idle_done_id; /**< event source id */
        GList *area_param_list;
@@ -109,7 +106,7 @@ struct _ImageLoader
        guint idle_read_loop_count;
 };
 
-struct _ImageLoaderClass {
+struct ImageLoaderClass {
        GObjectClass parent;
 
        /* class members */
@@ -119,7 +116,7 @@ struct _ImageLoaderClass {
        void (*percent)(ImageLoader *, gdouble, gpointer);
 };
 
-GType image_loader_get_type(void);
+GType image_loader_get_type();
 
 ImageLoader *image_loader_new(FileData *fd);
 
@@ -139,7 +136,7 @@ void image_loader_delay_area_ready(ImageLoader *il, gboolean enable);
  */
 void image_loader_set_requested_size(ImageLoader *il, gint width, gint height);
 
-void image_loader_set_buffer_size(ImageLoader *il, guint size);
+void image_loader_set_buffer_size(ImageLoader *il, guint count);
 
 /**
  * @headerfile image_loader_set_priority