diff --git a/gm/aaa.cpp b/gm/aaa.cpp
index 72f953a..8893744 100644
--- a/gm/aaa.cpp
+++ b/gm/aaa.cpp
@@ -81,4 +81,86 @@
     typedef skiagm::GM INHERITED;
 };
 
+class AnalyticAntiAliasGeneralGM : public skiagm::GM {
+public:
+    AnalyticAntiAliasGeneralGM() {}
+
+protected:
+
+    SkString onShortName() override {
+        return SkString("analytic_antialias_general");
+    }
+
+    SkISize onISize() override {
+        return SkISize::Make(W, H);
+    }
+
+    void onDraw(SkCanvas* canvas) override {
+        SkPaint p;
+        p.setColor(SK_ColorRED);
+        p.setAntiAlias(true);
+
+        canvas->clear(0xFFFFFFFF);
+
+        canvas->save();
+        canvas->rotate(1);
+        const SkScalar R = 115.2f, C = 128.0f;
+        SkPath path;
+        path.moveTo(C + R, C);
+        for (int i = 1; i < 8; ++i) {
+            SkScalar a = 2.6927937f * i;
+            SkScalar cosine;
+            SkScalar sine = SkScalarSinCos(a, &cosine);
+            path.lineTo(C + R * cosine, C + R * sine);
+        }
+        canvas->drawPath(path, p);
+        canvas->restore();
+
+        canvas->save();
+        canvas->translate(200, 0);
+        canvas->rotate(1);
+        p.setStyle(SkPaint::kStroke_Style);
+        p.setStrokeWidth(5);
+        canvas->drawPath(path, p);
+        canvas->restore();
+    }
+
+private:
+    typedef skiagm::GM INHERITED;
+};
+
+class AnalyticAntiAliasInverseGM : public skiagm::GM {
+public:
+    AnalyticAntiAliasInverseGM() {}
+
+protected:
+
+    SkString onShortName() override {
+        return SkString("analytic_antialias_inverse");
+    }
+
+    SkISize onISize() override {
+        return SkISize::Make(W, H);
+    }
+
+    void onDraw(SkCanvas* canvas) override {
+        SkPaint p;
+        p.setColor(SK_ColorRED);
+        p.setAntiAlias(true);
+
+        canvas->save();
+
+        SkPath path;
+        path.addCircle(100, 100, 30);
+        path.setFillType(SkPath::kInverseWinding_FillType);
+        canvas->drawPath(path, p);
+        canvas->restore();
+    }
+
+private:
+    typedef skiagm::GM INHERITED;
+};
+
 DEF_GM( return new AnalyticAntiAliasConvexGM; )
+DEF_GM( return new AnalyticAntiAliasGeneralGM; )
+DEF_GM( return new AnalyticAntiAliasInverseGM; )
