mirror of
https://github.com/aseprite/aseprite.git
synced 2025-03-14 04:19:12 +00:00
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:
parent
6611a5ec73
commit
750f0c52af
@ -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) { }
|
||||
|
||||
};
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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:
|
||||
|
@ -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 {
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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(); }
|
||||
|
Loading…
x
Reference in New Issue
Block a user