From 750f0c52afee6c12e32a931c7bd41345334fa66c Mon Sep 17 00:00:00 2001 From: David Capello Date: Fri, 6 Oct 2017 10:23:03 -0300 Subject: [PATCH] Keep original pattern origin for custom brushes With this patch we avoid resetting the original pattern origin when we use "align to destination" or "paint brush" modes. --- src/app/tools/ink.h | 2 +- src/app/tools/ink_processing.h | 7 ++++--- src/app/tools/inks.h | 4 ++-- src/app/tools/point_shapes.h | 14 +++++++------- src/app/ui/editor/drawing_state.cpp | 6 ++---- src/app/ui/editor/drawing_state.h | 5 +++-- src/app/ui/editor/tool_loop_impl.cpp | 6 ++++++ 7 files changed, 25 insertions(+), 19 deletions(-) diff --git a/src/app/tools/ink.h b/src/app/tools/ink.h index fa1af1ad9..733b14e43 100644 --- a/src/app/tools/ink.h +++ b/src/app/tools/ink.h @@ -97,7 +97,7 @@ namespace app { virtual void prepareForStrokes(ToolLoop* loop, Strokes& strokes) { } // Called for each point shape. - virtual void prepareForPointShape(ToolLoop* loop, int x, int y) { } + virtual void prepareForPointShape(ToolLoop* loop, bool firstPoint, int x, int y) { } }; diff --git a/src/app/tools/ink_processing.h b/src/app/tools/ink_processing.h index f5d5bd233..604acffe6 100644 --- a/src/app/tools/ink_processing.h +++ b/src/app/tools/ink_processing.h @@ -36,7 +36,7 @@ public: virtual ~BaseInkProcessing() { } virtual void processScanline(int x1, int y, int x2, ToolLoop* loop) = 0; virtual void prepareForStrokes(ToolLoop* loop, Strokes& strokes) { } - virtual void prepareForPointShape(ToolLoop* loop, int x, int y) { } + virtual void prepareForPointShape(ToolLoop* loop, bool firstPoint, int x, int y) { } }; template @@ -1095,8 +1095,9 @@ public: m_v = (m_brush->patternOrigin().y - loop->getCelOrigin().y) % m_height; } - void prepareForPointShape(ToolLoop* loop, int x, int y) override { - if (m_brush->pattern() == BrushPattern::PAINT_BRUSH) { + void prepareForPointShape(ToolLoop* loop, bool firstPoint, int x, int y) override { + if ((m_brush->pattern() == BrushPattern::ALIGNED_TO_DST && firstPoint) || + (m_brush->pattern() == BrushPattern::PAINT_BRUSH)) { m_u = (m_brush->patternOrigin().x - loop->getCelOrigin().x) % m_width; m_v = (m_brush->patternOrigin().y - loop->getCelOrigin().y) % m_height; } diff --git a/src/app/tools/inks.h b/src/app/tools/inks.h index b1cb825de..2dcbeb3f2 100644 --- a/src/app/tools/inks.h +++ b/src/app/tools/inks.h @@ -29,9 +29,9 @@ public: m_proc->processScanline(x1, y, x2, loop); } - void prepareForPointShape(ToolLoop* loop, int x, int y) override { + void prepareForPointShape(ToolLoop* loop, bool firstPoint, int x, int y) override { ASSERT(m_proc); - m_proc->prepareForPointShape(loop, x, y); + m_proc->prepareForPointShape(loop, firstPoint, x, y); } protected: diff --git a/src/app/tools/point_shapes.h b/src/app/tools/point_shapes.h index 63fa8b90b..3e4218906 100644 --- a/src/app/tools/point_shapes.h +++ b/src/app/tools/point_shapes.h @@ -51,12 +51,10 @@ public: y += m_brush->bounds().y; if (m_firstPoint) { - m_firstPoint = false; - if (m_brush->type() == kImageBrushType) { - if (m_brush->pattern() == BrushPattern::ALIGNED_TO_DST || - m_brush->pattern() == BrushPattern::PAINT_BRUSH) { - m_brush->setPatternOrigin(gfx::Point(x, y)); - } + if ((m_brush->type() == kImageBrushType) && + (m_brush->pattern() == BrushPattern::ALIGNED_TO_DST || + m_brush->pattern() == BrushPattern::PAINT_BRUSH)) { + m_brush->setPatternOrigin(gfx::Point(x, y)); } } else { @@ -66,12 +64,14 @@ public: } } - loop->getInk()->prepareForPointShape(loop, x, y); + loop->getInk()->prepareForPointShape(loop, m_firstPoint, x, y); for (auto scanline : *m_compressedImage) { int u = x+scanline.x; doInkHline(u, y+scanline.y, u+scanline.w-1, loop); } + + m_firstPoint = false; } void getModifiedArea(ToolLoop* loop, int x, int y, Rect& area) override { diff --git a/src/app/ui/editor/drawing_state.cpp b/src/app/ui/editor/drawing_state.cpp index 0ee586cc8..5c89a440e 100644 --- a/src/app/ui/editor/drawing_state.cpp +++ b/src/app/ui/editor/drawing_state.cpp @@ -269,10 +269,8 @@ void DrawingState::destroyLoop(Editor* editor) if (m_toolLoop) m_toolLoop->commitOrRollback(); - delete m_toolLoopManager; - delete m_toolLoop; - m_toolLoopManager = nullptr; - m_toolLoop = nullptr; + m_toolLoopManager.reset(nullptr); + m_toolLoop.reset(nullptr); app_rebuild_documents_tabs(); } diff --git a/src/app/ui/editor/drawing_state.h b/src/app/ui/editor/drawing_state.h index 4daf0738b..95beede9e 100644 --- a/src/app/ui/editor/drawing_state.h +++ b/src/app/ui/editor/drawing_state.h @@ -10,6 +10,7 @@ #include "app/ui/editor/standby_state.h" #include "obs/connection.h" +#include namespace app { namespace tools { @@ -58,10 +59,10 @@ namespace app { DrawingType m_type; // The tool-loop. - tools::ToolLoop* m_toolLoop; + std::unique_ptr m_toolLoop; // Tool-loop manager - tools::ToolLoopManager* m_toolLoopManager; + std::unique_ptr m_toolLoopManager; // True if at least we've received a onMouseMove(). It's used to // cancel selection tool (deselect) when the user click (press and diff --git a/src/app/ui/editor/tool_loop_impl.cpp b/src/app/ui/editor/tool_loop_impl.cpp index a5b9aed95..8374d0014 100644 --- a/src/app/ui/editor/tool_loop_impl.cpp +++ b/src/app/ui/editor/tool_loop_impl.cpp @@ -65,6 +65,7 @@ protected: Editor* m_editor; tools::Tool* m_tool; BrushRef m_brush; + gfx::Point m_oldPatternOrigin; Document* m_document; Sprite* m_sprite; Layer* m_layer; @@ -105,6 +106,7 @@ public: : m_editor(editor) , m_tool(tool) , m_brush(App::instance()->contextBar()->activeBrush(m_tool, ink)) + , m_oldPatternOrigin(m_brush->patternOrigin()) , m_document(document) , m_sprite(editor->sprite()) , m_layer(layer) @@ -190,6 +192,10 @@ public: } } + ~ToolLoopBase() { + m_brush->setPatternOrigin(m_oldPatternOrigin); + } + // IToolLoop interface tools::Tool* getTool() override { return m_tool; } Brush* getBrush() override { return m_brush.get(); }