diff options
author | Robin Burchell <robin+git@viroteck.net> | 2019-06-16 11:33:20 +0200 |
---|---|---|
committer | Andreas Kling <awesomekling@gmail.com> | 2019-06-17 05:54:32 +0200 |
commit | 502c54e39ab15844eef0ef97701c4450ffba0ae4 (patch) | |
tree | ba3799a1fcb33486874b208679c9e5320505f46a /Applications/PaintBrush/SprayTool.cpp | |
parent | 940eb1bbeb5a1d00f8765da5c64ea20ef57c13b3 (diff) | |
download | serenity-502c54e39ab15844eef0ef97701c4450ffba0ae4.zip |
Add a simple spray fill tool
Could do with some more tweaking no doubt, and it'd be nice to have a
circular spray, but this is better than nothing.
Diffstat (limited to 'Applications/PaintBrush/SprayTool.cpp')
-rw-r--r-- | Applications/PaintBrush/SprayTool.cpp | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/Applications/PaintBrush/SprayTool.cpp b/Applications/PaintBrush/SprayTool.cpp new file mode 100644 index 0000000000..bb2c19c147 --- /dev/null +++ b/Applications/PaintBrush/SprayTool.cpp @@ -0,0 +1,69 @@ +#include "SprayTool.h" +#include "PaintableWidget.h" +#include <AK/Queue.h> +#include <AK/SinglyLinkedList.h> +#include <LibGUI/GPainter.h> +#include <SharedGraphics/GraphicsBitmap.h> +#include <stdio.h> + +SprayTool::SprayTool() +{ + m_timer.on_timeout = [=]() { + paint_it(); + }; + m_timer.set_interval(200); +} + +SprayTool::~SprayTool() +{ +} + +static double nrand() +{ + return double(rand()) / double(RAND_MAX); +} + +void SprayTool::paint_it() +{ + GPainter painter(m_widget->bitmap()); + auto& bitmap = m_widget->bitmap(); + ASSERT(bitmap.format() == GraphicsBitmap::Format::RGB32); + m_widget->update(); + const double radius = 15; + for (int i = 0; i < 100 + (nrand() * 800); i++) { + const int minX = m_last_pos.x() - radius; + const int minY = m_last_pos.y() - radius; + const int xpos = minX + (radius * 2 * nrand()); + const int ypos = minY + (radius * 2 * nrand()); + if (xpos < 0 || xpos >= bitmap.width()) + continue; + if (ypos < 0 || ypos >= bitmap.height()) + continue; + bitmap.set_pixel<GraphicsBitmap::Format::RGB32>(xpos, ypos, m_color); + } +} + +void SprayTool::on_mousedown(GMouseEvent& event) +{ + if (!m_widget->rect().contains(event.position())) + return; + + m_color = m_widget->color_for(event); + m_last_pos = event.position(); + m_timer.start(); + paint_it(); +} + +void SprayTool::on_mousemove(GMouseEvent& event) +{ + m_last_pos = event.position(); + if (m_timer.is_active()) { + paint_it(); + m_timer.restart(m_timer.interval()); + } +} + +void SprayTool::on_mouseup(GMouseEvent&) +{ + m_timer.stop(); +} |