aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar robertphillips <robertphillips@google.com>2016-08-16 15:49:20 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-08-16 15:49:20 -0700
commit287e7cb936f06634cadf1c6d908dc677012c996b (patch)
treed95ff6a0cb40f3e9f8f7e6a25c9e744ac51b08ca /src
parentdc4c2a9fb7210925df7cc5c142b691e6c817ca77 (diff)
Revert of Start using vertex attributes for nine-patch blurred rrect draws (patchset #8 id:140001 of https://codereview.chromium.org/2245653002/ )
Reason for revert: ?? Original issue's description: > Start using vertex attributes for nine-patch blurred rrect draws > > Calved off: > https://codereview.chromium.org/2243133002/ (Pull handling of blurred circles out of GrRRectBlurEffect::Make) > https://codereview.chromium.org/2249463002/ (Update blurred rrect mask filter creation method to also handle caching) > https://codereview.chromium.org/2248533002/ (Update ComputeBlurredRRectParams to compute all the parameters needed for occluded blurred rrect ninepatch draws) > > GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2245653002 > > Committed: https://skia.googlesource.com/skia/+/087905a730241939da320092543c19dc06d5a7b4 TBR=bsalomon@google.com # Skipping CQ checks because original CL landed less than 1 days ago. NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true Review-Url: https://codereview.chromium.org/2250543004
Diffstat (limited to 'src')
-rw-r--r--src/effects/SkBlurMaskFilter.cpp111
1 files changed, 46 insertions, 65 deletions
diff --git a/src/effects/SkBlurMaskFilter.cpp b/src/effects/SkBlurMaskFilter.cpp
index 510442b566..c044333efb 100644
--- a/src/effects/SkBlurMaskFilter.cpp
+++ b/src/effects/SkBlurMaskFilter.cpp
@@ -1081,7 +1081,7 @@ public:
private:
GrGLSLFragmentProcessor* onCreateGLSLInstance() const override;
- GrRRectBlurEffect(float xformedSigma, const SkRRect& devRRect, GrTexture* mask);
+ GrRRectBlurEffect(float sigma, const SkRRect&, GrTexture* profileTexture);
virtual void onGetGLSLProcessorKey(const GrGLSLCaps& caps,
GrProcessorKeyBuilder* b) const override;
@@ -1192,19 +1192,19 @@ sk_sp<GrFragmentProcessor> GrRRectBlurEffect::Make(GrContext* context,
return nullptr;
}
- return sk_sp<GrFragmentProcessor>(new GrRRectBlurEffect(xformedSigma, devRRect, mask.get()));
+ return sk_sp<GrFragmentProcessor>(new GrRRectBlurEffect(xformedSigma,
+ devRRect,
+ mask.get()));
}
void GrRRectBlurEffect::onComputeInvariantOutput(GrInvariantOutput* inout) const {
inout->mulByUnknownSingleComponent();
}
-GrRRectBlurEffect::GrRRectBlurEffect(float xformedSigma,
- const SkRRect& devRRect,
- GrTexture *ninePatchTexture)
- : fRRect(devRRect)
- , fSigma(xformedSigma)
- , fNinePatchAccess(ninePatchTexture) {
+GrRRectBlurEffect::GrRRectBlurEffect(float sigma, const SkRRect& rrect, GrTexture *ninePatchTexture)
+ : fRRect(rrect),
+ fSigma(sigma),
+ fNinePatchAccess(ninePatchTexture) {
this->initClassID<GrRRectBlurEffect>();
this->addTextureAccess(&fNinePatchAccess);
this->setWillReadFragmentPosition();
@@ -1351,9 +1351,6 @@ bool SkBlurMaskFilterImpl::directFilterRRectMaskGPU(GrContext* context,
SkScalar xformedSigma = this->computeXformedSigma(viewMatrix);
- GrPaint newPaint(*grp);
- newPaint.setAntiAlias(false);
-
if (devRRect.isCircle()) {
sk_sp<GrFragmentProcessor> fp(GrCircleBlurFragmentProcessor::Make(
context->textureProvider(),
@@ -1363,7 +1360,9 @@ bool SkBlurMaskFilterImpl::directFilterRRectMaskGPU(GrContext* context,
return false;
}
+ GrPaint newPaint(*grp);
newPaint.addCoverageFragmentProcessor(std::move(fp));
+ newPaint.setAntiAlias(false);
SkRect srcProxyRect = srcRRect.rect();
srcProxyRect.outset(3.0f*fSigma, 3.0f*fSigma);
@@ -1372,69 +1371,51 @@ bool SkBlurMaskFilterImpl::directFilterRRectMaskGPU(GrContext* context,
return true;
}
- SkRRect maskSpaceRRectToDraw;
- SkISize maskSize;
- SkScalar rectXs[SkBlurMaskFilter::kMaxDivisions], rectYs[SkBlurMaskFilter::kMaxDivisions];
- SkScalar texXs[SkBlurMaskFilter::kMaxDivisions], texYs[SkBlurMaskFilter::kMaxDivisions];
- int numX, numY;
- uint32_t skipMask;
-
- bool ninePatchable = SkBlurMaskFilter::ComputeBlurredRRectParams(srcRRect, devRRect, fOccluder,
- fSigma, xformedSigma,
- &maskSpaceRRectToDraw,
- &maskSize,
- rectXs, rectYs, texXs, texYs,
- &numX, &numY, &skipMask);
- if (!ninePatchable) {
+ sk_sp<GrFragmentProcessor> fp(GrRRectBlurEffect::Make(context, fSigma, xformedSigma,
+ srcRRect, devRRect));
+ if (!fp) {
return false;
}
- if (!this->ignoreXform()) {
- sk_sp<GrTexture> mask(find_or_create_rrect_blur_mask(context,
- maskSpaceRRectToDraw, maskSize,
- xformedSigma, true));
- if (!mask) {
- return false;
- }
+ GrPaint newPaint(*grp);
+ newPaint.addCoverageFragmentProcessor(std::move(fp));
+ newPaint.setAntiAlias(false);
- SkMatrix texMatrix;
- texMatrix.setIDiv(mask->width(), mask->height());
+ if (!this->ignoreXform()) {
+ SkRect srcProxyRect = srcRRect.rect();
+ srcProxyRect.outset(3.0f*fSigma, 3.0f*fSigma);
- GrTextureParams params;
- params.reset(SkShader::kClamp_TileMode, GrTextureParams::kBilerp_FilterMode);
+ SkPoint points[8];
+ uint16_t indices[24];
+ int numPoints, numIndices;
- sk_sp<GrFragmentProcessor> fp = GrSimpleTextureEffect::Make(mask.get(), nullptr,
- texMatrix, params);
- if (!fp) {
- return false;
- }
+ SkRect temp = fOccluder;
- newPaint.addColorFragmentProcessor(std::move(fp));
-
- uint32_t checkBit = 0x1;
- for (int y = 0; y < numY-1; ++y) {
- for (int x = 0; x < numX-1; ++x) {
- if (skipMask & checkBit) {
- checkBit <<= 1;
- continue;
- }
- drawContext->fillRectToRect(
- clip, newPaint, viewMatrix,
- SkRect::MakeLTRB(rectXs[x], rectYs[y], rectXs[x+1], rectYs[y+1]), // dst
- SkRect::MakeLTRB(texXs[x], texYs[y], texXs[x+1], texYs[y+1])); // src
- checkBit <<= 1;
- }
- }
- } else {
- sk_sp<GrFragmentProcessor> fp(GrRRectBlurEffect::Make(context,
- fSigma, xformedSigma,
- srcRRect, devRRect));
- if (!fp) {
- return false;
- }
+ if (!temp.isEmpty() && (srcProxyRect.contains(temp) || temp.intersect(srcProxyRect))) {
+ srcProxyRect.toQuad(points);
+ temp.toQuad(&points[4]);
+ numPoints = 8;
- newPaint.addCoverageFragmentProcessor(std::move(fp));
+ static const uint16_t ringI[24] = { 0, 1, 5, 5, 4, 0,
+ 1, 2, 6, 6, 5, 1,
+ 2, 3, 7, 7, 6, 2,
+ 3, 0, 4, 4, 7, 3 };
+ memcpy(indices, ringI, sizeof(ringI));
+ numIndices = 24;
+ } else {
+ // full rect case
+ srcProxyRect.toQuad(points);
+ numPoints = 4;
+
+ static const uint16_t fullI[6] = { 0, 1, 2, 0, 2, 3 };
+ memcpy(indices, fullI, sizeof(fullI));
+ numIndices = 6;
+ }
+
+ drawContext->drawVertices(clip, newPaint, viewMatrix, kTriangles_GrPrimitiveType,
+ numPoints, points, nullptr, nullptr, indices, numIndices);
+ } else {
SkMatrix inverse;
if (!viewMatrix.invert(&inverse)) {
return false;