| Index: src/gpu/GrPathUtils.cpp
 | 
| diff --git a/src/gpu/GrPathUtils.cpp b/src/gpu/GrPathUtils.cpp
 | 
| index ca878338d343de97e680dd08289ebb3a66dfca5f..e354e413f11485f1bf4df90e0ab6e8aed92a9355 100644
 | 
| --- a/src/gpu/GrPathUtils.cpp
 | 
| +++ b/src/gpu/GrPathUtils.cpp
 | 
| @@ -275,6 +275,39 @@ void GrPathUtils::QuadUVMatrix::set(const GrPoint qPts[3]) {
 | 
|      }
 | 
|  }
 | 
|  
 | 
| +////////////////////////////////////////////////////////////////////////////////
 | 
| +
 | 
| +// k = (y2 - y0, x0 - x2, (x2 - x0)*y0 - (y2 - y0)*x0 )
 | 
| +// l = (2*w * (y1 - y0), 2*w * (x0 - x1), 2*w * (x1*y0 - x0*y1))
 | 
| +// m = (2*w * (y2 - y1), 2*w * (x1 - x2), 2*w * (x2*y1 - x1*y2))
 | 
| +void GrPathUtils::getConicKLM(const SkPoint p[3], const SkScalar weight, SkScalar klm[9]) {
 | 
| +    const SkScalar w2 = 2.f * weight;
 | 
| +    klm[0] = p[2].fY - p[0].fY;
 | 
| +    klm[1] = p[0].fX - p[2].fX;
 | 
| +    klm[2] = (p[2].fX - p[0].fX) * p[0].fY - (p[2].fY - p[0].fY) * p[0].fX;
 | 
| +
 | 
| +    klm[3] = w2 * (p[1].fY - p[0].fY);
 | 
| +    klm[4] = w2 * (p[0].fX - p[1].fX);
 | 
| +    klm[5] = w2 * (p[1].fX * p[0].fY - p[0].fX * p[1].fY);
 | 
| +
 | 
| +    klm[6] = w2 * (p[2].fY - p[1].fY);
 | 
| +    klm[7] = w2 * (p[1].fX - p[2].fX);
 | 
| +    klm[8] = w2 * (p[2].fX * p[1].fY - p[1].fX * p[2].fY);
 | 
| +
 | 
| +    // scale the max absolute value of coeffs to 10
 | 
| +    SkScalar scale = 0.f;
 | 
| +    for (int i = 0; i < 9; ++i) {
 | 
| +       scale = SkMaxScalar(scale, SkScalarAbs(klm[i]));
 | 
| +    }
 | 
| +    SkASSERT(scale > 0.f);
 | 
| +    scale = 10.f / scale;
 | 
| +    for (int i = 0; i < 9; ++i) {
 | 
| +        klm[i] *= scale;
 | 
| +    }
 | 
| +}
 | 
| +
 | 
| +////////////////////////////////////////////////////////////////////////////////
 | 
| +
 | 
|  namespace {
 | 
|  
 | 
|  // a is the first control point of the cubic.
 | 
| 
 |