comparison src/image-overlay.c @ 865:8d0c91a0f461

do not read keywords and comment between exif_read_fd and exif_free_fd calls (fd->exif does not have reference counting)
author nadvornik
date Fri, 27 Jun 2008 21:35:21 +0000
parents 30e1f4370215
children c879a9a4f186
comparison
equal deleted inserted replaced
864:f40509d56fe3 865:8d0c91a0f461
212 guint pos, prev; 212 guint pos, prev;
213 guint last; 213 guint last;
214 gchar *name, *data; 214 gchar *name, *data;
215 GString *new; 215 GString *new;
216 gchar *ret; 216 gchar *ret;
217 ExifData *exif;
218 217
219 if (!str || !*str) return g_strdup(""); 218 if (!str || !*str) return g_strdup("");
220 219
221 new = g_string_new(str); 220 new = g_string_new(str);
222 221
223 exif = exif_read_fd(imd->image_fd);
224 prev = 0; 222 prev = 0;
225 last = FALSE; 223 last = FALSE;
226 224
227 while (TRUE) 225 while (TRUE)
228 { 226 {
279 { 277 {
280 comment_read(imd->image_fd, NULL, &data); 278 comment_read(imd->image_fd, NULL, &data);
281 } 279 }
282 else 280 else
283 { 281 {
282 /*
283 keywords and comment can't be read between exif_read_fd and exif_free_fd calls
284 because fd->exif does not count references
285 on the other hand, it is OK to call it in the loop because it is cached
286 */
287
288 ExifData *exif;
289 exif = exif_read_fd(imd->image_fd);
290
284 data = g_strdup(g_hash_table_lookup(vars, name)); 291 data = g_strdup(g_hash_table_lookup(vars, name));
285 if (data && strcmp(name, "zoom") == 0) imd->overlay_show_zoom = TRUE; 292 if (data && strcmp(name, "zoom") == 0) imd->overlay_show_zoom = TRUE;
286 if (!data && exif) 293 if (!data && exif)
287 data = exif_get_data_as_text(exif, name); 294 data = exif_get_data_as_text(exif, name);
295 exif_free_fd(imd->image_fd, exif);
288 } 296 }
289 if (data && *data && limit > 0 && strlen(data) > limit + 3) 297 if (data && *data && limit > 0 && strlen(data) > limit + 3)
290 { 298 {
291 gchar *new_data = g_strdup_printf("%-*.*s...", limit, limit, data); 299 gchar *new_data = g_strdup_printf("%-*.*s...", limit, limit, data);
292 g_free(data); 300 g_free(data);
373 last = data ? TRUE : last; 381 last = data ? TRUE : last;
374 g_free(name); 382 g_free(name);
375 g_free(data); 383 g_free(data);
376 } 384 }
377 385
378 exif_free_fd(imd->image_fd, exif);
379 /* search and destroy empty lines */ 386 /* search and destroy empty lines */
380 end = new->str; 387 end = new->str;
381 while ((start = strchr(end, '\n'))) 388 while ((start = strchr(end, '\n')))
382 { 389 {
383 end = start; 390 end = start;