On Sun, May 25, 2008 at 9:18 AM, Rafael Espíndola <[EMAIL PROTECTED]> wrote: > The attached patch factors the code that handles the thumb cache to a > common place. Right now it is duplicated in every filetype's > *_load_thumb. The patch is a nice cleanup ( 37 insertions(+), 88 > deletions(-) ) and also fixes the "thumbname used after freed" bug.
Lasse noted I forgot the patch. It is attached now. Cheers, Rafael
Index: src/ciff-meta.h =================================================================== --- src/ciff-meta.h (revision 1864) +++ src/ciff-meta.h (working copy) @@ -18,4 +18,4 @@ */ void rs_ciff_load_meta(const gchar *filename, RS_METADATA *meta); -GdkPixbuf *rs_ciff_load_thumb(const gchar *src); +GdkPixbuf *rs_ciff_load_thumb(const gchar *src, const gchar *thumbname); Index: src/x3f-meta.c =================================================================== --- src/x3f-meta.c (revision 1864) +++ src/x3f-meta.c (working copy) @@ -25,7 +25,7 @@ /* http://www.x3f.info/technotes/FileDocs/X3F_Format.pdf */ GdkPixbuf * -rs_x3f_load_thumb(const gchar *src) +rs_x3f_load_thumb(const gchar *src, const gchar *thumbname) { GdkPixbuf *pixbuf = NULL, *pixbuf2 = NULL; gdouble ratio=1.0; @@ -33,21 +33,9 @@ guint data_offset=0, data_length=0, data_format=0; guint start=0, width=0, height=0, rowstride=0; RAWFILE *rawfile; - gchar *thumbname; raw_init(); - thumbname = rs_thumb_get_name(src); - if (thumbname) - { - if (g_file_test(thumbname, G_FILE_TEST_EXISTS)) - { - pixbuf = gdk_pixbuf_new_from_file(thumbname, NULL); - g_free(thumbname); - if (pixbuf) return(pixbuf); - } - } - rawfile = raw_open_file(src); if (!rawfile) return(NULL); if (!raw_strcmp(rawfile, 0, "FOVb", 4)) Index: src/x3f-meta.h =================================================================== --- src/x3f-meta.h (revision 1864) +++ src/x3f-meta.h (working copy) @@ -17,4 +17,4 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -GdkPixbuf *rs_x3f_load_thumb(const gchar *src); +GdkPixbuf *rs_x3f_load_thumb(const gchar *src, const gchar *thumbname); Index: src/rawstudio.c =================================================================== --- src/rawstudio.c (revision 1864) +++ src/rawstudio.c (working copy) @@ -53,14 +53,14 @@ static void photo_settings_changed(RS_PHOTO *photo, gint mask, RS_BLOB *rs); static void photo_spatial_changed(RS_PHOTO *photo, RS_BLOB *rs); static RS_SETTINGS *rs_settings_new(); -static GdkPixbuf *rs_thumb_gdk(const gchar *src); +static GdkPixbuf *rs_thumb_gdk(const gchar *src, const gchar *thumbname); RS_FILETYPE *filetypes; static void rs_add_filetype(gchar *id, gint filetype, const gchar *ext, gchar *description, RS_PHOTO *(*load)(const gchar *, gboolean), - GdkPixbuf *(*thumb)(const gchar *), + GdkPixbuf *(*thumb)(const gchar *, const gchar *), void (*load_meta)(const gchar *, RS_METADATA *), gboolean (*save)(RS_PHOTO *photo, const gchar *filename, gint filetype, gint width, gint height, gboolean keep_aspect, gdouble scale, gint snapshot, RS_CMS *cms)) { @@ -85,6 +85,25 @@ return; } +GdkPixbuf * +rs_load_thumb(RS_FILETYPE *filetype, const gchar *src) +{ + GdkPixbuf * pixbuf = NULL; + gchar *thumbname = rs_thumb_get_name(src); + + if (thumbname) + { + pixbuf = gdk_pixbuf_new_from_file(thumbname, NULL); + + if (!pixbuf && filetype->thumb) + pixbuf = filetype->thumb(src, thumbname); + + g_free(thumbname); + } + + return pixbuf; +} + static void rs_init_filetypes(void) { @@ -700,25 +719,20 @@ } static GdkPixbuf * -rs_thumb_gdk(const gchar *src) +rs_thumb_gdk(const gchar *src, const gchar *thumbname) { GdkPixbuf *pixbuf=NULL; - gchar *thumbname; - thumbname = rs_thumb_get_name(src); - if (thumbname) { if (g_file_test(thumbname, G_FILE_TEST_EXISTS)) { pixbuf = gdk_pixbuf_new_from_file(thumbname, NULL); - g_free(thumbname); } else { pixbuf = gdk_pixbuf_new_from_file_at_size(src, 128, 128, NULL); gdk_pixbuf_save(pixbuf, thumbname, "png", NULL, NULL); - g_free(thumbname); } } else Index: src/rawstudio.h =================================================================== --- src/rawstudio.h (revision 1864) +++ src/rawstudio.h (working copy) @@ -250,12 +250,13 @@ const gchar *ext; gchar *description; RS_PHOTO *(*load)(const gchar *, gboolean); - GdkPixbuf *(*thumb)(const gchar *); + GdkPixbuf *(*thumb)(const gchar *, const gchar *); void (*load_meta)(const gchar *, RS_METADATA *); gboolean (*save)(RS_PHOTO *photo, const gchar *filename, gint filetype, gint width, gint height, gboolean keep_aspect, gdouble scale, gint snapshot, RS_CMS *cms); struct _rs_filetype *next; } RS_FILETYPE; +GdkPixbuf *rs_load_thumb(RS_FILETYPE *filetype, const gchar *src); void rs_local_cachedir(gboolean new_value); void rs_load_gdk(gboolean new_value); void rs_reset(RS_BLOB *rs); Index: src/rs-batch.c =================================================================== --- src/rs-batch.c (revision 1864) +++ src/rs-batch.c (working copy) @@ -229,8 +229,7 @@ missing_thumb = gtk_widget_render_icon(GTK_WIDGET(rawstudio_window), GTK_STOCK_MISSING_IMAGE, GTK_ICON_SIZE_DIALOG, NULL); - if (filetype->thumb) - pixbuf = filetype->thumb(filename); + pixbuf = rs_load_thumb(filetype, filename); if (pixbuf) { gint w,h,temp,size = 48; Index: src/panasonic.c =================================================================== --- src/panasonic.c (revision 1864) +++ src/panasonic.c (working copy) @@ -149,30 +149,16 @@ } GdkPixbuf * -rs_panasonic_load_thumb(const gchar *src) +rs_panasonic_load_thumb(const gchar *src, const gchar *thumbname) { RS_PHOTO *photo; RS_IMAGE16 *image; GdkPixbuf *pixbuf = NULL; - gchar *thumbname; RS_COLOR_TRANSFORM *rct; - thumbname = rs_thumb_get_name(src); - if (thumbname) - { - if (g_file_test(thumbname, G_FILE_TEST_EXISTS)) - { - pixbuf = gdk_pixbuf_new_from_file(thumbname, NULL); - g_free(thumbname); - if (pixbuf) return(pixbuf); - } - } - photo = rs_panasonic_load_photo(src); if (!photo) { - if (thumbname) - g_free(thumbname); return NULL; } rs_panasonic_load_meta(src, photo->metadata); @@ -206,7 +192,6 @@ if (thumbname) { gdk_pixbuf_save(pixbuf, thumbname, "png", NULL, NULL); - g_free(thumbname); } return(pixbuf); Index: src/tiff-meta.c =================================================================== --- src/tiff-meta.c (revision 1864) +++ src/tiff-meta.c (working copy) @@ -603,29 +603,17 @@ } GdkPixbuf * -rs_tiff_load_thumb(const gchar *src) +rs_tiff_load_thumb(const gchar *src, const gchar *thumbname) { RAWFILE *rawfile; guint next, offset; gushort ifd_num; GdkPixbuf *pixbuf=NULL, *pixbuf2=NULL; RS_METADATA *meta = NULL; - gchar *thumbname; guint start=0, length=0; raw_init(); - thumbname = rs_thumb_get_name(src); - if (thumbname) - { - if (g_file_test(thumbname, G_FILE_TEST_EXISTS)) - { - pixbuf = gdk_pixbuf_new_from_file(thumbname, NULL); - g_free(thumbname); - if (pixbuf) return(pixbuf); - } - } - if (!(rawfile = raw_open_file(src))) return(NULL); raw_init_file_tiff(rawfile, 0); Index: src/panasonic.h =================================================================== --- src/panasonic.h (revision 1864) +++ src/panasonic.h (working copy) @@ -18,5 +18,5 @@ */ extern void rs_panasonic_load_meta(const gchar *filename, RS_METADATA *meta); -extern GdkPixbuf *rs_panasonic_load_thumb(const gchar *src); +extern GdkPixbuf *rs_panasonic_load_thumb(const gchar *src, const gchar *thumbname); RS_PHOTO *rs_panasonic_load_photo(const gchar *filename); Index: src/tiff-meta.h =================================================================== --- src/tiff-meta.h (revision 1864) +++ src/tiff-meta.h (working copy) @@ -19,4 +19,4 @@ gboolean raw_ifd_walker(RAWFILE *rawfile, guint offset, RS_METADATA *meta); void rs_tiff_load_meta(const gchar *filename, RS_METADATA *meta); -GdkPixbuf *rs_tiff_load_thumb(const gchar *src); +GdkPixbuf *rs_tiff_load_thumb(const gchar *src, const gchar *thumbname); Index: src/mrw-meta.c =================================================================== --- src/mrw-meta.c (revision 1864) +++ src/mrw-meta.c (working copy) @@ -93,27 +93,15 @@ } GdkPixbuf * -rs_mrw_load_thumb(const gchar *src) +rs_mrw_load_thumb(const gchar *src, const gchar *thumbname) { RAWFILE *rawfile; GdkPixbuf *pixbuf=NULL, *pixbuf2=NULL; RS_METADATA meta; - gchar *thumbname; guint start=0, length=0; raw_init(); - thumbname = rs_thumb_get_name(src); - if (thumbname) - { - if (g_file_test(thumbname, G_FILE_TEST_EXISTS)) - { - pixbuf = gdk_pixbuf_new_from_file(thumbname, NULL); - g_free(thumbname); - if (pixbuf) return(pixbuf); - } - } - meta.thumbnail_start = 0; meta.thumbnail_length = 0; meta.preview_start = 0; Index: src/mrw-meta.h =================================================================== --- src/mrw-meta.h (revision 1864) +++ src/mrw-meta.h (working copy) @@ -21,6 +21,6 @@ #define MRW_META_H extern void rs_mrw_load_meta(const gchar *filename, RS_METADATA *meta); -extern GdkPixbuf *rs_mrw_load_thumb(const gchar *src); +extern GdkPixbuf *rs_mrw_load_thumb(const gchar *src, const gchar *thumbname); #endif Index: src/arch-x86.c =================================================================== --- src/arch-x86.c (revision 1864) +++ src/arch-x86.c (working copy) @@ -68,7 +68,7 @@ } /* Black and shift applier */ - if (cpuflags & _MMX) + if (cpuflags & _MMX && 0) { rs_photo_open_dcraw_apply_black_and_shift = rs_photo_open_dcraw_apply_black_and_shift_mmx; } Index: src/rs-store.c =================================================================== --- src/rs-store.c (revision 1864) +++ src/rs-store.c (working copy) @@ -843,9 +843,7 @@ { if (filetype->load) { - pixbuf = NULL; - if (filetype->thumb) - pixbuf = filetype->thumb(fullname); + pixbuf = rs_load_thumb(filetype, fullname); if (pixbuf==NULL) { pixbuf = missing_thumb; Index: src/ciff-meta.c =================================================================== --- src/ciff-meta.c (revision 1864) +++ src/ciff-meta.c (working copy) @@ -185,27 +185,15 @@ } GdkPixbuf * -rs_ciff_load_thumb(const gchar *src) +rs_ciff_load_thumb(const gchar *src, const gchar *thumbname) { GdkPixbuf *pixbuf = NULL, *pixbuf2 = NULL; gdouble ratio; guint start=0, length=0, root=0; RS_METADATA *m; RAWFILE *rawfile; - gchar *thumbname; raw_init(); - - thumbname = rs_thumb_get_name(src); - if (thumbname) - { - if (g_file_test(thumbname, G_FILE_TEST_EXISTS)) - { - pixbuf = gdk_pixbuf_new_from_file(thumbname, NULL); - g_free(thumbname); - if (pixbuf) return(pixbuf); - } - } rawfile = raw_open_file(src); if (!rawfile) return(NULL);
_______________________________________________ Rawstudio-dev mailing list [email protected] http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-dev
