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
14namespace skottie {
15namespace internal {
16
17class Animator;
18
19class MotionBlurEffect final : public sksg::CustomRenderNode {
20public:
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
28private:
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