| @@ -334,8 +334,7 @@ bool img_load(img_t *img, const fileinfo_t *file) |
| 334 | 334 | | img->w = imlib_image_get_width(); |
| 335 | 335 | | img->h = imlib_image_get_height(); |
| 336 | 336 | | img->scalemode = options->scalemode; |
| 337 | | − | img->re = false; |
| 338 | | − | img->checkpan = false; |
| 337 | + | img->checkpan = true; |
| 339 | 338 | | img->dirty = true; |
| 340 | 339 | | |
| 341 | 340 | | return true; |
| @@ -372,30 +371,29 @@ void img_check_pan(img_t *img, bool moved) |
| 372 | 371 | | { |
| 373 | 372 | | win_t *win; |
| 374 | 373 | | int ox, oy; |
| 374 | + | float w, h; |
| 375 | 375 | | |
| 376 | 376 | | if (img == NULL || img->im == NULL || img->win == NULL) |
| 377 | 377 | | return; |
| 378 | 378 | | |
| 379 | 379 | | win = img->win; |
| 380 | + | w = img->w * img->zoom; |
| 381 | + | h = img->h * img->zoom; |
| 380 | 382 | | ox = img->x; |
| 381 | 383 | | oy = img->y; |
| 382 | 384 | | |
| 383 | | − | if (img->w * img->zoom > win->w) { |
| 384 | | − | if (img->x > 0 && img->x + img->w * img->zoom > win->w) |
| 385 | | − | img->x = 0; |
| 386 | | − | if (img->x < 0 && img->x + img->w * img->zoom < win->w) |
| 387 | | − | img->x = win->w - img->w * img->zoom; |
| 388 | | − | } else { |
| 389 | | − | img->x = (win->w - img->w * img->zoom) / 2; |
| 390 | | − | } |
| 391 | | − | if (img->h * img->zoom > win->h) { |
| 392 | | − | if (img->y > 0 && img->y + img->h * img->zoom > win->h) |
| 393 | | − | img->y = 0; |
| 394 | | − | if (img->y < 0 && img->y + img->h * img->zoom < win->h) |
| 395 | | − | img->y = win->h - img->h * img->zoom; |
| 396 | | − | } else { |
| 397 | | − | img->y = (win->h - img->h * img->zoom) / 2; |
| 398 | | − | } |
| 385 | + | if (w < win->w) |
| 386 | + | img->x = (win->w - w) / 2; |
| 387 | + | else if (img->x > 0) |
| 388 | + | img->x = 0; |
| 389 | + | else if (img->x + w < win->w) |
| 390 | + | img->x = win->w - w; |
| 391 | + | if (h < win->h) |
| 392 | + | img->y = (win->h - h) / 2; |
| 393 | + | else if (img->y > 0) |
| 394 | + | img->y = 0; |
| 395 | + | else if (img->y + h < win->h) |
| 396 | + | img->y = win->h - h; |
| 399 | 397 | | |
| 400 | 398 | | if (!moved && (ox != img->x || oy != img->y)) |
| 401 | 399 | | img->dirty = true; |
| @@ -450,19 +448,6 @@ void img_render(img_t *img) |
| 450 | 448 | | win = img->win; |
| 451 | 449 | | img_fit(img); |
| 452 | 450 | | |
| 453 | | − | if (!img->re) { |
| 454 | | − | /* rendered for the first time */ |
| 455 | | − | img->re = true; |
| 456 | | − | if (img->zoom * img->w <= win->w) |
| 457 | | − | img->x = (win->w - img->w * img->zoom) / 2; |
| 458 | | − | else |
| 459 | | − | img->x = 0; |
| 460 | | − | if (img->zoom * img->h <= win->h) |
| 461 | | − | img->y = (win->h - img->h * img->zoom) / 2; |
| 462 | | − | else |
| 463 | | − | img->y = 0; |
| 464 | | − | } |
| 465 | | − | |
| 466 | 451 | | if (img->checkpan) { |
| 467 | 452 | | img_check_pan(img, false); |
| 468 | 453 | | img->checkpan = false; |
| @@ -511,28 +496,18 @@ void img_render(img_t *img) |
| 511 | 496 | | |
| 512 | 497 | | bool img_fit_win(img_t *img, scalemode_t sm) |
| 513 | 498 | | { |
| 514 | | − | if (img == NULL || img->im == NULL) |
| 515 | | − | return false; |
| 516 | | − | |
| 517 | | − | img->scalemode = sm; |
| 518 | | − | return img_fit(img); |
| 519 | | − | } |
| 520 | | − | |
| 521 | | − | bool img_center(img_t *img) |
| 522 | | − | { |
| 523 | | − | int ox, oy; |
| 499 | + | float oz; |
| 524 | 500 | | |
| 525 | 501 | | if (img == NULL || img->im == NULL || img->win == NULL) |
| 526 | 502 | | return false; |
| 527 | | − | |
| 528 | | − | ox = img->x; |
| 529 | | − | oy = img->y; |
| 530 | 503 | | |
| 531 | | − | img->x = (img->win->w - img->w * img->zoom) / 2; |
| 532 | | − | img->y = (img->win->h - img->h * img->zoom) / 2; |
| 533 | | − | |
| 534 | | − | if (ox != img->x || oy != img->y) { |
| 535 | | − | img->dirty = true; |
| 504 | + | oz = img->zoom; |
| 505 | + | img->scalemode = sm; |
| 506 | + | |
| 507 | + | if (img_fit(img)) { |
| 508 | + | img->x = img->win->w / 2 - (img->win->w / 2 - img->x) * img->zoom / oz; |
| 509 | + | img->y = img->win->h / 2 - (img->win->h / 2 - img->y) * img->zoom / oz; |
| 510 | + | img->checkpan = true; |
| 536 | 511 | | return true; |
| 537 | 512 | | } else { |
| 538 | 513 | | return false; |