• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2002, 2003 The Karbon Developers
3  * Copyright (C) 2006 Alexander Kellett <lypanov@kde.org>
4  * Copyright (C) 2006, 2007 Rob Buis <buis@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 
SVGPathSegListBuilder()45 SVGPathSegListBuilder::SVGPathSegListBuilder()
46     : m_pathElement(0)
47     , m_pathSegList(0)
48     , m_pathSegRole(PathSegUndefinedRole)
49 {
50 }
51 
moveTo(const FloatPoint & targetPoint,bool,PathCoordinateMode mode)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 
lineTo(const FloatPoint & targetPoint,PathCoordinateMode mode)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 
lineToHorizontal(float x,PathCoordinateMode mode)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 
lineToVertical(float y,PathCoordinateMode mode)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 
curveToCubic(const FloatPoint & point1,const FloatPoint & point2,const FloatPoint & targetPoint,PathCoordinateMode mode)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 
curveToCubicSmooth(const FloatPoint & point2,const FloatPoint & targetPoint,PathCoordinateMode mode)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 
curveToQuadratic(const FloatPoint & point1,const FloatPoint & targetPoint,PathCoordinateMode mode)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 
curveToQuadraticSmooth(const FloatPoint & targetPoint,PathCoordinateMode mode)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 
arcTo(float r1,float r2,float angle,bool largeArcFlag,bool sweepFlag,const FloatPoint & targetPoint,PathCoordinateMode mode)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 
closePath()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