| @@ -42,19 +42,8 @@ enum { DEF_GIF_DELAY = 75 }; |
| 42 | 42 | | enum { DEF_WEBP_DELAY = 75 }; |
| 43 | 43 | | #endif |
| 44 | 44 | | |
| 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 | | − | |
| 53 | 45 | | void img_init(img_t *img, win_t *win) |
| 54 | 46 | | { |
| 55 | | − | zoom_min = zoom_levels[0] / 100.0; |
| 56 | | − | zoom_max = zoom_levels[ARRLEN(zoom_levels) - 1] / 100.0; |
| 57 | | − | |
| 58 | 47 | | imlib_context_set_display(win->env.dpy); |
| 59 | 48 | | imlib_context_set_visual(win->env.vis); |
| 60 | 49 | | imlib_context_set_colormap(win->env.cmap); |
| @@ -63,8 +52,8 @@ void img_init(img_t *img, win_t *win) |
| 63 | 52 | | img->win = win; |
| 64 | 53 | | img->scalemode = options->scalemode; |
| 65 | 54 | | 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); |
| 68 | 57 | | img->checkpan = false; |
| 69 | 58 | | img->dirty = false; |
| 70 | 59 | | img->aa = ANTI_ALIAS; |
| @@ -569,9 +558,9 @@ bool img_fit(img_t *img) |
| 569 | 558 | | z = MIN(zw, zh); |
| 570 | 559 | | break; |
| 571 | 560 | | } |
| 572 | | − | z = MIN(z, img->scalemode == SCALE_DOWN ? 1.0 : zoom_max); |
| 561 | + | z = MIN(z, img->scalemode == SCALE_DOWN ? 1.0 : ZOOM_MAX); |
| 573 | 562 | | |
| 574 | | − | if (zoomdiff(img, z) != 0) { |
| 563 | + | if (ABS(img->zoom - z) > 1.0/MAX(img->w, img->h)) { |
| 575 | 564 | | img->zoom = z; |
| 576 | 565 | | img->dirty = true; |
| 577 | 566 | | return true; |
| @@ -687,16 +676,10 @@ bool img_fit_win(img_t *img, scalemode_t sm) |
| 687 | 676 | | } |
| 688 | 677 | | } |
| 689 | 678 | | |
| 690 | | − | bool img_zoom(img_t *img, float z) |
| 679 | + | bool img_zoom_to(img_t *img, float z) |
| 691 | 680 | | { |
| 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) { |
| 700 | 683 | | win_cursor_pos(img->win, &x, &y); |
| 701 | 684 | | if (x < 0 || x >= img->win->w || y < 0 || y >= img->win->h) { |
| 702 | 685 | | x = img->win->w / 2; |
| @@ -705,6 +688,7 @@ bool img_zoom(img_t *img, float z) |
| 705 | 688 | | img->x = x - (x - img->x) * z / img->zoom; |
| 706 | 689 | | img->y = y - (y - img->y) * z / img->zoom; |
| 707 | 690 | | img->zoom = z; |
| 691 | + | img->scalemode = SCALE_ZOOM; |
| 708 | 692 | | img->checkpan = true; |
| 709 | 693 | | img->dirty = true; |
| 710 | 694 | | return true; |
| @@ -713,30 +697,10 @@ bool img_zoom(img_t *img, float z) |
| 713 | 697 | | } |
| 714 | 698 | | } |
| 715 | 699 | | |
| 716 | | − | bool img_zoom_in(img_t *img) |
| 700 | + | bool img_zoom(img_t *img, int d) |
| 717 | 701 | | { |
| 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); |
| 740 | 704 | | } |
| 741 | 705 | | |
| 742 | 706 | | bool img_pos(img_t *img, float x, float y) |