diff options
author | caryclark <caryclark@google.com> | 2015-04-29 08:28:30 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2015-04-29 08:28:30 -0700 |
commit | aec251012542e971100e218bf463adbfb5d21d20 (patch) | |
tree | 16c2e84c2d59d94b75d7d2bc50fec53c0e38a898 /src/pathops/SkPathOpsRect.cpp | |
parent | 97fdea6c4393cf0102d7eee5790782509fb4f57b (diff) |
minor fixes to cubics code and overall alignment of how bounds and tops are computed for all curve types
All but 17 extended tests work.
A helper function is privately added to SkPath.h to permit a test to modify a given point in a path.
BUG=skia:3588
Review URL: https://codereview.chromium.org/1107353004
Diffstat (limited to 'src/pathops/SkPathOpsRect.cpp')
-rw-r--r-- | src/pathops/SkPathOpsRect.cpp | 61 |
1 files changed, 30 insertions, 31 deletions
diff --git a/src/pathops/SkPathOpsRect.cpp b/src/pathops/SkPathOpsRect.cpp index 540db16a0e..8c01153532 100644 --- a/src/pathops/SkPathOpsRect.cpp +++ b/src/pathops/SkPathOpsRect.cpp @@ -10,54 +10,53 @@ #include "SkPathOpsQuad.h" #include "SkPathOpsRect.h" -void SkDRect::setBounds(const SkDQuad& quad) { - set(quad[0]); - add(quad[2]); +void SkDRect::setBounds(const SkDQuad& curve, const SkDQuad& sub, double startT, double endT) { + set(sub[0]); + add(sub[2]); double tValues[2]; int roots = 0; - if (!between(quad[0].fX, quad[1].fX, quad[2].fX)) { - roots = SkDQuad::FindExtrema(quad[0].fX, quad[1].fX, quad[2].fX, tValues); + if (!sub.monotonicInX()) { + roots = SkDQuad::FindExtrema(&sub[0].fX, tValues); } - if (!between(quad[0].fY, quad[1].fY, quad[2].fY)) { - roots += SkDQuad::FindExtrema(quad[0].fY, quad[1].fY, quad[2].fY, &tValues[roots]); + if (!sub.monotonicInY()) { + roots += SkDQuad::FindExtrema(&sub[0].fY, &tValues[roots]); } - for (int x = 0; x < roots; ++x) { - add(quad.ptAtT(tValues[x])); + for (int index = 0; index < roots; ++index) { + double t = startT + (endT - startT) * tValues[index]; + add(curve.ptAtT(t)); } } -void SkDRect::setBounds(const SkDConic& conic) { - set(conic[0]); - add(conic[2]); +void SkDRect::setBounds(const SkDConic& curve, const SkDConic& sub, double startT, double endT) { + set(sub[0]); + add(sub[2]); double tValues[2]; int roots = 0; - if (!between(conic[0].fX, conic[1].fX, conic[2].fX)) { - roots = SkDConic::FindExtrema(&conic[0].fX, conic.fWeight, tValues); + if (!sub.monotonicInX()) { + roots = SkDConic::FindExtrema(&sub[0].fX, sub.fWeight, tValues); } - if (!between(conic[0].fY, conic[1].fY, conic[2].fY)) { - roots += SkDConic::FindExtrema(&conic[0].fY, conic.fWeight, &tValues[roots]); + if (!sub.monotonicInY()) { + roots += SkDConic::FindExtrema(&sub[0].fY, sub.fWeight, &tValues[roots]); } - for (int x = 0; x < roots; ++x) { - add(conic.ptAtT(tValues[x])); + for (int index = 0; index < roots; ++index) { + double t = startT + (endT - startT) * tValues[index]; + add(curve.ptAtT(t)); } } -static bool is_bounded_by_end_points(double a, double b, double c, double d) { - return between(a, b, d) && between(a, c, d); -} - -void SkDRect::setBounds(const SkDCubic& c) { - set(c[0]); - add(c[3]); +void SkDRect::setBounds(const SkDCubic& curve, const SkDCubic& sub, double startT, double endT) { + set(sub[0]); + add(sub[3]); double tValues[4]; int roots = 0; - if (!is_bounded_by_end_points(c[0].fX, c[1].fX, c[2].fX, c[3].fX)) { - roots = SkDCubic::FindExtrema(c[0].fX, c[1].fX, c[2].fX, c[3].fX, tValues); + if (!sub.monotonicInX()) { + roots = SkDCubic::FindExtrema(&sub[0].fX, tValues); } - if (!is_bounded_by_end_points(c[0].fY, c[1].fY, c[2].fY, c[3].fY)) { - roots += SkDCubic::FindExtrema(c[0].fY, c[1].fY, c[2].fY, c[3].fY, &tValues[roots]); + if (!sub.monotonicInY()) { + roots += SkDCubic::FindExtrema(&sub[0].fY, &tValues[roots]); } - for (int x = 0; x < roots; ++x) { - add(c.ptAtT(tValues[x])); + for (int index = 0; index < roots; ++index) { + double t = startT + (endT - startT) * tValues[index]; + add(curve.ptAtT(t)); } } |