Chromium Code Reviews| Index: samplecode/SampleConcavePaths.cpp |
| diff --git a/samplecode/SampleConcavePaths.cpp b/samplecode/SampleConcavePaths.cpp |
| index 2fc01076d2b9a40ec2e5634397f66a485b70161c..cb6a74f780cb1b602e4e281692a408c580dbafea 100644 |
| --- a/samplecode/SampleConcavePaths.cpp |
| +++ b/samplecode/SampleConcavePaths.cpp |
| @@ -55,6 +55,7 @@ protected: |
| path.lineTo(SkIntToScalar(20), SkIntToScalar(80)); |
| canvas->drawPath(path, paint); |
| } |
| + |
| // Reverse concave test |
| if (1) { |
| SkPath path; |
| @@ -135,6 +136,224 @@ protected: |
| canvas->drawPath(path, paint); |
| canvas->restore(); |
| } |
| + // Star test (self-intersecting) |
|
bsalomon
2015/01/20 15:12:24
should we make this guy a GM instead of a Sample?
Stephen White
2015/01/20 18:54:15
Done.
|
| + if (1) { |
| + SkPath path; |
| + canvas->save(); |
| + canvas->translate(300, 100); |
| + path.moveTo(30, 20); |
| + path.lineTo(50, 80); |
| + path.lineTo(70, 20); |
| + path.lineTo(20, 57); |
| + path.lineTo(80, 57); |
| + path.close(); |
| + canvas->drawPath(path, paint); |
| + canvas->restore(); |
| + } |
| + // Stairstep with repeated vert (intersection) |
| + if (1) { |
| + SkPath path; |
| + canvas->save(); |
| + canvas->translate(0, 200); |
| + path.moveTo(SkIntToScalar(50), SkIntToScalar(50)); |
| + path.lineTo(SkIntToScalar(50), SkIntToScalar(20)); |
| + path.lineTo(SkIntToScalar(80), SkIntToScalar(20)); |
| + path.lineTo(SkIntToScalar(50), SkIntToScalar(50)); |
| + path.lineTo(SkIntToScalar(20), SkIntToScalar(50)); |
| + path.lineTo(SkIntToScalar(20), SkIntToScalar(80)); |
| + canvas->drawPath(path, paint); |
| + canvas->restore(); |
| + } |
| + // Stairstep intersection without repeated vert. |
| + if (1) { |
| + SkPath path; |
| + canvas->save(); |
| + canvas->translate(100, 200); |
| + path.moveTo(20, 60); |
| + path.lineTo(35, 80); |
| + path.lineTo(50, 60); |
| + path.lineTo(65, 80); |
| + path.lineTo(80, 60); |
| + canvas->drawPath(path, paint); |
| + canvas->restore(); |
| + } |
| + // Overlapping segments |
| + if (1) { |
| + SkPath path; |
| + canvas->save(); |
| + canvas->translate(200, 200); |
| + path.moveTo(SkIntToScalar(20), SkIntToScalar(80)); |
| + path.lineTo(SkIntToScalar(80), SkIntToScalar(80)); |
| + path.lineTo(SkIntToScalar(80), SkIntToScalar(20)); |
| + path.lineTo(SkIntToScalar(80), SkIntToScalar(30)); |
| + canvas->drawPath(path, paint); |
| + canvas->restore(); |
| + } |
| + // Monotone test 1 (point in the middle) |
| + if (1) { |
| + SkPath path; |
| + canvas->save(); |
| + canvas->translate(0, 300); |
| + path.moveTo(SkIntToScalar(20), SkIntToScalar(20)); |
| + path.quadTo(SkIntToScalar(20), SkIntToScalar(50), |
| + SkIntToScalar(80), SkIntToScalar(50)); |
| + path.quadTo(SkIntToScalar(20), SkIntToScalar(50), |
| + SkIntToScalar(20), SkIntToScalar(80)); |
| + canvas->drawPath(path, paint); |
| + canvas->restore(); |
| + } |
| + // Monotone test 2 (point at the top) |
| + if (1) { |
| + SkPath path; |
| + canvas->save(); |
| + canvas->translate(100, 300); |
| + path.moveTo(SkIntToScalar(20), SkIntToScalar(20)); |
| + path.lineTo(SkIntToScalar(80), SkIntToScalar(30)); |
| + path.quadTo(SkIntToScalar(20), SkIntToScalar(20), |
| + SkIntToScalar(20), SkIntToScalar(80)); |
| + canvas->drawPath(path, paint); |
| + canvas->restore(); |
| + } |
| + // Monotone test 3 (point at the bottom) |
| + if (1) { |
| + SkPath path; |
| + canvas->save(); |
| + canvas->translate(200, 300); |
| + path.moveTo(SkIntToScalar(20), SkIntToScalar(80)); |
| + path.lineTo(SkIntToScalar(80), SkIntToScalar(70)); |
| + path.quadTo(SkIntToScalar(20), SkIntToScalar(80), |
| + SkIntToScalar(20), SkIntToScalar(20)); |
| + canvas->drawPath(path, paint); |
| + canvas->restore(); |
| + } |
| + // Monotone test 4 (merging of two monotones) |
| + if (1) { |
| + SkPath path; |
| + canvas->save(); |
| + canvas->translate(300, 300); |
| + path.moveTo(80, 25); |
| + path.lineTo(50, 39); |
| + path.lineTo(20, 25); |
| + path.lineTo(40, 45); |
| + path.lineTo(70, 50); |
| + path.lineTo(80, 80); |
| + canvas->drawPath(path, paint); |
| + canvas->restore(); |
| + } |
| + // Monotone test 5 (aborted merging of two monotones) |
| + if (1) { |
| + SkPath path; |
| + canvas->save(); |
| + canvas->translate(0, 400); |
| + path.moveTo(50, 20); |
| + path.lineTo(80, 80); |
| + path.lineTo(50, 50); |
| + path.lineTo(20, 80); |
| + canvas->drawPath(path, paint); |
| + canvas->restore(); |
| + } |
| + // Degenerate intersection test |
| + if (1) { |
| + SkPath path; |
| + canvas->save(); |
| + canvas->translate(100, 400); |
| + path.moveTo(50, 20); |
| + path.lineTo(70, 30); |
| + path.lineTo(20, 50); |
| + path.moveTo(50, 20); |
| + path.lineTo(80, 80); |
| + path.lineTo(50, 80); |
| + canvas->drawPath(path, paint); |
| + canvas->restore(); |
| + } |
| + // Two triangles with a coincident edge. |
| + if (1) { |
| + SkPath path; |
| + canvas->save(); |
| + canvas->translate(200, 400); |
| + |
| + path.moveTo(80, 20); |
| + path.lineTo(80, 80); |
| + path.lineTo(20, 80); |
| + |
| + path.moveTo(20, 20); |
| + path.lineTo(80, 80); |
| + path.lineTo(20, 80); |
| + |
| + canvas->drawPath(path, paint); |
| + canvas->restore(); |
| + } |
| + // Bowtie with a coincident vertex. |
| + if (1) { |
| + SkPath path; |
| + canvas->save(); |
| + canvas->translate(300, 400); |
| + path.moveTo(SkIntToScalar(20), SkIntToScalar(20)); |
| + path.lineTo(SkIntToScalar(80), SkIntToScalar(80)); |
| + path.lineTo(SkIntToScalar(80), SkIntToScalar(20)); |
| + path.lineTo(SkIntToScalar(20), SkIntToScalar(80)); |
| + path.moveTo(SkIntToScalar(50), SkIntToScalar(50)); |
| + path.lineTo(SkIntToScalar(80), SkIntToScalar(20)); |
| + path.lineTo(SkIntToScalar(80), SkIntToScalar(80)); |
| + canvas->drawPath(path, paint); |
| + canvas->restore(); |
| + } |
| + // Coincident edges (big ones first, coincident vert on top). |
| + if (1) { |
| + SkPath path; |
| + canvas->save(); |
| + canvas->translate(0, 500); |
| + path.moveTo(SkIntToScalar(20), SkIntToScalar(20)); |
| + path.lineTo(SkIntToScalar(80), SkIntToScalar(80)); |
| + path.lineTo(SkIntToScalar(20), SkIntToScalar(80)); |
| + path.moveTo(SkIntToScalar(20), SkIntToScalar(20)); |
| + path.lineTo(SkIntToScalar(50), SkIntToScalar(50)); |
| + path.lineTo(SkIntToScalar(20), SkIntToScalar(50)); |
| + canvas->drawPath(path, paint); |
| + canvas->restore(); |
| + } |
| + // Coincident edges (small ones first, coincident vert on top). |
| + if (1) { |
| + SkPath path; |
| + canvas->save(); |
| + canvas->translate(100, 500); |
| + path.moveTo(SkIntToScalar(20), SkIntToScalar(20)); |
| + path.lineTo(SkIntToScalar(50), SkIntToScalar(50)); |
| + path.lineTo(SkIntToScalar(20), SkIntToScalar(50)); |
| + path.moveTo(SkIntToScalar(20), SkIntToScalar(20)); |
| + path.lineTo(SkIntToScalar(80), SkIntToScalar(80)); |
| + path.lineTo(SkIntToScalar(20), SkIntToScalar(80)); |
| + canvas->drawPath(path, paint); |
| + canvas->restore(); |
| + } |
| + // Coincident edges (small ones first, coincident vert on bottom). |
| + if (1) { |
| + SkPath path; |
| + canvas->save(); |
| + canvas->translate(200, 500); |
| + path.moveTo(SkIntToScalar(20), SkIntToScalar(80)); |
| + path.lineTo(SkIntToScalar(20), SkIntToScalar(50)); |
| + path.lineTo(SkIntToScalar(50), SkIntToScalar(50)); |
| + path.moveTo(SkIntToScalar(20), SkIntToScalar(80)); |
| + path.lineTo(SkIntToScalar(20), SkIntToScalar(20)); |
| + path.lineTo(SkIntToScalar(80), SkIntToScalar(20)); |
| + canvas->drawPath(path, paint); |
| + canvas->restore(); |
| + } |
| + // Coincident edges (big ones first, coincident vert on bottom). |
| + if (1) { |
| + SkPath path; |
| + canvas->save(); |
| + canvas->translate(300, 500); |
| + path.moveTo(SkIntToScalar(20), SkIntToScalar(80)); |
| + path.lineTo(SkIntToScalar(20), SkIntToScalar(20)); |
| + path.lineTo(SkIntToScalar(80), SkIntToScalar(20)); |
| + path.moveTo(SkIntToScalar(20), SkIntToScalar(80)); |
| + path.lineTo(SkIntToScalar(20), SkIntToScalar(50)); |
| + path.lineTo(SkIntToScalar(50), SkIntToScalar(50)); |
| + canvas->drawPath(path, paint); |
| + canvas->restore(); |
| + } |
| } |
| virtual SkView::Click* onFindClickHandler(SkScalar x, SkScalar y, |