| Index: src/gpu/GrClipMaskManager.cpp
|
| diff --git a/src/gpu/GrClipMaskManager.cpp b/src/gpu/GrClipMaskManager.cpp
|
| index fd741b9a2bef61ce6f11804e57eedd30fcb106ae..93481811451da2d2849a8013b830cc3893a3fa6d 100644
|
| --- a/src/gpu/GrClipMaskManager.cpp
|
| +++ b/src/gpu/GrClipMaskManager.cpp
|
| @@ -32,8 +32,8 @@ static const int kMaxAnalyticElements = 4;
|
| ////////////////////////////////////////////////////////////////////////////////
|
| // set up the draw state to enable the aa clipping mask. Besides setting up the
|
| // stage matrix this also alters the vertex layout
|
| -static sk_sp<const GrFragmentProcessor> create_fp_for_mask(GrTexture* result,
|
| - const SkIRect &devBound) {
|
| +static sk_sp<GrFragmentProcessor> create_fp_for_mask(GrTexture* result,
|
| + const SkIRect &devBound) {
|
| SkMatrix mat;
|
| // We use device coords to compute the texture coordinates. We set our matrix to be a
|
| // translation to the devBound, and then a scaling matrix to normalized coords.
|
| @@ -42,7 +42,7 @@ static sk_sp<const GrFragmentProcessor> create_fp_for_mask(GrTexture* result,
|
| SkIntToScalar(-devBound.fTop));
|
|
|
| SkIRect domainTexels = SkIRect::MakeWH(devBound.width(), devBound.height());
|
| - return sk_sp<const GrFragmentProcessor>(GrTextureDomainEffect::Create(
|
| + return sk_sp<GrFragmentProcessor>(GrTextureDomainEffect::Make(
|
| result,
|
| mat,
|
| GrTextureDomain::MakeTexelDomain(result, domainTexels),
|
| @@ -156,20 +156,15 @@ static bool get_analytic_clip_processor(const GrReducedClip::ElementList& elemen
|
| bool abortIfAA,
|
| SkVector& clipToRTOffset,
|
| const SkRect* drawBounds,
|
| - sk_sp<const GrFragmentProcessor>* resultFP) {
|
| + sk_sp<GrFragmentProcessor>* resultFP) {
|
| SkRect boundsInClipSpace;
|
| if (drawBounds) {
|
| boundsInClipSpace = *drawBounds;
|
| boundsInClipSpace.offset(-clipToRTOffset.fX, -clipToRTOffset.fY);
|
| }
|
| SkASSERT(elements.count() <= kMaxAnalyticElements);
|
| - const GrFragmentProcessor* fps[kMaxAnalyticElements];
|
| - for (int i = 0; i < kMaxAnalyticElements; ++i) {
|
| - fps[i] = nullptr;
|
| - }
|
| - int fpCnt = 0;
|
| + SkSTArray<kMaxAnalyticElements, sk_sp<GrFragmentProcessor>> fps;
|
| GrReducedClip::ElementList::Iter iter(elements);
|
| - bool failed = false;
|
| while (iter.get()) {
|
| SkRegion::Op op = iter.get()->getOp();
|
| bool invert;
|
| @@ -190,18 +185,13 @@ static bool get_analytic_clip_processor(const GrReducedClip::ElementList& elemen
|
| // element's primitive, so don't attempt to set skip.
|
| break;
|
| default:
|
| - failed = true;
|
| - break;
|
| - }
|
| - if (failed) {
|
| - break;
|
| + return false;
|
| }
|
| if (!skip) {
|
| GrPrimitiveEdgeType edgeType;
|
| if (iter.get()->isAA()) {
|
| if (abortIfAA) {
|
| - failed = true;
|
| - break;
|
| + return false;
|
| }
|
| edgeType =
|
| invert ? kInverseFillAA_GrProcessorEdgeType : kFillAA_GrProcessorEdgeType;
|
| @@ -212,41 +202,36 @@ static bool get_analytic_clip_processor(const GrReducedClip::ElementList& elemen
|
|
|
| switch (iter.get()->getType()) {
|
| case SkClipStack::Element::kPath_Type:
|
| - fps[fpCnt] = GrConvexPolyEffect::Create(edgeType, iter.get()->getPath(),
|
| - &clipToRTOffset);
|
| + fps.emplace_back(GrConvexPolyEffect::Make(edgeType, iter.get()->getPath(),
|
| + &clipToRTOffset));
|
| break;
|
| case SkClipStack::Element::kRRect_Type: {
|
| SkRRect rrect = iter.get()->getRRect();
|
| rrect.offset(clipToRTOffset.fX, clipToRTOffset.fY);
|
| - fps[fpCnt] = GrRRectEffect::Create(edgeType, rrect);
|
| + fps.emplace_back(GrRRectEffect::Make(edgeType, rrect));
|
| break;
|
| }
|
| case SkClipStack::Element::kRect_Type: {
|
| SkRect rect = iter.get()->getRect();
|
| rect.offset(clipToRTOffset.fX, clipToRTOffset.fY);
|
| - fps[fpCnt] = GrConvexPolyEffect::Create(edgeType, rect);
|
| + fps.emplace_back(GrConvexPolyEffect::Make(edgeType, rect));
|
| break;
|
| }
|
| default:
|
| break;
|
| }
|
| - if (!fps[fpCnt]) {
|
| - failed = true;
|
| - break;
|
| + if (!fps.back()) {
|
| + return false;
|
| }
|
| - fpCnt++;
|
| }
|
| iter.next();
|
| }
|
|
|
| *resultFP = nullptr;
|
| - if (!failed && fpCnt) {
|
| - resultFP->reset(GrFragmentProcessor::RunInSeries(fps, fpCnt));
|
| + if (fps.count()) {
|
| + *resultFP = GrFragmentProcessor::RunInSeries(fps.begin(), fps.count());
|
| }
|
| - for (int i = 0; i < fpCnt; ++i) {
|
| - fps[i]->unref();
|
| - }
|
| - return !failed;
|
| + return true;
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| @@ -320,7 +305,7 @@ bool GrClipMaskManager::SetupClipping(GrContext* context,
|
| disallowAnalyticAA = pipelineBuilder.isHWAntialias() ||
|
| pipelineBuilder.hasUserStencilSettings();
|
| }
|
| - sk_sp<const GrFragmentProcessor> clipFP;
|
| + sk_sp<GrFragmentProcessor> clipFP;
|
| if (elements.isEmpty() ||
|
| (requiresAA &&
|
| get_analytic_clip_processor(elements, disallowAnalyticAA, clipToRTOffset, devBounds,
|
| @@ -328,10 +313,10 @@ bool GrClipMaskManager::SetupClipping(GrContext* context,
|
| SkIRect scissorSpaceIBounds(clipSpaceIBounds);
|
| scissorSpaceIBounds.offset(-clip.origin());
|
| if (!devBounds || !SkRect::Make(scissorSpaceIBounds).contains(*devBounds)) {
|
| - out->makeScissoredFPBased(clipFP, scissorSpaceIBounds);
|
| + out->makeScissoredFPBased(std::move(clipFP), scissorSpaceIBounds);
|
| return true;
|
| }
|
| - out->makeFPBased(clipFP);
|
| + out->makeFPBased(std::move(clipFP));
|
| return true;
|
| }
|
| }
|
| @@ -683,7 +668,7 @@ bool GrClipMaskManager::CreateStencilClipMask(GrContext* context,
|
| if (!clipPath.isEmpty()) {
|
| if (canRenderDirectToStencil) {
|
| GrPaint paint;
|
| - SkSafeUnref(paint.setXPFactory(GrDisableColorXPFactory::Create()));
|
| + paint.setXPFactory(GrDisableColorXPFactory::Make());
|
| paint.setAntiAlias(element->isAA());
|
|
|
| GrPathRenderer::DrawPathArgs args;
|
| @@ -724,7 +709,7 @@ bool GrClipMaskManager::CreateStencilClipMask(GrContext* context,
|
| viewMatrix, element->getRect(), element->isAA(), *pass);
|
| } else {
|
| GrPaint paint;
|
| - SkSafeUnref(paint.setXPFactory(GrDisableColorXPFactory::Create()));
|
| + paint.setXPFactory(GrDisableColorXPFactory::Make());
|
| paint.setAntiAlias(element->isAA());
|
|
|
| GrPathRenderer::DrawPathArgs args;
|
|
|