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

Unified Diff: Source/platform/graphics/PathTraversalState.cpp

Issue 190943002: [SVG] Fix infinite curveLength() loop. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 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
Index: Source/platform/graphics/PathTraversalState.cpp
diff --git a/Source/platform/graphics/PathTraversalState.cpp b/Source/platform/graphics/PathTraversalState.cpp
index 406c5b180cd6a38866b28e5882f423e23e7270ef..7dba594f612262857baca8465d170bedd9072354 100644
--- a/Source/platform/graphics/PathTraversalState.cpp
+++ b/Source/platform/graphics/PathTraversalState.cpp
@@ -51,7 +51,14 @@ struct QuadraticBezier {
return distanceLine(start, control) + distanceLine(control, end);
}
- void split(QuadraticBezier& left, QuadraticBezier& right) const
+ bool equals(const QuadraticBezier& other) const
+ {
+ return start == other.start
+ && end == other.end
+ && control == other.control;
+ }
+
+ bool split(QuadraticBezier& left, QuadraticBezier& right) const
{
left.control = midPoint(start, control);
right.control = midPoint(control, end);
@@ -62,6 +69,8 @@ struct QuadraticBezier {
left.start = start;
right.end = end;
+
+ return !equals(left) && !equals(right);
}
FloatPoint start;
@@ -84,7 +93,15 @@ struct CubicBezier {
return distanceLine(start, control1) + distanceLine(control1, control2) + distanceLine(control2, end);
}
- void split(CubicBezier& left, CubicBezier& right) const
+ bool equals(const CubicBezier& other) const
+ {
+ return start == other.start
+ && end == other.end
+ && control1 == other.control1
+ && control2 == other.control2;
+ }
+
+ bool split(CubicBezier& left, CubicBezier& right) const
{
FloatPoint startToControl1 = midPoint(control1, control2);
@@ -99,6 +116,8 @@ struct CubicBezier {
FloatPoint leftControl2ToRightControl1 = midPoint(left.control2, right.control1);
left.end = leftControl2ToRightControl1;
right.start = leftControl2ToRightControl1;
+
+ return !equals(left) && !equals(right);
}
FloatPoint start;
@@ -122,12 +141,12 @@ static float curveLength(PathTraversalState& traversalState, CurveType curve)
curveStack.append(curve);
float totalLength = 0;
+ CurveType leftCurve, rightCurve;
do {
float length = curve.approximateDistance();
- if ((length - distanceLine(curve.start, curve.end)) > kPathSegmentLengthTolerance && curveStack.size() <= curveStackDepthLimit) {
- CurveType leftCurve;
- CurveType rightCurve;
- curve.split(leftCurve, rightCurve);
+ if ((length - distanceLine(curve.start, curve.end)) > kPathSegmentLengthTolerance
Stephen Chennney 2014/03/07 16:25:31 The real problem is that tolerance is a fixed valu
f(malita) 2014/03/07 18:02:26 I disagree: the immediate problem is that the algo
f(malita) 2014/03/07 19:14:08 Come to think of it, it's obvious this would not w
+ && curveStack.size() <= curveStackDepthLimit
+ && curve.split(leftCurve, rightCurve)) {
curve = leftCurve;
curveStack.append(rightCurve);
} else {

Powered by Google App Engine
This is Rietveld 408576698