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

Unified Diff: Source/core/svg/SVGPathBlender.cpp

Issue 1037463002: Rework the SVGPathConsumer interface (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Rebase; FIXME -> TODO. 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « Source/core/svg/SVGPathBlender.h ('k') | Source/core/svg/SVGPathBuilder.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/svg/SVGPathBlender.cpp
diff --git a/Source/core/svg/SVGPathBlender.cpp b/Source/core/svg/SVGPathBlender.cpp
index 64a9374cfdfc6178487592df5b36b170600068f1..3e0fb27661e770a10ee6c9dd825b94d8b537384a 100644
--- a/Source/core/svg/SVGPathBlender.cpp
+++ b/Source/core/svg/SVGPathBlender.cpp
@@ -113,101 +113,168 @@ FloatPoint SVGPathBlender::blendAnimatedFloatPoint(const FloatPoint& fromPoint,
return animatedPoint;
}
-void SVGPathBlender::blendMoveToSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg)
+PathSegmentData SVGPathBlender::blendMoveToSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg)
{
- m_consumer->moveTo(blendAnimatedFloatPoint(fromSeg.targetPoint, toSeg.targetPoint), m_isInFirstHalfOfAnimation ? m_fromMode : m_toMode);
+ PathSegmentData blendedSegment;
+ blendedSegment.command = m_isInFirstHalfOfAnimation ? fromSeg.command : toSeg.command;
+ blendedSegment.targetPoint = blendAnimatedFloatPoint(fromSeg.targetPoint, toSeg.targetPoint);
+
m_fromCurrentPoint = m_fromMode == AbsoluteCoordinates ? fromSeg.targetPoint : m_fromCurrentPoint + fromSeg.targetPoint;
m_toCurrentPoint = m_toMode == AbsoluteCoordinates ? toSeg.targetPoint : m_toCurrentPoint + toSeg.targetPoint;
+ return blendedSegment;
}
-void SVGPathBlender::blendLineToSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg)
+PathSegmentData SVGPathBlender::blendLineToSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg)
{
- m_consumer->lineTo(blendAnimatedFloatPoint(fromSeg.targetPoint, toSeg.targetPoint), m_isInFirstHalfOfAnimation ? m_fromMode : m_toMode);
+ PathSegmentData blendedSegment;
+ blendedSegment.command = m_isInFirstHalfOfAnimation ? fromSeg.command : toSeg.command;
+ blendedSegment.targetPoint = blendAnimatedFloatPoint(fromSeg.targetPoint, toSeg.targetPoint);
+
m_fromCurrentPoint = m_fromMode == AbsoluteCoordinates ? fromSeg.targetPoint : m_fromCurrentPoint + fromSeg.targetPoint;
m_toCurrentPoint = m_toMode == AbsoluteCoordinates ? toSeg.targetPoint : m_toCurrentPoint + toSeg.targetPoint;
+ return blendedSegment;
}
-void SVGPathBlender::blendLineToHorizontalSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg)
+PathSegmentData SVGPathBlender::blendLineToHorizontalSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg)
{
- 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);
+ PathSegmentData blendedSegment;
+ blendedSegment.command = m_isInFirstHalfOfAnimation ? fromSeg.command : toSeg.command;
+ blendedSegment.targetPoint.setX(blendAnimatedDimensonalFloat(fromSeg.targetPoint.x(), toSeg.targetPoint.x(), BlendHorizontal));
+
+ m_fromCurrentPoint.setX(m_fromMode == AbsoluteCoordinates ? fromSeg.targetPoint.x() : m_fromCurrentPoint.x() + fromSeg.targetPoint.x());
+ m_toCurrentPoint.setX(m_toMode == AbsoluteCoordinates ? toSeg.targetPoint.x() : m_toCurrentPoint.x() + toSeg.targetPoint.x());
+ return blendedSegment;
}
-void SVGPathBlender::blendLineToVerticalSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg)
+PathSegmentData SVGPathBlender::blendLineToVerticalSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg)
{
- 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);
+ PathSegmentData blendedSegment;
+ blendedSegment.command = m_isInFirstHalfOfAnimation ? fromSeg.command : toSeg.command;
+ blendedSegment.targetPoint.setY(blendAnimatedDimensonalFloat(fromSeg.targetPoint.y(), toSeg.targetPoint.y(), BlendVertical));
+
+ m_fromCurrentPoint.setY(m_fromMode == AbsoluteCoordinates ? fromSeg.targetPoint.y() : m_fromCurrentPoint.y() + fromSeg.targetPoint.y());
+ m_toCurrentPoint.setY(m_toMode == AbsoluteCoordinates ? toSeg.targetPoint.y() : m_toCurrentPoint.y() + toSeg.targetPoint.y());
+ return blendedSegment;
}
-void SVGPathBlender::blendCurveToCubicSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg)
+PathSegmentData SVGPathBlender::blendCurveToCubicSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg)
{
- m_consumer->curveToCubic(
- blendAnimatedFloatPoint(fromSeg.point1, toSeg.point1),
- blendAnimatedFloatPoint(fromSeg.point2, toSeg.point2),
- blendAnimatedFloatPoint(fromSeg.targetPoint, toSeg.targetPoint),
- m_isInFirstHalfOfAnimation ? m_fromMode : m_toMode);
+ PathSegmentData blendedSegment;
+ blendedSegment.command = m_isInFirstHalfOfAnimation ? fromSeg.command : toSeg.command;
+ blendedSegment.targetPoint = blendAnimatedFloatPoint(fromSeg.targetPoint, toSeg.targetPoint);
+ blendedSegment.point1 = blendAnimatedFloatPoint(fromSeg.point1, toSeg.point1);
+ blendedSegment.point2 = blendAnimatedFloatPoint(fromSeg.point2, toSeg.point2);
+
m_fromCurrentPoint = m_fromMode == AbsoluteCoordinates ? fromSeg.targetPoint : m_fromCurrentPoint + fromSeg.targetPoint;
m_toCurrentPoint = m_toMode == AbsoluteCoordinates ? toSeg.targetPoint : m_toCurrentPoint + toSeg.targetPoint;
+ return blendedSegment;
}
-void SVGPathBlender::blendCurveToCubicSmoothSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg)
+PathSegmentData SVGPathBlender::blendCurveToCubicSmoothSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg)
{
- m_consumer->curveToCubicSmooth(
- blendAnimatedFloatPoint(fromSeg.point2, toSeg.point2),
- blendAnimatedFloatPoint(fromSeg.targetPoint, toSeg.targetPoint),
- m_isInFirstHalfOfAnimation ? m_fromMode : m_toMode);
+ PathSegmentData blendedSegment;
+ blendedSegment.command = m_isInFirstHalfOfAnimation ? fromSeg.command : toSeg.command;
+ blendedSegment.targetPoint = blendAnimatedFloatPoint(fromSeg.targetPoint, toSeg.targetPoint);
+ blendedSegment.point2 = blendAnimatedFloatPoint(fromSeg.point2, toSeg.point2);
+
m_fromCurrentPoint = m_fromMode == AbsoluteCoordinates ? fromSeg.targetPoint : m_fromCurrentPoint + fromSeg.targetPoint;
m_toCurrentPoint = m_toMode == AbsoluteCoordinates ? toSeg.targetPoint : m_toCurrentPoint + toSeg.targetPoint;
+ return blendedSegment;
}
-void SVGPathBlender::blendCurveToQuadraticSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg)
+PathSegmentData SVGPathBlender::blendCurveToQuadraticSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg)
{
- m_consumer->curveToQuadratic(
- blendAnimatedFloatPoint(fromSeg.point1, toSeg.point1),
- blendAnimatedFloatPoint(fromSeg.targetPoint, toSeg.targetPoint),
- m_isInFirstHalfOfAnimation ? m_fromMode : m_toMode);
+ PathSegmentData blendedSegment;
+ blendedSegment.command = m_isInFirstHalfOfAnimation ? fromSeg.command : toSeg.command;
+ blendedSegment.targetPoint = blendAnimatedFloatPoint(fromSeg.targetPoint, toSeg.targetPoint);
+ blendedSegment.point1 = blendAnimatedFloatPoint(fromSeg.point1, toSeg.point1);
+
m_fromCurrentPoint = m_fromMode == AbsoluteCoordinates ? fromSeg.targetPoint : m_fromCurrentPoint + fromSeg.targetPoint;
m_toCurrentPoint = m_toMode == AbsoluteCoordinates ? toSeg.targetPoint : m_toCurrentPoint + toSeg.targetPoint;
+ return blendedSegment;
}
-void SVGPathBlender::blendCurveToQuadraticSmoothSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg)
+PathSegmentData SVGPathBlender::blendCurveToQuadraticSmoothSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg)
{
- m_consumer->curveToQuadraticSmooth(blendAnimatedFloatPoint(fromSeg.targetPoint, toSeg.targetPoint), m_isInFirstHalfOfAnimation ? m_fromMode : m_toMode);
+ PathSegmentData blendedSegment;
+ blendedSegment.command = m_isInFirstHalfOfAnimation ? fromSeg.command : toSeg.command;
+ blendedSegment.targetPoint = blendAnimatedFloatPoint(fromSeg.targetPoint, toSeg.targetPoint);
+
m_fromCurrentPoint = m_fromMode == AbsoluteCoordinates ? fromSeg.targetPoint : m_fromCurrentPoint + fromSeg.targetPoint;
m_toCurrentPoint = m_toMode == AbsoluteCoordinates ? toSeg.targetPoint : m_toCurrentPoint + toSeg.targetPoint;
+ return blendedSegment;
}
-void SVGPathBlender::blendArcToSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg)
+PathSegmentData SVGPathBlender::blendArcToSegment(const PathSegmentData& fromSeg, const PathSegmentData& toSeg)
{
ASSERT(!m_addTypesCount || fromSeg.command == toSeg.command);
- bool blendedLargeArc;
- bool blendedSweep;
-
+ PathSegmentData blendedSegment;
+ blendedSegment.command = m_isInFirstHalfOfAnimation ? fromSeg.command : toSeg.command;
+ blendedSegment.targetPoint = blendAnimatedFloatPoint(fromSeg.targetPoint, toSeg.targetPoint);
+ blendedSegment.point1 = blendAnimatedFloatPointSameCoordinates(fromSeg.arcRadii(), toSeg.arcRadii());
+ blendedSegment.point2 = blendAnimatedFloatPointSameCoordinates(fromSeg.point2, toSeg.point2);
if (m_addTypesCount) {
- blendedLargeArc = fromSeg.arcLarge || toSeg.arcLarge;
- blendedSweep = fromSeg.arcSweep || toSeg.arcSweep;
+ blendedSegment.arcLarge = fromSeg.arcLarge || toSeg.arcLarge;
+ blendedSegment.arcSweep = fromSeg.arcSweep || toSeg.arcSweep;
} else {
- blendedLargeArc = m_isInFirstHalfOfAnimation ? fromSeg.arcLarge : toSeg.arcLarge;
- blendedSweep = m_isInFirstHalfOfAnimation ? fromSeg.arcSweep : toSeg.arcSweep;
+ blendedSegment.arcLarge = m_isInFirstHalfOfAnimation ? fromSeg.arcLarge : toSeg.arcLarge;
+ blendedSegment.arcSweep = 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(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;
+ return blendedSegment;
+}
+
+void SVGPathBlender::blendSegments(const PathSegmentData& fromSeg, const PathSegmentData& toSeg)
+{
+ PathSegmentData blendedSegment;
+ switch (toSeg.command) {
+ case PathSegMoveToRel:
+ case PathSegMoveToAbs:
+ blendedSegment = blendMoveToSegment(fromSeg, toSeg);
+ break;
+ case PathSegLineToRel:
+ case PathSegLineToAbs:
+ blendedSegment = blendLineToSegment(fromSeg, toSeg);
+ break;
+ case PathSegLineToHorizontalRel:
+ case PathSegLineToHorizontalAbs:
+ blendedSegment = blendLineToHorizontalSegment(fromSeg, toSeg);
+ break;
+ case PathSegLineToVerticalRel:
+ case PathSegLineToVerticalAbs:
+ blendedSegment = blendLineToVerticalSegment(fromSeg, toSeg);
+ break;
+ case PathSegClosePath:
+ blendedSegment = toSeg;
+ break;
+ case PathSegCurveToCubicRel:
+ case PathSegCurveToCubicAbs:
+ blendedSegment = blendCurveToCubicSegment(fromSeg, toSeg);
+ break;
+ case PathSegCurveToCubicSmoothRel:
+ case PathSegCurveToCubicSmoothAbs:
+ blendedSegment = blendCurveToCubicSmoothSegment(fromSeg, toSeg);
+ break;
+ case PathSegCurveToQuadraticRel:
+ case PathSegCurveToQuadraticAbs:
+ blendedSegment = blendCurveToQuadraticSegment(fromSeg, toSeg);
+ break;
+ case PathSegCurveToQuadraticSmoothRel:
+ case PathSegCurveToQuadraticSmoothAbs:
+ blendedSegment = blendCurveToQuadraticSmoothSegment(fromSeg, toSeg);
+ break;
+ case PathSegArcRel:
+ case PathSegArcAbs:
+ blendedSegment = blendArcToSegment(fromSeg, toSeg);
+ break;
+ default:
+ ASSERT_NOT_REACHED();
+ }
+
+ m_consumer->emitSegment(blendedSegment);
}
static inline PathCoordinateMode coordinateModeOfCommand(const SVGPathSegType& type)
@@ -257,49 +324,7 @@ bool SVGPathBlender::blendAnimatedPath(float progress)
if (m_addTypesCount && m_fromMode != m_toMode)
return false;
- switch (toSeg.command) {
- case PathSegMoveToRel:
- case PathSegMoveToAbs:
- blendMoveToSegment(fromSeg, toSeg);
- break;
- case PathSegLineToRel:
- case PathSegLineToAbs:
- blendLineToSegment(fromSeg, toSeg);
- break;
- case PathSegLineToHorizontalRel:
- case PathSegLineToHorizontalAbs:
- blendLineToHorizontalSegment(fromSeg, toSeg);
- break;
- case PathSegLineToVerticalRel:
- case PathSegLineToVerticalAbs:
- blendLineToVerticalSegment(fromSeg, toSeg);
- break;
- case PathSegClosePath:
- m_consumer->closePath();
- break;
- case PathSegCurveToCubicRel:
- case PathSegCurveToCubicAbs:
- blendCurveToCubicSegment(fromSeg, toSeg);
- break;
- case PathSegCurveToCubicSmoothRel:
- case PathSegCurveToCubicSmoothAbs:
- blendCurveToCubicSmoothSegment(fromSeg, toSeg);
- break;
- case PathSegCurveToQuadraticRel:
- case PathSegCurveToQuadraticAbs:
- blendCurveToQuadraticSegment(fromSeg, toSeg);
- break;
- case PathSegCurveToQuadraticSmoothRel:
- case PathSegCurveToQuadraticSmoothAbs:
- blendCurveToQuadraticSmoothSegment(fromSeg, toSeg);
- break;
- case PathSegArcRel:
- case PathSegArcAbs:
- blendArcToSegment(fromSeg, toSeg);
- break;
- default:
- ASSERT_NOT_REACHED();
- }
+ blendSegments(fromSeg, toSeg);
if (!fromSourceHadData)
continue;
« no previous file with comments | « Source/core/svg/SVGPathBlender.h ('k') | Source/core/svg/SVGPathBuilder.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698