diff --git a/src/backend/backend.c b/src/backend/backend.c index f5b5479..d53577c 100644 --- a/src/backend/backend.c +++ b/src/backend/backend.c @@ -71,9 +71,9 @@ static void process_window_for_painting(session_t *ps, struct managed_win *w, coord_t dest_coord = {.x = w->g.x + w->widthb, .y = w->g.y + w->heightb}; region_t reg_visible_local; + region_t reg_bound_local; { // The bounding shape, in window local coordinates - region_t reg_bound_local; pixman_region32_init(®_bound_local); pixman_region32_copy(®_bound_local, reg_bound); pixman_region32_translate(®_bound_local, -w->g.x, -w->g.y); @@ -87,7 +87,6 @@ static void process_window_for_painting(session_t *ps, struct managed_win *w, // region, not the clip region. pixman_region32_intersect(®_visible_local, ®_visible_local, ®_bound_local); - pixman_region32_fini(®_bound_local); } auto new_img = ps->backend_data->ops->clone_image(ps->backend_data, win_image, @@ -102,9 +101,10 @@ static void process_window_for_painting(session_t *ps, struct managed_win *w, pixman_region32_fini(®_frame); ps->backend_data->ops->compose(ps->backend_data, new_img, window_coord, NULL, dest_coord, - reg_paint_in_bound, reg_visible); + reg_paint_in_bound, reg_visible, true); ps->backend_data->ops->release_image(ps->backend_data, new_img); pixman_region32_fini(®_visible_local); + pixman_region32_fini(®_bound_local); } void handle_device_reset(session_t *ps) { @@ -240,7 +240,7 @@ void paint_all_new(session_t *ps, struct managed_win *t, bool ignore_damage) { if (ps->root_image) { ps->backend_data->ops->compose(ps->backend_data, ps->root_image, (coord_t){0}, NULL, (coord_t){.x = ps->root_width, .y = ps->root_height}, - ®_paint, ®_visible); + ®_paint, ®_visible, true); } else { ps->backend_data->ops->fill(ps->backend_data, (struct color){0, 0, 0, 1}, ®_paint); @@ -420,7 +420,7 @@ void paint_all_new(session_t *ps, struct managed_win *t, bool ignore_damage) { } ps->backend_data->ops->compose( ps->backend_data, w->shadow_image, shadow_coord, - inverted_mask, window_coord, ®_shadow, ®_visible); + inverted_mask, window_coord, ®_shadow, ®_visible, false); if (inverted_mask) { ps->backend_data->ops->set_image_property( ps->backend_data, IMAGE_PROPERTY_INVERTED, @@ -501,7 +501,7 @@ void paint_all_new(session_t *ps, struct managed_win *t, bool ignore_damage) { if (w->frame_opacity == 1 && !is_animating) { ps->backend_data->ops->compose(ps->backend_data, w->win_image, window_coord, NULL, dest_coord, - ®_paint_in_bound, ®_visible); + ®_paint_in_bound, ®_visible, true); } else { if (is_animating && w->old_win_image) { bool is_focused = win_is_focused_raw(ps, w); diff --git a/src/backend/backend.h b/src/backend/backend.h index 3d620f8..2758c68 100644 --- a/src/backend/backend.h +++ b/src/backend/backend.h @@ -181,7 +181,7 @@ struct backend_operations { */ void (*compose)(backend_t *backend_data, void *image_data, coord_t image_dst, void *mask, coord_t mask_dst, const region_t *reg_paint, - const region_t *reg_visible); + const region_t *reg_visible, bool lerp); void (*_compose)(backend_t *backend_data, void *image_data, int dst_x1, int dst_y1, int dst_x2, int dst_y2, diff --git a/src/backend/dummy/dummy.c b/src/backend/dummy/dummy.c index 7e06fac..987e54e 100644 --- a/src/backend/dummy/dummy.c +++ b/src/backend/dummy/dummy.c @@ -64,7 +64,7 @@ static void dummy_check_image(struct backend_base *base, const struct dummy_imag void dummy_compose(struct backend_base *base, void *image, coord_t dst attr_unused, void *mask attr_unused, coord_t mask_dst attr_unused, const region_t *reg_paint attr_unused, - const region_t *reg_visible attr_unused) { + const region_t *reg_visible attr_unused, bool lerp attr_unused) { auto dummy attr_unused = (struct dummy_data *)base; dummy_check_image(base, image); assert(mask == NULL || mask == &dummy->mask); diff --git a/src/backend/gl/gl_common.c b/src/backend/gl/gl_common.c index ea08cd2..b61aae1 100644 --- a/src/backend/gl/gl_common.c +++ b/src/backend/gl/gl_common.c @@ -548,7 +548,7 @@ void x_rect_to_coords(int nrects, const rect_t *rects, coord_t image_dst, // TODO(yshui) make use of reg_visible void gl_compose(backend_t *base, void *image_data, coord_t image_dst, void *mask, coord_t mask_dst, const region_t *reg_tgt, - const region_t *reg_visible attr_unused) { + const region_t *reg_visible attr_unused, bool lerp) { auto gd = (struct gl_data *)base; struct backend_image *img = image_data; auto inner = (struct gl_texture *)img->inner; @@ -574,9 +574,12 @@ void gl_compose(backend_t *base, void *image_data, coord_t image_dst, void *mask coord_t mask_offset = {.x = mask_dst.x - image_dst.x, .y = mask_dst.y - image_dst.y}; x_rect_to_coords(nrects, rects, image_dst, inner->height, inner->height, gd->height, inner->y_inverted, coord, indices); - for (unsigned int i = 2; i < 16; i+=4) { - coord[i+0] = lerp_range(0, mask_offset.x, 0, inner->width, coord[i+0]); - coord[i+1] = lerp_range(0, mask_offset.y, 0, inner->height, coord[i+1]); + + if (lerp) { + for (unsigned int i = 2; i < 16; i+=4) { + coord[i+0] = lerp_range(0, mask_offset.x, 0, inner->width, coord[i+0]); + coord[i+1] = lerp_range(0, mask_offset.y, 0, inner->height, coord[i+1]); + } } _gl_compose(base, img, gd->back_fbo, mask, mask_offset, coord, indices, nrects); diff --git a/src/backend/gl/gl_common.h b/src/backend/gl/gl_common.h index 4aad9c0..4324604 100644 --- a/src/backend/gl/gl_common.h +++ b/src/backend/gl/gl_common.h @@ -147,7 +147,7 @@ bool gl_set_image_property(backend_t *backend_data, enum image_properties prop, * @brief Render a region with texture data. */ void gl_compose(backend_t *, void *image_data, coord_t image_dst, void *mask, - coord_t mask_dst, const region_t *reg_tgt, const region_t *reg_visible); + coord_t mask_dst, const region_t *reg_tgt, const region_t *reg_visible, bool lerp); void gl_resize(struct gl_data *, int width, int height); diff --git a/src/backend/xrender/xrender.c b/src/backend/xrender/xrender.c index 686e6de..5d3c314 100644 --- a/src/backend/xrender/xrender.c +++ b/src/backend/xrender/xrender.c @@ -350,7 +350,7 @@ compose_impl(struct _xrender_data *xd, struct xrender_image *xrimg, coord_t dst, } static void compose(backend_t *base, void *img_data, coord_t dst, void *mask, coord_t mask_dst, - const region_t *reg_paint, const region_t *reg_visible) { + const region_t *reg_paint, const region_t *reg_visible, bool lerp attr_unused) { struct _xrender_data *xd = (void *)base; return compose_impl(xd, img_data, dst, mask, mask_dst, reg_paint, reg_visible, xd->back[2]); diff --git a/src/picom.c b/src/picom.c index 82bcd6d..7357c69 100644 --- a/src/picom.c +++ b/src/picom.c @@ -909,39 +909,38 @@ paint_preprocess(session_t *ps, bool *fade_running, bool *animation_running) { add_damage_from_win(ps, w); } - if (w->opacity != w->opacity_target) { - // Run fading - if (run_fade(ps, &w, steps)) { - *fade_running = true; - } + // Run fading + if (run_fade(ps, &w, steps)) { + *fade_running = true; + } - // Add window to damaged area if its opacity changes - // If was_painted == false, and to_paint is also false, we don't care - // If was_painted == false, but to_paint is true, damage will be added in - // the loop below - if (was_painted && w->opacity != opacity_old) { - add_damage_from_win(ps, w); - } + // Add window to damaged area if its opacity changes + // If was_painted == false, and to_paint is also false, we don't care + // If was_painted == false, but to_paint is true, damage will be added in + // the loop below + if (was_painted && w->opacity != opacity_old) { + add_damage_from_win(ps, w); + } - if (win_check_fade_finished(ps, w)) { - // the window has been destroyed because fading finished - continue; - } - if (win_has_frame(w)) { - w->frame_opacity = ps->o.frame_opacity; - } else { - w->frame_opacity = 1.0; - } + if (win_check_fade_finished(ps, w)) { + // the window has been destroyed because fading finished + continue; + } - // Update window mode - w->mode = win_calc_mode(w); + if (win_has_frame(w)) { + w->frame_opacity = ps->o.frame_opacity; + } else { + w->frame_opacity = 1.0; + } - // Destroy all reg_ignore above when frame opaque state changes on - // SOLID mode - if (was_painted && w->mode != mode_old) { - w->reg_ignore_valid = false; - } + // Update window mode + w->mode = win_calc_mode(w); + + // Destroy all reg_ignore above when frame opaque state changes on + // SOLID mode + if (was_painted && w->mode != mode_old) { + w->reg_ignore_valid = false; } }