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, |