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