Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(734)

Side by Side Diff: src/pathops/SkPathOpsCubic.h

Issue 2426173002: fix fuzzers (Closed)
Patch Set: fix dm Created 4 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/pathops/SkPathOpsConic.cpp ('k') | src/pathops/SkPathOpsCubic.cpp » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright 2012 Google Inc. 2 * Copyright 2012 Google Inc.
3 * 3 *
4 * Use of this source code is governed by a BSD-style license that can be 4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file. 5 * found in the LICENSE file.
6 */ 6 */
7 7
8 #ifndef SkPathOpsCubic_DEFINED 8 #ifndef SkPathOpsCubic_DEFINED
9 #define SkPathOpsCubic_DEFINED 9 #define SkPathOpsCubic_DEFINED
10 10
(...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after
51 double calcPrecision() const; 51 double calcPrecision() const;
52 SkDCubicPair chopAt(double t) const; 52 SkDCubicPair chopAt(double t) const;
53 static void Coefficients(const double* cubic, double* A, double* B, double* C, double* D); 53 static void Coefficients(const double* cubic, double* A, double* B, double* C, double* D);
54 static bool ComplexBreak(const SkPoint pts[4], SkScalar* t); 54 static bool ComplexBreak(const SkPoint pts[4], SkScalar* t);
55 int convexHull(char order[kPointCount]) const; 55 int convexHull(char order[kPointCount]) const;
56 56
57 void debugInit() { 57 void debugInit() {
58 sk_bzero(fPts, sizeof(fPts)); 58 sk_bzero(fPts, sizeof(fPts));
59 } 59 }
60 60
61 void debugSet(const SkDPoint* pts);
62
61 void dump() const; // callable from the debugger when the implementation co de is linked in 63 void dump() const; // callable from the debugger when the implementation co de is linked in
62 void dumpID(int id) const; 64 void dumpID(int id) const;
63 void dumpInner() const; 65 void dumpInner() const;
64 SkDVector dxdyAtT(double t) const; 66 SkDVector dxdyAtT(double t) const;
65 bool endsAreExtremaInXOrY() const; 67 bool endsAreExtremaInXOrY() const;
66 static int FindExtrema(const double src[], double tValue[2]); 68 static int FindExtrema(const double src[], double tValue[2]);
67 int findInflections(double tValues[2]) const; 69 int findInflections(double tValues[2]) const;
68 70
69 static int FindInflections(const SkPoint a[kPointCount], double tValues[2]) { 71 static int FindInflections(const SkPoint a[kPointCount], double tValues[2]) {
70 SkDCubic cubic; 72 SkDCubic cubic;
71 return cubic.set(a).findInflections(tValues); 73 return cubic.set(a).findInflections(tValues);
72 } 74 }
73 75
74 int findMaxCurvature(double tValues[]) const; 76 int findMaxCurvature(double tValues[]) const;
77
78 #ifdef SK_DEBUG
79 SkOpGlobalState* globalState() const { return fDebugGlobalState; }
80 #endif
81
75 bool hullIntersects(const SkDCubic& c2, bool* isLinear) const; 82 bool hullIntersects(const SkDCubic& c2, bool* isLinear) const;
76 bool hullIntersects(const SkDConic& c, bool* isLinear) const; 83 bool hullIntersects(const SkDConic& c, bool* isLinear) const;
77 bool hullIntersects(const SkDQuad& c2, bool* isLinear) const; 84 bool hullIntersects(const SkDQuad& c2, bool* isLinear) const;
78 bool hullIntersects(const SkDPoint* pts, int ptCount, bool* isLinear) const; 85 bool hullIntersects(const SkDPoint* pts, int ptCount, bool* isLinear) const;
79 bool isLinear(int startIndex, int endIndex) const; 86 bool isLinear(int startIndex, int endIndex) const;
80 bool monotonicInX() const; 87 bool monotonicInX() const;
81 bool monotonicInY() const; 88 bool monotonicInY() const;
82 void otherPts(int index, const SkDPoint* o1Pts[kPointCount - 1]) const; 89 void otherPts(int index, const SkDPoint* o1Pts[kPointCount - 1]) const;
83 SkDPoint ptAtT(double t) const; 90 SkDPoint ptAtT(double t) const;
84 static int RootsReal(double A, double B, double C, double D, double t[3]); 91 static int RootsReal(double A, double B, double C, double D, double t[3]);
85 static int RootsValidT(const double A, const double B, const double C, doubl e D, double s[3]); 92 static int RootsValidT(const double A, const double B, const double C, doubl e D, double s[3]);
86 93
87 int searchRoots(double extremes[6], int extrema, double axisIntercept, 94 int searchRoots(double extremes[6], int extrema, double axisIntercept,
88 SearchAxis xAxis, double* validRoots) const; 95 SearchAxis xAxis, double* validRoots) const;
89 96
90 /** 97 /**
91 * Return the number of valid roots (0 < root < 1) for this cubic intersect ing the 98 * Return the number of valid roots (0 < root < 1) for this cubic intersect ing the
92 * specified horizontal line. 99 * specified horizontal line.
93 */ 100 */
94 int horizontalIntersect(double yIntercept, double roots[3]) const; 101 int horizontalIntersect(double yIntercept, double roots[3]) const;
95 /** 102 /**
96 * Return the number of valid roots (0 < root < 1) for this cubic intersect ing the 103 * Return the number of valid roots (0 < root < 1) for this cubic intersect ing the
97 * specified vertical line. 104 * specified vertical line.
98 */ 105 */
99 int verticalIntersect(double xIntercept, double roots[3]) const; 106 int verticalIntersect(double xIntercept, double roots[3]) const;
100 107
101 const SkDCubic& set(const SkPoint pts[kPointCount]) { 108 // add debug only global pointer so asserts can be skipped by fuzzers
109 const SkDCubic& set(const SkPoint pts[kPointCount]
110 SkDEBUGPARAMS(SkOpGlobalState* state = nullptr)) {
102 fPts[0] = pts[0]; 111 fPts[0] = pts[0];
103 fPts[1] = pts[1]; 112 fPts[1] = pts[1];
104 fPts[2] = pts[2]; 113 fPts[2] = pts[2];
105 fPts[3] = pts[3]; 114 fPts[3] = pts[3];
115 SkDEBUGCODE(fDebugGlobalState = state);
106 return *this; 116 return *this;
107 } 117 }
108 118
109 SkDCubic subDivide(double t1, double t2) const; 119 SkDCubic subDivide(double t1, double t2) const;
110 120
111 static SkDCubic SubDivide(const SkPoint a[kPointCount], double t1, double t2 ) { 121 static SkDCubic SubDivide(const SkPoint a[kPointCount], double t1, double t2 ) {
112 SkDCubic cubic; 122 SkDCubic cubic;
113 return cubic.set(a).subDivide(t1, t2); 123 return cubic.set(a).subDivide(t1, t2);
114 } 124 }
115 125
116 void subDivide(const SkDPoint& a, const SkDPoint& d, double t1, double t2, S kDPoint p[2]) const; 126 void subDivide(const SkDPoint& a, const SkDPoint& d, double t1, double t2, S kDPoint p[2]) const;
117 127
118 static void SubDivide(const SkPoint pts[kPointCount], const SkDPoint& a, con st SkDPoint& d, double t1, 128 static void SubDivide(const SkPoint pts[kPointCount], const SkDPoint& a, con st SkDPoint& d, double t1,
119 double t2, SkDPoint p[2]) { 129 double t2, SkDPoint p[2]) {
120 SkDCubic cubic; 130 SkDCubic cubic;
121 cubic.set(pts).subDivide(a, d, t1, t2, p); 131 cubic.set(pts).subDivide(a, d, t1, t2, p);
122 } 132 }
123 133
124 double top(const SkDCubic& dCurve, double startT, double endT, SkDPoint*topP t) const; 134 double top(const SkDCubic& dCurve, double startT, double endT, SkDPoint*topP t) const;
125 SkDQuad toQuad() const; 135 SkDQuad toQuad() const;
126 136
127 static const int gPrecisionUnit; 137 static const int gPrecisionUnit;
128
129 SkDPoint fPts[kPointCount]; 138 SkDPoint fPts[kPointCount];
139 SkDEBUGCODE(SkOpGlobalState* fDebugGlobalState);
130 }; 140 };
131 141
132 /* Given the set [0, 1, 2, 3], and two of the four members, compute an XOR mask 142 /* Given the set [0, 1, 2, 3], and two of the four members, compute an XOR mask
133 that computes the other two. Note that: 143 that computes the other two. Note that:
134 144
135 one ^ two == 3 for (0, 3), (1, 2) 145 one ^ two == 3 for (0, 3), (1, 2)
136 one ^ two < 3 for (0, 1), (0, 2), (1, 3), (2, 3) 146 one ^ two < 3 for (0, 1), (0, 2), (1, 3), (2, 3)
137 3 - (one ^ two) is either 0, 1, or 2 147 3 - (one ^ two) is either 0, 1, or 2
138 1 >> (3 - (one ^ two)) is either 0 or 1 148 1 >> (3 - (one ^ two)) is either 0 or 1
139 thus: 149 thus:
140 returned == 2 for (0, 3), (1, 2) 150 returned == 2 for (0, 3), (1, 2)
141 returned == 3 for (0, 1), (0, 2), (1, 3), (2, 3) 151 returned == 3 for (0, 1), (0, 2), (1, 3), (2, 3)
142 given that: 152 given that:
143 (0, 3) ^ 2 -> (2, 1) (1, 2) ^ 2 -> (3, 0) 153 (0, 3) ^ 2 -> (2, 1) (1, 2) ^ 2 -> (3, 0)
144 (0, 1) ^ 3 -> (3, 2) (0, 2) ^ 3 -> (3, 1) (1, 3) ^ 3 -> (2, 0) (2, 3) ^ 3 -> (1, 0) 154 (0, 1) ^ 3 -> (3, 2) (0, 2) ^ 3 -> (3, 1) (1, 3) ^ 3 -> (2, 0) (2, 3) ^ 3 -> (1, 0)
145 */ 155 */
146 inline int other_two(int one, int two) { 156 inline int other_two(int one, int two) {
147 return 1 >> (3 - (one ^ two)) ^ 3; 157 return 1 >> (3 - (one ^ two)) ^ 3;
148 } 158 }
149 159
150 #endif 160 #endif
OLDNEW
« no previous file with comments | « src/pathops/SkPathOpsConic.cpp ('k') | src/pathops/SkPathOpsCubic.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698