OLD | NEW |
1 /* | 1 /* |
2 * Copyright 2016 Google Inc. | 2 * Copyright 2016 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 <initializer_list> | 8 #include <initializer_list> |
9 #include <functional> | 9 #include <functional> |
10 #include "Test.h" | 10 #include "Test.h" |
(...skipping 874 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
885 peStroke.setStrokeWidth(2.f); | 885 peStroke.setStrokeWidth(2.f); |
886 peStroke.setStyle(SkPaint::kStroke_Style); | 886 peStroke.setStyle(SkPaint::kStroke_Style); |
887 TestCase geoPEStrokeCase(geo, peStroke, reporter); | 887 TestCase geoPEStrokeCase(geo, peStroke, reporter); |
888 REPORTER_ASSERT(reporter, geoPEStrokeCase.appliedFullStyleKey() == emptyKey)
; | 888 REPORTER_ASSERT(reporter, geoPEStrokeCase.appliedFullStyleKey() == emptyKey)
; |
889 REPORTER_ASSERT(reporter, geoPEStrokeCase.appliedPathEffectKey() == emptyKey
); | 889 REPORTER_ASSERT(reporter, geoPEStrokeCase.appliedPathEffectKey() == emptyKey
); |
890 REPORTER_ASSERT(reporter, geoPEStrokeCase.appliedPathEffectThenStrokeKey() =
= emptyKey); | 890 REPORTER_ASSERT(reporter, geoPEStrokeCase.appliedPathEffectThenStrokeKey() =
= emptyKey); |
891 REPORTER_ASSERT(reporter, geoPEStrokeCase.appliedPathEffectShape().isEmpty()
); | 891 REPORTER_ASSERT(reporter, geoPEStrokeCase.appliedPathEffectShape().isEmpty()
); |
892 REPORTER_ASSERT(reporter, geoPEStrokeCase.appliedFullStyleShape().isEmpty())
; | 892 REPORTER_ASSERT(reporter, geoPEStrokeCase.appliedFullStyleShape().isEmpty())
; |
893 } | 893 } |
894 | 894 |
| 895 template <typename GEO> |
| 896 void test_path_effect_fails(skiatest::Reporter* reporter, const GEO& geo) { |
| 897 /** |
| 898 * This path effect returns an empty path. |
| 899 */ |
| 900 class FailurePathEffect : SkPathEffect { |
| 901 public: |
| 902 bool filterPath(SkPath* dst, const SkPath& src, SkStrokeRec*, |
| 903 const SkRect* cullR) const override { |
| 904 return false; |
| 905 } |
| 906 void computeFastBounds(SkRect* dst, const SkRect& src) const override { |
| 907 *dst = src; |
| 908 } |
| 909 static sk_sp<SkPathEffect> Make() { return sk_sp<SkPathEffect>(new Failu
rePathEffect); } |
| 910 Factory getFactory() const override { return nullptr; } |
| 911 void toString(SkString*) const override {} |
| 912 private: |
| 913 FailurePathEffect() {} |
| 914 }; |
| 915 |
| 916 SkPaint fill; |
| 917 TestCase fillCase(geo, fill, reporter); |
| 918 |
| 919 SkPaint pe; |
| 920 pe.setPathEffect(FailurePathEffect::Make()); |
| 921 TestCase peCase(geo, pe, reporter); |
| 922 |
| 923 SkPaint stroke; |
| 924 stroke.setStrokeWidth(2.f); |
| 925 stroke.setStyle(SkPaint::kStroke_Style); |
| 926 TestCase strokeCase(geo, stroke, reporter); |
| 927 |
| 928 SkPaint peStroke = stroke; |
| 929 peStroke.setPathEffect(FailurePathEffect::Make()); |
| 930 TestCase peStrokeCase(geo, peStroke, reporter); |
| 931 |
| 932 // In general the path effect failure can cause some of the TestCase::compar
e() tests to fail |
| 933 // for at least two reasons: 1) We will initially treat the shape as unkeyab
le because of the |
| 934 // path effect, but then when the path effect fails we can key it. 2) GrShap
e will change its |
| 935 // mind about whether a unclosed rect is actually rect. The path effect init
ially bars us from |
| 936 // closing it but after the effect fails we can (for the fill+pe case). This
causes different |
| 937 // routes through GrShape to have equivalent but different representations o
f the path (closed |
| 938 // or not) but that fill the same. |
| 939 SkPath a; |
| 940 SkPath b; |
| 941 fillCase.appliedPathEffectShape().asPath(&a); |
| 942 peCase.appliedPathEffectShape().asPath(&b); |
| 943 REPORTER_ASSERT(reporter, paths_fill_same(a, b)); |
| 944 |
| 945 fillCase.appliedFullStyleShape().asPath(&a); |
| 946 peCase.appliedFullStyleShape().asPath(&b); |
| 947 REPORTER_ASSERT(reporter, paths_fill_same(a, b)); |
| 948 |
| 949 strokeCase.appliedPathEffectShape().asPath(&a); |
| 950 peStrokeCase.appliedPathEffectShape().asPath(&b); |
| 951 REPORTER_ASSERT(reporter, paths_fill_same(a, b)); |
| 952 |
| 953 strokeCase.appliedFullStyleShape().asPath(&a); |
| 954 peStrokeCase.appliedFullStyleShape().asPath(&b); |
| 955 REPORTER_ASSERT(reporter, paths_fill_same(a, b)); |
| 956 } |
| 957 |
895 void test_empty_shape(skiatest::Reporter* reporter) { | 958 void test_empty_shape(skiatest::Reporter* reporter) { |
896 SkPath emptyPath; | 959 SkPath emptyPath; |
897 SkPaint fill; | 960 SkPaint fill; |
898 TestCase fillEmptyCase(emptyPath, fill, reporter); | 961 TestCase fillEmptyCase(emptyPath, fill, reporter); |
899 REPORTER_ASSERT(reporter, fillEmptyCase.baseShape().isEmpty()); | 962 REPORTER_ASSERT(reporter, fillEmptyCase.baseShape().isEmpty()); |
900 REPORTER_ASSERT(reporter, fillEmptyCase.appliedPathEffectShape().isEmpty()); | 963 REPORTER_ASSERT(reporter, fillEmptyCase.appliedPathEffectShape().isEmpty()); |
901 REPORTER_ASSERT(reporter, fillEmptyCase.appliedFullStyleShape().isEmpty()); | 964 REPORTER_ASSERT(reporter, fillEmptyCase.appliedFullStyleShape().isEmpty()); |
902 | 965 |
903 Key emptyKey(fillEmptyCase.baseKey()); | 966 Key emptyKey(fillEmptyCase.baseKey()); |
904 REPORTER_ASSERT(reporter, emptyKey.count()); | 967 REPORTER_ASSERT(reporter, emptyKey.count()); |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
956 SkIntToScalar(2), SkIntToScalar(4)); | 1019 SkIntToScalar(2), SkIntToScalar(4)); |
957 test_stroke_param<SkRect, SkPaint::Join>( | 1020 test_stroke_param<SkRect, SkPaint::Join>( |
958 reporter, r, | 1021 reporter, r, |
959 [](SkPaint* p, SkPaint::Join j) { p->setStrokeJoin(j);}, | 1022 [](SkPaint* p, SkPaint::Join j) { p->setStrokeJoin(j);}, |
960 SkPaint::kMiter_Join, SkPaint::kRound_Join); | 1023 SkPaint::kMiter_Join, SkPaint::kRound_Join); |
961 test_stroke_cap(reporter, r); | 1024 test_stroke_cap(reporter, r); |
962 test_miter_limit(reporter, r); | 1025 test_miter_limit(reporter, r); |
963 test_path_effect_makes_rrect(reporter, r); | 1026 test_path_effect_makes_rrect(reporter, r); |
964 test_unknown_path_effect(reporter, r); | 1027 test_unknown_path_effect(reporter, r); |
965 test_path_effect_makes_empty_shape(reporter, r); | 1028 test_path_effect_makes_empty_shape(reporter, r); |
| 1029 test_path_effect_fails(reporter, r); |
966 test_make_hairline_path_effect(reporter, r, true); | 1030 test_make_hairline_path_effect(reporter, r, true); |
967 } | 1031 } |
968 | 1032 |
969 for (auto rr : { SkRRect::MakeRect(SkRect::MakeWH(10, 10)), | 1033 for (auto rr : { SkRRect::MakeRect(SkRect::MakeWH(10, 10)), |
970 SkRRect::MakeRectXY(SkRect::MakeWH(10, 10), 3, 4), | 1034 SkRRect::MakeRectXY(SkRect::MakeWH(10, 10), 3, 4), |
971 SkRRect::MakeOval(SkRect::MakeWH(20, 20))}) { | 1035 SkRRect::MakeOval(SkRect::MakeWH(20, 20))}) { |
972 test_basic(reporter, rr); | 1036 test_basic(reporter, rr); |
973 test_scale(reporter, rr); | 1037 test_scale(reporter, rr); |
974 test_dash_fill(reporter, rr); | 1038 test_dash_fill(reporter, rr); |
975 test_null_dash(reporter, rr); | 1039 test_null_dash(reporter, rr); |
976 // Test modifying various stroke params. | 1040 // Test modifying various stroke params. |
977 test_stroke_param<SkRRect, SkScalar>( | 1041 test_stroke_param<SkRRect, SkScalar>( |
978 reporter, rr, | 1042 reporter, rr, |
979 [](SkPaint* p, SkScalar w) { p->setStrokeWidth(w);}, | 1043 [](SkPaint* p, SkScalar w) { p->setStrokeWidth(w);}, |
980 SkIntToScalar(2), SkIntToScalar(4)); | 1044 SkIntToScalar(2), SkIntToScalar(4)); |
981 test_stroke_param<SkRRect, SkPaint::Join>( | 1045 test_stroke_param<SkRRect, SkPaint::Join>( |
982 reporter, rr, | 1046 reporter, rr, |
983 [](SkPaint* p, SkPaint::Join j) { p->setStrokeJoin(j);
}, | 1047 [](SkPaint* p, SkPaint::Join j) { p->setStrokeJoin(j);
}, |
984 SkPaint::kMiter_Join, SkPaint::kRound_Join); | 1048 SkPaint::kMiter_Join, SkPaint::kRound_Join); |
985 test_stroke_cap(reporter, rr); | 1049 test_stroke_cap(reporter, rr); |
986 test_miter_limit(reporter, rr); | 1050 test_miter_limit(reporter, rr); |
987 test_path_effect_makes_rrect(reporter, rr); | 1051 test_path_effect_makes_rrect(reporter, rr); |
988 test_unknown_path_effect(reporter, rr); | 1052 test_unknown_path_effect(reporter, rr); |
989 test_path_effect_makes_empty_shape(reporter, rr); | 1053 test_path_effect_makes_empty_shape(reporter, rr); |
| 1054 test_path_effect_fails(reporter, rr); |
990 test_make_hairline_path_effect(reporter, rr, true); | 1055 test_make_hairline_path_effect(reporter, rr, true); |
991 } | 1056 } |
992 | 1057 |
993 struct TestPath { | 1058 struct TestPath { |
994 TestPath(const SkPath& path, bool isRRectFill, bool isRRectStroke ,const
SkRRect& rrect) | 1059 TestPath(const SkPath& path, bool isRRectFill, bool isRRectStroke ,const
SkRRect& rrect) |
995 : fPath(path) | 1060 : fPath(path) |
996 , fIsRRectForFill(isRRectFill) | 1061 , fIsRRectForFill(isRRectFill) |
997 , fIsRRectForStroke(isRRectStroke) | 1062 , fIsRRectForStroke(isRRectStroke) |
998 , fRRect(rrect) {} | 1063 , fRRect(rrect) {} |
999 SkPath fPath; | 1064 SkPath fPath; |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1042 [](SkPaint* p, SkScalar w) { p->setStrokeWidth(w);}, | 1107 [](SkPaint* p, SkScalar w) { p->setStrokeWidth(w);}, |
1043 SkIntToScalar(2), SkIntToScalar(4)); | 1108 SkIntToScalar(2), SkIntToScalar(4)); |
1044 test_stroke_param<SkPath, SkPaint::Join>( | 1109 test_stroke_param<SkPath, SkPaint::Join>( |
1045 reporter, path, | 1110 reporter, path, |
1046 [](SkPaint* p, SkPaint::Join j) { p->setStrokeJoin(j);}, | 1111 [](SkPaint* p, SkPaint::Join j) { p->setStrokeJoin(j);}, |
1047 SkPaint::kMiter_Join, SkPaint::kRound_Join); | 1112 SkPaint::kMiter_Join, SkPaint::kRound_Join); |
1048 test_stroke_cap(reporter, path); | 1113 test_stroke_cap(reporter, path); |
1049 test_miter_limit(reporter, path); | 1114 test_miter_limit(reporter, path); |
1050 test_unknown_path_effect(reporter, path); | 1115 test_unknown_path_effect(reporter, path); |
1051 test_path_effect_makes_empty_shape(reporter, path); | 1116 test_path_effect_makes_empty_shape(reporter, path); |
| 1117 test_path_effect_fails(reporter, path); |
1052 test_make_hairline_path_effect(reporter, path, testPath.fIsRRectForStrok
e); | 1118 test_make_hairline_path_effect(reporter, path, testPath.fIsRRectForStrok
e); |
1053 | 1119 |
1054 SkPaint fillPaint; | 1120 SkPaint fillPaint; |
1055 TestCase fillPathCase(path, fillPaint, reporter); | 1121 TestCase fillPathCase(path, fillPaint, reporter); |
1056 SkRRect rrect; | 1122 SkRRect rrect; |
1057 REPORTER_ASSERT(reporter, testPath.fIsRRectForFill == | 1123 REPORTER_ASSERT(reporter, testPath.fIsRRectForFill == |
1058 fillPathCase.baseShape().asRRect(&rrect, nullp
tr, nullptr)); | 1124 fillPathCase.baseShape().asRRect(&rrect, nullp
tr, nullptr)); |
1059 if (testPath.fIsRRectForFill) { | 1125 if (testPath.fIsRRectForFill) { |
1060 TestCase fillPathCase2(path, fillPaint, reporter); | 1126 TestCase fillPathCase2(path, fillPaint, reporter); |
1061 REPORTER_ASSERT(reporter, rrect == testPath.fRRect); | 1127 REPORTER_ASSERT(reporter, rrect == testPath.fRRect); |
(...skipping 15 matching lines...) Expand all Loading... |
1077 } | 1143 } |
1078 } | 1144 } |
1079 | 1145 |
1080 // Test a volatile empty path. | 1146 // Test a volatile empty path. |
1081 test_volatile_path(reporter, SkPath(), true); | 1147 test_volatile_path(reporter, SkPath(), true); |
1082 | 1148 |
1083 test_empty_shape(reporter); | 1149 test_empty_shape(reporter); |
1084 } | 1150 } |
1085 | 1151 |
1086 #endif | 1152 #endif |
OLD | NEW |