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