use new faster/vector impl for chopping conics

BUG=skia:

Review URL: https://codereview.chromium.org/1035943002
diff --git a/bench/PathBench.cpp b/bench/PathBench.cpp
index 2e91a0b..a429e2f 100644
--- a/bench/PathBench.cpp
+++ b/bench/PathBench.cpp
@@ -806,44 +806,16 @@
 
 #include "SkGeometry.h"
 
-class ConicBench_Chop5 : public Benchmark {
-    SkConic fRQ;
-public:
-    ConicBench_Chop5()  {
-        fRQ.fPts[0].set(0, 0);
-        fRQ.fPts[1].set(100, 0);
-        fRQ.fPts[2].set(100, 100);
-        fRQ.fW = SkScalarCos(SK_ScalarPI/4);
-    }
-
-private:
-    const char* onGetName() override {
-        return "ratquad-chop-0.5";
-    }
-
-    void onDraw(const int loops, SkCanvas*) override {
-        SkConic dst[2];
-        for (int i = 0; i < loops; ++i) {
-            fRQ.chopAt(0.5f, dst);
-        }
-    }
-
-    typedef Benchmark INHERITED;
-};
-
-class ConicBench_ChopHalf : public Benchmark {
+class ConicBench_Chop : public Benchmark {
 protected:
     SkConic fRQ, fDst[2];
     SkString fName;
-    const bool fUseV2;
 public:
-    ConicBench_ChopHalf(bool useV2) : fUseV2(useV2) {
+    ConicBench_Chop() : fName("conic-chop") {
         fRQ.fPts[0].set(0, 0);
         fRQ.fPts[1].set(100, 0);
         fRQ.fPts[2].set(100, 100);
         fRQ.fW = SkScalarCos(SK_ScalarPI/4);
-
-        fName.printf("conic-chop-half%d", useV2);
     }
 
     bool isSuitableFor(Backend backend) override {
@@ -854,25 +826,19 @@
     const char* onGetName() override { return fName.c_str(); }
 
     void onDraw(const int loops, SkCanvas*) override {
-        if (fUseV2) {
-            for (int i = 0; i < loops; ++i) {
-                fRQ.chop2(fDst);
-            }
-        } else {
-            for (int i = 0; i < loops; ++i) {
-                fRQ.chop(fDst);
-            }
+        for (int i = 0; i < loops; ++i) {
+            fRQ.chop(fDst);
         }
     }
 
     typedef Benchmark INHERITED;
 };
-DEF_BENCH( return new ConicBench_ChopHalf(false); )
-DEF_BENCH( return new ConicBench_ChopHalf(true); )
+DEF_BENCH( return new ConicBench_Chop; )
 
-class ConicBench_EvalPos : public ConicBench_ChopHalf {
+class ConicBench_EvalPos : public ConicBench_Chop {
+    const bool fUseV2;
 public:
-    ConicBench_EvalPos(bool useV2) : ConicBench_ChopHalf(useV2) {
+    ConicBench_EvalPos(bool useV2) : fUseV2(useV2) {
         fName.printf("conic-eval-pos%d", useV2);
     }
     void onDraw(const int loops, SkCanvas*) override {
@@ -894,9 +860,10 @@
 DEF_BENCH( return new ConicBench_EvalPos(false); )
 DEF_BENCH( return new ConicBench_EvalPos(true); )
 
-class ConicBench_EvalTan : public ConicBench_ChopHalf {
+class ConicBench_EvalTan : public ConicBench_Chop {
+    const bool fUseV2;
 public:
-    ConicBench_EvalTan(bool useV2) : ConicBench_ChopHalf(useV2) {
+    ConicBench_EvalTan(bool useV2) : fUseV2(useV2) {
         fName.printf("conic-eval-tan%d", useV2);
     }
     void onDraw(const int loops, SkCanvas*) override {
diff --git a/src/core/SkGeometry.cpp b/src/core/SkGeometry.cpp
index 24946b9..d542695 100644
--- a/src/core/SkGeometry.cpp
+++ b/src/core/SkGeometry.cpp
@@ -1285,38 +1285,21 @@
     return SkScalarSqrt(SK_ScalarHalf + w * SK_ScalarHalf);
 }
 
-void SkConic::chop(SkConic dst[2]) const {
-    SkScalar scale = SkScalarInvert(SK_Scalar1 + fW);
-    SkScalar p1x = fW * fPts[1].fX;
-    SkScalar p1y = fW * fPts[1].fY;
-    SkScalar mx = (fPts[0].fX + 2 * p1x + fPts[2].fX) * scale * SK_ScalarHalf;
-    SkScalar my = (fPts[0].fY + 2 * p1y + fPts[2].fY) * scale * SK_ScalarHalf;
-
-    dst[0].fPts[0] = fPts[0];
-    dst[0].fPts[1].set((fPts[0].fX + p1x) * scale,
-                       (fPts[0].fY + p1y) * scale);
-    dst[0].fPts[2].set(mx, my);
-
-    dst[1].fPts[0].set(mx, my);
-    dst[1].fPts[1].set((p1x + fPts[2].fX) * scale,
-                       (p1y + fPts[2].fY) * scale);
-    dst[1].fPts[2] = fPts[2];
-
-    dst[0].fW = dst[1].fW = subdivide_w_value(fW);
+static Sk2s twice(const Sk2s& value) {
+    return value + value;
 }
 
-void SkConic::chop2(SkConic * SK_RESTRICT dst) const {
-    Sk2s scale = Sk2s(SK_Scalar1 + fW).invert();    // approxInvert is wicked faster!!!
+void SkConic::chop(SkConic * SK_RESTRICT dst) const {
+    Sk2s scale = Sk2s(SkScalarInvert(SK_Scalar1 + fW));
     SkScalar newW = subdivide_w_value(fW);
 
     Sk2s p0 = from_point(fPts[0]);
     Sk2s p1 = from_point(fPts[1]);
     Sk2s p2 = from_point(fPts[2]);
     Sk2s ww(fW);
-    Sk2s half(0.5f);
 
     Sk2s wp1 = ww * p1;
-    Sk2s m = ((p0 + wp1 + wp1 + p2) * half) * scale;
+    Sk2s m = (p0 + twice(wp1) + p2) * scale * Sk2s(0.5f);
 
     dst[0].fPts[0] = fPts[0];
     dst[0].fPts[1] = to_point((p0 + wp1) * scale);
diff --git a/src/core/SkGeometry.h b/src/core/SkGeometry.h
index a87a19f..bafde61 100644
--- a/src/core/SkGeometry.h
+++ b/src/core/SkGeometry.h
@@ -221,7 +221,6 @@
 
     SkPoint evalAt(SkScalar t) const;
     SkVector evalTangentAt(SkScalar t) const;
-    void chop2(SkConic dst[2]) const;
 
     void computeAsQuadError(SkVector* err) const;
     bool asQuadTol(SkScalar tol) const;
diff --git a/tests/GeometryTest.cpp b/tests/GeometryTest.cpp
index 846afae..0ec7d68 100644
--- a/tests/GeometryTest.cpp
+++ b/tests/GeometryTest.cpp
@@ -83,21 +83,6 @@
     check_pairs(reporter, 0, t, "conic-tan", v0.fX, v0.fY, v1.fX, v1.fY);
 }
 
-static void test_conic_chop_half(skiatest::Reporter* reporter, const SkConic& conic) {
-    SkConic dst0[2], dst1[2];
-    conic.chop(dst0);
-    conic.chop2(dst1);
-
-    for (int i = 0; i < 2; ++i) {
-        REPORTER_ASSERT(reporter, dst0[i].fW == dst1[i].fW);
-        for (int j = 0; j < 3; ++j) {
-            check_pairs(reporter, j, 0.5f, "conic-chop",
-                        dst0[i].fPts[j].fX, dst0[i].fPts[j].fY,
-                        dst0[i].fPts[j].fX, dst1[i].fPts[j].fY);
-        }
-    }
-}
-
 static void test_conic(skiatest::Reporter* reporter) {
     SkRandom rand;
     for (int i = 0; i < 1000; ++i) {
@@ -108,7 +93,6 @@
         for (int k = 0; k < 10; ++k) {
             SkScalar w = rand.nextUScalar1() * 2;
             SkConic conic(pts, w);
-            test_conic_chop_half(reporter, conic);
 
             const SkScalar dt = SK_Scalar1 / 128;
             SkScalar t = dt;