OLD | NEW |
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 #include "SkGeometry.h" | 7 #include "SkGeometry.h" |
8 #include "SkLineParameters.h" | 8 #include "SkLineParameters.h" |
9 #include "SkPathOpsConic.h" | 9 #include "SkPathOpsConic.h" |
10 #include "SkPathOpsCubic.h" | 10 #include "SkPathOpsCubic.h" |
(...skipping 194 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
205 bool SkDCubic::hullIntersects(const SkDQuad& quad, bool* isLinear) const { | 205 bool SkDCubic::hullIntersects(const SkDQuad& quad, bool* isLinear) const { |
206 return hullIntersects(quad.fPts, quad.kPointCount, isLinear); | 206 return hullIntersects(quad.fPts, quad.kPointCount, isLinear); |
207 } | 207 } |
208 | 208 |
209 bool SkDCubic::hullIntersects(const SkDConic& conic, bool* isLinear) const { | 209 bool SkDCubic::hullIntersects(const SkDConic& conic, bool* isLinear) const { |
210 | 210 |
211 return hullIntersects(conic.fPts, isLinear); | 211 return hullIntersects(conic.fPts, isLinear); |
212 } | 212 } |
213 | 213 |
214 bool SkDCubic::isLinear(int startIndex, int endIndex) const { | 214 bool SkDCubic::isLinear(int startIndex, int endIndex) const { |
| 215 if (fPts[0].approximatelyDEqual(fPts[3])) { |
| 216 return ((const SkDQuad *) this)->isLinear(0, 2); |
| 217 } |
215 SkLineParameters lineParameters; | 218 SkLineParameters lineParameters; |
216 lineParameters.cubicEndPoints(*this, startIndex, endIndex); | 219 lineParameters.cubicEndPoints(*this, startIndex, endIndex); |
217 // FIXME: maybe it's possible to avoid this and compare non-normalized | 220 // FIXME: maybe it's possible to avoid this and compare non-normalized |
218 lineParameters.normalize(); | 221 lineParameters.normalize(); |
219 double tiniest = SkTMin(SkTMin(SkTMin(SkTMin(SkTMin(SkTMin(SkTMin(fPts[0].fX
, fPts[0].fY), | 222 double tiniest = SkTMin(SkTMin(SkTMin(SkTMin(SkTMin(SkTMin(SkTMin(fPts[0].fX
, fPts[0].fY), |
220 fPts[1].fX), fPts[1].fY), fPts[2].fX), fPts[2].fY), fPts[3].fX), fPt
s[3].fY); | 223 fPts[1].fX), fPts[1].fY), fPts[2].fX), fPts[2].fY), fPts[3].fX), fPt
s[3].fY); |
221 double largest = SkTMax(SkTMax(SkTMax(SkTMax(SkTMax(SkTMax(SkTMax(fPts[0].fX
, fPts[0].fY), | 224 double largest = SkTMax(SkTMax(SkTMax(SkTMax(SkTMax(SkTMax(SkTMax(fPts[0].fX
, fPts[0].fY), |
222 fPts[1].fX), fPts[1].fY), fPts[2].fX), fPts[2].fY), fPts[3].fX), fPt
s[3].fY); | 225 fPts[1].fX), fPts[1].fY), fPts[2].fX), fPts[2].fY), fPts[3].fX), fPt
s[3].fY); |
223 largest = SkTMax(largest, -tiniest); | 226 largest = SkTMax(largest, -tiniest); |
224 double distance = lineParameters.controlPtDistance(*this, 1); | 227 double distance = lineParameters.controlPtDistance(*this, 1); |
(...skipping 469 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
694 for (int index = 0; index < roots; ++index) { | 697 for (int index = 0; index < roots; ++index) { |
695 double t = startT + (endT - startT) * extremeTs[index]; | 698 double t = startT + (endT - startT) * extremeTs[index]; |
696 SkDPoint mid = dCurve.ptAtT(t); | 699 SkDPoint mid = dCurve.ptAtT(t); |
697 if (topPt->fY > mid.fY || (topPt->fY == mid.fY && topPt->fX > mid.fX)) { | 700 if (topPt->fY > mid.fY || (topPt->fY == mid.fY && topPt->fX > mid.fX)) { |
698 topT = t; | 701 topT = t; |
699 *topPt = mid; | 702 *topPt = mid; |
700 } | 703 } |
701 } | 704 } |
702 return topT; | 705 return topT; |
703 } | 706 } |
OLD | NEW |