LogoopenSUSE Build Service > Projects
Sign Up | Log In

View File xzgv-0.9.1-exif-orient.patch of Package xzgv (Project X11:Utilities)

--- src/backend.c.orig
+++ src/backend.c
@@ -31,6 +31,7 @@
 #include <string.h>
 #include <time.h>
 #include <gtk/gtk.h>
+#include <libexif/exif-data.h>
 
 #include "backend.h"
 
@@ -234,6 +235,29 @@ public_info_update(im);
 return(im);
 }
 
+int backend_get_orientation_from_file(char *filename)
+{
+GdkPixbufFormat *imform;
+gchar *format;
+ExifData *ed;
+ExifEntry *entry;
+ExifByteOrder bo;
+ExifShort orient;
+static const ExifShort xzgv_orient[]={0,0,1,3,2,7,4,6,5};
+
+if((imform=gdk_pixbuf_get_file_info(filename,NULL,NULL))==NULL) return 0;
+if((format=gdk_pixbuf_format_get_name(imform))==NULL) return 0;
+if(!strcmp(format, "jpeg") || !strcmp(format, "tiff"))
+  {
+  if((ed=exif_data_new_from_file(filename))==NULL) return 0;
+  if((entry=exif_data_get_entry(ed,EXIF_TAG_ORIENTATION))==NULL) return 0;
+  if((orient=exif_get_short(entry->data,exif_data_get_byte_order(ed)))>sizeof(xzgv_orient)-1) return 0;
+  orient=xzgv_orient[orient];
+  return (int)orient;
+  }
+return 0;
+}
+
 
 /* render image at (x,y) in window (at actual size).
  * This is a fairly high-level one, but most backends will probably
--- src/backend.h.orig
+++ src/backend.h
@@ -30,6 +30,7 @@ extern xzgv_image *backend_create_image_
 extern xzgv_image *backend_create_image_from_data_destructively(
   unsigned char *rgb,int w,int h);
 extern xzgv_image *backend_create_image_from_file(char *filename);
+extern int backend_get_orientation_from_file(char *filename);
 extern void backend_render_image_into_window(xzgv_image *image,GdkWindow *win,
                                              int x,int y);
 extern int backend_render_pixmap_for_image(xzgv_image *image,int x,int y);
--- src/main.c.orig
+++ src/main.c
@@ -359,6 +359,8 @@ int origw,origh;
 jpeg_exif_orient=0;
 
 ret=backend_create_image_from_file(file);	/* use backend's loader */
+if((ret != NULL) && use_exif_orient) jpeg_exif_orient=backend_get_orientation_from_file(file);
+
 origw=0; origh=0;
 if(ret)
   {
--- src/Makefile.orig
+++ src/Makefile
@@ -9,8 +9,8 @@
 # This gets definitions for CC, CFLAGS, BINDIR etc.
 include ../config.mk
 
-CFLAGS+=`pkg-config --cflags gtk+-2.0` `pkg-config --cflags gdk-pixbuf-2.0` `pkg-config --cflags x11`
-LDFLAGS+=`pkg-config --libs gtk+-2.0` `pkg-config --libs gdk-pixbuf-2.0 ` `pkg-config --libs x11`
+CFLAGS+=`pkg-config --cflags gtk+-2.0` `pkg-config --cflags gdk-pixbuf-2.0`  `pkg-config --cflags libexif` `pkg-config --cflags x11`
+LDFLAGS+=-lm `pkg-config --libs gtk+-2.0` `pkg-config --libs gdk-pixbuf-2.0 ` `pkg-config --libs libexif` `pkg-config --libs x11`
 
 all: xzgv