| @@ -88,6 +88,28 @@ void img_display(img_t *img, win_t *win) { |
| 88 | 88 | | img_render(img, win); |
| 89 | 89 | | } |
| 90 | 90 | | |
| 91 | + | void img_check_pan(img_t *img, win_t *win) { |
| 92 | + | if (!img) |
| 93 | + | return; |
| 94 | + | |
| 95 | + | if (img->w * img->zoom > win->w) { |
| 96 | + | if (img->x > 0 && img->x + img->w * img->zoom > win->w) |
| 97 | + | img->x = 0; |
| 98 | + | if (img->x < 0 && img->x + img->w * img->zoom < win->w) |
| 99 | + | img->x = win->w - img->w * img->zoom; |
| 100 | + | } else { |
| 101 | + | img->x = (win->w - img->w * img->zoom) / 2; |
| 102 | + | } |
| 103 | + | if (img->h * img->zoom > win->h) { |
| 104 | + | if (img->y > 0 && img->y + img->h * img->zoom > win->h) |
| 105 | + | img->y = 0; |
| 106 | + | if (img->y < 0 && img->y + img->h * img->zoom < win->h) |
| 107 | + | img->y = win->h - img->h * img->zoom; |
| 108 | + | } else { |
| 109 | + | img->y = (win->h - img->h * img->zoom) / 2; |
| 110 | + | } |
| 111 | + | } |
| 112 | + | |
| 91 | 113 | | void img_render(img_t *img, win_t *win) { |
| 92 | 114 | | int sx, sy, sw, sh; |
| 93 | 115 | | int dx, dy, dw, dh; |
| @@ -95,6 +117,8 @@ void img_render(img_t *img, win_t *win) { |
| 95 | 117 | | if (!img || !win || !imlib_context_get_image()) |
| 96 | 118 | | return; |
| 97 | 119 | | |
| 120 | + | img_check_pan(img, win); |
| 121 | + | |
| 98 | 122 | | if (img->x < 0) { |
| 99 | 123 | | sx = -img->x / img->zoom; |
| 100 | 124 | | sw = win->w / img->zoom; |
| @@ -125,3 +149,41 @@ void img_render(img_t *img, win_t *win) { |
| 125 | 149 | | |
| 126 | 150 | | win_draw(win); |
| 127 | 151 | | } |
| 152 | + | |
| 153 | + | int img_zoom(img_t *img, int d) { |
| 154 | + | int ad, iz; |
| 155 | + | float z; |
| 156 | + | |
| 157 | + | if (!img) |
| 158 | + | return 0; |
| 159 | + | |
| 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; |
| 172 | + | |
| 173 | + | if (z != img->zoom) { |
| 174 | + | img->x -= (img->w * z - img->w * img->zoom) / 2; |
| 175 | + | img->y -= (img->h * z - img->h * img->zoom) / 2; |
| 176 | + | img->zoom = z; |
| 177 | + | return 1; |
| 178 | + | } else { |
| 179 | + | return 0; |
| 180 | + | } |
| 181 | + | } |
| 182 | + | |
| 183 | + | int img_zoom_in(img_t *img) { |
| 184 | + | return img_zoom(img, 125); |
| 185 | + | } |
| 186 | + | |
| 187 | + | int img_zoom_out(img_t *img) { |
| 188 | + | return img_zoom(img, -125); |
| 189 | + | } |