| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2011 Google Inc. | 2 * Copyright 2011 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 #include "GrPathUtils.h" | 8 #include "GrPathUtils.h" |
| 9 | 9 |
| 10 #include "GrTypes.h" | 10 #include "GrTypes.h" |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 126 uint32_t GrPathUtils::generateCubicPoints(const SkPoint& p0, | 126 uint32_t GrPathUtils::generateCubicPoints(const SkPoint& p0, |
| 127 const SkPoint& p1, | 127 const SkPoint& p1, |
| 128 const SkPoint& p2, | 128 const SkPoint& p2, |
| 129 const SkPoint& p3, | 129 const SkPoint& p3, |
| 130 SkScalar tolSqd, | 130 SkScalar tolSqd, |
| 131 SkPoint** points, | 131 SkPoint** points, |
| 132 uint32_t pointsLeft) { | 132 uint32_t pointsLeft) { |
| 133 if (pointsLeft < 2 || | 133 if (pointsLeft < 2 || |
| 134 (p1.distanceToLineSegmentBetweenSqd(p0, p3) < tolSqd && | 134 (p1.distanceToLineSegmentBetweenSqd(p0, p3) < tolSqd && |
| 135 p2.distanceToLineSegmentBetweenSqd(p0, p3) < tolSqd)) { | 135 p2.distanceToLineSegmentBetweenSqd(p0, p3) < tolSqd)) { |
| 136 (*points)[0] = p3; | 136 (*points)[0] = p3; |
| 137 *points += 1; | 137 *points += 1; |
| 138 return 1; | 138 return 1; |
| 139 } | 139 } |
| 140 SkPoint q[] = { | 140 SkPoint q[] = { |
| 141 { SkScalarAve(p0.fX, p1.fX), SkScalarAve(p0.fY, p1.fY) }, | 141 { SkScalarAve(p0.fX, p1.fX), SkScalarAve(p0.fY, p1.fY) }, |
| 142 { SkScalarAve(p1.fX, p2.fX), SkScalarAve(p1.fY, p2.fY) }, | 142 { SkScalarAve(p1.fX, p2.fX), SkScalarAve(p1.fY, p2.fY) }, |
| 143 { SkScalarAve(p2.fX, p3.fX), SkScalarAve(p2.fY, p3.fY) } | 143 { SkScalarAve(p2.fX, p3.fX), SkScalarAve(p2.fY, p3.fY) } |
| 144 }; | 144 }; |
| 145 SkPoint r[] = { | 145 SkPoint r[] = { |
| 146 { SkScalarAve(q[0].fX, q[1].fX), SkScalarAve(q[0].fY, q[1].fY) }, | 146 { SkScalarAve(q[0].fX, q[1].fX), SkScalarAve(q[0].fY, q[1].fY) }, |
| 147 { SkScalarAve(q[1].fX, q[2].fX), SkScalarAve(q[1].fY, q[2].fY) } | 147 { SkScalarAve(q[1].fX, q[2].fX), SkScalarAve(q[1].fY, q[2].fY) } |
| 148 }; | 148 }; |
| 149 SkPoint s = { SkScalarAve(r[0].fX, r[1].fX), SkScalarAve(r[0].fY, r[1].fY) }
; | 149 SkPoint s = { SkScalarAve(r[0].fX, r[1].fX), SkScalarAve(r[0].fY, r[1].fY) }
; |
| (...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 401 SkPathPriv::FirstDirection dir, | 401 SkPathPriv::FirstDirection dir, |
| 402 SkTArray<SkPoint, true>* quads, | 402 SkTArray<SkPoint, true>* quads, |
| 403 int sublevel = 0) { | 403 int sublevel = 0) { |
| 404 | 404 |
| 405 // Notation: Point a is always p[0]. Point b is p[1] unless p[1] == p[0], in
which case it is | 405 // Notation: Point a is always p[0]. Point b is p[1] unless p[1] == p[0], in
which case it is |
| 406 // p[2]. Point d is always p[3]. Point c is p[2] unless p[2] == p[3], in whi
ch case it is p[1]. | 406 // p[2]. Point d is always p[3]. Point c is p[2] unless p[2] == p[3], in whi
ch case it is p[1]. |
| 407 | 407 |
| 408 SkVector ab = p[1] - p[0]; | 408 SkVector ab = p[1] - p[0]; |
| 409 SkVector dc = p[2] - p[3]; | 409 SkVector dc = p[2] - p[3]; |
| 410 | 410 |
| 411 if (ab.isZero()) { | 411 if (ab.lengthSqd() < SK_ScalarNearlyZero) { |
| 412 if (dc.isZero()) { | 412 if (dc.lengthSqd() < SK_ScalarNearlyZero) { |
| 413 SkPoint* degQuad = quads->push_back_n(3); | 413 SkPoint* degQuad = quads->push_back_n(3); |
| 414 degQuad[0] = p[0]; | 414 degQuad[0] = p[0]; |
| 415 degQuad[1] = p[0]; | 415 degQuad[1] = p[0]; |
| 416 degQuad[2] = p[3]; | 416 degQuad[2] = p[3]; |
| 417 return; | 417 return; |
| 418 } | 418 } |
| 419 ab = p[2] - p[0]; | 419 ab = p[2] - p[0]; |
| 420 } | 420 } |
| 421 if (dc.isZero()) { | 421 if (dc.lengthSqd() < SK_ScalarNearlyZero) { |
| 422 dc = p[1] - p[3]; | 422 dc = p[1] - p[3]; |
| 423 } | 423 } |
| 424 | 424 |
| 425 // When the ab and cd tangents are degenerate or nearly parallel with vector
from d to a the | 425 // When the ab and cd tangents are degenerate or nearly parallel with vector
from d to a the |
| 426 // constraint that the quad point falls between the tangents becomes hard to
enforce and we are | 426 // constraint that the quad point falls between the tangents becomes hard to
enforce and we are |
| 427 // likely to hit the max subdivision count. However, in this case the cubic
is approaching a | 427 // likely to hit the max subdivision count. However, in this case the cubic
is approaching a |
| 428 // line and the accuracy of the quad point isn't so important. We check if t
he two middle cubic | 428 // line and the accuracy of the quad point isn't so important. We check if t
he two middle cubic |
| 429 // control points are very close to the baseline vector. If so then we just
pick quadratic | 429 // control points are very close to the baseline vector. If so then we just
pick quadratic |
| 430 // points on the control polygon. | 430 // points on the control polygon. |
| 431 | 431 |
| (...skipping 375 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 807 set_loop_klm(d, controlK, controlL, controlM); | 807 set_loop_klm(d, controlK, controlL, controlM); |
| 808 } else if (kCusp_SkCubicType == cType) { | 808 } else if (kCusp_SkCubicType == cType) { |
| 809 SkASSERT(0.f == d[0]); | 809 SkASSERT(0.f == d[0]); |
| 810 set_cusp_klm(d, controlK, controlL, controlM); | 810 set_cusp_klm(d, controlK, controlL, controlM); |
| 811 } else if (kQuadratic_SkCubicType == cType) { | 811 } else if (kQuadratic_SkCubicType == cType) { |
| 812 set_quadratic_klm(d, controlK, controlL, controlM); | 812 set_quadratic_klm(d, controlK, controlL, controlM); |
| 813 } | 813 } |
| 814 | 814 |
| 815 calc_cubic_klm(p, controlK, controlL, controlM, klm, &klm[3], &klm[6]); | 815 calc_cubic_klm(p, controlK, controlL, controlM, klm, &klm[3], &klm[6]); |
| 816 } | 816 } |
| OLD | NEW |