summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--README3
-rw-r--r--src/exif.c52
-rw-r--r--src/exif_nikon.h41
-rw-r--r--src/list.c5
-rw-r--r--test/feh.t4
-rw-r--r--test/list/default10
-rw-r--r--test/list/filename_recursive12
-rw-r--r--test/list/format_reverse10
-rw-r--r--test/list/size10
9 files changed, 117 insertions, 30 deletions
diff --git a/README b/README
index 737d4fc..97c644c 100644
--- a/README
+++ b/README
@@ -56,6 +56,9 @@ variables instead of editing it. E.g.:
CFLAGS='-g -Os' make
export DESTDIR=/tmp/feh PREFIX=/usr; make && make install
+Builtin EXIF support is maintained by Dennis Real, see
+<https://github.com/reald/feh>.
+
Testing (non-X)
---------------
diff --git a/src/exif.c b/src/exif.c
index 9d26072..dcf2a88 100644
--- a/src/exif.c
+++ b/src/exif.c
@@ -33,7 +33,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#include "options.h"
#include "debug.h"
#include "exif.h"
-
+#include "exif_nikon.h"
/* remove all spaces on the right end of a string */
@@ -140,7 +140,10 @@ ExifData * exif_get_data(char *path)
void exif_get_info(ExifData * ed, char *buffer, unsigned int maxsize)
{
ExifEntry *entry = NULL;
- char buf[64];
+ char buf[128];
+ unsigned int exn_fcm = (EXN_FLASH_CONTROL_MODES_MAX-1); /* default to N/A */
+ unsigned int version = 0;
+ unsigned int length = 0;
if ( (buffer == NULL) || (maxsize == 0) )
{
@@ -151,7 +154,7 @@ void exif_get_info(ExifData * ed, char *buffer, unsigned int maxsize)
snprintf(buffer, (size_t)maxsize, "%s\n", "No Exif data in file.");
return;
}
- else if ( ed != NULL )
+ else
{
/* normal exif tags */
exif_get_tag(ed, EXIF_IFD_0, EXIF_TAG_MAKE, buffer, maxsize);
@@ -185,10 +188,49 @@ void exif_get_info(ExifData * ed, char *buffer, unsigned int maxsize)
/* Nikon */
if ( strcmp(buf, "Nikon") != 0 )
{
- /* Digital Vari-Program */
- exif_get_mnote_tag(ed, 171, buffer + strlen(buffer), maxsize - strlen(buffer));
+ /* this is a nikon camera */
+
+ buf[0] = '\0';
+ exif_get_tag(ed, EXIF_IFD_EXIF, EXIF_TAG_FLASH, buf, sizeof(buf));
+ exif_trim_spaces(buf);
+
+ if ( !(strcmp("Flash: Flash did not fire\n", buf) == 0) )
+ {
+ /* extended flash info if it was fired */
+
+ /* Flash Setting */
+ exif_get_mnote_tag(ed, 8, buffer + strlen(buffer), maxsize - strlen(buffer));
+ /* Flash Mode */
+ exif_get_mnote_tag(ed, 9, buffer + strlen(buffer), maxsize - strlen(buffer));
+ /* flash exposure bracket value */
+ exif_get_mnote_tag(ed, 24, buffer + strlen(buffer), maxsize - strlen(buffer));
+ /* Flash used */
+ exif_get_mnote_tag(ed, 135, buffer + strlen(buffer), maxsize - strlen(buffer));
+
+ /* Flash info: control mode. */
+ /* libexif does not support flash info 168 yet. so we have to parse the debug data :-( */
+ buf[0] = '\0';
+ exif_get_mnote_tag(ed, 168, buf, sizeof(buf));
+ sscanf(buf, "(null): %u bytes unknown data: 303130%02X%*10s%02X", &length, &version, &exn_fcm);
+ exn_fcm = exn_fcm & EXN_FLASH_CONTROL_MODE_MASK;
+
+ if ( (exn_fcm < EXN_FLASH_CONTROL_MODES_MAX)
+ && ( ((length == 22) && (version == '3')) /* Nikon FlashInfo0103 */
+ || ((length == 22) && (version == '4')) /* Nikon FlashInfo0104 */
+ || ((length == 21) && (version == '2')) /* Nikon FlashInfo0102 */
+ || ((length == 19) && (version == '0')) /* Nikon FlashInfo0100 */
+ )
+ )
+ {
+ snprintf(buffer + strlen(buffer), maxsize - strlen(buffer), "NikonFlashControlMode: %s\n",
+ EXN_NikonFlashControlModeValues[exn_fcm]);
+ }
+ }
/* Lens */
exif_get_mnote_tag(ed, 132, buffer + strlen(buffer), maxsize - strlen(buffer));
+ /* Digital Vari-Program */
+ exif_get_mnote_tag(ed, 171, buffer + strlen(buffer), maxsize - strlen(buffer));
+
}
}
diff --git a/src/exif_nikon.h b/src/exif_nikon.h
new file mode 100644
index 0000000..e2baf0d
--- /dev/null
+++ b/src/exif_nikon.h
@@ -0,0 +1,41 @@
+/* exif_nikon.h
+
+Copyright (C) 2012 Dennis Real.
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to
+deal in the Software without restriction, including without limitation the
+rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+sell copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in
+all copies of the Software and its documentation and acknowledgment shall be
+given in the documentation and software packages that this Software was
+used.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
+THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
+IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
+CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+*/
+
+#ifndef EXIF_NIKON_H
+#define EXIF_NIKON_H
+
+/* Flash control mode */
+/* http://www.sno.phy.queensu.ca/~phil/exiftool/TagNames/Nikon.html#FlashControlMode */
+#define EXN_FLASH_CONTROL_MODES_MAX 9
+char *EXN_NikonFlashControlModeValues[EXN_FLASH_CONTROL_MODES_MAX] = {"Off",
+ "iTTL-BL", "iTTL", "Auto Aperture",
+ "Automatic", "GN (distance priority)",
+ "Manual", "Repeating Flash",
+ "N/A" /* "N/A" is not a nikon setting */
+ };
+
+#define EXN_FLASH_CONTROL_MODE_MASK 0x7F
+
+#endif
diff --git a/src/list.c b/src/list.c
index 3cb9a3d..17fcbcc 100644
--- a/src/list.c
+++ b/src/list.c
@@ -44,14 +44,15 @@ void init_list_mode(void)
file = FEH_FILE(l->data);
if (opt.customlist)
printf("%s\n", feh_printf(opt.customlist, file));
- else
+ else {
printf("%d\t%s\t%d\t%d\t%s", ++j,
file->info->format, file->info->width,
file->info->height,
format_size(file->info->pixels));
- printf("\t%s\t\t%c\t%s\n",
+ printf("\t%s\t%c\t%s\n",
format_size(file->info->size),
file->info->has_alpha ? 'X' : '-', file->filename);
+ }
feh_action_run(file, opt.actions[0]);
}
diff --git a/test/feh.t b/test/feh.t
index ac9262f..34b5cd3 100644
--- a/test/feh.t
+++ b/test/feh.t
@@ -36,7 +36,7 @@ my $re_warning =
qr{${feh_name} WARNING: test/fail/... \- No Imlib2 loader for that file format\n};
my $re_loadable = qr{test/ok/...};
my $re_unloadable = qr{test/fail/...};
-my $re_list_action = qr{test/ok/... 16x16 \(${feh_name}\)};
+my $re_list_action = qr{test/ok/... 16x16};
my $cmd = Test::Command->new(cmd => "$feh --version");
@@ -128,7 +128,7 @@ $cmd->stdout_is_file('test/list/default');
$cmd->stderr_is_eq('');
$cmd = Test::Command->new(cmd =>
- "$feh --quiet --list --action 'echo \"%f %wx%h (%P)\" >&2' $images");
+ "$feh --quiet --list --action 'echo \"%f %wx%h\" >&2' $images");
$cmd->exit_is_num(0);
$cmd->stdout_is_file('test/list/default');
diff --git a/test/list/default b/test/list/default
index d7b2c12..bc0ef52 100644
--- a/test/list/default
+++ b/test/list/default
@@ -1,5 +1,5 @@
-NUM FORMAT WIDTH HEIGHT PIXELS SIZE(bytes) ALPHA FILENAME
-1 gif 16 16 256 953 - test/ok/gif
-2 jpeg 16 16 256 354 - test/ok/jpg
-3 png 16 16 256 403 X test/ok/png
-4 pnm 16 16 256 269 - test/ok/pnm
+NUM FORMAT WIDTH HEIGHT PIXELS SIZE ALPHA FILENAME
+1 gif 16 16 256 953 - test/ok/gif
+2 jpeg 16 16 256 354 - test/ok/jpg
+3 png 16 16 256 403 X test/ok/png
+4 pnm 16 16 256 269 - test/ok/pnm
diff --git a/test/list/filename_recursive b/test/list/filename_recursive
index 5ffa63e..d4d27dd 100644
--- a/test/list/filename_recursive
+++ b/test/list/filename_recursive
@@ -1,6 +1,6 @@
-NUM FORMAT WIDTH HEIGHT PIXELS SIZE(bytes) ALPHA FILENAME
-1 gif 16 16 256 953 - test/ok/gif
-2 jpeg 16 16 256 354 - test/ok/jpg
-3 png 16 16 256 403 X test/ok/png
-4 pnm 16 16 256 269 - test/ok/pnm
-5 png 16 16 256 403 X test/ok/recursive/png
+NUM FORMAT WIDTH HEIGHT PIXELS SIZE ALPHA FILENAME
+1 gif 16 16 256 953 - test/ok/gif
+2 jpeg 16 16 256 354 - test/ok/jpg
+3 png 16 16 256 403 X test/ok/png
+4 pnm 16 16 256 269 - test/ok/pnm
+5 png 16 16 256 403 X test/ok/recursive/png
diff --git a/test/list/format_reverse b/test/list/format_reverse
index 801b732..9216184 100644
--- a/test/list/format_reverse
+++ b/test/list/format_reverse
@@ -1,5 +1,5 @@
-NUM FORMAT WIDTH HEIGHT PIXELS SIZE(bytes) ALPHA FILENAME
-1 pnm 16 16 256 269 - test/ok/pnm
-2 png 16 16 256 403 X test/ok/png
-3 jpeg 16 16 256 354 - test/ok/jpg
-4 gif 16 16 256 953 - test/ok/gif
+NUM FORMAT WIDTH HEIGHT PIXELS SIZE ALPHA FILENAME
+1 pnm 16 16 256 269 - test/ok/pnm
+2 png 16 16 256 403 X test/ok/png
+3 jpeg 16 16 256 354 - test/ok/jpg
+4 gif 16 16 256 953 - test/ok/gif
diff --git a/test/list/size b/test/list/size
index 9e1c3d0..cad60b0 100644
--- a/test/list/size
+++ b/test/list/size
@@ -1,5 +1,5 @@
-NUM FORMAT WIDTH HEIGHT PIXELS SIZE(bytes) ALPHA FILENAME
-1 pnm 16 16 256 269 - test/ok/pnm
-2 jpeg 16 16 256 354 - test/ok/jpg
-3 png 16 16 256 403 X test/ok/png
-4 gif 16 16 256 953 - test/ok/gif
+NUM FORMAT WIDTH HEIGHT PIXELS SIZE ALPHA FILENAME
+1 pnm 16 16 256 269 - test/ok/pnm
+2 jpeg 16 16 256 354 - test/ok/jpg
+3 png 16 16 256 403 X test/ok/png
+4 gif 16 16 256 953 - test/ok/gif