1// Aseprite
2// Copyright (C) 2019-2020 Igara Studio S.A.
3// Copyright (C) 2001-2015 David Capello
4//
5// This program is distributed under the terms of
6// the End-User License Agreement for Aseprite.
7
8#ifdef HAVE_CONFIG_H
9#include "config.h"
10#endif
11
12#include "app/tools/stroke.h"
13
14namespace app {
15namespace tools {
16
17void Stroke::reset()
18{
19 m_pts.clear();
20}
21
22void Stroke::reset(int n, const Pt& pt)
23{
24 m_pts.resize(n, pt);
25}
26
27void Stroke::addPoint(const Pt& pt)
28{
29 m_pts.push_back(pt);
30}
31
32void Stroke::offset(const gfx::Point& delta)
33{
34 for (auto& p : m_pts) {
35 p.x += delta.x;
36 p.y += delta.y;
37 }
38}
39
40void Stroke::erase(int index)
41{
42 ASSERT(0 <= index && index < m_pts.size());
43 if (0 <= index && index < m_pts.size())
44 m_pts.erase(m_pts.begin()+index);
45}
46
47gfx::Rect Stroke::bounds() const
48{
49 if (m_pts.empty())
50 return gfx::Rect();
51
52 gfx::Point
53 minpt(m_pts[0].x, m_pts[0].y),
54 maxpt(m_pts[0].x, m_pts[0].y);
55
56 for (std::size_t c=1; c<m_pts.size(); ++c) {
57 int x = m_pts[c].x;
58 int y = m_pts[c].y;
59 if (minpt.x > x) minpt.x = x;
60 if (minpt.y > y) minpt.y = y;
61 if (maxpt.x < x) maxpt.x = x;
62 if (maxpt.y < y) maxpt.y = y;
63 }
64
65 return gfx::Rect(minpt.x, minpt.y,
66 maxpt.x - minpt.x + 1,
67 maxpt.y - minpt.y + 1);
68}
69
70std::vector<int> Stroke::toXYInts() const
71{
72 std::vector<int> output;
73 if (!empty()) {
74 output.reserve(2*size());
75 for (auto pt : m_pts) {
76 output.push_back(pt.x);
77 output.push_back(pt.y);
78 }
79 }
80 return output;
81}
82
83} // namespace tools
84} // namespace app
85