Mercurial > hg > forks > geeqie
changeset 1842:5438c8aaac7e
infrastructure for image loader backend
author | Vladimir Nadvornik <nadvornik@suse.cz> |
---|---|
date | Sat, 26 Mar 2011 17:57:25 +0100 |
parents | c8128aed97f2 |
children | f26539b61a6c |
files | src/Makefile.am src/image-load.c src/image-load.h src/image.c src/image_load_gdk.c src/image_load_gdk.h |
diffstat | 6 files changed, 86 insertions(+), 31 deletions(-) [+] |
line wrap: on
line diff
--- a/src/Makefile.am Fri Mar 25 23:25:15 2011 +0100 +++ b/src/Makefile.am Sat Mar 26 17:57:25 2011 +0100 @@ -160,6 +160,8 @@ 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 \
--- a/src/image-load.c Fri Mar 25 23:25:15 2011 +0100 +++ b/src/image-load.c Sat Mar 26 17:57:25 2011 +0100 @@ -13,6 +13,7 @@ #include "main.h" #include "image-load.h" +#include "image_load_gdk.h" #include "exif.h" #include "filedata.h" @@ -342,7 +343,7 @@ return; } - pb = gdk_pixbuf_loader_get_pixbuf(il->loader); + pb = il->backend.get_pixbuf(il->loader); if (pb == il->pixbuf) { @@ -363,7 +364,7 @@ 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) { @@ -386,8 +387,9 @@ 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; @@ -396,7 +398,7 @@ 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) { @@ -406,7 +408,7 @@ 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); @@ -416,11 +418,10 @@ } -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; @@ -433,10 +434,7 @@ } 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]) { @@ -466,7 +464,7 @@ 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); @@ -480,7 +478,7 @@ 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; @@ -493,14 +491,8 @@ 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); } @@ -539,7 +531,7 @@ 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; @@ -569,7 +561,7 @@ 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; @@ -578,10 +570,10 @@ 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; @@ -939,16 +931,12 @@ 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 ? */
--- a/src/image-load.h Fri Mar 25 23:25:15 2011 +0100 +++ b/src/image-load.h Sat Mar 26 17:57:25 2011 +0100 @@ -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 @@ 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;
--- a/src/image.c Fri Mar 25 23:25:15 2011 +0100 +++ b/src/image.c Sat Mar 26 17:57:25 2011 +0100 @@ -1259,6 +1259,8 @@ 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)
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/image_load_gdk.c Sat Mar 26 17:57:25 2011 +0100 @@ -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; +} + + +