1dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch/*
2dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Copyright (C) Research In Motion Limited 2010. All rights reserved.
3dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch *
4dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * This library is free software; you can redistribute it and/or
5dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * modify it under the terms of the GNU Library General Public
6dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * License as published by the Free Software Foundation; either
7dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * version 2 of the License, or (at your option) any later version.
8dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch *
9dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * This library is distributed in the hope that it will be useful,
10dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * but WITHOUT ANY WARRANTY; without even the implied warranty of
11dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Library General Public License for more details.
13dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch *
14dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * You should have received a copy of the GNU Library General Public License
15dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * along with this library; see the file COPYING.LIB.  If not, write to
16dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch * Boston, MA 02110-1301, USA.
18dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch */
19dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
20dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "config.h"
21dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
22dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#if ENABLE(SVG)
23dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "SVGPathSegListSource.h"
24dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
25dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "SVGPathSegArc.h"
26dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "SVGPathSegCurvetoCubic.h"
27dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "SVGPathSegCurvetoCubicSmooth.h"
28dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "SVGPathSegCurvetoQuadratic.h"
29dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "SVGPathSegLinetoHorizontal.h"
30dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include "SVGPathSegLinetoVertical.h"
31dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
32dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochnamespace WebCore {
33dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
344576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) WangSVGPathSegListSource::SVGPathSegListSource(const SVGPathSegList& pathSegList)
35dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    : m_pathSegList(pathSegList)
36dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
37dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    m_itemCurrent = 0;
384576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    m_itemEnd = m_pathSegList.size();
39dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
40dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
41dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochbool SVGPathSegListSource::hasMoreData() const
42dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
43dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return m_itemCurrent < m_itemEnd;
44dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
45dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
46dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochbool SVGPathSegListSource::parseSVGSegmentType(SVGPathSegType& pathSegType)
47dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
484576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    m_segment = m_pathSegList.at(m_itemCurrent);
49dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    pathSegType = static_cast<SVGPathSegType>(m_segment->pathSegType());
50dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ++m_itemCurrent;
51dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return true;
52dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
53dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
54dd8bb3de4f353a81954234999f1fea748aee2ea9Ben MurdochSVGPathSegType SVGPathSegListSource::nextCommand(SVGPathSegType)
55dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
564576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    m_segment = m_pathSegList.at(m_itemCurrent);
57dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    SVGPathSegType pathSegType = static_cast<SVGPathSegType>(m_segment->pathSegType());
58dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ++m_itemCurrent;
59dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return pathSegType;
60dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
61dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
62dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochbool SVGPathSegListSource::parseMoveToSegment(FloatPoint& targetPoint)
63dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
64dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ASSERT(m_segment);
65dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ASSERT(m_segment->pathSegType() == PathSegMoveToAbs || m_segment->pathSegType() == PathSegMoveToRel);
664576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    SVGPathSegSingleCoordinate* moveTo = static_cast<SVGPathSegSingleCoordinate*>(m_segment.get());
67dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    targetPoint = FloatPoint(moveTo->x(), moveTo->y());
68dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return true;
69dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
70dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
71dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochbool SVGPathSegListSource::parseLineToSegment(FloatPoint& targetPoint)
72dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
73dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ASSERT(m_segment);
74dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ASSERT(m_segment->pathSegType() == PathSegLineToAbs || m_segment->pathSegType() == PathSegLineToRel);
754576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    SVGPathSegSingleCoordinate* lineTo = static_cast<SVGPathSegSingleCoordinate*>(m_segment.get());
76dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    targetPoint = FloatPoint(lineTo->x(), lineTo->y());
77dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return true;
78dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
79dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
80dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochbool SVGPathSegListSource::parseLineToHorizontalSegment(float& x)
81dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
82dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ASSERT(m_segment);
83dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ASSERT(m_segment->pathSegType() == PathSegLineToHorizontalAbs || m_segment->pathSegType() == PathSegLineToHorizontalRel);
84dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    SVGPathSegLinetoHorizontal* horizontal = static_cast<SVGPathSegLinetoHorizontal*>(m_segment.get());
85dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    x = horizontal->x();
86dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return true;
87dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
88dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
89dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochbool SVGPathSegListSource::parseLineToVerticalSegment(float& y)
90dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
91dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ASSERT(m_segment);
92dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ASSERT(m_segment->pathSegType() == PathSegLineToVerticalAbs || m_segment->pathSegType() == PathSegLineToVerticalRel);
93dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    SVGPathSegLinetoVertical* vertical = static_cast<SVGPathSegLinetoVertical*>(m_segment.get());
94dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    y = vertical->y();
95dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return true;
96dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
97dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
98dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochbool SVGPathSegListSource::parseCurveToCubicSegment(FloatPoint& point1, FloatPoint& point2, FloatPoint& targetPoint)
99dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
100dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ASSERT(m_segment);
101dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ASSERT(m_segment->pathSegType() == PathSegCurveToCubicAbs || m_segment->pathSegType() == PathSegCurveToCubicRel);
102dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    SVGPathSegCurvetoCubic* cubic = static_cast<SVGPathSegCurvetoCubic*>(m_segment.get());
103dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    point1 = FloatPoint(cubic->x1(), cubic->y1());
104dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    point2 = FloatPoint(cubic->x2(), cubic->y2());
105dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    targetPoint = FloatPoint(cubic->x(), cubic->y());
106dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return true;
107dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
108dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
109dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochbool SVGPathSegListSource::parseCurveToCubicSmoothSegment(FloatPoint& point2, FloatPoint& targetPoint)
110dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
111dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ASSERT(m_segment);
112dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ASSERT(m_segment->pathSegType() == PathSegCurveToCubicSmoothAbs || m_segment->pathSegType() == PathSegCurveToCubicSmoothRel);
113dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    SVGPathSegCurvetoCubicSmooth* cubicSmooth = static_cast<SVGPathSegCurvetoCubicSmooth*>(m_segment.get());
114dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    point2 = FloatPoint(cubicSmooth->x2(), cubicSmooth->y2());
115dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    targetPoint = FloatPoint(cubicSmooth->x(), cubicSmooth->y());
116dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return true;
117dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
118dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
119dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochbool SVGPathSegListSource::parseCurveToQuadraticSegment(FloatPoint& point1, FloatPoint& targetPoint)
120dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
121dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ASSERT(m_segment);
122dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ASSERT(m_segment->pathSegType() == PathSegCurveToQuadraticAbs || m_segment->pathSegType() == PathSegCurveToQuadraticRel);
123dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    SVGPathSegCurvetoQuadratic* quadratic = static_cast<SVGPathSegCurvetoQuadratic*>(m_segment.get());
124dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    point1 = FloatPoint(quadratic->x1(), quadratic->y1());
125dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    targetPoint = FloatPoint(quadratic->x(), quadratic->y());
126dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return true;
127dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
128dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
129dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochbool SVGPathSegListSource::parseCurveToQuadraticSmoothSegment(FloatPoint& targetPoint)
130dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
131dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ASSERT(m_segment);
132dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ASSERT(m_segment->pathSegType() == PathSegCurveToQuadraticSmoothAbs || m_segment->pathSegType() == PathSegCurveToQuadraticSmoothRel);
1334576aa36e9a9671459299c7963ac95aa94beaea9Shimeng (Simon) Wang    SVGPathSegSingleCoordinate* quadraticSmooth = static_cast<SVGPathSegSingleCoordinate*>(m_segment.get());
134dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    targetPoint = FloatPoint(quadraticSmooth->x(), quadraticSmooth->y());
135dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return true;
136dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
137dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
138dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdochbool SVGPathSegListSource::parseArcToSegment(float& rx, float& ry, float& angle, bool& largeArc, bool& sweep, FloatPoint& targetPoint)
139dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch{
140dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ASSERT(m_segment);
141dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ASSERT(m_segment->pathSegType() == PathSegArcAbs || m_segment->pathSegType() == PathSegArcRel);
142dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    SVGPathSegArc* arcTo = static_cast<SVGPathSegArc*>(m_segment.get());
143dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    rx = arcTo->r1();
144dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    ry = arcTo->r2();
145dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    angle = arcTo->angle();
146dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    largeArc = arcTo->largeArcFlag();
147dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    sweep = arcTo->sweepFlag();
148dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    targetPoint = FloatPoint(arcTo->x(), arcTo->y());
149dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch    return true;
150dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
151dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
152dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch}
153dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch
154dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#endif // ENABLE(SVG)
155