summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorDaniel Friesel <derf@finalrewind.org>2012-02-26 22:34:28 +0100
committerDaniel Friesel <derf@finalrewind.org>2012-02-26 22:34:28 +0100
commit3ceed32cd8f56cd4c970b31ed03c15549bcb396d (patch)
tree57542d7d6a0434facc5a4d8e7b75c9e85a7f7eb4 /src
parentb257e011c4390900f14491e2cffe38b2d00892ec (diff)
parentf24e46871c9eb41f2b43e91b18164c3d232255f8 (diff)
Merge branch 'master' of aneurysm:var/git_root/feh
Diffstat (limited to 'src')
-rw-r--r--src/exif.c52
-rw-r--r--src/exif_nikon.h41
-rw-r--r--src/list.c5
3 files changed, 91 insertions, 7 deletions
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]);
}