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