| Index: src/effects/SkBlurMaskFilter.cpp
|
| diff --git a/src/effects/SkBlurMaskFilter.cpp b/src/effects/SkBlurMaskFilter.cpp
|
| index 2ec5b90a409ba8a8338e35e6de63a38a2a3f2ac2..0098366b2fbb1aa1fd3d4bde551f3a29e889d085 100644
|
| --- a/src/effects/SkBlurMaskFilter.cpp
|
| +++ b/src/effects/SkBlurMaskFilter.cpp
|
| @@ -612,7 +612,7 @@ public:
|
| const char* name() const override { return "RectBlur"; }
|
|
|
| static GrFragmentProcessor* Create(GrTextureProvider *textureProvider,
|
| - const SkRect& rect, float sigma) {
|
| + const SkRect& rect, float sigma, GrRenderTarget* dst) {
|
| int doubleProfileSize = SkScalarCeilToInt(12*sigma);
|
|
|
| if (doubleProfileSize >= rect.width() || doubleProfileSize >= rect.height()) {
|
| @@ -645,7 +645,7 @@ public:
|
| else {
|
| precision = kDefault_GrSLPrecision;
|
| }
|
| - return new GrRectBlurEffect(rect, sigma, blurProfile, precision);
|
| + return new GrRectBlurEffect(rect, sigma, blurProfile, precision, dst);
|
| }
|
|
|
| const SkRect& getRect() const { return fRect; }
|
| @@ -653,7 +653,7 @@ public:
|
|
|
| private:
|
| GrRectBlurEffect(const SkRect& rect, float sigma, GrTexture *blurProfile,
|
| - GrSLPrecision fPrecision);
|
| + GrSLPrecision fPrecision, GrRenderTarget* dstRT);
|
|
|
| GrGLFragmentProcessor* onCreateGLInstance() const override;
|
|
|
| @@ -800,16 +800,17 @@ GrTexture* GrRectBlurEffect::CreateBlurProfileTexture(GrTextureProvider* texture
|
| if (blurProfile) {
|
| textureProvider->assignUniqueKeyToTexture(key, blurProfile);
|
| }
|
| + blurProfile->setFromRawPixels(true);
|
| }
|
|
|
| return blurProfile;
|
| }
|
|
|
| GrRectBlurEffect::GrRectBlurEffect(const SkRect& rect, float sigma, GrTexture *blurProfile,
|
| - GrSLPrecision precision)
|
| + GrSLPrecision precision, GrRenderTarget* dst)
|
| : fRect(rect)
|
| , fSigma(sigma)
|
| - , fBlurProfileAccess(blurProfile)
|
| + , fBlurProfileAccess(blurProfile, GrTextureParams::kNone_FilterMode,SkShader::kClamp_TileMode, dst)
|
| , fPrecision(precision) {
|
| this->initClassID<GrRectBlurEffect>();
|
| this->addTextureAccess(&fBlurProfileAccess);
|
| @@ -841,7 +842,7 @@ const GrFragmentProcessor* GrRectBlurEffect::TestCreate(GrProcessorTestData* d)
|
| float width = d->fRandom->nextRangeF(200,300);
|
| float height = d->fRandom->nextRangeF(200,300);
|
| return GrRectBlurEffect::Create(d->fContext->textureProvider(), SkRect::MakeWH(width, height),
|
| - sigma);
|
| + sigma, NULL);
|
| }
|
|
|
|
|
| @@ -872,9 +873,9 @@ bool SkBlurMaskFilterImpl::directFilterMaskGPU(GrTextureProvider* texProvider,
|
| int pad = SkScalarCeilToInt(6*xformedSigma)/2;
|
| rect.outset(SkIntToScalar(pad), SkIntToScalar(pad));
|
|
|
| - fp.reset(GrRectBlurEffect::Create(texProvider, rect, xformedSigma));
|
| + fp.reset(GrRectBlurEffect::Create(texProvider, rect, xformedSigma, drawContext->rt_remove_me()));
|
| } else if (path.isOval(&rect) && SkScalarNearlyEqual(rect.width(), rect.height())) {
|
| - fp.reset(GrCircleBlurFragmentProcessor::Create(texProvider, rect, xformedSigma));
|
| + fp.reset(GrCircleBlurFragmentProcessor::Create(texProvider, rect, xformedSigma, drawContext->rt_remove_me()));
|
|
|
| // expand the rect for the coverage geometry
|
| int pad = SkScalarCeilToInt(6*xformedSigma)/2;
|
| @@ -903,7 +904,7 @@ bool SkBlurMaskFilterImpl::directFilterMaskGPU(GrTextureProvider* texProvider,
|
| class GrRRectBlurEffect : public GrFragmentProcessor {
|
| public:
|
|
|
| - static const GrFragmentProcessor* Create(GrTextureProvider*, float sigma, const SkRRect&);
|
| + static const GrFragmentProcessor* Create(GrTextureProvider*, float sigma, const SkRRect&, GrRenderTarget* dst);
|
|
|
| virtual ~GrRRectBlurEffect() {};
|
| const char* name() const override { return "GrRRectBlur"; }
|
| @@ -914,7 +915,7 @@ public:
|
| private:
|
| GrGLFragmentProcessor* onCreateGLInstance() const override;
|
|
|
| - GrRRectBlurEffect(float sigma, const SkRRect&, GrTexture* profileTexture);
|
| + GrRRectBlurEffect(float sigma, const SkRRect&, GrTexture* profileTexture, GrRenderTarget* dst);
|
|
|
| virtual void onGetGLProcessorKey(const GrGLSLCaps& caps,
|
| GrProcessorKeyBuilder* b) const override;
|
| @@ -934,9 +935,9 @@ private:
|
|
|
|
|
| const GrFragmentProcessor* GrRRectBlurEffect::Create(GrTextureProvider* texProvider, float sigma,
|
| - const SkRRect& rrect) {
|
| + const SkRRect& rrect, GrRenderTarget* dst) {
|
| if (rrect.isCircle()) {
|
| - return GrCircleBlurFragmentProcessor::Create(texProvider, rrect.rect(), sigma);
|
| + return GrCircleBlurFragmentProcessor::Create(texProvider, rrect.rect(), sigma, dst);
|
| }
|
|
|
| if (!rrect.isSimpleCircular()) {
|
| @@ -1005,18 +1006,19 @@ const GrFragmentProcessor* GrRRectBlurEffect::Create(GrTextureProvider* texProvi
|
| return nullptr;
|
| }
|
| texProvider->assignUniqueKeyToTexture(key, blurNinePatchTexture);
|
| + blurNinePatchTexture->setFromRawPixels(true);
|
| }
|
| - return new GrRRectBlurEffect(sigma, rrect, blurNinePatchTexture);
|
| + return new GrRRectBlurEffect(sigma, rrect, blurNinePatchTexture, dst);
|
| }
|
|
|
| void GrRRectBlurEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
|
| inout->mulByUnknownSingleComponent();
|
| }
|
|
|
| -GrRRectBlurEffect::GrRRectBlurEffect(float sigma, const SkRRect& rrect, GrTexture *ninePatchTexture)
|
| +GrRRectBlurEffect::GrRRectBlurEffect(float sigma, const SkRRect& rrect, GrTexture *ninePatchTexture, GrRenderTarget* dst)
|
| : fRRect(rrect),
|
| fSigma(sigma),
|
| - fNinePatchAccess(ninePatchTexture) {
|
| + fNinePatchAccess(ninePatchTexture, GrTextureParams::kNone_FilterMode,SkShader::kClamp_TileMode, dst) {
|
| this->initClassID<GrRRectBlurEffect>();
|
| this->addTextureAccess(&fNinePatchAccess);
|
| this->setWillReadFragmentPosition();
|
| @@ -1038,7 +1040,7 @@ const GrFragmentProcessor* GrRRectBlurEffect::TestCreate(GrProcessorTestData* d)
|
| SkScalar sigma = d->fRandom->nextRangeF(1.f,10.f);
|
| SkRRect rrect;
|
| rrect.setRectXY(SkRect::MakeWH(w, h), r, r);
|
| - return GrRRectBlurEffect::Create(d->fContext->textureProvider(), sigma, rrect);
|
| + return GrRRectBlurEffect::Create(d->fContext->textureProvider(), sigma, rrect, NULL);
|
| }
|
|
|
| //////////////////////////////////////////////////////////////////////////////
|
| @@ -1163,7 +1165,7 @@ bool SkBlurMaskFilterImpl::directFilterRRectMaskGPU(GrTextureProvider* texProvid
|
| proxyRect.outset(extra, extra);
|
|
|
| SkAutoTUnref<const GrFragmentProcessor> fp(GrRRectBlurEffect::Create(texProvider,
|
| - xformedSigma, rrect));
|
| + xformedSigma, rrect, drawContext->rt_remove_me()));
|
| if (!fp) {
|
| return false;
|
| }
|
| @@ -1221,6 +1223,8 @@ bool SkBlurMaskFilterImpl::canFilterMaskGPU(const SkRRect& devRRect,
|
| return true;
|
| }
|
|
|
| +#include "GrDrawTarget.h"
|
| +
|
| bool SkBlurMaskFilterImpl::filterMaskGPU(GrTexture* src,
|
| const SkMatrix& ctm,
|
| const SkRect& maskRect,
|
| @@ -1248,7 +1252,10 @@ bool SkBlurMaskFilterImpl::filterMaskGPU(GrTexture* src,
|
| SkMatrix matrix;
|
| matrix.setIDiv(src->width(), src->height());
|
| // Blend pathTexture over blurTexture.
|
| - paint.addCoverageFragmentProcessor(GrSimpleTextureEffect::Create(src, matrix))->unref();
|
| + paint.addCoverageFragmentProcessor(
|
| + GrSimpleTextureEffect::Create(src, matrix, kLocal_GrCoordSet,
|
| + (*result)->asRenderTarget()))->unref();
|
| +
|
| if (kInner_SkBlurStyle == fBlurStyle) {
|
| // inner: dst = dst * src
|
| paint.setCoverageSetOpXPFactory(SkRegion::kIntersect_Op);
|
| @@ -1262,6 +1269,12 @@ bool SkBlurMaskFilterImpl::filterMaskGPU(GrTexture* src,
|
| paint.setCoverageSetOpXPFactory(SkRegion::kDifference_Op);
|
| }
|
|
|
| + GrRenderTarget* rt = (*result)->asRenderTarget();
|
| + SkASSERT(rt);
|
| + GrDrawTarget* dt = rt->getLastDrawTarget();
|
| + SkASSERT(dt);
|
| + SkASSERT(!dt->isClosed());
|
| +
|
| SkAutoTUnref<GrDrawContext> drawContext(context->drawContext((*result)->asRenderTarget()));
|
| if (!drawContext) {
|
| return false;
|
|
|