aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--bench/ImageFilterDAGBench.cpp32
-rw-r--r--src/core/SkImageFilter.cpp26
2 files changed, 43 insertions, 15 deletions
diff --git a/bench/ImageFilterDAGBench.cpp b/bench/ImageFilterDAGBench.cpp
index 74e23efb00..d66d287e18 100644
--- a/bench/ImageFilterDAGBench.cpp
+++ b/bench/ImageFilterDAGBench.cpp
@@ -7,6 +7,7 @@
#include "Benchmark.h"
#include "SkBlurImageFilter.h"
+#include "SkDisplacementMapEffect.h"
#include "SkCanvas.h"
#include "SkMergeImageFilter.h"
@@ -44,4 +45,35 @@ private:
typedef Benchmark INHERITED;
};
+// Exercise a blur filter connected to both inputs of an SkDisplacementMapEffect.
+
+class ImageFilterDisplacedBlur : public Benchmark {
+public:
+ ImageFilterDisplacedBlur() {}
+
+protected:
+ const char* onGetName() override {
+ return "image_filter_displaced_blur";
+ }
+
+ void onDraw(int loops, SkCanvas* canvas) override {
+ for (int j = 0; j < loops; j++) {
+ SkAutoTUnref<SkImageFilter> blur(SkBlurImageFilter::Create(4.0f, 4.0f));
+ SkDisplacementMapEffect::ChannelSelectorType xSelector = SkDisplacementMapEffect::kR_ChannelSelectorType;
+ SkDisplacementMapEffect::ChannelSelectorType ySelector = SkDisplacementMapEffect::kB_ChannelSelectorType;
+ SkScalar scale = 2;
+ SkAutoTUnref<SkImageFilter> displ(SkDisplacementMapEffect::Create(xSelector, ySelector, scale,
+ blur.get(), blur.get()));
+ SkPaint paint;
+ paint.setImageFilter(displ);
+ SkRect rect = SkRect::Make(SkIRect::MakeWH(400, 400));
+ canvas->drawRect(rect, paint);
+ }
+ }
+
+private:
+ typedef Benchmark INHERITED;
+};
+
DEF_BENCH(return new ImageFilterDAGBench;)
+DEF_BENCH(return new ImageFilterDisplacedBlur;)
diff --git a/src/core/SkImageFilter.cpp b/src/core/SkImageFilter.cpp
index fef88fdf37..95793025e8 100644
--- a/src/core/SkImageFilter.cpp
+++ b/src/core/SkImageFilter.cpp
@@ -496,23 +496,19 @@ bool SkImageFilter::filterInputGPU(int index, SkImageFilter::Proxy* proxy,
}
Context ctx(origCtx.ctm(), origCtx.clipBounds(), origCtx.cache(), constraint);
- if (input->canFilterImageGPU()) {
- return input->filterImageGPU(proxy, src, ctx, result, offset);
- } else {
- if (input->filterImage(proxy, src, ctx, result, offset)) {
- if (!result->getTexture()) {
- const SkImageInfo info = result->info();
- if (kUnknown_SkColorType == info.colorType()) {
- return false;
- }
- SkAutoTUnref<GrTexture> resultTex(
- GrRefCachedBitmapTexture(context, *result,GrTextureParams::ClampNoFilter()));
- result->setPixelRef(new SkGrPixelRef(info, resultTex))->unref();
+ if (input->filterImage(proxy, src, ctx, result, offset)) {
+ if (!result->getTexture()) {
+ const SkImageInfo info = result->info();
+ if (kUnknown_SkColorType == info.colorType()) {
+ return false;
}
- return true;
- } else {
- return false;
+ SkAutoTUnref<GrTexture> resultTex(
+ GrRefCachedBitmapTexture(context, *result,GrTextureParams::ClampNoFilter()));
+ result->setPixelRef(new SkGrPixelRef(info, resultTex))->unref();
}
+ return true;
+ } else {
+ return false;
}
}
#endif