aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--bench/PathBench.cpp20
-rw-r--r--src/core/SkEdge.cpp15
2 files changed, 32 insertions, 3 deletions
diff --git a/bench/PathBench.cpp b/bench/PathBench.cpp
index 4ca4401163..449d30558e 100644
--- a/bench/PathBench.cpp
+++ b/bench/PathBench.cpp
@@ -173,6 +173,23 @@ private:
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(FLAGS01); )
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 216604b551..f8e8d98b5d 100644
--- a/src/core/SkEdge.cpp
+++ b/src/core/SkEdge.cpp
@@ -157,16 +157,22 @@ static inline SkFDot6 cheap_distance(SkFDot6 dx, SkFDot6 dy)
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 @@ bool SkQuadraticEdge::setQuadraticWithoutUpdate(const SkPoint pts[3], int shift)
{
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