mirror of
https://github.com/aseprite/aseprite.git
synced 2025-03-14 04:19:12 +00:00
Fix symmetry for even brush sizes (2px, 4px, etc.)
This commit is contained in:
parent
12d27031e8
commit
95b0aec22e
@ -35,7 +35,7 @@ void Intertwine::doPointshapePoint(int x, int y, ToolLoop* loop)
|
||||
main_stroke.addPoint(Point(x, y) + origin);
|
||||
|
||||
Strokes strokes;
|
||||
symmetry->generateStrokes(main_stroke, strokes);
|
||||
symmetry->generateStrokes(main_stroke, strokes, loop);
|
||||
for (const auto& stroke : strokes) {
|
||||
// We call transformPoint() moving back each point to the cel
|
||||
// origin.
|
||||
|
@ -12,27 +12,35 @@
|
||||
#include "app/tools/symmetries.h"
|
||||
|
||||
#include "app/tools/stroke.h"
|
||||
#include "app/tools/tool_loop.h"
|
||||
#include "doc/brush.h"
|
||||
|
||||
namespace app {
|
||||
namespace tools {
|
||||
|
||||
void HorizontalSymmetry::generateStrokes(const Stroke& mainStroke, Strokes& strokes)
|
||||
void HorizontalSymmetry::generateStrokes(const Stroke& mainStroke, Strokes& strokes,
|
||||
ToolLoop* loop)
|
||||
{
|
||||
int adjust = (loop->getBrush()->bounds().w % 2);
|
||||
|
||||
strokes.push_back(mainStroke);
|
||||
|
||||
Stroke stroke2;
|
||||
for (const auto& pt : mainStroke)
|
||||
stroke2.addPoint(gfx::Point(m_x - (pt.x - m_x + 1), pt.y));
|
||||
stroke2.addPoint(gfx::Point(m_x - (pt.x - m_x + adjust), pt.y));
|
||||
strokes.push_back(stroke2);
|
||||
}
|
||||
|
||||
void VerticalSymmetry::generateStrokes(const Stroke& mainStroke, Strokes& strokes)
|
||||
void VerticalSymmetry::generateStrokes(const Stroke& mainStroke, Strokes& strokes,
|
||||
ToolLoop* loop)
|
||||
{
|
||||
int adjust = (loop->getBrush()->bounds().h % 2);
|
||||
|
||||
strokes.push_back(mainStroke);
|
||||
|
||||
Stroke stroke2;
|
||||
for (const auto& pt : mainStroke)
|
||||
stroke2.addPoint(gfx::Point(pt.x, m_y - (pt.y - m_y + 1)));
|
||||
stroke2.addPoint(gfx::Point(pt.x, m_y - (pt.y - m_y + adjust)));
|
||||
strokes.push_back(stroke2);
|
||||
}
|
||||
|
||||
|
@ -18,7 +18,8 @@ namespace tools {
|
||||
class HorizontalSymmetry : public Symmetry {
|
||||
public:
|
||||
HorizontalSymmetry(int x) : m_x(x) { }
|
||||
void generateStrokes(const Stroke& mainStroke, Strokes& strokes) override;
|
||||
void generateStrokes(const Stroke& mainStroke, Strokes& strokes,
|
||||
ToolLoop* loop) override;
|
||||
private:
|
||||
int m_x;
|
||||
};
|
||||
@ -26,7 +27,8 @@ private:
|
||||
class VerticalSymmetry : public Symmetry {
|
||||
public:
|
||||
VerticalSymmetry(int y) : m_y(y) { }
|
||||
void generateStrokes(const Stroke& mainStroke, Strokes& strokes) override;
|
||||
void generateStrokes(const Stroke& mainStroke, Strokes& strokes,
|
||||
ToolLoop* loop) override;
|
||||
private:
|
||||
int m_y;
|
||||
};
|
||||
|
@ -16,13 +16,15 @@
|
||||
namespace app {
|
||||
namespace tools {
|
||||
|
||||
class ToolLoop;
|
||||
|
||||
// This class controls user input.
|
||||
class Symmetry {
|
||||
public:
|
||||
virtual ~Symmetry() { }
|
||||
|
||||
// The "stroke" must be relative to the sprite origin.
|
||||
virtual void generateStrokes(const Stroke& stroke, Strokes& strokes) = 0;
|
||||
virtual void generateStrokes(const Stroke& stroke, Strokes& strokes, ToolLoop* loop) = 0;
|
||||
};
|
||||
|
||||
} // namespace tools
|
||||
|
@ -176,7 +176,7 @@ void ToolLoopManager::doLoopStep(bool last_step)
|
||||
Symmetry* symmetry = m_toolLoop->getSymmetry();
|
||||
Strokes strokes;
|
||||
if (symmetry)
|
||||
symmetry->generateStrokes(main_stroke, strokes);
|
||||
symmetry->generateStrokes(main_stroke, strokes, m_toolLoop);
|
||||
else
|
||||
strokes.push_back(main_stroke);
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user