Krolyxon
Commit 9dc46c1

Branches

Refs →

nsxiv9dc46c1

Nicer zooming

Author
Bert
Date
2011-01-21 10:29 +0100
Parent
bb12b8c
Commit
9dc46c1d81e74716f643dfab8c267cc6c3d8ec08

+45 −26

2 files changed

  1. M config.h +6 −4
  2. M image.c +39 −22
M config.h View
@@ -3,11 +3,13 @@
33 #define WIN_HEIGHT 600
44
55 /* */
6−#define SCALE_MODE SCALE_DOWN
6+#define BG_COLOR "#888888"
77
88 /* */
9−#define ZOOM_MIN 12.5
10−#define ZOOM_MAX 400
9+#define SCALE_MODE SCALE_DOWN
1110
1211 /* */
13−#define BG_COLOR "#888888"
12+static const float zoom_levels[] = {
13+ 12.5, 25.0, 50.0, 75.0,
14+ 100.0, 150.0, 200.0, 400.0, 800.0
15+};
M image.c View
@@ -24,6 +24,10 @@
2424 #include "sxiv.h"
2525 #include "image.h"
2626
27+int zl_cnt;
28+float zoom_min;
29+float zoom_max;
30+
2731 void imlib_init(win_t *win) {
2832 if (!win)
2933 return;
@@ -31,6 +35,10 @@ void imlib_init(win_t *win) {
3135 imlib_context_set_display(win->env.dpy);
3236 imlib_context_set_visual(win->env.vis);
3337 imlib_context_set_colormap(win->env.cmap);
38+
39+ zl_cnt = sizeof(zoom_levels) / sizeof(zoom_levels[0]);
40+ zoom_min = zoom_levels[0] / 100.0;
41+ zoom_max = zoom_levels[zl_cnt - 1] / 100.0;
3442 }
3543
3644 void imlib_destroy() {
@@ -72,10 +80,10 @@ void img_display(img_t *img, win_t *win) {
7280 zh = (float) win->h / (float) img->h;
7381 img->zoom = MIN(zw, zh);
7482
75− if (img->zoom * 100.0 < ZOOM_MIN)
76− img->zoom = ZOOM_MIN / 100.0;
77− else if (img->zoom * 100.0 > ZOOM_MAX)
78− img->zoom = ZOOM_MAX / 100.0;
83+ if (img->zoom < zoom_min)
84+ img->zoom = zoom_min;
85+ else if (img->zoom > zoom_max)
86+ img->zoom = zoom_max;
7987
8088 if (img->scalemode == SCALE_DOWN && img->zoom > 1.0)
8189 img->zoom = 1.0;
@@ -150,25 +158,14 @@ void img_render(img_t *img, win_t *win) {
150158 win_draw(win);
151159 }
152160
153−int img_zoom(img_t *img, int d) {
154− int ad, iz;
155− float z;
156−
161+int img_zoom(img_t *img, float z) {
157162 if (!img)
158163 return 0;
159164
160− ad = ABS(d);
161− iz = (int) (img->zoom * 1000.0) + d;
162− if (iz % ad > ad / 2)
163− iz += ad - iz % ad;
164− else
165− iz -= iz % ad;
166− z = (float) iz / 1000.0;
167−
168− if (z * 100.0 < ZOOM_MIN)
169− z = ZOOM_MIN / 100.0;
170− else if (z * 100.0 > ZOOM_MAX)
171− z = ZOOM_MAX / 100.0;
165+ if (z < zoom_min)
166+ z = zoom_min;
167+ else if (z > zoom_max)
168+ z = zoom_max;
172169
173170 if (z != img->zoom) {
174171 img->x -= (img->w * z - img->w * img->zoom) / 2;
@@ -181,9 +178,29 @@ int img_zoom(img_t *img, int d) {
181178 }
182179
183180 int img_zoom_in(img_t *img) {
184− return img_zoom(img, 125);
181+ int i;
182+
183+ if (!img)
184+ return 0;
185+
186+ for (i = 1; i < zl_cnt; ++i) {
187+ if (zoom_levels[i] > img->zoom * 100.0)
188+ return img_zoom(img, zoom_levels[i] / 100.0);
189+ }
190+
191+ return 0;
185192 }
186193
187194 int img_zoom_out(img_t *img) {
188− return img_zoom(img, -125);
195+ int i;
196+
197+ if (!img)
198+ return 0;
199+
200+ for (i = zl_cnt - 2; i >= 0; --i) {
201+ if (zoom_levels[i] < img->zoom * 100.0)
202+ return img_zoom(img, zoom_levels[i] / 100.0);
203+ }
204+
205+ return 0;
189206 }