Index: tests/ClipStackTest.cpp |
diff --git a/tests/ClipStackTest.cpp b/tests/ClipStackTest.cpp |
index 5265ac2c670a97c06f9044339020b90ec1196d7c..394835b369a53c36e4a886d1eed4b94eb8657cf3 100644 |
--- a/tests/ClipStackTest.cpp |
+++ b/tests/ClipStackTest.cpp |
@@ -1007,39 +1007,48 @@ static void test_reduced_clip_stack(skiatest::Reporter* reporter) { |
} |
} |
+ // Zero the memory we will new the GrReducedClip into. This ensures the elements gen ID |
+ // will be kInvalidGenID if left uninitialized. |
+ SkAlignedSTStorage<1, GrReducedClip> storage; |
+ memset(storage.get(), 0, sizeof(GrReducedClip)); |
+ GR_STATIC_ASSERT(0 == SkClipStack::kInvalidGenID); |
+ |
// Get the reduced version of the stack. |
SkRect queryBounds = kBounds; |
queryBounds.outset(kBounds.width() / 2, kBounds.height() / 2); |
- const GrReducedClip reduced(stack, queryBounds); |
+ const GrReducedClip* reduced = new (storage.get()) GrReducedClip(stack, queryBounds); |
- REPORTER_ASSERT_MESSAGE(reporter, SkClipStack::kInvalidGenID != reduced.genID(), |
+ REPORTER_ASSERT_MESSAGE(reporter, |
+ reduced->elements().isEmpty() || |
+ SkClipStack::kInvalidGenID != reduced->elementsGenID(), |
testCase.c_str()); |
- if (!reduced.elements().isEmpty()) { |
- REPORTER_ASSERT_MESSAGE(reporter, reduced.hasIBounds(), testCase.c_str()); |
+ if (!reduced->elements().isEmpty()) { |
+ REPORTER_ASSERT_MESSAGE(reporter, reduced->hasIBounds(), testCase.c_str()); |
SkRect stackBounds; |
SkClipStack::BoundsType stackBoundsType; |
stack.getBounds(&stackBounds, &stackBoundsType); |
if (SkClipStack::kNormal_BoundsType == stackBoundsType) { |
// Unless GrReducedClip starts doing some heroic tightening of the clip bounds, this |
// will be true since the stack bounds are completely contained inside the query. |
- REPORTER_ASSERT_MESSAGE(reporter, GrClip::IsInsideClip(reduced.ibounds(), stackBounds), |
+ REPORTER_ASSERT_MESSAGE(reporter, |
+ GrClip::IsInsideClip(reduced->ibounds(), stackBounds), |
testCase.c_str()); |
} |
- REPORTER_ASSERT_MESSAGE(reporter, reduced.requiresAA() == doAA, testCase.c_str()); |
+ REPORTER_ASSERT_MESSAGE(reporter, reduced->requiresAA() == doAA, testCase.c_str()); |
} |
// Build a new clip stack based on the reduced clip elements |
SkClipStack reducedStack; |
- if (GrReducedClip::InitialState::kAllOut == reduced.initialState()) { |
+ if (GrReducedClip::InitialState::kAllOut == reduced->initialState()) { |
// whether the result is bounded or not, the whole plane should start outside the clip. |
reducedStack.clipEmpty(); |
} |
- for (ElementList::Iter iter(reduced.elements()); iter.get(); iter.next()) { |
+ for (ElementList::Iter iter(reduced->elements()); iter.get(); iter.next()) { |
add_elem_to_stack(*iter.get(), &reducedStack); |
} |
- SkIRect ibounds = reduced.hasIBounds() ? reduced.ibounds() : kIBounds; |
+ SkIRect ibounds = reduced->hasIBounds() ? reduced->ibounds() : kIBounds; |
// GrReducedClipStack assumes that the final result is clipped to the returned bounds |
reducedStack.clipDevRect(ibounds, SkRegion::kIntersect_Op); |
@@ -1053,6 +1062,8 @@ static void test_reduced_clip_stack(skiatest::Reporter* reporter) { |
set_region_to_stack(reducedStack, ibounds, &reducedRegion); |
REPORTER_ASSERT_MESSAGE(reporter, region == reducedRegion, testCase.c_str()); |
+ |
+ reduced->~GrReducedClip(); |
} |
} |
@@ -1069,11 +1080,16 @@ static void test_reduced_clip_stack_genid(skiatest::Reporter* reporter) { |
stack.clipDevRect(SkRect::MakeXYWH(0, 0, SkScalar(50.3), SkScalar(50.3)), SkRegion::kReplace_Op, true); |
SkRect bounds = SkRect::MakeXYWH(0, 0, 100, 100); |
- const GrReducedClip reduced(stack, bounds); |
+ SkAlignedSTStorage<1, GrReducedClip> storage; |
+ memset(storage.get(), 0, sizeof(GrReducedClip)); |
+ GR_STATIC_ASSERT(0 == SkClipStack::kInvalidGenID); |
+ const GrReducedClip* reduced = new (storage.get()) GrReducedClip(stack, bounds); |
- REPORTER_ASSERT(reporter, reduced.elements().count() == 1); |
+ REPORTER_ASSERT(reporter, reduced->elements().count() == 1); |
// Clips will be cached based on the generation id. Make sure the gen id is valid. |
- REPORTER_ASSERT(reporter, SkClipStack::kInvalidGenID != reduced.genID()); |
+ REPORTER_ASSERT(reporter, SkClipStack::kInvalidGenID != reduced->elementsGenID()); |
+ |
+ reduced->~GrReducedClip(); |
} |
{ |
SkClipStack stack; |
@@ -1115,30 +1131,30 @@ static void test_reduced_clip_stack_genid(skiatest::Reporter* reporter) { |
} testCases[] = { |
// Rect A. |
- { XYWH(0, 0, 25, 25), 0, SkClipStack::kWideOpenGenID, GrReducedClip::InitialState::kAllIn, IXYWH(0, 0, 25, 25) }, |
- { XYWH(0.1f, 0.1f, 25.1f, 25.1f), 0, SkClipStack::kWideOpenGenID, GrReducedClip::InitialState::kAllIn, IXYWH(0, 0, 26, 26) }, |
+ { XYWH(0, 0, 25, 25), 0, SkClipStack::kInvalidGenID, GrReducedClip::InitialState::kAllIn, IXYWH(0, 0, 25, 25) }, |
+ { XYWH(0.1f, 0.1f, 25.1f, 25.1f), 0, SkClipStack::kInvalidGenID, GrReducedClip::InitialState::kAllIn, IXYWH(0, 0, 26, 26) }, |
{ XYWH(0, 0, 27, 27), 1, genIDA, GrReducedClip::InitialState::kAllOut, IXYWH(0, 0, 27, 27)}, |
// Rect B. |
- { XYWH(50, 0, 25, 25), 0, SkClipStack::kWideOpenGenID, GrReducedClip::InitialState::kAllIn, IXYWH(50, 0, 25, 25) }, |
- { XYWH(50, 0, 25.3f, 25.3f), 0, SkClipStack::kWideOpenGenID, GrReducedClip::InitialState::kAllIn, IXYWH(50, 0, 26, 26) }, |
+ { XYWH(50, 0, 25, 25), 0, SkClipStack::kInvalidGenID, GrReducedClip::InitialState::kAllIn, IXYWH(50, 0, 25, 25) }, |
+ { XYWH(50, 0, 25.3f, 25.3f), 0, SkClipStack::kInvalidGenID, GrReducedClip::InitialState::kAllIn, IXYWH(50, 0, 26, 26) }, |
{ XYWH(50, 0, 27, 27), 1, genIDB, GrReducedClip::InitialState::kAllOut, IXYWH(50, 0, 26, 27) }, |
// Rect C. |
- { XYWH(0, 50, 25, 25), 0, SkClipStack::kWideOpenGenID, GrReducedClip::InitialState::kAllIn, IXYWH(0, 50, 25, 25) }, |
- { XYWH(0.2f, 50.1f, 25.1f, 25.2f), 0, SkClipStack::kWideOpenGenID, GrReducedClip::InitialState::kAllIn, IXYWH(0, 50, 26, 26) }, |
+ { XYWH(0, 50, 25, 25), 0, SkClipStack::kInvalidGenID, GrReducedClip::InitialState::kAllIn, IXYWH(0, 50, 25, 25) }, |
+ { XYWH(0.2f, 50.1f, 25.1f, 25.2f), 0, SkClipStack::kInvalidGenID, GrReducedClip::InitialState::kAllIn, IXYWH(0, 50, 26, 26) }, |
{ XYWH(0, 50, 27, 27), 1, genIDC, GrReducedClip::InitialState::kAllOut, IXYWH(0, 50, 27, 26) }, |
// Rect D. |
- { XYWH(50, 50, 25, 25), 0, SkClipStack::kWideOpenGenID, GrReducedClip::InitialState::kAllIn, IXYWH(50, 50, 25, 25)}, |
- { XYWH(50.3f, 50.3f, 25, 25), 0, SkClipStack::kWideOpenGenID, GrReducedClip::InitialState::kAllIn, IXYWH(50, 50, 26, 26)}, |
+ { XYWH(50, 50, 25, 25), 0, SkClipStack::kInvalidGenID, GrReducedClip::InitialState::kAllIn, IXYWH(50, 50, 25, 25)}, |
+ { XYWH(50.3f, 50.3f, 25, 25), 0, SkClipStack::kInvalidGenID, GrReducedClip::InitialState::kAllIn, IXYWH(50, 50, 26, 26)}, |
{ XYWH(50, 50, 27, 27), 1, genIDD, GrReducedClip::InitialState::kAllOut, IXYWH(50, 50, 26, 26)}, |
// Other tests: |
{ XYWH(0, 0, 100, 100), 4, genIDD, GrReducedClip::InitialState::kAllOut, stackBounds }, |
// Rect in the middle, touches none. |
- { XYWH(26, 26, 24, 24), 0, SkClipStack::kEmptyGenID, GrReducedClip::InitialState::kAllOut, IXYWH(26, 26, 24, 24) }, |
+ { XYWH(26, 26, 24, 24), 0, SkClipStack::kInvalidGenID, GrReducedClip::InitialState::kAllOut, IXYWH(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::InitialState::kAllOut, IXYWH(24, 24, 27, 27) }, |
@@ -1151,8 +1167,10 @@ static void test_reduced_clip_stack_genid(skiatest::Reporter* reporter) { |
const GrReducedClip reduced(stack, testCases[i].testBounds); |
REPORTER_ASSERT(reporter, reduced.elements().count() == testCases[i].reducedClipCount); |
SkASSERT(reduced.elements().count() == testCases[i].reducedClipCount); |
- REPORTER_ASSERT(reporter, reduced.genID() == testCases[i].reducedGenID); |
- SkASSERT(reduced.genID() == testCases[i].reducedGenID); |
+ if (reduced.elements().count()) { |
+ REPORTER_ASSERT(reporter, reduced.elementsGenID() == testCases[i].reducedGenID); |
+ SkASSERT(reduced.elementsGenID() == testCases[i].reducedGenID); |
+ } |
REPORTER_ASSERT(reporter, reduced.initialState() == testCases[i].initialState); |
SkASSERT(reduced.initialState() == testCases[i].initialState); |
REPORTER_ASSERT(reporter, reduced.hasIBounds()); |