1 /* 2 * Copyright (C) 2002, 2003 The Karbon Developers 3 * Copyright (C) 2006 Alexander Kellett <lypanov (at) kde.org> 4 * Copyright (C) 2006, 2007 Rob Buis <buis (at) kde.org> 5 * Copyright (C) 2007, 2009 Apple Inc. All rights reserved. 6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. 7 * 8 * This library is free software; you can redistribute it and/or 9 * modify it under the terms of the GNU Library General Public 10 * License as published by the Free Software Foundation; either 11 * version 2 of the License, or (at your option) any later version. 12 * 13 * This library is distributed in the hope that it will be useful, 14 * but WITHOUT ANY WARRANTY; without even the implied warranty of 15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 16 * Library General Public License for more details. 17 * 18 * You should have received a copy of the GNU Library General Public License 19 * along with this library; see the file COPYING.LIB. If not, write to 20 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 21 * Boston, MA 02110-1301, USA. 22 */ 23 24 #include "config.h" 25 26 #if ENABLE(SVG) 27 #include "SVGPathSegListBuilder.h" 28 29 #include "ExceptionCode.h" 30 #include "SVGPathElement.h" 31 #include "SVGPathSegArc.h" 32 #include "SVGPathSegClosePath.h" 33 #include "SVGPathSegCurvetoCubic.h" 34 #include "SVGPathSegCurvetoCubicSmooth.h" 35 #include "SVGPathSegCurvetoQuadratic.h" 36 #include "SVGPathSegCurvetoQuadraticSmooth.h" 37 #include "SVGPathSegLineto.h" 38 #include "SVGPathSegLinetoHorizontal.h" 39 #include "SVGPathSegLinetoVertical.h" 40 #include "SVGPathSegList.h" 41 #include "SVGPathSegMoveto.h" 42 43 namespace WebCore { 44 45 SVGPathSegListBuilder::SVGPathSegListBuilder() 46 : m_pathElement(0) 47 , m_pathSegList(0) 48 , m_pathSegRole(PathSegUndefinedRole) 49 { 50 } 51 52 void SVGPathSegListBuilder::moveTo(const FloatPoint& targetPoint, bool, PathCoordinateMode mode) 53 { 54 ASSERT(m_pathElement); 55 ASSERT(m_pathSegList); 56 if (mode == AbsoluteCoordinates) 57 m_pathSegList->append(m_pathElement->createSVGPathSegMovetoAbs(targetPoint.x(), targetPoint.y(), m_pathSegRole)); 58 else 59 m_pathSegList->append(m_pathElement->createSVGPathSegMovetoRel(targetPoint.x(), targetPoint.y(), m_pathSegRole)); 60 } 61 62 void SVGPathSegListBuilder::lineTo(const FloatPoint& targetPoint, PathCoordinateMode mode) 63 { 64 ASSERT(m_pathElement); 65 ASSERT(m_pathSegList); 66 if (mode == AbsoluteCoordinates) 67 m_pathSegList->append(m_pathElement->createSVGPathSegLinetoAbs(targetPoint.x(), targetPoint.y(), m_pathSegRole)); 68 else 69 m_pathSegList->append(m_pathElement->createSVGPathSegLinetoRel(targetPoint.x(), targetPoint.y(), m_pathSegRole)); 70 } 71 72 void SVGPathSegListBuilder::lineToHorizontal(float x, PathCoordinateMode mode) 73 { 74 ASSERT(m_pathElement); 75 ASSERT(m_pathSegList); 76 if (mode == AbsoluteCoordinates) 77 m_pathSegList->append(m_pathElement->createSVGPathSegLinetoHorizontalAbs(x, m_pathSegRole)); 78 else 79 m_pathSegList->append(m_pathElement->createSVGPathSegLinetoHorizontalRel(x, m_pathSegRole)); 80 } 81 82 void SVGPathSegListBuilder::lineToVertical(float y, PathCoordinateMode mode) 83 { 84 ASSERT(m_pathElement); 85 ASSERT(m_pathSegList); 86 if (mode == AbsoluteCoordinates) 87 m_pathSegList->append(m_pathElement->createSVGPathSegLinetoVerticalAbs(y, m_pathSegRole)); 88 else 89 m_pathSegList->append(m_pathElement->createSVGPathSegLinetoVerticalRel(y, m_pathSegRole)); 90 } 91 92 void SVGPathSegListBuilder::curveToCubic(const FloatPoint& point1, const FloatPoint& point2, const FloatPoint& targetPoint, PathCoordinateMode mode) 93 { 94 ASSERT(m_pathElement); 95 ASSERT(m_pathSegList); 96 if (mode == AbsoluteCoordinates) 97 m_pathSegList->append(m_pathElement->createSVGPathSegCurvetoCubicAbs(targetPoint.x(), targetPoint.y(), point1.x(), point1.y(), point2.x(), point2.y(), m_pathSegRole)); 98 else 99 m_pathSegList->append(m_pathElement->createSVGPathSegCurvetoCubicRel(targetPoint.x(), targetPoint.y(), point1.x(), point1.y(), point2.x(), point2.y(), m_pathSegRole)); 100 } 101 102 void SVGPathSegListBuilder::curveToCubicSmooth(const FloatPoint& point2, const FloatPoint& targetPoint, PathCoordinateMode mode) 103 { 104 ASSERT(m_pathElement); 105 ASSERT(m_pathSegList); 106 if (mode == AbsoluteCoordinates) 107 m_pathSegList->append(m_pathElement->createSVGPathSegCurvetoCubicSmoothAbs(targetPoint.x(), targetPoint.y(), point2.x(), point2.y(), m_pathSegRole)); 108 else 109 m_pathSegList->append(m_pathElement->createSVGPathSegCurvetoCubicSmoothRel(targetPoint.x(), targetPoint.y(), point2.x(), point2.y(), m_pathSegRole)); 110 } 111 112 void SVGPathSegListBuilder::curveToQuadratic(const FloatPoint& point1, const FloatPoint& targetPoint, PathCoordinateMode mode) 113 { 114 ASSERT(m_pathElement); 115 ASSERT(m_pathSegList); 116 if (mode == AbsoluteCoordinates) 117 m_pathSegList->append(m_pathElement->createSVGPathSegCurvetoQuadraticAbs(targetPoint.x(), targetPoint.y(), point1.x(), point1.y(), m_pathSegRole)); 118 else 119 m_pathSegList->append(m_pathElement->createSVGPathSegCurvetoQuadraticRel(targetPoint.x(), targetPoint.y(), point1.x(), point1.y(), m_pathSegRole)); 120 } 121 122 void SVGPathSegListBuilder::curveToQuadraticSmooth(const FloatPoint& targetPoint, PathCoordinateMode mode) 123 { 124 ASSERT(m_pathElement); 125 ASSERT(m_pathSegList); 126 if (mode == AbsoluteCoordinates) 127 m_pathSegList->append(m_pathElement->createSVGPathSegCurvetoQuadraticSmoothAbs(targetPoint.x(), targetPoint.y(), m_pathSegRole)); 128 else 129 m_pathSegList->append(m_pathElement->createSVGPathSegCurvetoQuadraticSmoothRel(targetPoint.x(), targetPoint.y(), m_pathSegRole)); 130 } 131 132 void SVGPathSegListBuilder::arcTo(float r1, float r2, float angle, bool largeArcFlag, bool sweepFlag, const FloatPoint& targetPoint, PathCoordinateMode mode) 133 { 134 ASSERT(m_pathElement); 135 ASSERT(m_pathSegList); 136 if (mode == AbsoluteCoordinates) 137 m_pathSegList->append(m_pathElement->createSVGPathSegArcAbs(targetPoint.x(), targetPoint.y(), r1, r2, angle, largeArcFlag, sweepFlag, m_pathSegRole)); 138 else 139 m_pathSegList->append(m_pathElement->createSVGPathSegArcRel(targetPoint.x(), targetPoint.y(), r1, r2, angle, largeArcFlag, sweepFlag, m_pathSegRole)); 140 } 141 142 void SVGPathSegListBuilder::closePath() 143 { 144 ASSERT(m_pathElement); 145 ASSERT(m_pathSegList); 146 m_pathSegList->append(m_pathElement->createSVGPathSegClosePath(m_pathSegRole)); 147 } 148 149 } 150 151 #endif // ENABLE(SVG) 152