EdgeWalker_TestUtility.cpp revision 752b60e633a349c5b9f7bcc6a28b8064fc77bb41
1cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com#include "EdgeWalker_Test.h"
2cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com#include "Intersection_Tests.h"
3cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com#include "SkBitmap.h"
4cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com#include "SkCanvas.h"
5cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com#include "SkPaint.h"
6cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com
72e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.comstatic bool gShowPath = false;
8752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.comstatic bool gComparePaths = false;
9752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.comstatic bool gDrawLastAsciiPaths = true;
10cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.comstatic bool gDrawAllAsciiPaths = false;
112e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.comstatic bool gShowAsciiPaths = false;
12752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.comstatic bool gComparePathsAssert = true;
13cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com
142e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.comvoid showPath(const SkPath& path, const char* str) {
15752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com    SkDebugf("%s\n", !str ? "original:" : str);
16cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    SkPath::Iter iter(path, true);
17cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    uint8_t verb;
18cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    SkPoint pts[4];
19cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    while ((verb = iter.next(pts)) != SkPath::kDone_Verb) {
20cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        switch (verb) {
21cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com            case SkPath::kMove_Verb:
222e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com                SkDebugf("path.moveTo(%3.6g, %3.6g);\n", pts[0].fX, pts[0].fY);
23cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com                continue;
24cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com            case SkPath::kLine_Verb:
252e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com                SkDebugf("path.lineTo(%3.6g, %3.6g);\n", pts[1].fX, pts[1].fY);
26cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com                break;
27cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com            case SkPath::kQuad_Verb:
282e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com                SkDebugf("path.quadTo(%3.6g, %3.6g, %3.6g, %3.6g);\n",
29cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com                    pts[1].fX, pts[1].fY, pts[2].fX, pts[2].fY);
30cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com                break;
31cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com            case SkPath::kCubic_Verb:
322e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com                SkDebugf("path.cubicTo(%3.6g, %3.6g, %3.6g, %3.6g);\n",
33cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com                    pts[1].fX, pts[1].fY, pts[2].fX, pts[2].fY,
34cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com                    pts[3].fX, pts[3].fY);
35cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com                break;
36cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com            case SkPath::kClose_Verb:
37cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com                SkDebugf("path.close();\n");
38cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com                continue;
39cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com            default:
40cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com                SkDEBUGFAIL("bad verb");
41cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com                return;
42cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        }
43cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    }
44cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com}
45cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com
46cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.comstatic bool pathsDrawTheSame(const SkPath& one, const SkPath& two) {
47cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    const SkRect& bounds1 = one.getBounds();
48cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    const SkRect& bounds2 = two.getBounds();
49cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    SkRect larger = bounds1;
50cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    larger.join(bounds2);
51cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    SkBitmap bits;
52cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    int bitWidth = SkScalarCeil(larger.width()) + 2;
53cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    int bitHeight = SkScalarCeil(larger.height()) + 2;
54cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    bits.setConfig(SkBitmap::kARGB_8888_Config, bitWidth * 2, bitHeight);
55cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    bits.allocPixels();
56cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    SkCanvas canvas(bits);
57cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.drawColor(SK_ColorWHITE);
58cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    SkPaint paint;
59cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.save();
60cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.translate(-bounds1.fLeft + 1, -bounds1.fTop + 1);
61cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.drawPath(one, paint);
62cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.restore();
63cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.save();
64cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.translate(-bounds1.fLeft + 1 + bitWidth, -bounds1.fTop + 1);
65cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.drawPath(two, paint);
66cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.restore();
67cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    for (int y = 0; y < bitHeight; ++y) {
68cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        uint32_t* addr1 = bits.getAddr32(0, y);
69cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        uint32_t* addr2 = bits.getAddr32(bitWidth, y);
70cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        for (int x = 0; x < bitWidth; ++x) {
71cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com            if (addr1[x] != addr2[x]) {
72cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com                return false;
73cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com                break;
74cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com            }
75cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        }
76cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    }
77cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    return true;
78cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com}
79cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com
80752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.combool drawAsciiPaths(const SkPath& one, const SkPath& two,
81cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        bool drawPaths) {
82cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    if (!drawPaths) {
83752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com        return true;
84cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    }
852e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com    if (gShowAsciiPaths) {
862e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com        showPath(one, "one:");
872e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com        showPath(two, "two:");
88cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    }
89cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    const SkRect& bounds1 = one.getBounds();
90cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    const SkRect& bounds2 = two.getBounds();
91cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    SkRect larger = bounds1;
92cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    larger.join(bounds2);
93cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    SkBitmap bits;
94752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com    char out[256];
95cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    int bitWidth = SkScalarCeil(larger.width()) + 2;
96752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com    if (bitWidth * 2 + 1 >= (int) sizeof(out)) {
97752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com        return false;
98752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com    }
99cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    int bitHeight = SkScalarCeil(larger.height()) + 2;
100752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com    if (bitHeight >= (int) sizeof(out)) {
101752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com        return false;
102752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com    }
103cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    bits.setConfig(SkBitmap::kARGB_8888_Config, bitWidth * 2, bitHeight);
104cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    bits.allocPixels();
105cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    SkCanvas canvas(bits);
106cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.drawColor(SK_ColorWHITE);
107cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    SkPaint paint;
108cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.save();
109cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.translate(-bounds1.fLeft + 1, -bounds1.fTop + 1);
110cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.drawPath(one, paint);
111cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.restore();
112cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.save();
113cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.translate(-bounds2.fLeft + 1 + bitWidth, -bounds2.fTop + 1);
114cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.drawPath(two, paint);
115cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.restore();
116cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    for (int y = 0; y < bitHeight; ++y) {
117cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        uint32_t* addr1 = bits.getAddr32(0, y);
118cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        int x;
119cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        char* outPtr = out;
120cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        for (x = 0; x < bitWidth; ++x) {
121cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com            *outPtr++ = addr1[x] == (uint32_t) -1 ? '_' : 'x';
122cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        }
123cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        *outPtr++ = '|';
124cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        for (x = bitWidth; x < bitWidth * 2; ++x) {
125cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com            *outPtr++ = addr1[x] == (uint32_t) -1 ? '_' : 'x';
126cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        }
127cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        *outPtr++ = '\0';
128cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        SkDebugf("%s\n", out);
129cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    }
130752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com    return true;
131cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com}
132cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com
133cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.comstatic bool scaledDrawTheSame(const SkPath& one, const SkPath& two,
134cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        int a, int b, bool drawPaths) {
135cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    SkMatrix scale;
136cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    scale.reset();
137752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com    float aScale = 1.21f;
138752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com    float bScale = 1.11f;
139752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com    scale.preScale(a * aScale, b * bScale);
140cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    SkPath scaledOne, scaledTwo;
141cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    one.transform(scale, &scaledOne);
142cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    two.transform(scale, &scaledTwo);
143cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    if (pathsDrawTheSame(scaledOne, scaledTwo)) {
144cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        return true;
145cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    }
146752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com    while (!drawAsciiPaths(scaledOne, scaledTwo, drawPaths)) {
147752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com        scale.reset();
148752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com        aScale *= 0.5f;
149752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com        bScale *= 0.5f;
150752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com        scale.preScale(a * aScale, b * bScale);
151752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com        one.transform(scale, &scaledOne);
152752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com        two.transform(scale, &scaledTwo);
153752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com    }
154cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    return false;
155cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com}
156cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com
1572e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.combool comparePaths(const SkPath& one, const SkPath& two) {
158cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    if (pathsDrawTheSame(one, two)) {
1592e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com        return true;
160cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    }
161cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    drawAsciiPaths(one, two, gDrawAllAsciiPaths);
162cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    for (int x = 9; x <= 33; ++x) {
163cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        if (scaledDrawTheSame(one, two, x, x - (x >> 2), gDrawAllAsciiPaths)) {
1642e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com            return true;
165cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        }
166cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    }
167cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    if (!gDrawAllAsciiPaths) {
168cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        scaledDrawTheSame(one, two, 9, 7, gDrawLastAsciiPaths);
169cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    }
1702e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com    if (gComparePathsAssert) {
1712e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com        showPath(one);
1722e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com        showPath(two, "simplified:");
1732e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com        SkASSERT(0);
1742e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com    }
1752e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com    return false;
176cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com}
177cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com
178cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com// doesn't work yet
179cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.comvoid comparePathsTiny(const SkPath& one, const SkPath& two) {
180cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    const SkRect& bounds1 = one.getBounds();
181cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    const SkRect& bounds2 = two.getBounds();
182cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    SkRect larger = bounds1;
183cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    larger.join(bounds2);
184cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    SkBitmap bits;
185cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    int bitWidth = SkScalarCeil(larger.width()) + 2;
186cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    int bitHeight = SkScalarCeil(larger.height()) + 2;
187cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    bits.setConfig(SkBitmap::kA1_Config, bitWidth * 2, bitHeight);
188cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    bits.allocPixels();
189cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    SkCanvas canvas(bits);
190cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.drawColor(SK_ColorWHITE);
191cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    SkPaint paint;
192cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.save();
193cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.translate(-bounds1.fLeft + 1, -bounds1.fTop + 1);
194cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.drawPath(one, paint);
195cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.restore();
196cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.save();
197cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.translate(-bounds2.fLeft + 1, -bounds2.fTop + 1);
198cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.drawPath(two, paint);
199cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    canvas.restore();
200cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    for (int y = 0; y < bitHeight; ++y) {
201cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        uint8_t* addr1 = bits.getAddr1(0, y);
202cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        uint8_t* addr2 = bits.getAddr1(bitWidth, y);
203cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        for (int x = 0; x < bits.rowBytes(); ++x) {
204cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com            SkASSERT(addr1[x] == addr2[x]);
205cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com        }
206cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com    }
207cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com}
208cd4421df5012b75c792c6c8bf2c5ee0410921c15caryclark@google.com
2092e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.combool testSimplify(const SkPath& path, bool fill, SkPath& out) {
2102e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com    if (gShowPath) {
2112e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com        showPath(path);
2122e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com    }
2132e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com    simplify(path, fill, out);
214752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com    if (!gComparePaths) {
215752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com        return true;
216752b60e633a349c5b9f7bcc6a28b8064fc77bb41caryclark@google.com    }
2172e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com    return comparePaths(path, out);
2182e7f4c810dc717383df42d27bdba862514ab6d51caryclark@google.com}
219