From 2a9a7e2557407d5b0c7e6b9680828fb431776ff5 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Fri, 24 Dec 2021 11:58:34 +0100 Subject: Disable --auto-rotate in feh builds compiled wiht Imlib2 1.7.5+ MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Imlib2 v1.7.5 introduces automatic (and transparent) orientation adjustment based on EXIF orientation tags. This makes feh's --auto-rotate function both superfluous and erroneous: It doesn't know about Imlib2's adjustments, so it rotates an image which is already correctly oriented, leading to incorrect orientation. I am not aware of a simple run-time check for detecting whethen running Imlib2 < 1.7.5 or ≥ 1.7.5. For now, feh disables --auto-rotate entirely when compiled on a system with Imlib2 1.7.5+ and outputs a warning when the option is used. Rationale: The Imlib2 version available at run-time should in most cases be at least as recent as the Imlib2 version used at compile-time. So, while there may be cases where feh was compiled with Imlib2 1.7.4 and exhibits erroneous auto-rotate behaviour on an Imlib2 1.7.5 system, the inverse case (a feh with disabled auto-rotate support running on Imlib2 1.7.4) should be sufficiently rare. If it does occur, it can be remedied by compiling feh from source locally. Possible caveat: Imlib2 only adjusts for EXIF orientation when loading JPEG and TIFF images. If there are additional EXIF-aware file formats supported by feh, but not Imlib2, they lose auto-rotate support. Reference: GitHub issue #642 --- src/imlib.c | 3 ++- src/options.c | 5 +++++ 2 files changed, 7 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/imlib.c b/src/imlib.c index add88d6..c42c4a4 100644 --- a/src/imlib.c +++ b/src/imlib.c @@ -462,8 +462,9 @@ int feh_load_image(Imlib_Image * im, feh_file * file) if (file->ed) { ExifByteOrder byteOrder = exif_data_get_byte_order(file->ed); ExifEntry *exifEntry = exif_data_get_entry(file->ed, EXIF_TAG_ORIENTATION); - if (exifEntry && opt.auto_rotate) + if (exifEntry && opt.auto_rotate) { orientation = exif_get_short(exifEntry->data, byteOrder); + } } if (orientation == 2) diff --git a/src/options.c b/src/options.c index 4d1e527..71c65e2 100644 --- a/src/options.c +++ b/src/options.c @@ -758,7 +758,12 @@ static void feh_parse_option_array(int argc, char **argv, int finalrun) opt.draw_exif = 1; break; case OPTION_auto_rotate: +#if defined(IMLIB2_VERSION_MAJOR) && defined(IMLIB2_VERSION_MINOR) && defined(IMLIB2_VERSION_MICRO) && (IMLIB2_VERSION_MAJOR > 1 || IMLIB2_VERSION_MINOR > 7 || IMLIB2_VERSION_MICRO >= 5) + weprintf("This feh release was built with Imlib2 version %d.%d.%d, which transparently adjusts for image orientation according to EXIF data.", IMLIB2_VERSION_MAJOR, IMLIB2_VERSION_MINOR, IMLIB2_VERSION_MICRO); + weprintf("--auto-rotate would rotate an already correctly oriented image, resulting in incorrect orientation. It has been disabled in this build. Rebuild feh with Imlib2 <1.7.5 to enable --auto-rotate."); +#else opt.auto_rotate = 1; +#endif break; #endif case OPTION_no_xinerama: -- cgit v1.2.3