From b5b810393f0fae5071a0263db376dadaf595d4c5 Mon Sep 17 00:00:00 2001 From: Vladimir Nadvornik Date: Sat, 26 Mar 2011 17:57:25 +0100 Subject: [PATCH] infrastructure for image loader backend --- src/Makefile.am | 2 ++ src/image-load.c | 48 +++++++++++++++++--------------------------- src/image-load.h | 18 ++++++++++++++++- src/image.c | 2 ++ src/image_load_gdk.c | 39 +++++++++++++++++++++++++++++++++++ src/image_load_gdk.h | 8 ++++++++ 6 files changed, 86 insertions(+), 31 deletions(-) create mode 100644 src/image_load_gdk.c create mode 100644 src/image_load_gdk.h diff --git a/src/Makefile.am b/src/Makefile.am index 0372a578..f794c92a 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -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 \ diff --git a/src/image-load.c b/src/image-load.c index e2cf7e0a..7677fc87 100644 --- a/src/image-load.c +++ b/src/image-load.c @@ -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 ? */ diff --git a/src/image-load.h b/src/image-load.h index fe8de88b..c6ffbbd9 100644 --- a/src/image-load.h +++ b/src/image-load.h @@ -16,6 +16,21 @@ #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; diff --git a/src/image.c b/src/image.c index 6e4d1c2c..1a2aa209 100644 --- a/src/image.c +++ b/src/image.c @@ -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 index 00000000..722d70c5 --- /dev/null +++ b/src/image_load_gdk.c @@ -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 index 00000000..43dd5849 --- /dev/null +++ b/src/image_load_gdk.h @@ -0,0 +1,8 @@ + +#ifndef IMAGE_LOAD_GDK_H +#define IMAGE_LOAD_GDK_H + +void image_loader_backend_set_default(ImageLoaderBackend *funcs); + +#endif + -- 2.20.1