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 "SkLineParameters.h" | 7 #include "SkLineParameters.h" |
8 #include "SkPathOpsCubic.h" | 8 #include "SkPathOpsCubic.h" |
9 #include "SkPathOpsLine.h" | 9 #include "SkPathOpsLine.h" |
10 #include "SkPathOpsQuad.h" | 10 #include "SkPathOpsQuad.h" |
(...skipping 286 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 SkDCubic sub = subDivide(startT, endT); | 297 SkDCubic sub = subDivide(startT, endT); |
298 SkDPoint topPt = sub[0]; | 298 SkDPoint topPt = sub[0]; |
299 if (topPt.fY > sub[3].fY || (topPt.fY == sub[3].fY && topPt.fX > sub[3].fX))
{ | 299 if (topPt.fY > sub[3].fY || (topPt.fY == sub[3].fY && topPt.fX > sub[3].fX))
{ |
300 topPt = sub[3]; | 300 topPt = sub[3]; |
301 } | 301 } |
302 double extremeTs[2]; | 302 double extremeTs[2]; |
303 if (!sub.monotonicInY()) { | 303 if (!sub.monotonicInY()) { |
304 int roots = FindExtrema(sub[0].fY, sub[1].fY, sub[2].fY, sub[3].fY, extr
emeTs); | 304 int roots = FindExtrema(sub[0].fY, sub[1].fY, sub[2].fY, sub[3].fY, extr
emeTs); |
305 for (int index = 0; index < roots; ++index) { | 305 for (int index = 0; index < roots; ++index) { |
306 double t = startT + (endT - startT) * extremeTs[index]; | 306 double t = startT + (endT - startT) * extremeTs[index]; |
307 SkDPoint mid = xyAtT(t); | 307 SkDPoint mid = ptAtT(t); |
308 if (topPt.fY > mid.fY || (topPt.fY == mid.fY && topPt.fX > mid.fX))
{ | 308 if (topPt.fY > mid.fY || (topPt.fY == mid.fY && topPt.fX > mid.fX))
{ |
309 topPt = mid; | 309 topPt = mid; |
310 } | 310 } |
311 } | 311 } |
312 } | 312 } |
313 return topPt; | 313 return topPt; |
314 } | 314 } |
315 | 315 |
316 SkDPoint SkDCubic::xyAtT(double t) const { | 316 SkDPoint SkDCubic::ptAtT(double t) const { |
| 317 if (t == 0) { |
| 318 return fPts[0]; |
| 319 } |
| 320 if (t == 1) { |
| 321 return fPts[3]; |
| 322 } |
317 double one_t = 1 - t; | 323 double one_t = 1 - t; |
318 double one_t2 = one_t * one_t; | 324 double one_t2 = one_t * one_t; |
319 double a = one_t2 * one_t; | 325 double a = one_t2 * one_t; |
320 double b = 3 * one_t2 * t; | 326 double b = 3 * one_t2 * t; |
321 double t2 = t * t; | 327 double t2 = t * t; |
322 double c = 3 * one_t * t2; | 328 double c = 3 * one_t * t2; |
323 double d = t2 * t; | 329 double d = t2 * t; |
324 SkDPoint result = {a * fPts[0].fX + b * fPts[1].fX + c * fPts[2].fX + d * fP
ts[3].fX, | 330 SkDPoint result = {a * fPts[0].fX + b * fPts[1].fX + c * fPts[2].fX + d * fP
ts[3].fX, |
325 a * fPts[0].fY + b * fPts[1].fY + c * fPts[2].fY + d * fPts[3].fY}; | 331 a * fPts[0].fY + b * fPts[1].fY + c * fPts[2].fY + d * fPts[3].fY}; |
326 return result; | 332 return result; |
(...skipping 168 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
495 dst.pts[4].fY = (fPts[1].fY + 2 * fPts[2].fY + fPts[3].fY) / 4; | 501 dst.pts[4].fY = (fPts[1].fY + 2 * fPts[2].fY + fPts[3].fY) / 4; |
496 dst.pts[5].fX = (fPts[2].fX + fPts[3].fX) / 2; | 502 dst.pts[5].fX = (fPts[2].fX + fPts[3].fX) / 2; |
497 dst.pts[5].fY = (fPts[2].fY + fPts[3].fY) / 2; | 503 dst.pts[5].fY = (fPts[2].fY + fPts[3].fY) / 2; |
498 dst.pts[6] = fPts[3]; | 504 dst.pts[6] = fPts[3]; |
499 return dst; | 505 return dst; |
500 } | 506 } |
501 interp_cubic_coords(&fPts[0].fX, &dst.pts[0].fX, t); | 507 interp_cubic_coords(&fPts[0].fX, &dst.pts[0].fX, t); |
502 interp_cubic_coords(&fPts[0].fY, &dst.pts[0].fY, t); | 508 interp_cubic_coords(&fPts[0].fY, &dst.pts[0].fY, t); |
503 return dst; | 509 return dst; |
504 } | 510 } |
OLD | NEW |