ccpr: Remove constant scale when solving the cubic midtangent
We only care about the direction of the tangent vector, not the the magnitude, so a 3x scale is irrelevant. Bug: skia: Change-Id: Icd2d82faf2c700fc794f8d4a59f21b32398b64f0 Reviewed-on: https://skia-review.googlesource.com/142245 Reviewed-by: Greg Daniel <egdaniel@google.com> Commit-Queue: Chris Dalton <csmartdalton@google.com>
This commit is contained in:
parent
0ef539af4c
commit
5ed4df3583
@ -638,9 +638,7 @@ void GrCCGeometry::appendCubics(AppendCubicMode mode, const Sk2f& p0, const Sk2f
|
||||
// This function finds the T value whose tangent angle is halfway between the tangents at T=0 and
|
||||
// T=1 (tan0 and tan1).
|
||||
static inline float find_midtangent(const Sk2f& tan0, const Sk2f& tan1,
|
||||
float scale2, const Sk2f& C2,
|
||||
float scale1, const Sk2f& C1,
|
||||
float scale0, const Sk2f& C0) {
|
||||
const Sk2f& C2, const Sk2f& C1, const Sk2f& C0) {
|
||||
// Tangents point in the direction of increasing T, so tan0 and -tan1 both point toward the
|
||||
// midtangent. 'n' will therefore bisect tan0 and -tan1, giving us the normal to the midtangent.
|
||||
//
|
||||
@ -660,9 +658,6 @@ static inline float find_midtangent(const Sk2f& tan0, const Sk2f& tan1,
|
||||
Sk4f C[2];
|
||||
Sk2f::Store4(C, C2, C1, C0, 0);
|
||||
Sk4f coeffs = C[0]*n[0] + C[1]*n[1];
|
||||
if (1 != scale2 || 1 != scale1 || 1 != scale0) {
|
||||
coeffs *= Sk4f(scale2, scale1, scale0, 0);
|
||||
}
|
||||
|
||||
// Now solve the quadratic.
|
||||
float a = coeffs[0], b = coeffs[1], c = coeffs[2];
|
||||
@ -682,9 +677,9 @@ inline void GrCCGeometry::chopAndAppendCubicAtMidTangent(AppendCubicMode mode, c
|
||||
const Sk2f& p3, const Sk2f& tan0,
|
||||
const Sk2f& tan1,
|
||||
int maxFutureSubdivisions) {
|
||||
float midT = find_midtangent(tan0, tan1, 3, p3 + (p1 - p2)*3 - p0,
|
||||
6, p0 - p1*2 + p2,
|
||||
3, p1 - p0);
|
||||
float midT = find_midtangent(tan0, tan1, p3 + (p1 - p2)*3 - p0,
|
||||
(p0 - p1*2 + p2)*2,
|
||||
p1 - p0);
|
||||
// Use positive logic since NaN fails comparisons. (However midT should not be NaN since we cull
|
||||
// near-flat cubics in cubicTo().)
|
||||
if (!(midT > 0 && midT < 1)) {
|
||||
@ -715,9 +710,9 @@ void GrCCGeometry::conicTo(const SkPoint P[3], float w) {
|
||||
// tangent line. Since the denominator scales dx and dy uniformly, we can throw it out
|
||||
// completely after evaluating the derivative with the standard quotient rule. This leaves
|
||||
// us with a simpler quadratic function that we use to find the midtangent.
|
||||
float midT = find_midtangent(tan0, tan1, 1, (w - 1) * (p2 - p0),
|
||||
1, (p2 - p0) - 2*w*(p1 - p0),
|
||||
1, w*(p1 - p0));
|
||||
float midT = find_midtangent(tan0, tan1, (w - 1) * (p2 - p0),
|
||||
(p2 - p0) - 2*w*(p1 - p0),
|
||||
w*(p1 - p0));
|
||||
// Use positive logic since NaN fails comparisons. (However midT should not be NaN since we
|
||||
// cull near-linear conics above. And while w=0 is flat, it's not a line and has valid
|
||||
// midtangents.)
|
||||
|
Loading…
Reference in New Issue
Block a user