| @@ -49,26 +49,26 @@ void img_init(img_t *img, win_t *win) { |
| 49 | 49 | | zoom_min = zoom_levels[0] / 100.0; |
| 50 | 50 | | zoom_max = zoom_levels[ARRLEN(zoom_levels) - 1] / 100.0; |
| 51 | 51 | | |
| 52 | | − | if (img) { |
| 53 | | − | img->im = NULL; |
| 54 | | − | img->multi.cap = img->multi.cnt = 0; |
| 55 | | − | img->multi.animate = false; |
| 56 | | − | img->zoom = options->zoom; |
| 57 | | − | img->zoom = MAX(img->zoom, zoom_min); |
| 58 | | − | img->zoom = MIN(img->zoom, zoom_max); |
| 59 | | − | img->checkpan = false; |
| 60 | | − | img->dirty = false; |
| 61 | | − | img->aa = options->aa; |
| 62 | | − | img->alpha = true; |
| 63 | | − | img->slideshow = false; |
| 64 | | − | img->ss_delay = SLIDESHOW_DELAY * 1000; |
| 65 | | − | } |
| 52 | + | if (!img || !win) |
| 53 | + | return; |
| 66 | 54 | | |
| 67 | | − | if (win) { |
| 68 | | − | imlib_context_set_display(win->env.dpy); |
| 69 | | − | imlib_context_set_visual(win->env.vis); |
| 70 | | − | imlib_context_set_colormap(win->env.cmap); |
| 71 | | − | } |
| 55 | + | imlib_context_set_display(win->env.dpy); |
| 56 | + | imlib_context_set_visual(win->env.vis); |
| 57 | + | imlib_context_set_colormap(win->env.cmap); |
| 58 | + | |
| 59 | + | img->im = NULL; |
| 60 | + | img->win = win; |
| 61 | + | img->zoom = options->zoom; |
| 62 | + | img->zoom = MAX(img->zoom, zoom_min); |
| 63 | + | img->zoom = MIN(img->zoom, zoom_max); |
| 64 | + | img->checkpan = false; |
| 65 | + | img->dirty = false; |
| 66 | + | img->aa = options->aa; |
| 67 | + | img->alpha = true; |
| 68 | + | img->slideshow = false; |
| 69 | + | img->ss_delay = SLIDESHOW_DELAY * 1000; |
| 70 | + | img->multi.cap = img->multi.cnt = 0; |
| 71 | + | img->multi.animate = false; |
| 72 | 72 | | } |
| 73 | 73 | | |
| 74 | 74 | | #if EXIF_SUPPORT |
| @@ -311,14 +311,13 @@ bool img_load(img_t *img, const fileinfo_t *file) { |
| 311 | 311 | | img_load_gif(img, file); |
| 312 | 312 | | #endif |
| 313 | 313 | | |
| 314 | + | img->w = imlib_image_get_width(); |
| 315 | + | img->h = imlib_image_get_height(); |
| 314 | 316 | | img->scalemode = options->scalemode; |
| 315 | 317 | | img->re = false; |
| 316 | 318 | | img->checkpan = false; |
| 317 | 319 | | img->dirty = true; |
| 318 | 320 | | |
| 319 | | − | img->w = imlib_image_get_width(); |
| 320 | | − | img->h = imlib_image_get_height(); |
| 321 | | − | |
| 322 | 321 | | return true; |
| 323 | 322 | | } |
| 324 | 323 | | |
| @@ -345,12 +344,14 @@ void img_close(img_t *img, bool decache) { |
| 345 | 344 | | } |
| 346 | 345 | | } |
| 347 | 346 | | |
| 348 | | − | void img_check_pan(img_t *img, win_t *win, bool moved) { |
| 347 | + | void img_check_pan(img_t *img, bool moved) { |
| 348 | + | win_t *win; |
| 349 | 349 | | int ox, oy; |
| 350 | 350 | | |
| 351 | | − | if (!img || !win) |
| 351 | + | if (!img || !img->im || !img->win) |
| 352 | 352 | | return; |
| 353 | 353 | | |
| 354 | + | win = img->win; |
| 354 | 355 | | ox = img->x; |
| 355 | 356 | | oy = img->y; |
| 356 | 357 | | |
| @@ -375,15 +376,17 @@ void img_check_pan(img_t *img, win_t *win, bool moved) { |
| 375 | 376 | | img->dirty = true; |
| 376 | 377 | | } |
| 377 | 378 | | |
| 378 | | − | bool img_fit(img_t *img, win_t *win) { |
| 379 | + | bool img_fit(img_t *img) { |
| 379 | 380 | | float z, zmax, zw, zh; |
| 380 | 381 | | |
| 381 | | − | if (!img || !win || img->scalemode == SCALE_ZOOM) |
| 382 | + | if (!img || !img->im || !img->win) |
| 383 | + | return false; |
| 384 | + | if (img->scalemode == SCALE_ZOOM) |
| 382 | 385 | | return false; |
| 383 | 386 | | |
| 384 | 387 | | zmax = img->scalemode == SCALE_DOWN ? 1.0 : zoom_max; |
| 385 | | − | zw = (float) win->w / (float) img->w; |
| 386 | | − | zh = (float) win->h / (float) img->h; |
| 388 | + | zw = (float) img->win->w / (float) img->w; |
| 389 | + | zh = (float) img->win->h / (float) img->h; |
| 387 | 390 | | |
| 388 | 391 | | z = MIN(zw, zh); |
| 389 | 392 | | z = MAX(z, zoom_min); |
| @@ -398,14 +401,16 @@ bool img_fit(img_t *img, win_t *win) { |
| 398 | 401 | | } |
| 399 | 402 | | } |
| 400 | 403 | | |
| 401 | | − | void img_render(img_t *img, win_t *win) { |
| 404 | + | void img_render(img_t *img) { |
| 405 | + | win_t *win; |
| 402 | 406 | | int sx, sy, sw, sh; |
| 403 | 407 | | int dx, dy, dw, dh; |
| 404 | 408 | | |
| 405 | | − | if (!img || !img->im || !win) |
| 409 | + | if (!img || !img->im || !img->win) |
| 406 | 410 | | return; |
| 407 | 411 | | |
| 408 | | − | img_fit(img, win); |
| 412 | + | win = img->win; |
| 413 | + | img_fit(img); |
| 409 | 414 | | |
| 410 | 415 | | if (!img->re) { |
| 411 | 416 | | /* rendered for the first time */ |
| @@ -421,7 +426,7 @@ void img_render(img_t *img, win_t *win) { |
| 421 | 426 | | } |
| 422 | 427 | | |
| 423 | 428 | | if (img->checkpan) { |
| 424 | | − | img_check_pan(img, win, false); |
| 429 | + | img_check_pan(img, false); |
| 425 | 430 | | img->checkpan = false; |
| 426 | 431 | | } |
| 427 | 432 | | |
| @@ -467,25 +472,25 @@ void img_render(img_t *img, win_t *win) { |
| 467 | 472 | | img->dirty = false; |
| 468 | 473 | | } |
| 469 | 474 | | |
| 470 | | − | bool img_fit_win(img_t *img, win_t *win) { |
| 471 | | − | if (!img || !img->im || !win) |
| 475 | + | bool img_fit_win(img_t *img) { |
| 476 | + | if (!img || !img->im) |
| 472 | 477 | | return false; |
| 473 | 478 | | |
| 474 | 479 | | img->scalemode = SCALE_FIT; |
| 475 | | − | return img_fit(img, win); |
| 480 | + | return img_fit(img); |
| 476 | 481 | | } |
| 477 | 482 | | |
| 478 | | − | bool img_center(img_t *img, win_t *win) { |
| 483 | + | bool img_center(img_t *img) { |
| 479 | 484 | | int ox, oy; |
| 480 | 485 | | |
| 481 | | − | if (!img || !win) |
| 486 | + | if (!img || !img->im || !img->win) |
| 482 | 487 | | return false; |
| 483 | 488 | | |
| 484 | 489 | | ox = img->x; |
| 485 | 490 | | oy = img->y; |
| 486 | 491 | | |
| 487 | | − | img->x = (win->w - img->w * img->zoom) / 2; |
| 488 | | − | img->y = (win->h - img->h * img->zoom) / 2; |
| 492 | + | img->x = (img->win->w - img->w * img->zoom) / 2; |
| 493 | + | img->y = (img->win->h - img->h * img->zoom) / 2; |
| 489 | 494 | | |
| 490 | 495 | | if (ox != img->x || oy != img->y) { |
| 491 | 496 | | img->dirty = true; |
| @@ -495,8 +500,8 @@ bool img_center(img_t *img, win_t *win) { |
| 495 | 500 | | } |
| 496 | 501 | | } |
| 497 | 502 | | |
| 498 | | − | bool img_zoom(img_t *img, win_t *win, float z) { |
| 499 | | − | if (!img || !img->im || !win) |
| 503 | + | bool img_zoom(img_t *img, float z) { |
| 504 | + | if (!img || !img->im || !img->win) |
| 500 | 505 | | return false; |
| 501 | 506 | | |
| 502 | 507 | | z = MAX(z, zoom_min); |
| @@ -505,8 +510,8 @@ bool img_zoom(img_t *img, win_t *win, float z) { |
| 505 | 510 | | img->scalemode = SCALE_ZOOM; |
| 506 | 511 | | |
| 507 | 512 | | if (ZOOMDIFF(z, img->zoom)) { |
| 508 | | − | img->x = win->w / 2 - (win->w / 2 - img->x) * z / img->zoom; |
| 509 | | − | img->y = win->h / 2 - (win->h / 2 - img->y) * z / img->zoom; |
| 513 | + | img->x = img->win->w / 2 - (img->win->w / 2 - img->x) * z / img->zoom; |
| 514 | + | img->y = img->win->h / 2 - (img->win->h / 2 - img->y) * z / img->zoom; |
| 510 | 515 | | img->zoom = z; |
| 511 | 516 | | img->checkpan = true; |
| 512 | 517 | | img->dirty = true; |
| @@ -516,36 +521,36 @@ bool img_zoom(img_t *img, win_t *win, float z) { |
| 516 | 521 | | } |
| 517 | 522 | | } |
| 518 | 523 | | |
| 519 | | − | bool img_zoom_in(img_t *img, win_t *win) { |
| 524 | + | bool img_zoom_in(img_t *img) { |
| 520 | 525 | | int i; |
| 521 | 526 | | |
| 522 | | − | if (!img || !img->im || !win) |
| 527 | + | if (!img || !img->im) |
| 523 | 528 | | return false; |
| 524 | 529 | | |
| 525 | 530 | | for (i = 1; i < ARRLEN(zoom_levels); i++) { |
| 526 | 531 | | if (zoom_levels[i] > img->zoom * 100.0) |
| 527 | | − | return img_zoom(img, win, zoom_levels[i] / 100.0); |
| 532 | + | return img_zoom(img, zoom_levels[i] / 100.0); |
| 528 | 533 | | } |
| 529 | 534 | | return false; |
| 530 | 535 | | } |
| 531 | 536 | | |
| 532 | | − | bool img_zoom_out(img_t *img, win_t *win) { |
| 537 | + | bool img_zoom_out(img_t *img) { |
| 533 | 538 | | int i; |
| 534 | 539 | | |
| 535 | | − | if (!img || !img->im || !win) |
| 540 | + | if (!img || !img->im) |
| 536 | 541 | | return false; |
| 537 | 542 | | |
| 538 | 543 | | for (i = ARRLEN(zoom_levels) - 2; i >= 0; i--) { |
| 539 | 544 | | if (zoom_levels[i] < img->zoom * 100.0) |
| 540 | | − | return img_zoom(img, win, zoom_levels[i] / 100.0); |
| 545 | + | return img_zoom(img, zoom_levels[i] / 100.0); |
| 541 | 546 | | } |
| 542 | 547 | | return false; |
| 543 | 548 | | } |
| 544 | 549 | | |
| 545 | | − | bool img_move(img_t *img, win_t *win, int dx, int dy) { |
| 550 | + | bool img_move(img_t *img, int dx, int dy) { |
| 546 | 551 | | int ox, oy; |
| 547 | 552 | | |
| 548 | | − | if (!img || !img->im || !win) |
| 553 | + | if (!img || !img->im) |
| 549 | 554 | | return false; |
| 550 | 555 | | |
| 551 | 556 | | ox = img->x; |
| @@ -554,7 +559,7 @@ bool img_move(img_t *img, win_t *win, int dx, int dy) { |
| 554 | 559 | | img->x += dx; |
| 555 | 560 | | img->y += dy; |
| 556 | 561 | | |
| 557 | | − | img_check_pan(img, win, true); |
| 562 | + | img_check_pan(img, true); |
| 558 | 563 | | |
| 559 | 564 | | if (ox != img->x || oy != img->y) { |
| 560 | 565 | | img->dirty = true; |
| @@ -564,27 +569,27 @@ bool img_move(img_t *img, win_t *win, int dx, int dy) { |
| 564 | 569 | | } |
| 565 | 570 | | } |
| 566 | 571 | | |
| 567 | | − | bool img_pan(img_t *img, win_t *win, direction_t dir, bool screen) { |
| 568 | | − | if (!img || !img->im || !win) |
| 572 | + | bool img_pan(img_t *img, direction_t dir, bool screen) { |
| 573 | + | if (!img || !img->im || !img->win) |
| 569 | 574 | | return false; |
| 570 | 575 | | |
| 571 | 576 | | switch (dir) { |
| 572 | 577 | | case DIR_LEFT: |
| 573 | | − | return img_move(img, win, win->w / (screen ? 1 : 5), 0); |
| 578 | + | return img_move(img, img->win->w / (screen ? 1 : 5), 0); |
| 574 | 579 | | case DIR_RIGHT: |
| 575 | | − | return img_move(img, win, win->w / (screen ? 1 : 5) * -1, 0); |
| 580 | + | return img_move(img, img->win->w / (screen ? 1 : 5) * -1, 0); |
| 576 | 581 | | case DIR_UP: |
| 577 | | − | return img_move(img, win, 0, win->h / (screen ? 1 : 5)); |
| 582 | + | return img_move(img, 0, img->win->h / (screen ? 1 : 5)); |
| 578 | 583 | | case DIR_DOWN: |
| 579 | | − | return img_move(img, win, 0, win->h / (screen ? 1 : 5) * -1); |
| 584 | + | return img_move(img, 0, img->win->h / (screen ? 1 : 5) * -1); |
| 580 | 585 | | } |
| 581 | 586 | | return false; |
| 582 | 587 | | } |
| 583 | 588 | | |
| 584 | | − | bool img_pan_edge(img_t *img, win_t *win, direction_t dir) { |
| 589 | + | bool img_pan_edge(img_t *img, direction_t dir) { |
| 585 | 590 | | int ox, oy; |
| 586 | 591 | | |
| 587 | | − | if (!img || !img->im || !win) |
| 592 | + | if (!img || !img->im || !img->win) |
| 588 | 593 | | return false; |
| 589 | 594 | | |
| 590 | 595 | | ox = img->x; |
| @@ -595,17 +600,17 @@ bool img_pan_edge(img_t *img, win_t *win, direction_t dir) { |
| 595 | 600 | | img->x = 0; |
| 596 | 601 | | break; |
| 597 | 602 | | case DIR_RIGHT: |
| 598 | | − | img->x = win->w - img->w * img->zoom; |
| 603 | + | img->x = img->win->w - img->w * img->zoom; |
| 599 | 604 | | break; |
| 600 | 605 | | case DIR_UP: |
| 601 | 606 | | img->y = 0; |
| 602 | 607 | | break; |
| 603 | 608 | | case DIR_DOWN: |
| 604 | | − | img->y = win->h - img->h * img->zoom; |
| 609 | + | img->y = img->win->h - img->h * img->zoom; |
| 605 | 610 | | break; |
| 606 | 611 | | } |
| 607 | 612 | | |
| 608 | | − | img_check_pan(img, win, true); |
| 613 | + | img_check_pan(img, true); |
| 609 | 614 | | |
| 610 | 615 | | if (ox != img->x || oy != img->y) { |
| 611 | 616 | | img->dirty = true; |
| @@ -615,12 +620,14 @@ bool img_pan_edge(img_t *img, win_t *win, direction_t dir) { |
| 615 | 620 | | } |
| 616 | 621 | | } |
| 617 | 622 | | |
| 618 | | − | void img_rotate(img_t *img, win_t *win, int d) { |
| 623 | + | void img_rotate(img_t *img, int d) { |
| 624 | + | win_t *win; |
| 619 | 625 | | int ox, oy, tmp; |
| 620 | 626 | | |
| 621 | | − | if (!img || !img->im || !win) |
| 627 | + | if (!img || !img->im || !img->win) |
| 622 | 628 | | return; |
| 623 | 629 | | |
| 630 | + | win = img->win; |
| 624 | 631 | | ox = d == 1 ? img->x : win->w - img->x - img->w * img->zoom; |
| 625 | 632 | | oy = d == 3 ? img->y : win->h - img->y - img->h * img->zoom; |
| 626 | 633 | | |
| @@ -638,12 +645,12 @@ void img_rotate(img_t *img, win_t *win, int d) { |
| 638 | 645 | | img->dirty = true; |
| 639 | 646 | | } |
| 640 | 647 | | |
| 641 | | − | void img_rotate_left(img_t *img, win_t *win) { |
| 642 | | − | img_rotate(img, win, 3); |
| 648 | + | void img_rotate_left(img_t *img) { |
| 649 | + | img_rotate(img, 3); |
| 643 | 650 | | } |
| 644 | 651 | | |
| 645 | | − | void img_rotate_right(img_t *img, win_t *win) { |
| 646 | | − | img_rotate(img, win, 1); |
| 652 | + | void img_rotate_right(img_t *img) { |
| 653 | + | img_rotate(img, 1); |
| 647 | 654 | | } |
| 648 | 655 | | |
| 649 | 656 | | void img_toggle_antialias(img_t *img) { |
| @@ -657,10 +664,9 @@ void img_toggle_antialias(img_t *img) { |
| 657 | 664 | | } |
| 658 | 665 | | |
| 659 | 666 | | bool img_frame_goto(img_t *img, int n) { |
| 660 | | − | if (!img || n < 0 || n >= img->multi.cnt) |
| 667 | + | if (!img || !img->im) |
| 661 | 668 | | return false; |
| 662 | | − | |
| 663 | | − | if (n == img->multi.sel) |
| 669 | + | if (n < 0 || n >= img->multi.cnt || n == img->multi.sel) |
| 664 | 670 | | return false; |
| 665 | 671 | | |
| 666 | 672 | | img->multi.sel = n; |
| @@ -676,7 +682,7 @@ bool img_frame_goto(img_t *img, int n) { |
| 676 | 682 | | } |
| 677 | 683 | | |
| 678 | 684 | | bool img_frame_navigate(img_t *img, int d) { |
| 679 | | − | if (!img || !img->multi.cnt || !d) |
| 685 | + | if (!img || !img->im || !img->multi.cnt || !d) |
| 680 | 686 | | return false; |
| 681 | 687 | | |
| 682 | 688 | | d += img->multi.sel; |
| @@ -689,7 +695,7 @@ bool img_frame_navigate(img_t *img, int d) { |
| 689 | 695 | | } |
| 690 | 696 | | |
| 691 | 697 | | bool img_frame_animate(img_t *img, bool restart) { |
| 692 | | − | if (!img || !img->multi.cnt) |
| 698 | + | if (!img || !img->im || !img->multi.cnt) |
| 693 | 699 | | return false; |
| 694 | 700 | | |
| 695 | 701 | | if (img->multi.sel + 1 >= img->multi.cnt) { |