From 6a66207efa32f807a62bf387dccdee6b10ff1d2a Mon Sep 17 00:00:00 2001 From: Nicolas Van Bossuyt Date: Tue, 21 Apr 2020 12:03:58 +0200 Subject: [PATCH] PaintBrush: Initial support for transparency. (#1883) --- Applications/PaintBrush/BucketTool.cpp | 5 +++-- Applications/PaintBrush/EraseTool.cpp | 6 +++--- Applications/PaintBrush/EraseTool.h | 4 ++-- Applications/PaintBrush/PaintableWidget.cpp | 8 +++++--- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/Applications/PaintBrush/BucketTool.cpp b/Applications/PaintBrush/BucketTool.cpp index bcd6b28b32..af5d4c410e 100644 --- a/Applications/PaintBrush/BucketTool.cpp +++ b/Applications/PaintBrush/BucketTool.cpp @@ -55,9 +55,10 @@ static void flood_fill(Gfx::Bitmap& bitmap, const Gfx::Point& start_position, Co while (!queue.is_empty()) { auto position = queue.dequeue(); - if (bitmap.get_pixel(position.x(), position.y()) != target_color) + if (bitmap.get_pixel(position.x(), position.y()) != target_color) continue; - bitmap.set_pixel(position.x(), position.y(), fill_color); + + bitmap.set_pixel(position.x(), position.y(), fill_color); if (position.x() != 0) queue.enqueue(position.translated(-1, 0)); diff --git a/Applications/PaintBrush/EraseTool.cpp b/Applications/PaintBrush/EraseTool.cpp index 7bd2a2eb20..4a6326d525 100644 --- a/Applications/PaintBrush/EraseTool.cpp +++ b/Applications/PaintBrush/EraseTool.cpp @@ -55,7 +55,7 @@ void EraseTool::on_mousedown(GUI::MouseEvent& event) return; Gfx::Rect r = build_rect(event.position(), m_widget->bitmap().rect()); GUI::Painter painter(m_widget->bitmap()); - painter.fill_rect(r, get_color()); + painter.clear_rect(r, get_color()); m_widget->update(); } @@ -67,7 +67,7 @@ void EraseTool::on_mousemove(GUI::MouseEvent& event) if (event.buttons() & GUI::MouseButton::Left || event.buttons() & GUI::MouseButton::Right) { Gfx::Rect r = build_rect(event.position(), m_widget->bitmap().rect()); GUI::Painter painter(m_widget->bitmap()); - painter.fill_rect(r, get_color()); + painter.clear_rect(r, get_color()); m_widget->update(); } } @@ -112,5 +112,5 @@ Color EraseTool::get_color() const { if (m_use_secondary_color) return m_widget->secondary_color(); - return Color(Color::White); + return Color(255, 255, 255, 0); } diff --git a/Applications/PaintBrush/EraseTool.h b/Applications/PaintBrush/EraseTool.h index 1442aac722..bdbfcf21ec 100644 --- a/Applications/PaintBrush/EraseTool.h +++ b/Applications/PaintBrush/EraseTool.h @@ -27,8 +27,8 @@ #pragma once #include "Tool.h" -#include #include +#include class EraseTool final : public Tool { public: @@ -45,7 +45,7 @@ private: Gfx::Rect build_rect(const Gfx::Point& pos, const Gfx::Rect& widget_rect); RefPtr m_context_menu; - bool m_use_secondary_color { true }; + bool m_use_secondary_color { false }; int m_thickness { 1 }; GUI::ActionGroup m_thickness_actions; }; diff --git a/Applications/PaintBrush/PaintableWidget.cpp b/Applications/PaintBrush/PaintableWidget.cpp index 164f129220..d1f21a532f 100644 --- a/Applications/PaintBrush/PaintableWidget.cpp +++ b/Applications/PaintBrush/PaintableWidget.cpp @@ -26,9 +26,9 @@ #include "PaintableWidget.h" #include "Tool.h" +#include #include #include -#include static PaintableWidget* s_the; @@ -46,8 +46,8 @@ PaintableWidget::PaintableWidget() pal.set_color(ColorRole::Window, Color::MidGray); set_palette(pal); set_background_color(Color::MidGray); - m_bitmap = Gfx::Bitmap::create(Gfx::BitmapFormat::RGB32, { 600, 400 }); - m_bitmap->fill(Color::White); + m_bitmap = Gfx::Bitmap::create(Gfx::BitmapFormat::RGBA32, { 600, 400 }); + m_bitmap->fill(Color(255, 255, 255, 0)); } PaintableWidget::~PaintableWidget() @@ -57,7 +57,9 @@ PaintableWidget::~PaintableWidget() void PaintableWidget::paint_event(GUI::PaintEvent& event) { GUI::Painter painter(*this); + painter.add_clip_rect(event.rect()); + painter.fill_rect_with_checkerboard(m_bitmap->rect(), { 8, 8 }, palette().base().darkened(0.9), palette().base()); painter.blit({ 0, 0 }, *m_bitmap, m_bitmap->rect()); }