OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2006, 2007 Eric Seidel <eric@webkit.org> | 2 * Copyright (C) 2006, 2007 Eric Seidel <eric@webkit.org> |
3 * | 3 * |
4 * This library is free software; you can redistribute it and/or | 4 * This library is free software; you can redistribute it and/or |
5 * modify it under the terms of the GNU Library General Public | 5 * modify it under the terms of the GNU Library General Public |
6 * License as published by the Free Software Foundation; either | 6 * License as published by the Free Software Foundation; either |
7 * version 2 of the License, or (at your option) any later version. | 7 * version 2 of the License, or (at your option) any later version. |
8 * | 8 * |
9 * This library is distributed in the hope that it will be useful, | 9 * This library is distributed in the hope that it will be useful, |
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of | 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
122 template <class CurveType> | 122 template <class CurveType> |
123 static float curveLength(PathTraversalState& traversalState, CurveType curve) { | 123 static float curveLength(PathTraversalState& traversalState, CurveType curve) { |
124 static const unsigned short curveSplitDepthLimit = 20; | 124 static const unsigned short curveSplitDepthLimit = 20; |
125 static const double pathSegmentLengthToleranceSquared = 1.e-16; | 125 static const double pathSegmentLengthToleranceSquared = 1.e-16; |
126 | 126 |
127 double curveScaleForToleranceSquared = curve.magnitudeSquared(); | 127 double curveScaleForToleranceSquared = curve.magnitudeSquared(); |
128 if (curveScaleForToleranceSquared < pathSegmentLengthToleranceSquared) | 128 if (curveScaleForToleranceSquared < pathSegmentLengthToleranceSquared) |
129 return 0; | 129 return 0; |
130 | 130 |
131 Vector<CurveType> curveStack; | 131 Vector<CurveType> curveStack; |
132 curveStack.append(curve); | 132 curveStack.push_back(curve); |
133 | 133 |
134 float totalLength = 0; | 134 float totalLength = 0; |
135 do { | 135 do { |
136 float length = curve.approximateDistance(); | 136 float length = curve.approximateDistance(); |
137 double lengthDiscrepancy = length - distanceLine(curve.start, curve.end); | 137 double lengthDiscrepancy = length - distanceLine(curve.start, curve.end); |
138 if ((lengthDiscrepancy * lengthDiscrepancy) / | 138 if ((lengthDiscrepancy * lengthDiscrepancy) / |
139 curveScaleForToleranceSquared > | 139 curveScaleForToleranceSquared > |
140 pathSegmentLengthToleranceSquared && | 140 pathSegmentLengthToleranceSquared && |
141 curve.splitDepth < curveSplitDepthLimit) { | 141 curve.splitDepth < curveSplitDepthLimit) { |
142 CurveType leftCurve; | 142 CurveType leftCurve; |
143 CurveType rightCurve; | 143 CurveType rightCurve; |
144 curve.split(leftCurve, rightCurve); | 144 curve.split(leftCurve, rightCurve); |
145 curve = leftCurve; | 145 curve = leftCurve; |
146 curveStack.append(rightCurve); | 146 curveStack.push_back(rightCurve); |
147 } else { | 147 } else { |
148 totalLength += length; | 148 totalLength += length; |
149 if (traversalState.m_action == | 149 if (traversalState.m_action == |
150 PathTraversalState::TraversalPointAtLength || | 150 PathTraversalState::TraversalPointAtLength || |
151 traversalState.m_action == | 151 traversalState.m_action == |
152 PathTraversalState::TraversalNormalAngleAtLength) { | 152 PathTraversalState::TraversalNormalAngleAtLength) { |
153 traversalState.m_previous = curve.start; | 153 traversalState.m_previous = curve.start; |
154 traversalState.m_current = curve.end; | 154 traversalState.m_current = curve.end; |
155 if (traversalState.m_totalLength + totalLength > | 155 if (traversalState.m_totalLength + totalLength > |
156 traversalState.m_desiredLength) | 156 traversalState.m_desiredLength) |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
214 m_current.move(offset * cosf(slope), offset * sinf(slope)); | 214 m_current.move(offset * cosf(slope), offset * sinf(slope)); |
215 } else { | 215 } else { |
216 m_normalAngle = rad2deg(slope); | 216 m_normalAngle = rad2deg(slope); |
217 } | 217 } |
218 m_success = true; | 218 m_success = true; |
219 } | 219 } |
220 m_previous = m_current; | 220 m_previous = m_current; |
221 } | 221 } |
222 | 222 |
223 } // namespace blink | 223 } // namespace blink |
OLD | NEW |