| @@ -36,9 +36,14 @@ enum { MIN_GIF_DELAY = 50 }; |
| 36 | 36 | | float zoom_min; |
| 37 | 37 | | float zoom_max; |
| 38 | 38 | | |
| 39 | | − | bool zoomdiff(float z1, float z2) { |
| 39 | + | int zoomdiff(float z1, float z2) { |
| 40 | + | float d = z1 - z2; |
| 40 | 41 | | const float mindelta = 0.001; |
| 41 | | − | return (z1 - z2 > mindelta) || (z1 - z2 < mindelta); |
| 42 | + | |
| 43 | + | if (ABS(d) < mindelta) |
| 44 | + | return 0; |
| 45 | + | else |
| 46 | + | return d < 0 ? -1 : 1; |
| 42 | 47 | | } |
| 43 | 48 | | |
| 44 | 49 | | void img_init(img_t *img, win_t *win) { |
| @@ -380,7 +385,7 @@ bool img_fit(img_t *img) { |
| 380 | 385 | | z = MAX(z, zoom_min); |
| 381 | 386 | | z = MIN(z, zmax); |
| 382 | 387 | | |
| 383 | | − | if (zoomdiff(z, img->zoom)) { |
| 388 | + | if (zoomdiff(z, img->zoom) != 0) { |
| 384 | 389 | | img->zoom = z; |
| 385 | 390 | | img->dirty = true; |
| 386 | 391 | | return true; |
| @@ -496,7 +501,7 @@ bool img_zoom(img_t *img, float z) { |
| 496 | 501 | | |
| 497 | 502 | | img->scalemode = SCALE_ZOOM; |
| 498 | 503 | | |
| 499 | | − | if (zoomdiff(z, img->zoom)) { |
| 504 | + | if (zoomdiff(z, img->zoom) != 0) { |
| 500 | 505 | | img->x = img->win->w / 2 - (img->win->w / 2 - img->x) * z / img->zoom; |
| 501 | 506 | | img->y = img->win->h / 2 - (img->win->h / 2 - img->y) * z / img->zoom; |
| 502 | 507 | | img->zoom = z; |
| @@ -510,26 +515,30 @@ bool img_zoom(img_t *img, float z) { |
| 510 | 515 | | |
| 511 | 516 | | bool img_zoom_in(img_t *img) { |
| 512 | 517 | | int i; |
| 518 | + | float z; |
| 513 | 519 | | |
| 514 | 520 | | if (img == NULL || img->im == NULL) |
| 515 | 521 | | return false; |
| 516 | 522 | | |
| 517 | 523 | | for (i = 1; i < ARRLEN(zoom_levels); i++) { |
| 518 | | − | if (zoom_levels[i] > img->zoom * 100.0) |
| 519 | | − | return img_zoom(img, zoom_levels[i] / 100.0); |
| 524 | + | z = zoom_levels[i] / 100.0; |
| 525 | + | if (zoomdiff(z, img->zoom) > 0) |
| 526 | + | return img_zoom(img, z); |
| 520 | 527 | | } |
| 521 | 528 | | return false; |
| 522 | 529 | | } |
| 523 | 530 | | |
| 524 | 531 | | bool img_zoom_out(img_t *img) { |
| 525 | 532 | | int i; |
| 533 | + | float z; |
| 526 | 534 | | |
| 527 | 535 | | if (img == NULL || img->im == NULL) |
| 528 | 536 | | return false; |
| 529 | 537 | | |
| 530 | 538 | | for (i = ARRLEN(zoom_levels) - 2; i >= 0; i--) { |
| 531 | | − | if (zoom_levels[i] < img->zoom * 100.0) |
| 532 | | − | return img_zoom(img, zoom_levels[i] / 100.0); |
| 539 | + | z = zoom_levels[i] / 100.0; |
| 540 | + | if (zoomdiff(z, img->zoom) < 0) |
| 541 | + | return img_zoom(img, z); |
| 533 | 542 | | } |
| 534 | 543 | | return false; |
| 535 | 544 | | } |