infrastructure for image loader backend
authorVladimir Nadvornik <nadvornik@suse.cz>
Sat, 26 Mar 2011 16:57:25 +0000 (17:57 +0100)
committerVladimir Nadvornik <nadvornik@suse.cz>
Tue, 27 Sep 2011 12:30:08 +0000 (14:30 +0200)
src/Makefile.am
src/image-load.c
src/image-load.h
src/image.c
src/image_load_gdk.c [new file with mode: 0644]
src/image_load_gdk.h [new file with mode: 0644]

index 0372a57..f794c92 100644 (file)
@@ -160,6 +160,8 @@ geeqie_SOURCES = \
        image.h         \
        image-load.c    \
        image-load.h    \
+       image_load_gdk.c\
+       image_load_gdk.h\
        image-overlay.c \
        image-overlay.h \
        img-view.c      \
index e2cf7e0..7677fc8 100644 (file)
@@ -13,6 +13,7 @@
 
 #include "main.h"
 #include "image-load.h"
+#include "image_load_gdk.h"
 
 #include "exif.h"
 #include "filedata.h"
@@ -354,7 +355,7 @@ static void image_loader_sync_pixbuf(ImageLoader *il)
                return;
                }
 
-       pb = gdk_pixbuf_loader_get_pixbuf(il->loader);
+       pb = il->backend.get_pixbuf(il->loader);
 
        if (pb == il->pixbuf)
                {
@@ -375,7 +376,7 @@ static void image_loader_sync_pixbuf(ImageLoader *il)
        g_mutex_unlock(il->data_mutex);
 }
 
