Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(447)

Side by Side Diff: Source/core/svg/SVGPathSegListSource.cpp

Issue 1023993002: Rework the SVGPathSource interface (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Blender fixups. Created 5 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « Source/core/svg/SVGPathSegListSource.h ('k') | Source/core/svg/SVGPathSource.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) Research In Motion Limited 2010. All rights reserved. 2 * Copyright (C) Research In Motion Limited 2010. All rights reserved.
3 * 3 *
4 * This library is free software; you can redistribute it and/or 4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Library General Public 5 * modify it under the terms of the GNU Library General Public
6 * License as published by the Free Software Foundation; either 6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version. 7 * version 2 of the License, or (at your option) any later version.
8 * 8 *
9 * This library is distributed in the hope that it will be useful, 9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Library General Public License for more details. 12 * Library General Public License for more details.
13 * 13 *
14 * You should have received a copy of the GNU Library General Public License 14 * You should have received a copy of the GNU Library General Public License
15 * along with this library; see the file COPYING.LIB. If not, write to 15 * along with this library; see the file COPYING.LIB. If not, write to
16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 16 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 * Boston, MA 02110-1301, USA. 17 * Boston, MA 02110-1301, USA.
18 */ 18 */
19 19
20 #include "config.h" 20 #include "config.h"
21
22 #include "core/svg/SVGPathSegListSource.h" 21 #include "core/svg/SVGPathSegListSource.h"
23 22
24 #include "core/svg/SVGPathElement.h" 23 #include "core/svg/SVGPathElement.h"
25 #include "core/svg/SVGPathSegArc.h" 24 #include "core/svg/SVGPathSegArc.h"
26 #include "core/svg/SVGPathSegCurvetoCubic.h" 25 #include "core/svg/SVGPathSegCurvetoCubic.h"
27 #include "core/svg/SVGPathSegCurvetoCubicSmooth.h" 26 #include "core/svg/SVGPathSegCurvetoCubicSmooth.h"
28 #include "core/svg/SVGPathSegCurvetoQuadratic.h" 27 #include "core/svg/SVGPathSegCurvetoQuadratic.h"
29 #include "core/svg/SVGPathSegLinetoHorizontal.h" 28 #include "core/svg/SVGPathSegLinetoHorizontal.h"
30 #include "core/svg/SVGPathSegLinetoVertical.h" 29 #include "core/svg/SVGPathSegLinetoVertical.h"
31 30
32 namespace blink { 31 namespace blink {
33 32
34 SVGPathSegListSource::SVGPathSegListSource(SVGPathSegList::ConstIterator itBegin , SVGPathSegList::ConstIterator itEnd) 33 SVGPathSegListSource::SVGPathSegListSource(SVGPathSegList::ConstIterator itBegin , SVGPathSegList::ConstIterator itEnd)
35 : m_itCurrent(itBegin) 34 : m_itCurrent(itBegin)
36 , m_itEnd(itEnd) 35 , m_itEnd(itEnd)
37 { 36 {
38 } 37 }
39 38
40 DEFINE_TRACE(SVGPathSegListSource)
41 {
42 visitor->trace(m_segment);
43 SVGPathSource::trace(visitor);
44 }
45
46 bool SVGPathSegListSource::hasMoreData() const 39 bool SVGPathSegListSource::hasMoreData() const
47 { 40 {
48 return m_itCurrent != m_itEnd; 41 return m_itCurrent != m_itEnd;
49 } 42 }
50 43
51 bool SVGPathSegListSource::parseSVGSegmentType(SVGPathSegType& pathSegType) 44 SVGPathSegType SVGPathSegListSource::peekSegmentType()
52 { 45 {
53 m_segment = *m_itCurrent; 46 ASSERT(hasMoreData());
54 pathSegType = static_cast<SVGPathSegType>(m_segment->pathSegType()); 47 return static_cast<SVGPathSegType>(m_itCurrent->pathSegType());
55 ++m_itCurrent;
56 return true;
57 } 48 }
58 49
59 SVGPathSegType SVGPathSegListSource::nextCommand(SVGPathSegType) 50 PathSegmentData SVGPathSegListSource::parseSegment()
60 { 51 {
61 m_segment = *m_itCurrent; 52 ASSERT(hasMoreData());
62 SVGPathSegType pathSegType = static_cast<SVGPathSegType>(m_segment->pathSegT ype()); 53 PathSegmentData segment;
54 RefPtrWillBeRawPtr<SVGPathSeg> pathSegment = *m_itCurrent;
55 segment.command = static_cast<SVGPathSegType>(pathSegment->pathSegType());
63 ++m_itCurrent; 56 ++m_itCurrent;
64 return pathSegType;
65 }
66 57
67 bool SVGPathSegListSource::parseMoveToSegment(FloatPoint& targetPoint) 58 switch (segment.command) {
68 { 59 case PathSegMoveToRel:
69 ASSERT(m_segment); 60 case PathSegMoveToAbs:
70 ASSERT(m_segment->pathSegType() == PathSegMoveToAbs || m_segment->pathSegTyp e() == PathSegMoveToRel); 61 case PathSegLineToRel:
71 SVGPathSegSingleCoordinate* moveTo = static_cast<SVGPathSegSingleCoordinate* >(m_segment.get()); 62 case PathSegLineToAbs:
72 targetPoint = FloatPoint(moveTo->x(), moveTo->y()); 63 case PathSegCurveToQuadraticSmoothRel:
73 return true; 64 case PathSegCurveToQuadraticSmoothAbs: {
74 } 65 SVGPathSegSingleCoordinate* singleCoordinate = static_cast<SVGPathSegSin gleCoordinate*>(pathSegment.get());
75 66 segment.targetPoint = FloatPoint(singleCoordinate->x(), singleCoordinate ->y());
76 bool SVGPathSegListSource::parseLineToSegment(FloatPoint& targetPoint) 67 break;
77 { 68 }
78 ASSERT(m_segment); 69 case PathSegLineToHorizontalRel:
79 ASSERT(m_segment->pathSegType() == PathSegLineToAbs || m_segment->pathSegTyp e() == PathSegLineToRel); 70 case PathSegLineToHorizontalAbs: {
80 SVGPathSegSingleCoordinate* lineTo = static_cast<SVGPathSegSingleCoordinate* >(m_segment.get()); 71 SVGPathSegLinetoHorizontal* horizontal = static_cast<SVGPathSegLinetoHor izontal*>(pathSegment.get());
81 targetPoint = FloatPoint(lineTo->x(), lineTo->y()); 72 segment.targetPoint.setX(horizontal->x());
82 return true; 73 break;
83 } 74 }
84 75 case PathSegLineToVerticalRel:
85 bool SVGPathSegListSource::parseLineToHorizontalSegment(float& x) 76 case PathSegLineToVerticalAbs: {
86 { 77 SVGPathSegLinetoVertical* vertical = static_cast<SVGPathSegLinetoVertica l*>(pathSegment.get());
87 ASSERT(m_segment); 78 segment.targetPoint.setY(vertical->y());
88 ASSERT(m_segment->pathSegType() == PathSegLineToHorizontalAbs || m_segment-> pathSegType() == PathSegLineToHorizontalRel); 79 break;
89 SVGPathSegLinetoHorizontal* horizontal = static_cast<SVGPathSegLinetoHorizon tal*>(m_segment.get()); 80 }
90 x = horizontal->x(); 81 case PathSegClosePath:
91 return true; 82 break;
92 } 83 case PathSegCurveToCubicRel:
93 84 case PathSegCurveToCubicAbs: {
94 bool SVGPathSegListSource::parseLineToVerticalSegment(float& y) 85 SVGPathSegCurvetoCubic* cubic = static_cast<SVGPathSegCurvetoCubic*>(pat hSegment.get());
95 { 86 segment.point1 = FloatPoint(cubic->x1(), cubic->y1());
96 ASSERT(m_segment); 87 segment.point2 = FloatPoint(cubic->x2(), cubic->y2());
97 ASSERT(m_segment->pathSegType() == PathSegLineToVerticalAbs || m_segment->pa thSegType() == PathSegLineToVerticalRel); 88 segment.targetPoint = FloatPoint(cubic->x(), cubic->y());
98 SVGPathSegLinetoVertical* vertical = static_cast<SVGPathSegLinetoVertical*>( m_segment.get()); 89 break;
99 y = vertical->y(); 90 }
100 return true; 91 case PathSegCurveToCubicSmoothRel:
101 } 92 case PathSegCurveToCubicSmoothAbs: {
102 93 SVGPathSegCurvetoCubicSmooth* cubicSmooth = static_cast<SVGPathSegCurvet oCubicSmooth*>(pathSegment.get());
103 bool SVGPathSegListSource::parseCurveToCubicSegment(FloatPoint& point1, FloatPoi nt& point2, FloatPoint& targetPoint) 94 segment.point2 = FloatPoint(cubicSmooth->x2(), cubicSmooth->y2());
104 { 95 segment.targetPoint = FloatPoint(cubicSmooth->x(), cubicSmooth->y());
105 ASSERT(m_segment); 96 break;
106 ASSERT(m_segment->pathSegType() == PathSegCurveToCubicAbs || m_segment->path SegType() == PathSegCurveToCubicRel); 97 }
107 SVGPathSegCurvetoCubic* cubic = static_cast<SVGPathSegCurvetoCubic*>(m_segme nt.get()); 98 case PathSegCurveToQuadraticRel:
108 point1 = FloatPoint(cubic->x1(), cubic->y1()); 99 case PathSegCurveToQuadraticAbs: {
109 point2 = FloatPoint(cubic->x2(), cubic->y2()); 100 SVGPathSegCurvetoQuadratic* quadratic = static_cast<SVGPathSegCurvetoQua dratic*>(pathSegment.get());
110 targetPoint = FloatPoint(cubic->x(), cubic->y()); 101 segment.point1 = FloatPoint(quadratic->x1(), quadratic->y1());
111 return true; 102 segment.targetPoint = FloatPoint(quadratic->x(), quadratic->y());
112 } 103 break;
113 104 }
114 bool SVGPathSegListSource::parseCurveToCubicSmoothSegment(FloatPoint& point2, Fl oatPoint& targetPoint) 105 case PathSegArcRel:
115 { 106 case PathSegArcAbs: {
116 ASSERT(m_segment); 107 SVGPathSegArc* arcTo = static_cast<SVGPathSegArc*>(pathSegment.get());
117 ASSERT(m_segment->pathSegType() == PathSegCurveToCubicSmoothAbs || m_segment ->pathSegType() == PathSegCurveToCubicSmoothRel); 108 segment.point1 = FloatPoint(arcTo->r1(), arcTo->r2());
118 SVGPathSegCurvetoCubicSmooth* cubicSmooth = static_cast<SVGPathSegCurvetoCub icSmooth*>(m_segment.get()); 109 segment.point2.setX(arcTo->angle());
119 point2 = FloatPoint(cubicSmooth->x2(), cubicSmooth->y2()); 110 segment.arcLarge = arcTo->largeArcFlag();
120 targetPoint = FloatPoint(cubicSmooth->x(), cubicSmooth->y()); 111 segment.arcSweep = arcTo->sweepFlag();
121 return true; 112 segment.targetPoint = FloatPoint(arcTo->x(), arcTo->y());
122 } 113 break;
123 114 }
124 bool SVGPathSegListSource::parseCurveToQuadraticSegment(FloatPoint& point1, Floa tPoint& targetPoint) 115 default:
125 { 116 ASSERT_NOT_REACHED();
126 ASSERT(m_segment); 117 }
127 ASSERT(m_segment->pathSegType() == PathSegCurveToQuadraticAbs || m_segment-> pathSegType() == PathSegCurveToQuadraticRel); 118 return segment;
128 SVGPathSegCurvetoQuadratic* quadratic = static_cast<SVGPathSegCurvetoQuadrat ic*>(m_segment.get());
129 point1 = FloatPoint(quadratic->x1(), quadratic->y1());
130 targetPoint = FloatPoint(quadratic->x(), quadratic->y());
131 return true;
132 }
133
134 bool SVGPathSegListSource::parseCurveToQuadraticSmoothSegment(FloatPoint& target Point)
135 {
136 ASSERT(m_segment);
137 ASSERT(m_segment->pathSegType() == PathSegCurveToQuadraticSmoothAbs || m_seg ment->pathSegType() == PathSegCurveToQuadraticSmoothRel);
138 SVGPathSegSingleCoordinate* quadraticSmooth = static_cast<SVGPathSegSingleCo ordinate*>(m_segment.get());
139 targetPoint = FloatPoint(quadraticSmooth->x(), quadraticSmooth->y());
140 return true;
141 }
142
143 bool SVGPathSegListSource::parseArcToSegment(float& rx, float& ry, float& angle, bool& largeArc, bool& sweep, FloatPoint& targetPoint)
144 {
145 ASSERT(m_segment);
146 ASSERT(m_segment->pathSegType() == PathSegArcAbs || m_segment->pathSegType() == PathSegArcRel);
147 SVGPathSegArc* arcTo = static_cast<SVGPathSegArc*>(m_segment.get());
148 rx = arcTo->r1();
149 ry = arcTo->r2();
150 angle = arcTo->angle();
151 largeArc = arcTo->largeArcFlag();
152 sweep = arcTo->sweepFlag();
153 targetPoint = FloatPoint(arcTo->x(), arcTo->y());
154 return true;
155 } 119 }
156 120
157 } 121 }
OLDNEW
« no previous file with comments | « Source/core/svg/SVGPathSegListSource.h ('k') | Source/core/svg/SVGPathSource.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698