annotate src/exif-common.c @ 1686:59c72fd324ce

fixes for a built without Exiv2 don't try to access XMP metadata if not compiled with Exiv2 some metadata options are valid without Exiv2, do not disable them
author nadvornik
date Tue, 30 Jun 2009 20:12:28 +0000
parents 7cb24fdf07c0
children 956aab097ea7
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
1 /*
541
116346636d42 Replace GQView by Geeqie.
zas_
parents: 519
diff changeset
2 * Geeqie
116346636d42 Replace GQView by Geeqie.
zas_
parents: 519
diff changeset
3 * (C) 2006 John Ellis
1284
8b89e3ff286b Add year 2009 to copyright info everywhere.
zas_
parents: 1224
diff changeset
4 * Copyright (C) 2008 - 2009 The Geeqie Team
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
5 *
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
6 */
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
7
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
8 #ifdef HAVE_CONFIG_H
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
9 # include "config.h"
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
10 #endif
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
11
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
12 #include <stdio.h>
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
13 #include <string.h>
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
14 #include <fcntl.h>
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
15 #include <unistd.h>
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
16 #include <sys/types.h>
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
17 #include <sys/stat.h>
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
18 #include <sys/mman.h>
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
19 #include <math.h>
438
eff049b3d308 added fColorProfile pseudo-tag with detailed information
nadvornik
parents: 300
diff changeset
20
eff049b3d308 added fColorProfile pseudo-tag with detailed information
nadvornik
parents: 300
diff changeset
21 #ifdef HAVE_LCMS
eff049b3d308 added fColorProfile pseudo-tag with detailed information
nadvornik
parents: 300
diff changeset
22 /*** color support enabled ***/
eff049b3d308 added fColorProfile pseudo-tag with detailed information
nadvornik
parents: 300
diff changeset
23
eff049b3d308 added fColorProfile pseudo-tag with detailed information
nadvornik
parents: 300
diff changeset
24 #ifdef HAVE_LCMS_LCMS_H
eff049b3d308 added fColorProfile pseudo-tag with detailed information
nadvornik
parents: 300
diff changeset
25 #include <lcms/lcms.h>
eff049b3d308 added fColorProfile pseudo-tag with detailed information
nadvornik
parents: 300
diff changeset
26 #else
eff049b3d308 added fColorProfile pseudo-tag with detailed information
nadvornik
parents: 300
diff changeset
27 #include <lcms.h>
eff049b3d308 added fColorProfile pseudo-tag with detailed information
nadvornik
parents: 300
diff changeset
28 #endif
eff049b3d308 added fColorProfile pseudo-tag with detailed information
nadvornik
parents: 300
diff changeset
29 #endif
eff049b3d308 added fColorProfile pseudo-tag with detailed information
nadvornik
parents: 300
diff changeset
30
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
31 #include <glib.h>
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
32
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
33 #include "intl.h"
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
34
281
9995c5fb202a gqview.h -> main.h
zas_
parents: 239
diff changeset
35 #include "main.h"
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
36 #include "exif.h"
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
37
586
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents: 568
diff changeset
38 #include "filedata.h"
905688aa2317 split filelist.c to filefilter.c and filedata.c
nadvornik
parents: 568
diff changeset
39 #include "filefilter.h"
844
efed9a1520d6 implemented generic FileData cache
nadvornik
parents: 736
diff changeset
40 #include "filecache.h"
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
41 #include "format_raw.h"
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
42 #include "ui_fileops.h"
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1211
diff changeset
43 #include "cache.h"
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
44
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
45
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 985
diff changeset
46 static gdouble exif_rational_to_double(ExifRational *r, gint sign)
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
47 {
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
48 if (!r || r->den == 0.0) return 0.0;
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
49
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 985
diff changeset
50 if (sign) return (gdouble)((gint)r->num) / (gdouble)((gint)r->den);
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 985
diff changeset
51 return (gdouble)r->num / r->den;
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
52 }
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
53
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 985
diff changeset
54 static gdouble exif_get_rational_as_double(ExifData *exif, const gchar *key)
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
55 {
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
56 ExifRational *r;
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
57 gint sign;
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
58
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
59 r = exif_get_rational(exif, key, &sign);
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
60 return exif_rational_to_double(r, sign);
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
61 }
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
62
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
63 static GString *append_comma_text(GString *string, const gchar *text)
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
64 {
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
65 string = g_string_append(string, ", ");
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
66 string = g_string_append(string, text);
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
67
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
68 return string;
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
69 }
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
70
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 212
diff changeset
71 static gchar *remove_common_prefix(gchar *s, gchar *t)
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 212
diff changeset
72 {
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 212
diff changeset
73 gint i;
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 212
diff changeset
74
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 212
diff changeset
75 if (!s || !t) return t;
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 212
diff changeset
76
297
76cdc3f1fe34 Fix broken remove_common_prefix(), fCamera didn't display model as it should.
zas_
parents: 281
diff changeset
77 for (i = 0; s[i] && t[i] && s[i] == t[i]; i++)
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 212
diff changeset
78 ;
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 438
diff changeset
79 if (!i)
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 212
diff changeset
80 return t;
300
bda275cf9821 Fix fCamera even more.
zas_
parents: 297
diff changeset
81 if (s[i-1] == ' ' || !s[i])
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 212
diff changeset
82 {
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 212
diff changeset
83 while (t[i] == ' ')
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 212
diff changeset
84 i++;
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 212
diff changeset
85 return t + i;
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 212
diff changeset
86 }
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 212
diff changeset
87 return s;
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 212
diff changeset
88 }
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 212
diff changeset
89
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 985
diff changeset
90 static gdouble get_crop_factor(ExifData *exif)
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 212
diff changeset
91 {
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 985
diff changeset
92 gdouble res_unit_tbl[] = {0.0, 25.4, 25.4, 10.0, 1.0, 0.001 };
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 985
diff changeset
93 gdouble xres = exif_get_rational_as_double(exif, "Exif.Photo.FocalPlaneXResolution");
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 985
diff changeset
94 gdouble yres = exif_get_rational_as_double(exif, "Exif.Photo.FocalPlaneYResolution");
922
826d5862f671 Minor tidy up.
zas_
parents: 844
diff changeset
95 gint res_unit;
826d5862f671 Minor tidy up.
zas_
parents: 844
diff changeset
96 gint w, h;
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 985
diff changeset
97 gdouble xsize, ysize, size, ratio;
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 438
diff changeset
98
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 438
diff changeset
99 if (xres == 0.0 || yres == 0.0) return 0.0;
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 438
diff changeset
100
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 438
diff changeset
101 if (!exif_get_integer(exif, "Exif.Photo.FocalPlaneResolutionUnit", &res_unit)) return 0.0;
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 438
diff changeset
102 if (res_unit < 1 || res_unit > 5) return 0.0;
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 212
diff changeset
103
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 438
diff changeset
104 if (!exif_get_integer(exif, "Exif.Photo.PixelXDimension", &w)) return 0.0;
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 438
diff changeset
105 if (!exif_get_integer(exif, "Exif.Photo.PixelYDimension", &h)) return 0.0;
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 438
diff changeset
106
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 438
diff changeset
107 xsize = w * res_unit_tbl[res_unit] / xres;
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 438
diff changeset
108 ysize = h * res_unit_tbl[res_unit] / yres;
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 438
diff changeset
109
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 438
diff changeset
110 ratio = xsize / ysize;
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 438
diff changeset
111
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 438
diff changeset
112 if (ratio < 0.5 || ratio > 2.0) return 0.0; /* reasonable ratio */
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 438
diff changeset
113
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 438
diff changeset
114 size = sqrt(xsize * xsize + ysize * ysize);
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 438
diff changeset
115
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 438
diff changeset
116 if (size < 1.0 || size > 100.0) return 0.0; /* reasonable sensor size in mm */
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 438
diff changeset
117
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 438
diff changeset
118 return sqrt(36*36+24*24) / size;
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 438
diff changeset
119
222
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 212
diff changeset
120 }
77f1bcc6c161 various exif improvements based on patch by Uwe Ohse
nadvornik
parents: 212
diff changeset
121
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1361
diff changeset
122 static gboolean remove_suffix(gchar *str, const gchar *suffix, gint suffix_len)
519
a1267c00e058 Cleanup exif_get_formatted_by_key().
zas_
parents: 516
diff changeset
123 {
a1267c00e058 Cleanup exif_get_formatted_by_key().
zas_
parents: 516
diff changeset
124 gint str_len = strlen(str);
a1267c00e058 Cleanup exif_get_formatted_by_key().
zas_
parents: 516
diff changeset
125
a1267c00e058 Cleanup exif_get_formatted_by_key().
zas_
parents: 516
diff changeset
126 if (suffix_len < 0) suffix_len = strlen(suffix);
a1267c00e058 Cleanup exif_get_formatted_by_key().
zas_
parents: 516
diff changeset
127 if (str_len < suffix_len) return FALSE;
a1267c00e058 Cleanup exif_get_formatted_by_key().
zas_
parents: 516
diff changeset
128
922
826d5862f671 Minor tidy up.
zas_
parents: 844
diff changeset
129 if (strcmp(str + str_len - suffix_len, suffix) != 0) return FALSE;
519
a1267c00e058 Cleanup exif_get_formatted_by_key().
zas_
parents: 516
diff changeset
130 str[str_len - suffix_len] = '\0';
a1267c00e058 Cleanup exif_get_formatted_by_key().
zas_
parents: 516
diff changeset
131
a1267c00e058 Cleanup exif_get_formatted_by_key().
zas_
parents: 516
diff changeset
132 return TRUE;
a1267c00e058 Cleanup exif_get_formatted_by_key().
zas_
parents: 516
diff changeset
133 }
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
134
566
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
135 static gchar *exif_build_formatted_Camera(ExifData *exif)
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
136 {
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
137 gchar *text;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
138 gchar *make = exif_get_data_as_text(exif, "Exif.Image.Make");
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
139 gchar *model = exif_get_data_as_text(exif, "Exif.Image.Model");
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
140 gchar *software = exif_get_data_as_text(exif, "Exif.Image.Software");
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
141 gchar *model2;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
142 gchar *software2;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
143
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
144 if (make)
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
145 {
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
146 g_strstrip(make);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
147
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
148 if (remove_suffix(make, " CORPORATION", 12)) { /* Nikon */ }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
149 else if (remove_suffix(make, " Corporation", 12)) { /* Pentax */ }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
150 else if (remove_suffix(make, " OPTICAL CO.,LTD", 16)) { /* OLYMPUS */ };
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
151 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
152
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
153 if (model)
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
154 g_strstrip(model);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
155
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
156 if (software)
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
157 {
985
8cef771ff0fb Minor optimization: no need to copy the whole remaining of the string, just copy next char.
zas_
parents: 922
diff changeset
158 gint i, j;
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
159
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
160 g_strstrip(software);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
161
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
162 /* remove superfluous spaces (pentax K100D) */
985
8cef771ff0fb Minor optimization: no need to copy the whole remaining of the string, just copy next char.
zas_
parents: 922
diff changeset
163 for (i = 0, j = 0; software[i]; i++, j++)
8cef771ff0fb Minor optimization: no need to copy the whole remaining of the string, just copy next char.
zas_
parents: 922
diff changeset
164 {
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
165 if (software[i] == ' ' && software[i + 1] == ' ')
985
8cef771ff0fb Minor optimization: no need to copy the whole remaining of the string, just copy next char.
zas_
parents: 922
diff changeset
166 i++;
8cef771ff0fb Minor optimization: no need to copy the whole remaining of the string, just copy next char.
zas_
parents: 922
diff changeset
167 if (i != j) software[j] = software[i];
8cef771ff0fb Minor optimization: no need to copy the whole remaining of the string, just copy next char.
zas_
parents: 922
diff changeset
168 }
8cef771ff0fb Minor optimization: no need to copy the whole remaining of the string, just copy next char.
zas_
parents: 922
diff changeset
169 software[j] = '\0';
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
170 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
171
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
172 model2 = remove_common_prefix(make, model);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
173 software2 = remove_common_prefix(model2, software);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
174
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
175 text = g_strdup_printf("%s%s%s%s%s%s", (make) ? make : "", (make && model2) ? " " : "",
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
176 (model2) ? model2 : "",
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
177 (software2 && (make || model2)) ? " (" : "",
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
178 (software2) ? software2 : "",
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
179 (software2 && (make || model2)) ? ")" : "");
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
180
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
181 g_free(make);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
182 g_free(model);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
183 g_free(software);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
184 return text;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
185 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
186
566
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
187 static gchar *exif_build_formatted_DateTime(ExifData *exif)
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
188 {
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
189 gchar *text = exif_get_data_as_text(exif, "Exif.Photo.DateTimeOriginal");
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
190 gchar *subsec = NULL;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
191
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1361
diff changeset
192 if (text)
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1361
diff changeset
193 {
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1361
diff changeset
194 subsec = exif_get_data_as_text(exif, "Exif.Photo.SubSecTimeOriginal");
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1361
diff changeset
195 }
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1361
diff changeset
196 else
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
197 {
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
198 text = exif_get_data_as_text(exif, "Exif.Image.DateTime");
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
199 if (text) subsec = exif_get_data_as_text(exif, "Exif.Photo.SubSecTime");
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
200 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
201 if (subsec)
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
202 {
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
203 gchar *tmp = text;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
204 text = g_strconcat(tmp, ".", subsec, NULL);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
205 g_free(tmp);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
206 g_free(subsec);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
207 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
208 return text;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
209 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
210
566
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
211 static gchar *exif_build_formatted_ShutterSpeed(ExifData *exif)
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
212 {
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
213 ExifRational *r;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
214
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
215 r = exif_get_rational(exif, "Exif.Photo.ExposureTime", NULL);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
216 if (r && r->num && r->den)
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
217 {
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 985
diff changeset
218 gdouble n = (gdouble)r->den / (gdouble)r->num;
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
219 return g_strdup_printf("%s%.0fs", n > 1.0 ? "1/" : "",
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
220 n > 1.0 ? n : 1.0 / n);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
221 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
222 r = exif_get_rational(exif, "Exif.Photo.ShutterSpeedValue", NULL);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
223 if (r && r->num && r->den)
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
224 {
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 985
diff changeset
225 gdouble n = pow(2.0, exif_rational_to_double(r, TRUE));
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
226
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
227 /* Correct exposure time to avoid values like 1/91s (seen on Minolta DImage 7) */
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 985
diff changeset
228 if (n > 1.0 && (gint)n - ((gint)(n/10))*10 == 1) n--;
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
229
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
230 return g_strdup_printf("%s%.0fs", n > 1.0 ? "1/" : "",
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
231 n > 1.0 ? floor(n) : 1.0 / n);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
232 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
233 return NULL;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
234 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
235
566
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
236 static gchar *exif_build_formatted_Aperture(ExifData *exif)
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
237 {
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 985
diff changeset
238 gdouble n;
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
239
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
240 n = exif_get_rational_as_double(exif, "Exif.Photo.FNumber");
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
241 if (n == 0.0) n = exif_get_rational_as_double(exif, "Exif.Photo.ApertureValue");
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
242 if (n == 0.0) return NULL;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
243
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
244 return g_strdup_printf("f/%.1f", n);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
245 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
246
566
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
247 static gchar *exif_build_formatted_ExposureBias(ExifData *exif)
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
248 {
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
249 ExifRational *r;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
250 gint sign;
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 985
diff changeset
251 gdouble n;
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
252
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
253 r = exif_get_rational(exif, "Exif.Photo.ExposureBiasValue", &sign);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
254 if (!r) return NULL;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
255
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
256 n = exif_rational_to_double(r, sign);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
257 return g_strdup_printf("%+.1f", n);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
258 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
259
566
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
260 static gchar *exif_build_formatted_FocalLength(ExifData *exif)
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
261 {
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 985
diff changeset
262 gdouble n;
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
263
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
264 n = exif_get_rational_as_double(exif, "Exif.Photo.FocalLength");
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
265 if (n == 0.0) return NULL;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
266 return g_strdup_printf("%.0f mm", n);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
267 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
268
566
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
269 static gchar *exif_build_formatted_FocalLength35mmFilm(ExifData *exif)
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
270 {
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
271 gint n;
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 985
diff changeset
272 gdouble f, c;
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
273
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
274 if (exif_get_integer(exif, "Exif.Photo.FocalLengthIn35mmFilm", &n) && n != 0)
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
275 {
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
276 return g_strdup_printf("%d mm", n);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
277 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
278
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
279 f = exif_get_rational_as_double(exif, "Exif.Photo.FocalLength");
922
826d5862f671 Minor tidy up.
zas_
parents: 844
diff changeset
280 if (f == 0.0) return NULL;
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
281
922
826d5862f671 Minor tidy up.
zas_
parents: 844
diff changeset
282 c = get_crop_factor(exif);
826d5862f671 Minor tidy up.
zas_
parents: 844
diff changeset
283 if (c == 0.0) return NULL;
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
284
922
826d5862f671 Minor tidy up.
zas_
parents: 844
diff changeset
285 return g_strdup_printf("%.0f mm", f * c);
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
286 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
287
566
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
288 static gchar *exif_build_formatted_ISOSpeedRating(ExifData *exif)
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
289 {
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
290 gchar *text;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
291
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
292 text = exif_get_data_as_text(exif, "Exif.Photo.ISOSpeedRatings");
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
293 /* kodak may set this instead */
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
294 if (!text) text = exif_get_data_as_text(exif, "Exif.Photo.ExposureIndex");
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
295 return text;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
296 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
297
566
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
298 static gchar *exif_build_formatted_SubjectDistance(ExifData *exif)
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
299 {
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
300 ExifRational *r;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
301 gint sign;
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 985
diff changeset
302 gdouble n;
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
303
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
304 r = exif_get_rational(exif, "Exif.Photo.SubjectDistance", &sign);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
305 if (!r) return NULL;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
306
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 985
diff changeset
307 if ((glong)r->num == (glong)0xffffffff) return g_strdup(_("infinity"));
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 985
diff changeset
308 if ((glong)r->num == 0) return g_strdup(_("unknown"));
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
309
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
310 n = exif_rational_to_double(r, sign);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
311 if (n == 0.0) return _("unknown");
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
312 return g_strdup_printf("%.3f m", n);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
313 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
314
566
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
315 static gchar *exif_build_formatted_Flash(ExifData *exif)
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
316 {
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
317 /* grr, flash is a bitmask... */
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
318 GString *string;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
319 gchar *text;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
320 gint n;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
321 gint v;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
322
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
323 if (!exif_get_integer(exif, "Exif.Photo.Flash", &n)) return NULL;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
324
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
325 /* Exif 2.1 only defines first 3 bits */
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
326 if (n <= 0x07) return exif_get_data_as_text(exif, "Exif.Photo.Flash");
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
327
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
328 /* must be Exif 2.2 */
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
329 string = g_string_new("");
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
330
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
331 /* flash fired (bit 0) */
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
332 string = g_string_append(string, (n & 0x01) ? _("yes") : _("no"));
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
333
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
334 /* flash mode (bits 3, 4) */
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
335 v = (n >> 3) & 0x03;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
336 if (v) string = append_comma_text(string, _("mode:"));
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
337 switch (v)
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
338 {
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
339 case 1:
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
340 string = g_string_append(string, _("on"));
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
341 break;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
342 case 2:
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
343 string = g_string_append(string, _("off"));
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
344 break;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
345 case 3:
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
346 string = g_string_append(string, _("auto"));
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
347 break;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
348 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
349
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
350 /* return light (bits 1, 2) */
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
351 v = (n >> 1) & 0x03;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
352 if (v == 2) string = append_comma_text(string, _("not detected by strobe"));
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
353 if (v == 3) string = append_comma_text(string, _("detected by strobe"));
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
354
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
355 /* we ignore flash function (bit 5) */
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
356
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
357 /* red-eye (bit 6) */
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
358 if ((n >> 5) & 0x01) string = append_comma_text(string, _("red-eye reduction"));
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
359
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
360 text = string->str;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
361 g_string_free(string, FALSE);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
362 return text;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
363 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
364
566
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
365 static gchar *exif_build_formatted_Resolution(ExifData *exif)
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
366 {
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
367 ExifRational *rx, *ry;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
368 gchar *units;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
369 gchar *text;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
370
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
371 rx = exif_get_rational(exif, "Exif.Image.XResolution", NULL);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
372 ry = exif_get_rational(exif, "Exif.Image.YResolution", NULL);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
373 if (!rx || !ry) return NULL;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
374
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
375 units = exif_get_data_as_text(exif, "Exif.Image.ResolutionUnit");
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 985
diff changeset
376 text = g_strdup_printf("%0.f x %0.f (%s/%s)", rx->den ? (gdouble)rx->num / rx->den : 1.0,
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 985
diff changeset
377 ry->den ? (gdouble)ry->num / ry->den : 1.0,
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
378 _("dot"), (units) ? units : _("unknown"));
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
379
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
380 g_free(units);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
381 return text;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
382 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
383
566
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
384 static gchar *exif_build_formatted_ColorProfile(ExifData *exif)
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
385 {
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
386 const gchar *name = "";
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
387 const gchar *source = "";
922
826d5862f671 Minor tidy up.
zas_
parents: 844
diff changeset
388 guchar *profile_data;
546
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
389 guint profile_len;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
390
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
391 profile_data = exif_get_color_profile(exif, &profile_len);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
392 if (!profile_data)
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
393 {
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
394 gint cs;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
395 gchar *interop_index;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
396
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
397 /* ColorSpace == 1 specifies sRGB per EXIF 2.2 */
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
398 if (!exif_get_integer(exif, "Exif.Photo.ColorSpace", &cs)) cs = 0;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
399 interop_index = exif_get_data_as_text(exif, "Exif.Iop.InteroperabilityIndex");
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
400
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
401 if (cs == 1)
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
402 {
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
403 name = _("sRGB");
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
404 source = "ColorSpace";
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
405 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
406 else if (cs == 2 || (interop_index && !strcmp(interop_index, "R03")))
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
407 {
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
408 name = _("AdobeRGB");
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
409 source = (cs == 2) ? "ColorSpace" : "Iop";
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
410 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
411
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
412 g_free(interop_index);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
413 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
414 else
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
415 {
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
416 source = _("embedded");
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
417 #ifdef HAVE_LCMS
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
418
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
419 {
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
420 cmsHPROFILE profile;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
421
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
422 profile = cmsOpenProfileFromMem(profile_data, profile_len);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
423 if (profile)
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
424 {
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
425 name = cmsTakeProductName(profile);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
426 cmsCloseProfile(profile);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
427 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
428 g_free(profile_data);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
429 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
430 #endif
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
431 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
432 if (name[0] == 0 && source[0] == 0) return NULL;
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
433 return g_strdup_printf("%s (%s)", name, source);
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
434 }
f852eb277913 Explode exif_get_formatted_by_key() in smaller functions prefixed "exif_build_f".
zas_
parents: 542
diff changeset
435
1052
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
436 static gchar *exif_build_formatted_GPSPosition(ExifData *exif)
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
437 {
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
438 GString *string;
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
439 gchar *text, *ref;
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
440 ExifRational *value;
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
441 ExifItem *item;
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
442 guint i;
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
443 gdouble p, p3;
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
444 gulong p1, p2;
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
445
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
446 string = g_string_new("");
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
447
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
448 item = exif_get_item(exif, "Exif.GPSInfo.GPSLatitude");
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
449 ref = exif_get_data_as_text(exif, "Exif.GPSInfo.GPSLatitudeRef");
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
450 if (item && ref)
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
451 {
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
452 p = 0;
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
453 for (i = 0; i < exif_item_get_elements(item); i++)
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
454 {
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
455 value = exif_item_get_rational(item, NULL, i);
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
456 if (value && value->num && value->den)
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
457 p += (gdouble)value->num / (gdouble)value->den / pow(60.0, (gdouble)i);
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
458 }
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
459 p1 = (gint)p;
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
460 p2 = (gint)((p - p1)*60);
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
461 p3 = ((p - p1)*60 - p2)*60;
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
462
1164
3692efcbd325 Fix compilation warnings.
zas_
parents: 1056
diff changeset
463 g_string_append_printf(string, "%0lu° %0lu' %0.2f\" %.1s", p1, p2, p3, ref);
1052
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
464 } // if (item && ref)
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
465
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
466 item = exif_get_item(exif, "Exif.GPSInfo.GPSLongitude");
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
467 ref = exif_get_data_as_text(exif, "Exif.GPSInfo.GPSLongitudeRef");
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
468 if (item && ref)
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
469 {
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
470 p = 0;
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
471 for (i = 0; i < exif_item_get_elements(item); i++)
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
472 {
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
473 value = exif_item_get_rational(item, NULL, i);
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
474 if (value && value->num && value->den)
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
475 p += (gdouble)value->num / (gdouble)value->den / pow(60.0, (gdouble)i);
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
476 }
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
477 p1 = (gint)p;
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
478 p2 = (gint)((p - p1)*60);
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
479 p3 = ((p - p1)*60 - p2)*60;
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
480
1164
3692efcbd325 Fix compilation warnings.
zas_
parents: 1056
diff changeset
481 g_string_append_printf(string, ", %0lu° %0lu' %0.2f\" %.1s", p1, p2, p3, ref);
1052
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
482 } // if (item && ref)
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
483
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
484 text = string->str;
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
485 g_string_free(string, FALSE);
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
486
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
487 return text;
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
488 } // static gchar *exif_build_forma...
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
489
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
490 static gchar *exif_build_formatted_GPSAltitude(ExifData *exif)
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
491 {
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
492 ExifRational *r;
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
493 ExifItem *item;
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
494 gdouble alt;
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
495 gint ref;
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
496
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
497 item = exif_get_item(exif, "Exif.GPSInfo.GPSAltitudeRef");
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
498 r = exif_get_rational(exif, "Exif.GPSInfo.GPSAltitude", NULL);
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
499
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
500 if (!r || !item) return NULL;
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
501
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
502 alt = exif_rational_to_double(r, 0);
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
503 exif_item_get_integer(item, &ref);
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
504
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
505 return g_strdup_printf("%0.f m %s", alt, (ref==0)?_("Above Sea Level"):_("Below Sea Level"));
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
506 }
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
507
548
7ada6e5d4de8 Add a pointer to the build function in the formatted exif tags struct
zas_
parents: 547
diff changeset
508
7ada6e5d4de8 Add a pointer to the build function in the formatted exif tags struct
zas_
parents: 547
diff changeset
509 /* List of custom formatted pseudo-exif tags */
1189
9e424170e958 Do not hardcode exif formatted prefix.
zas_
parents: 1164
diff changeset
510 #define EXIF_FORMATTED_TAG(name, label) { EXIF_FORMATTED()#name, label, exif_build_formatted##_##name }
548
7ada6e5d4de8 Add a pointer to the build function in the formatted exif tags struct
zas_
parents: 547
diff changeset
511
7ada6e5d4de8 Add a pointer to the build function in the formatted exif tags struct
zas_
parents: 547
diff changeset
512 ExifFormattedText ExifFormattedList[] = {
566
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
513 EXIF_FORMATTED_TAG(Camera, N_("Camera")),
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
514 EXIF_FORMATTED_TAG(DateTime, N_("Date")),
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
515 EXIF_FORMATTED_TAG(ShutterSpeed, N_("Shutter speed")),
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
516 EXIF_FORMATTED_TAG(Aperture, N_("Aperture")),
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
517 EXIF_FORMATTED_TAG(ExposureBias, N_("Exposure bias")),
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
518 EXIF_FORMATTED_TAG(ISOSpeedRating, N_("ISO sensitivity")),
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
519 EXIF_FORMATTED_TAG(FocalLength, N_("Focal length")),
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
520 EXIF_FORMATTED_TAG(FocalLength35mmFilm, N_("Focal length 35mm")),
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
521 EXIF_FORMATTED_TAG(SubjectDistance, N_("Subject distance")),
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
522 EXIF_FORMATTED_TAG(Flash, N_("Flash")),
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
523 EXIF_FORMATTED_TAG(Resolution, N_("Resolution")),
db08ccd54169 Change the prefix of formatted exif tags to a more explicit "formatted." prefix
zas_
parents: 552
diff changeset
524 EXIF_FORMATTED_TAG(ColorProfile, N_("Color profile")),
1052
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
525 EXIF_FORMATTED_TAG(GPSPosition, N_("GPS position")),
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
526 EXIF_FORMATTED_TAG(GPSAltitude, N_("GPS altitude")),
1483
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
527 {"file.size", N_("File size"), NULL},
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
528 {"file.date", N_("File date"), NULL},
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
529 {"file.mode", N_("File mode"), NULL},
548
7ada6e5d4de8 Add a pointer to the build function in the formatted exif tags struct
zas_
parents: 547
diff changeset
530 { NULL, NULL, NULL }
7ada6e5d4de8 Add a pointer to the build function in the formatted exif tags struct
zas_
parents: 547
diff changeset
531 };
7ada6e5d4de8 Add a pointer to the build function in the formatted exif tags struct
zas_
parents: 547
diff changeset
532
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1361
diff changeset
533 gchar *exif_get_formatted_by_key(ExifData *exif, const gchar *key, gboolean *key_valid)
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
534 {
1189
9e424170e958 Do not hardcode exif formatted prefix.
zas_
parents: 1164
diff changeset
535 if (strncmp(key, EXIF_FORMATTED(), EXIF_FORMATTED_LEN) == 0)
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
536 {
548
7ada6e5d4de8 Add a pointer to the build function in the formatted exif tags struct
zas_
parents: 547
diff changeset
537 gint i;
442
4b2d7f9af171 Big whitespaces cleanup:
zas_
parents: 438
diff changeset
538
548
7ada6e5d4de8 Add a pointer to the build function in the formatted exif tags struct
zas_
parents: 547
diff changeset
539 if (key_valid) *key_valid = TRUE;
7ada6e5d4de8 Add a pointer to the build function in the formatted exif tags struct
zas_
parents: 547
diff changeset
540
1189
9e424170e958 Do not hardcode exif formatted prefix.
zas_
parents: 1164
diff changeset
541 key += EXIF_FORMATTED_LEN;
548
7ada6e5d4de8 Add a pointer to the build function in the formatted exif tags struct
zas_
parents: 547
diff changeset
542 for (i = 0; ExifFormattedList[i].key; i++)
1483
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
543 if (ExifFormattedList[i].build_func && strcmp(key, ExifFormattedList[i].key + EXIF_FORMATTED_LEN) == 0)
548
7ada6e5d4de8 Add a pointer to the build function in the formatted exif tags struct
zas_
parents: 547
diff changeset
544 return ExifFormattedList[i].build_func(exif);
7ada6e5d4de8 Add a pointer to the build function in the formatted exif tags struct
zas_
parents: 547
diff changeset
545 }
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
546
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
547 if (key_valid) *key_valid = FALSE;
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
548 return NULL;
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
549 }
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
550
1053
77ca9a5d42be fixed charset of exiv2 strings in non-utf8 locales
nadvornik
parents: 1052
diff changeset
551 gchar *exif_get_description_by_key(const gchar *key)
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
552 {
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
553 if (!key) return NULL;
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
554
1483
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
555 if (strncmp(key, EXIF_FORMATTED(), EXIF_FORMATTED_LEN) == 0 ||
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
556 strncmp(key, "file.", 5) == 0)
568
04d4bdf5a2d8 exif_get_description_by_key(): check for "formatted." prefix, and optimize.
zas_
parents: 567
diff changeset
557 {
922
826d5862f671 Minor tidy up.
zas_
parents: 844
diff changeset
558 gint i;
826d5862f671 Minor tidy up.
zas_
parents: 844
diff changeset
559
568
04d4bdf5a2d8 exif_get_description_by_key(): check for "formatted." prefix, and optimize.
zas_
parents: 567
diff changeset
560 for (i = 0; ExifFormattedList[i].key; i++)
1483
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
561 if (strcmp(key, ExifFormattedList[i].key) == 0)
1053
77ca9a5d42be fixed charset of exiv2 strings in non-utf8 locales
nadvornik
parents: 1052
diff changeset
562 return g_strdup(_(ExifFormattedList[i].description));
568
04d4bdf5a2d8 exif_get_description_by_key(): check for "formatted." prefix, and optimize.
zas_
parents: 567
diff changeset
563 }
182
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
564
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
565 return exif_get_tag_description_by_key(key);
8a417f10ba09 more exiv2 fixes
nadvornik
parents:
diff changeset
566 }
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
567
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
568 gint exif_get_integer(ExifData *exif, const gchar *key, gint *value)
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
569 {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
570 ExifItem *item;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
571
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
572 item = exif_get_item(exif, key);
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
573 return exif_item_get_integer(item, value);
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
574 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
575
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
576 ExifRational *exif_get_rational(ExifData *exif, const gchar *key, gint *sign)
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
577 {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
578 ExifItem *item;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
579
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
580 item = exif_get_item(exif, key);
1052
338c21c87ff5 Add support for GPSInfo - patch by Klaus Ethgen
nadvornik
parents: 1000
diff changeset
581 return exif_item_get_rational(item, sign, 0);
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
582 }
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
583
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
584 gchar *exif_get_data_as_text(ExifData *exif, const gchar *key)
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
585 {
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
586 ExifItem *item;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
587 gchar *text;
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1361
diff changeset
588 gboolean key_valid;
184
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
589
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
590 if (!key) return NULL;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
591
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
592 text = exif_get_formatted_by_key(exif, key, &key_valid);
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
593 if (key_valid) return text;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
594
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
595 item = exif_get_item(exif, key);
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
596 if (item) return exif_item_get_data_as_text(item);
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
597
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
598 return NULL;
2507418ab7a2 more exiv2 fixes
nadvornik
parents: 182
diff changeset
599 }
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 184
diff changeset
600
844
efed9a1520d6 implemented generic FileData cache
nadvornik
parents: 736
diff changeset
601
efed9a1520d6 implemented generic FileData cache
nadvornik
parents: 736
diff changeset
602 static FileCacheData *exif_cache;
efed9a1520d6 implemented generic FileData cache
nadvornik
parents: 736
diff changeset
603
efed9a1520d6 implemented generic FileData cache
nadvornik
parents: 736
diff changeset
604 void exif_release_cb(FileData *fd)
efed9a1520d6 implemented generic FileData cache
nadvornik
parents: 736
diff changeset
605 {
efed9a1520d6 implemented generic FileData cache
nadvornik
parents: 736
diff changeset
606 exif_free(fd->exif);
efed9a1520d6 implemented generic FileData cache
nadvornik
parents: 736
diff changeset
607 fd->exif = NULL;
efed9a1520d6 implemented generic FileData cache
nadvornik
parents: 736
diff changeset
608 }
efed9a1520d6 implemented generic FileData cache
nadvornik
parents: 736
diff changeset
609
449
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
610 ExifData *exif_read_fd(FileData *fd)
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 184
diff changeset
611 {
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1211
diff changeset
612 gchar *sidecar_path;
190
c2923efebfdc whitelist of files that can have an xmp sidecar, sample external command
nadvornik
parents: 188
diff changeset
613
1361
84422bb8181b Only attempt to read exif if the file is readable.
zas_
parents: 1284
diff changeset
614 if (!fd || !is_readable_file(fd->path)) return NULL;
844
efed9a1520d6 implemented generic FileData cache
nadvornik
parents: 736
diff changeset
615
efed9a1520d6 implemented generic FileData cache
nadvornik
parents: 736
diff changeset
616 if (!exif_cache) exif_cache = file_cache_new(exif_release_cb, 4);
efed9a1520d6 implemented generic FileData cache
nadvornik
parents: 736
diff changeset
617
efed9a1520d6 implemented generic FileData cache
nadvornik
parents: 736
diff changeset
618 if (file_cache_get(exif_cache, fd)) return fd->exif;
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1211
diff changeset
619
ebfd305d902e improved sidecar writting
nadvornik
parents: 1211
diff changeset
620 /* CACHE_TYPE_XMP_METADATA file should exist only if the metadata are
ebfd305d902e improved sidecar writting
nadvornik
parents: 1211
diff changeset
621 * not writable directly, thus it should contain the most up-to-date version */
1686
59c72fd324ce fixes for a built without Exiv2
nadvornik
parents: 1483
diff changeset
622 sidecar_path = NULL;
59c72fd324ce fixes for a built without Exiv2
nadvornik
parents: 1483
diff changeset
623
59c72fd324ce fixes for a built without Exiv2
nadvornik
parents: 1483
diff changeset
624 #ifdef HAVE_EXIV2
59c72fd324ce fixes for a built without Exiv2
nadvornik
parents: 1483
diff changeset
625 /* we are not able to handle XMP sidecars without exiv2 */
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1211
diff changeset
626 sidecar_path = cache_find_location(CACHE_TYPE_XMP_METADATA, fd->path);
204
d662d680250d improved xmp vs. legacy metadata handling
nadvornik
parents: 190
diff changeset
627
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1211
diff changeset
628 if (!sidecar_path) sidecar_path = file_data_get_sidecar_path(fd, TRUE);
1686
59c72fd324ce fixes for a built without Exiv2
nadvornik
parents: 1483
diff changeset
629 #endif
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 184
diff changeset
630
1203
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1189
diff changeset
631 fd->exif = exif_read(fd->path, sidecar_path, fd->modified_xmp);
1224
ebfd305d902e improved sidecar writting
nadvornik
parents: 1211
diff changeset
632
ebfd305d902e improved sidecar writting
nadvornik
parents: 1211
diff changeset
633 g_free(sidecar_path);
844
efed9a1520d6 implemented generic FileData cache
nadvornik
parents: 736
diff changeset
634 return fd->exif;
449
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
635 }
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
636
1203
43bfcbb62cd6 prepared infrastructure for delayed metadata writting - refreshing
nadvornik
parents: 1189
diff changeset
637
844
efed9a1520d6 implemented generic FileData cache
nadvornik
parents: 736
diff changeset
638 void exif_free_fd(FileData *fd, ExifData *exif)
efed9a1520d6 implemented generic FileData cache
nadvornik
parents: 736
diff changeset
639 {
efed9a1520d6 implemented generic FileData cache
nadvornik
parents: 736
diff changeset
640 if (!fd) return;
efed9a1520d6 implemented generic FileData cache
nadvornik
parents: 736
diff changeset
641 g_assert(fd->exif == exif);
efed9a1520d6 implemented generic FileData cache
nadvornik
parents: 736
diff changeset
642
efed9a1520d6 implemented generic FileData cache
nadvornik
parents: 736
diff changeset
643 file_cache_put(exif_cache, fd, 1);
efed9a1520d6 implemented generic FileData cache
nadvornik
parents: 736
diff changeset
644 }
449
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
645
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
646 /* embedded icc in jpeg */
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
647
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
648
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
649 #define JPEG_MARKER 0xFF
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
650 #define JPEG_MARKER_SOI 0xD8
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
651 #define JPEG_MARKER_EOI 0xD9
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
652 #define JPEG_MARKER_APP1 0xE1
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
653 #define JPEG_MARKER_APP2 0xE2
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
654
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
655 /* jpeg container format:
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
656 all data markers start with 0XFF
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
657 2 byte long file start and end markers: 0xFFD8(SOI) and 0XFFD9(EOI)
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
658 4 byte long data segment markers in format: 0xFFTTSSSSNNN...
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
659 FF: 1 byte standard marker identifier
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
660 TT: 1 byte data type
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
661 SSSS: 2 bytes in Motorola byte alignment for length of the data.
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
662 This value includes these 2 bytes in the count, making actual
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
663 length of NN... == SSSS - 2.
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
664 NNN.: the data in this segment
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
665 */
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
666
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1361
diff changeset
667 gboolean exif_jpeg_segment_find(guchar *data, guint size,
547
95e0449d8f29 Indentation fix.
zas_
parents: 546
diff changeset
668 guchar app_marker, const gchar *magic, guint magic_len,
95e0449d8f29 Indentation fix.
zas_
parents: 546
diff changeset
669 guint *seg_offset, guint *seg_length)
449
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
670 {
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
671 guchar marker = 0;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
672 guint offset = 0;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
673 guint length = 0;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
674
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
675 while (marker != app_marker &&
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
676 marker != JPEG_MARKER_EOI)
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
677 {
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
678 offset += length;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
679 length = 2;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
680
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
681 if (offset + 2 >= size ||
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
682 data[offset] != JPEG_MARKER) return FALSE;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
683
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
684 marker = data[offset + 1];
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
685 if (marker != JPEG_MARKER_SOI &&
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
686 marker != JPEG_MARKER_EOI)
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
687 {
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
688 if (offset + 4 >= size) return FALSE;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
689 length += ((guint)data[offset + 2] << 8) + data[offset + 3];
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
690 }
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
691 }
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
692
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
693 if (marker == app_marker &&
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
694 offset + length < size &&
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
695 length >= 4 + magic_len &&
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
696 memcmp(data + offset + 4, magic, magic_len) == 0)
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
697 {
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
698 *seg_offset = offset + 4;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
699 *seg_length = length - 4;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
700 return TRUE;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
701 }
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
702
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
703 return FALSE;
188
0584cb78aa14 write comment and keywords to xmp, sidecars are used if exist
nadvornik
parents: 184
diff changeset
704 }
449
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
705
1422
91bed0d66cf2 gint -> gboolean and tidy up.
zas_
parents: 1361
diff changeset
706 gboolean exif_jpeg_parse_color(ExifData *exif, guchar *data, guint size)
449
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
707 {
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
708 guint seg_offset = 0;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
709 guint seg_length = 0;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
710 guint chunk_offset[255];
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
711 guint chunk_length[255];
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
712 guint chunk_count = 0;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
713
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
714 /* For jpeg/jfif, ICC color profile data can be in more than one segment.
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
715 the data is in APP2 data segments that start with "ICC_PROFILE\x00\xNN\xTT"
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
716 NN = segment number for data
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
717 TT = total number of ICC segments (TT in each ICC segment should match)
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
718 */
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
719
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
720 while (exif_jpeg_segment_find(data + seg_offset + seg_length,
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
721 size - seg_offset - seg_length,
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
722 JPEG_MARKER_APP2,
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
723 "ICC_PROFILE\x00", 12,
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
724 &seg_offset, &seg_length))
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
725 {
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
726 guchar chunk_num;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
727 guchar chunk_tot;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
728
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
729 if (seg_length < 14) return FALSE;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
730
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
731 chunk_num = data[seg_offset + 12];
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
732 chunk_tot = data[seg_offset + 13];
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
733
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
734 if (chunk_num == 0 || chunk_tot == 0) return FALSE;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
735
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
736 if (chunk_count == 0)
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
737 {
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
738 guint i;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
739
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
740 chunk_count = (guint)chunk_tot;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
741 for (i = 0; i < chunk_count; i++) chunk_offset[i] = 0;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
742 for (i = 0; i < chunk_count; i++) chunk_length[i] = 0;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
743 }
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
744
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
745 if (chunk_tot != chunk_count ||
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
746 chunk_num > chunk_count) return FALSE;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
747
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
748 chunk_num--;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
749 chunk_offset[chunk_num] = seg_offset + 14;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
750 chunk_length[chunk_num] = seg_length - 14;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
751 }
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
752
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
753 if (chunk_count > 0)
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
754 {
1000
4fe8f9656107 For the sake of consistency, use glib basic types everywhere.
zas_
parents: 985
diff changeset
755 guchar *cp_data;
449
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
756 guint cp_length = 0;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
757 guint i;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
758
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
759 for (i = 0; i < chunk_count; i++) cp_length += chunk_length[i];
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
760 cp_data = g_malloc(cp_length);
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
761
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
762 for (i = 0; i < chunk_count; i++)
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
763 {
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
764 if (chunk_offset[i] == 0)
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
765 {
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
766 /* error, we never saw this chunk */
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
767 g_free(cp_data);
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
768 return FALSE;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
769 }
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
770 memcpy(cp_data, data + chunk_offset[i], chunk_length[i]);
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
771 }
506
fc9c8a3e1a8b Handle the newline in DEBUG_N() macro instead of adding one
zas_
parents: 495
diff changeset
772 DEBUG_1("Found embedded icc profile in jpeg");
449
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
773 exif_add_jpeg_color_profile(exif, cp_data, cp_length);
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
774
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
775 return TRUE;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
776 }
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
777
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
778 return FALSE;
115db540bd0c read color profiles from jpeg also with Exiv2
nadvornik
parents: 442
diff changeset
779 }
1483
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
780
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
781 /*
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
782 *-------------------------------------------------------------------
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
783 * file info
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
784 * it is here because it shares tag neming infrastructure with exif
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
785 * we should probably not invest too much effort into this because
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
786 * new exiv2 will support the same functionality
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
787 * http://dev.exiv2.org/issues/show/505
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
788 *-------------------------------------------------------------------
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
789 */
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
790
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
791 static gchar *mode_number(mode_t m)
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
792 {
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
793 gint mb, mu, mg, mo;
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
794 gchar pbuf[12];
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
795
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
796 mb = mu = mg = mo = 0;
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
797
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
798 if (m & S_ISUID) mb |= 4;
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
799 if (m & S_ISGID) mb |= 2;
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
800 if (m & S_ISVTX) mb |= 1;
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
801
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
802 if (m & S_IRUSR) mu |= 4;
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
803 if (m & S_IWUSR) mu |= 2;
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
804 if (m & S_IXUSR) mu |= 1;
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
805
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
806 if (m & S_IRGRP) mg |= 4;
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
807 if (m & S_IWGRP) mg |= 2;
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
808 if (m & S_IXGRP) mg |= 1;
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
809
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
810 if (m & S_IROTH) mo |= 4;
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
811 if (m & S_IWOTH) mo |= 2;
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
812 if (m & S_IXOTH) mo |= 1;
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
813
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
814 pbuf[0] = (m & S_IRUSR) ? 'r' : '-';
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
815 pbuf[1] = (m & S_IWUSR) ? 'w' : '-';
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
816 pbuf[2] = (m & S_IXUSR) ? 'x' : '-';
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
817 pbuf[3] = (m & S_IRGRP) ? 'r' : '-';
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
818 pbuf[4] = (m & S_IWGRP) ? 'w' : '-';
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
819 pbuf[5] = (m & S_IXGRP) ? 'x' : '-';
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
820 pbuf[6] = (m & S_IROTH) ? 'r' : '-';
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
821 pbuf[7] = (m & S_IWOTH) ? 'w' : '-';
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
822 pbuf[8] = (m & S_IXOTH) ? 'x' : '-';
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
823 pbuf[9] = '\0';
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
824
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
825 return g_strdup_printf("%s (%d%d%d%d)", pbuf, mb, mu, mg, mo);
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
826 }
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
827
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
828 gchar *metadata_file_info(FileData *fd, const gchar *key, MetadataFormat format)
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
829 {
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
830 if (strcmp(key, "file.size") == 0)
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
831 {
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
832 return g_strdup_printf("%ld", (long)fd->size);
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
833 }
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
834 if (strcmp(key, "file.date") == 0)
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
835 {
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
836 return g_strdup(text_from_time(fd->date));
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
837 }
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
838 if (strcmp(key, "file.mode") == 0)
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
839 {
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
840 return mode_number(fd->mode);
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
841 }
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
842 return g_strdup("");
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
843 }
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
844
7cb24fdf07c0 re-added possibility to display basic file info (size, mode, date)
nadvornik
parents: 1422
diff changeset
845
1055
1646720364cf Adding a vim modeline to all files - patch by Klaus Ethgen
nadvornik
parents: 1053
diff changeset
846 /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */