blob: 66301fcfdf5a17c8b32e66fa72eda80b4b37403e [file] [log] [blame]
reed@android.coma3d90102009-11-30 12:48:33 +00001#include "Test.h"
2#include "SkPath.h"
3#include "SkLineClipper.h"
4#include "SkEdgeClipper.h"
5
6static void test_intersectline(skiatest::Reporter* reporter) {
7 static const SkScalar L = 0;
8 static const SkScalar T = 0;
9 static const SkScalar R = SkIntToScalar(100);
10 static const SkScalar B = SkIntToScalar(100);
11 static const SkScalar CX = SkScalarHalf(L + R);
12 static const SkScalar CY = SkScalarHalf(T + B);
13 static const SkRect gR = { L, T, R, B };
14
15 size_t i;
16 SkPoint dst[2];
17
18 static const SkPoint gEmpty[] = {
19 // sides
20 { L, CY }, { L - 10, CY },
21 { R, CY }, { R + 10, CY },
22 { CX, T }, { CX, T - 10 },
23 { CX, B }, { CX, B + 10 },
24 // corners
25 { L, T }, { L - 10, T - 10 },
26 { L, B }, { L - 10, B + 10 },
27 { R, T }, { R + 10, T - 10 },
28 { R, B }, { R + 10, B + 10 },
29 };
30 for (i = 0; i < SK_ARRAY_COUNT(gEmpty); i += 2) {
31 bool valid = SkLineClipper::IntersectLine(&gEmpty[i], gR, dst);
32 if (valid) {
33 SkDebugf("----- [%d] %g %g -> %g %g\n", i/2, dst[0].fX, dst[0].fY, dst[1].fX, dst[1].fY);
34 }
35 REPORTER_ASSERT(reporter, !valid);
36 }
37
38 static const SkPoint gFull[] = {
39 // diagonals, chords
40 { L, T }, { R, B },
41 { L, B }, { R, T },
42 { CX, T }, { CX, B },
43 { L, CY }, { R, CY },
44 { CX, T }, { R, CY },
45 { CX, T }, { L, CY },
46 { L, CY }, { CX, B },
47 { R, CY }, { CX, B },
48 // edges
49 { L, T }, { L, B },
50 { R, T }, { R, B },
51 { L, T }, { R, T },
52 { L, B }, { R, B },
53 };
54 for (i = 0; i < SK_ARRAY_COUNT(gFull); i += 2) {
55 bool valid = SkLineClipper::IntersectLine(&gFull[i], gR, dst);
56 if (!valid || memcmp(&gFull[i], dst, sizeof(dst))) {
57 SkDebugf("++++ [%d] %g %g -> %g %g\n", i/2, dst[0].fX, dst[0].fY, dst[1].fX, dst[1].fY);
58 }
59 REPORTER_ASSERT(reporter, valid && !memcmp(&gFull[i], dst, sizeof(dst)));
60 }
61
62 static const SkPoint gPartial[] = {
63 { L - 10, CY }, { CX, CY }, { L, CY }, { CX, CY },
64 { CX, T - 10 }, { CX, CY }, { CX, T }, { CX, CY },
65 { R + 10, CY }, { CX, CY }, { R, CY }, { CX, CY },
66 { CX, B + 10 }, { CX, CY }, { CX, B }, { CX, CY },
67 // extended edges
68 { L, T - 10 }, { L, B + 10 }, { L, T }, { L, B },
69 { R, T - 10 }, { R, B + 10 }, { R, T }, { R, B },
70 { L - 10, T }, { R + 10, T }, { L, T }, { R, T },
71 { L - 10, B }, { R + 10, B }, { L, B }, { R, B },
72 };
73 for (i = 0; i < SK_ARRAY_COUNT(gPartial); i += 4) {
74 bool valid = SkLineClipper::IntersectLine(&gPartial[i], gR, dst);
75 if (!valid || memcmp(&gPartial[i+2], dst, sizeof(dst))) {
76 SkDebugf("++++ [%d] %g %g -> %g %g\n", i/2, dst[0].fX, dst[0].fY, dst[1].fX, dst[1].fY);
77 }
78 REPORTER_ASSERT(reporter, valid &&
79 !memcmp(&gPartial[i+2], dst, sizeof(dst)));
80 }
81
82}
83
84void TestClipper(skiatest::Reporter* reporter) {
85 test_intersectline(reporter);
86}
87
88#include "TestClassDef.h"
89DEFINE_TESTCLASS("Clipper", TestClipperClass, TestClipper)