| @@ -62,40 +62,13 @@ int img_load(img_t *img, const char *filename) { |
| 62 | 62 | | |
| 63 | 63 | | imlib_context_set_image(im); |
| 64 | 64 | | |
| 65 | + | img->re = 0; |
| 65 | 66 | | img->w = imlib_image_get_width(); |
| 66 | 67 | | img->h = imlib_image_get_height(); |
| 67 | 68 | | |
| 68 | 69 | | return 0; |
| 69 | 70 | | } |
| 70 | 71 | | |
| 71 | | − | void img_display(img_t *img, win_t *win) { |
| 72 | | − | float zw, zh; |
| 73 | | − | |
| 74 | | − | if (!img || !win || !imlib_context_get_image()) |
| 75 | | − | return; |
| 76 | | − | |
| 77 | | − | /* set zoom level to fit image into window */ |
| 78 | | − | if (img->scalemode != SCALE_ZOOM) { |
| 79 | | − | zw = (float) win->w / (float) img->w; |
| 80 | | − | zh = (float) win->h / (float) img->h; |
| 81 | | − | img->zoom = MIN(zw, zh); |
| 82 | | − | |
| 83 | | − | if (img->zoom < zoom_min) |
| 84 | | − | img->zoom = zoom_min; |
| 85 | | − | else if (img->zoom > zoom_max) |
| 86 | | − | img->zoom = zoom_max; |
| 87 | | − | |
| 88 | | − | if (img->scalemode == SCALE_DOWN && img->zoom > 1.0) |
| 89 | | − | img->zoom = 1.0; |
| 90 | | − | } |
| 91 | | − | |
| 92 | | − | /* center image in window */ |
| 93 | | − | img->x = (win->w - img->w * img->zoom) / 2; |
| 94 | | − | img->y = (win->h - img->h * img->zoom) / 2; |
| 95 | | − | |
| 96 | | − | img_render(img, win); |
| 97 | | − | } |
| 98 | | − | |
| 99 | 72 | | void img_check_pan(img_t *img, win_t *win) { |
| 100 | 73 | | if (!img) |
| 101 | 74 | | return; |
| @@ -121,11 +94,37 @@ void img_check_pan(img_t *img, win_t *win) { |
| 121 | 94 | | void img_render(img_t *img, win_t *win) { |
| 122 | 95 | | int sx, sy, sw, sh; |
| 123 | 96 | | int dx, dy, dw, dh; |
| 97 | + | float zw, zh; |
| 124 | 98 | | |
| 125 | 99 | | if (!img || !win || !imlib_context_get_image()) |
| 126 | 100 | | return; |
| 127 | 101 | | |
| 128 | | − | img_check_pan(img, win); |
| 102 | + | if (!img->re) { |
| 103 | + | /* rendered for the first time */ |
| 104 | + | img->re = 1; |
| 105 | + | |
| 106 | + | /* set zoom level to fit image into window */ |
| 107 | + | if (img->scalemode != SCALE_ZOOM) { |
| 108 | + | zw = (float) win->w / (float) img->w; |
| 109 | + | zh = (float) win->h / (float) img->h; |
| 110 | + | img->zoom = MIN(zw, zh); |
| 111 | + | |
| 112 | + | if (img->zoom < zoom_min) |
| 113 | + | img->zoom = zoom_min; |
| 114 | + | else if (img->zoom > zoom_max) |
| 115 | + | img->zoom = zoom_max; |
| 116 | + | |
| 117 | + | if (img->scalemode == SCALE_DOWN && img->zoom > 1.0) |
| 118 | + | img->zoom = 1.0; |
| 119 | + | } |
| 120 | + | |
| 121 | + | /* center image in window */ |
| 122 | + | img->x = (win->w - img->w * img->zoom) / 2; |
| 123 | + | img->y = (win->h - img->h * img->zoom) / 2; |
| 124 | + | } else { |
| 125 | + | /* typically after zooming and panning */ |
| 126 | + | img_check_pan(img, win); |
| 127 | + | } |
| 129 | 128 | | |
| 130 | 129 | | if (img->x < 0) { |
| 131 | 130 | | sx = -img->x / img->zoom; |