1 #pragma once
2 
3 #include <memory>
4 #include <utility>
5 #include <vector>
6 
7 #include <jsi/jsi.h>
8 
9 #include "JsiSkHostObjects.h"
10 #include "JsiSkPathEffect.h"
11 
12 #pragma clang diagnostic push
13 #pragma clang diagnostic ignored "-Wdocumentation"
14 
15 #include <SkCornerPathEffect.h>
16 #include <SkDashPathEffect.h>
17 #include <SkDiscretePathEffect.h>
18 #include <SkPathEffect.h>
19 #include "include/effects/Sk1DPathEffect.h"
20 #include "include/effects/Sk2DPathEffect.h"
21 
22 #pragma clang diagnostic pop
23 
24 namespace RNSkia {
25 
26 using namespace facebook;
27 
28 class JsiSkPathEffectFactory : public JsiSkHostObject {
29 public:
JSI_HOST_FUNCTION(MakeCorner)30   JSI_HOST_FUNCTION(MakeCorner) {
31     int radius = arguments[0].asNumber();
32     return jsi::Object::createFromHostObject(
33         runtime, std::make_shared<JsiSkPathEffect>(
34                      getContext(), SkCornerPathEffect::Make(radius)));
35   }
36 
JSI_HOST_FUNCTION(MakeDash)37   JSI_HOST_FUNCTION(MakeDash) {
38     auto jsiIntervals = arguments[0].asObject(runtime).asArray(runtime);
39     auto size = (int)jsiIntervals.size(runtime);
40     std::vector<SkScalar> intervals;
41     intervals.reserve(size);
42     for (int i = 0; i < size; i++) {
43       SkScalar interval = jsiIntervals.getValueAtIndex(runtime, i).asNumber();
44       intervals.push_back(interval);
45     }
46     int phase = count >= 2 && !arguments[1].isUndefined() && !arguments[1].isNull() ? arguments[1].asNumber() : 0;
47     return jsi::Object::createFromHostObject(
48         runtime, std::make_shared<JsiSkPathEffect>(
49                      getContext(),
50                      SkDashPathEffect::Make(intervals.data(), size, phase)));
51   }
52 
JSI_HOST_FUNCTION(MakeDiscrete)53   JSI_HOST_FUNCTION(MakeDiscrete) {
54     int segLength = arguments[0].asNumber();
55     int dec = arguments[1].asNumber();
56     int seedAssist = arguments[2].asNumber();
57     return jsi::Object::createFromHostObject(
58         runtime, std::make_shared<JsiSkPathEffect>(
59                      getContext(),
60                      SkDiscretePathEffect::Make(segLength, dec, seedAssist)));
61   }
62 
JSI_HOST_FUNCTION(MakeCompose)63   JSI_HOST_FUNCTION(MakeCompose) {
64     auto outer = JsiSkPathEffect::fromValue(runtime, arguments[0]);
65     auto inner = JsiSkPathEffect::fromValue(runtime, arguments[1]);
66 
67     return jsi::Object::createFromHostObject(
68             runtime, std::make_shared<JsiSkPathEffect>(
69                     getContext(),  SkPathEffect::MakeCompose(std::move(outer), std::move(inner))));
70   }
71 
JSI_HOST_FUNCTION(MakeSum)72   JSI_HOST_FUNCTION(MakeSum) {
73     auto outer = JsiSkPathEffect::fromValue(runtime, arguments[0]);
74     auto inner = JsiSkPathEffect::fromValue(runtime, arguments[1]);
75 
76     return jsi::Object::createFromHostObject(
77             runtime, std::make_shared<JsiSkPathEffect>(
78                     getContext(),  SkPathEffect::MakeSum(std::move(outer), std::move(inner))));
79   }
80 
JSI_HOST_FUNCTION(MakePath1D)81   JSI_HOST_FUNCTION(MakePath1D) {
82     auto path = JsiSkPath::fromValue(runtime, arguments[0]);
83     auto advance = arguments[1].asNumber();
84     auto phase = arguments[2].asNumber();
85     auto style = static_cast<SkPath1DPathEffect::Style>(arguments[3].asNumber());
86     return jsi::Object::createFromHostObject(
87             runtime, std::make_shared<JsiSkPathEffect>(
88                     getContext(),  SkPath1DPathEffect::Make(*path, advance, phase, style)));
89   }
90 
JSI_HOST_FUNCTION(MakePath2D)91   JSI_HOST_FUNCTION(MakePath2D) {
92     auto matrix = JsiSkMatrix::fromValue(runtime, arguments[0]);
93     auto path = JsiSkPath::fromValue(runtime, arguments[1]);
94     return jsi::Object::createFromHostObject(
95             runtime, std::make_shared<JsiSkPathEffect>(
96                     getContext(),  SkPath2DPathEffect::Make(*matrix, *path)));
97   }
98 
JSI_HOST_FUNCTION(MakeLine2D)99   JSI_HOST_FUNCTION(MakeLine2D) {
100     auto width = arguments[0].asNumber();
101     auto matrix = JsiSkMatrix::fromValue(runtime, arguments[1]);
102 
103     return jsi::Object::createFromHostObject(
104             runtime, std::make_shared<JsiSkPathEffect>(
105                     getContext(),  SkLine2DPathEffect::Make(width, *matrix)));
106   }
107 
108   JSI_EXPORT_FUNCTIONS(
JSI_EXPORT_FUNC(JsiSkPathEffectFactory,MakeCorner)109     JSI_EXPORT_FUNC(JsiSkPathEffectFactory, MakeCorner),
110     JSI_EXPORT_FUNC(JsiSkPathEffectFactory, MakeDash),
111     JSI_EXPORT_FUNC(JsiSkPathEffectFactory, MakeDiscrete),
112     JSI_EXPORT_FUNC(JsiSkPathEffectFactory, MakeCompose),
113     JSI_EXPORT_FUNC(JsiSkPathEffectFactory, MakeSum),
114     JSI_EXPORT_FUNC(JsiSkPathEffectFactory, MakeLine2D),
115     JSI_EXPORT_FUNC(JsiSkPathEffectFactory, MakePath1D),
116     JSI_EXPORT_FUNC(JsiSkPathEffectFactory, MakePath2D),
117    )
118 
119   JsiSkPathEffectFactory(std::shared_ptr<RNSkPlatformContext> context)
120       : JsiSkHostObject(std::move(context)) {}
121 };
122 
123 } // namespace RNSkia
124