Mercurial > hg > forks > geeqie
view src/format_fuji.c @ 2860:b20a96b979a3
Fix #437: Delete to standard Trash directory
https://github.com/BestImageViewer/geeqie/issues/437
The method of file deletion is changed. The Preferences/Behaviour option
"Safe delete" is removed.
The user has the option to choose Geeqie-defined trash bin or
system-defined trash bin as the normal mode - set in
Preferences/Behaviour.
Menus have two entries: Move to trash and Permanent delete.
The Delete key moves to trash; shift-Delete deletes permanently.
Both Move to trash and Permanent delete have user-selectable
confirmation, set in Preferences/Behaviour.
This means the function of the Delete key is changed from Permanent
delete to Move to trash, which is a fail-safe change.
author | Colin Clark <colin.clark@cclark.uk> |
---|---|
date | Sat, 03 Nov 2018 17:53:31 +0000 |
parents | 95507e596256 |
children |
line wrap: on
line source
/* * Copyright (C) 2005 Lars Ellenberg * Copyright (C) 2005 John Ellis * Copyright (C) 2008 - 2016 The Geeqie Team * * Author: Lars Ellenberg * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with this program; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #ifdef HAVE_CONFIG_H # include "config.h" #endif #ifndef HAVE_EXIV2 #include <stdio.h> #include <string.h> #include <unistd.h> #include <glib.h> #include "intl.h" #include "main.h" #include "format_fuji.h" #include "format_raw.h" #include "exif.h" /* *----------------------------------------------------------------------------- * Raw (RAF) embedded jpeg extraction for Fujifilm *----------------------------------------------------------------------------- */ gboolean format_fuji_raw(guchar *data, const guint len, guint *image_offset, guint *exif_offset) { guint io; guint eo; if (len < 128 || memcmp(data, "FUJIFILM", 8) != 0) { return FALSE; } /* offset to jpeg is embedded at bytes 84-87 */ io = exif_byte_get_int32(data + 84, EXIF_BYTE_ORDER_MOTOROLA); if (io + 4 > len) return FALSE; /* verify jpeg marker */ if (memcmp(data + io, "\xff\xd8\xff\xe1", 4) != 0) { return FALSE; } /* Exif is stored in the jpeg, so use the same offset */ eo=io; if (image_offset) *image_offset = io; if (exif_offset) *exif_offset = eo; return TRUE; } /* *----------------------------------------------------------------------------- * EXIF Makernote for Fujifilm *----------------------------------------------------------------------------- */ static ExifTextList FujiTagSharpness[] = { { 1, "soft" }, { 2, "soft" }, { 3, "normal" }, { 4, "hard" }, { 5, "hard" }, EXIF_TEXT_LIST_END }; static ExifTextList FujiTagWhiteBalance[]= { { 0, "auto" }, { 256, "daylight" }, { 512, "cloudy" }, { 768, "daylight color-fluorescence" }, { 769, "daywhite color-fluorescence" }, { 770, "white-fluorescence" }, { 1024, "incandescent" }, { 3840, "custom" }, EXIF_TEXT_LIST_END }; static ExifTextList FujiTagColorTone[]= { { 0, "normal" }, { 256, "high" }, { 512, "low" }, EXIF_TEXT_LIST_END }; static ExifTextList FujiTagFlashMode[]= { { 0, "auto" }, { 1, "on" }, { 2, "off" }, { 3, "red-eye reduction" }, EXIF_TEXT_LIST_END }; static ExifTextList FujiTagOffOn[]= { { 0, "off" }, { 1, "on" }, EXIF_TEXT_LIST_END }; static ExifTextList FujiTagFocusMode[]= { { 0, "auto" }, { 1, "manual" }, EXIF_TEXT_LIST_END }; static ExifTextList FujiTagPictureMode[]= { { 0, "auto" }, { 1, "portrait" }, { 2, "landscape" }, { 4, "sports" }, { 5, "night" }, { 6, "program AE" }, { 256, "aperture priority AE" }, { 512, "shutter priority AE" }, { 768, "manual" }, EXIF_TEXT_LIST_END }; static ExifTextList FujiTagNoYes[]= { { 0, "no" }, { 1, "yes" }, EXIF_TEXT_LIST_END }; static ExifMarker FujiExifMarkersList[] = { { 0x1000, EXIF_FORMAT_STRING, 8, "Fuji.Quality", "Quality", NULL }, { 0x1001, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Fuji.Sharpness", "Sharpness", FujiTagSharpness }, { 0x1002, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Fuji.WhiteBalance", "White balance",FujiTagWhiteBalance }, { 0x1003, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Fuji.Color", "Color", FujiTagColorTone }, { 0x1004, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Fuji.Tone", "Tone", FujiTagColorTone }, { 0x1010, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Fuji.FlashMode", "Flash mode", FujiTagFlashMode }, { 0x1011, EXIF_FORMAT_RATIONAL, 1, "Fuji.FlashStrength", "Flash strength", NULL }, { 0x1020, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Fuji.Macro", "Macro", FujiTagOffOn }, { 0x1021, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Fuji.FocusMode", "Focus mode", FujiTagFocusMode }, { 0x1030, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Fuji.SlowSync", "Slow synchro", FujiTagOffOn }, { 0x1031, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Fuji.PictureMode", "Picture mode", FujiTagPictureMode }, { 0x1100, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Fuji.ContTake/Bracket", "Continuous / Auto bracket", FujiTagOffOn }, { 0x1300, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Fuji.BlurWarning", "Blue warning", FujiTagNoYes }, { 0x1301, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Fuji.FocusWarning", "Focus warning",FujiTagNoYes }, { 0x1302, EXIF_FORMAT_SHORT_UNSIGNED, 1, "Fuji.AEWarning", "AE warning", FujiTagNoYes }, EXIF_MARKER_LIST_END }; gboolean format_fuji_makernote(ExifData *exif, guchar *tiff, guint offset, guint size, ExifByteOrder bo) { guchar *data; guint ifdstart; if (offset + 8 + 4 >= size) return FALSE; data = tiff + offset; /* Fuji tag format starts with "FUJIFILM", * followed by 4 bytes indicating offset to IFD directory using Fuji tags, * byte order is always little endian (II). */ if (memcmp(data, "FUJIFILM", 8) != 0) return FALSE; ifdstart = exif_byte_get_int32(data + 8, EXIF_BYTE_ORDER_INTEL); if (offset + ifdstart >= size) return FALSE; if (exif_parse_IFD_table(exif, tiff + offset, ifdstart, size - offset, EXIF_BYTE_ORDER_INTEL, 0, FujiExifMarkersList) != 0) { return FALSE; } return TRUE; } #endif /* not HAVE_EXIV2 */ /* vim: set shiftwidth=8 softtabstop=0 cindent cinoptions={1s: */