diff --git a/README.md b/README.md index 5950ad1..e82a91d 100644 --- a/README.md +++ b/README.md @@ -122,6 +122,7 @@ The following additional key commands are available in *image mode*: (also with Ctrl-arrow keys) <,> Rotate image (counter-)clockwise by 90 degrees + \,| Flip image horizontally/vertically s Toggle slideshow Ctrl-'-' Decrease slideshow delay diff --git a/commands.c b/commands.c index c7c817f..92d5ca7 100644 --- a/commands.c +++ b/commands.c @@ -342,6 +342,21 @@ bool i_rotate(arg_t a) { return false; } +bool i_flip(arg_t a) { + flip_t flp = (flip_t) a; + + if (mode == MODE_IMAGE) { + if (flp == FLIP_HORIZONTAL) { + img_flip_horizontal(&img); + return true; + } else if (flp == FLIP_VERTICAL) { + img_flip_vertical(&img); + return true; + } + } + return false; +} + bool i_toggle_antialias(arg_t a) { if (mode == MODE_IMAGE) { img_toggle_antialias(&img); diff --git a/commands.h b/commands.h index aeaf884..4364722 100644 --- a/commands.h +++ b/commands.h @@ -61,6 +61,7 @@ bool i_set_zoom(arg_t); bool i_fit_to_win(arg_t); bool i_fit_to_img(arg_t); bool i_rotate(arg_t); +bool i_flip(arg_t); bool i_toggle_slideshow(arg_t); bool i_adjust_slideshow(arg_t); bool i_reset_slideshow(arg_t); diff --git a/config.def.h b/config.def.h index 95562a3..f711405 100644 --- a/config.def.h +++ b/config.def.h @@ -113,6 +113,9 @@ static const keymap_t keys[] = { { false, XK_less, i_rotate, (arg_t) DIR_LEFT }, { false, XK_greater, i_rotate, (arg_t) DIR_RIGHT }, + { false, XK_backslash, i_flip, (arg_t) FLIP_HORIZONTAL }, + { false, XK_bar, i_flip, (arg_t) FLIP_VERTICAL }, + { false, XK_a, i_toggle_antialias, (arg_t) None }, { false, XK_A, it_toggle_alpha, (arg_t) None }, diff --git a/image.c b/image.c index 3410a0b..2267204 100644 --- a/image.c +++ b/image.c @@ -642,6 +642,26 @@ void img_rotate_right(img_t *img) { img_rotate(img, 1); } +void img_flip(img_t *img, int f) { + if (img == NULL || img->im == NULL || img->win == NULL) + return; + + imlib_context_set_image(img->im); + if (f == 0) + imlib_image_flip_horizontal(); + else + imlib_image_flip_vertical(); + img->dirty = true; +} + +void img_flip_horizontal(img_t *img) { + img_flip(img, 0); +} + +void img_flip_vertical(img_t *img) { + img_flip(img, 1); +} + void img_toggle_antialias(img_t *img) { if (img == NULL || img->im == NULL) return; diff --git a/image.h b/image.h index bb4b548..5661b01 100644 --- a/image.h +++ b/image.h @@ -76,9 +76,14 @@ bool img_move(img_t*, float, float); bool img_pan(img_t*, direction_t, int); bool img_pan_edge(img_t*, direction_t); +void img_rotate(img_t*, int); void img_rotate_left(img_t*); void img_rotate_right(img_t*); +void img_flip(img_t*, int); +void img_flip_horizontal(img_t*); +void img_flip_vertical(img_t*); + void img_toggle_antialias(img_t*); bool img_frame_navigate(img_t*, int); diff --git a/sxiv.1 b/sxiv.1 index aa9e420..bf1ac32 100644 --- a/sxiv.1 +++ b/sxiv.1 @@ -238,6 +238,13 @@ Rotate image counter-clockwise by 90 degrees. .TP .B > Rotate image clockwise by 90 degrees. +.SS Flip +.TP +.B \\\\ +Flip image horizontally. +.TP +.B | +Flip image vertically. .SS Slideshow .TP .B s diff --git a/types.h b/types.h index 1d72c95..0a4214c 100644 --- a/types.h +++ b/types.h @@ -23,6 +23,11 @@ typedef enum { DIR_DOWN } direction_t; +typedef enum { + FLIP_HORIZONTAL, + FLIP_VERTICAL +} flip_t; + typedef enum { SCALE_DOWN, SCALE_FIT,