• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright 2021 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 "modules/skottie/src/effects/Effects.h"
9 
10 #include "modules/skottie/src/Adapter.h"
11 #include "modules/skottie/src/SkottieValue.h"
12 #include "modules/sksg/include/SkSGPaint.h"
13 #include "modules/sksg/include/SkSGRenderEffect.h"
14 #include "src/utils/SkJSON.h"
15 
16 namespace skottie::internal {
17 
18 namespace {
19 
20 class SharpenAdapter final : public DiscardableAdapterBase<SharpenAdapter,
21                                                            sksg::ExternalImageFilter> {
22     public:
SharpenAdapter(const skjson::ArrayValue & jprops,const AnimationBuilder & abuilder)23         SharpenAdapter(const skjson::ArrayValue& jprops,
24                        const AnimationBuilder& abuilder)
25             : INHERITED(sksg::ExternalImageFilter::Make())
26         {
27             enum : size_t {
28                 kSharpenAmount_Index  = 0,
29             };
30 
31             EffectBinder(jprops, abuilder, this).bind(kSharpenAmount_Index, fAmount);
32         }
33     private:
onSync()34         void onSync() override {
35             SkScalar intensity = 1 + (fAmount * 0.01);
36             SkScalar discount = (1 - intensity) / 8.0;
37             SkScalar kernel[9] = {
38                 discount, discount, discount,
39                 discount, intensity, discount,
40                 discount, discount, discount,
41             };
42             auto filter = SkImageFilters::MatrixConvolution(SkISize::Make(3,3), kernel, 1, 0,
43                                                             SkIPoint::Make(1,1), SkTileMode::kRepeat,
44                                                             true, nullptr);
45             this->node()->setImageFilter(std::move(filter));
46         }
47 
48         ScalarValue fAmount = 0;
49 
50         using INHERITED = DiscardableAdapterBase<SharpenAdapter, sksg::ExternalImageFilter>;
51 };
52 
53 } // namespace
54 
attachSharpenEffect(const skjson::ArrayValue & jprops,sk_sp<sksg::RenderNode> layer) const55 sk_sp<sksg::RenderNode> EffectBuilder::attachSharpenEffect(const skjson::ArrayValue& jprops,
56                                                              sk_sp<sksg::RenderNode> layer) const {
57     auto imageFilterNode = fBuilder->attachDiscardableAdapter<SharpenAdapter>(jprops,
58                                                                               *fBuilder);
59     return sksg::ImageFilterEffect::Make(std::move(layer), std::move(imageFilterNode));
60 }
61 
62 } // namespace skottie::internal
63