| Index: src/gpu/batches/GrAADistanceFieldPathRenderer.cpp
|
| diff --git a/src/gpu/batches/GrAADistanceFieldPathRenderer.cpp b/src/gpu/batches/GrAADistanceFieldPathRenderer.cpp
|
| index ad5fa774939887a75577963b3936841ef52e594b..36a9ff01e7552441319f130b11888c3662997a6e 100644
|
| --- a/src/gpu/batches/GrAADistanceFieldPathRenderer.cpp
|
| +++ b/src/gpu/batches/GrAADistanceFieldPathRenderer.cpp
|
| @@ -1,6 +1,5 @@
|
| /*
|
| * Copyright 2014 Google Inc.
|
| - * Copyright 2016 ARM Ltd.
|
| *
|
| * Use of this source code is governed by a BSD-style license that can be
|
| * found in the LICENSE file.
|
| @@ -20,9 +19,7 @@
|
| #include "batches/GrVertexBatch.h"
|
| #include "effects/GrDistanceFieldGeoProc.h"
|
|
|
| -#include "SkPathOps.h"
|
| #include "SkDistanceFieldGen.h"
|
| -#include "GrDistanceFieldGenFromVector.h"
|
|
|
| #define ATLAS_TEXTURE_WIDTH 2048
|
| #define ATLAS_TEXTURE_HEIGHT 2048
|
| @@ -114,24 +111,7 @@
|
| SkRect bounds = args.fShape->styledBounds();
|
| SkScalar maxDim = SkMaxScalar(bounds.width(), bounds.height());
|
|
|
| - if (!(maxDim <= kMediumMIP && maxDim * maxScale <= 2.0f*kLargeMIP)) {
|
| - return false;
|
| - }
|
| -
|
| - // Only support even-odd fill type. (Checked by the IsDistanceFieldSupportedFillType function)
|
| - // The Simplify operation can convert some paths into even-odd fill type.
|
| - // Check whether we can generate distance field from this path after Simplify.
|
| - // TODO: Cache the simplifiedPath/workingPath somewhere for later use.
|
| - SkPath path;
|
| - args.fShape->asPath(&path);
|
| - SkPath simplifiedPath;
|
| - const SkPath* workingPath;
|
| - if (Simplify(path, &simplifiedPath)) {
|
| - workingPath = &simplifiedPath;
|
| - } else {
|
| - workingPath = &path;
|
| - }
|
| - return IsDistanceFieldSupportedFillType(workingPath->getFillType());
|
| + return maxDim <= kMediumMIP && maxDim * maxScale <= 2.0f*kLargeMIP;
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| @@ -346,23 +326,45 @@
|
| drawMatrix.postScale(scale, scale);
|
| drawMatrix.postTranslate(kAntiAliasPad, kAntiAliasPad);
|
|
|
| + // setup bitmap backing
|
| SkASSERT(devPathBounds.fLeft == 0);
|
| SkASSERT(devPathBounds.fTop == 0);
|
| + SkAutoPixmapStorage dst;
|
| + if (!dst.tryAlloc(SkImageInfo::MakeA8(devPathBounds.width(),
|
| + devPathBounds.height()))) {
|
| + return false;
|
| + }
|
| + sk_bzero(dst.writable_addr(), dst.getSafeSize());
|
| +
|
| + // rasterize path
|
| + SkPaint paint;
|
| + paint.setStyle(SkPaint::kFill_Style);
|
| + paint.setAntiAlias(antiAlias);
|
| +
|
| + SkDraw draw;
|
| + sk_bzero(&draw, sizeof(draw));
|
| +
|
| + SkRasterClip rasterClip;
|
| + rasterClip.setRect(devPathBounds);
|
| + draw.fRC = &rasterClip;
|
| + draw.fMatrix = &drawMatrix;
|
| + draw.fDst = dst;
|
|
|
| SkPath path;
|
| shape.asPath(&path);
|
| -
|
| - // setup signed distance field storage
|
| + draw.drawPathCoverage(path, paint);
|
| +
|
| + // generate signed distance field
|
| devPathBounds.outset(SK_DistanceFieldPad, SK_DistanceFieldPad);
|
| width = devPathBounds.width();
|
| height = devPathBounds.height();
|
| // TODO We should really generate this directly into the plot somehow
|
| SkAutoSMalloc<1024> dfStorage(width * height * sizeof(unsigned char));
|
|
|
| - // Generate signed distance field directly from SkPath
|
| - GrGenerateDistanceFieldFromPath((unsigned char*)dfStorage.get(),
|
| - path, drawMatrix,
|
| - width, height, width * sizeof(unsigned char));
|
| + // Generate signed distance field
|
| + SkGenerateDistanceFieldFromA8Image((unsigned char*)dfStorage.get(),
|
| + (const unsigned char*)dst.addr(),
|
| + dst.width(), dst.height(), dst.rowBytes());
|
|
|
| // add to atlas
|
| SkIPoint16 atlasLocation;
|
|
|