diff --git a/LibGUI/GScrollBar.cpp b/LibGUI/GScrollBar.cpp index c179b3f228..7db74c4e70 100644 --- a/LibGUI/GScrollBar.cpp +++ b/LibGUI/GScrollBar.cpp @@ -181,9 +181,10 @@ Rect GScrollBar::scrubber_rect() const return { (int)x_or_y, 0, button_size(), button_size() }; } -void GScrollBar::paint_event(GPaintEvent&) +void GScrollBar::paint_event(GPaintEvent& event) { Painter painter(*this); + painter.set_clip_rect(event.rect()); painter.fill_rect(rect(), Color(164, 164, 164)); diff --git a/LibGUI/GStatusBar.cpp b/LibGUI/GStatusBar.cpp index 77e38090be..2712715bde 100644 --- a/LibGUI/GStatusBar.cpp +++ b/LibGUI/GStatusBar.cpp @@ -28,9 +28,10 @@ String GStatusBar::text() const return m_label->text(); } -void GStatusBar::paint_event(GPaintEvent&) +void GStatusBar::paint_event(GPaintEvent& event) { Painter painter(*this); + painter.set_clip_rect(event.rect()); painter.fill_rect({ 0, 1, width(), height() - 1 }, Color::LightGray); painter.draw_line({ 0, 0 }, { width() - 1, 0 }, Color::DarkGray); } diff --git a/LibGUI/GTableView.cpp b/LibGUI/GTableView.cpp index 8c6042604a..df18c6bd83 100644 --- a/LibGUI/GTableView.cpp +++ b/LibGUI/GTableView.cpp @@ -92,9 +92,10 @@ void GTableView::mousedown_event(GMouseEvent& event) update(); } -void GTableView::paint_event(GPaintEvent&) +void GTableView::paint_event(GPaintEvent& event) { Painter painter(*this); + painter.set_clip_rect(event.rect()); painter.translate(-m_horizontal_scrollbar->value(), -m_vertical_scrollbar->value()); int exposed_width = max(content_width(), width()); diff --git a/SharedGraphics/Painter.cpp b/SharedGraphics/Painter.cpp index f6c1c2e00b..b5baddc952 100644 --- a/SharedGraphics/Painter.cpp +++ b/SharedGraphics/Painter.cpp @@ -14,11 +14,14 @@ #include #endif +#include + Painter::Painter(GraphicsBitmap& bitmap) : m_target(bitmap) { m_font = &Font::default_font(); m_clip_rect = { { 0, 0 }, bitmap.size() }; + m_clip_origin = m_clip_rect; } #ifdef LIBGUI @@ -27,9 +30,10 @@ Painter::Painter(GWidget& widget) , m_window(widget.window()) , m_target(*m_window->backing()) { - m_translation.move_by(widget.window_relative_rect().location()); - // NOTE: m_clip_rect is in Window coordinates since we are painting into its backing store. - m_clip_rect = widget.window_relative_rect(); + auto origin_rect = widget.window_relative_rect(); + m_translation.move_by(origin_rect.location()); + m_clip_rect = origin_rect; + m_clip_origin = origin_rect; m_clip_rect.intersect(m_target->rect()); } #endif @@ -446,10 +450,11 @@ void Painter::draw_focus_rect(const Rect& rect) void Painter::set_clip_rect(const Rect& rect) { - m_clip_rect = Rect::intersection(rect, m_target->rect()); + m_clip_rect.intersect(rect.translated(m_clip_origin.location())); + m_clip_rect.intersect(m_target->rect()); } void Painter::clear_clip_rect() { - m_clip_rect = m_target->rect(); + m_clip_rect = m_clip_origin; } diff --git a/SharedGraphics/Painter.h b/SharedGraphics/Painter.h index 022a9e27e7..e98e7c9fe4 100644 --- a/SharedGraphics/Painter.h +++ b/SharedGraphics/Painter.h @@ -62,6 +62,7 @@ private: const Font* m_font; Point m_translation; Rect m_clip_rect; + Rect m_clip_origin; GWindow* m_window { nullptr }; Retained m_target; DrawOp m_draw_op { DrawOp::Copy }; diff --git a/WindowServer/WSWindowManager.cpp b/WindowServer/WSWindowManager.cpp index 5805cc1f38..9fc48eaf6d 100644 --- a/WindowServer/WSWindowManager.cpp +++ b/WindowServer/WSWindowManager.cpp @@ -865,8 +865,10 @@ void WSWindowManager::compose() m_back_painter->set_clip_rect(dirty_rect); paint_window_frame(window); Rect dirty_rect_in_window_coordinates = Rect::intersection(dirty_rect, window.rect()); - if (dirty_rect_in_window_coordinates.is_empty()) + if (dirty_rect_in_window_coordinates.is_empty()) { + m_back_painter->clear_clip_rect(); continue; + } dirty_rect_in_window_coordinates.set_x(dirty_rect_in_window_coordinates.x() - window.x()); dirty_rect_in_window_coordinates.set_y(dirty_rect_in_window_coordinates.y() - window.y()); auto dst = window.position();