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