| Index: src/pathops/SkPathOpsRect.cpp | 
| diff --git a/src/pathops/SkPathOpsRect.cpp b/src/pathops/SkPathOpsRect.cpp | 
| index 540db16a0ee0d1f3a4ba89ed7d23000058e348ff..8c0115353298c039ee9ac1de2e41457764a8fd42 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)); | 
| } | 
| } | 
|  |