#include "main.h"
#include "image-load.h"
+#include "image_load_gdk.h"
#include "exif.h"
#include "filedata.h"
return;
}
- pb = gdk_pixbuf_loader_get_pixbuf(il->loader);
+ pb = il->backend.get_pixbuf(il->loader);
if (pb == il->pixbuf)
{
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)
{
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;
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)
{
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);
}
-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;
}
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])
{
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);
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;
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);
}
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;
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;
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;
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 ? */
#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;
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;
--- /dev/null
+
+#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;
+}
+
+
+