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.
This commit is contained in:
David Capello 2017-10-06 10:23:03 -03:00
parent 6611a5ec73
commit 750f0c52af
7 changed files with 25 additions and 19 deletions

View File

@ -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) { }
};

View File

@ -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<typename Derived>
@ -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;
}

View File

@ -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:

View File

@ -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 {

View File

@ -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();
}

View File

@ -10,6 +10,7 @@
#include "app/ui/editor/standby_state.h"
#include "obs/connection.h"
#include <memory>
namespace app {
namespace tools {
@ -58,10 +59,10 @@ namespace app {
DrawingType m_type;
// The tool-loop.
tools::ToolLoop* m_toolLoop;
std::unique_ptr<tools::ToolLoop> m_toolLoop;
// Tool-loop manager
tools::ToolLoopManager* m_toolLoopManager;
std::unique_ptr<tools::ToolLoopManager> 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

View File

@ -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(); }