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

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

Issue 1028173002: SVGPathParser: Move unaltered emits to a separate code-path (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: 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/SVGPathParser.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: Source/core/svg/SVGPathParser.cpp
diff --git a/Source/core/svg/SVGPathParser.cpp b/Source/core/svg/SVGPathParser.cpp
index fc63a809e00d117e7605c2176e3347b68c9a2e48..9e9cc88647c89c1240a38970840f1d0353e27ad9 100644
--- a/Source/core/svg/SVGPathParser.cpp
+++ b/Source/core/svg/SVGPathParser.cpp
@@ -49,10 +49,6 @@ bool SVGPathParser::initialCommandIsMoveTo()
void SVGPathParser::emitMoveToSegment(PathSegmentData& segment)
{
- if (m_pathParsingMode == UnalteredParsing) {
- m_consumer->moveTo(segment.targetPoint, m_mode);
- return;
- }
if (m_mode == RelativeCoordinates)
m_currentPoint += segment.targetPoint;
else
@@ -63,10 +59,6 @@ void SVGPathParser::emitMoveToSegment(PathSegmentData& segment)
void SVGPathParser::emitLineToSegment(PathSegmentData& segment)
{
- if (m_pathParsingMode == UnalteredParsing) {
- m_consumer->lineTo(segment.targetPoint, m_mode);
- return;
- }
if (m_mode == RelativeCoordinates)
m_currentPoint += segment.targetPoint;
else
@@ -76,10 +68,6 @@ void SVGPathParser::emitLineToSegment(PathSegmentData& segment)
void SVGPathParser::emitLineToHorizontalSegment(PathSegmentData& segment)
{
- if (m_pathParsingMode == UnalteredParsing) {
- m_consumer->lineToHorizontal(segment.targetPoint.x(), m_mode);
- return;
- }
if (m_mode == RelativeCoordinates)
m_currentPoint += segment.targetPoint;
else
@@ -89,10 +77,6 @@ void SVGPathParser::emitLineToHorizontalSegment(PathSegmentData& segment)
void SVGPathParser::emitLineToVerticalSegment(PathSegmentData& segment)
{
- if (m_pathParsingMode == UnalteredParsing) {
- m_consumer->lineToVertical(segment.targetPoint.y(), m_mode);
- return;
- }
if (m_mode == RelativeCoordinates)
m_currentPoint += segment.targetPoint;
else
@@ -102,10 +86,6 @@ void SVGPathParser::emitLineToVerticalSegment(PathSegmentData& segment)
void SVGPathParser::emitCurveToCubicSegment(PathSegmentData& segment)
{
- if (m_pathParsingMode == UnalteredParsing) {
- m_consumer->curveToCubic(segment.point1, segment.point2, segment.targetPoint, m_mode);
- return;
- }
if (m_mode == RelativeCoordinates) {
segment.point1 += m_currentPoint;
segment.point2 += m_currentPoint;
@@ -124,10 +104,6 @@ static FloatPoint reflectedPoint(const FloatPoint& reflectIn, const FloatPoint&
void SVGPathParser::emitCurveToCubicSmoothSegment(PathSegmentData& segment)
{
- if (m_pathParsingMode == UnalteredParsing) {
- m_consumer->curveToCubicSmooth(segment.point2, segment.targetPoint, m_mode);
- return;
- }
if (m_lastCommand != PathSegCurveToCubicAbs
&& m_lastCommand != PathSegCurveToCubicRel
&& m_lastCommand != PathSegCurveToCubicSmoothAbs
@@ -155,10 +131,6 @@ static FloatPoint blendPoints(const FloatPoint& p1, const FloatPoint& p2)
void SVGPathParser::emitCurveToQuadraticSegment(PathSegmentData& segment)
{
- if (m_pathParsingMode == UnalteredParsing) {
- m_consumer->curveToQuadratic(segment.point1, segment.targetPoint, m_mode);
- return;
- }
m_controlPoint = segment.point1;
if (m_mode == RelativeCoordinates) {
@@ -175,10 +147,6 @@ void SVGPathParser::emitCurveToQuadraticSegment(PathSegmentData& segment)
void SVGPathParser::emitCurveToQuadraticSmoothSegment(PathSegmentData& segment)
{
- if (m_pathParsingMode == UnalteredParsing) {
- m_consumer->curveToQuadraticSmooth(segment.targetPoint, m_mode);
- return;
- }
if (m_lastCommand != PathSegCurveToQuadraticAbs
&& m_lastCommand != PathSegCurveToQuadraticRel
&& m_lastCommand != PathSegCurveToQuadraticSmoothAbs
@@ -199,11 +167,6 @@ void SVGPathParser::emitCurveToQuadraticSmoothSegment(PathSegmentData& segment)
void SVGPathParser::emitArcToSegment(PathSegmentData& segment)
{
- if (m_pathParsingMode == UnalteredParsing) {
- m_consumer->arcTo(segment.arcRadii().x(), segment.arcRadii().y(), segment.arcAngle(), segment.arcLarge, segment.arcSweep, segment.targetPoint, m_mode);
- return;
- }
-
// If rx = 0 or ry = 0 then this arc is treated as a straight line segment (a "lineto") joining the endpoints.
// http://www.w3.org/TR/SVG/implnote.html#ArcOutOfRangeParameters
// If the current point and target point for the arc are identical, it should be treated as a zero length
@@ -232,8 +195,6 @@ bool SVGPathParser::parsePathDataFromSource(PathParsingMode pathParsingMode, boo
ASSERT(m_source);
ASSERT(m_consumer);
- m_pathParsingMode = pathParsingMode;
-
m_controlPoint = FloatPoint();
m_currentPoint = FloatPoint();
m_subPathPoint = FloatPoint();
@@ -247,63 +208,120 @@ bool SVGPathParser::parsePathDataFromSource(PathParsingMode pathParsingMode, boo
if (segment.command == PathSegUnknown)
return false;
- m_mode = AbsoluteCoordinates;
-
- switch (segment.command) {
- case PathSegMoveToRel:
- m_mode = RelativeCoordinates;
- case PathSegMoveToAbs:
- emitMoveToSegment(segment);
- break;
- case PathSegLineToRel:
- m_mode = RelativeCoordinates;
- case PathSegLineToAbs:
- emitLineToSegment(segment);
- break;
- case PathSegLineToHorizontalRel:
- m_mode = RelativeCoordinates;
- case PathSegLineToHorizontalAbs:
- emitLineToHorizontalSegment(segment);
- break;
- case PathSegLineToVerticalRel:
- m_mode = RelativeCoordinates;
- case PathSegLineToVerticalAbs:
- emitLineToVerticalSegment(segment);
- break;
- case PathSegClosePath:
- m_consumer->closePath();
- // Reset m_currentPoint for the next path.
- if (m_pathParsingMode == NormalizedParsing)
+ if (pathParsingMode == NormalizedParsing) {
+ m_mode = AbsoluteCoordinates;
+
+ switch (segment.command) {
+ case PathSegMoveToRel:
+ m_mode = RelativeCoordinates;
+ case PathSegMoveToAbs:
+ emitMoveToSegment(segment);
+ break;
+ case PathSegLineToRel:
+ m_mode = RelativeCoordinates;
+ case PathSegLineToAbs:
+ emitLineToSegment(segment);
+ break;
+ case PathSegLineToHorizontalRel:
+ m_mode = RelativeCoordinates;
+ case PathSegLineToHorizontalAbs:
+ emitLineToHorizontalSegment(segment);
+ break;
+ case PathSegLineToVerticalRel:
+ m_mode = RelativeCoordinates;
+ case PathSegLineToVerticalAbs:
+ emitLineToVerticalSegment(segment);
+ break;
+ case PathSegClosePath:
+ m_consumer->closePath();
+ // Reset m_currentPoint for the next path.
m_currentPoint = m_subPathPoint;
- break;
- case PathSegCurveToCubicRel:
- m_mode = RelativeCoordinates;
- case PathSegCurveToCubicAbs:
- emitCurveToCubicSegment(segment);
- break;
- case PathSegCurveToCubicSmoothRel:
- m_mode = RelativeCoordinates;
- case PathSegCurveToCubicSmoothAbs:
- emitCurveToCubicSmoothSegment(segment);
- break;
- case PathSegCurveToQuadraticRel:
- m_mode = RelativeCoordinates;
- case PathSegCurveToQuadraticAbs:
- emitCurveToQuadraticSegment(segment);
- break;
- case PathSegCurveToQuadraticSmoothRel:
- m_mode = RelativeCoordinates;
- case PathSegCurveToQuadraticSmoothAbs:
- emitCurveToQuadraticSmoothSegment(segment);
- break;
- case PathSegArcRel:
- m_mode = RelativeCoordinates;
- case PathSegArcAbs:
- emitArcToSegment(segment);
- break;
- default:
- ASSERT_NOT_REACHED();
+ break;
+ case PathSegCurveToCubicRel:
+ m_mode = RelativeCoordinates;
+ case PathSegCurveToCubicAbs:
+ emitCurveToCubicSegment(segment);
+ break;
+ case PathSegCurveToCubicSmoothRel:
+ m_mode = RelativeCoordinates;
+ case PathSegCurveToCubicSmoothAbs:
+ emitCurveToCubicSmoothSegment(segment);
+ break;
+ case PathSegCurveToQuadraticRel:
+ m_mode = RelativeCoordinates;
+ case PathSegCurveToQuadraticAbs:
+ emitCurveToQuadraticSegment(segment);
+ break;
+ case PathSegCurveToQuadraticSmoothRel:
+ m_mode = RelativeCoordinates;
+ case PathSegCurveToQuadraticSmoothAbs:
+ emitCurveToQuadraticSmoothSegment(segment);
+ break;
+ case PathSegArcRel:
+ m_mode = RelativeCoordinates;
+ case PathSegArcAbs:
+ emitArcToSegment(segment);
+ break;
+ default:
+ ASSERT_NOT_REACHED();
+ }
+ } else {
+ PathCoordinateMode mode = AbsoluteCoordinates;
+
+ switch (segment.command) {
+ case PathSegMoveToRel:
+ mode = RelativeCoordinates;
+ case PathSegMoveToAbs:
+ m_consumer->moveTo(segment.targetPoint, mode);
+ break;
+ case PathSegLineToRel:
+ mode = RelativeCoordinates;
+ case PathSegLineToAbs:
+ m_consumer->lineTo(segment.targetPoint, mode);
+ break;
+ case PathSegLineToHorizontalRel:
+ mode = RelativeCoordinates;
+ case PathSegLineToHorizontalAbs:
+ m_consumer->lineToHorizontal(segment.targetPoint.x(), mode);
+ break;
+ case PathSegLineToVerticalRel:
+ mode = RelativeCoordinates;
+ case PathSegLineToVerticalAbs:
+ m_consumer->lineToVertical(segment.targetPoint.y(), mode);
+ break;
+ case PathSegClosePath:
+ m_consumer->closePath();
+ break;
+ case PathSegCurveToCubicRel:
+ mode = RelativeCoordinates;
+ case PathSegCurveToCubicAbs:
+ m_consumer->curveToCubic(segment.point1, segment.point2, segment.targetPoint, mode);
+ break;
+ case PathSegCurveToCubicSmoothRel:
+ mode = RelativeCoordinates;
+ case PathSegCurveToCubicSmoothAbs:
+ m_consumer->curveToCubicSmooth(segment.point2, segment.targetPoint, mode);
+ break;
+ case PathSegCurveToQuadraticRel:
+ mode = RelativeCoordinates;
+ case PathSegCurveToQuadraticAbs:
+ m_consumer->curveToQuadratic(segment.point1, segment.targetPoint, mode);
+ break;
+ case PathSegCurveToQuadraticSmoothRel:
+ mode = RelativeCoordinates;
+ case PathSegCurveToQuadraticSmoothAbs:
+ m_consumer->curveToQuadraticSmooth(segment.targetPoint, mode);
+ break;
+ case PathSegArcRel:
+ mode = RelativeCoordinates;
+ case PathSegArcAbs:
+ m_consumer->arcTo(segment.arcRadii().x(), segment.arcRadii().y(), segment.arcAngle(), segment.arcLarge, segment.arcSweep, segment.targetPoint, mode);
+ break;
+ default:
+ ASSERT_NOT_REACHED();
+ }
}
+
if (!m_consumer->continueConsuming())
return true;
« no previous file with comments | « Source/core/svg/SVGPathParser.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698