Index: Source/core/svg/SVGPathBlender.cpp |
diff --git a/Source/core/svg/SVGPathBlender.cpp b/Source/core/svg/SVGPathBlender.cpp |
index 9af2501581a0e748a4388d67931759b040a672cc..d2517d3f3dbde8f0b8bd712c35fc1e9d1b1e5877 100644 |
--- a/Source/core/svg/SVGPathBlender.cpp |
+++ b/Source/core/svg/SVGPathBlender.cpp |
@@ -77,17 +77,20 @@ float SVGPathBlender::blendAnimatedDimensonalFloat(float from, float to, FloatBl |
return m_toMode == AbsoluteCoordinates ? animValue + currentValue : animValue - currentValue; |
} |
-FloatPoint SVGPathBlender::blendAnimatedFloatPoint(const FloatPoint& fromPoint, const FloatPoint& toPoint) |
+FloatPoint SVGPathBlender::blendAnimatedFloatPointSameCoordinates(const FloatPoint& fromPoint, const FloatPoint& toPoint) |
{ |
if (m_addTypesCount) { |
- ASSERT(m_fromMode == m_toMode); |
FloatPoint repeatedToPoint = toPoint; |
repeatedToPoint.scale(m_addTypesCount, m_addTypesCount); |
return fromPoint + repeatedToPoint; |
} |
+ return blendFloatPoint(fromPoint, toPoint, m_progress); |
+} |
+FloatPoint SVGPathBlender::blendAnimatedFloatPoint(const FloatPoint& fromPoint, const FloatPoint& toPoint) |
+{ |
if (m_fromMode == m_toMode) |
- return blendFloatPoint(fromPoint, toPoint, m_progress); |
+ return blendAnimatedFloatPointSameCoordinates(fromPoint, toPoint); |
// Transform toPoint to the coordinate mode of fromPoint |
FloatPoint animatedPoint = toPoint; |
@@ -255,26 +258,26 @@ bool SVGPathBlender::blendArcToSegment() |
|| !m_toSource->parseArcToSegment(toRx, toRy, toAngle, toLargeArc, toSweep, toTargetPoint)) |
return false; |
+ ASSERT(!m_addTypesCount || m_fromMode == m_toMode); |
+ |
+ FloatPoint blendedRadii = blendAnimatedFloatPointSameCoordinates(FloatPoint(fromRx, fromRy), FloatPoint(toRx, toRy)); |
+ float blendedAngle = blendAnimatedFloatPointSameCoordinates(FloatPoint(fromAngle, 0), FloatPoint(toAngle, 0)).x(); |
+ bool blendedLargeArc; |
+ bool blendedSweep; |
+ |
if (m_addTypesCount) { |
- ASSERT(m_fromMode == m_toMode); |
- FloatPoint scaledToTargetPoint = toTargetPoint; |
- scaledToTargetPoint.scale(m_addTypesCount, m_addTypesCount); |
- m_consumer->arcTo(fromRx + toRx * m_addTypesCount, |
- fromRy + toRy * m_addTypesCount, |
- fromAngle + toAngle * m_addTypesCount, |
- fromLargeArc || toLargeArc, |
- fromSweep || toSweep, |
- fromTargetPoint + scaledToTargetPoint, |
- m_fromMode); |
+ blendedLargeArc = fromLargeArc || toLargeArc; |
+ blendedSweep = fromSweep || toSweep; |
} else { |
- m_consumer->arcTo(blend(fromRx, toRx, m_progress), |
- blend(fromRy, toRy, m_progress), |
- blend(fromAngle, toAngle, m_progress), |
- m_isInFirstHalfOfAnimation ? fromLargeArc : toLargeArc, |
- m_isInFirstHalfOfAnimation ? fromSweep : toSweep, |
- blendAnimatedFloatPoint(fromTargetPoint, toTargetPoint), |
- m_isInFirstHalfOfAnimation ? m_fromMode : m_toMode); |
+ blendedLargeArc = m_isInFirstHalfOfAnimation ? fromLargeArc : toLargeArc; |
+ blendedSweep = m_isInFirstHalfOfAnimation ? fromSweep : toSweep; |
} |
+ |
+ m_consumer->arcTo( |
+ blendedRadii.x(), blendedRadii.y(), blendedAngle, blendedLargeArc, blendedSweep, |
+ blendAnimatedFloatPoint(fromTargetPoint, toTargetPoint), |
+ m_isInFirstHalfOfAnimation ? m_fromMode : m_toMode); |
+ |
m_fromCurrentPoint = m_fromMode == AbsoluteCoordinates ? fromTargetPoint : m_fromCurrentPoint + fromTargetPoint; |
m_toCurrentPoint = m_toMode == AbsoluteCoordinates ? toTargetPoint : m_toCurrentPoint + toTargetPoint; |
return true; |