Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 /* | |
| 2 * Copyright 2016 Google Inc. | |
| 3 * | |
| 4 * Use of this source code is governed by a BSD-style license that can be | |
| 5 * found in the LICENSE file. | |
| 6 */ | |
| 7 | |
| 8 #include "gm.h" | |
| 9 #include "SkAnimTimer.h" | |
| 10 #include "SkBlurMask.h" | |
| 11 #include "SkBlurMaskFilter.h" | |
| 12 #include "SkCanvas.h" | |
| 13 #include "SkPaint.h" | |
| 14 #include "SkPath.h" | |
| 15 #include "SkString.h" | |
| 16 | |
|
robertphillips
2016/05/13 18:44:16
// Copy description in from CL description ?
bsalomon
2016/05/13 18:58:10
Done.
| |
| 17 class BlurCircles2GM : public skiagm::GM { | |
| 18 public: | |
| 19 BlurCircles2GM() { | |
| 20 fAnimRadius = SkAnimTimer::Pulse(0, kRadiusPulsePeriod, kRadiusPulseShif t, kMinRadius, | |
| 21 kMaxRadius)) | |
| 22 fAnimBlurRadius = SkAnimTimer::Pulse(0, kBlurRadiusPulsePeriod, | |
| 23 kBlurRadiusPulseShift, kMinBlurRadi us, | |
| 24 kMaxBlurRadius); | |
| 25 } | |
| 26 | |
| 27 protected: | |
| 28 SkString onShortName() override { return SkString("blurcircles2"); } | |
| 29 | |
| 30 SkISize onISize() override { | |
| 31 return SkISize::Make(730, 1350); | |
| 32 } | |
| 33 | |
| 34 void onDraw(SkCanvas* canvas) override { | |
| 35 static constexpr SkScalar kMaxR = kMaxRadius + kMaxBlurRadius; | |
| 36 | |
| 37 auto almostCircleMaker = [] (SkScalar radius, SkPath* dst) { | |
| 38 dst->reset(); | |
| 39 dst->addArc(SkRect::MakeXYWH(-radius, -radius, 2 * radius, 2 * radiu s), 0, 355); | |
| 40 dst->close(); | |
| 41 }; | |
| 42 | |
| 43 auto blurMaker = [] (SkScalar radius) ->sk_sp<SkMaskFilter> { | |
| 44 return SkBlurMaskFilter::Make(kNormal_SkBlurStyle, | |
| 45 SkBlurMask::ConvertRadiusToSigma(radiu s), | |
| 46 SkBlurMaskFilter::kHighQuality_BlurFla g); | |
| 47 }; | |
| 48 | |
| 49 SkPaint paint; | |
| 50 paint.setColor(SK_ColorBLACK); | |
| 51 | |
| 52 if (this->getMode() == kSample_Mode) { | |
| 53 paint.setMaskFilter(blurMaker(fAnimBlurRadius)); | |
| 54 SkISize size = canvas->getBaseLayerSize(); | |
| 55 SkPath almostCircle; | |
| 56 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.
| |
| 57 canvas->save(); | |
| 58 canvas->translate(size.fWidth / 2, size.fHeight / 4); | |
| 59 canvas->drawCircle(0, 0, fAnimRadius, paint); | |
| 60 canvas->translate(0, 2 * kMaxR); | |
| 61 canvas->drawPath(almostCircle, paint); | |
| 62 canvas->restore(); | |
| 63 } else { | |
| 64 canvas->save(); | |
| 65 static constexpr SkScalar kPad = 5; | |
| 66 static constexpr SkScalar kRadiusSteps = 5; | |
| 67 static constexpr SkScalar kBlurRadiusSteps = 5; | |
| 68 canvas->translate(kPad + kMinRadius + kMaxBlurRadius, | |
| 69 kPad + kMinRadius + kMaxBlurRadius); | |
| 70 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.
| |
| 71 for (int r = 0; r < kRadiusSteps -1; ++r) { | |
| 72 const SkScalar radius = r * (kMaxRadius - kMinRadius) / kBlurRad iusSteps + | |
| 73 kMinRadius; | |
| 74 lineWidth += 2 * (radius + kMaxBlurRadius) + kPad; | |
| 75 } | |
| 76 for (int br = 0; br < kBlurRadiusSteps; ++br) { | |
| 77 const SkScalar blurRadius = br * (kMaxBlurRadius - kMinBlurRadiu s) / | |
| 78 kBlurRadiusSteps + kMinBlurRadius; | |
| 79 const SkScalar maxRowR = blurRadius + kMaxRadius; | |
| 80 paint.setMaskFilter(blurMaker(blurRadius)); | |
| 81 canvas->save(); | |
| 82 for (int r = 0; r < kRadiusSteps; ++r) { | |
| 83 const SkScalar radius = r * (kMaxRadius - kMinRadius) / kBlu rRadiusSteps + | |
| 84 kMinRadius; | |
| 85 SkPath almostCircle; | |
| 86 almostCircleMaker(radius, &almostCircle); | |
| 87 canvas->save(); | |
| 88 canvas->drawCircle(0, 0, radius, paint); | |
| 89 canvas->translate(0, 2 * maxRowR + kPad); | |
| 90 canvas->drawPath(almostCircle, paint); | |
| 91 canvas->restore(); | |
| 92 const SkScalar maxColR = radius + kMaxBlurRadius; | |
| 93 canvas->translate(maxColR * 2 + kPad, 0); | |
| 94 } | |
| 95 canvas->restore(); | |
| 96 SkPaint blackPaint; | |
| 97 blackPaint.setColor(SK_ColorBLACK); | |
| 98 const SkScalar lineY = 3 * maxRowR + 1.5 * kPad; | |
| 99 if (br != kBlurRadiusSteps - 1) { | |
| 100 canvas->drawLine(0, lineY, lineWidth, lineY, blackPaint); | |
| 101 } | |
| 102 canvas->translate(0, maxRowR * 4 + 2 * kPad); | |
| 103 } | |
| 104 canvas->restore(); | |
| 105 } | |
| 106 } | |
| 107 | |
| 108 bool onAnimate(const SkAnimTimer& timer) override { | |
| 109 fAnimRadius = timer.pulse(kRadiusPulsePeriod, kRadiusPulseShift, kMinRad ius, kMaxRadius); | |
| 110 fAnimBlurRadius = timer.pulse(kBlurRadiusPulsePeriod, kBlurRadiusPulseSh ift, | |
| 111 kMinBlurRadius, kMaxBlurRadius); | |
| 112 return true; | |
| 113 } | |
| 114 | |
| 115 private: | |
| 116 static constexpr SkScalar kMinRadius = 15; | |
| 117 static constexpr SkScalar kMaxRadius = 45; | |
| 118 static constexpr SkScalar kRadiusPulsePeriod = 8; | |
| 119 static constexpr SkScalar kRadiusPulseShift = 3; | |
| 120 | |
| 121 static constexpr SkScalar kMinBlurRadius = 5; | |
| 122 static constexpr SkScalar kMaxBlurRadius = 45; | |
| 123 static constexpr SkScalar kBlurRadiusPulsePeriod = 3; | |
| 124 static constexpr SkScalar kBlurRadiusPulseShift = 1.5; | |
| 125 | |
| 126 SkScalar fAnimRadius; | |
| 127 SkScalar fAnimBlurRadius; | |
| 128 | |
| 129 typedef skiagm::GM INHERITED; | |
| 130 }; | |
| 131 | |
| 132 DEF_GM(return new BlurCircles2GM();) | |
| OLD | NEW |