| Index: src/gpu/batches/GrAADistanceFieldPathRenderer.cpp
|
| diff --git a/src/gpu/batches/GrAADistanceFieldPathRenderer.cpp b/src/gpu/batches/GrAADistanceFieldPathRenderer.cpp
|
| index e94cd591f3e30925c6b077c58976c4c0af19a828..1503a8feef64f17a9788e3fd30cc829ef148bafa 100644
|
| --- a/src/gpu/batches/GrAADistanceFieldPathRenderer.cpp
|
| +++ b/src/gpu/batches/GrAADistanceFieldPathRenderer.cpp
|
| @@ -1,6 +1,7 @@
|
|
|
| /*
|
| * 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.
|
| @@ -21,6 +22,7 @@
|
| #include "effects/GrDistanceFieldGeoProc.h"
|
|
|
| #include "SkDistanceFieldGen.h"
|
| +#include "GrDistanceFieldGenFromVector.h"
|
| #include "SkRTConf.h"
|
|
|
| #define ATLAS_TEXTURE_WIDTH 2048
|
| @@ -94,7 +96,7 @@ bool GrAADistanceFieldPathRenderer::onCanDrawPath(const CanDrawPathArgs& args) c
|
| if (args.fViewMatrix->hasPerspective()) {
|
| return false;
|
| }
|
| -
|
| +
|
| // only support paths with bounds within kMediumMIP by kMediumMIP,
|
| // scaled to have bounds within 2.0f*kLargeMIP by 2.0f*kLargeMIP
|
| // the goal is to accelerate rendering of lots of small paths that may be scaling
|
| @@ -109,7 +111,7 @@ bool GrAADistanceFieldPathRenderer::onCanDrawPath(const CanDrawPathArgs& args) c
|
| }
|
| maxDim += extraWidth;
|
| }
|
| -
|
| +
|
| return maxDim <= kMediumMIP && maxDim * maxScale <= 2.0f*kLargeMIP;
|
| }
|
|
|
| @@ -153,7 +155,7 @@ public:
|
|
|
| const char* name() const override { return "AADistanceFieldPathBatch"; }
|
|
|
| - void computePipelineOptimizations(GrInitInvariantOutput* color,
|
| + void computePipelineOptimizations(GrInitInvariantOutput* color,
|
| GrInitInvariantOutput* coverage,
|
| GrBatchToXPOverrides* overrides) const override {
|
| color->setKnownFourComponents(fGeoData[0].fColor);
|
| @@ -358,44 +360,20 @@ private:
|
| 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.fClip = &rasterClip.bwRgn();
|
| - draw.fMatrix = &drawMatrix;
|
| - draw.fDst = dst;
|
| -
|
| - draw.drawPathCoverage(path, paint);
|
| -
|
| - // generate signed distance field
|
| - devPathBounds.outset(SK_DistanceFieldPad, SK_DistanceFieldPad);
|
| - width = devPathBounds.width();
|
| - height = devPathBounds.height();
|
| + // setup signed distance field storage
|
| + SkIRect sdfPathBounds = devPathBounds.makeOutset(SK_DistanceFieldPad, SK_DistanceFieldPad);
|
| + width = sdfPathBounds.width();
|
| + height = sdfPathBounds.height();
|
| // TODO We should really generate this directly into the plot somehow
|
| SkAutoSMalloc<1024> dfStorage(width * height * sizeof(unsigned char));
|
|
|
| - // Generate signed distance field
|
| - SkGenerateDistanceFieldFromA8Image((unsigned char*)dfStorage.get(),
|
| - (const unsigned char*)dst.addr(),
|
| - dst.width(), dst.height(), dst.rowBytes());
|
| + // Generate signed distance field directly from SkPath
|
| + GrGenerateDistanceFieldFromPath((unsigned char*)dfStorage.get(),
|
| + path, drawMatrix,
|
| + width, height, width * sizeof(unsigned char));
|
|
|
| // add to atlas
|
| SkIPoint16 atlasLocation;
|
| @@ -568,7 +546,7 @@ bool GrAADistanceFieldPathRenderer::onDrawPath(const DrawPathArgs& args) {
|
| // generated due to stroking it is important that the original path's id is used
|
| // for caching.
|
| geometry.fGenID = args.fPath->getGenerationID();
|
| -
|
| +
|
| SkAutoTUnref<GrDrawBatch> batch(AADistanceFieldPathBatch::Create(geometry,
|
| *args.fViewMatrix, fAtlas,
|
| &fPathCache, &fPathList));
|
|
|