Index: Source/core/svg/SVGPathBlender.cpp |
diff --git a/Source/core/svg/SVGPathBlender.cpp b/Source/core/svg/SVGPathBlender.cpp |
index 0ad27f1e72062a9e3e2b6128a20ef761d01ea60c..64a9374cfdfc6178487592df5b36b170600068f1 100644 |
--- a/Source/core/svg/SVGPathBlender.cpp |
+++ b/Source/core/svg/SVGPathBlender.cpp |
@@ -113,174 +113,101 @@ FloatPoint SVGPathBlender::blendAnimatedFloatPoint(const FloatPoint& fromPoint, |
return animatedPoint; |
} |
-bool SVGPathBlender::blendMoveToSegment() |
+void SVGPathBlender::blendMoveToSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg) |
{ |
- FloatPoint fromTargetPoint; |
- FloatPoint toTargetPoint; |
- if ((m_fromSource->hasMoreData() && !m_fromSource->parseMoveToSegment(fromTargetPoint)) |
- || !m_toSource->parseMoveToSegment(toTargetPoint)) |
- return false; |
- |
- m_consumer->moveTo(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; |
+ m_consumer->moveTo(blendAnimatedFloatPoint(fromSeg.targetPoint, toSeg.targetPoint), m_isInFirstHalfOfAnimation ? m_fromMode : m_toMode); |
+ m_fromCurrentPoint = m_fromMode == AbsoluteCoordinates ? fromSeg.targetPoint : m_fromCurrentPoint + fromSeg.targetPoint; |
+ m_toCurrentPoint = m_toMode == AbsoluteCoordinates ? toSeg.targetPoint : m_toCurrentPoint + toSeg.targetPoint; |
} |
-bool SVGPathBlender::blendLineToSegment() |
+void SVGPathBlender::blendLineToSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg) |
{ |
- FloatPoint fromTargetPoint; |
- FloatPoint toTargetPoint; |
- if ((m_fromSource->hasMoreData() && !m_fromSource->parseLineToSegment(fromTargetPoint)) |
- || !m_toSource->parseLineToSegment(toTargetPoint)) |
- return false; |
- |
- m_consumer->lineTo(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; |
+ m_consumer->lineTo(blendAnimatedFloatPoint(fromSeg.targetPoint, toSeg.targetPoint), m_isInFirstHalfOfAnimation ? m_fromMode : m_toMode); |
+ m_fromCurrentPoint = m_fromMode == AbsoluteCoordinates ? fromSeg.targetPoint : m_fromCurrentPoint + fromSeg.targetPoint; |
+ m_toCurrentPoint = m_toMode == AbsoluteCoordinates ? toSeg.targetPoint : m_toCurrentPoint + toSeg.targetPoint; |
} |
-bool SVGPathBlender::blendLineToHorizontalSegment() |
+void SVGPathBlender::blendLineToHorizontalSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg) |
{ |
- float fromX = 0; |
- float toX = 0; |
- if ((m_fromSource->hasMoreData() && !m_fromSource->parseLineToHorizontalSegment(fromX)) |
- || !m_toSource->parseLineToHorizontalSegment(toX)) |
- return false; |
- |
+ float fromX = fromSeg.targetPoint.x(); |
+ float toX = toSeg.targetPoint.x(); |
m_consumer->lineToHorizontal(blendAnimatedDimensonalFloat(fromX, toX, BlendHorizontal), m_isInFirstHalfOfAnimation ? m_fromMode : m_toMode); |
m_fromCurrentPoint.setX(m_fromMode == AbsoluteCoordinates ? fromX : m_fromCurrentPoint.x() + fromX); |
m_toCurrentPoint.setX(m_toMode == AbsoluteCoordinates ? toX : m_toCurrentPoint.x() + toX); |
- return true; |
} |
-bool SVGPathBlender::blendLineToVerticalSegment() |
+void SVGPathBlender::blendLineToVerticalSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg) |
{ |
- float fromY = 0; |
- float toY = 0; |
- if ((m_fromSource->hasMoreData() && !m_fromSource->parseLineToVerticalSegment(fromY)) |
- || !m_toSource->parseLineToVerticalSegment(toY)) |
- return false; |
- |
+ float fromY = fromSeg.targetPoint.y(); |
+ float toY = toSeg.targetPoint.y(); |
m_consumer->lineToVertical(blendAnimatedDimensonalFloat(fromY, toY, BlendVertical), m_isInFirstHalfOfAnimation ? m_fromMode : m_toMode); |
m_fromCurrentPoint.setY(m_fromMode == AbsoluteCoordinates ? fromY : m_fromCurrentPoint.y() + fromY); |
m_toCurrentPoint.setY(m_toMode == AbsoluteCoordinates ? toY : m_toCurrentPoint.y() + toY); |
- return true; |
} |
-bool SVGPathBlender::blendCurveToCubicSegment() |
+void SVGPathBlender::blendCurveToCubicSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg) |
{ |
- FloatPoint fromTargetPoint; |
- FloatPoint fromPoint1; |
- FloatPoint fromPoint2; |
- FloatPoint toTargetPoint; |
- FloatPoint toPoint1; |
- FloatPoint toPoint2; |
- if ((m_fromSource->hasMoreData() && !m_fromSource->parseCurveToCubicSegment(fromPoint1, fromPoint2, fromTargetPoint)) |
- || !m_toSource->parseCurveToCubicSegment(toPoint1, toPoint2, toTargetPoint)) |
- return false; |
- |
- m_consumer->curveToCubic(blendAnimatedFloatPoint(fromPoint1, toPoint1), |
- blendAnimatedFloatPoint(fromPoint2, toPoint2), |
- 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; |
+ m_consumer->curveToCubic( |
+ blendAnimatedFloatPoint(fromSeg.point1, toSeg.point1), |
+ blendAnimatedFloatPoint(fromSeg.point2, toSeg.point2), |
+ blendAnimatedFloatPoint(fromSeg.targetPoint, toSeg.targetPoint), |
+ m_isInFirstHalfOfAnimation ? m_fromMode : m_toMode); |
+ m_fromCurrentPoint = m_fromMode == AbsoluteCoordinates ? fromSeg.targetPoint : m_fromCurrentPoint + fromSeg.targetPoint; |
+ m_toCurrentPoint = m_toMode == AbsoluteCoordinates ? toSeg.targetPoint : m_toCurrentPoint + toSeg.targetPoint; |
} |
-bool SVGPathBlender::blendCurveToCubicSmoothSegment() |
+void SVGPathBlender::blendCurveToCubicSmoothSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg) |
{ |
- FloatPoint fromTargetPoint; |
- FloatPoint fromPoint2; |
- FloatPoint toTargetPoint; |
- FloatPoint toPoint2; |
- if ((m_fromSource->hasMoreData() && !m_fromSource->parseCurveToCubicSmoothSegment(fromPoint2, fromTargetPoint)) |
- || !m_toSource->parseCurveToCubicSmoothSegment(toPoint2, toTargetPoint)) |
- return false; |
- |
- m_consumer->curveToCubicSmooth(blendAnimatedFloatPoint(fromPoint2, toPoint2), |
- 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; |
+ m_consumer->curveToCubicSmooth( |
+ blendAnimatedFloatPoint(fromSeg.point2, toSeg.point2), |
+ blendAnimatedFloatPoint(fromSeg.targetPoint, toSeg.targetPoint), |
+ m_isInFirstHalfOfAnimation ? m_fromMode : m_toMode); |
+ m_fromCurrentPoint = m_fromMode == AbsoluteCoordinates ? fromSeg.targetPoint : m_fromCurrentPoint + fromSeg.targetPoint; |
+ m_toCurrentPoint = m_toMode == AbsoluteCoordinates ? toSeg.targetPoint : m_toCurrentPoint + toSeg.targetPoint; |
} |
-bool SVGPathBlender::blendCurveToQuadraticSegment() |
+void SVGPathBlender::blendCurveToQuadraticSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg) |
{ |
- FloatPoint fromTargetPoint; |
- FloatPoint fromPoint1; |
- FloatPoint toTargetPoint; |
- FloatPoint toPoint1; |
- if ((m_fromSource->hasMoreData() && !m_fromSource->parseCurveToQuadraticSegment(fromPoint1, fromTargetPoint)) |
- || !m_toSource->parseCurveToQuadraticSegment(toPoint1, toTargetPoint)) |
- return false; |
- |
- m_consumer->curveToQuadratic(blendAnimatedFloatPoint(fromPoint1, toPoint1), |
- 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; |
+ m_consumer->curveToQuadratic( |
+ blendAnimatedFloatPoint(fromSeg.point1, toSeg.point1), |
+ blendAnimatedFloatPoint(fromSeg.targetPoint, toSeg.targetPoint), |
+ m_isInFirstHalfOfAnimation ? m_fromMode : m_toMode); |
+ m_fromCurrentPoint = m_fromMode == AbsoluteCoordinates ? fromSeg.targetPoint : m_fromCurrentPoint + fromSeg.targetPoint; |
+ m_toCurrentPoint = m_toMode == AbsoluteCoordinates ? toSeg.targetPoint : m_toCurrentPoint + toSeg.targetPoint; |
} |
-bool SVGPathBlender::blendCurveToQuadraticSmoothSegment() |
+void SVGPathBlender::blendCurveToQuadraticSmoothSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg) |
{ |
- FloatPoint fromTargetPoint; |
- FloatPoint toTargetPoint; |
- if ((m_fromSource->hasMoreData() && !m_fromSource->parseCurveToQuadraticSmoothSegment(fromTargetPoint)) |
- || !m_toSource->parseCurveToQuadraticSmoothSegment(toTargetPoint)) |
- return false; |
- |
- m_consumer->curveToQuadraticSmooth(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; |
+ m_consumer->curveToQuadraticSmooth(blendAnimatedFloatPoint(fromSeg.targetPoint, toSeg.targetPoint), m_isInFirstHalfOfAnimation ? m_fromMode : m_toMode); |
+ m_fromCurrentPoint = m_fromMode == AbsoluteCoordinates ? fromSeg.targetPoint : m_fromCurrentPoint + fromSeg.targetPoint; |
+ m_toCurrentPoint = m_toMode == AbsoluteCoordinates ? toSeg.targetPoint : m_toCurrentPoint + toSeg.targetPoint; |
} |
-bool SVGPathBlender::blendArcToSegment() |
+void SVGPathBlender::blendArcToSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg) |
{ |
- float fromRx = 0; |
- float fromRy = 0; |
- float fromAngle = 0; |
- bool fromLargeArc = false; |
- bool fromSweep = false; |
- FloatPoint fromTargetPoint; |
- float toRx = 0; |
- float toRy = 0; |
- float toAngle = 0; |
- bool toLargeArc = false; |
- bool toSweep = false; |
- FloatPoint toTargetPoint; |
- if ((m_fromSource->hasMoreData() && !m_fromSource->parseArcToSegment(fromRx, fromRy, fromAngle, fromLargeArc, fromSweep, fromTargetPoint)) |
- || !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(); |
+ ASSERT(!m_addTypesCount || fromSeg.command == toSeg.command); |
+ |
bool blendedLargeArc; |
bool blendedSweep; |
if (m_addTypesCount) { |
- blendedLargeArc = fromLargeArc || toLargeArc; |
- blendedSweep = fromSweep || toSweep; |
+ blendedLargeArc = fromSeg.arcLarge || toSeg.arcLarge; |
+ blendedSweep = fromSeg.arcSweep || toSeg.arcSweep; |
} else { |
- blendedLargeArc = m_isInFirstHalfOfAnimation ? fromLargeArc : toLargeArc; |
- blendedSweep = m_isInFirstHalfOfAnimation ? fromSweep : toSweep; |
+ blendedLargeArc = m_isInFirstHalfOfAnimation ? fromSeg.arcLarge : toSeg.arcLarge; |
+ blendedSweep = m_isInFirstHalfOfAnimation ? fromSeg.arcSweep : toSeg.arcSweep; |
} |
+ FloatPoint blendedRadii = blendAnimatedFloatPointSameCoordinates(fromSeg.arcRadii(), toSeg.arcRadii()); |
+ float blendedAngle = blendAnimatedFloatPointSameCoordinates(fromSeg.point2, toSeg.point2).x(); |
+ |
m_consumer->arcTo( |
blendedRadii.x(), blendedRadii.y(), blendedAngle, blendedLargeArc, blendedSweep, |
- blendAnimatedFloatPoint(fromTargetPoint, toTargetPoint), |
+ blendAnimatedFloatPoint(fromSeg.targetPoint, toSeg.targetPoint), |
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; |
+ m_fromCurrentPoint = m_fromMode == AbsoluteCoordinates ? fromSeg.targetPoint : m_fromCurrentPoint + fromSeg.targetPoint; |
+ m_toCurrentPoint = m_toMode == AbsoluteCoordinates ? toSeg.targetPoint : m_toCurrentPoint + toSeg.targetPoint; |
} |
static inline PathCoordinateMode coordinateModeOfCommand(const SVGPathSegType& type) |
@@ -295,20 +222,6 @@ static inline PathCoordinateMode coordinateModeOfCommand(const SVGPathSegType& t |
return AbsoluteCoordinates; |
} |
-static inline bool isSegmentEqual(const SVGPathSegType& fromType, const SVGPathSegType& toType, const PathCoordinateMode& fromMode, const PathCoordinateMode& toMode) |
-{ |
- if (fromType == toType && (fromType == PathSegUnknown || fromType == PathSegClosePath)) |
- return true; |
- |
- unsigned short from = fromType; |
- unsigned short to = toType; |
- if (fromMode == toMode) |
- return from == to; |
- if (fromMode == AbsoluteCoordinates) |
- return from == to - 1; |
- return to == from - 1; |
-} |
- |
bool SVGPathBlender::addAnimatedPath(unsigned repeatCount) |
{ |
TemporaryChange<unsigned> change(m_addTypesCount, repeatCount); |
@@ -322,80 +235,77 @@ bool SVGPathBlender::blendAnimatedPath(float progress) |
bool fromSourceHadData = m_fromSource->hasMoreData(); |
while (m_toSource->hasMoreData()) { |
- SVGPathSegType fromCommand; |
- SVGPathSegType toCommand; |
- if ((fromSourceHadData && !m_fromSource->parseSVGSegmentType(fromCommand)) || !m_toSource->parseSVGSegmentType(toCommand)) |
+ PathSegmentData toSeg = m_toSource->parseSegment(); |
+ if (toSeg.command == PathSegUnknown) |
return false; |
- m_toMode = coordinateModeOfCommand(toCommand); |
- m_fromMode = fromSourceHadData ? coordinateModeOfCommand(fromCommand) : m_toMode; |
- if (m_fromMode != m_toMode && m_addTypesCount) |
+ PathSegmentData fromSeg; |
+ fromSeg.command = toSeg.command; |
+ |
+ if (m_fromSource->hasMoreData()) { |
+ fromSeg = m_fromSource->parseSegment(); |
+ if (fromSeg.command == PathSegUnknown) |
+ return false; |
+ } |
+ |
+ if (toAbsolutePathSegType(fromSeg.command) != toAbsolutePathSegType(toSeg.command)) |
return false; |
- if (fromSourceHadData && !isSegmentEqual(fromCommand, toCommand, m_fromMode, m_toMode)) |
+ m_fromMode = coordinateModeOfCommand(fromSeg.command); |
+ m_toMode = coordinateModeOfCommand(toSeg.command); |
+ |
+ if (m_addTypesCount && m_fromMode != m_toMode) |
return false; |
- switch (toCommand) { |
+ switch (toSeg.command) { |
case PathSegMoveToRel: |
case PathSegMoveToAbs: |
- if (!blendMoveToSegment()) |
- return false; |
+ blendMoveToSegment(fromSeg, toSeg); |
break; |
case PathSegLineToRel: |
case PathSegLineToAbs: |
- if (!blendLineToSegment()) |
- return false; |
+ blendLineToSegment(fromSeg, toSeg); |
break; |
case PathSegLineToHorizontalRel: |
case PathSegLineToHorizontalAbs: |
- if (!blendLineToHorizontalSegment()) |
- return false; |
+ blendLineToHorizontalSegment(fromSeg, toSeg); |
break; |
case PathSegLineToVerticalRel: |
case PathSegLineToVerticalAbs: |
- if (!blendLineToVerticalSegment()) |
- return false; |
+ blendLineToVerticalSegment(fromSeg, toSeg); |
break; |
case PathSegClosePath: |
m_consumer->closePath(); |
break; |
case PathSegCurveToCubicRel: |
case PathSegCurveToCubicAbs: |
- if (!blendCurveToCubicSegment()) |
- return false; |
+ blendCurveToCubicSegment(fromSeg, toSeg); |
break; |
case PathSegCurveToCubicSmoothRel: |
case PathSegCurveToCubicSmoothAbs: |
- if (!blendCurveToCubicSmoothSegment()) |
- return false; |
+ blendCurveToCubicSmoothSegment(fromSeg, toSeg); |
break; |
case PathSegCurveToQuadraticRel: |
case PathSegCurveToQuadraticAbs: |
- if (!blendCurveToQuadraticSegment()) |
- return false; |
+ blendCurveToQuadraticSegment(fromSeg, toSeg); |
break; |
case PathSegCurveToQuadraticSmoothRel: |
case PathSegCurveToQuadraticSmoothAbs: |
- if (!blendCurveToQuadraticSmoothSegment()) |
- return false; |
+ blendCurveToQuadraticSmoothSegment(fromSeg, toSeg); |
break; |
case PathSegArcRel: |
case PathSegArcAbs: |
- if (!blendArcToSegment()) |
- return false; |
+ blendArcToSegment(fromSeg, toSeg); |
break; |
- case PathSegUnknown: |
- return false; |
+ default: |
+ ASSERT_NOT_REACHED(); |
} |
if (!fromSourceHadData) |
continue; |
if (m_fromSource->hasMoreData() != m_toSource->hasMoreData()) |
return false; |
- if (!m_fromSource->hasMoreData() || !m_toSource->hasMoreData()) |
- return true; |
} |
- |
return true; |
} |