Index: src/pathops/SkDCubicIntersection.cpp |
diff --git a/src/pathops/SkDCubicIntersection.cpp b/src/pathops/SkDCubicIntersection.cpp |
index 5106bbba98541472cb3f90a84f33dee2c090721d..511879cd70c2254de6bf13d160fb08f9ac241497 100644 |
--- a/src/pathops/SkDCubicIntersection.cpp |
+++ b/src/pathops/SkDCubicIntersection.cpp |
@@ -12,7 +12,6 @@ |
#include "SkPathOpsQuad.h" |
#include "SkPathOpsRect.h" |
#include "SkReduceOrder.h" |
-#include "SkTDArray.h" |
#include "SkTSort.h" |
#if ONE_OFF_DEBUG |
@@ -23,6 +22,8 @@ static const double tLimits2[2][2] = {{-0.865211397, -0.865215212}, {-0.86520769 |
#define DEBUG_QUAD_PART 0 |
#define SWAP_TOP_DEBUG 0 |
+static const int kCubicToQuadSubdivisionDepth = 8; // slots reserved for cubic to quads subdivision |
+ |
static int quadPart(const SkDCubic& cubic, double tStart, double tEnd, SkReduceOrder* reducer) { |
SkDCubic part = cubic.subDivide(tStart, tEnd); |
SkDQuad quad = part.toQuad(); |
@@ -74,10 +75,10 @@ static void intersect(const SkDCubic& cubic1, double t1s, double t1e, const SkDC |
i.upDepth(); |
SkDCubic c1 = cubic1.subDivide(t1s, t1e); |
SkDCubic c2 = cubic2.subDivide(t2s, t2e); |
- SkTDArray<double> ts1; |
+ SkSTArray<kCubicToQuadSubdivisionDepth, double, true> ts1; |
// OPTIMIZE: if c1 == c2, call once (happens when detecting self-intersection) |
c1.toQuadraticTs(c1.calcPrecision() * precisionScale, &ts1); |
- SkTDArray<double> ts2; |
+ SkSTArray<kCubicToQuadSubdivisionDepth, double, true> ts2; |
c2.toQuadraticTs(c2.calcPrecision() * precisionScale, &ts2); |
double t1Start = t1s; |
int ts1Count = ts1.count(); |
@@ -264,10 +265,12 @@ static void intersectEnd(const SkDCubic& cubic1, bool start, const SkDCubic& cub |
int t1Index = start ? 0 : 3; |
// don't bother if the two cubics are connnected |
#if 1 |
- SkTDArray<double> tVals; // OPTIMIZE: replace with hard-sized array |
+ static const int kPointsInCubic = 4; // FIXME: move to DCubic, replace '4' with this |
+ static const int kMaxLineCubicIntersections = 3; |
+ SkSTArray<(kMaxLineCubicIntersections - 1) * kMaxLineCubicIntersections, double, true> tVals; |
line[0] = cubic1[t1Index]; |
// this variant looks for intersections with the end point and lines parallel to other points |
- for (int index = 0; index < 4; ++index) { |
+ for (int index = 0; index < kPointsInCubic; ++index) { |
if (index == t1Index) { |
continue; |
} |
@@ -296,7 +299,7 @@ static void intersectEnd(const SkDCubic& cubic1, bool start, const SkDCubic& cub |
i.insert(start ? 0 : 1, foundT, line[0]); |
} |
} else { |
- *tVals.append() = foundT; |
+ tVals.push_back(foundT); |
} |
} |
} |