Move gpu conic calculations to GrPathUtils

BUG=
R=bsalomon@google.com, jvanverth@google.com

Author: egdaniel@google.com

Review URL: https://chromiumcodereview.appspot.com/22865023

git-svn-id: http://skia.googlecode.com/svn/trunk@10832 2bbb7eff-a529-9590-31e7-b0007b416f81
diff --git a/src/gpu/GrPathUtils.cpp b/src/gpu/GrPathUtils.cpp
index ca87833..e354e41 100644
--- a/src/gpu/GrPathUtils.cpp
+++ b/src/gpu/GrPathUtils.cpp
@@ -275,6 +275,39 @@
     }
 }
 
+////////////////////////////////////////////////////////////////////////////////
+
+// 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.