| Index: src/core/SkEdgeBuilder.cpp
|
| diff --git a/src/core/SkEdgeBuilder.cpp b/src/core/SkEdgeBuilder.cpp
|
| index 608a83c7c73ff8d9cf6622b5f5e58dc01889b5e0..9ac4e9744394d8164cf03c22d5b257a1b2de6ab5 100644
|
| --- a/src/core/SkEdgeBuilder.cpp
|
| +++ b/src/core/SkEdgeBuilder.cpp
|
| @@ -153,12 +153,22 @@ int SkEdgeBuilder::buildPoly(const SkPath& path, const SkIRect* iclip,
|
| return edgePtr - fEdgeList;
|
| }
|
|
|
| +static void handle_quad(SkEdgeBuilder* builder, const SkPoint pts[3]) {
|
| + SkPoint monoX[5];
|
| + int n = SkChopQuadAtYExtrema(pts, monoX);
|
| + for (int i = 0; i <= n; i++) {
|
| + builder->addQuad(&monoX[i * 2]);
|
| + }
|
| +}
|
| +
|
| int SkEdgeBuilder::build(const SkPath& path, const SkIRect* iclip,
|
| int shiftUp) {
|
| fAlloc.reset();
|
| fList.reset();
|
| fShiftUp = shiftUp;
|
|
|
| + SkScalar conicTol = SK_ScalarHalf * (1 << shiftUp);
|
| +
|
| if (SkPath::kLine_SegmentMask == path.getSegmentMasks()) {
|
| return this->buildPoly(path, iclip, shiftUp);
|
| }
|
| @@ -192,6 +202,24 @@ int SkEdgeBuilder::build(const SkPath& path, const SkIRect* iclip,
|
| this->addClipper(&clipper);
|
| }
|
| break;
|
| + case SkPath::kConic_Verb: {
|
| + const int MAX_POW2 = 4;
|
| + const int MAX_QUADS = 1 << MAX_POW2;
|
| + const int MAX_QUAD_PTS = 1 + 2 * MAX_QUADS;
|
| + SkPoint storage[MAX_QUAD_PTS];
|
| +
|
| + SkConic conic;
|
| + conic.set(pts, iter.conicWeight());
|
| + int pow2 = conic.computeQuadPOW2(conicTol);
|
| + pow2 = SkMin32(pow2, MAX_POW2);
|
| + int quadCount = conic.chopIntoQuadsPOW2(storage, pow2);
|
| + SkASSERT(quadCount <= MAX_QUADS);
|
| + for (int i = 0; i < quadCount; ++i) {
|
| + if (clipper.clipQuad(&storage[i * 2], clip)) {
|
| + this->addClipper(&clipper);
|
| + }
|
| + }
|
| + } break;
|
| case SkPath::kCubic_Verb:
|
| if (clipper.clipCubic(pts, clip)) {
|
| this->addClipper(&clipper);
|
| @@ -214,13 +242,26 @@ int SkEdgeBuilder::build(const SkPath& path, const SkIRect* iclip,
|
| this->addLine(pts);
|
| break;
|
| case SkPath::kQuad_Verb: {
|
| - SkPoint monoX[5];
|
| - int n = SkChopQuadAtYExtrema(pts, monoX);
|
| - for (int i = 0; i <= n; i++) {
|
| - this->addQuad(&monoX[i * 2]);
|
| - }
|
| + handle_quad(this, pts);
|
| break;
|
| }
|
| + case SkPath::kConic_Verb: {
|
| + const int MAX_POW2 = 4;
|
| + const int MAX_QUADS = 1 << MAX_POW2;
|
| + const int MAX_QUAD_PTS = 1 + 2 * MAX_QUADS;
|
| + SkPoint storage[MAX_QUAD_PTS];
|
| +
|
| + SkConic conic;
|
| + conic.set(pts, iter.conicWeight());
|
| + int pow2 = conic.computeQuadPOW2(conicTol);
|
| + pow2 = SkMin32(pow2, MAX_POW2);
|
| + int quadCount = conic.chopIntoQuadsPOW2(storage, pow2);
|
| + SkASSERT(quadCount <= MAX_QUADS);
|
| + SkDebugf("--- quadCount = %d\n", quadCount);
|
| + for (int i = 0; i < quadCount; ++i) {
|
| + handle_quad(this, &storage[i * 2]);
|
| + }
|
| + } break;
|
| case SkPath::kCubic_Verb: {
|
| SkPoint monoY[10];
|
| int n = SkChopCubicAtYExtrema(pts, monoY);
|
|
|