Chromium Code Reviews| Index: src/utils/SkCurveMeasure.cpp |
| diff --git a/src/utils/SkCurveMeasure.cpp b/src/utils/SkCurveMeasure.cpp |
| index a38a4fd1f0b99b79fe5544ac11905dbfb12232ed..425b6f35efb18cf7dc27306926083cf3fa6d2d1e 100644 |
| --- a/src/utils/SkCurveMeasure.cpp |
| +++ b/src/utils/SkCurveMeasure.cpp |
| @@ -69,6 +69,7 @@ static inline SkVector evaluateDerivative(const SkPoint pts[4], |
| static inline Sk8f evaluateDerivativeLength(const Sk8f& ts, |
| const Sk8f (&xCoeff)[3], |
| const Sk8f (&yCoeff)[3], |
| + const SkScalar w, |
| const SkSegType segType) { |
| Sk8f x; |
| Sk8f y; |
| @@ -81,8 +82,16 @@ static inline Sk8f evaluateDerivativeLength(const Sk8f& ts, |
| x = (xCoeff[0]*ts + xCoeff[1])*ts + xCoeff[2]; |
| y = (yCoeff[0]*ts + yCoeff[1])*ts + yCoeff[2]; |
| break; |
| - case kConic_SegType: |
| - UNIMPLEMENTED; |
| + case kConic_SegType: { |
| + Sk8f xnum = (xCoeff[0]*ts + xCoeff[1])*ts + xCoeff[2]; |
| + Sk8f ynum = (yCoeff[0]*ts + yCoeff[1])*ts + yCoeff[2]; |
| + |
| + Sk8f denom = ts*(-4 + 4*w + ts*(8 - 12*w + 4*w*w + ts*(-8 + 16*w - |
| + 8*w*w + ts*(4 - 8*w + 4*w*w)))) + 1; |
|
caryclark
2016/08/15 19:13:04
Where did this come from? That is, please document
Harry Stern
2016/08/15 20:55:16
I took out those terms. I honestly didn't notice t
Harry Stern
2016/08/17 02:48:46
Also, I have added the mathematica commands used t
|
| + |
| + x = xnum / denom; |
| + y = ynum / denom; |
|
caryclark
2016/08/15 19:13:04
Is there a unit test for this?
Harry Stern
2016/08/15 20:55:16
It's on my todo by tomorrow.
|
| + } |
| break; |
| default: |
| UNIMPLEMENTED; |
| @@ -134,8 +143,27 @@ ArcLengthIntegrator::ArcLengthIntegrator(const SkPoint* pts, SkSegType segType) |
| yCoeff[2] = Sk8f(3.0f*(-Ay + By)); |
| } |
| break; |
| - case kConic_SegType: |
| - UNIMPLEMENTED; |
| + case kConic_SegType: { |
| + float Ax = pts[0].x(); |
| + float Bx = pts[1].x(); |
| + float Cx = pts[2].x(); |
| + float Ay = pts[0].y(); |
| + float By = pts[1].y(); |
| + float Cy = pts[2].y(); |
| + |
| + fConicW = pts[3].x(); |
|
Harry Stern
2016/08/15 18:01:21
fConicW gets set here
|
| + |
| + SkScalar w = fConicW; |
| + |
| + // precompute coefficients for derivative |
| + xCoeff[0] = Sk8f(2*(Ax - Cx - Ax*w + Cx*w)); |
| + xCoeff[1] = Sk8f(-2*(Ax + Cx + 2*(Ax*w - Bx*w))); |
| + xCoeff[2] = Sk8f(-2*(Ax*w + Bx*w)); |
| + |
| + yCoeff[0] = Sk8f(2*(Ay - Cy - Ay*w + Cy*w)); |
| + yCoeff[1] = Sk8f(-2*(Ay + Cy + 2*(Ay*w - By*w))); |
| + yCoeff[2] = Sk8f(-2*(Ay*w + By*w)); |
| + } |
| break; |
| default: |
| UNIMPLEMENTED; |
| @@ -148,7 +176,7 @@ ArcLengthIntegrator::ArcLengthIntegrator(const SkPoint* pts, SkSegType segType) |
| SkScalar ArcLengthIntegrator::computeLength(SkScalar t) { |
| SkScalar length = 0.0f; |
| - Sk8f lengths = evaluateDerivativeLength(absc*t, xCoeff, yCoeff, fSegType); |
| + Sk8f lengths = evaluateDerivativeLength(absc*t, xCoeff, yCoeff, fConicW, fSegType); |
| lengths = weights*lengths; |
| // is it faster or more accurate to sum and then multiply or vice versa? |
| lengths = lengths*(t*0.5f); |