aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/core/SkImageFilter.cpp
diff options
context:
space:
mode:
authorGravatar robertphillips <robertphillips@google.com>2016-04-12 11:02:25 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-04-12 11:02:25 -0700
commitaf9b8c804643952d5ff3deed62f1355319b72f72 (patch)
treec62ac7137c52816b7f012d5174f92885f2c5b217 /src/core/SkImageFilter.cpp
parent0a74c9d86c7a2fb32184c109170d1946a2cff02d (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.cpp44
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);