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 namespace jsi = facebook::jsi;
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 = static_cast<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 =
47         count >= 2 && !arguments[1].isUndefined() && !arguments[1].isNull()
48             ? arguments[1].asNumber()
49             : 0;
50     return jsi::Object::createFromHostObject(
51         runtime, std::make_shared<JsiSkPathEffect>(
52                      getContext(),
53                      SkDashPathEffect::Make(intervals.data(), size, phase)));
54   }
55 
JSI_HOST_FUNCTION(MakeDiscrete)56   JSI_HOST_FUNCTION(MakeDiscrete) {
57     int segLength = arguments[0].asNumber();
58     int dec = arguments[1].asNumber();
59     int seedAssist = arguments[2].asNumber();
60     return jsi::Object::createFromHostObject(
61         runtime, std::make_shared<JsiSkPathEffect>(
62                      getContext(),
63                      SkDiscretePathEffect::Make(segLength, dec, seedAssist)));
64   }
65 
JSI_HOST_FUNCTION(MakeCompose)66   JSI_HOST_FUNCTION(MakeCompose) {
67     auto outer = JsiSkPathEffect::fromValue(runtime, arguments[0]);
68     auto inner = JsiSkPathEffect::fromValue(runtime, arguments[1]);
69 
70     return jsi::Object::createFromHostObject(
71         runtime, std::make_shared<JsiSkPathEffect>(
72                      getContext(), SkPathEffect::MakeCompose(
73                                        std::move(outer), std::move(inner))));
74   }
75 
JSI_HOST_FUNCTION(MakeSum)76   JSI_HOST_FUNCTION(MakeSum) {
77     auto outer = JsiSkPathEffect::fromValue(runtime, arguments[0]);
78     auto inner = JsiSkPathEffect::fromValue(runtime, arguments[1]);
79 
80     return jsi::Object::createFromHostObject(
81         runtime, std::make_shared<JsiSkPathEffect>(
82                      getContext(), SkPathEffect::MakeSum(std::move(outer),
83                                                          std::move(inner))));
84   }
85 
JSI_HOST_FUNCTION(MakePath1D)86   JSI_HOST_FUNCTION(MakePath1D) {
87     auto path = JsiSkPath::fromValue(runtime, arguments[0]);
88     auto advance = arguments[1].asNumber();
89     auto phase = arguments[2].asNumber();
90     auto style =
91         static_cast<SkPath1DPathEffect::Style>(arguments[3].asNumber());
92     return jsi::Object::createFromHostObject(
93         runtime, std::make_shared<JsiSkPathEffect>(
94                      getContext(),
95                      SkPath1DPathEffect::Make(*path, advance, phase, style)));
96   }
97 
JSI_HOST_FUNCTION(MakePath2D)98   JSI_HOST_FUNCTION(MakePath2D) {
99     auto matrix = JsiSkMatrix::fromValue(runtime, arguments[0]);
100     auto path = JsiSkPath::fromValue(runtime, arguments[1]);
101     return jsi::Object::createFromHostObject(
102         runtime, std::make_shared<JsiSkPathEffect>(
103                      getContext(), SkPath2DPathEffect::Make(*matrix, *path)));
104   }
105 
JSI_HOST_FUNCTION(MakeLine2D)106   JSI_HOST_FUNCTION(MakeLine2D) {
107     auto width = arguments[0].asNumber();
108     auto matrix = JsiSkMatrix::fromValue(runtime, arguments[1]);
109 
110     return jsi::Object::createFromHostObject(
111         runtime, std::make_shared<JsiSkPathEffect>(
112                      getContext(), SkLine2DPathEffect::Make(width, *matrix)));
113   }
114 
JSI_EXPORT_FUNC(JsiSkPathEffectFactory,MakeCorner)115   JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkPathEffectFactory, MakeCorner),
116                        JSI_EXPORT_FUNC(JsiSkPathEffectFactory, MakeDash),
117                        JSI_EXPORT_FUNC(JsiSkPathEffectFactory, MakeDiscrete),
118                        JSI_EXPORT_FUNC(JsiSkPathEffectFactory, MakeCompose),
119                        JSI_EXPORT_FUNC(JsiSkPathEffectFactory, MakeSum),
120                        JSI_EXPORT_FUNC(JsiSkPathEffectFactory, MakeLine2D),
121                        JSI_EXPORT_FUNC(JsiSkPathEffectFactory, MakePath1D),
122                        JSI_EXPORT_FUNC(JsiSkPathEffectFactory, MakePath2D), )
123 
124   explicit JsiSkPathEffectFactory(std::shared_ptr<RNSkPlatformContext> context)
125       : JsiSkHostObject(std::move(context)) {}
126 };
127 
128 } // namespace RNSkia
129