Revert "Revert "Improve quad edges' smoothness in non-AA cases""

This reverts commit 1e74cad9b4ed8079433d4e62ab3198d97436f5ec.

Reason for revert: the guard flag has now been confirmed to be landed on chromium/src. We should now be able to pass the layout tests.

Original change's description:
> Revert "Improve quad edges' smoothness in non-AA cases"
> 
> This reverts commit d4ed326d6f3704995b0e91292bf2c87e9d36bb14.
> 
> Reason for revert: reverting temporarily to get us rolling into Chrome again.
> 
> Must be this CL right?
> https://storage.googleapis.com/chromium-layout-test-archives/linux_trusty_blink_rel/3364/layout-test-results/results.html
> 
> Original change's description:
> > Improve quad edges' smoothness in non-AA cases
> > 
> > Previously, non-AA quad edges only have an accuracy about 1/2 pixel
> > (while the AA quad edges have an accuracy about 1/8 pixel).  Now, we
> > increase non-AA quad edges' accuracy to 1/8 pixel as well.
> > 
> > The difference is very significant for rotating non-AA filled circles.
> > For example, run `./out/Debug/SampleApp --slide GM:fillcircle` with AA
> > turned off (by pressing b).
> > 
> > The benchmark added reveals that increasing quad accuracy from 1/2 to
> > 1/8 doesn't affect the performance significantly. The following is the
> > 1/2-accuracy performance versus 1/8-accuracy performance:
> > 
> > curr/maxrss     loops   min     median  mean    max     stddev  samples
> > config  bench
> > 7/17  MB        19      2.43µs  2.57µs  2.81µs  10.5µs  22%     16119
> > 8888    path_fill_big_nonaacircle
> > 7/17  MB        17      1.38µs  1.42µs  1.52µs  13µs    20%     21409
> > 8888    path_fill_small_nonaacircle
> > 
> > curr/maxrss     loops   min     median  mean    max     stddev  samples
> > config  bench
> > 7/17  MB        71      2.52µs  2.59µs  2.79µs  7.67µs  19%     7557
> > 8888    path_fill_big_nonaacircle
> > 7/17  MB        64      1.45µs  1.49µs  1.51µs  2.39µs  5%      12704
> > 8888    path_fill_small_nonaacircle
> > 
> > 
> > BUG=skia:
> > 
> > Change-Id: I3482098aeafcc6f2ec9aa3382977c0dc1b650964
> > Reviewed-on: https://skia-review.googlesource.com/6699
> > Reviewed-by: Mike Reed <reed@google.com>
> > Commit-Queue: Yuqian Li <liyuqian@google.com>
> > 
> 
> TBR=caryclark@google.com,liyuqian@google.com,reed@google.com,djsollen@google.com,bungeman@google.com,reviews@skia.org,fmalita@chromium.org
> BUG=skia:
> NOPRESUBMIT=true
> NOTREECHECKS=true
> NOTRY=true
> 
> Change-Id: I5bc4596ab506f6f61ac2da91a07cf51d61114f31
> Reviewed-on: https://skia-review.googlesource.com/6829
> Commit-Queue: Mike Klein <mtklein@google.com>
> Reviewed-by: Mike Klein <mtklein@google.com>
> 

TBR=djsollen@google.com,mtklein@google.com,bungeman@google.com,reviews@skia.org,caryclark@google.com,fmalita@chromium.org,liyuqian@google.com,reed@google.com
BUG=skia:
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true

Change-Id: I0ec2ea8dc0c6ad0ebdcb48878fb301c32443a09e
Reviewed-on: https://skia-review.googlesource.com/6858
Commit-Queue: Yuqian Li <liyuqian@google.com>
Reviewed-by: Yuqian Li <liyuqian@google.com>
diff --git a/bench/PathBench.cpp b/bench/PathBench.cpp
index 4ca4401..449d305 100644
--- a/bench/PathBench.cpp
+++ b/bench/PathBench.cpp
@@ -173,6 +173,23 @@
     typedef PathBench INHERITED;
 };
 
+class NonAACirclePathBench: public CirclePathBench {
+public:
+    NonAACirclePathBench(Flags flags) : INHERITED(flags) {}
+
+    void appendName(SkString* name) override {
+        name->append("nonaacircle");
+    }
+
+    void setupPaint(SkPaint* paint) override {
+        CirclePathBench::setupPaint(paint);
+        paint->setAntiAlias(false);
+    }
+
+private:
+    typedef CirclePathBench INHERITED;
+};
+
 // Test max speedup of Analytic AA for concave paths
 class AAAConcavePathBench : public PathBench {
 public:
@@ -1090,6 +1107,9 @@
 DEF_BENCH( return new CirclePathBench(FLAGS10); )
 DEF_BENCH( return new CirclePathBench(FLAGS11); )
 
+DEF_BENCH( return new NonAACirclePathBench(FLAGS00); )
+DEF_BENCH( return new NonAACirclePathBench(FLAGS10); )
+
 DEF_BENCH( return new AAAConcavePathBench(FLAGS00); )
 DEF_BENCH( return new AAAConcavePathBench(FLAGS10); )
 DEF_BENCH( return new AAAConvexPathBench(FLAGS00); )
diff --git a/src/core/SkEdge.cpp b/src/core/SkEdge.cpp
index 216604b..f8e8d98 100644
--- a/src/core/SkEdge.cpp
+++ b/src/core/SkEdge.cpp
@@ -157,16 +157,22 @@
     return dx;
 }
 
-static inline int diff_to_shift(SkFDot6 dx, SkFDot6 dy)
+static inline int diff_to_shift(SkFDot6 dx, SkFDot6 dy, int shiftAA = 2)
 {
     // cheap calc of distance from center of p0-p2 to the center of the curve
     SkFDot6 dist = cheap_distance(dx, dy);
 
     // shift down dist (it is currently in dot6)
-    // down by 5 should give us 1/2 pixel accuracy (assuming our dist is accurate...)
+    // down by 3 should give us 1/8 pixel accuracy (assuming our dist is accurate...)
     // this is chosen by heuristic: make it as big as possible (to minimize segments)
     // ... but small enough so that our curves still look smooth
+    // When shift > 0, we're using AA and everything is scaled up so we can
+    // lower the accuracy.
+#ifdef SK_SUPPORT_LEGACY_QUAD_SHIFT
     dist = (dist + (1 << 4)) >> 5;
+#else
+    dist = (dist + (1 << 4)) >> (3 + shiftAA);
+#endif
 
     // each subdivision (shift value) cuts this dist (error) by 1/4
     return (32 - SkCLZ(dist)) >> 1;
@@ -214,7 +220,10 @@
     {
         SkFDot6 dx = (SkLeftShift(x1, 1) - x0 - x2) >> 2;
         SkFDot6 dy = (SkLeftShift(y1, 1) - y0 - y2) >> 2;
-        shift = diff_to_shift(dx, dy);
+        // This is a little confusing:
+        // before this line, shift is the scale up factor for AA;
+        // after this line, shift is the fCurveShift.
+        shift = diff_to_shift(dx, dy, shift);
         SkASSERT(shift >= 0);
     }
     // need at least 1 subdivision for our bias trick