Use #pragma once in WebCore
[WebKit-https.git] / Source / WebCore / svg / SVGPathStringBuilder.cpp
1 /*
2  * Copyright (C) Research In Motion Limited 2010-2011. All rights reserved.
3  * Copyright (C) 2015 Apple Inc. All rights reserved.
4  *
5  * This library is free software; you can redistribute it and/or
6  * modify it under the terms of the GNU Library General Public
7  * License as published by the Free Software Foundation; either
8  * version 2 of the License, or (at your option) any later version.
9  *
10  * This library is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13  * Library General Public License for more details.
14  *
15  * You should have received a copy of the GNU Library General Public License
16  * along with this library; see the file COPYING.LIB.  If not, write to
17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
18  * Boston, MA 02110-1301, USA.
19  */
20
21 #include "config.h"
22 #include "SVGPathStringBuilder.h"
23
24 #include <wtf/text/WTFString.h>
25
26 namespace WebCore {
27
28 SVGPathStringBuilder::SVGPathStringBuilder()
29 {
30 }
31
32 SVGPathStringBuilder::~SVGPathStringBuilder()
33 {
34 }
35
36 String SVGPathStringBuilder::result()
37 {
38     unsigned size = m_stringBuilder.length();
39     if (!size)
40         return String();
41
42     // Remove trailing space.
43     m_stringBuilder.resize(size - 1);
44     return m_stringBuilder.toString();
45 }
46
47 void SVGPathStringBuilder::incrementPathSegmentCount()
48 {
49 }
50
51 bool SVGPathStringBuilder::continueConsuming()
52 {
53     return true;
54 }
55
56 static void appendFlag(StringBuilder& stringBuilder, bool flag)
57 {
58     stringBuilder.append(flag ? '1' : '0');
59     stringBuilder.append(' ');
60 }
61
62 static void appendNumber(StringBuilder& stringBuilder, float number)
63 {
64     stringBuilder.appendNumber(number);
65     stringBuilder.append(' ');
66 }
67
68 static void appendPoint(StringBuilder& stringBuilder, const FloatPoint& point)
69 {
70     stringBuilder.appendNumber(point.x());
71     stringBuilder.append(' ');
72     stringBuilder.appendNumber(point.y());
73     stringBuilder.append(' ');
74 }
75
76 void SVGPathStringBuilder::moveTo(const FloatPoint& targetPoint, bool, PathCoordinateMode mode)
77 {
78     if (mode == AbsoluteCoordinates)
79         m_stringBuilder.appendLiteral("M ");
80     else
81         m_stringBuilder.appendLiteral("m ");
82
83     appendPoint(m_stringBuilder, targetPoint);
84 }
85
86 void SVGPathStringBuilder::lineTo(const FloatPoint& targetPoint, PathCoordinateMode mode)
87 {
88     if (mode == AbsoluteCoordinates)
89         m_stringBuilder.appendLiteral("L ");
90     else
91         m_stringBuilder.appendLiteral("l ");
92
93     appendPoint(m_stringBuilder, targetPoint);
94 }
95
96 void SVGPathStringBuilder::lineToHorizontal(float x, PathCoordinateMode mode)
97 {
98     if (mode == AbsoluteCoordinates)
99         m_stringBuilder.appendLiteral("H ");
100     else
101         m_stringBuilder.appendLiteral("h ");
102
103     appendNumber(m_stringBuilder, x);
104 }
105
106 void SVGPathStringBuilder::lineToVertical(float y, PathCoordinateMode mode)
107 {
108     if (mode == AbsoluteCoordinates)
109         m_stringBuilder.appendLiteral("V ");
110     else
111         m_stringBuilder.appendLiteral("v ");
112
113     appendNumber(m_stringBuilder, y);
114 }
115
116 void SVGPathStringBuilder::curveToCubic(const FloatPoint& point1, const FloatPoint& point2, const FloatPoint& targetPoint, PathCoordinateMode mode)
117 {
118     if (mode == AbsoluteCoordinates)
119         m_stringBuilder.appendLiteral("C ");
120     else
121         m_stringBuilder.appendLiteral("c ");
122
123     appendPoint(m_stringBuilder, point1);
124     appendPoint(m_stringBuilder, point2);
125     appendPoint(m_stringBuilder, targetPoint);
126 }
127
128 void SVGPathStringBuilder::curveToCubicSmooth(const FloatPoint& point2, const FloatPoint& targetPoint, PathCoordinateMode mode)
129 {
130     if (mode == AbsoluteCoordinates)
131         m_stringBuilder.appendLiteral("S ");
132     else
133         m_stringBuilder.appendLiteral("s ");
134
135     appendPoint(m_stringBuilder, point2);
136     appendPoint(m_stringBuilder, targetPoint);
137 }
138
139 void SVGPathStringBuilder::curveToQuadratic(const FloatPoint& point1, const FloatPoint& targetPoint, PathCoordinateMode mode)
140 {
141     if (mode == AbsoluteCoordinates)
142         m_stringBuilder.appendLiteral("Q ");
143     else
144         m_stringBuilder.appendLiteral("q ");
145
146     appendPoint(m_stringBuilder, point1);
147     appendPoint(m_stringBuilder, targetPoint);
148 }
149
150 void SVGPathStringBuilder::curveToQuadraticSmooth(const FloatPoint& targetPoint, PathCoordinateMode mode)
151 {
152     if (mode == AbsoluteCoordinates)
153         m_stringBuilder.appendLiteral("T ");
154     else
155         m_stringBuilder.appendLiteral("t ");
156
157     appendPoint(m_stringBuilder, targetPoint);
158 }
159
160 void SVGPathStringBuilder::arcTo(float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag, const FloatPoint& targetPoint, PathCoordinateMode mode)
161 {
162     if (mode == AbsoluteCoordinates)
163         m_stringBuilder.appendLiteral("A ");
164     else
165         m_stringBuilder.appendLiteral("a ");
166
167     appendNumber(m_stringBuilder, r1);
168     appendNumber(m_stringBuilder, r2);
169     appendNumber(m_stringBuilder, angle);
170     appendFlag(m_stringBuilder, largeArcFlag);
171     appendFlag(m_stringBuilder, sweepFlag);
172     appendPoint(m_stringBuilder, targetPoint);
173 }
174
175 void SVGPathStringBuilder::closePath()
176 {
177     m_stringBuilder.appendLiteral("Z ");
178 }
179
180 } // namespace WebCore