-static void image_loader_area_updated_cb(GdkPixbufLoader *loader,
+static void image_loader_area_updated_cb(gpointer loader,
                                 guint x, guint y, guint w, guint h,
                                 gpointer data)
 {
@@ -398,8 +399,9 @@ static void image_loader_area_updated_cb(GdkPixbufLoader *loader,
        g_mutex_unlock(il->data_mutex);
 }
 
-static void image_loader_area_prepared_cb(GdkPixbufLoader *loader, gpointer data)
+static void image_loader_area_prepared_cb(gpointer loader, gpointer data)
 {
+       ImageLoader *il = data;
        GdkPixbuf *pb;
        guchar *pix;
        size_t h, rs;
@@ -408,7 +410,7 @@ static void image_loader_area_prepared_cb(GdkPixbufLoader *loader, gpointer data
           http://bugzilla.gnome.org/show_bug.cgi?id=547669 
           http://bugzilla.gnome.org/show_bug.cgi?id=589334
        */
-       gchar *format = gdk_pixbuf_format_get_name(gdk_pixbuf_loader_get_format(loader));
+       gchar *format = il->backend.get_format_name(loader);
        if (strcmp(format, "svg") == 0 ||
            strcmp(format, "xpm") == 0)
                {
@@ -418,7 +420,7 @@ static void image_loader_area_prepared_cb(GdkPixbufLoader *loader, gpointer data
        
        g_free(format);
 
-       pb = gdk_pixbuf_loader_get_pixbuf(loader);
+       pb = il->backend.get_pixbuf(loader);
        
        h = gdk_pixbuf_get_height(pb);
        rs = gdk_pixbuf_get_rowstride(pb);
@@ -428,11 +430,10 @@ static void image_loader_area_prepared_cb(GdkPixbufLoader *loader, gpointer data
 
 }
 
-static void image_loader_size_cb(GdkPixbufLoader *loader,
+static void image_loader_size_cb(gpointer loader,
                                 gint width, gint height, gpointer data)
 {
        ImageLoader *il = data;
-       GdkPixbufFormat *format;
        gchar **mime_types;
        gboolean scale = FALSE;
        gint n;
@@ -446,10 +447,7 @@ static void image_loader_size_cb(GdkPixbufLoader *loader,
                }
        g_mutex_unlock(il->data_mutex);
 
-       format = gdk_pixbuf_loader_get_format(loader);
-       if (!format) return;
-
-       mime_types = gdk_pixbuf_format_get_mime_types(format);
+       mime_types = il->backend.get_format_mime_types(loader);
        n = 0;
        while (mime_types[n])
                {
@@ -483,7 +481,7 @@ static void image_loader_size_cb(GdkPixbufLoader *loader,
                        if (nw < 1) nw = 1;
                        }
 
-               gdk_pixbuf_loader_set_size(loader, nw, nh);
+               il->backend.set_size(loader, nw, nh);
                il->shrunk = TRUE;
                }
        g_mutex_unlock(il->data_mutex);
@@ -498,7 +496,7 @@ static void image_loader_stop_loader(ImageLoader *il)
        if (il->loader)
                {
                /* some loaders do not have a pixbuf till close, order is important here */
-               gdk_pixbuf_loader_close(il->loader, il->error ? NULL : &il->error); /* we are interested in the first error only */
+               il->backend.close(il->loader, il->error ? NULL : &il->error); /* we are interested in the first error only */
                image_loader_sync_pixbuf(il);
                g_object_unref(G_OBJECT(il->loader));
                il->loader = NULL;
@@ -511,14 +509,8 @@ static void image_loader_stop_loader(ImageLoader *il)
 static void image_loader_setup_loader(ImageLoader *il)
 {
        g_mutex_lock(il->data_mutex);
-       il->loader = gdk_pixbuf_loader_new();
-
-       g_signal_connect(G_OBJECT(il->loader), "area_updated",
-                        G_CALLBACK(image_loader_area_updated_cb), il);
-       g_signal_connect(G_OBJECT(il->loader), "size_prepared",
-                        G_CALLBACK(image_loader_size_cb), il);
-       g_signal_connect(G_OBJECT(il->loader), "area_prepared",
-                        G_CALLBACK(image_loader_area_prepared_cb), il);
+       image_loader_backend_set_default(&il->backend);
+       il->loader = il->backend.loader_new(G_CALLBACK(image_loader_area_updated_cb), G_CALLBACK(image_loader_size_cb), G_CALLBACK(image_loader_area_prepared_cb), il);
        g_mutex_unlock(il->data_mutex);
 }
 
@@ -557,7 +549,7 @@ static gboolean image_loader_continue(ImageLoader *il)
                        return FALSE;
                        }
 
-               if (b < 0 || (b > 0 && !gdk_pixbuf_loader_write(il->loader, il->mapped_file + il->bytes_read, b, &il->error)))
+               if (b < 0 || (b > 0 && !il->backend.write(il->loader, il->mapped_file + il->bytes_read, b, &il->error)))
                        {
                        image_loader_error(il);
                        return FALSE;
@@ -587,7 +579,7 @@ static gboolean image_loader_begin(ImageLoader *il)
 
        image_loader_setup_loader(il);
 
-       if (!gdk_pixbuf_loader_write(il->loader, il->mapped_file + il->bytes_read, b, &il->error))
+       if (!il->backend.write(il->loader, il->mapped_file + il->bytes_read, b, &il->error))
                {
                image_loader_stop_loader(il);
                return FALSE;
@@ -596,10 +588,10 @@ static gboolean image_loader_begin(ImageLoader *il)
        il->bytes_read += b;
 
        /* read until size is known */
-       while (il->loader && !gdk_pixbuf_loader_get_pixbuf(il->loader) && b > 0 && !image_loader_get_stopping(il))
+       while (il->loader && !il->backend.get_pixbuf(il->loader) && b > 0 && !image_loader_get_stopping(il))
                {
                b = MIN(il->read_buffer_size, il->bytes_total - il->bytes_read);
-               if (b < 0 || (b > 0 && !gdk_pixbuf_loader_write(il->loader, il->mapped_file + il->bytes_read, b, &il->error)))
+               if (b < 0 || (b > 0 && !il->backend.write(il->loader, il->mapped_file + il->bytes_read, b, &il->error)))
                        {
                        image_loader_stop_loader(il);
                        return FALSE;
@@ -957,16 +949,12 @@ GdkPixbuf *image_loader_get_pixbuf(ImageLoader *il)
 
 gchar *image_loader_get_format(ImageLoader *il)
 {
-       GdkPixbufFormat *format;
        gchar **mimev;
        gchar *mime;
 
        if (!il || !il->loader) return NULL;
 
-       format = gdk_pixbuf_loader_get_format(il->loader);
-       if (!format) return NULL;
-
-       mimev = gdk_pixbuf_format_get_mime_types(format);
+       mimev = il->backend.get_format_mime_types(il->loader);
        if (!mimev) return NULL;
 
        /* return first member of mimev, as GdkPixbufLoader has no way to tell us which exact one ? */
index fe8de88..c6ffbbd 100644 (file)
 
 #define TYPE_IMAGE_LOADER              (image_loader_get_type())
 
+
+typedef struct _ImageLoaderBackend ImageLoaderBackend;
+struct _ImageLoaderBackend
+{
+       gpointer (*loader_new)(GCallback area_updated_cb, GCallback size_cb, GCallback area_prepared_cb, gpointer data);
+       void (*set_size)(gpointer loader, int width, int height);
+       gboolean (*write)(gpointer loader, const guchar *buf, gsize count, GError **error);
+       GdkPixbuf* (*get_pixbuf)(gpointer loader);
+       gboolean (*close)(gpointer loader, GError **error);
+
+       gchar* (*get_format_name)(gpointer loader);
+       gchar** (*get_format_mime_types)(gpointer loader);
+};
+
+
 //typedef struct _ImageLoader ImageLoader;
 typedef struct _ImageLoaderClass ImageLoaderClass;
 
@@ -41,8 +56,9 @@ struct _ImageLoader
        guint idle_id; /* event source id */
        gint idle_priority;
 
-       GdkPixbufLoader *loader;
+       gpointer *loader;
        GError *error;
+       ImageLoaderBackend backend;
 
        guint idle_done_id; /* event source id */
        GList *area_param_list;
index 6e4d1c2..1a2aa20 100644 (file)
@@ -1268,6 +1268,8 @@ void image_change_from_image(ImageWindow *imd, ImageWindow *source)
        imd->orientation = source->orientation;
        imd->desaturate = source->desaturate;
 
+       imd->user_stereo = source->user_stereo;
+
        pixbuf_renderer_move(PIXBUF_RENDERER(imd->pr), PIXBUF_RENDERER(source->pr));
 
        if (imd->cm || imd->desaturate)
diff --git a/src/image_load_gdk.c b/src/image_load_gdk.c
new file mode 100644 (file)
index 0000000..722d70c
--- /dev/null
@@ -0,0 +1,39 @@
+
+#include "main.h"
+#include "image-load.h"
+#include "image_load_gdk.h"
+
+
+static gchar* image_loader_gdk_get_format_name(GObject *loader)
+{
+       return gdk_pixbuf_format_get_name(gdk_pixbuf_loader_get_format(GDK_PIXBUF_LOADER(loader)));
+}
+static gchar** image_loader_gdk_get_format_mime_types(GObject *loader)
+{
+       return gdk_pixbuf_format_get_mime_types(gdk_pixbuf_loader_get_format(GDK_PIXBUF_LOADER(loader)));
+}
+
+static gpointer image_loader_gdk_new(GCallback area_updated_cb, GCallback size_cb, GCallback area_prepared_cb, gpointer data)
+{
+        GdkPixbufLoader *loader = gdk_pixbuf_loader_new();
+        
+       g_signal_connect(G_OBJECT(loader), "area_updated", area_updated_cb, data);
+       g_signal_connect(G_OBJECT(loader), "size_prepared", size_cb, data);
+       g_signal_connect(G_OBJECT(loader), "area_prepared", area_prepared_cb, data);
+       return (gpointer) loader;
+}
+
+void image_loader_backend_set_default(ImageLoaderBackend *funcs)
+{
+       funcs->loader_new = image_loader_gdk_new;
+       funcs->set_size = gdk_pixbuf_loader_set_size;
+       funcs->write = gdk_pixbuf_loader_write;
+       funcs->get_pixbuf = gdk_pixbuf_loader_get_pixbuf;
+       funcs->close = gdk_pixbuf_loader_close;
+       
+       funcs->get_format_name = image_loader_gdk_get_format_name;
+       funcs->get_format_mime_types = image_loader_gdk_get_format_mime_types;
+}
+
+
+
diff --git a/src/image_load_gdk.h b/src/image_load_gdk.h
new file mode 100644 (file)
index 0000000..43dd584
--- /dev/null
@@ -0,0 +1,8 @@
+
+#ifndef IMAGE_LOAD_GDK_H
+#define IMAGE_LOAD_GDK_H
+
+void image_loader_backend_set_default(ImageLoaderBackend *funcs);
+
+#endif
+