From cf793d109e921f5dd4a1908e4d8895331c2bd07c Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 12 Jul 2008 02:37:35 +0000 Subject: [PATCH] Use GIO for sniffing image types, except on Win32, where GIO doesn't do 2008-07-11 Matthias Clasen * gdk-pixbuf-io.c: Use GIO for sniffing image types, except on Win32, where GIO doesn't do any sniffing. svn path=/trunk/; revision=20820 --- gdk-pixbuf/ChangeLog | 5 +++++ gdk-pixbuf/gdk-pixbuf-io.c | 35 ++++++++++++++++++++++++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/gdk-pixbuf/ChangeLog b/gdk-pixbuf/ChangeLog index 6d25bf5b7b..6338ee4256 100644 --- a/gdk-pixbuf/ChangeLog +++ b/gdk-pixbuf/ChangeLog @@ -1,3 +1,8 @@ +2008-07-11 Matthias Clasen + + * gdk-pixbuf-io.c: Use GIO for sniffing image types, except + on Win32, where GIO doesn't do any sniffing. + 2008-07-05 Matthias Clasen * === Released 2.13.4 === diff --git a/gdk-pixbuf/gdk-pixbuf-io.c b/gdk-pixbuf/gdk-pixbuf-io.c index b32e40ed46..27cb18ee0a 100644 --- a/gdk-pixbuf/gdk-pixbuf-io.c +++ b/gdk-pixbuf/gdk-pixbuf-io.c @@ -51,6 +51,12 @@ #define SNIFF_BUFFER_SIZE 4096 #define LOAD_BUFFER_SIZE 65536 +#ifndef G_OS_WIN32 +/* GIO doesn't do mime sniffing on Win32, so we need to do our own */ +#define GDK_PIXBUF_USE_GIO_MIME 1 +#endif + +#ifndef GDK_PIXBUF_USE_GIO_MIME static gint format_check (GdkPixbufModule *module, guchar *buffer, int size) { @@ -102,6 +108,7 @@ format_check (GdkPixbufModule *module, guchar *buffer, int size) } return 0; } +#endif G_LOCK_DEFINE_STATIC (init_lock); G_LOCK_DEFINE_STATIC (threadunsafe_loader_lock); @@ -763,9 +770,33 @@ _gdk_pixbuf_get_module (guchar *buffer, guint size, { GSList *modules; - gint score, best = 0; GdkPixbufModule *selected = NULL; gchar *display_name = NULL; +#ifdef GDK_PIXBUF_USE_GIO_MIME + gchar *mime_type; + gchar **mimes; + gint j; + + mime_type = g_content_type_guess (filename, buffer, size, NULL); + + for (modules = get_file_formats (); modules; modules = g_slist_next (modules)) { + GdkPixbufModule *module = (GdkPixbufModule *)modules->data; + GdkPixbufFormat *info = module->info; + + if (info->disabled) + continue; + + mimes = info->mime_types; + for (j = 0; mimes[j] != NULL; j++) { + if (g_ascii_strcasecmp (mimes[j], mime_type) == 0) { + selected = module; + break; + } + } + } + g_free (mime_type); +#else + gint score, best = 0; for (modules = get_file_formats (); modules; modules = g_slist_next (modules)) { GdkPixbufModule *module = (GdkPixbufModule *)modules->data; @@ -781,6 +812,8 @@ _gdk_pixbuf_get_module (guchar *buffer, guint size, if (score >= 100) break; } +#endif + if (selected != NULL) return selected;