Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(593)

Side by Side Diff: tests/GrShapeTest.cpp

Issue 1949193002: Make cap only affect the keys of GrShapes that are possibly-open (Closed) Base URL: https://chromium.googlesource.com/skia.git@master
Patch Set: due Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/gpu/GrStyle.cpp ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 245 matching lines...) Expand 10 before | Expand all | Expand 10 after
256 hairline.setStrokeWidth(0.f); 256 hairline.setStrokeWidth(0.f);
257 TestCase hairlineCase(geo, hairline, reporter); 257 TestCase hairlineCase(geo, hairline, reporter);
258 // Since hairline style doesn't change the SkPath data, it is keyed identica lly to fill. 258 // Since hairline style doesn't change the SkPath data, it is keyed identica lly to fill.
259 hairlineCase.compare(reporter, fillCase, TestCase::kAllSame_ComparisonExpeca tion); 259 hairlineCase.compare(reporter, fillCase, TestCase::kAllSame_ComparisonExpeca tion);
260 REPORTER_ASSERT(reporter, hairlineCase.baseShape().style().isSimpleHairline( )); 260 REPORTER_ASSERT(reporter, hairlineCase.baseShape().style().isSimpleHairline( ));
261 REPORTER_ASSERT(reporter, hairlineCase.appliedFullStyleShape().style().isSim pleHairline()); 261 REPORTER_ASSERT(reporter, hairlineCase.appliedFullStyleShape().style().isSim pleHairline());
262 REPORTER_ASSERT(reporter, hairlineCase.appliedPathEffectShape().style().isSi mpleHairline()); 262 REPORTER_ASSERT(reporter, hairlineCase.appliedPathEffectShape().style().isSi mpleHairline());
263 } 263 }
264 264
265 template <typename GEO, typename T> 265 template <typename GEO, typename T>
266 static void test_stroke_param(skiatest::Reporter* reporter, const GEO& geo, 266 static void test_stroke_param_impl(skiatest::Reporter* reporter, const GEO& geo,
267 std::function<void(SkPaint*, T)> setter, T a, T b) { 267 std::function<void(SkPaint*, T)> setter, T a, T b,
268 // Set the stroke width so that we don't get hairline. However, call the fun ction second so that 268 bool paramAffectsStroke,
269 // it can override. 269 bool paramAffectsDashAndStroke) {
270 // Set the stroke width so that we don't get hairline. However, call the set ter afterward so
271 // that it can override the stroke width.
270 SkPaint strokeA; 272 SkPaint strokeA;
271 strokeA.setStyle(SkPaint::kStroke_Style); 273 strokeA.setStyle(SkPaint::kStroke_Style);
272 strokeA.setStrokeWidth(2.f); 274 strokeA.setStrokeWidth(2.f);
273 setter(&strokeA, a); 275 setter(&strokeA, a);
274 SkPaint strokeB; 276 SkPaint strokeB;
275 strokeB.setStyle(SkPaint::kStroke_Style); 277 strokeB.setStyle(SkPaint::kStroke_Style);
276 strokeB.setStrokeWidth(2.f); 278 strokeB.setStrokeWidth(2.f);
277 setter(&strokeB, b); 279 setter(&strokeB, b);
278 280
279 TestCase strokeACase(geo, strokeA, reporter); 281 TestCase strokeACase(geo, strokeA, reporter);
280 TestCase strokeBCase(geo, strokeB, reporter); 282 TestCase strokeBCase(geo, strokeB, reporter);
281 strokeACase.compare(reporter, strokeBCase, TestCase::kSameUpToStroke_Compari sonExpecation); 283 if (paramAffectsStroke) {
284 strokeACase.compare(reporter, strokeBCase, TestCase::kSameUpToStroke_Com parisonExpecation);
285 } else {
286 strokeACase.compare(reporter, strokeBCase, TestCase::kAllSame_Comparison Expecation);
287 }
282 288
283 // Make sure stroking params don't affect fill style. 289 // Make sure stroking params don't affect fill style.
284 SkPaint fillA = strokeA, fillB = strokeB; 290 SkPaint fillA = strokeA, fillB = strokeB;
285 fillA.setStyle(SkPaint::kFill_Style); 291 fillA.setStyle(SkPaint::kFill_Style);
286 fillB.setStyle(SkPaint::kFill_Style); 292 fillB.setStyle(SkPaint::kFill_Style);
287 TestCase fillACase(geo, fillA, reporter); 293 TestCase fillACase(geo, fillA, reporter);
288 TestCase fillBCase(geo, fillB, reporter); 294 TestCase fillBCase(geo, fillB, reporter);
289 fillACase.compare(reporter, fillBCase, TestCase::kAllSame_ComparisonExpecati on); 295 fillACase.compare(reporter, fillBCase, TestCase::kAllSame_ComparisonExpecati on);
290 296
291 // Make sure just applying the dash but not stroke gives the same key for bo th stroking 297 // Make sure just applying the dash but not stroke gives the same key for bo th stroking
292 // variations. 298 // variations.
293 SkPaint dashA = strokeA, dashB = strokeB; 299 SkPaint dashA = strokeA, dashB = strokeB;
294 dashA.setPathEffect(make_dash()); 300 dashA.setPathEffect(make_dash());
295 dashB.setPathEffect(make_dash()); 301 dashB.setPathEffect(make_dash());
296 TestCase dashACase(geo, dashA, reporter); 302 TestCase dashACase(geo, dashA, reporter);
297 TestCase dashBCase(geo, dashB, reporter); 303 TestCase dashBCase(geo, dashB, reporter);
298 dashACase.compare(reporter, dashBCase, TestCase::kSameUpToStroke_ComparisonE xpecation); 304 if (paramAffectsDashAndStroke) {
305 dashACase.compare(reporter, dashBCase, TestCase::kSameUpToStroke_Compari sonExpecation);
306 } else {
307 dashACase.compare(reporter, dashBCase, TestCase::kAllSame_ComparisonExpe cation);
308 }
299 } 309 }
300 310
311 template <typename GEO, typename T>
312 static void test_stroke_param(skiatest::Reporter* reporter, const GEO& geo,
313 std::function<void(SkPaint*, T)> setter, T a, T b) {
314 test_stroke_param_impl(reporter, geo, setter, a, b, true, true);
315 };
316
317 template <typename GEO>
318 static void test_stroke_cap(skiatest::Reporter* reporter, const GEO& geo) {
319 GrShape shape(geo, GrStyle(SkStrokeRec::kHairline_InitStyle));
320 // The cap should only affect shapes that may be open.
321 bool affectsStroke = !shape.knownToBeClosed();
322 // Dashing adds ends that need caps.
323 bool affectsDashAndStroke = true;
324 test_stroke_param_impl<GEO, SkPaint::Cap>(
325 reporter,
326 geo,
327 [](SkPaint* p, SkPaint::Cap c) { p->setStrokeCap(c);},
328 SkPaint::kButt_Cap, SkPaint::kRound_Cap,
329 affectsStroke,
330 affectsDashAndStroke);
331 };
332
301 template <typename GEO> 333 template <typename GEO>
302 static void test_miter_limit(skiatest::Reporter* reporter, const GEO& geo) { 334 static void test_miter_limit(skiatest::Reporter* reporter, const GEO& geo) {
303 // Miter limit should only matter when stroking with miter joins. It shouldn 't affect other 335 auto setMiterJoinAndLimit = [](SkPaint* p, SkScalar miter) {
304 // joins or fills. 336 p->setStrokeJoin(SkPaint::kMiter_Join);
305 SkPaint miterA; 337 p->setStrokeMiter(miter);
306 miterA.setStyle(SkPaint::kStroke_Style); 338 };
307 miterA.setStrokeWidth(2.f);
308 miterA.setStrokeJoin(SkPaint::kMiter_Join);
309 miterA.setStrokeMiter(0.5f);
310 SkPaint miterB = miterA;
311 miterA.setStrokeMiter(0.6f);
312 339
313 TestCase miterACase(geo, miterA, reporter); 340 auto setOtherJoinAndLimit = [](SkPaint* p, SkScalar miter) {
314 TestCase miterBCase(geo, miterB, reporter); 341 p->setStrokeJoin(SkPaint::kRound_Join);
315 miterACase.compare(reporter, miterBCase, TestCase::kSameUpToStroke_Compariso nExpecation); 342 p->setStrokeMiter(miter);
343 };
316 344
317 SkPaint noMiterA = miterA, noMiterB = miterB; 345 // The miter limit should affect stroked and dashed-stroked cases when the j oin type is
318 noMiterA.setStrokeJoin(SkPaint::kRound_Join); 346 // miter.
319 noMiterB.setStrokeJoin(SkPaint::kRound_Join); 347 test_stroke_param_impl<GEO, SkScalar>(
320 TestCase noMiterACase(geo, noMiterA, reporter); 348 reporter,
321 TestCase noMiterBCase(geo, noMiterB, reporter); 349 geo,
322 noMiterACase.compare(reporter, noMiterBCase, TestCase::kAllSame_ComparisonEx pecation); 350 setMiterJoinAndLimit,
351 0.5f, 0.75f,
352 true,
353 true);
323 354
324 SkPaint fillA = miterA, fillB = miterB; 355 // The miter limit should not affect stroked and dashed-stroked cases when t he join type is
325 fillA.setStyle(SkPaint::kFill_Style); 356 // not miter.
326 fillB.setStyle(SkPaint::kFill_Style); 357 test_stroke_param_impl<GEO, SkScalar>(
327 TestCase fillACase(geo, fillA, reporter); 358 reporter,
328 TestCase fillBCase(geo, fillB, reporter); 359 geo,
329 fillACase.compare(reporter, fillBCase, TestCase::kAllSame_ComparisonExpecati on); 360 setOtherJoinAndLimit,
361 0.5f, 0.75f,
362 false,
363 false);
330 } 364 }
331 365
332 template<typename GEO> 366 template<typename GEO>
333 static void test_dash_fill(skiatest::Reporter* reporter, const GEO& geo) { 367 static void test_dash_fill(skiatest::Reporter* reporter, const GEO& geo) {
334 // A dash with no stroke should have no effect 368 // A dash with no stroke should have no effect
335 using DashFactoryFn = sk_sp<SkPathEffect>(*)(); 369 using DashFactoryFn = sk_sp<SkPathEffect>(*)();
336 for (DashFactoryFn md : {&make_dash, &make_null_dash}) { 370 for (DashFactoryFn md : {&make_dash, &make_null_dash}) {
337 SkPaint dashFill; 371 SkPaint dashFill;
338 dashFill.setPathEffect((*md)()); 372 dashFill.setPathEffect((*md)());
339 TestCase dashFillCase(geo, dashFill, reporter); 373 TestCase dashFillCase(geo, dashFill, reporter);
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
653 for (auto rr : { SkRRect::MakeRect(SkRect::MakeWH(10, 10)), 687 for (auto rr : { SkRRect::MakeRect(SkRect::MakeWH(10, 10)),
654 SkRRect::MakeRectXY(SkRect::MakeWH(10, 10), 3, 4)}) { 688 SkRRect::MakeRectXY(SkRect::MakeWH(10, 10), 3, 4)}) {
655 test_basic(reporter, rr); 689 test_basic(reporter, rr);
656 test_dash_fill(reporter, rr); 690 test_dash_fill(reporter, rr);
657 test_null_dash(reporter, rr); 691 test_null_dash(reporter, rr);
658 // Test modifying various stroke params. 692 // Test modifying various stroke params.
659 test_stroke_param<SkRRect, SkScalar>( 693 test_stroke_param<SkRRect, SkScalar>(
660 reporter, rr, 694 reporter, rr,
661 [](SkPaint* p, SkScalar w) { p->setStrokeWidth(w);}, 695 [](SkPaint* p, SkScalar w) { p->setStrokeWidth(w);},
662 SkIntToScalar(2), SkIntToScalar(4)); 696 SkIntToScalar(2), SkIntToScalar(4));
663 test_stroke_param<SkRRect, SkPaint::Cap>(
664 reporter, rr,
665 [](SkPaint* p, SkPaint::Cap c) { p->setStrokeCap(c);},
666 SkPaint::kButt_Cap, SkPaint::kRound_Cap);
667 test_stroke_param<SkRRect, SkPaint::Join>( 697 test_stroke_param<SkRRect, SkPaint::Join>(
668 reporter, rr, 698 reporter, rr,
669 [](SkPaint* p, SkPaint::Join j) { p->setStrokeJoin(j); }, 699 [](SkPaint* p, SkPaint::Join j) { p->setStrokeJoin(j); },
670 SkPaint::kMiter_Join, SkPaint::kRound_Join); 700 SkPaint::kMiter_Join, SkPaint::kRound_Join);
701 test_stroke_cap(reporter, rr);
671 test_miter_limit(reporter, rr); 702 test_miter_limit(reporter, rr);
672 test_path_effect_makes_rrect(reporter, rr); 703 test_path_effect_makes_rrect(reporter, rr);
673 test_unknown_path_effect(reporter, rr); 704 test_unknown_path_effect(reporter, rr);
674 test_path_effect_makes_empty_shape(reporter, rr); 705 test_path_effect_makes_empty_shape(reporter, rr);
675 test_make_hairline_path_effect(reporter, rr, true); 706 test_make_hairline_path_effect(reporter, rr, true);
676 } 707 }
677 708
678 struct TestPath { 709 struct TestPath {
679 TestPath(const SkPath& path, bool isRRectFill, bool isRRectStroke ,const SkRRect& rrect) 710 TestPath(const SkPath& path, bool isRRectFill, bool isRRectStroke ,const SkRRect& rrect)
680 : fPath(path) 711 : fPath(path)
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
718 test_path_effect_makes_rrect(reporter, path); 749 test_path_effect_makes_rrect(reporter, path);
719 } 750 }
720 // This test uses a stroking paint, hence use of fIsRRectForStroke 751 // This test uses a stroking paint, hence use of fIsRRectForStroke
721 test_volatile_path(reporter, path, testPath.fIsRRectForStroke); 752 test_volatile_path(reporter, path, testPath.fIsRRectForStroke);
722 test_dash_fill(reporter, path); 753 test_dash_fill(reporter, path);
723 // Test modifying various stroke params. 754 // Test modifying various stroke params.
724 test_stroke_param<SkPath, SkScalar>( 755 test_stroke_param<SkPath, SkScalar>(
725 reporter, path, 756 reporter, path,
726 [](SkPaint* p, SkScalar w) { p->setStrokeWidth(w);}, 757 [](SkPaint* p, SkScalar w) { p->setStrokeWidth(w);},
727 SkIntToScalar(2), SkIntToScalar(4)); 758 SkIntToScalar(2), SkIntToScalar(4));
728 test_stroke_param<SkPath, SkPaint::Cap>(
729 reporter, path,
730 [](SkPaint* p, SkPaint::Cap c) { p->setStrokeCap(c);},
731 SkPaint::kButt_Cap, SkPaint::kRound_Cap);
732 test_stroke_param<SkPath, SkPaint::Join>( 759 test_stroke_param<SkPath, SkPaint::Join>(
733 reporter, path, 760 reporter, path,
734 [](SkPaint* p, SkPaint::Join j) { p->setStrokeJoin(j);}, 761 [](SkPaint* p, SkPaint::Join j) { p->setStrokeJoin(j);},
735 SkPaint::kMiter_Join, SkPaint::kRound_Join); 762 SkPaint::kMiter_Join, SkPaint::kRound_Join);
763 test_stroke_cap(reporter, path);
736 test_miter_limit(reporter, path); 764 test_miter_limit(reporter, path);
737 test_unknown_path_effect(reporter, path); 765 test_unknown_path_effect(reporter, path);
738 test_path_effect_makes_empty_shape(reporter, path); 766 test_path_effect_makes_empty_shape(reporter, path);
739 test_make_hairline_path_effect(reporter, path, testPath.fIsRRectForStrok e); 767 test_make_hairline_path_effect(reporter, path, testPath.fIsRRectForStrok e);
740 768
741 SkPaint fillPaint; 769 SkPaint fillPaint;
742 TestCase fillPathCase(path, fillPaint, reporter); 770 TestCase fillPathCase(path, fillPaint, reporter);
743 SkRRect rrect; 771 SkRRect rrect;
744 REPORTER_ASSERT(reporter, testPath.fIsRRectForFill == 772 REPORTER_ASSERT(reporter, testPath.fIsRRectForFill ==
745 fillPathCase.baseShape().asRRect(&rrect)); 773 fillPathCase.baseShape().asRRect(&rrect));
(...skipping 17 matching lines...) Expand all
763 } 791 }
764 } 792 }
765 793
766 // Test a volatile empty path. 794 // Test a volatile empty path.
767 test_volatile_path(reporter, SkPath(), true); 795 test_volatile_path(reporter, SkPath(), true);
768 796
769 test_empty_shape(reporter); 797 test_empty_shape(reporter);
770 } 798 }
771 799
772 #endif 800 #endif
OLDNEW
« no previous file with comments | « src/gpu/GrStyle.cpp ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698