From 9fa21fa5852fc9b7605d953a3e9f8a9e8bd28864 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Thu, 28 Mar 2019 17:19:56 +0100 Subject: [PATCH] LibGUI: Add a GPainter class that inherits from Painter. This gets rid of the last little piece of LibGUI knowledge in Painter. --- Applications/FileManager/DirectoryModel.cpp | 2 +- Applications/FontEditor/FontEditor.cpp | 6 ++--- .../ProcessManager/MemoryStatsWidget.cpp | 4 +-- Applications/Terminal/Terminal.cpp | 4 +-- LibGUI/GAbstractView.cpp | 2 +- LibGUI/GButton.cpp | 4 +-- LibGUI/GCheckBox.cpp | 4 +-- LibGUI/GFrame.cpp | 4 +-- LibGUI/GItemView.cpp | 4 +-- LibGUI/GLabel.cpp | 4 +-- LibGUI/GListBox.cpp | 4 +-- LibGUI/GPainter.cpp | 19 ++++++++++++++ LibGUI/GPainter.h | 12 +++++++++ LibGUI/GProgressBar.cpp | 4 +-- LibGUI/GScrollBar.cpp | 4 +-- LibGUI/GStatusBar.cpp | 4 +-- LibGUI/GStyle.cpp | 2 +- LibGUI/GTableView.cpp | 4 +-- LibGUI/GTextBox.cpp | 4 +-- LibGUI/GTextEditor.cpp | 4 +-- LibGUI/GToolBar.cpp | 6 ++--- LibGUI/GWidget.cpp | 6 ++--- LibGUI/GWindow.cpp | 2 +- LibGUI/Makefile | 1 + SharedGraphics/Painter.cpp | 26 ------------------- SharedGraphics/Painter.h | 11 +------- Userland/guitest2.cpp | 2 +- 27 files changed, 75 insertions(+), 78 deletions(-) create mode 100644 LibGUI/GPainter.cpp create mode 100644 LibGUI/GPainter.h diff --git a/Applications/FileManager/DirectoryModel.cpp b/Applications/FileManager/DirectoryModel.cpp index cb5e96167b..a2700d284d 100644 --- a/Applications/FileManager/DirectoryModel.cpp +++ b/Applications/FileManager/DirectoryModel.cpp @@ -7,7 +7,7 @@ #include #include #include -#include +#include #include static GLockable>>& thumbnail_cache() diff --git a/Applications/FontEditor/FontEditor.cpp b/Applications/FontEditor/FontEditor.cpp index 5d4a223775..3260c6c189 100644 --- a/Applications/FontEditor/FontEditor.cpp +++ b/Applications/FontEditor/FontEditor.cpp @@ -1,5 +1,5 @@ #include "FontEditor.h" -#include +#include #include #include #include @@ -158,7 +158,7 @@ Rect GlyphMapWidget::get_outer_rect(byte glyph) const void GlyphMapWidget::paint_event(GPaintEvent&) { - Painter painter(*this); + GPainter painter(*this); painter.set_font(font()); painter.fill_rect(rect(), Color::White); painter.draw_rect(rect(), Color::Black); @@ -219,7 +219,7 @@ void GlyphEditorWidget::set_glyph(byte glyph) void GlyphEditorWidget::paint_event(GPaintEvent&) { - Painter painter(*this); + GPainter painter(*this); painter.fill_rect(rect(), Color::White); painter.draw_rect(rect(), Color::Black); diff --git a/Applications/ProcessManager/MemoryStatsWidget.cpp b/Applications/ProcessManager/MemoryStatsWidget.cpp index 5143ee9a71..d3b216ada1 100644 --- a/Applications/ProcessManager/MemoryStatsWidget.cpp +++ b/Applications/ProcessManager/MemoryStatsWidget.cpp @@ -1,5 +1,5 @@ #include "MemoryStatsWidget.h" -#include +#include #include #include #include @@ -104,7 +104,7 @@ void MemoryStatsWidget::timer_event(GTimerEvent&) void MemoryStatsWidget::paint_event(GPaintEvent& event) { - Painter painter(*this); + GPainter painter(*this); painter.set_clip_rect(event.rect()); GStyle::the().paint_surface(painter, rect()); } diff --git a/Applications/Terminal/Terminal.cpp b/Applications/Terminal/Terminal.cpp index 1e3a771570..9e85460265 100644 --- a/Applications/Terminal/Terminal.cpp +++ b/Applications/Terminal/Terminal.cpp @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include #include #include @@ -761,7 +761,7 @@ void Terminal::keydown_event(GKeyEvent& event) void Terminal::paint_event(GPaintEvent&) { - Painter painter(*this); + GPainter painter(*this); if (m_needs_background_fill) { m_needs_background_fill = false; diff --git a/LibGUI/GAbstractView.cpp b/LibGUI/GAbstractView.cpp index 34c73b4ab6..b1f64ae7d4 100644 --- a/LibGUI/GAbstractView.cpp +++ b/LibGUI/GAbstractView.cpp @@ -1,7 +1,7 @@ #include #include #include -#include +#include #include GAbstractView::GAbstractView(GWidget* parent) diff --git a/LibGUI/GButton.cpp b/LibGUI/GButton.cpp index fe7ccc65bf..96f329113e 100644 --- a/LibGUI/GButton.cpp +++ b/LibGUI/GButton.cpp @@ -1,5 +1,5 @@ #include "GButton.h" -#include +#include #include //#define GBUTTON_DEBUG @@ -23,7 +23,7 @@ void GButton::set_caption(const String& caption) void GButton::paint_event(GPaintEvent& event) { - Painter painter(*this); + GPainter painter(*this); painter.set_clip_rect(event.rect()); GStyle::the().paint_button(painter, rect(), m_button_style, m_being_pressed, m_hovered); diff --git a/LibGUI/GCheckBox.cpp b/LibGUI/GCheckBox.cpp index 101ca32707..506ce76e3d 100644 --- a/LibGUI/GCheckBox.cpp +++ b/LibGUI/GCheckBox.cpp @@ -1,5 +1,5 @@ #include "GCheckBox.h" -#include +#include #include #include @@ -54,7 +54,7 @@ void GCheckBox::set_checked(bool b) void GCheckBox::paint_event(GPaintEvent& event) { - Painter painter(*this); + GPainter painter(*this); painter.set_clip_rect(event.rect()); auto text_rect = rect(); diff --git a/LibGUI/GFrame.cpp b/LibGUI/GFrame.cpp index 0d31da6c57..322331163d 100644 --- a/LibGUI/GFrame.cpp +++ b/LibGUI/GFrame.cpp @@ -1,6 +1,6 @@ #include #include -#include +#include GFrame::GFrame(GWidget* parent) : GWidget(parent) @@ -16,7 +16,7 @@ void GFrame::paint_event(GPaintEvent& event) if (m_shape == Shape::NoFrame) return; - Painter painter(*this); + GPainter painter(*this); painter.set_clip_rect(event.rect()); auto rect = this->rect(); diff --git a/LibGUI/GItemView.cpp b/LibGUI/GItemView.cpp index 21628c9f66..92d71b79a2 100644 --- a/LibGUI/GItemView.cpp +++ b/LibGUI/GItemView.cpp @@ -1,7 +1,7 @@ #include #include #include -#include +#include #include GItemView::GItemView(GWidget* parent) @@ -98,7 +98,7 @@ void GItemView::paint_event(GPaintEvent& event) { GFrame::paint_event(event); - Painter painter(*this); + GPainter painter(*this); painter.set_clip_rect(widget_inner_rect()); painter.set_clip_rect(event.rect()); painter.fill_rect(event.rect(), Color::White); diff --git a/LibGUI/GLabel.cpp b/LibGUI/GLabel.cpp index bb6da3abaf..b3a29e941b 100644 --- a/LibGUI/GLabel.cpp +++ b/LibGUI/GLabel.cpp @@ -1,5 +1,5 @@ #include "GLabel.h" -#include +#include #include GLabel::GLabel(GWidget* parent) @@ -34,7 +34,7 @@ void GLabel::paint_event(GPaintEvent& event) { GFrame::paint_event(event); - Painter painter(*this); + GPainter painter(*this); painter.set_clip_rect(event.rect()); if (m_icon) { diff --git a/LibGUI/GListBox.cpp b/LibGUI/GListBox.cpp index c7ed5faab3..328716e5b2 100644 --- a/LibGUI/GListBox.cpp +++ b/LibGUI/GListBox.cpp @@ -1,6 +1,6 @@ #include "GListBox.h" #include -#include +#include GListBox::GListBox(GWidget* parent) : GWidget(parent) @@ -19,7 +19,7 @@ Rect GListBox::item_rect(int index) const void GListBox::paint_event(GPaintEvent& event) { - Painter painter(*this); + GPainter painter(*this); painter.set_clip_rect(event.rect()); painter.fill_rect({ rect().x() + 1, rect().y() + 1, rect().width() - 2, rect().height() - 2 }, background_color()); diff --git a/LibGUI/GPainter.cpp b/LibGUI/GPainter.cpp new file mode 100644 index 0000000000..c5bf01e4a2 --- /dev/null +++ b/LibGUI/GPainter.cpp @@ -0,0 +1,19 @@ +#include +#include +#include + +GPainter::GPainter(GraphicsBitmap& bitmap) + : Painter(bitmap) +{ +} + +GPainter::GPainter(GWidget& widget) + : Painter(*widget.window()->back_bitmap()) +{ + state().font = &widget.font(); + auto origin_rect = widget.window_relative_rect(); + state().translation = origin_rect.location(); + state().clip_rect = origin_rect; + m_clip_origin = origin_rect; + state().clip_rect.intersect(m_target->rect()); +} diff --git a/LibGUI/GPainter.h b/LibGUI/GPainter.h new file mode 100644 index 0000000000..1ad436e343 --- /dev/null +++ b/LibGUI/GPainter.h @@ -0,0 +1,12 @@ +#pragma once + +#include + +class GWidget; +class GraphicsBitmap; + +class GPainter : public Painter { +public: + explicit GPainter(GWidget&); + explicit GPainter(GraphicsBitmap&); +}; diff --git a/LibGUI/GProgressBar.cpp b/LibGUI/GProgressBar.cpp index a0aa7b07f0..e03d40168f 100644 --- a/LibGUI/GProgressBar.cpp +++ b/LibGUI/GProgressBar.cpp @@ -1,5 +1,5 @@ #include -#include +#include #include GProgressBar::GProgressBar(GWidget* parent) @@ -32,7 +32,7 @@ void GProgressBar::set_range(int min, int max) void GProgressBar::paint_event(GPaintEvent& event) { - Painter painter(*this); + GPainter painter(*this); painter.set_clip_rect(event.rect()); // First we fill the entire widget with the gradient. This incurs a bit of diff --git a/LibGUI/GScrollBar.cpp b/LibGUI/GScrollBar.cpp index d952c92af6..c63aae935b 100644 --- a/LibGUI/GScrollBar.cpp +++ b/LibGUI/GScrollBar.cpp @@ -2,7 +2,7 @@ #include #include #include -#include +#include //#define GUTTER_DOES_PAGEUP_PAGEDOWN @@ -185,7 +185,7 @@ Rect GScrollBar::scrubber_rect() const void GScrollBar::paint_event(GPaintEvent& event) { - Painter painter(*this); + GPainter 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 a1d6d7e1bd..bf4a775dd2 100644 --- a/LibGUI/GStatusBar.cpp +++ b/LibGUI/GStatusBar.cpp @@ -2,7 +2,7 @@ #include #include #include -#include +#include GStatusBar::GStatusBar(GWidget* parent) : GWidget(parent) @@ -34,7 +34,7 @@ String GStatusBar::text() const void GStatusBar::paint_event(GPaintEvent& event) { - Painter painter(*this); + GPainter painter(*this); painter.set_clip_rect(event.rect()); GStyle::the().paint_surface(painter, rect()); } diff --git a/LibGUI/GStyle.cpp b/LibGUI/GStyle.cpp index f792b81bdd..375477e484 100644 --- a/LibGUI/GStyle.cpp +++ b/LibGUI/GStyle.cpp @@ -1,5 +1,5 @@ #include -#include +#include static GStyle* s_the; diff --git a/LibGUI/GTableView.cpp b/LibGUI/GTableView.cpp index 88100c4304..2f3c6e6ea8 100644 --- a/LibGUI/GTableView.cpp +++ b/LibGUI/GTableView.cpp @@ -1,7 +1,7 @@ #include #include #include -#include +#include #include GTableView::GTableView(GWidget* parent) @@ -100,7 +100,7 @@ void GTableView::paint_event(GPaintEvent& event) { GFrame::paint_event(event); - Painter painter(*this); + GPainter painter(*this); painter.set_clip_rect(frame_inner_rect()); painter.set_clip_rect(event.rect()); painter.save(); diff --git a/LibGUI/GTextBox.cpp b/LibGUI/GTextBox.cpp index 5ebc962128..743360c08b 100644 --- a/LibGUI/GTextBox.cpp +++ b/LibGUI/GTextBox.cpp @@ -2,7 +2,7 @@ #include #include #include -#include +#include #include GTextBox::GTextBox(GWidget* parent) @@ -73,7 +73,7 @@ Point GTextBox::cursor_content_position() const void GTextBox::paint_event(GPaintEvent& event) { - Painter painter(*this); + GPainter painter(*this); painter.set_clip_rect(event.rect()); painter.fill_rect(rect().shrunken(2, 2), background_color()); diff --git a/LibGUI/GTextEditor.cpp b/LibGUI/GTextEditor.cpp index b22512ed62..9fae1dbca9 100644 --- a/LibGUI/GTextEditor.cpp +++ b/LibGUI/GTextEditor.cpp @@ -2,7 +2,7 @@ #include #include #include -#include +#include #include #include #include @@ -152,7 +152,7 @@ void GTextEditor::paint_event(GPaintEvent& event) { GFrame::paint_event(event); - Painter painter(*this); + GPainter painter(*this); painter.set_clip_rect(widget_inner_rect()); painter.set_clip_rect(event.rect()); painter.fill_rect(event.rect(), Color::White); diff --git a/LibGUI/GToolBar.cpp b/LibGUI/GToolBar.cpp index 1a53bfa59a..93559b8a42 100644 --- a/LibGUI/GToolBar.cpp +++ b/LibGUI/GToolBar.cpp @@ -2,7 +2,7 @@ #include #include #include -#include +#include GToolBar::GToolBar(GWidget* parent) : GWidget(parent) @@ -56,7 +56,7 @@ public: virtual void paint_event(GPaintEvent& event) override { - Painter painter(*this); + GPainter painter(*this); painter.set_clip_rect(event.rect()); painter.translate(rect().center().x() - 1, 0); painter.draw_line({ 0, 0 }, { 0, rect().bottom() }, Color::MidGray); @@ -77,7 +77,7 @@ void GToolBar::add_separator() void GToolBar::paint_event(GPaintEvent& event) { - Painter painter(*this); + GPainter painter(*this); painter.set_clip_rect(event.rect()); GStyle::the().paint_surface(painter, rect()); } diff --git a/LibGUI/GWidget.cpp b/LibGUI/GWidget.cpp index f78ec48ebf..e22dd03b59 100644 --- a/LibGUI/GWidget.cpp +++ b/LibGUI/GWidget.cpp @@ -5,7 +5,7 @@ #include #include #include -#include +#include #include @@ -85,13 +85,13 @@ void GWidget::handle_paint_event(GPaintEvent& event) { ASSERT(is_visible()); if (fill_with_background_color()) { - Painter painter(*this); + GPainter painter(*this); painter.fill_rect(event.rect(), background_color()); } else { #ifdef DEBUG_WIDGET_UNDERDRAW // FIXME: This is a bit broken. // If the widget is not opaque, let's not mess it up with debugging color. - Painter painter(*this); + GPainter painter(*this); painter.fill_rect(rect(), Color::Red); #endif } diff --git a/LibGUI/GWindow.cpp b/LibGUI/GWindow.cpp index 09e316ed7b..7c8e1461eb 100644 --- a/LibGUI/GWindow.cpp +++ b/LibGUI/GWindow.cpp @@ -3,7 +3,7 @@ #include "GEventLoop.h" #include "GWidget.h" #include -#include +#include #include #include #include diff --git a/LibGUI/Makefile b/LibGUI/Makefile index d004387557..aa63cbc48b 100644 --- a/LibGUI/Makefile +++ b/LibGUI/Makefile @@ -8,6 +8,7 @@ SHAREDGRAPHICS_OBJS = \ ../SharedGraphics/PNGLoader.o LIBGUI_OBJS = \ + GPainter.o \ GIODevice.o \ GFile.o \ GButton.o \ diff --git a/SharedGraphics/Painter.cpp b/SharedGraphics/Painter.cpp index 02a94ec938..6ff2f3f086 100644 --- a/SharedGraphics/Painter.cpp +++ b/SharedGraphics/Painter.cpp @@ -4,16 +4,6 @@ #include #include #include - -#ifdef LIBGUI -#include -#include -#include -#include -#include -#include -#endif - #include Painter::Painter(GraphicsBitmap& bitmap) @@ -25,22 +15,6 @@ Painter::Painter(GraphicsBitmap& bitmap) m_clip_origin = state().clip_rect; } -#ifdef LIBGUI -Painter::Painter(GWidget& widget) - : m_window(widget.window()) - , m_target(*m_window->back_bitmap()) -{ - m_state_stack.append(State()); - state().font = &widget.font(); - - auto origin_rect = widget.window_relative_rect(); - state().translation = origin_rect.location(); - state().clip_rect = origin_rect; - m_clip_origin = origin_rect; - state().clip_rect.intersect(m_target->rect()); -} -#endif - Painter::~Painter() { } diff --git a/SharedGraphics/Painter.h b/SharedGraphics/Painter.h index a9485c5e1f..adc802449c 100644 --- a/SharedGraphics/Painter.h +++ b/SharedGraphics/Painter.h @@ -12,16 +12,8 @@ class GlyphBitmap; class GraphicsBitmap; class Font; -#ifdef USERLAND -class GWidget; -class GWindow; -#endif - class Painter { public: -#ifdef USERLAND - explicit Painter(GWidget&); -#endif explicit Painter(GraphicsBitmap&); ~Painter(); void fill_rect(const Rect&, Color); @@ -64,7 +56,7 @@ public: void save() { m_state_stack.append(m_state_stack.last()); } void restore() { ASSERT(m_state_stack.size() > 1); m_state_stack.take_last(); } -private: +protected: void set_pixel_with_draw_op(dword& pixel, const Color&); void fill_rect_with_draw_op(const Rect&, Color); void blit_with_alpha(const Point&, const GraphicsBitmap&, const Rect& src_rect); @@ -80,7 +72,6 @@ private: const State& state() const { return m_state_stack.last(); } Rect m_clip_origin; - GWindow* m_window { nullptr }; Retained m_target; Vector m_state_stack; }; diff --git a/Userland/guitest2.cpp b/Userland/guitest2.cpp index e96be84bd3..b8c9f1bfd1 100644 --- a/Userland/guitest2.cpp +++ b/Userland/guitest2.cpp @@ -8,7 +8,7 @@ #include #include #include -#include +#include #include #include #include