Krolyxon
Commit a2339e7

Branches

Refs →

nsxiva2339e7

Use zoom steps instead of hard-coding levels (#92)

Author
Lu Xu
Date
2021-09-25 08:10 +0300
Committer
NRK · 2021-09-25 11:11 +0600
Parent
696f687
Commit
a2339e70fdac1db7453cb008c4e37acdb5468f02

+22 −63

4 files changed

  1. M commands.c +2 −6
  2. M config.def.h +4 −7
  3. M image.c +11 −47
  4. M nsxiv.h +5 −3
M commands.c View
@@ -184,12 +184,8 @@ bool cg_zoom(arg_t d)
184184 {
185185 if (mode == MODE_THUMB)
186186 return tns_zoom(&tns, d);
187− else if (d > 0)
188− return img_zoom_in(&img);
189− else if (d < 0)
190− return img_zoom_out(&img);
191187 else
192− return false;
188+ return img_zoom(&img, d);
193189 }
194190
195191 bool cg_toggle_image_mark(arg_t _)
@@ -380,7 +376,7 @@ bool ci_drag(arg_t mode)
380376
381377 bool ci_set_zoom(arg_t zl)
382378 {
383− return img_zoom(&img, (prefix ? prefix : zl) / 100.0);
379+ return img_zoom_to(&img, (prefix ? prefix : zl) / 100.0);
384380 }
385381
386382 bool ci_fit_to_win(arg_t sm)
M config.def.h View
@@ -25,13 +25,10 @@ static const suffixmode_t TITLE_SUFFIXMODE = SUFFIX_BASENAME;
2525 #endif
2626 #ifdef _IMAGE_CONFIG
2727
28−/* levels (in percent) to use when zooming via '-' and '+':
29− * (first/last value is used as min/max zoom level)
30− */
31−static const float zoom_levels[] = {
32− 12.5, 25.0, 50.0, 75.0,
33− 100.0, 150.0, 200.0, 400.0, 800.0
34−};
28+/* zoom level of 1.0 means 100% */
29+static const float ZOOM_MIN = 0.01;
30+static const float ZOOM_MAX = 20.0;
31+static const float ZOOM_STEP = 1.2599210498948732; /* 2^(1/3) */
3532
3633 /* default slideshow delay (in sec, overwritten via -S option): */
3734 static const int SLIDESHOW_DELAY = 5;
M image.c View
@@ -42,19 +42,8 @@ enum { DEF_GIF_DELAY = 75 };
4242 enum { DEF_WEBP_DELAY = 75 };
4343 #endif
4444
45−float zoom_min;
46−float zoom_max;
47−
48−static int zoomdiff(img_t *img, float z)
49−{
50− return (int) ((img->w * z - img->w * img->zoom) + (img->h * z - img->h * img->zoom));
51−}
52−
5345 void img_init(img_t *img, win_t *win)
5446 {
55− zoom_min = zoom_levels[0] / 100.0;
56− zoom_max = zoom_levels[ARRLEN(zoom_levels) - 1] / 100.0;
57−
5847 imlib_context_set_display(win->env.dpy);
5948 imlib_context_set_visual(win->env.vis);
6049 imlib_context_set_colormap(win->env.cmap);
@@ -63,8 +52,8 @@ void img_init(img_t *img, win_t *win)
6352 img->win = win;
6453 img->scalemode = options->scalemode;
6554 img->zoom = options->zoom;
66− img->zoom = MAX(img->zoom, zoom_min);
67− img->zoom = MIN(img->zoom, zoom_max);
55+ img->zoom = MAX(img->zoom, ZOOM_MIN);
56+ img->zoom = MIN(img->zoom, ZOOM_MAX);
6857 img->checkpan = false;
6958 img->dirty = false;
7059 img->aa = ANTI_ALIAS;
@@ -569,9 +558,9 @@ bool img_fit(img_t *img)
569558 z = MIN(zw, zh);
570559 break;
571560 }
572− z = MIN(z, img->scalemode == SCALE_DOWN ? 1.0 : zoom_max);
561+ z = MIN(z, img->scalemode == SCALE_DOWN ? 1.0 : ZOOM_MAX);
573562
574− if (zoomdiff(img, z) != 0) {
563+ if (ABS(img->zoom - z) > 1.0/MAX(img->w, img->h)) {
575564 img->zoom = z;
576565 img->dirty = true;
577566 return true;
@@ -687,16 +676,10 @@ bool img_fit_win(img_t *img, scalemode_t sm)
687676 }
688677 }
689678
690−bool img_zoom(img_t *img, float z)
679+bool img_zoom_to(img_t *img, float z)
691680 {
692− z = MAX(z, zoom_min);
693− z = MIN(z, zoom_max);
694−
695− img->scalemode = SCALE_ZOOM;
696−
697− if (zoomdiff(img, z) != 0) {
698− int x, y;
699−
681+ int x, y;
682+ if (ZOOM_MIN <= z && z <= ZOOM_MAX) {
700683 win_cursor_pos(img->win, &x, &y);
701684 if (x < 0 || x >= img->win->w || y < 0 || y >= img->win->h) {
702685 x = img->win->w / 2;
@@ -705,6 +688,7 @@ bool img_zoom(img_t *img, float z)
705688 img->x = x - (x - img->x) * z / img->zoom;
706689 img->y = y - (y - img->y) * z / img->zoom;
707690 img->zoom = z;
691+ img->scalemode = SCALE_ZOOM;
708692 img->checkpan = true;
709693 img->dirty = true;
710694 return true;
@@ -713,30 +697,10 @@ bool img_zoom(img_t *img, float z)
713697 }
714698 }
715699
716−bool img_zoom_in(img_t *img)
700+bool img_zoom(img_t *img, int d)
717701 {
718− int i;
719− float z;
720−
721− for (i = 0; i < ARRLEN(zoom_levels); i++) {
722− z = zoom_levels[i] / 100.0;
723− if (zoomdiff(img, z) > 0)
724− return img_zoom(img, z);
725− }
726− return false;
727−}
728−
729−bool img_zoom_out(img_t *img)
730−{
731− int i;
732− float z;
733−
734− for (i = ARRLEN(zoom_levels) - 1; i >= 0; i--) {
735− z = zoom_levels[i] / 100.0;
736− if (zoomdiff(img, z) < 0)
737− return img_zoom(img, z);
738− }
739− return false;
702+ const float z = img->zoom * (d > 0 ? ZOOM_STEP : 1/ZOOM_STEP);
703+ return img_zoom_to(img, z);
740704 }
741705
742706 bool img_pos(img_t *img, float x, float y)
M nsxiv.h View
@@ -39,6 +39,9 @@
3939 #ifndef MAX
4040 #define MAX(a,b) ((a) > (b) ? (a) : (b))
4141 #endif
42+#ifndef ABS
43+#define ABS(a) ((a) > 0 ? (a) : -(a))
44+#endif
4245
4346 #define ARRLEN(a) (sizeof(a) / sizeof((a)[0]))
4447
@@ -246,9 +249,8 @@ bool img_load(img_t*, const fileinfo_t*);
246249 CLEANUP void img_close(img_t*, bool);
247250 void img_render(img_t*);
248251 bool img_fit_win(img_t*, scalemode_t);
249−bool img_zoom(img_t*, float);
250−bool img_zoom_in(img_t*);
251−bool img_zoom_out(img_t*);
252+bool img_zoom(img_t*, int);
253+bool img_zoom_to(img_t*, float);
252254 bool img_pos(img_t*, float, float);
253255 bool img_move(img_t*, float, float);
254256 bool img_pan(img_t*, direction_t, int);