| 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 1143 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1154 // The base shape cannot perform canonicalization on the path's fill typ
e because of an | 1154 // The base shape cannot perform canonicalization on the path's fill typ
e because of an |
| 1155 // unknown path effect. However, after the path effect is applied the re
sulting hairline | 1155 // unknown path effect. However, after the path effect is applied the re
sulting hairline |
| 1156 // shape will canonicalize the path fill type since hairlines (and strok
ing in general) | 1156 // shape will canonicalize the path fill type since hairlines (and strok
ing in general) |
| 1157 // don't distinguish between even/odd and non-zero winding. | 1157 // don't distinguish between even/odd and non-zero winding. |
| 1158 a.setFillType(b.getFillType()); | 1158 a.setFillType(b.getFillType()); |
| 1159 REPORTER_ASSERT(reporter, a == b); | 1159 REPORTER_ASSERT(reporter, a == b); |
| 1160 REPORTER_ASSERT(reporter, a == c); | 1160 REPORTER_ASSERT(reporter, a == c); |
| 1161 // If the resulting path is small enough then it will have a key. | 1161 // If the resulting path is small enough then it will have a key. |
| 1162 REPORTER_ASSERT(reporter, paths_fill_same(a, b)); | 1162 REPORTER_ASSERT(reporter, paths_fill_same(a, b)); |
| 1163 REPORTER_ASSERT(reporter, paths_fill_same(a, c)); | 1163 REPORTER_ASSERT(reporter, paths_fill_same(a, c)); |
| 1164 if (c.countVerbs() <= GrShape::kMaxKeyFromDataVerbCnt) { | 1164 REPORTER_ASSERT(reporter, peCase.appliedPathEffectKey().empty()); |
| 1165 REPORTER_ASSERT(reporter, !peCase.appliedPathEffectKey().empty()); | 1165 REPORTER_ASSERT(reporter, peCase.appliedFullStyleKey().empty()); |
| 1166 REPORTER_ASSERT(reporter, peCase.appliedPathEffectKey() == | |
| 1167 peCase.appliedFullStyleKey()); | |
| 1168 } else { | |
| 1169 REPORTER_ASSERT(reporter, peCase.appliedPathEffectKey().empty()); | |
| 1170 REPORTER_ASSERT(reporter, peCase.appliedFullStyleKey().empty()); | |
| 1171 } | |
| 1172 } | 1166 } |
| 1173 REPORTER_ASSERT(reporter, peCase.appliedPathEffectShape().style().isSimpleHa
irline()); | 1167 REPORTER_ASSERT(reporter, peCase.appliedPathEffectShape().style().isSimpleHa
irline()); |
| 1174 REPORTER_ASSERT(reporter, peCase.appliedFullStyleShape().style().isSimpleHai
rline()); | 1168 REPORTER_ASSERT(reporter, peCase.appliedFullStyleShape().style().isSimpleHai
rline()); |
| 1175 } | 1169 } |
| 1176 | 1170 |
| 1177 void test_volatile_path(skiatest::Reporter* reporter, const Geo& geo) { | 1171 void test_volatile_path(skiatest::Reporter* reporter, const Geo& geo) { |
| 1178 SkPath vPath = geo.path(); | 1172 SkPath vPath = geo.path(); |
| 1179 vPath.setIsVolatile(true); | 1173 vPath.setIsVolatile(true); |
| 1180 | 1174 |
| 1181 SkPaint dashAndStroke; | 1175 SkPaint dashAndStroke; |
| 1182 dashAndStroke.setPathEffect(make_dash()); | 1176 dashAndStroke.setPathEffect(make_dash()); |
| 1183 dashAndStroke.setStrokeWidth(2.f); | 1177 dashAndStroke.setStrokeWidth(2.f); |
| 1184 dashAndStroke.setStyle(SkPaint::kStroke_Style); | 1178 dashAndStroke.setStyle(SkPaint::kStroke_Style); |
| 1185 TestCase volatileCase(reporter, vPath, dashAndStroke); | 1179 TestCase volatileCase(reporter, vPath, dashAndStroke); |
| 1186 // We expect a shape made from a volatile path to have a key iff the shape i
s recognized | 1180 // We expect a shape made from a volatile path to have a key iff the shape i
s recognized |
| 1187 // as a specialized geometry or it has a small verb count. | 1181 // as a specialized geometry. |
| 1188 if (geo.isNonPath(dashAndStroke) || vPath.countVerbs() <= GrShape::kMaxKeyFr
omDataVerbCnt) { | 1182 if (geo.isNonPath(dashAndStroke)) { |
| 1189 REPORTER_ASSERT(reporter, SkToBool(volatileCase.baseKey().count())); | 1183 REPORTER_ASSERT(reporter, SkToBool(volatileCase.baseKey().count())); |
| 1190 // In this case all the keys should be identical to the non-volatile cas
e. | 1184 // In this case all the keys should be identical to the non-volatile cas
e. |
| 1191 TestCase nonVolatileCase(reporter, geo.path(), dashAndStroke); | 1185 TestCase nonVolatileCase(reporter, geo.path(), dashAndStroke); |
| 1192 volatileCase.compare(reporter, nonVolatileCase, TestCase::kAllSame_Compa
risonExpecation); | 1186 volatileCase.compare(reporter, nonVolatileCase, TestCase::kAllSame_Compa
risonExpecation); |
| 1193 } else { | 1187 } else { |
| 1194 // None of the keys should be valid. | 1188 // None of the keys should be valid. |
| 1195 REPORTER_ASSERT(reporter, !SkToBool(volatileCase.baseKey().count())); | 1189 REPORTER_ASSERT(reporter, !SkToBool(volatileCase.baseKey().count())); |
| 1196 REPORTER_ASSERT(reporter, !SkToBool(volatileCase.appliedPathEffectKey().
count())); | 1190 REPORTER_ASSERT(reporter, !SkToBool(volatileCase.appliedPathEffectKey().
count())); |
| 1197 REPORTER_ASSERT(reporter, !SkToBool(volatileCase.appliedFullStyleKey().c
ount())); | 1191 REPORTER_ASSERT(reporter, !SkToBool(volatileCase.appliedFullStyleKey().c
ount())); |
| 1198 REPORTER_ASSERT(reporter, !SkToBool(volatileCase.appliedPathEffectThenSt
rokeKey().count())); | 1192 REPORTER_ASSERT(reporter, !SkToBool(volatileCase.appliedPathEffectThenSt
rokeKey().count())); |
| (...skipping 582 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1781 | 1775 |
| 1782 static void test_short_path_keys(skiatest::Reporter* r) { | 1776 static void test_short_path_keys(skiatest::Reporter* r) { |
| 1783 SkPaint paints[4]; | 1777 SkPaint paints[4]; |
| 1784 paints[1].setStyle(SkPaint::kStroke_Style); | 1778 paints[1].setStyle(SkPaint::kStroke_Style); |
| 1785 paints[1].setStrokeWidth(5.f); | 1779 paints[1].setStrokeWidth(5.f); |
| 1786 paints[2].setStyle(SkPaint::kStroke_Style); | 1780 paints[2].setStyle(SkPaint::kStroke_Style); |
| 1787 paints[2].setStrokeWidth(0.f); | 1781 paints[2].setStrokeWidth(0.f); |
| 1788 paints[3].setStyle(SkPaint::kStrokeAndFill_Style); | 1782 paints[3].setStyle(SkPaint::kStrokeAndFill_Style); |
| 1789 paints[3].setStrokeWidth(5.f); | 1783 paints[3].setStrokeWidth(5.f); |
| 1790 | 1784 |
| 1791 auto compare = [r, &paints] (SkPath* pathA, SkPath* pathB, | 1785 auto compare = [r, &paints] (const SkPath& pathA, const SkPath& pathB, |
| 1792 TestCase::ComparisonExpecation expectation) { | 1786 TestCase::ComparisonExpecation expectation) { |
| 1787 SkPath volatileA = pathA; |
| 1788 SkPath volatileB = pathB; |
| 1789 volatileA.setIsVolatile(true); |
| 1790 volatileB.setIsVolatile(true); |
| 1793 for (const SkPaint& paint : paints) { | 1791 for (const SkPaint& paint : paints) { |
| 1792 REPORTER_ASSERT(r, !GrShape(volatileA, paint).hasUnstyledKey()); |
| 1793 REPORTER_ASSERT(r, !GrShape(volatileB, paint).hasUnstyledKey()); |
| 1794 for (PathGeo::Invert invert : {PathGeo::Invert::kNo, PathGeo::Invert
::kYes}) { | 1794 for (PathGeo::Invert invert : {PathGeo::Invert::kNo, PathGeo::Invert
::kYes}) { |
| 1795 for (bool aIsVolatile : {false, true}) { | 1795 TestCase caseA(PathGeo(pathA, invert), paint, r); |
| 1796 for (bool bIsVolatile : {false, true}) { | 1796 TestCase caseB(PathGeo(pathB, invert), paint, r); |
| 1797 pathA->setIsVolatile(aIsVolatile); | 1797 caseA.compare(r, caseB, expectation); |
| 1798 pathB->setIsVolatile(bIsVolatile); | |
| 1799 TestCase caseA(PathGeo(*pathA, invert), paint, r); | |
| 1800 TestCase caseB(PathGeo(*pathB, invert), paint, r); | |
| 1801 caseA.compare(r, caseB, expectation); | |
| 1802 } | |
| 1803 } | |
| 1804 } | 1798 } |
| 1805 } | 1799 } |
| 1806 }; | 1800 }; |
| 1807 | 1801 |
| 1808 SkPath pathA; | 1802 SkPath pathA; |
| 1809 SkPath pathB; | 1803 SkPath pathB; |
| 1810 | 1804 |
| 1811 // Two identical paths | 1805 // Two identical paths |
| 1812 pathA.lineTo(10.f, 10.f); | 1806 pathA.lineTo(10.f, 10.f); |
| 1813 pathA.conicTo(20.f, 20.f, 20.f, 30.f, 0.7f); | 1807 pathA.conicTo(20.f, 20.f, 20.f, 30.f, 0.7f); |
| 1814 | 1808 |
| 1815 pathB.lineTo(10.f, 10.f); | 1809 pathB.lineTo(10.f, 10.f); |
| 1816 pathB.conicTo(20.f, 20.f, 20.f, 30.f, 0.7f); | 1810 pathB.conicTo(20.f, 20.f, 20.f, 30.f, 0.7f); |
| 1817 compare(&pathA, &pathB, TestCase::kAllSame_ComparisonExpecation); | 1811 compare(pathA, pathB, TestCase::kAllSame_ComparisonExpecation); |
| 1818 | 1812 |
| 1819 // Give path b a different point | 1813 // Give path b a different point |
| 1820 pathB.reset(); | 1814 pathB.reset(); |
| 1821 pathB.lineTo(10.f, 10.f); | 1815 pathB.lineTo(10.f, 10.f); |
| 1822 pathB.conicTo(21.f, 20.f, 20.f, 30.f, 0.7f); | 1816 pathB.conicTo(21.f, 20.f, 20.f, 30.f, 0.7f); |
| 1823 compare(&pathA, &pathB, TestCase::kAllDifferent_ComparisonExpecation); | 1817 compare(pathA, pathB, TestCase::kAllDifferent_ComparisonExpecation); |
| 1824 | 1818 |
| 1825 // Give path b a different conic weight | 1819 // Give path b a different conic weight |
| 1826 pathB.reset(); | 1820 pathB.reset(); |
| 1827 pathB.lineTo(10.f, 10.f); | 1821 pathB.lineTo(10.f, 10.f); |
| 1828 pathB.conicTo(20.f, 20.f, 20.f, 30.f, 0.6f); | 1822 pathB.conicTo(20.f, 20.f, 20.f, 30.f, 0.6f); |
| 1829 compare(&pathA, &pathB, TestCase::kAllDifferent_ComparisonExpecation); | 1823 compare(pathA, pathB, TestCase::kAllDifferent_ComparisonExpecation); |
| 1830 | 1824 |
| 1831 // Give path b an extra lineTo verb | 1825 // Give path b an extra lineTo verb |
| 1832 pathB.reset(); | 1826 pathB.reset(); |
| 1833 pathB.lineTo(10.f, 10.f); | 1827 pathB.lineTo(10.f, 10.f); |
| 1834 pathB.conicTo(20.f, 20.f, 20.f, 30.f, 0.6f); | 1828 pathB.conicTo(20.f, 20.f, 20.f, 30.f, 0.6f); |
| 1835 pathB.lineTo(50.f, 50.f); | 1829 pathB.lineTo(50.f, 50.f); |
| 1836 compare(&pathA, &pathB, TestCase::kAllDifferent_ComparisonExpecation); | 1830 compare(pathA, pathB, TestCase::kAllDifferent_ComparisonExpecation); |
| 1837 | 1831 |
| 1838 // Give path b a close | 1832 // Give path b a close |
| 1839 pathB.reset(); | 1833 pathB.reset(); |
| 1840 pathB.lineTo(10.f, 10.f); | 1834 pathB.lineTo(10.f, 10.f); |
| 1841 pathB.conicTo(20.f, 20.f, 20.f, 30.f, 0.7f); | 1835 pathB.conicTo(20.f, 20.f, 20.f, 30.f, 0.7f); |
| 1842 pathB.close(); | 1836 pathB.close(); |
| 1843 compare(&pathA, &pathB, TestCase::kAllDifferent_ComparisonExpecation); | 1837 compare(pathA, pathB, TestCase::kAllDifferent_ComparisonExpecation); |
| 1844 } | 1838 } |
| 1845 | 1839 |
| 1846 DEF_TEST(GrShape, reporter) { | 1840 DEF_TEST(GrShape, reporter) { |
| 1847 SkTArray<std::unique_ptr<Geo>> geos; | 1841 SkTArray<std::unique_ptr<Geo>> geos; |
| 1848 SkTArray<std::unique_ptr<RRectPathGeo>> rrectPathGeos; | 1842 SkTArray<std::unique_ptr<RRectPathGeo>> rrectPathGeos; |
| 1849 | 1843 |
| 1850 for (auto r : { SkRect::MakeWH(10, 20), | 1844 for (auto r : { SkRect::MakeWH(10, 20), |
| 1851 SkRect::MakeWH(-10, -20), | 1845 SkRect::MakeWH(-10, -20), |
| 1852 SkRect::MakeWH(-10, 20), | 1846 SkRect::MakeWH(-10, 20), |
| 1853 SkRect::MakeWH(10, -20)}) { | 1847 SkRect::MakeWH(10, -20)}) { |
| (...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1967 test_empty_shape(reporter); | 1961 test_empty_shape(reporter); |
| 1968 | 1962 |
| 1969 test_lines(reporter); | 1963 test_lines(reporter); |
| 1970 | 1964 |
| 1971 test_stroked_lines(reporter); | 1965 test_stroked_lines(reporter); |
| 1972 | 1966 |
| 1973 test_short_path_keys(reporter); | 1967 test_short_path_keys(reporter); |
| 1974 } | 1968 } |
| 1975 | 1969 |
| 1976 #endif | 1970 #endif |
| OLD | NEW |