Chromium Code Reviews| Index: gm/blurcircles2.cpp |
| diff --git a/gm/blurcircles2.cpp b/gm/blurcircles2.cpp |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..dbeed6c3b0e6e505a8cb79d6befc5ec9696822cb |
| --- /dev/null |
| +++ b/gm/blurcircles2.cpp |
| @@ -0,0 +1,132 @@ |
| +/* |
| +* 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 "SkBlurMask.h" |
| +#include "SkBlurMaskFilter.h" |
| +#include "SkCanvas.h" |
| +#include "SkPaint.h" |
| +#include "SkPath.h" |
| +#include "SkString.h" |
| + |
|
robertphillips
2016/05/13 18:44:16
// Copy description in from CL description ?
bsalomon
2016/05/13 18:58:10
Done.
|
| +class BlurCircles2GM : public skiagm::GM { |
| +public: |
| + BlurCircles2GM() { |
| + fAnimRadius = SkAnimTimer::Pulse(0, kRadiusPulsePeriod, kRadiusPulseShift, kMinRadius, |
| + kMaxRadius)) |
| + fAnimBlurRadius = SkAnimTimer::Pulse(0, kBlurRadiusPulsePeriod, |
| + kBlurRadiusPulseShift, kMinBlurRadius, |
| + kMaxBlurRadius); |
| + } |
| + |
| +protected: |
| + SkString onShortName() override { return SkString("blurcircles2"); } |
| + |
| + SkISize onISize() override { |
| + return SkISize::Make(730, 1350); |
| + } |
| + |
| + void onDraw(SkCanvas* canvas) override { |
| + static constexpr SkScalar kMaxR = kMaxRadius + kMaxBlurRadius; |
| + |
| + auto almostCircleMaker = [] (SkScalar radius, SkPath* dst) { |
| + dst->reset(); |
| + dst->addArc(SkRect::MakeXYWH(-radius, -radius, 2 * radius, 2 * radius), 0, 355); |
| + dst->close(); |
| + }; |
| + |
| + auto blurMaker = [] (SkScalar radius) ->sk_sp<SkMaskFilter> { |
| + return SkBlurMaskFilter::Make(kNormal_SkBlurStyle, |
| + SkBlurMask::ConvertRadiusToSigma(radius), |
| + SkBlurMaskFilter::kHighQuality_BlurFlag); |
| + }; |
| + |
| + SkPaint paint; |
| + paint.setColor(SK_ColorBLACK); |
| + |
| + if (this->getMode() == kSample_Mode) { |
| + paint.setMaskFilter(blurMaker(fAnimBlurRadius)); |
| + SkISize size = canvas->getBaseLayerSize(); |
| + SkPath almostCircle; |
| + almostCircleMaker(fAnimRadius, &almostCircle); |
|
robertphillips
2016/05/13 18:44:17
Do we care to make almostCircle volatile ?
bsalomon
2016/05/13 18:58:10
Done.
|
| + canvas->save(); |
| + canvas->translate(size.fWidth / 2, size.fHeight / 4); |
| + canvas->drawCircle(0, 0, fAnimRadius, paint); |
| + canvas->translate(0, 2 * kMaxR); |
| + canvas->drawPath(almostCircle, paint); |
| + canvas->restore(); |
| + } else { |
| + canvas->save(); |
| + static constexpr SkScalar kPad = 5; |
| + static constexpr SkScalar kRadiusSteps = 5; |
| + static constexpr SkScalar kBlurRadiusSteps = 5; |
| + canvas->translate(kPad + kMinRadius + kMaxBlurRadius, |
| + kPad + kMinRadius + kMaxBlurRadius); |
| + SkScalar lineWidth = 0; |
|
robertphillips
2016/05/13 18:44:17
rm space in "kRadiusSteps -1" - or add another one
bsalomon
2016/05/13 18:58:10
Done.
|
| + for (int r = 0; r < kRadiusSteps -1; ++r) { |
| + const SkScalar radius = r * (kMaxRadius - kMinRadius) / kBlurRadiusSteps + |
| + kMinRadius; |
| + lineWidth += 2 * (radius + kMaxBlurRadius) + kPad; |
| + } |
| + for (int br = 0; br < kBlurRadiusSteps; ++br) { |
| + const SkScalar blurRadius = br * (kMaxBlurRadius - kMinBlurRadius) / |
| + kBlurRadiusSteps + kMinBlurRadius; |
| + const SkScalar maxRowR = blurRadius + kMaxRadius; |
| + paint.setMaskFilter(blurMaker(blurRadius)); |
| + canvas->save(); |
| + for (int r = 0; r < kRadiusSteps; ++r) { |
| + const SkScalar radius = r * (kMaxRadius - kMinRadius) / kBlurRadiusSteps + |
| + kMinRadius; |
| + SkPath almostCircle; |
| + almostCircleMaker(radius, &almostCircle); |
| + canvas->save(); |
| + canvas->drawCircle(0, 0, radius, paint); |
| + canvas->translate(0, 2 * maxRowR + kPad); |
| + canvas->drawPath(almostCircle, paint); |
| + canvas->restore(); |
| + const SkScalar maxColR = radius + kMaxBlurRadius; |
| + canvas->translate(maxColR * 2 + kPad, 0); |
| + } |
| + canvas->restore(); |
| + SkPaint blackPaint; |
| + blackPaint.setColor(SK_ColorBLACK); |
| + const SkScalar lineY = 3 * maxRowR + 1.5 * kPad; |
| + if (br != kBlurRadiusSteps - 1) { |
| + canvas->drawLine(0, lineY, lineWidth, lineY, blackPaint); |
| + } |
| + canvas->translate(0, maxRowR * 4 + 2 * kPad); |
| + } |
| + canvas->restore(); |
| + } |
| + } |
| + |
| + bool onAnimate(const SkAnimTimer& timer) override { |
| + fAnimRadius = timer.pulse(kRadiusPulsePeriod, kRadiusPulseShift, kMinRadius, kMaxRadius); |
| + fAnimBlurRadius = timer.pulse(kBlurRadiusPulsePeriod, kBlurRadiusPulseShift, |
| + kMinBlurRadius, kMaxBlurRadius); |
| + return true; |
| + } |
| + |
| +private: |
| + static constexpr SkScalar kMinRadius = 15; |
| + static constexpr SkScalar kMaxRadius = 45; |
| + static constexpr SkScalar kRadiusPulsePeriod = 8; |
| + static constexpr SkScalar kRadiusPulseShift = 3; |
| + |
| + static constexpr SkScalar kMinBlurRadius = 5; |
| + static constexpr SkScalar kMaxBlurRadius = 45; |
| + static constexpr SkScalar kBlurRadiusPulsePeriod = 3; |
| + static constexpr SkScalar kBlurRadiusPulseShift = 1.5; |
| + |
| + SkScalar fAnimRadius; |
| + SkScalar fAnimBlurRadius; |
| + |
| + typedef skiagm::GM INHERITED; |
| +}; |
| + |
| +DEF_GM(return new BlurCircles2GM();) |