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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Bert
						Bert