From f795273b650a4df39dca693f30c3650ec1d3393f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bert=20M=C3=BCnnich?= Date: Thu, 9 Jan 2014 00:01:57 +0100 Subject: [PATCH] Apply flip & rotation on all frames of a multi-frame image; fixes issue #121 --- image.c | 32 +++++++++++++++++++++++--------- image.h | 3 +++ types.h | 6 ++++-- 3 files changed, 30 insertions(+), 11 deletions(-) diff --git a/image.c b/image.c index 21ab3bd..2165e11 100644 --- a/image.c +++ b/image.c @@ -337,6 +337,8 @@ bool img_load(img_t *img, const fileinfo_t *file) img->w = imlib_image_get_width(); img->h = imlib_image_get_height(); + img->flip = FLIP_NONE; + img->rotation = DEGREE_0; img->scalemode = options->scalemode; img->re = false; img->checkpan = false; @@ -689,10 +691,14 @@ bool img_pan_edge(img_t *img, direction_t dir) void img_rotate(img_t *img, degree_t d) { int ox, oy, tmp; + bool reapply = d == -1; if (img == NULL || img->im == NULL || img->win == NULL) return; + if (reapply) + d = img->rotation; + imlib_context_set_image(img->im); imlib_image_orientate(d); @@ -708,25 +714,29 @@ void img_rotate(img_t *img, degree_t d) img->h = tmp; img->checkpan = true; } - + if (!reapply) + img->rotation = (img->rotation + d) % 4; img->dirty = true; } void img_flip(img_t *img, flipdir_t d) { + bool reapply = d == -1; + if (img == NULL || img->im == NULL) return; + if (reapply) + d = img->flip; + imlib_context_set_image(img->im); - switch (d) { - case FLIP_HORIZONTAL: - imlib_image_flip_horizontal(); - break; - case FLIP_VERTICAL: - imlib_image_flip_vertical(); - break; - } + if (d & FLIP_HORIZONTAL) + imlib_image_flip_horizontal(); + if (d & FLIP_VERTICAL) + imlib_image_flip_vertical(); + if (!reapply) + img->flip ^= d; img->dirty = true; } @@ -785,6 +795,10 @@ bool img_frame_goto(img_t *img, int n) img->checkpan = true; img->dirty = true; + if (img->flip != FLIP_NONE) + img_flip(img, -1); + if (img->rotation != DEGREE_0) + img_rotate(img, -1); return true; } diff --git a/image.h b/image.h index f83ed6b..bd59bb3 100644 --- a/image.h +++ b/image.h @@ -57,6 +57,9 @@ typedef struct { bool aa; bool alpha; + flipdir_t flip; + degree_t rotation; + Imlib_Color_Modifier cmod; int gamma; diff --git a/types.h b/types.h index 2cd305e..fedc1cb 100644 --- a/types.h +++ b/types.h @@ -39,14 +39,16 @@ typedef enum { } direction_t; typedef enum { + DEGREE_0 = 0, DEGREE_90 = 1, DEGREE_180 = 2, DEGREE_270 = 3 } degree_t; typedef enum { - FLIP_HORIZONTAL, - FLIP_VERTICAL + FLIP_NONE = 0, + FLIP_HORIZONTAL = 1, + FLIP_VERTICAL = 2 } flipdir_t; typedef enum {