aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorHarry Jeffery <harry@exec64.co.uk>2017-08-06 20:15:05 +0100
committerGitHub <noreply@github.com>2017-08-06 20:15:05 +0100
commit167f1280ce974247dfce30dac840f4b3130bd12d (patch)
tree7a9dcc420a109d01166b5857dc75148a539dae31 /src
parentcf0baaa9778b842c4d2ed3c2f560906bce800eb9 (diff)
parent69cc94ef23ea2b11c65a4c06e5e17aaea95a973e (diff)
downloadimv-167f1280ce974247dfce30dac840f4b3130bd12d.tar.gz
Merge pull request #112 from SirCmpwn/limit_scrolling
Prevent scrolling images indefinitely off-screen
Diffstat (limited to 'src')
-rw-r--r--src/imv.c4
-rw-r--r--src/viewport.c19
-rw-r--r--src/viewport.h6
3 files changed, 24 insertions, 5 deletions
diff --git a/src/imv.c b/src/imv.c
index 368973b..34066cf 100644
--- a/src/imv.c
+++ b/src/imv.c
@@ -722,7 +722,7 @@ static void handle_event(struct imv *imv, SDL_Event *event)
break;
case SDL_MOUSEMOTION:
if(event->motion.state & SDL_BUTTON_LMASK) {
- imv_viewport_move(imv->view, event->motion.xrel, event->motion.yrel);
+ imv_viewport_move(imv->view, event->motion.xrel, event->motion.yrel, imv->texture);
}
SDL_ShowCursor(SDL_ENABLE);
break;
@@ -815,7 +815,7 @@ void command_pan(struct imv_list *args, void *data)
long int x = strtol(args->items[1], NULL, 10);
long int y = strtol(args->items[2], NULL, 10);
- imv_viewport_move(imv->view, x, y);
+ imv_viewport_move(imv->view, x, y, imv->texture);
}
void command_select_rel(struct imv_list *args, void *data)
diff --git a/src/viewport.c b/src/viewport.c
index d096a45..036749f 100644
--- a/src/viewport.c
+++ b/src/viewport.c
@@ -57,12 +57,29 @@ void imv_viewport_scale_to_actual(struct imv_viewport *view, const struct imv_te
imv_viewport_center(view, tex);
}
-void imv_viewport_move(struct imv_viewport *view, int x, int y)
+void imv_viewport_move(struct imv_viewport *view, int x, int y,
+ const struct imv_texture *tex)
{
view->x += x;
view->y += y;
view->redraw = 1;
view->locked = 1;
+ int w = (int)((double)tex->width * view->scale);
+ int h = (int)((double)tex->height * view->scale);
+ int ww, wh;
+ SDL_GetWindowSize(view->window, &ww, &wh);
+ if (view->x < -w) {
+ view->x = -w;
+ }
+ if (view->x > ww) {
+ view->x = ww;
+ }
+ if (view->y < -h) {
+ view->y = -h;
+ }
+ if (view->y > wh) {
+ view->y = wh;
+ }
}
void imv_viewport_zoom(struct imv_viewport *view, const struct imv_texture *tex, enum imv_zoom_source src, int amount)
diff --git a/src/viewport.h b/src/viewport.h
index d1803d4..9e1a13c 100644
--- a/src/viewport.h
+++ b/src/viewport.h
@@ -52,8 +52,10 @@ void imv_viewport_toggle_playing(struct imv_viewport *view);
/* Reset the viewport to its initial settings */
void imv_viewport_reset(struct imv_viewport *view);
-/* Pan the view by the given amounts */
-void imv_viewport_move(struct imv_viewport *view, int x, int y);
+/* Pan the view by the given amounts without letting the texture get too far
+ * off-screen */
+void imv_viewport_move(struct imv_viewport *view, int x, int y,
+ const struct imv_texture *tex);
/* Zoom the view by the given amount. imv_texture* is used to get the image
* dimensions */