OLD | NEW |
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 239 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
250 m_consumer->arcTo(rx, ry, angle, largeArc, sweep, targetPoint, m_mode); | 250 m_consumer->arcTo(rx, ry, angle, largeArc, sweep, targetPoint, m_mode); |
251 return true; | 251 return true; |
252 } | 252 } |
253 | 253 |
254 // If rx = 0 or ry = 0 then this arc is treated as a straight line segment (
a "lineto") joining the endpoints. | 254 // If rx = 0 or ry = 0 then this arc is treated as a straight line segment (
a "lineto") joining the endpoints. |
255 // http://www.w3.org/TR/SVG/implnote.html#ArcOutOfRangeParameters | 255 // http://www.w3.org/TR/SVG/implnote.html#ArcOutOfRangeParameters |
256 // If the current point and target point for the arc are identical, it shoul
d be treated as a zero length | 256 // If the current point and target point for the arc are identical, it shoul
d be treated as a zero length |
257 // path. This ensures continuity in animations. | 257 // path. This ensures continuity in animations. |
258 rx = fabsf(rx); | 258 rx = fabsf(rx); |
259 ry = fabsf(ry); | 259 ry = fabsf(ry); |
260 bool arcIsZeroLength = false; | 260 |
261 if (m_mode == RelativeCoordinates) | 261 if (m_mode == RelativeCoordinates) |
262 arcIsZeroLength = targetPoint == FloatPoint::zero(); | 262 targetPoint += m_currentPoint; |
263 else | 263 |
264 arcIsZeroLength = targetPoint == m_currentPoint; | 264 if (!rx || !ry || targetPoint == m_currentPoint) { |
265 if (!rx || !ry || arcIsZeroLength) { | 265 m_consumer->lineTo(targetPoint, AbsoluteCoordinates); |
266 if (m_mode == RelativeCoordinates) | 266 m_currentPoint = targetPoint; |
267 m_currentPoint += targetPoint; | |
268 else | |
269 m_currentPoint = targetPoint; | |
270 m_consumer->lineTo(m_currentPoint, AbsoluteCoordinates); | |
271 return true; | 267 return true; |
272 } | 268 } |
273 | 269 |
274 FloatPoint point1 = m_currentPoint; | 270 FloatPoint point1 = m_currentPoint; |
275 if (m_mode == RelativeCoordinates) | |
276 targetPoint += m_currentPoint; | |
277 m_currentPoint = targetPoint; | 271 m_currentPoint = targetPoint; |
278 return decomposeArcToCubic(angle, rx, ry, point1, targetPoint, largeArc, swe
ep); | 272 return decomposeArcToCubic(angle, rx, ry, point1, targetPoint, largeArc, swe
ep); |
279 } | 273 } |
280 | 274 |
281 bool SVGPathParser::parsePathDataFromSource(PathParsingMode pathParsingMode, boo
l checkForInitialMoveTo) | 275 bool SVGPathParser::parsePathDataFromSource(PathParsingMode pathParsingMode, boo
l checkForInitialMoveTo) |
282 { | 276 { |
283 ASSERT(m_source); | 277 ASSERT(m_source); |
284 ASSERT(m_consumer); | 278 ASSERT(m_consumer); |
285 | 279 |
286 m_pathParsingMode = pathParsingMode; | 280 m_pathParsingMode = pathParsingMode; |
(...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
473 point2 = targetPoint; | 467 point2 = targetPoint; |
474 point2.move(t * sinEndTheta, -t * cosEndTheta); | 468 point2.move(t * sinEndTheta, -t * cosEndTheta); |
475 | 469 |
476 m_consumer->curveToCubic(pointTransform.mapPoint(point1), pointTransform
.mapPoint(point2), | 470 m_consumer->curveToCubic(pointTransform.mapPoint(point1), pointTransform
.mapPoint(point2), |
477 pointTransform.mapPoint(targetPoint), AbsoluteC
oordinates); | 471 pointTransform.mapPoint(targetPoint), AbsoluteC
oordinates); |
478 } | 472 } |
479 return true; | 473 return true; |
480 } | 474 } |
481 | 475 |
482 } | 476 } |
OLD | NEW |