6 * Original version 2005 Lars Ellenberg, base on dcraw by David coffin.
8 * This software is released under the GNU General Public License (GNU GPL).
9 * Please read the included file COPYING for more information.
10 * This software comes with no warranty of any kind, use at your own risk!
26 #include "format_fuji.h"
27 #include "format_raw.h"
33 *-----------------------------------------------------------------------------
34 * Raw (RAF) embedded jpeg extraction for Fujifilm
35 *-----------------------------------------------------------------------------
39 gint format_fuji_raw(const void *data, const guint len,
40 guint *image_offset, guint *exif_offset)
46 memcmp(data, "FUJIFILM", 8) != 0)
51 io = GUINT32_FROM_BE(*(guint32*)(data + 84));
52 eo = *image_offset + 12;
54 /* verify jpeg marker */
55 if (memcmp(data + io, "\xff\xd8\xff\xe1", 4) != 0)
60 if (image_offset) *image_offset = io;
61 if (exif_offset) *exif_offset = eo;
63 printf("raw Fuji format file\n");
70 *-----------------------------------------------------------------------------
71 * EXIF Makernote for Fujifilm
72 *-----------------------------------------------------------------------------
75 static ExifTextList FujiTagSharpness[] = {
84 static ExifTextList FujiTagWhiteBalance[]= {
88 { 768, "daylight color-fluorescence" },
89 { 769, "daywhite color-fluorescence" },
90 { 770, "white-fluorescence" },
91 { 1024, "incandescent" },
96 static ExifTextList FujiTagColorTone[]= {
103 static ExifTextList FujiTagFlashMode[]= {
107 { 3, "red-eye reduction" },
111 static ExifTextList FujiTagOffOn[]= {
117 static ExifTextList FujiTagFocusMode[]= {
123 static ExifTextList FujiTagPictureMode[]= {
130 { 256, "aperture priority AE" },
131 { 512, "shutter priority AE" },
136 static ExifTextList FujiTagNoYes[]= {
143 static ExifTextList FujiTag[]= {
151 static ExifMarker FujiExifMarkersList[] = {
152 { 0x1000, EXIF_FORMAT_STRING, 8, "MkN.Fuji.Quality", "Quality", NULL },
153 { 0x1001, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Fuji.Sharpness", "Sharpness", FujiTagSharpness },
154 { 0x1002, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Fuji.WhiteBalance","White balance",FujiTagWhiteBalance },
155 { 0x1003, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Fuji.Color", "Color", FujiTagColorTone },
156 { 0x1004, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Fuji.Tone", "Tone", FujiTagColorTone },
157 { 0x1010, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Fuji.FlashMode", "Flash mode", FujiTagFlashMode },
158 { 0x1011, EXIF_FORMAT_RATIONAL, 1, "MkN.Fuji.FlashStrength", "Flash strength", NULL },
159 { 0x1020, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Fuji.Macro", "Macro", FujiTagOffOn },
160 { 0x1021, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Fuji.FocusMode", "Focus mode", FujiTagFocusMode },
161 { 0x1030, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Fuji.SlowSync", "Slow synchro", FujiTagOffOn },
162 { 0x1031, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Fuji.PictureMode", "Picture mode", FujiTagPictureMode },
163 { 0x1100, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Fuji.ContTake/Bracket",
164 "Continuous / Auto bracket", FujiTagOffOn },
165 { 0x1300, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Fuji.BlurWarning", "Blue warning", FujiTagNoYes },
166 { 0x1301, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Fuji.FocusWarning","Focus warning",FujiTagNoYes },
167 { 0x1302, EXIF_FORMAT_SHORT_UNSIGNED, 1, "MkN.Fuji.AEWarning", "AE warning", FujiTagNoYes },
173 gint format_fuji_makernote(ExifData *exif, unsigned char *tiff, guint offset,
174 guint size, ExifByteOrder byte_order)
179 if (offset + 8 + 4 >= size) return FALSE;
181 data = tiff + offset;
182 if (memcmp(data, "FUJIFILM", 8) != 0) return FALSE;
184 ifdstart = exif_byte_get_int32(data + 8, EXIF_BYTE_ORDER_INTEL);
185 if (offset + ifdstart >= size) return FALSE;
187 if (exif_parse_IFD_table(exif, tiff + offset, ifdstart, size - offset,
188 EXIF_BYTE_ORDER_INTEL, FujiExifMarkersList) != 0)