1 | /* |
2 | * Copyright 2019 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 | #ifndef SkottieMotionBlurEffect_DEFINED |
9 | #define SkottieMotionBlurEffect_DEFINED |
10 | |
11 | #include "modules/sksg/include/SkSGRenderNode.h" |
12 | #include "modules/sksg/include/SkSGScene.h" |
13 | |
14 | namespace skottie { |
15 | namespace internal { |
16 | |
17 | class Animator; |
18 | |
19 | class MotionBlurEffect final : public sksg::CustomRenderNode { |
20 | public: |
21 | static sk_sp<MotionBlurEffect> Make(sk_sp<Animator> animator, |
22 | sk_sp<sksg::RenderNode> child, |
23 | size_t samples_per_frame, |
24 | float shutter_angle, float shutter_phase); |
25 | |
26 | SG_ATTRIBUTE(T, float, fT) |
27 | |
28 | private: |
29 | class AutoInvalBlocker; |
30 | |
31 | const RenderNode* onNodeAt(const SkPoint&) const override; |
32 | |
33 | SkRect onRevalidate(sksg::InvalidationController* ic, const SkMatrix& ctm) override; |
34 | |
35 | void onRender(SkCanvas* canvas, const RenderContext* ctx) const override; |
36 | |
37 | void renderToRaster8888Pow2Samples(SkCanvas* canvas, const RenderContext* ctx) const; |
38 | |
39 | SkRect seekToSample(size_t sample_idx, const SkMatrix& ctm) const; |
40 | |
41 | MotionBlurEffect(sk_sp<Animator> animator, |
42 | sk_sp<sksg::RenderNode> child, |
43 | size_t sample_count, float phase, float dt); |
44 | |
45 | const sk_sp<Animator> fAnimator; |
46 | const size_t fSampleCount; |
47 | const float fPhase, |
48 | fDT; |
49 | |
50 | float fT = 0; |
51 | size_t fVisibleSampleCount = 0; |
52 | |
53 | using INHERITED = sksg::CustomRenderNode; |
54 | }; |
55 | |
56 | } // namespace internal |
57 | } // namespace skottie |
58 | |
59 | #endif // SkottieMotionBlurEffect_DEFINED |
60 | |