summaryrefslogtreecommitdiffstats
path: root/image.c
diff options
context:
space:
mode:
authorBert <ber.t@gmx.com>2011-01-20 23:22:00 +0100
committerBert <ber.t@gmx.com>2011-01-20 23:22:00 +0100
commitbb12b8c0fbc4d0a791f8a2cb8c7f2d64df995a4d (patch)
tree5a10ba48c3393f1b23f446cac915da0dfd6f730e /image.c
parent376c0d90c7d9162c05e693c198911a4cf000f5a3 (diff)
downloadnsxiv-bb12b8c0fbc4d0a791f8a2cb8c7f2d64df995a4d.tar.zst
First try on zooming
Diffstat (limited to 'image.c')
-rw-r--r--image.c62
1 files changed, 62 insertions, 0 deletions
diff --git a/image.c b/image.c
index c98c310..0b6d6c5 100644
--- a/image.c
+++ b/image.c
@@ -88,6 +88,28 @@ void img_display(img_t *img, win_t *win) {
img_render(img, win);
}
+void img_check_pan(img_t *img, win_t *win) {
+ if (!img)
+ return;
+
+ if (img->w * img->zoom > win->w) {
+ if (img->x > 0 && img->x + img->w * img->zoom > win->w)
+ img->x = 0;
+ if (img->x < 0 && img->x + img->w * img->zoom < win->w)
+ img->x = win->w - img->w * img->zoom;
+ } else {
+ img->x = (win->w - img->w * img->zoom) / 2;
+ }
+ if (img->h * img->zoom > win->h) {
+ if (img->y > 0 && img->y + img->h * img->zoom > win->h)
+ img->y = 0;
+ if (img->y < 0 && img->y + img->h * img->zoom < win->h)
+ img->y = win->h - img->h * img->zoom;
+ } else {
+ img->y = (win->h - img->h * img->zoom) / 2;
+ }
+}
+
void img_render(img_t *img, win_t *win) {
int sx, sy, sw, sh;
int dx, dy, dw, dh;
@@ -95,6 +117,8 @@ void img_render(img_t *img, win_t *win) {
if (!img || !win || !imlib_context_get_image())
return;
+ img_check_pan(img, win);
+
if (img->x < 0) {
sx = -img->x / img->zoom;
sw = win->w / img->zoom;
@@ -125,3 +149,41 @@ void img_render(img_t *img, win_t *win) {
win_draw(win);
}
+
+int img_zoom(img_t *img, int d) {
+ int ad, iz;
+ float z;
+
+ if (!img)
+ return 0;
+
+ ad = ABS(d);
+ iz = (int) (img->zoom * 1000.0) + d;
+ if (iz % ad > ad / 2)
+ iz += ad - iz % ad;
+ else
+ iz -= iz % ad;
+ z = (float) iz / 1000.0;
+
+ if (z * 100.0 < ZOOM_MIN)
+ z = ZOOM_MIN / 100.0;
+ else if (z * 100.0 > ZOOM_MAX)
+ z = ZOOM_MAX / 100.0;
+
+ if (z != img->zoom) {
+ img->x -= (img->w * z - img->w * img->zoom) / 2;
+ img->y -= (img->h * z - img->h * img->zoom) / 2;
+ img->zoom = z;
+ return 1;
+ } else {
+ return 0;
+ }
+}
+
+int img_zoom_in(img_t *img) {
+ return img_zoom(img, 125);
+}
+
+int img_zoom_out(img_t *img) {
+ return img_zoom(img, -125);
+}