Fix symmetry for even brush sizes (2px, 4px, etc.)

This commit is contained in:
David Capello 2015-11-05 16:58:22 -03:00
parent 12d27031e8
commit 95b0aec22e
5 changed files with 21 additions and 9 deletions

View File

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

View File

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

View File

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

View File

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

View File

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