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 |