From f795273b650a4df39dca693f30c3650ec1d3393f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Bert=20M=C3=BCnnich?= <ber.t@posteo.de>
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 {