Home | History | Annotate | Download | only in tests
      1 /*
      2  * Copyright 2012 Google Inc.
      3  *
      4  * Use of this source code is governed by a BSD-style license that can be
      5  * found in the LICENSE file.
      6  */
      7 #include "PathOpsTestCommon.h"
      8 #include "SkPathOpsBounds.h"
      9 #include "SkPathOpsCubic.h"
     10 #include "SkPathOpsLine.h"
     11 #include "SkPathOpsQuad.h"
     12 #include "SkPathOpsTriangle.h"
     13 
     14 void CubicToQuads(const SkDCubic& cubic, double precision, SkTArray<SkDQuad, true>& quads) {
     15     SkTArray<double, true> ts;
     16     cubic.toQuadraticTs(precision, &ts);
     17     if (ts.count() <= 0) {
     18         SkDQuad quad = cubic.toQuad();
     19         quads.push_back(quad);
     20         return;
     21     }
     22     double tStart = 0;
     23     for (int i1 = 0; i1 <= ts.count(); ++i1) {
     24         const double tEnd = i1 < ts.count() ? ts[i1] : 1;
     25         SkDCubic part = cubic.subDivide(tStart, tEnd);
     26         SkDQuad quad = part.toQuad();
     27         quads.push_back(quad);
     28         tStart = tEnd;
     29     }
     30 }
     31 
     32 static bool SkDoubleIsNaN(double x) {
     33     return x != x;
     34 }
     35 
     36 bool ValidBounds(const SkPathOpsBounds& bounds) {
     37     if (SkScalarIsNaN(bounds.fLeft)) {
     38         return false;
     39     }
     40     if (SkScalarIsNaN(bounds.fTop)) {
     41         return false;
     42     }
     43     if (SkScalarIsNaN(bounds.fRight)) {
     44         return false;
     45     }
     46     return !SkScalarIsNaN(bounds.fBottom);
     47 }
     48 
     49 bool ValidCubic(const SkDCubic& cubic) {
     50     for (int index = 0; index < 4; ++index) {
     51         if (!ValidPoint(cubic[index])) {
     52             return false;
     53         }
     54     }
     55     return true;
     56 }
     57 
     58 bool ValidLine(const SkDLine& line) {
     59     for (int index = 0; index < 2; ++index) {
     60         if (!ValidPoint(line[index])) {
     61             return false;
     62         }
     63     }
     64     return true;
     65 }
     66 
     67 bool ValidPoint(const SkDPoint& pt) {
     68     if (SkDoubleIsNaN(pt.fX)) {
     69         return false;
     70     }
     71     return !SkDoubleIsNaN(pt.fY);
     72 }
     73 
     74 bool ValidPoints(const SkPoint* pts, int count) {
     75     for (int index = 0; index < count; ++index) {
     76         if (SkScalarIsNaN(pts[index].fX)) {
     77             return false;
     78         }
     79         if (SkScalarIsNaN(pts[index].fY)) {
     80             return false;
     81         }
     82     }
     83     return true;
     84 }
     85 
     86 bool ValidQuad(const SkDQuad& quad) {
     87     for (int index = 0; index < 3; ++index) {
     88         if (!ValidPoint(quad[index])) {
     89             return false;
     90         }
     91     }
     92     return true;
     93 }
     94 
     95 bool ValidTriangle(const SkDTriangle& triangle) {
     96     for (int index = 0; index < 3; ++index) {
     97         if (!ValidPoint(triangle.fPts[index])) {
     98             return false;
     99         }
    100     }
    101     return true;
    102 }
    103 
    104 bool ValidVector(const SkDVector& v) {
    105     if (SkDoubleIsNaN(v.fX)) {
    106         return false;
    107     }
    108     return !SkDoubleIsNaN(v.fY);
    109 }
    110