aboutsummaryrefslogtreecommitdiff
path: root/src/imv.c
diff options
context:
space:
mode:
authorAnton Älgmyr <anton@algmyr.se>2020-03-11 00:35:28 +0100
committerHarry Jeffery <harry@exec64.co.uk>2020-06-12 01:00:10 +0100
commitf968eb420c8d30d45adc1f668c15c29f5b9ee87d (patch)
tree48e33cd4bc0613dd87d66151cbfaab5d7ff6a093 /src/imv.c
parenteb60fefc3b7e9b5367bca9d3b5e5d4e50f5b72a7 (diff)
downloadimv-f968eb420c8d30d45adc1f668c15c29f5b9ee87d.tar.gz
Add rotation and flipping commands.
Rotation can be done by any amount (not limited to multiples of 90). Commands allow flipping horizontally and vertically. The flips are done relative to the current rotation.
Diffstat (limited to 'src/imv.c')
-rw-r--r--src/imv.c49
1 files changed, 47 insertions, 2 deletions
diff --git a/src/imv.c b/src/imv.c
index 5522223..313b253 100644
--- a/src/imv.c
+++ b/src/imv.c
@@ -179,6 +179,9 @@ static void command_next(struct list *args, const char *argstr, void *data);
static void command_prev(struct list *args, const char *argstr, void *data);
static void command_goto(struct list *args, const char *argstr, void *data);
static void command_zoom(struct list *args, const char *argstr, void *data);
+static void command_rotate(struct list *args, const char *argstr, void *data);
+static void command_rotate_to(struct list *args, const char *argstr, void *data);
+static void command_flip(struct list *args, const char *argstr, void *data);
static void command_open(struct list *args, const char *argstr, void *data);
static void command_close(struct list *args, const char *argstr, void *data);
static void command_fullscreen(struct list *args, const char *argstr, void *data);
@@ -497,6 +500,9 @@ struct imv *imv_create(void)
imv_command_register(imv->commands, "prev", &command_prev);
imv_command_register(imv->commands, "goto", &command_goto);
imv_command_register(imv->commands, "zoom", &command_zoom);
+ imv_command_register(imv->commands, "rotate", &command_rotate);
+ imv_command_register(imv->commands, "rotate_to", &command_rotate_to);
+ imv_command_register(imv->commands, "flip", &command_flip);
imv_command_register(imv->commands, "open", &command_open);
imv_command_register(imv->commands, "close", &command_close);
imv_command_register(imv->commands, "fullscreen", &command_fullscreen);
@@ -1183,10 +1189,15 @@ static void render_window(struct imv *imv)
/* draw our actual image */
if (imv->current_image) {
int x, y;
- double scale;
+ double scale, rotation;
+ bool mirrored;
imv_viewport_get_offset(imv->view, &x, &y);
imv_viewport_get_scale(imv->view, &scale);
- imv_canvas_draw_image(imv->canvas, imv->current_image, x, y, scale, imv->upscaling_method, imv->cache_invalidated);
+ imv_viewport_get_rotation(imv->view, &rotation);
+ imv_viewport_get_mirrored(imv->view, &mirrored);
+ imv_canvas_draw_image(imv->canvas, imv->current_image,
+ x, y, scale, rotation, mirrored,
+ imv->upscaling_method, imv->cache_invalidated);
}
imv_canvas_clear(imv->canvas);
@@ -1497,6 +1508,39 @@ static void command_zoom(struct list *args, const char *argstr, void *data)
}
}
+static void command_rotate(struct list *args, const char *argstr, void *data)
+{
+ (void)argstr;
+ struct imv *imv = data;
+ if (args->len == 2) {
+ double degrees = strtod(args->items[1], NULL);
+ imv_viewport_rotate(imv->view, degrees);
+ }
+}
+
+static void command_rotate_to(struct list *args, const char *argstr, void *data)
+{
+ (void)argstr;
+ struct imv *imv = data;
+ if (args->len == 2) {
+ double degrees = strtod(args->items[1], NULL);
+ imv_viewport_rotate_to(imv->view, degrees);
+ }
+}
+
+static void command_flip(struct list *args, const char *argstr, void *data)
+{
+ (void)argstr;
+ struct imv *imv = data;
+ if (args->len == 2) {
+ if (!strcmp(args->items[1], "vertical")) {
+ imv_viewport_flip_v(imv->view);
+ } else if (!strcmp(args->items[1], "horizontal")) {
+ imv_viewport_flip_h(imv->view);
+ }
+ }
+}
+
static void command_open(struct list *args, const char *argstr, void *data)
{
(void)argstr;
@@ -1584,6 +1628,7 @@ static void command_reset(struct list *args, const char *argstr, void *data)
(void)args;
(void)argstr;
struct imv *imv = data;
+ imv_viewport_rotate_to(imv->view, 0);
imv->need_rescale = true;
imv->need_redraw = true;
}