compositor: Fix rotated opaque surfaces

When a paint node is drawing rotated content, it's treated like its axis
aligned bounding box. Even if it only contains fully opaque content,
the parts of the axis aligned bounding box outside of that content
are not opaque.

We need to ensure we don't claim a paint node that isn't axis aligned
is fully opaque, or we'll improperly update regions outside of the
really opaque content.

Fixes 485e1796af

Signed-off-by: Derek Foreman <derek.foreman@collabora.com>
(cherry picked from commit 1f7bdea5c4)
This commit is contained in:
Derek Foreman 2026-03-17 09:22:38 -05:00 committed by Marius Vlad
parent f8d466fefa
commit f0fa8b9b18

View file

@ -231,7 +231,8 @@ paint_node_update_early(struct weston_paint_node *pnode)
if (buffer->type == WESTON_BUFFER_SOLID) {
pnode->draw_solid = true;
pnode->is_fully_opaque = (pnode->view->alpha == 1.0f &&
buffer->solid.a == 1.0f);
buffer->solid.a == 1.0f &&
pnode->valid_transform);
pnode->is_fully_blended = !pnode->is_fully_opaque;
pnode->solid = buffer->solid;
if (pnode->solid.a == 0.0f)
@ -255,14 +256,16 @@ paint_node_update_early(struct weston_paint_node *pnode)
(recording_censor || unprotected_censor)) {
pnode->draw_solid = true;
pnode->censored = true;
pnode->is_fully_opaque = (pnode->view->alpha == 1.0f);
pnode->is_fully_opaque = (pnode->view->alpha == 1.0f) &&
pnode->valid_transform;
pnode->is_fully_blended = !pnode->is_fully_opaque;
get_placeholder_color(pnode, &pnode->solid);
}
if (!pnode->draw_solid && (was_solid || view_dirty)) {
pnode->is_fully_opaque = weston_view_is_opaque(pnode->view,
&pnode->view->transform.boundingbox);
&pnode->view->transform.boundingbox) &&
pnode->valid_transform;
pnode->is_fully_blended = weston_view_is_fully_blended(pnode->view,
&pnode->view->transform.boundingbox);
}
@ -369,7 +372,8 @@ paint_node_update_late(struct weston_paint_node *pnode)
};
} else if (buffer->direct_display && !pnode->censored) {
pnode->draw_solid = true;
pnode->is_fully_opaque = (pnode->view->alpha == 1.0f);
pnode->is_fully_opaque = (pnode->view->alpha == 1.0f) &&
pnode->valid_transform;
pnode->is_fully_blended = !pnode->is_fully_opaque;
get_placeholder_color(pnode, &pnode->solid);
}