diff options
author | robertphillips <robertphillips@google.com> | 2016-04-12 11:02:25 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-04-12 11:02:25 -0700 |
commit | af9b8c804643952d5ff3deed62f1355319b72f72 (patch) | |
tree | c62ac7137c52816b7f012d5174f92885f2c5b217 /src/core/SkImageFilter.cpp | |
parent | 0a74c9d86c7a2fb32184c109170d1946a2cff02d (diff) |
Switch AlphaThresholdFilter over to new onFilterImage interface
This CL also alters the raster path in two ways:
it now respects the sRGB/linear distinction of its input
it now respects the clip
TBR=reed@google.com
GOLD_TRYBOT_URL= https://gold.skia.org/search2?unt=true&query=source_type%3Dgm&master=false&issue=1879643003
Review URL: https://codereview.chromium.org/1879643003
Diffstat (limited to 'src/core/SkImageFilter.cpp')
-rw-r--r-- | src/core/SkImageFilter.cpp | 44 |
1 files changed, 41 insertions, 3 deletions
diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp index 6cbdf625fb..af2b278e3d 100644 --- a/src/core/SkImageFilter.cpp +++ b/src/core/SkImageFilter.cpp @@ -414,7 +414,7 @@ bool SkImageFilter::filterImageGPUDeprecated(Proxy* proxy, const SkBitmap& src, GrContext* context = srcTexture->getContext(); GrSurfaceDesc desc; - desc.fFlags = kRenderTarget_GrSurfaceFlag, + desc.fFlags = kRenderTarget_GrSurfaceFlag; desc.fWidth = bounds.width(); desc.fHeight = bounds.height(); desc.fConfig = kRGBA_8888_GrPixelConfig; @@ -452,6 +452,44 @@ bool SkImageFilter::filterImageGPUDeprecated(Proxy* proxy, const SkBitmap& src, return false; } +#if SK_SUPPORT_GPU +sk_sp<SkSpecialImage> SkImageFilter::DrawWithFP(GrContext* context, + sk_sp<GrFragmentProcessor> fp, + const SkIRect& bounds, + SkImageFilter::Proxy* proxy) { + GrPaint paint; + paint.addColorFragmentProcessor(fp.get()); + paint.setPorterDuffXPFactory(SkXfermode::kSrc_Mode); + + GrSurfaceDesc desc; + desc.fFlags = kRenderTarget_GrSurfaceFlag; + desc.fWidth = bounds.width(); + desc.fHeight = bounds.height(); + desc.fConfig = kRGBA_8888_GrPixelConfig; + + sk_sp<GrTexture> dst(context->textureProvider()->createApproxTexture(desc)); + if (!dst) { + return nullptr; + } + + sk_sp<GrDrawContext> drawContext(context->drawContext(dst->asRenderTarget())); + if (!drawContext) { + return nullptr; + } + + SkRect srcRect = SkRect::Make(bounds); + SkRect dstRect = SkRect::MakeWH(srcRect.width(), srcRect.height()); + GrClip clip(dstRect); + drawContext->fillRectToRect(clip, paint, SkMatrix::I(), dstRect, srcRect); + + return SkSpecialImage::MakeFromGpu(proxy, + SkIRect::MakeWH(bounds.width(), bounds.height()), + kNeedNewImageUniqueID_SpecialImage, + dst.get()); + +} +#endif + bool SkImageFilter::asAColorFilter(SkColorFilter** filterPtr) const { SkASSERT(nullptr != filterPtr); if (!this->isColorFilterNode(filterPtr)) { @@ -530,8 +568,8 @@ sk_sp<SkSpecialImage> SkImageFilter::applyCropRect(const Context& ctx, SkSpecialImage* src, SkIPoint* srcOffset, SkIRect* bounds) const { - SkIRect srcBounds; - srcBounds = SkIRect::MakeXYWH(srcOffset->fX, srcOffset->fY, src->width(), src->height()); + const SkIRect srcBounds = SkIRect::MakeXYWH(srcOffset->x(), srcOffset->y(), + src->width(), src->height()); SkIRect dstBounds = this->onFilterNodeBounds(srcBounds, ctx.ctm(), kForward_MapDirection); fCropRect.applyTo(dstBounds, ctx.ctm(), this->affectsTransparentBlack(), bounds); |