@@ -351,6 +351,94 @@ set_row_data (GtkTreeStore *store, char *path, char *parent, const char *attribu
351351}
352352
353353#ifdef HAVE_EXIF
354+
355+ static const char *
356+ eom_exif_entry_get_value (ExifEntry * e ,
357+ char * buf ,
358+ guint n_buf )
359+ {
360+ ExifByteOrder bo ;
361+
362+ /* For now we only want to reformat some GPS values */
363+ if (G_LIKELY (exif_entry_get_ifd (e ) != EXIF_IFD_GPS ))
364+ return exif_entry_get_value (e , buf , n_buf );
365+
366+ bo = exif_data_get_byte_order (e -> parent -> parent );
367+
368+ /* Cast to number to avoid warnings about values not in enumeration */
369+ switch ((guint16 ) e -> tag ) {
370+ case EXIF_TAG_GPS_LATITUDE :
371+ case EXIF_TAG_GPS_LONGITUDE :
372+ {
373+ gsize rational_size ;
374+ ExifRational r ;
375+ gfloat h = 0. , m = 0. ;
376+
377+
378+ rational_size = exif_format_get_size (EXIF_FORMAT_RATIONAL );
379+ if (G_UNLIKELY (e -> components != 3 ||
380+ e -> format != EXIF_FORMAT_RATIONAL ))
381+ return exif_entry_get_value (e , buf , n_buf );
382+
383+ r = exif_get_rational (e -> data , bo );
384+ if (r .denominator != 0 )
385+ h = (gfloat )r .numerator / r .denominator ;
386+
387+ r = exif_get_rational (e -> data + rational_size , bo );
388+ if (r .denominator != 0 )
389+ m = (gfloat )r .numerator / (gfloat )r .denominator ;
390+
391+ r = exif_get_rational (e -> data + (2 * rational_size ),
392+ bo );
393+ if (r .numerator != 0 && r .denominator != 0 ) {
394+ gfloat s ;
395+
396+ s = (gfloat )r .numerator / (gfloat )r .denominator ;
397+ g_snprintf (buf , n_buf ,
398+ "%.0f° %.0f' %.2f\"" ,
399+ h , m , s );
400+ } else {
401+ g_snprintf (buf , n_buf ,
402+ "%.0f° %.2f'" ,
403+ h , m );
404+ }
405+
406+ break ;
407+ }
408+ case EXIF_TAG_GPS_LATITUDE_REF :
409+ case EXIF_TAG_GPS_LONGITUDE_REF :
410+ {
411+ if (G_UNLIKELY (e -> components != 2 ||
412+ e -> format != EXIF_FORMAT_ASCII ))
413+ return exif_entry_get_value (e , buf , n_buf );
414+
415+ switch (e -> data [0 ]) {
416+ case 'N' :
417+ g_snprintf (buf , n_buf , "%s" , _ ("North" ));
418+ break ;
419+ case 'E' :
420+ g_snprintf (buf , n_buf , "%s" , _ ("East" ));
421+ break ;
422+ case 'W' :
423+ g_snprintf (buf , n_buf , "%s" , _ ("West" ));
424+ break ;
425+ case 'S' :
426+ g_snprintf (buf , n_buf , "%s" , _ ("South" ));
427+ break ;
428+ default :
429+ return exif_entry_get_value (e , buf , n_buf );
430+ break ;
431+ }
432+ break ;
433+ }
434+ default :
435+ return exif_entry_get_value (e , buf , n_buf );
436+ break ;
437+ }
438+
439+ return buf ;
440+ }
441+
354442static void
355443exif_entry_cb (ExifEntry * entry , gpointer data )
356444{
@@ -374,7 +462,7 @@ exif_entry_cb (ExifEntry *entry, gpointer data)
374462 path ,
375463 NULL ,
376464 exif_tag_get_name_in_ifd (entry -> tag , ifd ),
377- exif_entry_get_value (entry , b , sizeof (b )));
465+ eom_exif_entry_get_value (entry , b , sizeof (b )));
378466 } else {
379467
380468 ExifMnoteData * mnote = (entry -> tag == EXIF_TAG_MAKER_NOTE ?
@@ -406,8 +494,8 @@ exif_entry_cb (ExifEntry *entry, gpointer data)
406494 NULL ,
407495 exif_categories [cat ].path ,
408496 exif_tag_get_name_in_ifd (entry -> tag , ifd ),
409- exif_entry_get_value (entry , b ,
410- sizeof (b )));
497+ eom_exif_entry_get_value (entry , b ,
498+ sizeof (b )));
411499
412500 g_hash_table_insert (priv -> id_path_hash ,
413501 GINT_TO_POINTER (entry -> tag ),
0 commit comments