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