Home | History | Annotate | Download | only in tests
      1 #include "Test.h"
      2 
      3 #include "SkCubicClipper.h"
      4 #include "SkGeometry.h"
      5 
      6 
      7 static void PrintCurve(const char *name, const SkPoint crv[4]) {
      8     printf("%s: %.10g, %.10g, %.10g, %.10g, %.10g, %.10g, %.10g, %.10g\n",
      9             name,
     10             crv[0].fX, crv[0].fY,
     11             crv[1].fX, crv[1].fY,
     12             crv[2].fX, crv[2].fY,
     13             crv[3].fX, crv[3].fY);
     14 
     15 }
     16 
     17 
     18 static 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 
     34 static 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 
     47 static void TestCubicClipping(skiatest::Reporter* reporter) {
     48     static SkPoint crv[4] = {
     49         { SkFloatToScalar(0), SkFloatToScalar(0)  },
     50         { SkFloatToScalar(2), SkFloatToScalar(3)  },
     51         { SkFloatToScalar(1), SkFloatToScalar(10) },
     52         { SkFloatToScalar(4), SkFloatToScalar(12) }
     53     };
     54 
     55     SkCubicClipper clipper;
     56     SkPoint clipped[4], shouldbe[4];
     57     SkIRect clipRect;
     58     bool success;
     59     const float tol = 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"
    144 DEFINE_TESTCLASS("CubicClipper", CubicClippingTestClass, TestCubicClipping)
    145