| Index: tests/ClipStackTest.cpp
 | 
| diff --git a/tests/ClipStackTest.cpp b/tests/ClipStackTest.cpp
 | 
| index 27753c44f4011187c6289a9f10477e55a7a7efa8..4d375ee8bcc41fd8a6a344d8088b3f8033147afd 100644
 | 
| --- a/tests/ClipStackTest.cpp
 | 
| +++ b/tests/ClipStackTest.cpp
 | 
| @@ -794,6 +794,51 @@ static void test_quickContains(skiatest::Reporter* reporter) {
 | 
|      }
 | 
|  }
 | 
|  
 | 
| +static void set_region_to_stack(const SkClipStack& stack, const SkIRect& bounds, SkRegion* region) {
 | 
| +    region->setRect(bounds);
 | 
| +    SkClipStack::Iter iter(stack, SkClipStack::Iter::kBottom_IterStart);
 | 
| +    while (const SkClipStack::Element *element = iter.next()) {
 | 
| +        SkRegion elemRegion;
 | 
| +        SkRegion boundsRgn(bounds);
 | 
| +        SkPath path;
 | 
| +
 | 
| +        switch (element->getType()) {
 | 
| +            case SkClipStack::Element::kEmpty_Type:
 | 
| +                elemRegion.setEmpty();
 | 
| +                break;
 | 
| +            default:
 | 
| +                element->asPath(&path);
 | 
| +                elemRegion.setPath(path, boundsRgn);
 | 
| +                break;
 | 
| +        }
 | 
| +        region->op(elemRegion, element->getOp());
 | 
| +    }
 | 
| +}
 | 
| +
 | 
| +static void test_invfill_diff_bug(skiatest::Reporter* reporter) {
 | 
| +    SkClipStack stack;
 | 
| +    stack.clipDevRect({10, 10, 20, 20}, SkRegion::kIntersect_Op, false);
 | 
| +
 | 
| +    SkPath path;
 | 
| +    path.addRect({30, 10, 40, 20});
 | 
| +    path.setFillType(SkPath::kInverseWinding_FillType);
 | 
| +    stack.clipDevPath(path, SkRegion::kDifference_Op, false);
 | 
| +
 | 
| +    REPORTER_ASSERT(reporter, SkClipStack::kEmptyGenID == stack.getTopmostGenID());
 | 
| +
 | 
| +    SkRect stackBounds;
 | 
| +    SkClipStack::BoundsType stackBoundsType;
 | 
| +    stack.getBounds(&stackBounds, &stackBoundsType);
 | 
| +
 | 
| +    REPORTER_ASSERT(reporter, stackBounds.isEmpty());
 | 
| +    REPORTER_ASSERT(reporter, SkClipStack::kNormal_BoundsType == stackBoundsType);
 | 
| +
 | 
| +    SkRegion region;
 | 
| +    set_region_to_stack(stack, {0, 0, 50, 30}, ®ion);
 | 
| +
 | 
| +    REPORTER_ASSERT(reporter, region.isEmpty());
 | 
| +}
 | 
| +
 | 
|  ///////////////////////////////////////////////////////////////////////////////////////////////////
 | 
|  
 | 
|  #if SK_SUPPORT_GPU
 | 
| @@ -859,25 +904,6 @@ static void add_elem_to_stack(const SkClipStack::Element& element, SkClipStack*
 | 
|      }
 | 
|  }
 | 
|  
 | 
| -static void add_elem_to_region(const SkClipStack::Element& element,
 | 
| -                               const SkIRect& bounds,
 | 
| -                               SkRegion* region) {
 | 
| -    SkRegion elemRegion;
 | 
| -    SkRegion boundsRgn(bounds);
 | 
| -    SkPath path;
 | 
| -
 | 
| -    switch (element.getType()) {
 | 
| -        case SkClipStack::Element::kEmpty_Type:
 | 
| -            elemRegion.setEmpty();
 | 
| -            break;
 | 
| -        default:
 | 
| -            element.asPath(&path);
 | 
| -            elemRegion.setPath(path, boundsRgn);
 | 
| -            break;
 | 
| -    }
 | 
| -    region->op(elemRegion, element.getOp());
 | 
| -}
 | 
| -
 | 
|  static void test_reduced_clip_stack(skiatest::Reporter* reporter) {
 | 
|      // We construct random clip stacks, reduce them, and then rasterize both versions to verify that
 | 
|      // they are equal.
 | 
| @@ -991,20 +1017,11 @@ static void test_reduced_clip_stack(skiatest::Reporter* reporter) {
 | 
|  
 | 
|          // convert both the original stack and reduced stack to SkRegions and see if they're equal
 | 
|          SkRegion region;
 | 
| -        SkRegion reducedRegion;
 | 
| +        set_region_to_stack(stack, inflatedIBounds, ®ion);
 | 
|  
 | 
| -        region.setRect(inflatedIBounds);
 | 
| -        const SkClipStack::Element* element;
 | 
| -        SkClipStack::Iter iter(stack, SkClipStack::Iter::kBottom_IterStart);
 | 
| -        while ((element = iter.next())) {
 | 
| -            add_elem_to_region(*element, inflatedIBounds, ®ion);
 | 
| -        }
 | 
| +        SkRegion reducedRegion;
 | 
| +        set_region_to_stack(reducedStack, inflatedIBounds, &reducedRegion);
 | 
|  
 | 
| -        reducedRegion.setRect(inflatedIBounds);
 | 
| -        iter.reset(reducedStack, SkClipStack::Iter::kBottom_IterStart);
 | 
| -        while ((element = iter.next())) {
 | 
| -            add_elem_to_region(*element, inflatedIBounds, &reducedRegion);
 | 
| -        }
 | 
|          SkString testCase;
 | 
|          testCase.printf("Iteration %d", i);
 | 
|          REPORTER_ASSERT_MESSAGE(reporter, region == reducedRegion, testCase.c_str());
 | 
| @@ -1204,6 +1221,7 @@ DEF_TEST(ClipStack, reporter) {
 | 
|      test_rect_inverse_fill(reporter);
 | 
|      test_path_replace(reporter);
 | 
|      test_quickContains(reporter);
 | 
| +    test_invfill_diff_bug(reporter);
 | 
|  #if SK_SUPPORT_GPU
 | 
|      test_reduced_clip_stack(reporter);
 | 
|      test_reduced_clip_stack_genid(reporter);
 | 
| 
 |