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