1#include "Test.h" 2 3#include "SkCubicClipper.h" 4#include "SkGeometry.h" 5 6 7static void PrintCurve(const char *name, const SkPoint crv[4]) { 8 printf("%s: %.10g, %.10g, %.10g, %.10g, %.10g, %.10g, %.10g, %.10g\n", 9 name, 10 (float)crv[0].fX, (float)crv[0].fY, 11 (float)crv[1].fX, (float)crv[1].fY, 12 (float)crv[2].fX, (float)crv[2].fY, 13 (float)crv[3].fX, (float)crv[3].fY); 14 15} 16 17 18static bool CurvesAreEqual(const SkPoint c0[4], 19 const SkPoint c1[4], 20 float tol) { 21 for (int i = 0; i < 4; i++) { 22 if (SkScalarAbs(c0[i].fX - c1[i].fX) > SkFloatToScalar(tol) || 23 SkScalarAbs(c0[i].fY - c1[i].fY) > SkFloatToScalar(tol) 24 ) { 25 PrintCurve("c0", c0); 26 PrintCurve("c1", c1); 27 return false; 28 } 29 } 30 return true; 31} 32 33 34static SkPoint* SetCurve(float x0, float y0, 35 float x1, float y1, 36 float x2, float y2, 37 float x3, float y3, 38 SkPoint crv[4]) { 39 crv[0].fX = SkFloatToScalar(x0); crv[0].fY = SkFloatToScalar(y0); 40 crv[1].fX = SkFloatToScalar(x1); crv[1].fY = SkFloatToScalar(y1); 41 crv[2].fX = SkFloatToScalar(x2); crv[2].fY = SkFloatToScalar(y2); 42 crv[3].fX = SkFloatToScalar(x3); crv[3].fY = SkFloatToScalar(y3); 43 return crv; 44} 45 46 47static void TestCubicClipping(skiatest::Reporter* reporter) { 48 static SkPoint crv[4] = { 49 { SkIntToScalar(0), SkIntToScalar(0) }, 50 { SkIntToScalar(2), SkIntToScalar(3) }, 51 { SkIntToScalar(1), SkIntToScalar(10) }, 52 { SkIntToScalar(4), SkIntToScalar(12) } 53 }; 54 55 SkCubicClipper clipper; 56 SkPoint clipped[4], shouldbe[4]; 57 SkIRect clipRect; 58 bool success; 59 const float tol = SkFloatToScalar(1e-4); 60 61 // Test no clip, with plenty of room. 62 clipRect.set(-2, -2, 6, 14); 63 clipper.setClip(clipRect); 64 success = clipper.clipCubic(crv, clipped); 65 REPORTER_ASSERT(reporter, success == true); 66 REPORTER_ASSERT(reporter, CurvesAreEqual(clipped, SetCurve( 67 0, 0, 2, 3, 1, 10, 4, 12, shouldbe), tol)); 68 69 // Test no clip, touching first point. 70 clipRect.set(-2, 0, 6, 14); 71 clipper.setClip(clipRect); 72 success = clipper.clipCubic(crv, clipped); 73 REPORTER_ASSERT(reporter, success == true); 74 REPORTER_ASSERT(reporter, CurvesAreEqual(clipped, SetCurve( 75 0, 0, 2, 3, 1, 10, 4, 12, shouldbe), tol)); 76 77 // Test no clip, touching last point. 78 clipRect.set(-2, -2, 6, 12); 79 clipper.setClip(clipRect); 80 success = clipper.clipCubic(crv, clipped); 81 REPORTER_ASSERT(reporter, success == true); 82 REPORTER_ASSERT(reporter, CurvesAreEqual(clipped, SetCurve( 83 0, 0, 2, 3, 1, 10, 4, 12, shouldbe), tol)); 84 85 // Test all clip. 86 clipRect.set(-2, 14, 6, 20); 87 clipper.setClip(clipRect); 88 success = clipper.clipCubic(crv, clipped); 89 REPORTER_ASSERT(reporter, success == false); 90 91 // Test clip at 1. 92 clipRect.set(-2, 1, 6, 14); 93 clipper.setClip(clipRect); 94 success = clipper.clipCubic(crv, clipped); 95 REPORTER_ASSERT(reporter, success == true); 96 REPORTER_ASSERT(reporter, CurvesAreEqual(clipped, SetCurve( 97 0.5126125216, 1, 98 1.841195941, 4.337081432, 99 1.297019958, 10.19801331, 100 4, 12, 101 shouldbe), tol)); 102 103 // Test clip at 2. 104 clipRect.set(-2, 2, 6, 14); 105 clipper.setClip(clipRect); 106 success = clipper.clipCubic(crv, clipped); 107 REPORTER_ASSERT(reporter, success == true); 108 REPORTER_ASSERT(reporter, CurvesAreEqual(clipped, SetCurve( 109 00.8412352204, 2, 110 1.767683744, 5.400758266, 111 1.55052948, 10.36701965, 112 4, 12, 113 shouldbe), tol)); 114 115 // Test clip at 11. 116 clipRect.set(-2, -2, 6, 11); 117 clipper.setClip(clipRect); 118 success = clipper.clipCubic(crv, clipped); 119 REPORTER_ASSERT(reporter, success == true); 120 REPORTER_ASSERT(reporter, CurvesAreEqual(clipped, SetCurve( 121 0, 0, 122 1.742904663, 2.614356995, 123 1.207521796, 8.266430855, 124 3.026495695, 11, 125 shouldbe), tol)); 126 127 // Test clip at 10. 128 clipRect.set(-2, -2, 6, 10); 129 clipper.setClip(clipRect); 130 success = clipper.clipCubic(crv, clipped); 131 REPORTER_ASSERT(reporter, success == true); 132 REPORTER_ASSERT(reporter, CurvesAreEqual(clipped, SetCurve( 133 0, 0, 134 1.551193237, 2.326789856, 135 1.297736168, 7.059780121, 136 2.505550385, 10, 137 shouldbe), tol)); 138} 139 140 141 142 143#include "TestClassDef.h" 144DEFINE_TESTCLASS("CubicClipper", CubicClippingTestClass, TestCubicClipping) 145