diff options
author | Robert Phillips <robertphillips@google.com> | 2016-12-01 12:42:43 -0500 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2016-12-01 18:35:06 +0000 |
commit | 6e1fca43b4e7d326d202e6672170e767c0017e9d (patch) | |
tree | 8b0f3578c0c7f1696b5b02b270b2b38dfbc7aea1 /gm/animatedimageblurs.cpp | |
parent | ee424acbb87bf999be132a437527e656e37541d7 (diff) |
Add animating blur image filter GM/slide/bench
Probably still worth having but I haven't been able to reproduce the perf regression in
crbug.com/668179 with it yet.
Change-Id: If3b0f2998ff38a17a173895ed9cea6950a81f6b7
Reviewed-on: https://skia-review.googlesource.com/5382
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Robert Phillips <robertphillips@google.com>
Diffstat (limited to 'gm/animatedimageblurs.cpp')
-rw-r--r-- | gm/animatedimageblurs.cpp | 139 |
1 files changed, 139 insertions, 0 deletions
diff --git a/gm/animatedimageblurs.cpp b/gm/animatedimageblurs.cpp new file mode 100644 index 0000000000..db8f55b544 --- /dev/null +++ b/gm/animatedimageblurs.cpp @@ -0,0 +1,139 @@ +/* + * Copyright 2016 Google Inc. + * + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +#include "gm.h" +#include "SkAnimTimer.h" +#include "SkBlurImageFilter.h" +#include "SkRandom.h" +#include "SkRRect.h" + +static const SkScalar kBlurMax = 7.0f; +static const int kNumNodes = 30; +static const int kWidth = 512; +static const int kHeight = 512; +static const SkScalar kBlurAnimationDuration = 4.0f; // in secs + +// This GM draws a lot of layers with animating BlurImageFilters +class AnimatedImageBlurs : public skiagm::GM { +public: + AnimatedImageBlurs() : fLastTime(0.0f) { + this->setBGColor(sk_tool_utils::color_to_565(0xFFCCCCCC)); + } + +protected: + bool runAsBench() const override { return true; } + + SkString onShortName() override { return SkString("animated-image-blurs"); } + + SkISize onISize() override { return SkISize::Make(kWidth, kHeight); } + + void onOnceBeforeDraw() override { + for (int i = 0; i < kNumNodes; ++i) { + fNodes[i].init(&fRand); + } + } + + void onDraw(SkCanvas* canvas) override { + SkPaint paint; + paint.setAntiAlias(true); + + for (int i = 0; i < kNumNodes; ++i) { + SkPaint layerPaint; + layerPaint.setImageFilter(SkBlurImageFilter::Make(fNodes[i].sigma(), + fNodes[i].sigma(), + nullptr)); + + canvas->saveLayer(nullptr, &layerPaint); + // The rect is outset to block the circle case + SkRect rect = SkRect::MakeLTRB(fNodes[i].pos().fX - fNodes[i].size()-0.5f, + fNodes[i].pos().fY - fNodes[i].size()-0.5f, + fNodes[i].pos().fX + fNodes[i].size()+0.5f, + fNodes[i].pos().fY + fNodes[i].size()+0.5f); + SkRRect rrect = SkRRect::MakeRectXY(rect, fNodes[i].size(), fNodes[i].size()); + canvas->drawRRect(rrect, paint); + canvas->restore(); + } + } + + bool onAnimate(const SkAnimTimer& timer) override { + if (0.0f != fLastTime) { + for (int i = 0; i < kNumNodes; ++i) { + fNodes[i].update(timer, fLastTime); + } + } + + fLastTime = timer.secs(); + return true; + } + +private: + class Node { + public: + Node() + : fSize(0.0f) + , fPos { 0.0f, 0.0f } + , fDir { 1.0f, 0.0f } + , fBlurOffset(0.0f) + , fBlur(fBlurOffset) + , fSpeed(0.0f) { + } + + void init(SkRandom* rand) { + fSize = rand->nextRangeF(10.0f, 60.f); + fPos.fX = rand->nextRangeF(fSize, kWidth - fSize); + fPos.fY = rand->nextRangeF(fSize, kHeight - fSize); + fDir.fX = rand->nextRangeF(-1.0f, 1.0f); + fDir.fY = SkScalarSqrt(1.0f - fDir.fX * fDir.fX); + if (rand->nextBool()) { + fDir.fY = -fDir.fY; + } + fBlurOffset = rand->nextRangeF(0.0f, kBlurMax); + fBlur = fBlurOffset; + fSpeed = rand->nextRangeF(20.0f, 60.0f); + } + + void update(const SkAnimTimer& timer, SkScalar lastTime) { + + SkScalar deltaTime = timer.secs() - lastTime; + + fPos.fX += deltaTime * fSpeed * fDir.fX; + fPos.fY += deltaTime * fSpeed * fDir.fY; + if (fPos.fX >= kWidth || fPos.fX < 0.0f) { + fPos.fX = SkTPin<SkScalar>(fPos.fX, 0.0f, kWidth); + fDir.fX = -fDir.fX; + } + if (fPos.fY >= kHeight || fPos.fY < 0.0f) { + fPos.fY = SkTPin<SkScalar>(fPos.fY, 0.0f, kHeight); + fDir.fY = -fDir.fY; + } + + fBlur = timer.pingPong(kBlurAnimationDuration, fBlurOffset, 0.0f, kBlurMax); + } + + SkScalar sigma() const { return fBlur; } + const SkPoint& pos() const { return fPos; } + SkScalar size() const { return fSize; } + + private: + SkScalar fSize; + SkPoint fPos; + SkVector fDir; + SkScalar fBlurOffset; + SkScalar fBlur; + SkScalar fSpeed; + }; + + Node fNodes[kNumNodes]; + SkRandom fRand; + SkScalar fLastTime; + + typedef GM INHERITED; +}; + +////////////////////////////////////////////////////////////////////////////// + +DEF_GM(return new AnimatedImageBlurs;) |