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;
+}
+
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/image_load_gdk.h	Sat Mar 26 17:57:25 2011 +0100
@@ -0,0 +1,8 @@
+
+#ifndef IMAGE_LOAD_GDK_H
+#define IMAGE_LOAD_GDK_H
+
+void image_loader_backend_set_default(ImageLoaderBackend *funcs);
+
+#endif
+