1a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com#include "EdgeDemo.h" 2a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com#include "EdgeWalker_Test.h" 3a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com#include "ShapeOps.h" 4a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com#import "SkCanvas.h" 5a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com#import "SkPaint.h" 6a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com 76aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.comextern void showPath(const SkPath& path, const char* str); 86aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com 96aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.comstatic bool drawPaths(SkCanvas* canvas, const SkPath& path, bool useOld) 106aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com{ 116aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com SkPath out; 126aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com#define SHOW_PATH 0 136aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com#if SHOW_PATH 146aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com showPath(path, "original:"); 156aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com#endif 166aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com if (useOld) { 176aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com simplify(path, true, out); 186aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com } else { 196aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com simplifyx(path, out); 206aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com } 216aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com#if SHOW_PATH 226aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com showPath(out, "simplified:"); 236aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com#endif 246aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com SkPaint paint; 256aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com paint.setAntiAlias(true); 266aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com paint.setStyle(SkPaint::kStroke_Style); 2731143cf37fa38dc98f71c71e518ecc21c83b5e27caryclark@google.com// paint.setStrokeWidth(6); 2831143cf37fa38dc98f71c71e518ecc21c83b5e27caryclark@google.com // paint.setColor(0x1F003f7f); 2931143cf37fa38dc98f71c71e518ecc21c83b5e27caryclark@google.com // canvas->drawPath(path, paint); 306aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com paint.setColor(0xFF305F00); 316aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com paint.setStrokeWidth(1); 326aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com canvas->drawPath(out, paint); 336aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com return true; 346aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com} 356aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com 36a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com// Three circles bounce inside a rectangle. The circles describe three, four 37a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com// or five points which in turn describe a polygon. The polygon points 38a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com// bounce inside the circles. The circles rotate and scale over time. The 39a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com// polygons are combined into a single path, simplified, and stroked. 4003f970652e07c6832cae41fa374cb68ca80d472ccaryclark@google.comstatic bool drawCircles(SkCanvas* canvas, int step, bool useOld) 41a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com{ 42a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com const int circles = 3; 43a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com int scales[circles]; 44a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com int angles[circles]; 45a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com int locs[circles * 2]; 46a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com int pts[circles * 2 * 4]; 47a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com int c, p; 48a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com for (c = 0; c < circles; ++c) { 49a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com scales[c] = abs(10 - (step + c * 4) % 21); 50a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com angles[c] = (step + c * 6) % 600; 51a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com locs[c * 2] = abs(130 - (step + c * 9) % 261); 52a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com locs[c * 2 + 1] = abs(170 - (step + c * 11) % 341); 53a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com for (p = 0; p < 4; ++p) { 54a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com pts[c * 8 + p * 2] = abs(90 - ((step + c * 121 + p * 13) % 190)); 55a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com pts[c * 8 + p * 2 + 1] = abs(110 - ((step + c * 223 + p * 17) % 230)); 56a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com } 57a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com } 586aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com SkPath path; 59a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com for (c = 0; c < circles; ++c) { 60a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com for (p = 0; p < 4; ++p) { 61a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com SkScalar x = pts[c * 8 + p * 2]; 62a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com SkScalar y = pts[c * 8 + p * 2 + 1]; 63a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com x *= 3 + scales[c] / 10.0f; 64a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com y *= 3 + scales[c] / 10.0f; 65a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com SkScalar angle = angles[c] * 3.1415f * 2 / 600; 6603f970652e07c6832cae41fa374cb68ca80d472ccaryclark@google.com SkScalar temp = (SkScalar) (x * cos(angle) - y * sin(angle)); 6703f970652e07c6832cae41fa374cb68ca80d472ccaryclark@google.com y = (SkScalar) (x * sin(angle) + y * cos(angle)); 68a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com x = temp; 69a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com x += locs[c * 2] * 200 / 130.0f; 70a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com y += locs[c * 2 + 1] * 200 / 170.0f; 71a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com x += 50; 72a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com // y += 200; 73a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com if (p == 0) { 74a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com path.moveTo(x, y); 75a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com } else { 76a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com path.lineTo(x, y); 77a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com } 78a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com } 79a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com path.close(); 80a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com } 816aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com return drawPaths(canvas, path, useOld); 82a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com} 83a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com 84d6176b0dcacb124539e0cfd051e6d93a9782f020rmistry@google.comstatic void createStar(SkPath& path, SkScalar innerRadius, SkScalar outerRadius, 85a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com SkScalar startAngle, int points, SkPoint center) { 86a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com SkScalar angle = startAngle; 87a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com for (int index = 0; index < points * 2; ++index) { 88a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com SkScalar radius = index & 1 ? outerRadius : innerRadius; 8903f970652e07c6832cae41fa374cb68ca80d472ccaryclark@google.com SkScalar x = (SkScalar) (radius * cos(angle)); 9003f970652e07c6832cae41fa374cb68ca80d472ccaryclark@google.com SkScalar y = (SkScalar) (radius * sin(angle)); 91a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com x += center.fX; 92a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com y += center.fY; 93a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com if (index == 0) { 94a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com path.moveTo(x, y); 95a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com } else { 96a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com path.lineTo(x, y); 97a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com } 98a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com angle += 3.1415f / points; 99a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com } 100a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com path.close(); 101a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com} 102a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com 10303f970652e07c6832cae41fa374cb68ca80d472ccaryclark@google.comstatic bool drawStars(SkCanvas* canvas, int step, bool useOld) 104a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com{ 1056aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com SkPath path; 106a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com const int stars = 25; 107a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com int pts[stars]; 10803f970652e07c6832cae41fa374cb68ca80d472ccaryclark@google.com // static bool initialize = true; 109a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com int s; 110a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com for (s = 0; s < stars; ++s) { 111a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com pts[s] = 4 + (s % 7); 112a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com } 113a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com SkPoint locs[stars]; 114a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com SkScalar angles[stars]; 115a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com SkScalar innerRadius[stars]; 116a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com SkScalar outerRadius[stars]; 117a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com const int width = 640; 118a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com const int height = 480; 119a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com const int margin = 30; 120a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com const int minRadius = 120; 121a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com const int maxInner = 800; 122a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com const int maxOuter = 1153; 123a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com for (s = 0; s < stars; ++s) { 12403f970652e07c6832cae41fa374cb68ca80d472ccaryclark@google.com int starW = (int) (width - margin * 2 + (SkScalar) s * (stars - s) / stars); 125a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com locs[s].fX = (int) (step * (1.3f * (s + 1) / stars) + s * 121) % (starW * 2); 126a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com if (locs[s].fX > starW) { 127a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com locs[s].fX = starW * 2 - locs[s].fX; 128a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com } 129a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com locs[s].fX += margin; 13003f970652e07c6832cae41fa374cb68ca80d472ccaryclark@google.com int starH = (int) (height - margin * 2 + (SkScalar) s * s / stars); 131a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com locs[s].fY = (int) (step * (1.7f * (s + 1) / stars) + s * 183) % (starH * 2); 132a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com if (locs[s].fY > starH) { 133a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com locs[s].fY = starH * 2 - locs[s].fY; 134a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com } 135a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com locs[s].fY += margin; 136a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com angles[s] = ((step + s * 47) % (360 * 4)) * 3.1415f / 180 / 4; 137a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com innerRadius[s] = (step + s * 30) % (maxInner * 2); 138a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com if (innerRadius[s] > maxInner) { 139a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com innerRadius[s] = (maxInner * 2) - innerRadius[s]; 140a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com } 141a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com innerRadius[s] = innerRadius[s] / 4 + minRadius; 142a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com outerRadius[s] = (step + s * 70) % (maxOuter * 2); 143a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com if (outerRadius[s] > maxOuter) { 144a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com outerRadius[s] = (maxOuter * 2) - outerRadius[s]; 145a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com } 146a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com outerRadius[s] = outerRadius[s] / 4 + minRadius; 147a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com createStar(path, innerRadius[s] / 4.0f, outerRadius[s] / 4.0f, 148a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com angles[s], pts[s], locs[s]); 149a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com } 1506aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com return drawPaths(canvas, path, useOld); 1516aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com} 1526aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com 153aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com#if 0 1546aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.comstatic void tryRoncoOnce(const SkPath& path, const SkRect& target, bool show) { 1556aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com // capture everything in a desired rectangle 1566aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com SkPath tiny; 1576aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com bool closed = true; 1586aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com SkPath::Iter iter(path, false); 1596aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com SkPoint pts[4]; 1606aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com SkPath::Verb verb; 1616aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com int count = 0; 1626aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com SkPoint lastPt; 1636aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com while ((verb = iter.next(pts)) != SkPath::kDone_Verb) { 1646aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com switch (verb) { 1656aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com case SkPath::kMove_Verb: 1666aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com count = 0; 1676aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com break; 1686aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com case SkPath::kLine_Verb: 1696aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com count = 1; 1706aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com break; 1716aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com case SkPath::kQuad_Verb: 1726aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com count = 2; 1736aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com break; 1746aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com case SkPath::kCubic_Verb: 1756aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com count = 3; 1766aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com break; 1776aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com case SkPath::kClose_Verb: 1786aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com if (!closed) { 1796aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com tiny.close(); 1806aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com closed = true; 1816aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com } 1826aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com count = 0; 1836aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com break; 1846aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com default: 1856aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com SkDEBUGFAIL("bad verb"); 1866aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com } 1876aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com if (!count) { 1886aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com continue; 1896aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com } 1906aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com SkRect bounds; 1916aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com bounds.set(pts[0].fX, pts[0].fY, pts[0].fX, pts[0].fY); 1926aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com for (int i = 1; i <= count; ++i) { 1936aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com bounds.growToInclude(pts[i].fX + 0.1f, pts[i].fY + 0.1f); 1946aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com } 1956aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com if (!SkRect::Intersects(target, bounds)) { 1966aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com continue; 1976aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com } 1986aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com if (closed) { 1996aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com tiny.moveTo(pts[0].fX, pts[0].fY); 2006aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com closed = false; 2016aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com } else if (pts[0] != lastPt) { 2026aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com tiny.lineTo(pts[0].fX, pts[0].fY); 2036aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com } 2046aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com switch (verb) { 2056aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com case SkPath::kLine_Verb: 2066aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com tiny.lineTo(pts[1].fX, pts[1].fY); 2076aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com lastPt = pts[1]; 2086aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com break; 2096aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com case SkPath::kQuad_Verb: 2106aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com tiny.quadTo(pts[1].fX, pts[1].fY, pts[2].fX, pts[2].fY); 2116aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com lastPt = pts[2]; 2126aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com break; 2136aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com case SkPath::kCubic_Verb: 2146aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com tiny.cubicTo(pts[1].fX, pts[1].fY, pts[2].fX, pts[2].fY, pts[3].fX, pts[3].fY); 2156aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com lastPt = pts[3]; 2166aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com break; 2176aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com default: 2186aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com SkDEBUGFAIL("bad verb"); 2196aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com } 2206aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com } 2216aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com if (!closed) { 2226aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com tiny.close(); 2236aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com } 224c91dfe417a51f73c28ecf2708df1e0bee942c6eacaryclark@google.com if (show) { 2256aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com showPath(tiny, NULL); 2266aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com SkDebugf("simplified:\n"); 2276aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com } 228a461ff0866526bc51dbd4c4f9f066a727ec21510caryclark@google.com testSimplifyx(tiny); 2296aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com} 230aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com#endif 2316aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com 232aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com#if 0 2336aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.comstatic void tryRonco(const SkPath& path) { 2340b7da433fe0eaa2833d1b2900715b013b36d93dacaryclark@google.com int divMax = 64; 235f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com int divMin = 1; 236f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com int xDivMin = 0; 237f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com int yDivMin = 0; 238f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com bool allYs = true; 239f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com bool allXs = true; 240fb51afb03e76c5701fffaa847584a8b7b2c18a7ecaryclark@google.com if (1) { 2410b7da433fe0eaa2833d1b2900715b013b36d93dacaryclark@google.com divMax = divMin = 64; 2420b7da433fe0eaa2833d1b2900715b013b36d93dacaryclark@google.com xDivMin = 11; 243f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com yDivMin = 0; 244f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com allXs = true; 245f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com allYs = true; 246f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com } 2470b7da433fe0eaa2833d1b2900715b013b36d93dacaryclark@google.com for (int divs = divMax; divs >= divMin; divs /= 2) { 248f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com SkDebugf("divs=%d\n",divs); 249f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com const SkRect& overall = path.getBounds(); 250f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com SkScalar cellWidth = overall.width() / divs * 2; 251f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com SkScalar cellHeight = overall.height() / divs * 2; 252f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com SkRect target; 253f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com int xDivMax = divMax == divMin && !allXs ? xDivMin + 1 : divs; 254f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com int yDivMax = divMax == divMin && !allYs ? yDivMin + 1 : divs; 255f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com for (int xDiv = xDivMin; xDiv < xDivMax; ++xDiv) { 256f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com SkDebugf("xDiv=%d\n",xDiv); 257f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com for (int yDiv = yDivMin; yDiv < yDivMax; ++yDiv) { 258f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com SkDebugf("yDiv=%d\n",yDiv); 2596aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com target.setXYWH(overall.fLeft + (overall.width() - cellWidth) * xDiv / divs, 2606aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com overall.fTop + (overall.height() - cellHeight) * yDiv / divs, 2616aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com cellWidth, cellHeight); 262f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com tryRoncoOnce(path, target, divMax == divMin); 2636aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com } 2646aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com } 2656aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com } 2666aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com} 267aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.com#endif 268439cb51451ef6f55f65dab90eb7f91acf67ea8feskia.committer@gmail.com 2696aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.comstatic bool drawLetters(SkCanvas* canvas, int step, bool useOld) 2706aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com{ 2716aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com SkPath path; 2726aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com const int width = 640; 2736aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com const int height = 480; 2746aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com const char testStr[] = "Merge"; 2756aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com const int testStrLen = sizeof(testStr) - 1; 2766aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com SkPoint textPos[testStrLen]; 2776aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com SkScalar widths[testStrLen]; 2786aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com SkPaint paint; 2796aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com paint.setTextSize(40); 2806aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com paint.setAntiAlias(true); 2816aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com paint.getTextWidths(testStr, testStrLen, widths, NULL); 2826aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com SkScalar running = 0; 2836aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com for (int x = 0; x < testStrLen; ++x) { 2846aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com SkScalar width = widths[x]; 2856aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com widths[x] = running; 2866aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com running += width; 2876aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com } 2886aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com SkScalar bias = (width - widths[testStrLen - 1]) / 2; 2896aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com for (int x = 0; x < testStrLen; ++x) { 2906aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com textPos[x].fX = bias + widths[x]; 2916aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com textPos[x].fY = height / 2; 2926aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com } 2936aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com paint.setTextSize(40 + step / 100.0f); 29431143cf37fa38dc98f71c71e518ecc21c83b5e27caryclark@google.com#if 0 295f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com bool oneShot = false; 2966aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com for (int mask = 0; mask < 1 << testStrLen; ++mask) { 2976aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com char maskStr[testStrLen]; 298f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com#if 1 2990b7da433fe0eaa2833d1b2900715b013b36d93dacaryclark@google.com mask = 12; 300f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com oneShot = true; 301f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com#endif 302f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com SkDebugf("mask=%d\n", mask); 3036aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com for (int letter = 0; letter < testStrLen; ++letter) { 3046aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com maskStr[letter] = mask & (1 << letter) ? testStr[letter] : ' '; 3056aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com } 3066aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com paint.getPosTextPath(maskStr, testStrLen, textPos, &path); 307a461ff0866526bc51dbd4c4f9f066a727ec21510caryclark@google.com // showPath(path, NULL); 308a461ff0866526bc51dbd4c4f9f066a727ec21510caryclark@google.com // SkDebugf("%d simplified:\n", mask); 309c91dfe417a51f73c28ecf2708df1e0bee942c6eacaryclark@google.com tryRonco(path); 310f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com // testSimplifyx(path); 311f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com if (oneShot) { 312f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com break; 313f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com } 31403f970652e07c6832cae41fa374cb68ca80d472ccaryclark@google.com } 31503f970652e07c6832cae41fa374cb68ca80d472ccaryclark@google.com#endif 3166aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com paint.getPosTextPath(testStr, testStrLen, textPos, &path); 3170b7da433fe0eaa2833d1b2900715b013b36d93dacaryclark@google.com#if 0 3186aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com tryRonco(path); 319f839c0359c308fd06895d9f73fc12c4f3869e399caryclark@google.com SkDebugf("RoncoDone!\n"); 320a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com#endif 321a461ff0866526bc51dbd4c4f9f066a727ec21510caryclark@google.com#if 0 3226aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com showPath(path, NULL); 3236aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com SkDebugf("simplified:\n"); 324a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com#endif 3256aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com return drawPaths(canvas, path, false); 326a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com} 327a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com 32803f970652e07c6832cae41fa374cb68ca80d472ccaryclark@google.comstatic bool (*drawDemos[])(SkCanvas* , int , bool ) = { 329a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com drawStars, 3306aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com drawCircles, 3316aea33f92c611d6fdc88bc2352c5c966168af83bcaryclark@google.com drawLetters, 332a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com}; 333a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com 334a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.comstatic size_t drawDemosCount = sizeof(drawDemos) / sizeof(drawDemos[0]); 335a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com 336aa35831d1d0e4c798a63fe772430adc4f3a038cdcaryclark@google.comstatic bool (*firstTest)(SkCanvas* , int , bool) = drawStars; 337a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com 338a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com 33903f970652e07c6832cae41fa374cb68ca80d472ccaryclark@google.combool DrawEdgeDemo(SkCanvas* canvas, int step, bool useOld) { 340a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com size_t index = 0; 341a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com if (firstTest) { 342a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com while (index < drawDemosCount && drawDemos[index] != firstTest) { 343a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com ++index; 344a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com } 345a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com } 34603f970652e07c6832cae41fa374cb68ca80d472ccaryclark@google.com return (*drawDemos[index])(canvas, step, useOld); 347a5764233aa6b207c4169fff7fccae567a160a0fdcaryclark@google.com} 348