summaryrefslogtreecommitdiff
path: root/Userland/Services/WindowServer/Compositor.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Userland/Services/WindowServer/Compositor.cpp')
-rw-r--r--Userland/Services/WindowServer/Compositor.cpp37
1 files changed, 16 insertions, 21 deletions
diff --git a/Userland/Services/WindowServer/Compositor.cpp b/Userland/Services/WindowServer/Compositor.cpp
index 55e4f6a2ae..5564f25ef4 100644
--- a/Userland/Services/WindowServer/Compositor.cpp
+++ b/Userland/Services/WindowServer/Compositor.cpp
@@ -151,7 +151,7 @@ void Compositor::compose()
// Mark window regions as dirty that need to be re-rendered
wm.for_each_visible_window_from_back_to_front([&](Window& window) {
- auto frame_rect = window.frame().rect();
+ auto frame_rect = window.frame().render_rect();
for (auto& dirty_rect : dirty_screen_rects.rects()) {
auto invalidate_rect = dirty_rect.intersected(frame_rect);
if (!invalidate_rect.is_empty()) {
@@ -173,12 +173,12 @@ void Compositor::compose()
if (transparency_rects.is_empty())
return IterationDecision::Continue;
- auto frame_rect = window.frame().rect();
+ auto frame_rect = window.frame().render_rect();
auto& dirty_rects = window.dirty_rects();
wm.for_each_visible_window_from_back_to_front([&](Window& w) {
if (&w == &window)
return IterationDecision::Continue;
- auto frame_rect2 = w.frame().rect();
+ auto frame_rect2 = w.frame().render_rect();
if (!frame_rect2.intersects(frame_rect))
return IterationDecision::Continue;
transparency_rects.for_each_intersected(w.dirty_rects(), [&](const Gfx::IntRect& intersected_dirty) {
@@ -206,6 +206,9 @@ void Compositor::compose()
auto cursor_rect = current_cursor_rect();
bool need_to_draw_cursor = false;
+ auto back_painter = *m_back_painter;
+ auto temp_painter = *m_temp_painter;
+
auto check_restore_cursor_back = [&](const Gfx::IntRect& rect) {
if (!need_to_draw_cursor && rect.intersects(cursor_rect)) {
// Restore what's behind the cursor if anything touches the area of the cursor
@@ -225,26 +228,18 @@ void Compositor::compose()
auto prepare_transparency_rect = [&](const Gfx::IntRect& rect) {
dbgln_if(COMPOSE_DEBUG, " -> flush transparent: {}", rect);
ASSERT(!flush_rects.intersects(rect));
- bool have_rect = false;
for (auto& r : flush_transparent_rects.rects()) {
- if (r == rect) {
- have_rect = true;
- break;
- }
+ if (r == rect)
+ return;
}
- if (!have_rect) {
- flush_transparent_rects.add(rect);
- check_restore_cursor_back(rect);
- }
+ flush_transparent_rects.add(rect);
+ check_restore_cursor_back(rect);
};
if (!m_cursor_back_bitmap || m_invalidated_cursor)
check_restore_cursor_back(cursor_rect);
- auto back_painter = *m_back_painter;
- auto temp_painter = *m_temp_painter;
-
auto paint_wallpaper = [&](Gfx::Painter& painter, const Gfx::IntRect& rect) {
// FIXME: If the wallpaper is opaque and covers the whole rect, no need to fill with color!
painter.fill_rect(rect, background_color);
@@ -277,7 +272,7 @@ void Compositor::compose()
});
auto compose_window = [&](Window& window) -> IterationDecision {
- auto frame_rect = window.frame().rect();
+ auto frame_rect = window.frame().render_rect();
if (!frame_rect.intersects(ws.rect()))
return IterationDecision::Continue;
auto frame_rects = frame_rect.shatter(window.rect());
@@ -849,7 +844,7 @@ bool Compositor::any_opaque_window_above_this_one_contains_rect(const Window& a_
return IterationDecision::Continue;
if (!window.is_opaque())
return IterationDecision::Continue;
- if (window.frame().rect().contains(rect)) {
+ if (window.frame().render_rect().contains(rect)) {
found_containing_window = true;
return IterationDecision::Break;
}
@@ -907,7 +902,7 @@ void Compositor::recompute_occlusions()
Gfx::DisjointRectSet visible_rects(screen_rect);
bool have_transparent = false;
WindowManager::the().for_each_visible_window_from_front_to_back([&](Window& w) {
- auto window_frame_rect = w.frame().rect().intersected(screen_rect);
+ auto window_frame_rect = w.frame().render_rect().intersected(screen_rect);
w.transparency_wallpaper_rects().clear();
auto& visible_opaque = w.opaque_rects();
auto& transparency_rects = w.transparency_rects();
@@ -948,7 +943,7 @@ void Compositor::recompute_occlusions()
if (w2.is_minimized())
return IterationDecision::Continue;
- auto window_frame_rect2 = w2.frame().rect().intersected(screen_rect);
+ auto window_frame_rect2 = w2.frame().render_rect().intersected(screen_rect);
auto covering_rect = window_frame_rect2.intersected(window_frame_rect);
if (covering_rect.is_empty())
return IterationDecision::Continue;
@@ -1026,7 +1021,7 @@ void Compositor::recompute_occlusions()
// Determine what transparent window areas need to render the wallpaper first
WindowManager::the().for_each_visible_window_from_back_to_front([&](Window& w) {
auto& transparency_wallpaper_rects = w.transparency_wallpaper_rects();
- if ((w.is_opaque() && w.frame().is_opaque()) || w.is_minimized()) {
+ if (w.is_minimized()) {
transparency_wallpaper_rects.clear();
return IterationDecision::Continue;
}
@@ -1053,7 +1048,7 @@ void Compositor::recompute_occlusions()
}
wm.for_each_visible_window_from_back_to_front([&](Window& w) {
- auto window_frame_rect = w.frame().rect().intersected(screen_rect);
+ auto window_frame_rect = w.frame().render_rect().intersected(screen_rect);
if (w.is_minimized() || window_frame_rect.is_empty())
return IterationDecision::Continue;