aboutsummaryrefslogtreecommitdiff
path: root/src/viewport.c
diff options
context:
space:
mode:
authorJose Diez <jose.manuel.diez@gmail.com>2015-11-11 15:02:07 +0000
committerHarry Jeffery <harry@exec64.co.uk>2015-11-11 18:12:05 +0000
commit79281774a6f1e72aa6fba99dd9b3524b3cd5a2cd (patch)
treea7cdd9ee774c5d4cccd02431ad3de3a6c627cae9 /src/viewport.c
parent8be90edcaadb4f1770bbd1451bb08372b25525d5 (diff)
downloadimv-79281774a6f1e72aa6fba99dd9b3524b3cd5a2cd.tar.gz
Improved zoom behaviour
Diffstat (limited to 'src/viewport.c')
-rw-r--r--src/viewport.c36
1 files changed, 35 insertions, 1 deletions
diff --git a/src/viewport.c b/src/viewport.c
index bb2e92e..38deabc 100644
--- a/src/viewport.c
+++ b/src/viewport.c
@@ -71,13 +71,47 @@ void imv_viewport_move(struct imv_viewport *view, int x, int y)
view->locked = 1;
}
-void imv_viewport_zoom(struct imv_viewport *view, int amount)
+void imv_viewport_zoom(struct imv_viewport *view, const struct imv_image *img, enum imv_zoom_source src, int amount)
{
+ double prevScale = view->scale;
+ int x, y;
+
+ if(src == MOUSE) {
+ SDL_GetMouseState(&x, &y);
+ /* Translate mouse coordinates to projected coordinates */
+ x -= view->x;
+ y -= view->y;
+ } else x = y = 0;
+
+ int scaledWidth = img->width * view->scale;
+ int scaledHeight = img->height * view->scale;
+ if(x > scaledWidth) {
+ x = scaledWidth;
+ }
+
+ if(y > scaledHeight) {
+ y = scaledHeight;
+ }
+
view->scale += amount * 0.1;
if(view->scale > 100)
view->scale = 10;
else if (view->scale < 0.01)
view->scale = 0.1;
+
+ double changeX = x - (x * (view->scale / prevScale));
+ double changeY = y - (y * (view->scale / prevScale));
+
+ if(amount < 0 &&
+ (view->x <= 0 && (view->x + changeX > 0 || !changeX))) {
+ view->x = 0;
+ } else view->x += changeX;
+
+ if(amount < 0 &&
+ (view->y <= 0 && (view->y + changeY > 0 || !changeY))) {
+ view->y = 0;
+ } else view->y += changeY;
+
view->redraw = 1;
view->locked = 1;
}