}
}
}
- if (requiresAA) {
- *requiresAA = numAAElements > 0;
- }
+ *requiresAA = numAAElements > 0;
if (0 == result->count()) {
if (*initialState == GrReducedClip::kAllIn_InitialState) {
InitialState* initialState,
SkIRect* tighterBounds,
bool* requiresAA) {
+ SkASSERT(tighterBounds);
+ SkASSERT(requiresAA);
result->reset();
// The clip established by the element list might be cached based on the last
SkRect isectRect;
if (stackBounds.contains(scalarQueryBounds)) {
*initialState = GrReducedClip::kAllIn_InitialState;
- if (tighterBounds) {
- *tighterBounds = queryBounds;
- }
- if (requiresAA) {
- *requiresAA = false;
- }
+ *tighterBounds = queryBounds;
+ *requiresAA = false;
} else if (isectRect.intersect(stackBounds, scalarQueryBounds)) {
// If the caller asked for tighter integer bounds we may be able to
// return kAllIn and give the bounds with no elements
- if (tighterBounds) {
- isectRect.roundOut(tighterBounds);
- SkRect scalarTighterBounds = SkRect::Make(*tighterBounds);
- if (scalarTighterBounds == isectRect) {
- // the round-out didn't add any area outside the clip rect.
- if (requiresAA) {
- *requiresAA = false;
- }
- *initialState = GrReducedClip::kAllIn_InitialState;
- return;
- }
+ isectRect.roundOut(tighterBounds);
+ SkRect scalarTighterBounds = SkRect::Make(*tighterBounds);
+ if (scalarTighterBounds == isectRect) {
+ // the round-out didn't add any area outside the clip rect.
+ *requiresAA = false;
+ *initialState = GrReducedClip::kAllIn_InitialState;
+ return;
}
*initialState = kAllOut_InitialState;
// iior should only be true if aa/non-aa status matches among all elements.
SkClipStack::Iter iter(stack, SkClipStack::Iter::kTop_IterStart);
bool doAA = iter.prev()->isAA();
result->addToHead(isectRect, SkRegion::kReplace_Op, doAA);
- if (requiresAA) {
- *requiresAA = doAA;
- }
+ *requiresAA = doAA;
} else {
*initialState = kAllOut_InitialState;
- if (requiresAA) {
- *requiresAA = false;
- }
+ *requiresAA = false;
}
return;
} else {
if (SkClipStack::kNormal_BoundsType == stackBoundsType) {
if (!SkRect::Intersects(stackBounds, scalarQueryBounds)) {
*initialState = kAllOut_InitialState;
- if (requiresAA) {
- *requiresAA = false;
- }
+ *requiresAA = false;
return;
}
- if (tighterBounds) {
- SkIRect stackIBounds;
- stackBounds.roundOut(&stackIBounds);
- if (!tighterBounds->intersect(queryBounds, stackIBounds)) {
- SkASSERT(0);
- tighterBounds->setEmpty();
- }
- bounds = tighterBounds;
+ SkIRect stackIBounds;
+ stackBounds.roundOut(&stackIBounds);
+ if (!tighterBounds->intersect(queryBounds, stackIBounds)) {
+ SkASSERT(0);
+ tighterBounds->setEmpty();
}
+ bounds = tighterBounds;
} else {
if (stackBounds.contains(scalarQueryBounds)) {
*initialState = kAllOut_InitialState;
// but we don't know that *all* the pixels in the box are outside the clip. So
// proceed to walking the stack.
}
- if (tighterBounds) {
- *tighterBounds = queryBounds;
- }
+ *tighterBounds = queryBounds;
}
}
ElementList reducedClips;
int32_t reducedGenID;
GrReducedClip::InitialState initial;
- SkIRect tBounds(inflatedIBounds);
- SkIRect* tightBounds = r.nextBool() ? &tBounds : nullptr;
+ SkIRect tighterBounds;
+ bool requiresAA;
GrReducedClip::ReduceClipStack(stack,
inflatedIBounds,
&reducedClips,
&reducedGenID,
&initial,
- tightBounds);
+ &tighterBounds,
+ &requiresAA);
REPORTER_ASSERT(reporter, SkClipStack::kInvalidGenID != reducedGenID);
}
// GrReducedClipStack assumes that the final result is clipped to the returned bounds
- if (tightBounds) {
- reducedStack.clipDevRect(*tightBounds, SkRegion::kIntersect_Op);
- }
+ reducedStack.clipDevRect(tighterBounds, SkRegion::kIntersect_Op);
+ stack.clipDevRect(tighterBounds, SkRegion::kIntersect_Op);
// convert both the original stack and reduced stack to SkRegions and see if they're equal
SkRegion region;
int32_t reducedGenID;
GrReducedClip::InitialState initial;
SkIRect tightBounds;
+ bool requiresAA;
GrReducedClip::ReduceClipStack(stack,
inflatedIBounds,
&reducedClips,
&reducedGenID,
&initial,
- &tightBounds);
+ &tightBounds,
+ &requiresAA);
REPORTER_ASSERT(reporter, reducedClips.count() == 1);
// Clips will be cached based on the generation id. Make sure the gen id is valid.
#define XYWH SkIRect::MakeXYWH
- SkIRect unused;
- unused.setEmpty();
SkIRect stackBounds = XYWH(0, 0, 76, 76);
// The base test is to test each rect in two ways:
} testCases[] = {
// Rect A.
{ XYWH(0, 0, 25, 25), 0, SkClipStack::kWideOpenGenID, GrReducedClip::kAllIn_InitialState, XYWH(0, 0, 25, 25) },
- { XYWH(0, 0, 25, 25), 0, SkClipStack::kWideOpenGenID, GrReducedClip::kAllIn_InitialState, unused },
{ XYWH(0, 0, 27, 27), 1, genIDA, GrReducedClip::kAllOut_InitialState, XYWH(0, 0, 27, 27)},
- { XYWH(0, 0, 27, 27), 1, genIDA, GrReducedClip::kAllOut_InitialState, unused },
// Rect B.
{ XYWH(50, 0, 25, 25), 0, SkClipStack::kWideOpenGenID, GrReducedClip::kAllIn_InitialState, XYWH(50, 0, 25, 25) },
- { XYWH(50, 0, 25, 25), 0, SkClipStack::kWideOpenGenID, GrReducedClip::kAllIn_InitialState, unused },
{ XYWH(50, 0, 27, 27), 1, genIDB, GrReducedClip::kAllOut_InitialState, XYWH(50, 0, 26, 27) },
- { XYWH(50, 0, 27, 27), 1, genIDB, GrReducedClip::kAllOut_InitialState, unused },
// Rect C.
{ XYWH(0, 50, 25, 25), 0, SkClipStack::kWideOpenGenID, GrReducedClip::kAllIn_InitialState, XYWH(0, 50, 25, 25) },
- { XYWH(0, 50, 25, 25), 0, SkClipStack::kWideOpenGenID, GrReducedClip::kAllIn_InitialState, unused },
{ XYWH(0, 50, 27, 27), 1, genIDC, GrReducedClip::kAllOut_InitialState, XYWH(0, 50, 27, 26) },
- { XYWH(0, 50, 27, 27), 1, genIDC, GrReducedClip::kAllOut_InitialState, unused },
// Rect D.
- { XYWH(50, 50, 25, 25), 0, SkClipStack::kWideOpenGenID, GrReducedClip::kAllIn_InitialState, unused },
{ XYWH(50, 50, 25, 25), 0, SkClipStack::kWideOpenGenID, GrReducedClip::kAllIn_InitialState, XYWH(50, 50, 25, 25)},
- { XYWH(50, 50, 27, 27), 1, genIDD, GrReducedClip::kAllOut_InitialState, unused },
{ XYWH(50, 50, 27, 27), 1, genIDD, GrReducedClip::kAllOut_InitialState, XYWH(50, 50, 26, 26)},
// Other tests:
- { XYWH(0, 0, 100, 100), 4, genIDD, GrReducedClip::kAllOut_InitialState, unused },
{ XYWH(0, 0, 100, 100), 4, genIDD, GrReducedClip::kAllOut_InitialState, stackBounds },
// Rect in the middle, touches none.
- { XYWH(26, 26, 24, 24), 0, SkClipStack::kEmptyGenID, GrReducedClip::kAllOut_InitialState, unused },
{ XYWH(26, 26, 24, 24), 0, SkClipStack::kEmptyGenID, GrReducedClip::kAllOut_InitialState, XYWH(26, 26, 24, 24) },
// Rect in the middle, touches all the rects. GenID is the last rect.
- { XYWH(24, 24, 27, 27), 4, genIDD, GrReducedClip::kAllOut_InitialState, unused },
{ XYWH(24, 24, 27, 27), 4, genIDD, GrReducedClip::kAllOut_InitialState, XYWH(24, 24, 27, 27) },
};
int32_t reducedGenID;
GrReducedClip::InitialState initial;
SkIRect tightBounds;
+ bool requiresAA;
GrReducedClip::ReduceClipStack(stack,
testCases[i].testBounds,
&reducedClips,
&reducedGenID,
&initial,
- testCases[i].tighterBounds.isEmpty() ? nullptr : &tightBounds);
+ &tightBounds,
+ &requiresAA);
REPORTER_ASSERT(reporter, reducedClips.count() == testCases[i].reducedClipCount);
SkASSERT(reducedClips.count() == testCases[i].reducedClipCount);
SkASSERT(reducedGenID == testCases[i].reducedGenID);
REPORTER_ASSERT(reporter, initial == testCases[i].initialState);
SkASSERT(initial == testCases[i].initialState);
- if (!testCases[i].tighterBounds.isEmpty()) {
- REPORTER_ASSERT(reporter, tightBounds == testCases[i].tighterBounds);
- SkASSERT(tightBounds == testCases[i].tighterBounds);
- }
+ REPORTER_ASSERT(reporter, tightBounds == testCases[i].tighterBounds);
+ SkASSERT(tightBounds == testCases[i].tighterBounds);
}
}
}
int32_t reducedGenID;
GrReducedClip::InitialState initial;
SkIRect tightBounds;
+ bool requiresAA;
// At the time, this would crash.
GrReducedClip::ReduceClipStack(stack,
&reducedClips,
&reducedGenID,
&initial,
- &tightBounds);
+ &tightBounds,
+ &requiresAA);
REPORTER_ASSERT(reporter, 0 == reducedClips.count());
}