| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 Google Inc. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license that can be | 4 * Use of this source code is governed by a BSD-style license that can be |
| 5 * found in the LICENSE file. | 5 * found in the LICENSE file. |
| 6 */ | 6 */ |
| 7 | 7 |
| 8 #include "Test.h" | 8 #include "Test.h" |
| 9 #include "SkClipStack.h" | 9 #include "SkClipStack.h" |
| 10 #include "SkPath.h" | 10 #include "SkPath.h" |
| (...skipping 898 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 909 stack->clipEmpty(); | 909 stack->clipEmpty(); |
| 910 break; | 910 break; |
| 911 } | 911 } |
| 912 } | 912 } |
| 913 | 913 |
| 914 static void test_reduced_clip_stack(skiatest::Reporter* reporter) { | 914 static void test_reduced_clip_stack(skiatest::Reporter* reporter) { |
| 915 // We construct random clip stacks, reduce them, and then rasterize both ver
sions to verify that | 915 // We construct random clip stacks, reduce them, and then rasterize both ver
sions to verify that |
| 916 // they are equal. | 916 // they are equal. |
| 917 | 917 |
| 918 // All the clip elements will be contained within these bounds. | 918 // All the clip elements will be contained within these bounds. |
| 919 static const SkRect kBounds = SkRect::MakeWH(100, 100); | 919 static const SkIRect kIBounds = SkIRect::MakeWH(100, 100); |
| 920 static const SkRect kBounds = SkRect::Make(kIBounds); |
| 920 | 921 |
| 921 enum { | 922 enum { |
| 922 kNumTests = 250, | 923 kNumTests = 250, |
| 923 kMinElemsPerTest = 1, | 924 kMinElemsPerTest = 1, |
| 924 kMaxElemsPerTest = 50, | 925 kMaxElemsPerTest = 50, |
| 925 }; | 926 }; |
| 926 | 927 |
| 927 // min/max size of a clip element as a fraction of kBounds. | 928 // min/max size of a clip element as a fraction of kBounds. |
| 928 static const SkScalar kMinElemSizeFrac = SK_Scalar1 / 5; | 929 static const SkScalar kMinElemSizeFrac = SK_Scalar1 / 5; |
| 929 static const SkScalar kMaxElemSizeFrac = SK_Scalar1; | 930 static const SkScalar kMaxElemSizeFrac = SK_Scalar1; |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1008 | 1009 |
| 1009 // Get the reduced version of the stack. | 1010 // Get the reduced version of the stack. |
| 1010 SkRect queryBounds = kBounds; | 1011 SkRect queryBounds = kBounds; |
| 1011 queryBounds.outset(kBounds.width() / 2, kBounds.height() / 2); | 1012 queryBounds.outset(kBounds.width() / 2, kBounds.height() / 2); |
| 1012 const GrReducedClip reduced(stack, queryBounds); | 1013 const GrReducedClip reduced(stack, queryBounds); |
| 1013 | 1014 |
| 1014 REPORTER_ASSERT_MESSAGE(reporter, SkClipStack::kInvalidGenID != reduced.
genID(), | 1015 REPORTER_ASSERT_MESSAGE(reporter, SkClipStack::kInvalidGenID != reduced.
genID(), |
| 1015 testCase.c_str()); | 1016 testCase.c_str()); |
| 1016 | 1017 |
| 1017 if (!reduced.elements().isEmpty()) { | 1018 if (!reduced.elements().isEmpty()) { |
| 1019 REPORTER_ASSERT_MESSAGE(reporter, reduced.hasIBounds(), testCase.c_s
tr()); |
| 1018 SkRect stackBounds; | 1020 SkRect stackBounds; |
| 1019 SkClipStack::BoundsType stackBoundsType; | 1021 SkClipStack::BoundsType stackBoundsType; |
| 1020 stack.getBounds(&stackBounds, &stackBoundsType); | 1022 stack.getBounds(&stackBounds, &stackBoundsType); |
| 1021 if (SkClipStack::kNormal_BoundsType == stackBoundsType) { | 1023 if (SkClipStack::kNormal_BoundsType == stackBoundsType) { |
| 1022 // Unless GrReducedClip starts doing some heroic tightening of t
he clip bounds, this | 1024 // Unless GrReducedClip starts doing some heroic tightening of t
he clip bounds, this |
| 1023 // will be true since the stack bounds are completely contained
inside the query. | 1025 // will be true since the stack bounds are completely contained
inside the query. |
| 1024 REPORTER_ASSERT_MESSAGE(reporter, GrClip::IsInsideClip(reduced.i
Bounds(), stackBounds), | 1026 REPORTER_ASSERT_MESSAGE(reporter, GrClip::IsInsideClip(reduced.i
bounds(), stackBounds), |
| 1025 testCase.c_str()); | 1027 testCase.c_str()); |
| 1026 } | 1028 } |
| 1027 REPORTER_ASSERT_MESSAGE(reporter, reduced.requiresAA() == doAA, test
Case.c_str()); | 1029 REPORTER_ASSERT_MESSAGE(reporter, reduced.requiresAA() == doAA, test
Case.c_str()); |
| 1028 } | 1030 } |
| 1029 | 1031 |
| 1030 // Build a new clip stack based on the reduced clip elements | 1032 // Build a new clip stack based on the reduced clip elements |
| 1031 SkClipStack reducedStack; | 1033 SkClipStack reducedStack; |
| 1032 if (GrReducedClip::InitialState::kAllOut == reduced.initialState()) { | 1034 if (GrReducedClip::InitialState::kAllOut == reduced.initialState()) { |
| 1033 // whether the result is bounded or not, the whole plane should star
t outside the clip. | 1035 // whether the result is bounded or not, the whole plane should star
t outside the clip. |
| 1034 reducedStack.clipEmpty(); | 1036 reducedStack.clipEmpty(); |
| 1035 } | 1037 } |
| 1036 for (ElementList::Iter iter(reduced.elements()); iter.get(); iter.next()
) { | 1038 for (ElementList::Iter iter(reduced.elements()); iter.get(); iter.next()
) { |
| 1037 add_elem_to_stack(*iter.get(), &reducedStack); | 1039 add_elem_to_stack(*iter.get(), &reducedStack); |
| 1038 } | 1040 } |
| 1039 | 1041 |
| 1042 SkIRect ibounds = reduced.hasIBounds() ? reduced.ibounds() : kIBounds; |
| 1043 |
| 1040 // GrReducedClipStack assumes that the final result is clipped to the re
turned bounds | 1044 // GrReducedClipStack assumes that the final result is clipped to the re
turned bounds |
| 1041 reducedStack.clipDevRect(reduced.iBounds(), SkRegion::kIntersect_Op); | 1045 reducedStack.clipDevRect(ibounds, SkRegion::kIntersect_Op); |
| 1042 stack.clipDevRect(reduced.iBounds(), SkRegion::kIntersect_Op); | 1046 stack.clipDevRect(ibounds, SkRegion::kIntersect_Op); |
| 1043 | 1047 |
| 1044 // convert both the original stack and reduced stack to SkRegions and se
e if they're equal | 1048 // convert both the original stack and reduced stack to SkRegions and se
e if they're equal |
| 1045 SkRegion region; | 1049 SkRegion region; |
| 1046 set_region_to_stack(stack, reduced.iBounds(), ®ion); | 1050 set_region_to_stack(stack, ibounds, ®ion); |
| 1047 | 1051 |
| 1048 SkRegion reducedRegion; | 1052 SkRegion reducedRegion; |
| 1049 set_region_to_stack(reducedStack, reduced.iBounds(), &reducedRegion); | 1053 set_region_to_stack(reducedStack, ibounds, &reducedRegion); |
| 1050 | 1054 |
| 1051 REPORTER_ASSERT_MESSAGE(reporter, region == reducedRegion, testCase.c_st
r()); | 1055 REPORTER_ASSERT_MESSAGE(reporter, region == reducedRegion, testCase.c_st
r()); |
| 1052 } | 1056 } |
| 1053 } | 1057 } |
| 1054 | 1058 |
| 1055 #ifdef SK_BUILD_FOR_WIN | 1059 #ifdef SK_BUILD_FOR_WIN |
| 1056 #define SUPPRESS_VISIBILITY_WARNING | 1060 #define SUPPRESS_VISIBILITY_WARNING |
| 1057 #else | 1061 #else |
| 1058 #define SUPPRESS_VISIBILITY_WARNING __attribute__((visibility("hidden"))) | 1062 #define SUPPRESS_VISIBILITY_WARNING __attribute__((visibility("hidden"))) |
| 1059 #endif | 1063 #endif |
| (...skipping 84 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1144 #undef IXYWH | 1148 #undef IXYWH |
| 1145 | 1149 |
| 1146 for (size_t i = 0; i < SK_ARRAY_COUNT(testCases); ++i) { | 1150 for (size_t i = 0; i < SK_ARRAY_COUNT(testCases); ++i) { |
| 1147 const GrReducedClip reduced(stack, testCases[i].testBounds); | 1151 const GrReducedClip reduced(stack, testCases[i].testBounds); |
| 1148 REPORTER_ASSERT(reporter, reduced.elements().count() == testCases[i]
.reducedClipCount); | 1152 REPORTER_ASSERT(reporter, reduced.elements().count() == testCases[i]
.reducedClipCount); |
| 1149 SkASSERT(reduced.elements().count() == testCases[i].reducedClipCount
); | 1153 SkASSERT(reduced.elements().count() == testCases[i].reducedClipCount
); |
| 1150 REPORTER_ASSERT(reporter, reduced.genID() == testCases[i].reducedGen
ID); | 1154 REPORTER_ASSERT(reporter, reduced.genID() == testCases[i].reducedGen
ID); |
| 1151 SkASSERT(reduced.genID() == testCases[i].reducedGenID); | 1155 SkASSERT(reduced.genID() == testCases[i].reducedGenID); |
| 1152 REPORTER_ASSERT(reporter, reduced.initialState() == testCases[i].ini
tialState); | 1156 REPORTER_ASSERT(reporter, reduced.initialState() == testCases[i].ini
tialState); |
| 1153 SkASSERT(reduced.initialState() == testCases[i].initialState); | 1157 SkASSERT(reduced.initialState() == testCases[i].initialState); |
| 1154 REPORTER_ASSERT(reporter, reduced.iBounds() == testCases[i].clipIRec
t); | 1158 REPORTER_ASSERT(reporter, reduced.hasIBounds()); |
| 1155 SkASSERT(reduced.iBounds() == testCases[i].clipIRect); | 1159 SkASSERT(reduced.hasIBounds()); |
| 1160 REPORTER_ASSERT(reporter, reduced.ibounds() == testCases[i].clipIRec
t); |
| 1161 SkASSERT(reduced.ibounds() == testCases[i].clipIRect); |
| 1156 } | 1162 } |
| 1157 } | 1163 } |
| 1158 } | 1164 } |
| 1159 | 1165 |
| 1160 static void test_reduced_clip_stack_no_aa_crash(skiatest::Reporter* reporter) { | 1166 static void test_reduced_clip_stack_no_aa_crash(skiatest::Reporter* reporter) { |
| 1161 SkClipStack stack; | 1167 SkClipStack stack; |
| 1162 stack.clipDevRect(SkIRect::MakeXYWH(0, 0, 100, 100), SkRegion::kReplace_Op); | 1168 stack.clipDevRect(SkIRect::MakeXYWH(0, 0, 100, 100), SkRegion::kReplace_Op); |
| 1163 stack.clipDevRect(SkIRect::MakeXYWH(0, 0, 50, 50), SkRegion::kReplace_Op); | 1169 stack.clipDevRect(SkIRect::MakeXYWH(0, 0, 50, 50), SkRegion::kReplace_Op); |
| 1164 SkRect bounds = SkRect::MakeXYWH(0, 0, 100, 100); | 1170 SkRect bounds = SkRect::MakeXYWH(0, 0, 100, 100); |
| 1165 | 1171 |
| (...skipping 24 matching lines...) Expand all Loading... |
| 1190 switch (expectedMethod) { | 1196 switch (expectedMethod) { |
| 1191 case ClipMethod::kSkipDraw: | 1197 case ClipMethod::kSkipDraw: |
| 1192 SkASSERT(0 == numExpectedElems); | 1198 SkASSERT(0 == numExpectedElems); |
| 1193 REPORTER_ASSERT_MESSAGE(reporter, reduced.elements().isEmpty(), test
Name.c_str()); | 1199 REPORTER_ASSERT_MESSAGE(reporter, reduced.elements().isEmpty(), test
Name.c_str()); |
| 1194 REPORTER_ASSERT_MESSAGE(reporter, | 1200 REPORTER_ASSERT_MESSAGE(reporter, |
| 1195 GrReducedClip::InitialState::kAllOut == redu
ced.initialState(), | 1201 GrReducedClip::InitialState::kAllOut == redu
ced.initialState(), |
| 1196 testName.c_str()); | 1202 testName.c_str()); |
| 1197 return; | 1203 return; |
| 1198 case ClipMethod::kIgnoreClip: | 1204 case ClipMethod::kIgnoreClip: |
| 1199 SkASSERT(0 == numExpectedElems); | 1205 SkASSERT(0 == numExpectedElems); |
| 1200 REPORTER_ASSERT_MESSAGE(reporter, GrClip::IsInsideClip(reduced.iBoun
ds(), queryBounds), | 1206 REPORTER_ASSERT_MESSAGE(reporter, |
| 1207 !reduced.hasIBounds() || |
| 1208 GrClip::IsInsideClip(reduced.ibounds(), quer
yBounds), |
| 1201 testName.c_str()); | 1209 testName.c_str()); |
| 1202 REPORTER_ASSERT_MESSAGE(reporter, reduced.elements().isEmpty(), test
Name.c_str()); | 1210 REPORTER_ASSERT_MESSAGE(reporter, reduced.elements().isEmpty(), test
Name.c_str()); |
| 1203 REPORTER_ASSERT_MESSAGE(reporter, | 1211 REPORTER_ASSERT_MESSAGE(reporter, |
| 1204 GrReducedClip::InitialState::kAllIn == reduc
ed.initialState(), | 1212 GrReducedClip::InitialState::kAllIn == reduc
ed.initialState(), |
| 1205 testName.c_str()); | 1213 testName.c_str()); |
| 1206 return; | 1214 return; |
| 1207 case ClipMethod::kScissor: { | 1215 case ClipMethod::kScissor: { |
| 1208 SkASSERT(SkClipStack::kNormal_BoundsType == stackBoundsType); | 1216 SkASSERT(SkClipStack::kNormal_BoundsType == stackBoundsType); |
| 1209 SkASSERT(0 == numExpectedElems); | 1217 SkASSERT(0 == numExpectedElems); |
| 1210 SkIRect expectedScissor; | 1218 SkIRect expectedScissor; |
| 1211 stackBounds.round(&expectedScissor); | 1219 stackBounds.round(&expectedScissor); |
| 1212 REPORTER_ASSERT_MESSAGE(reporter, reduced.elements().isEmpty(), test
Name.c_str()); | 1220 REPORTER_ASSERT_MESSAGE(reporter, reduced.elements().isEmpty(), test
Name.c_str()); |
| 1213 REPORTER_ASSERT_MESSAGE(reporter, expectedScissor == reduced.iBounds
(), | 1221 REPORTER_ASSERT_MESSAGE(reporter, reduced.hasIBounds(), testName.c_s
tr()); |
| 1222 REPORTER_ASSERT_MESSAGE(reporter, expectedScissor == reduced.ibounds
(), |
| 1214 testName.c_str()); | 1223 testName.c_str()); |
| 1215 REPORTER_ASSERT_MESSAGE(reporter, | 1224 REPORTER_ASSERT_MESSAGE(reporter, |
| 1216 GrReducedClip::InitialState::kAllIn == reduc
ed.initialState(), | 1225 GrReducedClip::InitialState::kAllIn == reduc
ed.initialState(), |
| 1217 testName.c_str()); | 1226 testName.c_str()); |
| 1218 return; | 1227 return; |
| 1219 } | 1228 } |
| 1220 case ClipMethod::kAAElements: { | 1229 case ClipMethod::kAAElements: { |
| 1221 SkIRect expectedClipIBounds = GrClip::GetPixelIBounds(queryBounds); | 1230 SkIRect expectedClipIBounds = GrClip::GetPixelIBounds(queryBounds); |
| 1222 if (SkClipStack::kNormal_BoundsType == stackBoundsType) { | 1231 if (SkClipStack::kNormal_BoundsType == stackBoundsType) { |
| 1223 SkAssertResult(expectedClipIBounds.intersect(GrClip::GetPixelIBo
unds(stackBounds))); | 1232 SkAssertResult(expectedClipIBounds.intersect(GrClip::GetPixelIBo
unds(stackBounds))); |
| 1224 } | 1233 } |
| 1225 REPORTER_ASSERT_MESSAGE(reporter, numExpectedElems == reduced.elemen
ts().count(), | 1234 REPORTER_ASSERT_MESSAGE(reporter, numExpectedElems == reduced.elemen
ts().count(), |
| 1226 testName.c_str()); | 1235 testName.c_str()); |
| 1227 REPORTER_ASSERT_MESSAGE(reporter, expectedClipIBounds == reduced.iBo
unds(), | 1236 REPORTER_ASSERT_MESSAGE(reporter, reduced.hasIBounds(), testName.c_s
tr()); |
| 1237 REPORTER_ASSERT_MESSAGE(reporter, expectedClipIBounds == reduced.ibo
unds(), |
| 1228 testName.c_str()); | 1238 testName.c_str()); |
| 1229 REPORTER_ASSERT_MESSAGE(reporter, reduced.requiresAA() == !reduced.e
lements().isEmpty(), | 1239 REPORTER_ASSERT_MESSAGE(reporter, reduced.requiresAA() == !reduced.e
lements().isEmpty(), |
| 1230 testName.c_str()); | 1240 testName.c_str()); |
| 1231 break; | 1241 break; |
| 1232 } | 1242 } |
| 1233 } | 1243 } |
| 1234 } | 1244 } |
| 1235 | 1245 |
| 1236 static void test_reduced_clip_stack_aa(skiatest::Reporter* reporter) { | 1246 static void test_reduced_clip_stack_aa(skiatest::Reporter* reporter) { |
| 1237 constexpr SkScalar IL = 2, IT = 1, IR = 6, IB = 7; // Pixel aligned
rect. | 1247 constexpr SkScalar IL = 2, IT = 1, IR = 6, IB = 7; // Pixel aligned
rect. |
| (...skipping 128 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1366 test_path_replace(reporter); | 1376 test_path_replace(reporter); |
| 1367 test_quickContains(reporter); | 1377 test_quickContains(reporter); |
| 1368 test_invfill_diff_bug(reporter); | 1378 test_invfill_diff_bug(reporter); |
| 1369 #if SK_SUPPORT_GPU | 1379 #if SK_SUPPORT_GPU |
| 1370 test_reduced_clip_stack(reporter); | 1380 test_reduced_clip_stack(reporter); |
| 1371 test_reduced_clip_stack_genid(reporter); | 1381 test_reduced_clip_stack_genid(reporter); |
| 1372 test_reduced_clip_stack_no_aa_crash(reporter); | 1382 test_reduced_clip_stack_no_aa_crash(reporter); |
| 1373 test_reduced_clip_stack_aa(reporter); | 1383 test_reduced_clip_stack_aa(reporter); |
| 1374 #endif | 1384 #endif |
| 1375 } | 1385 } |
| OLD | NEW |