| @@ -46,22 +46,6 @@ static int zoomdiff(float z1, float z2) |
| 46 | 46 | | return (int) (z1 * 1000.0 - z2 * 1000.0); |
| 47 | 47 | | } |
| 48 | 48 | | |
| 49 | | − | static void img_apply_gamma(img_t *img) |
| 50 | | − | { |
| 51 | | − | if (img == NULL || img->im == NULL || img->cmod == NULL) |
| 52 | | − | return; |
| 53 | | − | |
| 54 | | − | if (img->gamma == 0) { |
| 55 | | − | imlib_context_set_color_modifier(NULL); |
| 56 | | − | } else { |
| 57 | | − | double range = img->gamma <= 0 ? 1.0 : GAMMA_MAX - 1.0; |
| 58 | | − | |
| 59 | | − | imlib_context_set_color_modifier(img->cmod); |
| 60 | | − | imlib_reset_color_modifier(); |
| 61 | | − | imlib_modify_color_modifier_gamma(1.0 + img->gamma * (range / GAMMA_RANGE)); |
| 62 | | − | } |
| 63 | | − | } |
| 64 | | − | |
| 65 | 49 | | void img_init(img_t *img, win_t *win) |
| 66 | 50 | | { |
| 67 | 51 | | zoom_min = zoom_levels[0] / 100.0; |
| @@ -89,8 +73,9 @@ void img_init(img_t *img, win_t *win) |
| 89 | 73 | | img->multi.length = 0; |
| 90 | 74 | | |
| 91 | 75 | | img->cmod = imlib_create_color_modifier(); |
| 76 | + | imlib_context_set_color_modifier(img->cmod); |
| 92 | 77 | | img->gamma = MIN(MAX(options->gamma, -GAMMA_RANGE), GAMMA_RANGE); |
| 93 | | − | |
| 78 | + | |
| 94 | 79 | | img->ss.on = options->slideshow > 0; |
| 95 | 80 | | img->ss.delay = options->slideshow > 0 ? options->slideshow : SLIDESHOW_DELAY; |
| 96 | 81 | | } |
| @@ -339,8 +324,6 @@ bool img_load(img_t *img, const fileinfo_t *file) |
| 339 | 324 | | img_load_gif(img, file); |
| 340 | 325 | | #endif |
| 341 | 326 | | } |
| 342 | | − | img_apply_gamma(img); |
| 343 | | − | |
| 344 | 327 | | img->w = imlib_image_get_width(); |
| 345 | 328 | | img->h = imlib_image_get_height(); |
| 346 | 329 | | img->checkpan = true; |
| @@ -371,9 +354,6 @@ void img_close(img_t *img, bool decache) |
| 371 | 354 | | imlib_free_image(); |
| 372 | 355 | | img->im = NULL; |
| 373 | 356 | | } |
| 374 | | − | |
| 375 | | − | if (img->cmod) |
| 376 | | − | imlib_context_set_color_modifier(NULL); |
| 377 | 357 | | } |
| 378 | 358 | | |
| 379 | 359 | | void img_check_pan(img_t *img, bool moved) |
| @@ -529,10 +509,8 @@ void img_render(img_t *img) |
| 529 | 509 | | imlib_blend_image_onto_image(img->im, 0, sx, sy, sw, sh, 0, 0, dw, dh); |
| 530 | 510 | | imlib_context_set_color_modifier(NULL); |
| 531 | 511 | | imlib_render_image_on_drawable(dx, dy); |
| 532 | | − | |
| 533 | 512 | | imlib_free_image(); |
| 534 | | − | if (img->gamma != 0) |
| 535 | | − | imlib_context_set_color_modifier(img->cmod); |
| 513 | + | imlib_context_set_color_modifier(img->cmod); |
| 536 | 514 | | } else { |
| 537 | 515 | | imlib_render_image_part_on_drawable_at_size(sx, sy, sw, sh, dx, dy, dw, dh); |
| 538 | 516 | | } |
| @@ -771,20 +749,23 @@ bool img_change_gamma(img_t *img, int d) |
| 771 | 749 | | * d > 0: increase gamma |
| 772 | 750 | | */ |
| 773 | 751 | | int gamma; |
| 752 | + | double range; |
| 774 | 753 | | |
| 775 | | − | if (img == NULL || img->im == NULL) |
| 754 | + | if (img == NULL) |
| 776 | 755 | | return false; |
| 777 | 756 | | |
| 778 | 757 | | if (d == 0) |
| 779 | 758 | | gamma = 0; |
| 780 | | − | else if (d < 0) |
| 781 | | − | gamma = MAX(-GAMMA_RANGE, img->gamma - 1); |
| 782 | 759 | | else |
| 783 | | − | gamma = MIN(+GAMMA_RANGE, img->gamma + 1); |
| 760 | + | gamma = MIN(MAX(img->gamma + d, -GAMMA_RANGE), GAMMA_RANGE); |
| 784 | 761 | | |
| 785 | 762 | | if (img->gamma != gamma) { |
| 763 | + | imlib_reset_color_modifier(); |
| 764 | + | if (gamma != 0) { |
| 765 | + | range = gamma <= 0 ? 1.0 : GAMMA_MAX - 1.0; |
| 766 | + | imlib_modify_color_modifier_gamma(1.0 + gamma * (range / GAMMA_RANGE)); |
| 767 | + | } |
| 786 | 768 | | img->gamma = gamma; |
| 787 | | − | img_apply_gamma(img); |
| 788 | 769 | | img->dirty = true; |
| 789 | 770 | | return true; |
| 790 | 771 | | } else { |