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

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

Issue 1024583002: Simplify conversion of quadratic bezier segments (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: 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 | « no previous file | no next file » | 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) 2002, 2003 The Karbon Developers 2 * Copyright (C) 2002, 2003 The Karbon Developers
3 * Copyright (C) 2006 Alexander Kellett <lypanov@kde.org> 3 * Copyright (C) 2006 Alexander Kellett <lypanov@kde.org>
4 * Copyright (C) 2006, 2007 Rob Buis <buis@kde.org> 4 * Copyright (C) 2006, 2007 Rob Buis <buis@kde.org>
5 * Copyright (C) 2007, 2009 Apple Inc. All rights reserved. 5 * Copyright (C) 2007, 2009 Apple Inc. All rights reserved.
6 * Copyright (C) Research In Motion Limited 2010. All rights reserved. 6 * Copyright (C) Research In Motion Limited 2010. All rights reserved.
7 * 7 *
8 * This library is free software; you can redistribute it and/or 8 * This library is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Library General Public 9 * modify it under the terms of the GNU Library General Public
10 * License as published by the Free Software Foundation; either 10 * License as published by the Free Software Foundation; either
(...skipping 10 matching lines...) Expand all
21 * Boston, MA 02110-1301, USA. 21 * Boston, MA 02110-1301, USA.
22 */ 22 */
23 23
24 #include "config.h" 24 #include "config.h"
25 #include "core/svg/SVGPathParser.h" 25 #include "core/svg/SVGPathParser.h"
26 26
27 #include "core/svg/SVGPathSource.h" 27 #include "core/svg/SVGPathSource.h"
28 #include "platform/transforms/AffineTransform.h" 28 #include "platform/transforms/AffineTransform.h"
29 #include "wtf/MathExtras.h" 29 #include "wtf/MathExtras.h"
30 30
31 static const float gOneOverThree = 1 / 3.f;
32
33 namespace blink { 31 namespace blink {
34 32
35 DEFINE_TRACE(SVGPathParser) 33 DEFINE_TRACE(SVGPathParser)
36 { 34 {
37 visitor->trace(m_source); 35 visitor->trace(m_source);
38 visitor->trace(m_consumer); 36 visitor->trace(m_consumer);
39 } 37 }
40 38
41 void SVGPathParser::parseClosePathSegment() 39 void SVGPathParser::parseClosePathSegment()
42 { 40 {
(...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after
171 targetPoint += m_currentPoint; 169 targetPoint += m_currentPoint;
172 } 170 }
173 171
174 m_consumer->curveToCubic(point1, point2, targetPoint, AbsoluteCoordinates); 172 m_consumer->curveToCubic(point1, point2, targetPoint, AbsoluteCoordinates);
175 173
176 m_controlPoint = point2; 174 m_controlPoint = point2;
177 m_currentPoint = targetPoint; 175 m_currentPoint = targetPoint;
178 return true; 176 return true;
179 } 177 }
180 178
179 // Blend the points with a ratio (1/3):(2/3).
180 static FloatPoint blendPoints(const FloatPoint& p1, const FloatPoint& p2)
181 {
182 const float oneOverThree = 1 / 3.f;
183 return FloatPoint((p1.x() + 2 * p2.x()) * oneOverThree, (p1.y() + 2 * p2.y() ) * oneOverThree);
184 }
185
181 bool SVGPathParser::parseCurveToQuadraticSegment() 186 bool SVGPathParser::parseCurveToQuadraticSegment()
182 { 187 {
183 FloatPoint point1; 188 FloatPoint point1;
184 FloatPoint targetPoint; 189 FloatPoint targetPoint;
185 if (!m_source->parseCurveToQuadraticSegment(point1, targetPoint)) 190 if (!m_source->parseCurveToQuadraticSegment(point1, targetPoint))
186 return false; 191 return false;
187 192
188 if (m_pathParsingMode == UnalteredParsing) { 193 if (m_pathParsingMode == UnalteredParsing) {
189 m_consumer->curveToQuadratic(point1, targetPoint, m_mode); 194 m_consumer->curveToQuadratic(point1, targetPoint, m_mode);
190 return true; 195 return true;
191 } 196 }
192 m_controlPoint = point1; 197 m_controlPoint = point1;
193 point1 = m_currentPoint; 198
194 point1.move(2 * m_controlPoint.x(), 2 * m_controlPoint.y());
195 FloatPoint point2(targetPoint.x() + 2 * m_controlPoint.x(), targetPoint.y() + 2 * m_controlPoint.y());
196 if (m_mode == RelativeCoordinates) { 199 if (m_mode == RelativeCoordinates) {
197 point1.move(2 * m_currentPoint.x(), 2 * m_currentPoint.y()); 200 m_controlPoint += m_currentPoint;
198 point2.move(3 * m_currentPoint.x(), 3 * m_currentPoint.y());
199 targetPoint += m_currentPoint; 201 targetPoint += m_currentPoint;
200 } 202 }
201 point1.scale(gOneOverThree, gOneOverThree); 203 point1 = blendPoints(m_currentPoint, m_controlPoint);
202 point2.scale(gOneOverThree, gOneOverThree); 204 FloatPoint point2 = blendPoints(targetPoint, m_controlPoint);
203 205
204 m_consumer->curveToCubic(point1, point2, targetPoint, AbsoluteCoordinates); 206 m_consumer->curveToCubic(point1, point2, targetPoint, AbsoluteCoordinates);
205 207
206 if (m_mode == RelativeCoordinates)
207 m_controlPoint += m_currentPoint;
208 m_currentPoint = targetPoint; 208 m_currentPoint = targetPoint;
209 return true; 209 return true;
210 } 210 }
211 211
212 bool SVGPathParser::parseCurveToQuadraticSmoothSegment() 212 bool SVGPathParser::parseCurveToQuadraticSmoothSegment()
213 { 213 {
214 FloatPoint targetPoint; 214 FloatPoint targetPoint;
215 if (!m_source->parseCurveToQuadraticSmoothSegment(targetPoint)) 215 if (!m_source->parseCurveToQuadraticSmoothSegment(targetPoint))
216 return false; 216 return false;
217 217
218 if (m_pathParsingMode == UnalteredParsing) { 218 if (m_pathParsingMode == UnalteredParsing) {
219 m_consumer->curveToQuadraticSmooth(targetPoint, m_mode); 219 m_consumer->curveToQuadraticSmooth(targetPoint, m_mode);
220 return true; 220 return true;
221 } 221 }
222 if (m_lastCommand != PathSegCurveToQuadraticAbs 222 if (m_lastCommand != PathSegCurveToQuadraticAbs
223 && m_lastCommand != PathSegCurveToQuadraticRel 223 && m_lastCommand != PathSegCurveToQuadraticRel
224 && m_lastCommand != PathSegCurveToQuadraticSmoothAbs 224 && m_lastCommand != PathSegCurveToQuadraticSmoothAbs
225 && m_lastCommand != PathSegCurveToQuadraticSmoothRel) 225 && m_lastCommand != PathSegCurveToQuadraticSmoothRel)
226 m_controlPoint = m_currentPoint; 226 m_controlPoint = m_currentPoint;
227 227
228 FloatPoint cubicPoint = reflectedPoint(m_currentPoint, m_controlPoint); 228 if (m_mode == RelativeCoordinates)
229 FloatPoint point1(m_currentPoint.x() + 2 * cubicPoint.x(), m_currentPoint.y( ) + 2 * cubicPoint.y());
230 FloatPoint point2(targetPoint.x() + 2 * cubicPoint.x(), targetPoint.y() + 2 * cubicPoint.y());
231 if (m_mode == RelativeCoordinates) {
232 point2 += m_currentPoint;
233 targetPoint += m_currentPoint; 229 targetPoint += m_currentPoint;
234 } 230
235 point1.scale(gOneOverThree, gOneOverThree); 231 m_controlPoint = reflectedPoint(m_currentPoint, m_controlPoint);
236 point2.scale(gOneOverThree, gOneOverThree); 232 FloatPoint point1 = blendPoints(m_currentPoint, m_controlPoint);
233 FloatPoint point2 = blendPoints(targetPoint, m_controlPoint);
237 234
238 m_consumer->curveToCubic(point1, point2, targetPoint, AbsoluteCoordinates); 235 m_consumer->curveToCubic(point1, point2, targetPoint, AbsoluteCoordinates);
239 236
240 m_controlPoint = cubicPoint;
241 m_currentPoint = targetPoint; 237 m_currentPoint = targetPoint;
242 return true; 238 return true;
243 } 239 }
244 240
245 bool SVGPathParser::parseArcToSegment() 241 bool SVGPathParser::parseArcToSegment()
246 { 242 {
247 float rx; 243 float rx;
248 float ry; 244 float ry;
249 float angle; 245 float angle;
250 bool largeArc; 246 bool largeArc;
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 point2 = targetPoint; 469 point2 = targetPoint;
474 point2.move(t * sinEndTheta, -t * cosEndTheta); 470 point2.move(t * sinEndTheta, -t * cosEndTheta);
475 471
476 m_consumer->curveToCubic(pointTransform.mapPoint(point1), pointTransform .mapPoint(point2), 472 m_consumer->curveToCubic(pointTransform.mapPoint(point1), pointTransform .mapPoint(point2),
477 pointTransform.mapPoint(targetPoint), AbsoluteC oordinates); 473 pointTransform.mapPoint(targetPoint), AbsoluteC oordinates);
478 } 474 }
479 return true; 475 return true;
480 } 476 }
481 477
482 } 478 }
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698