summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2013-12-17 09:33:56 -0500
committerMatthias Clasen <mclasen@redhat.com>2013-12-17 09:33:56 -0500
commit8d317b3b01007c7757b465bd80cd921b5122ae7d (patch)
tree9424e4dca851ff6ca2c1a457bf1e8e4b853e9d37
parentb44805f2b91d0c0fc73b0f06f8c47dad0b6c0939 (diff)
downloadgdk-pixbuf-8d317b3b01007c7757b465bd80cd921b5122ae7d.tar.gz
Some more stack conservation
Only use the sniff buffer while we need it.
-rw-r--r--gdk-pixbuf/gdk-pixbuf-io.c72
1 files changed, 41 insertions, 31 deletions
diff --git a/gdk-pixbuf/gdk-pixbuf-io.c b/gdk-pixbuf/gdk-pixbuf-io.c
index 5ea7ad95b..a98d12515 100644
--- a/gdk-pixbuf/gdk-pixbuf-io.c
+++ b/gdk-pixbuf/gdk-pixbuf-io.c
@@ -959,6 +959,29 @@ _gdk_pixbuf_get_module (guchar *buffer, guint size,
return NULL;
}
+static
+GdkPixbufModule *
+_gdk_pixbuf_get_module_for_file (FILE *f, const gchar *filename, GError **error)
+{
+ guchar buffer[SNIFF_BUFFER_SIZE];
+ int size;
+
+ size = fread (&buffer, 1, sizeof (buffer), f);
+ if (size == 0) {
+ gchar *display_name;
+ display_name = g_filename_display_name (filename);
+ g_set_error (error,
+ GDK_PIXBUF_ERROR,
+ GDK_PIXBUF_ERROR_CORRUPT_IMAGE,
+ _("Image file '%s' contains no data"),
+ display_name);
+ g_free (display_name);
+ return NULL;
+ }
+
+ return _gdk_pixbuf_get_module (buffer, size, filename, error);
+}
+
static void
prepared_notify (GdkPixbuf *pixbuf,
GdkPixbufAnimation *anim,
@@ -1051,20 +1074,17 @@ gdk_pixbuf_new_from_file (const char *filename,
GError **error)
{
GdkPixbuf *pixbuf;
- int size;
FILE *f;
- guchar buffer[SNIFF_BUFFER_SIZE];
GdkPixbufModule *image_module;
- gchar *display_name;
g_return_val_if_fail (filename != NULL, NULL);
g_return_val_if_fail (error == NULL || *error == NULL, NULL);
- display_name = g_filename_display_name (filename);
-
f = g_fopen (filename, "rb");
if (!f) {
gint save_errno = errno;
+ gchar *display_name;
+ display_name = g_filename_display_name (filename);
g_set_error (error,
G_FILE_ERROR,
g_file_error_from_errno (save_errno),
@@ -1075,27 +1095,13 @@ gdk_pixbuf_new_from_file (const char *filename,
return NULL;
}
- size = fread (&buffer, 1, sizeof (buffer), f);
- if (size == 0) {
- g_set_error (error,
- GDK_PIXBUF_ERROR,
- GDK_PIXBUF_ERROR_CORRUPT_IMAGE,
- _("Image file '%s' contains no data"),
- display_name);
- g_free (display_name);
- fclose (f);
- return NULL;
- }
-
- image_module = _gdk_pixbuf_get_module (buffer, size, filename, error);
+ image_module = _gdk_pixbuf_get_module_for_file (f, filename, error);
if (image_module == NULL) {
- g_free (display_name);
fclose (f);
return NULL;
}
if (!_gdk_pixbuf_load_module (image_module, error)) {
- g_free (display_name);
fclose (f);
return NULL;
}
@@ -1112,26 +1118,30 @@ gdk_pixbuf_new_from_file (const char *filename,
* the invariant that error gets set if NULL is returned.
*/
+ gchar *display_name;
+ display_name = g_filename_display_name (filename);
g_warning ("Bug! gdk-pixbuf loader '%s' didn't set an error on failure.", image_module->module_name);
g_set_error (error,
GDK_PIXBUF_ERROR,
GDK_PIXBUF_ERROR_FAILED,
_("Failed to load image '%s': reason not known, probably a corrupt image file"),
display_name);
+ g_free (display_name);
} else if (error != NULL && *error != NULL) {
-
- /* Add the filename to the error message */
- GError *e = *error;
- gchar *old;
-
- old = e->message;
- e->message = g_strdup_printf (_("Failed to load image '%s': %s"),
- display_name,
- old);
- g_free (old);
+ /* Add the filename to the error message */
+ GError *e = *error;
+ gchar *old;
+ gchar *display_name;
+
+ display_name = g_filename_display_name (filename);
+ old = e->message;
+ e->message = g_strdup_printf (_("Failed to load image '%s': %s"),
+ display_name,
+ old);
+ g_free (old);
+ g_free (display_name);
}
- g_free (display_name);
return pixbuf;
}