Mercurial > pidgin.yaz
diff pidgin/gtkutils.h @ 32138:e2c6e4fc3c84
Start looking at the GError parameter every time we call these functions:
- gdk_pixbuf_loader_write
- gdk_pixbuf_loader_close
- gdk_pixbuf_new_from_file
- gdk_pixbuf_new_from_file_at_size
- gdk_pixbuf_new_from_file_at_scale
There are times when gdkpixbuf returns a semi-invalid GdkPixbuf object and
also sets the GError. If this happens we want to discard and ignore the
GdkPixbuf object because it can cause problems. For example, calling
gdk_pixbuf_scale_simple() causes gdkpixbuf to rapidly consume memory in
an infinite loop. And that's bad.
This commit adds some helper functions to gtkutils.[c|h] that make it a
little easier to check the GError value. We should use them everywhere
we call any of the above functions.
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Wed, 22 Jun 2011 07:07:28 +0000 |
parents | 59426f92168f |
children | accce7b79737 58e0e310ef2e |
line wrap: on
line diff
--- a/pidgin/gtkutils.h Tue Jun 21 07:43:07 2011 +0000 +++ b/pidgin/gtkutils.h Wed Jun 22 07:07:28 2011 +0000 @@ -834,6 +834,32 @@ GtkWidget *pidgin_add_widget_to_vbox(GtkBox *vbox, const char *widget_label, GtkSizeGroup *sg, GtkWidget *widget, gboolean expand, GtkWidget **p_label); /** + * Create a GdkPixbuf from a chunk of image data. + * + * @param buf The raw binary image data. + * @param count The length of buf in bytes. + * + * @return A GdkPixbuf created from the image data, or NULL if + * there was an error parsing the data. + * + * @since 2.9.0 + */ +GdkPixbuf *pidgin_pixbuf_from_data(const guchar *buf, gsize count); + +/** + * Create a GdkPixbufAnimation from a chunk of image data. + * + * @param buf The raw binary image data. + * @param count The length of buf in bytes. + * + * @return A GdkPixbufAnimation created from the image data, or NULL if + * there was an error parsing the data. + * + * @since 2.9.0 + */ +GdkPixbufAnimation *pidgin_pixbuf_anim_from_data(const guchar *buf, gsize count); + +/** * Create a GdkPixbuf from a PurpleStoredImage. * * @param image A PurpleStoredImage. @@ -845,6 +871,86 @@ GdkPixbuf *pidgin_pixbuf_from_imgstore(PurpleStoredImage *image); /** + * Helper function that calls gdk_pixbuf_new_from_file() and checks both + * the return code and the GError and returns NULL if either one failed. + * + * The gdk-pixbuf documentation implies that it is sufficient to check + * the return value of gdk_pixbuf_new_from_file() to determine + * whether the image was able to be loaded. However, this is not the case + * with gdk-pixbuf 2.23.3 and probably many earlier versions. In some + * cases a GdkPixbuf object is returned that will cause some operations + * (like gdk_pixbuf_scale_simple()) to rapidly consume memory in an + * infinite loop. + * + * This function shouldn't be necessary once Pidgin requires a version of + * gdk-pixbuf where the aforementioned bug is fixed. However, it might be + * nice to keep this function around for the debug message that it logs. + * + * @param filename Name of file to load, in the GLib file name encoding + * + * @return The GdkPixbuf if successful. Otherwise NULL is returned and + * a warning is logged. + * + * @since 2.9.0 + */ +GdkPixbuf *pidgin_pixbuf_new_from_file(const char *filename); + +/** + * Helper function that calls gdk_pixbuf_new_from_file_at_size() and checks + * both the return code and the GError and returns NULL if either one failed. + * + * The gdk-pixbuf documentation implies that it is sufficient to check + * the return value of gdk_pixbuf_new_from_file_at_size() to determine + * whether the image was able to be loaded. However, this is not the case + * with gdk-pixbuf 2.23.3 and probably many earlier versions. In some + * cases a GdkPixbuf object is returned that will cause some operations + * (like gdk_pixbuf_scale_simple()) to rapidly consume memory in an + * infinite loop. + * + * This function shouldn't be necessary once Pidgin requires a version of + * gdk-pixbuf where the aforementioned bug is fixed. However, it might be + * nice to keep this function around for the debug message that it logs. + * + * @param filename Name of file to load, in the GLib file name encoding + * @param width The width the image should have or -1 to not constrain the width + * @param height The height the image should have or -1 to not constrain the height + * + * @return The GdkPixbuf if successful. Otherwise NULL is returned and + * a warning is logged. + * + * @since 2.9.0 + */ +GdkPixbuf *pidgin_pixbuf_new_from_file_at_size(const char *filename, int width, int height); + +/** + * Helper function that calls gdk_pixbuf_new_from_file_at_scale() and checks + * both the return code and the GError and returns NULL if either one failed. + * + * The gdk-pixbuf documentation implies that it is sufficient to check + * the return value of gdk_pixbuf_new_from_file_at_scale() to determine + * whether the image was able to be loaded. However, this is not the case + * with gdk-pixbuf 2.23.3 and probably many earlier versions. In some + * cases a GdkPixbuf object is returned that will cause some operations + * (like gdk_pixbuf_scale_simple()) to rapidly consume memory in an + * infinite loop. + * + * This function shouldn't be necessary once Pidgin requires a version of + * gdk-pixbuf where the aforementioned bug is fixed. However, it might be + * nice to keep this function around for the debug message that it logs. + * + * @param filename Name of file to load, in the GLib file name encoding + * @param width The width the image should have or -1 to not constrain the width + * @param height The height the image should have or -1 to not constrain the height + * @param preserve_aspect_ratio TRUE to preserve the image's aspect ratio + * + * @return The GdkPixbuf if successful. Otherwise NULL is returned and + * a warning is logged. + * + * @since 2.9.0 + */ +GdkPixbuf *pidgin_pixbuf_new_from_file_at_scale(const char *filename, int width, int height, gboolean preserve_aspect_ratio); + +/** * Add scrollbars to a widget * @param widget The child widget * @hscrollbar_policy Horizontal scrolling policy