Added EXIF auto-orientation
This commit is contained in:
parent
b96c106337
commit
bfab4dc328
48
image.c
48
image.c
|
@ -16,11 +16,12 @@
|
||||||
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
#include <libexif/exif-data.h>
|
||||||
|
|
||||||
#ifdef GIF_SUPPORT
|
#ifdef GIF_SUPPORT
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
#include <gif_lib.h>
|
#include <gif_lib.h>
|
||||||
#endif
|
#endif
|
||||||
|
@ -37,6 +38,49 @@ enum { MIN_GIF_DELAY = 50 };
|
||||||
float zoom_min;
|
float zoom_min;
|
||||||
float zoom_max;
|
float zoom_max;
|
||||||
|
|
||||||
|
void exif_auto_orientate(const fileinfo_t *file) {
|
||||||
|
ExifData *ed;
|
||||||
|
ExifEntry *entry;
|
||||||
|
int byte_order, orientation;
|
||||||
|
|
||||||
|
if (!(ed = exif_data_new_from_file(file->path)))
|
||||||
|
return;
|
||||||
|
entry = exif_content_get_entry(ed->ifd[EXIF_IFD_0], EXIF_TAG_ORIENTATION);
|
||||||
|
if (entry) {
|
||||||
|
byte_order = exif_data_get_byte_order(ed);
|
||||||
|
orientation = exif_get_short(entry->data, byte_order);
|
||||||
|
}
|
||||||
|
exif_data_unref(ed);
|
||||||
|
if (!entry)
|
||||||
|
return;
|
||||||
|
|
||||||
|
switch (orientation) {
|
||||||
|
case 5:
|
||||||
|
imlib_image_orientate(1);
|
||||||
|
case 2:
|
||||||
|
imlib_image_flip_vertical();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 3:
|
||||||
|
imlib_image_orientate(2);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 7:
|
||||||
|
imlib_image_orientate(1);
|
||||||
|
case 4:
|
||||||
|
imlib_image_flip_horizontal();
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 6:
|
||||||
|
imlib_image_orientate(1);
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 8:
|
||||||
|
imlib_image_orientate(270);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void img_init(img_t *img, win_t *win) {
|
void img_init(img_t *img, win_t *win) {
|
||||||
zoom_min = zoom_levels[0] / 100.0;
|
zoom_min = zoom_levels[0] / 100.0;
|
||||||
zoom_max = zoom_levels[ARRLEN(zoom_levels) - 1] / 100.0;
|
zoom_max = zoom_levels[ARRLEN(zoom_levels) - 1] / 100.0;
|
||||||
|
@ -241,6 +285,8 @@ int img_load(img_t *img, const fileinfo_t *file) {
|
||||||
imlib_context_set_anti_alias(img->aa);
|
imlib_context_set_anti_alias(img->aa);
|
||||||
|
|
||||||
fmt = imlib_image_format();
|
fmt = imlib_image_format();
|
||||||
|
if (!strcmp(fmt, "jpeg"))
|
||||||
|
exif_auto_orientate(file);
|
||||||
#ifdef GIF_SUPPORT
|
#ifdef GIF_SUPPORT
|
||||||
if (!strcmp(fmt, "gif"))
|
if (!strcmp(fmt, "gif"))
|
||||||
img_load_gif(img, file);
|
img_load_gif(img, file);
|
||||||
|
|
9
thumbs.c
9
thumbs.c
|
@ -34,6 +34,8 @@
|
||||||
#define st_atim st_atimespec
|
#define st_atim st_atimespec
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
void exif_auto_orientate(const fileinfo_t*);
|
||||||
|
|
||||||
const int thumb_dim = THUMB_SIZE + 10;
|
const int thumb_dim = THUMB_SIZE + 10;
|
||||||
char *cache_dir = NULL;
|
char *cache_dir = NULL;
|
||||||
|
|
||||||
|
@ -221,6 +223,7 @@ int tns_load(tns_t *tns, int n, const fileinfo_t *file,
|
||||||
float z, zw, zh;
|
float z, zw, zh;
|
||||||
thumb_t *t;
|
thumb_t *t;
|
||||||
Imlib_Image *im;
|
Imlib_Image *im;
|
||||||
|
const char *fmt;
|
||||||
|
|
||||||
if (!tns || !tns->thumbs || !file || !file->name || !file->path)
|
if (!tns || !tns->thumbs || !file || !file->name || !file->path)
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -252,6 +255,12 @@ int tns_load(tns_t *tns, int n, const fileinfo_t *file,
|
||||||
imlib_context_set_image(im);
|
imlib_context_set_image(im);
|
||||||
imlib_context_set_anti_alias(1);
|
imlib_context_set_anti_alias(1);
|
||||||
|
|
||||||
|
if (!cache_hit) {
|
||||||
|
fmt = imlib_image_format();
|
||||||
|
if (!strcmp(fmt, "jpeg"))
|
||||||
|
exif_auto_orientate(file);
|
||||||
|
}
|
||||||
|
|
||||||
w = imlib_image_get_width();
|
w = imlib_image_get_width();
|
||||||
h = imlib_image_get_height();
|
h = imlib_image_get_height();
|
||||||
zw = (float) THUMB_SIZE / (float) w;
|
zw = (float) THUMB_SIZE / (float) w;
|
||||||
|
|
Loading…
Reference in a new issue