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 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
136 point2 += m_currentPoint; | 136 point2 += m_currentPoint; |
137 targetPoint += m_currentPoint; | 137 targetPoint += m_currentPoint; |
138 } | 138 } |
139 m_consumer->curveToCubic(point1, point2, targetPoint, AbsoluteCoordinates); | 139 m_consumer->curveToCubic(point1, point2, targetPoint, AbsoluteCoordinates); |
140 | 140 |
141 m_controlPoint = point2; | 141 m_controlPoint = point2; |
142 m_currentPoint = targetPoint; | 142 m_currentPoint = targetPoint; |
143 return true; | 143 return true; |
144 } | 144 } |
145 | 145 |
| 146 static FloatPoint reflectedPoint(const FloatPoint& reflectIn, const FloatPoint&
pointToReflect) |
| 147 { |
| 148 return FloatPoint(2 * reflectIn.x() - pointToReflect.x(), 2 * reflectIn.y()
- pointToReflect.y()); |
| 149 } |
| 150 |
146 bool SVGPathParser::parseCurveToCubicSmoothSegment() | 151 bool SVGPathParser::parseCurveToCubicSmoothSegment() |
147 { | 152 { |
148 FloatPoint point2; | 153 FloatPoint point2; |
149 FloatPoint targetPoint; | 154 FloatPoint targetPoint; |
150 if (!m_source->parseCurveToCubicSmoothSegment(point2, targetPoint)) | 155 if (!m_source->parseCurveToCubicSmoothSegment(point2, targetPoint)) |
151 return false; | 156 return false; |
152 | 157 |
153 if (m_pathParsingMode == UnalteredParsing) { | 158 if (m_pathParsingMode == UnalteredParsing) { |
154 m_consumer->curveToCubicSmooth(point2, targetPoint, m_mode); | 159 m_consumer->curveToCubicSmooth(point2, targetPoint, m_mode); |
155 return true; | 160 return true; |
156 } | 161 } |
157 if (m_lastCommand != PathSegCurveToCubicAbs | 162 if (m_lastCommand != PathSegCurveToCubicAbs |
158 && m_lastCommand != PathSegCurveToCubicRel | 163 && m_lastCommand != PathSegCurveToCubicRel |
159 && m_lastCommand != PathSegCurveToCubicSmoothAbs | 164 && m_lastCommand != PathSegCurveToCubicSmoothAbs |
160 && m_lastCommand != PathSegCurveToCubicSmoothRel) | 165 && m_lastCommand != PathSegCurveToCubicSmoothRel) |
161 m_controlPoint = m_currentPoint; | 166 m_controlPoint = m_currentPoint; |
162 | 167 |
163 FloatPoint point1 = m_currentPoint; | 168 FloatPoint point1 = reflectedPoint(m_currentPoint, m_controlPoint); |
164 point1.scale(2, 2); | |
165 point1.move(-m_controlPoint.x(), -m_controlPoint.y()); | |
166 if (m_mode == RelativeCoordinates) { | 169 if (m_mode == RelativeCoordinates) { |
167 point2 += m_currentPoint; | 170 point2 += m_currentPoint; |
168 targetPoint += m_currentPoint; | 171 targetPoint += m_currentPoint; |
169 } | 172 } |
170 | 173 |
171 m_consumer->curveToCubic(point1, point2, targetPoint, AbsoluteCoordinates); | 174 m_consumer->curveToCubic(point1, point2, targetPoint, AbsoluteCoordinates); |
172 | 175 |
173 m_controlPoint = point2; | 176 m_controlPoint = point2; |
174 m_currentPoint = targetPoint; | 177 m_currentPoint = targetPoint; |
175 return true; | 178 return true; |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
215 if (m_pathParsingMode == UnalteredParsing) { | 218 if (m_pathParsingMode == UnalteredParsing) { |
216 m_consumer->curveToQuadraticSmooth(targetPoint, m_mode); | 219 m_consumer->curveToQuadraticSmooth(targetPoint, m_mode); |
217 return true; | 220 return true; |
218 } | 221 } |
219 if (m_lastCommand != PathSegCurveToQuadraticAbs | 222 if (m_lastCommand != PathSegCurveToQuadraticAbs |
220 && m_lastCommand != PathSegCurveToQuadraticRel | 223 && m_lastCommand != PathSegCurveToQuadraticRel |
221 && m_lastCommand != PathSegCurveToQuadraticSmoothAbs | 224 && m_lastCommand != PathSegCurveToQuadraticSmoothAbs |
222 && m_lastCommand != PathSegCurveToQuadraticSmoothRel) | 225 && m_lastCommand != PathSegCurveToQuadraticSmoothRel) |
223 m_controlPoint = m_currentPoint; | 226 m_controlPoint = m_currentPoint; |
224 | 227 |
225 FloatPoint cubicPoint = m_currentPoint; | 228 FloatPoint cubicPoint = reflectedPoint(m_currentPoint, m_controlPoint); |
226 cubicPoint.scale(2, 2); | |
227 cubicPoint.move(-m_controlPoint.x(), -m_controlPoint.y()); | |
228 FloatPoint point1(m_currentPoint.x() + 2 * cubicPoint.x(), m_currentPoint.y(
) + 2 * cubicPoint.y()); | 229 FloatPoint point1(m_currentPoint.x() + 2 * cubicPoint.x(), m_currentPoint.y(
) + 2 * cubicPoint.y()); |
229 FloatPoint point2(targetPoint.x() + 2 * cubicPoint.x(), targetPoint.y() + 2
* cubicPoint.y()); | 230 FloatPoint point2(targetPoint.x() + 2 * cubicPoint.x(), targetPoint.y() + 2
* cubicPoint.y()); |
230 if (m_mode == RelativeCoordinates) { | 231 if (m_mode == RelativeCoordinates) { |
231 point2 += m_currentPoint; | 232 point2 += m_currentPoint; |
232 targetPoint += m_currentPoint; | 233 targetPoint += m_currentPoint; |
233 } | 234 } |
234 point1.scale(gOneOverThree, gOneOverThree); | 235 point1.scale(gOneOverThree, gOneOverThree); |
235 point2.scale(gOneOverThree, gOneOverThree); | 236 point2.scale(gOneOverThree, gOneOverThree); |
236 | 237 |
237 m_consumer->curveToCubic(point1, point2, targetPoint, AbsoluteCoordinates); | 238 m_consumer->curveToCubic(point1, point2, targetPoint, AbsoluteCoordinates); |
(...skipping 234 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
472 point2 = targetPoint; | 473 point2 = targetPoint; |
473 point2.move(t * sinEndTheta, -t * cosEndTheta); | 474 point2.move(t * sinEndTheta, -t * cosEndTheta); |
474 | 475 |
475 m_consumer->curveToCubic(pointTransform.mapPoint(point1), pointTransform
.mapPoint(point2), | 476 m_consumer->curveToCubic(pointTransform.mapPoint(point1), pointTransform
.mapPoint(point2), |
476 pointTransform.mapPoint(targetPoint), AbsoluteC
oordinates); | 477 pointTransform.mapPoint(targetPoint), AbsoluteC
oordinates); |
477 } | 478 } |
478 return true; | 479 return true; |
479 } | 480 } |
480 | 481 |
481 } | 482 } |
OLD | NEW |