ClipperTest.cpp revision 215473cea1702d8acc0316da3e5a9bf4ce0130ef
1215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed#include "Test.h" 2215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed#include "SkPath.h" 3215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed#include "SkLineClipper.h" 4215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed#include "SkEdgeClipper.h" 5215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed 6215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reedstatic void test_intersectline(skiatest::Reporter* reporter) { 7215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed static const SkScalar L = 0; 8215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed static const SkScalar T = 0; 9215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed static const SkScalar R = SkIntToScalar(100); 10215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed static const SkScalar B = SkIntToScalar(100); 11215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed static const SkScalar CX = SkScalarHalf(L + R); 12215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed static const SkScalar CY = SkScalarHalf(T + B); 13215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed static const SkRect gR = { L, T, R, B }; 14215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed 15215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed size_t i; 16215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed SkPoint dst[2]; 17215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed 18215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed static const SkPoint gEmpty[] = { 19215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed // sides 20215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { L, CY }, { L - 10, CY }, 21215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { R, CY }, { R + 10, CY }, 22215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { CX, T }, { CX, T - 10 }, 23215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { CX, B }, { CX, B + 10 }, 24215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed // corners 25215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { L, T }, { L - 10, T - 10 }, 26215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { L, B }, { L - 10, B + 10 }, 27215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { R, T }, { R + 10, T - 10 }, 28215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { R, B }, { R + 10, B + 10 }, 29215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed }; 30215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed for (i = 0; i < SK_ARRAY_COUNT(gEmpty); i += 2) { 31215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed bool valid = SkLineClipper::IntersectLine(&gEmpty[i], gR, dst); 32215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed if (valid) { 33215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed SkDebugf("----- [%d] %g %g -> %g %g\n", i/2, dst[0].fX, dst[0].fY, dst[1].fX, dst[1].fY); 34215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed } 35215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed REPORTER_ASSERT(reporter, !valid); 36215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed } 37215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed 38215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed static const SkPoint gFull[] = { 39215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed // diagonals, chords 40215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { L, T }, { R, B }, 41215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { L, B }, { R, T }, 42215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { CX, T }, { CX, B }, 43215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { L, CY }, { R, CY }, 44215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { CX, T }, { R, CY }, 45215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { CX, T }, { L, CY }, 46215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { L, CY }, { CX, B }, 47215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { R, CY }, { CX, B }, 48215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed // edges 49215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { L, T }, { L, B }, 50215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { R, T }, { R, B }, 51215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { L, T }, { R, T }, 52215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { L, B }, { R, B }, 53215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed }; 54215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed for (i = 0; i < SK_ARRAY_COUNT(gFull); i += 2) { 55215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed bool valid = SkLineClipper::IntersectLine(&gFull[i], gR, dst); 56215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed if (!valid || memcmp(&gFull[i], dst, sizeof(dst))) { 57215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed SkDebugf("++++ [%d] %g %g -> %g %g\n", i/2, dst[0].fX, dst[0].fY, dst[1].fX, dst[1].fY); 58215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed } 59215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed REPORTER_ASSERT(reporter, valid && !memcmp(&gFull[i], dst, sizeof(dst))); 60215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed } 61215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed 62215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed static const SkPoint gPartial[] = { 63215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { L - 10, CY }, { CX, CY }, { L, CY }, { CX, CY }, 64215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { CX, T - 10 }, { CX, CY }, { CX, T }, { CX, CY }, 65215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { R + 10, CY }, { CX, CY }, { R, CY }, { CX, CY }, 66215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { CX, B + 10 }, { CX, CY }, { CX, B }, { CX, CY }, 67215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed // extended edges 68215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { L, T - 10 }, { L, B + 10 }, { L, T }, { L, B }, 69215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { R, T - 10 }, { R, B + 10 }, { R, T }, { R, B }, 70215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { L - 10, T }, { R + 10, T }, { L, T }, { R, T }, 71215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed { L - 10, B }, { R + 10, B }, { L, B }, { R, B }, 72215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed }; 73215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed for (i = 0; i < SK_ARRAY_COUNT(gPartial); i += 4) { 74215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed bool valid = SkLineClipper::IntersectLine(&gPartial[i], gR, dst); 75215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed if (!valid || memcmp(&gPartial[i+2], dst, sizeof(dst))) { 76215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed SkDebugf("++++ [%d] %g %g -> %g %g\n", i/2, dst[0].fX, dst[0].fY, dst[1].fX, dst[1].fY); 77215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed } 78215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed REPORTER_ASSERT(reporter, valid && 79215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed !memcmp(&gPartial[i+2], dst, sizeof(dst))); 80215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed } 81215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed 82215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed} 83215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed 84215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reedvoid TestClipper(skiatest::Reporter* reporter) { 85215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed test_intersectline(reporter); 86215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed} 87215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed 88215473cea1702d8acc0316da3e5a9bf4ce0130efMike Reed#include "TestClassDef.h" 89215473cea1702d8acc0316da3e5a9bf4ce0130efMike ReedDEFINE_TESTCLASS("Clipper", TestClipperClass, TestClipper) 90