This is an automated email from the git hooks/post-receive script. It was generated because a ref change was pushed to the repository containing the project wmaker-crm.git.
The branch, next has been updated via 97d281e31048ccc03be60492001287eed88441c9 (commit) from 9b65f55f536ccdac87c8cff40e14b74796da4ed1 (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email; so we list those revisions in full, below. - Log ----------------------------------------------------------------- http://repo.or.cz/w/wmaker-crm.git/commit/97d281e31048ccc03be60492001287eed88441c9 commit 97d281e31048ccc03be60492001287eed88441c9 Author: David Maciejak <david.macie...@gmail.com> Date: Mon Jun 2 18:27:36 2014 +0800 util/wmiv: add image auto orientation detection Based on libexif feature, this patch is adding orientation detection and provides 2 more shortcuts for live right/left rotation. Internal version was bumped to 0.7. diff --git a/configure.ac b/configure.ac index 4ea1e32f..2b9fe6b9 100644 --- a/configure.ac +++ b/configure.ac @@ -640,6 +640,12 @@ dnl =============================================== dnl End of stuff that uses X dnl =============================================== +dnl EXIF Support +dnl =========== +WM_CHECK_LIBEXIF +AS_IF([test "x$LIBEXIF" != "x"], + [AC_DEFINE(HAVE_EXIF, 1, [Define if EXIF can be used])]) + dnl PNG Support dnl =========== AC_ARG_ENABLE([png], diff --git a/m4/wm_libexif.m4 b/m4/wm_libexif.m4 new file mode 100644 index 00000000..ac501bba --- /dev/null +++ b/m4/wm_libexif.m4 @@ -0,0 +1,34 @@ +# wm_libexif.m4 - Macros to check proper libexif +# +# Copyright (c) 2014 Window Maker Team +# +# 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. + +# WM_CHECK_LIBEXIF +# ------------- +# +# Checks the needed library link flags +# Sets variable LIBEXIF with the appropriates flags +AC_DEFUN_ONCE([WM_CHECK_LIBEXIF], +[AC_CHECK_HEADER([libexif/exif-data.h], + [AC_CHECK_FUNC(exif_data_new_from_file, + [LIBEXIF=], + [AC_CHECK_LIB(exif, [exif_data_new_from_file], + [LIBEXIF=-lexif], + [AC_MSG_WARN(Could not find EXIF library, you may experience problems) + LIBEXIF=] )] )], + [AC_MSG_WARN([header for EXIF library not found])]) +AC_SUBST(LIBEXIF) dnl +]) diff --git a/util/Makefile.am b/util/Makefile.am index 5cde3eef..b5c9d042 100644 --- a/util/Makefile.am +++ b/util/Makefile.am @@ -73,7 +73,7 @@ wmmenugen_SOURCES = wmmenugen.c wmmenugen.h wmmenugen_misc.c wmiv_LDADD = $(top_builddir)/wrlib/libwraster.la @XLFLAGS@ @XLIBS@ - @GFXLIBS@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) + @GFXLIBS@ $(PTHREAD_CFLAGS) $(PTHREAD_LIBS) $(LIBEXIF) wmiv_SOURCES = wmiv.c wmiv.h diff --git a/util/wmiv.c b/util/wmiv.c index 2eab5d38..9810b5c1 100755 --- a/util/wmiv.c +++ b/util/wmiv.c @@ -21,6 +21,7 @@ #if !defined(_GNU_SOURCE) #define _GNU_SOURCE #endif + #include <X11/keysym.h> #include <X11/XKBlib.h> #include <X11/Xatom.h> @@ -34,6 +35,11 @@ #include <unistd.h> #include <sys/stat.h> #include "config.h" + +#ifdef HAVE_EXIF +#include <libexif/exif-data.h> +#endif + #ifdef HAVE_PTHREAD #include <pthread.h> #endif @@ -57,7 +63,7 @@ Pixmap pix; const char *APPNAME = "wmiv"; int APPVERSION_MAJOR = 0; -int APPVERSION_MINOR = 6; +int APPVERSION_MINOR = 7; int NEXT = 0; int PREV = 1; float zoom_factor = 0; @@ -66,6 +72,7 @@ int max_height = 0; Bool fullscreen_flag = False; Bool focus = False; +Bool back_from_fullscreen = False; #ifdef HAVE_PTHREAD Bool diaporama_flag = False; @@ -98,6 +105,90 @@ typedef struct linked_list { linked_list_t list; link_t *current_link; + +/* + load_oriented_image: used to load an image and optionally + get its orientation if libexif is available + return the image on success, NULL on failure +*/ +RImage *load_oriented_image(RContext *context, const char *file, int index) +{ + RImage *image; +#ifdef HAVE_EXIF + int orientation = 0; +#endif + image = RLoadImage(context, file, index); + if (!image) + return NULL; +#ifdef HAVE_EXIF + ExifData *exifData = exif_data_new_from_file(file); + if (exifData) { + ExifByteOrder byteOrder = exif_data_get_byte_order(exifData); + ExifEntry *exifEntry = exif_data_get_entry(exifData, EXIF_TAG_ORIENTATION); + if (exifEntry) + orientation = exif_get_short(exifEntry->data, byteOrder); + + exif_data_free(exifData); + } + +/* + 0th Row 0th Column + 1 top left side + 2 top right side + 3 bottom right side + 4 bottom left side + 5 left side top + 6 right side top + 7 right side bottom + 8 left side bottom +*/ + + if (image && (orientation > 1)) { + RImage *tmp = NULL; + switch (orientation) { + case 2: + tmp = RHorizontalFlipImage(image); + break; + case 3: + tmp = RRotateImage(image, 180); + break; + case 4: + tmp = RVerticalFlipImage(image); + break; + case 5: { + RImage *tmp2; + tmp2 = RVerticalFlipImage(image); + if (tmp2) { + tmp = RRotateImage(tmp2, 90); + RReleaseImage(tmp2); + } + } + break; + case 6: + tmp = RRotateImage(image, 90); + break; + case 7: { + RImage *tmp2; + tmp2 = RVerticalFlipImage(image); + if (tmp2) { + tmp = RRotateImage(tmp2, 270); + RReleaseImage(tmp2); + } + } + break; + case 8: + tmp = RRotateImage(image, 270); + break; + } + if (tmp) { + RReleaseImage(image); + image = tmp; + } + } +#endif + return image; +} + /* change_title: used to change window title return EXIT_SUCCESS on success, 1 on failure @@ -212,6 +303,59 @@ int merge_with_background(RImage *i) } /* + turn_image: rotate the image by the angle passed + return EXIT_SUCCESS on success, EXIT_FAILURE on failure +*/ +int turn_image(float angle) +{ + RImage *tmp; + + if (!img) + return EXIT_FAILURE; + + tmp = RRotateImage(img, angle); + if (!tmp) + return EXIT_FAILURE; + + if (!fullscreen_flag) { + if (img->width != tmp->width || img->height != tmp->height) + XResizeWindow(dpy, win, tmp->width, tmp->height); + } + + RReleaseImage(img); + img = tmp; + + rescale_image(); + if (!fullscreen_flag) { + XCopyArea(dpy, pix, win, ctx->copy_gc, 0, 0, img->width, img->height, 0, 0); + } else { + XClearWindow(dpy, win); + XCopyArea(dpy, pix, win, ctx->copy_gc, 0, 0, + img->width, img->height, max_width/2-img->width/2, max_height/2-img->height/2); + } + + return EXIT_SUCCESS; +} + +/* + turn_image_right: rotate the image by 90 degree + return EXIT_SUCCESS on success, EXIT_FAILURE on failure +*/ +int turn_image_right(void) +{ + return turn_image(90.0); +} + +/* + turn_image_left: rotate the image by -90 degree + return EXIT_SUCCESS on success, 1 on failure +*/ +int turn_image_left(void) +{ + return turn_image(-90.0); +} + +/* draw_failed_image: create a red crossed image to indicate an error loading file return the image on success, NULL on failure @@ -250,6 +394,7 @@ int full_screen(void) if (fullscreen_flag) { fullscreen_flag = False; zoom_factor = 0; + back_from_fullscreen = True; } else { fullscreen_flag = True; zoom_factor = 1000; @@ -279,7 +424,7 @@ int full_screen(void) int zoom_in_out(int z) { RImage *old_img = img; - RImage *tmp = RLoadImage(ctx, current_link->data, 0); + RImage *tmp = load_oriented_image(ctx, current_link->data, 0); if (!tmp) return EXIT_FAILURE; @@ -368,7 +513,7 @@ int change_image(int way) } if (DEBUG) fprintf(stderr, "current file is> %sn", (char *)current_link->data); - img = RLoadImage(ctx, current_link->data, 0); + img = load_oriented_image(ctx, current_link->data, 0); if (!img) { fprintf(stderr, "Error: %s %sn", (char *)current_link->data, @@ -453,7 +598,7 @@ int linked_list_add(linked_list_t *list, const void *data) /* calloc sets the "next" field to zero. */ link = calloc(1, sizeof(link_t)); if (!link) { - fprintf(stderr, "calloc failed.n"); + fprintf(stderr, "Error: memory allocation failedn"); return EXIT_FAILURE; } link->data = data; @@ -572,7 +717,9 @@ int main(int argc, char **argv) #ifdef HAVE_PTHREAD "d: launch diaporama moden" #endif + "l: rotate image on the leftn" "q: quitn" + "r: rotate image on the rightn" "right: next imagen" "left: previous imagen" "up: first imagen" @@ -618,7 +765,7 @@ int main(int argc, char **argv) } } - img = RLoadImage(ctx, reading_filename, 0); + img = load_oriented_image(ctx, reading_filename, 0); if (!img) { fprintf(stderr, "Error: %s %sn", reading_filename, RMessageForError(RErrorCode)); @@ -703,21 +850,33 @@ int main(int argc, char **argv) XConfigureEvent xce = e.xconfigure; if (xce.width != img->width || xce.height != img->height) { RImage *old_img = img; - img = RLoadImage(ctx, current_link->data, 0); + img = load_oriented_image(ctx, current_link->data, 0); if (!img) { /* keep the old img and window size */ img = old_img; XResizeWindow(dpy, win, img->width, img->height); } else { - img = RScaleImage(img, xce.width, xce.height); - if (!img) { - img = old_img; - XResizeWindow(dpy, win, img->width, img->height); - } else { - merge_with_background(img); - if (RConvertImage(ctx, img, &pix)) - RReleaseImage(old_img); + RImage *tmp2; + if (!back_from_fullscreen) + /* manually resized window */ + tmp2 = RScaleImage(img, xce.width, xce.height); + else { + /* back from fullscreen mode, maybe img was rotated */ + tmp2 = img; + back_from_fullscreen = False; + XClearWindow(dpy, win); + } + merge_with_background(tmp2); + if (RConvertImage(ctx, tmp2, &pix)) { + RReleaseImage(old_img); + img = RCloneImage(tmp2); + RReleaseImage(tmp2); + change_title(&title_property, (char *)current_link->data); + XSync(dpy, True); XResizeWindow(dpy, win, img->width, img->height); + XCopyArea(dpy, pix, win, ctx->copy_gc, 0, 0, + img->width, img->height, 0, 0); + } } } @@ -814,6 +973,12 @@ int main(int argc, char **argv) case XK_f: full_screen(); break; + case XK_r: + turn_image_right(); + break; + case XK_l: + turn_image_left(); + break; } } ----------------------------------------------------------------------- Summary of changes: configure.ac | 6 + m4/{wm_libmath.m4 => wm_libexif.m4} | 30 +++--- util/Makefile.am | 2 +- util/wmiv.c | 193 ++++++++++++++++++++++++++++++++--- 4 files changed, 201 insertions(+), 30 deletions(-) copy m4/{wm_libmath.m4 => wm_libexif.m4} (56%) repo.or.cz automatic notification. Contact project admin crma...@gmail.com if you want to unsubscribe, or site admin ad...@repo.or.cz if you receive no reply. -- wmaker-crm.git ("The Window Maker window manager") -- To unsubscribe, send mail to wmaker-dev-unsubscr...@lists.windowmaker.org.