| Index: Source/core/svg/SVGPathStringBuilder.cpp
|
| diff --git a/Source/core/svg/SVGPathStringBuilder.cpp b/Source/core/svg/SVGPathStringBuilder.cpp
|
| index 580454b7b81141dd114a23a0e66e7bd4d8b6b33b..e3c5905e833c0621b1fd2d38358ca83e4599a287 100644
|
| --- a/Source/core/svg/SVGPathStringBuilder.cpp
|
| +++ b/Source/core/svg/SVGPathStringBuilder.cpp
|
| @@ -35,96 +35,100 @@ String SVGPathStringBuilder::result()
|
| return m_stringBuilder.toString();
|
| }
|
|
|
| +static void appendFloat(StringBuilder& stringBuilder, float value)
|
| +{
|
| + stringBuilder.append(' ');
|
| + stringBuilder.appendNumber(value);
|
| +}
|
| +
|
| +static void appendBool(StringBuilder& stringBuilder, bool value)
|
| +{
|
| + stringBuilder.append(' ');
|
| + stringBuilder.appendNumber(value);
|
| +}
|
| +
|
| +static void appendPoint(StringBuilder& stringBuilder, const FloatPoint& point)
|
| +{
|
| + appendFloat(stringBuilder, point.x());
|
| + appendFloat(stringBuilder, point.y());
|
| +}
|
| +
|
| +static void emitCommand1Arg(StringBuilder& stringBuilder, char commandChar, float argument)
|
| +{
|
| + stringBuilder.append(commandChar);
|
| + appendFloat(stringBuilder, argument);
|
| + stringBuilder.append(' ');
|
| +}
|
| +
|
| +static void emitCommand1Arg(StringBuilder& stringBuilder, char commandChar, const FloatPoint& argumentPoint)
|
| +{
|
| + stringBuilder.append(commandChar);
|
| + appendPoint(stringBuilder, argumentPoint);
|
| + stringBuilder.append(' ');
|
| +}
|
| +
|
| +static void emitCommand2Arg(StringBuilder& stringBuilder, char commandChar, const FloatPoint& argument1Point, const FloatPoint& argument2Point)
|
| +{
|
| + stringBuilder.append(commandChar);
|
| + appendPoint(stringBuilder, argument1Point);
|
| + appendPoint(stringBuilder, argument2Point);
|
| + stringBuilder.append(' ');
|
| +}
|
| +
|
| void SVGPathStringBuilder::moveTo(const FloatPoint& targetPoint, bool, PathCoordinateMode mode)
|
| {
|
| - if (mode == AbsoluteCoordinates)
|
| - m_stringBuilder.append("M " + String::number(targetPoint.x()) + ' ' + String::number(targetPoint.y()) + ' ');
|
| - else
|
| - m_stringBuilder.append("m " + String::number(targetPoint.x()) + ' ' + String::number(targetPoint.y()) + ' ');
|
| + emitCommand1Arg(m_stringBuilder, (mode == AbsoluteCoordinates) ? 'M' : 'm', targetPoint);
|
| }
|
|
|
| void SVGPathStringBuilder::lineTo(const FloatPoint& targetPoint, PathCoordinateMode mode)
|
| {
|
| - if (mode == AbsoluteCoordinates)
|
| - m_stringBuilder.append("L " + String::number(targetPoint.x()) + ' ' + String::number(targetPoint.y()) + ' ');
|
| - else
|
| - m_stringBuilder.append("l " + String::number(targetPoint.x()) + ' ' + String::number(targetPoint.y()) + ' ');
|
| + emitCommand1Arg(m_stringBuilder, (mode == AbsoluteCoordinates) ? 'L' : 'l', targetPoint);
|
| }
|
|
|
| void SVGPathStringBuilder::lineToHorizontal(float x, PathCoordinateMode mode)
|
| {
|
| - if (mode == AbsoluteCoordinates)
|
| - m_stringBuilder.append("H " + String::number(x) + ' ');
|
| - else
|
| - m_stringBuilder.append("h " + String::number(x) + ' ');
|
| + emitCommand1Arg(m_stringBuilder, (mode == AbsoluteCoordinates) ? 'H' : 'h', x);
|
| }
|
|
|
| void SVGPathStringBuilder::lineToVertical(float y, PathCoordinateMode mode)
|
| {
|
| - if (mode == AbsoluteCoordinates)
|
| - m_stringBuilder.append("V " + String::number(y) + ' ');
|
| - else
|
| - m_stringBuilder.append("v " + String::number(y) + ' ');
|
| + emitCommand1Arg(m_stringBuilder, (mode == AbsoluteCoordinates) ? 'V' : 'v', y);
|
| }
|
|
|
| void SVGPathStringBuilder::curveToCubic(const FloatPoint& point1, const FloatPoint& point2, const FloatPoint& targetPoint, PathCoordinateMode mode)
|
| {
|
| - if (mode == AbsoluteCoordinates) {
|
| - m_stringBuilder.append("C " + String::number(point1.x()) + ' ' + String::number(point1.y())
|
| - + ' ' + String::number(point2.x()) + ' ' + String::number(point2.y())
|
| - + ' ' + String::number(targetPoint.x()) + ' ' + String::number(targetPoint.y()) + ' ');
|
| - return;
|
| - }
|
| -
|
| - m_stringBuilder.append("c " + String::number(point1.x()) + ' ' + String::number(point1.y())
|
| - + ' ' + String::number(point2.x()) + ' ' + String::number(point2.y())
|
| - + ' ' + String::number(targetPoint.x()) + ' ' + String::number(targetPoint.y()) + ' ');
|
| + m_stringBuilder.append((mode == AbsoluteCoordinates) ? 'C' : 'c');
|
| + appendPoint(m_stringBuilder, point1);
|
| + appendPoint(m_stringBuilder, point2);
|
| + appendPoint(m_stringBuilder, targetPoint);
|
| + m_stringBuilder.append(' ');
|
| }
|
|
|
| void SVGPathStringBuilder::curveToCubicSmooth(const FloatPoint& point2, const FloatPoint& targetPoint, PathCoordinateMode mode)
|
| {
|
| - if (mode == AbsoluteCoordinates) {
|
| - m_stringBuilder.append("S " + String::number(point2.x()) + ' ' + String::number(point2.y())
|
| - + ' ' + String::number(targetPoint.x()) + ' ' + String::number(targetPoint.y()) + ' ');
|
| - return;
|
| - }
|
| -
|
| - m_stringBuilder.append("s " + String::number(point2.x()) + ' ' + String::number(point2.y())
|
| - + ' ' + String::number(targetPoint.x()) + ' ' + String::number(targetPoint.y()) + ' ');
|
| + emitCommand2Arg(m_stringBuilder, (mode == AbsoluteCoordinates) ? 'S' : 's', point2, targetPoint);
|
| }
|
|
|
| void SVGPathStringBuilder::curveToQuadratic(const FloatPoint& point1, const FloatPoint& targetPoint, PathCoordinateMode mode)
|
| {
|
| - if (mode == AbsoluteCoordinates) {
|
| - m_stringBuilder.append("Q " + String::number(point1.x()) + ' ' + String::number(point1.y())
|
| - + ' ' + String::number(targetPoint.x()) + ' ' + String::number(targetPoint.y()) + ' ');
|
| - return;
|
| - }
|
| -
|
| - m_stringBuilder.append("q " + String::number(point1.x()) + ' ' + String::number(point1.y())
|
| - + ' ' + String::number(targetPoint.x()) + ' ' + String::number(targetPoint.y()) + ' ');
|
| + emitCommand2Arg(m_stringBuilder, (mode == AbsoluteCoordinates) ? 'Q' : 'q', point1, targetPoint);
|
| }
|
|
|
| void SVGPathStringBuilder::curveToQuadraticSmooth(const FloatPoint& targetPoint, PathCoordinateMode mode)
|
| {
|
| - if (mode == AbsoluteCoordinates)
|
| - m_stringBuilder.append("T " + String::number(targetPoint.x()) + ' ' + String::number(targetPoint.y()) + ' ');
|
| - else
|
| - m_stringBuilder.append("t " + String::number(targetPoint.x()) + ' ' + String::number(targetPoint.y()) + ' ');
|
| + emitCommand1Arg(m_stringBuilder, (mode == AbsoluteCoordinates) ? 'T' : 't', targetPoint);
|
| }
|
|
|
| void SVGPathStringBuilder::arcTo(float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag, const FloatPoint& targetPoint, PathCoordinateMode mode)
|
| {
|
| - if (mode == AbsoluteCoordinates) {
|
| - m_stringBuilder.append("A " + String::number(r1) + ' ' + String::number(r2)
|
| - + ' ' + String::number(angle) + ' ' + String::number(largeArcFlag) + ' ' + String::number(sweepFlag)
|
| - + ' ' + String::number(targetPoint.x()) + ' ' + String::number(targetPoint.y()) + ' ');
|
| - return;
|
| - }
|
| -
|
| - m_stringBuilder.append("a " + String::number(r1) + ' ' + String::number(r2)
|
| - + ' ' + String::number(angle) + ' ' + String::number(largeArcFlag) + ' ' + String::number(sweepFlag)
|
| - + ' ' + String::number(targetPoint.x()) + ' ' + String::number(targetPoint.y()) + ' ');
|
| + m_stringBuilder.append((mode == AbsoluteCoordinates) ? 'A' : 'a');
|
| + appendFloat(m_stringBuilder, r1);
|
| + appendFloat(m_stringBuilder, r2);
|
| + appendFloat(m_stringBuilder, angle);
|
| + appendBool(m_stringBuilder, largeArcFlag);
|
| + appendBool(m_stringBuilder, sweepFlag);
|
| + appendPoint(m_stringBuilder, targetPoint);
|
| + m_stringBuilder.append(' ');
|
| }
|
|
|
| void SVGPathStringBuilder::closePath()
|
|
|