diff options
author | Jose Diez <jose.manuel.diez@gmail.com> | 2015-11-11 15:02:07 +0000 |
---|---|---|
committer | Harry Jeffery <harry@exec64.co.uk> | 2015-11-11 18:12:05 +0000 |
commit | 79281774a6f1e72aa6fba99dd9b3524b3cd5a2cd (patch) | |
tree | a7cdd9ee774c5d4cccd02431ad3de3a6c627cae9 /src/viewport.c | |
parent | 8be90edcaadb4f1770bbd1451bb08372b25525d5 (diff) | |
download | imv-79281774a6f1e72aa6fba99dd9b3524b3cd5a2cd.tar.gz |
Improved zoom behaviour
Diffstat (limited to 'src/viewport.c')
-rw-r--r-- | src/viewport.c | 36 |
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; } |