@shopify/react-native-skia 0.1.121 → 0.1.124
Sign up to get free protection for your applications and to get access to all the features.
- package/android/CMakeLists.txt +3 -1
- package/android/cpp/jni/JniSkiaDrawView.cpp +14 -71
- package/android/cpp/jni/JniSkiaManager.cpp +1 -1
- package/android/cpp/jni/include/JniSkiaDrawView.h +18 -22
- package/android/cpp/jni/include/JniSkiaManager.h +4 -4
- package/android/cpp/rnskia-android/RNSkDrawViewImpl.cpp +68 -0
- package/android/cpp/rnskia-android/RNSkDrawViewImpl.h +48 -0
- package/android/cpp/{jni/include/JniPlatformContextWrapper.h → rnskia-android/RNSkPlatformContextImpl.h} +4 -4
- package/android/cpp/{jni → rnskia-android}/SkiaOpenGLRenderer.cpp +39 -54
- package/android/cpp/{jni/include → rnskia-android}/SkiaOpenGLRenderer.h +2 -31
- package/android/src/main/java/com/shopify/reactnative/skia/RNSkiaViewManager.java +1 -1
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaDrawView.java +21 -28
- package/cpp/api/JsiSkApi.h +2 -0
- package/cpp/api/JsiSkColor.h +49 -0
- package/cpp/api/JsiSkPath.h +31 -2
- package/cpp/api/JsiSkPathFactory.h +96 -1
- package/cpp/api/third_party/CSSColorParser.h +324 -0
- package/cpp/rnskia/RNSkAnimation.h +3 -8
- package/cpp/rnskia/RNSkDrawView.cpp +84 -126
- package/cpp/rnskia/RNSkDrawView.h +7 -37
- package/cpp/rnskia/RNSkJsiViewApi.h +8 -5
- package/cpp/rnskia/RNSkManager.cpp +2 -2
- package/cpp/rnskia/RNSkManager.h +2 -2
- package/cpp/rnskia/RNSkPlatformContext.h +1 -1
- package/cpp/rnskia/RNSkValueApi.h +6 -2
- package/cpp/rnskia/values/RNSkClockValue.h +21 -13
- package/cpp/rnskia/values/RNSkDerivedValue.h +13 -6
- package/cpp/rnskia/values/RNSkReadonlyValue.h +17 -16
- package/cpp/rnskia/values/RNSkValue.h +8 -3
- package/cpp/utils/RNSkTimingInfo.h +13 -1
- package/ios/RNSkia-iOS/RNSkDrawViewImpl.h +8 -10
- package/ios/RNSkia-iOS/RNSkDrawViewImpl.mm +25 -10
- package/ios/RNSkia-iOS/SkiaDrawView.mm +21 -16
- package/lib/commonjs/renderer/Canvas.js +17 -8
- package/lib/commonjs/renderer/Canvas.js.map +1 -1
- package/lib/commonjs/renderer/components/Paint.js +1 -1
- package/lib/commonjs/renderer/components/Paint.js.map +1 -1
- package/lib/commonjs/renderer/components/colorFilters/Lerp.js +1 -1
- package/lib/commonjs/renderer/components/colorFilters/Lerp.js.map +1 -1
- package/lib/commonjs/renderer/components/shaders/Shader.js +2 -2
- package/lib/commonjs/renderer/components/shaders/Shader.js.map +1 -1
- package/lib/commonjs/renderer/components/shapes/Path.js +10 -2
- package/lib/commonjs/renderer/components/shapes/Path.js.map +1 -1
- package/lib/commonjs/renderer/nodes/Node.js +3 -3
- package/lib/commonjs/renderer/nodes/Node.js.map +1 -1
- package/lib/commonjs/renderer/processors/Circles.js +3 -2
- package/lib/commonjs/renderer/processors/Circles.js.map +1 -1
- package/lib/commonjs/renderer/processors/Font.js +1 -1
- package/lib/commonjs/renderer/processors/Font.js.map +1 -1
- package/lib/commonjs/renderer/processors/Paint.js +6 -1
- package/lib/commonjs/renderer/processors/Paint.js.map +1 -1
- package/lib/commonjs/renderer/processors/Rects.js +6 -6
- package/lib/commonjs/renderer/processors/Rects.js.map +1 -1
- package/lib/commonjs/skia/Color.js +3 -25
- package/lib/commonjs/skia/Color.js.map +1 -1
- package/lib/commonjs/skia/Image/Image.js.map +1 -1
- package/lib/commonjs/skia/ImageFilter/ImageFilterFactory.js.map +1 -1
- package/lib/commonjs/skia/Paint/Paint.js +13 -1
- package/lib/commonjs/skia/Paint/Paint.js.map +1 -1
- package/lib/commonjs/skia/Paint/usePaint.js +2 -4
- package/lib/commonjs/skia/Paint/usePaint.js.map +1 -1
- package/lib/commonjs/skia/Path/Path.js +13 -1
- package/lib/commonjs/skia/Path/Path.js.map +1 -1
- package/lib/commonjs/skia/Shader/Shader.js.map +1 -1
- package/lib/commonjs/skia/Skia.js +43 -3
- package/lib/commonjs/skia/Skia.js.map +1 -1
- package/lib/commonjs/values/animation/timing/functions/getResolvedParams.js +3 -3
- package/lib/commonjs/values/animation/timing/functions/getResolvedParams.js.map +1 -1
- package/lib/module/renderer/Canvas.js +12 -6
- package/lib/module/renderer/Canvas.js.map +1 -1
- package/lib/module/renderer/components/Paint.js +2 -2
- package/lib/module/renderer/components/Paint.js.map +1 -1
- package/lib/module/renderer/components/colorFilters/Lerp.js +1 -1
- package/lib/module/renderer/components/colorFilters/Lerp.js.map +1 -1
- package/lib/module/renderer/components/shaders/Shader.js +3 -2
- package/lib/module/renderer/components/shaders/Shader.js.map +1 -1
- package/lib/module/renderer/components/shapes/Path.js +10 -3
- package/lib/module/renderer/components/shapes/Path.js.map +1 -1
- package/lib/module/renderer/nodes/Node.js +3 -3
- package/lib/module/renderer/nodes/Node.js.map +1 -1
- package/lib/module/renderer/processors/Circles.js +3 -2
- package/lib/module/renderer/processors/Circles.js.map +1 -1
- package/lib/module/renderer/processors/Font.js +1 -1
- package/lib/module/renderer/processors/Font.js.map +1 -1
- package/lib/module/renderer/processors/Paint.js +6 -1
- package/lib/module/renderer/processors/Paint.js.map +1 -1
- package/lib/module/renderer/processors/Rects.js +5 -6
- package/lib/module/renderer/processors/Rects.js.map +1 -1
- package/lib/module/skia/Color.js +2 -21
- package/lib/module/skia/Color.js.map +1 -1
- package/lib/module/skia/Image/Image.js.map +1 -1
- package/lib/module/skia/ImageFilter/ImageFilterFactory.js.map +1 -1
- package/lib/module/skia/Paint/Paint.js +6 -0
- package/lib/module/skia/Paint/Paint.js.map +1 -1
- package/lib/module/skia/Paint/usePaint.js +2 -3
- package/lib/module/skia/Paint/usePaint.js.map +1 -1
- package/lib/module/skia/Path/Path.js +11 -0
- package/lib/module/skia/Path/Path.js.map +1 -1
- package/lib/module/skia/Shader/Shader.js.map +1 -1
- package/lib/module/skia/Skia.js +45 -2
- package/lib/module/skia/Skia.js.map +1 -1
- package/lib/module/values/animation/timing/functions/getResolvedParams.js +3 -3
- package/lib/module/values/animation/timing/functions/getResolvedParams.js.map +1 -1
- package/lib/typescript/src/renderer/Canvas.d.ts +6 -0
- package/lib/typescript/src/renderer/components/shapes/Path.d.ts +3 -1
- package/lib/typescript/src/renderer/processors/Paint.d.ts +2 -1
- package/lib/typescript/src/skia/Color.d.ts +0 -1
- package/lib/typescript/src/skia/Image/Image.d.ts +3 -3
- package/lib/typescript/src/skia/ImageFilter/ImageFilterFactory.d.ts +2 -2
- package/lib/typescript/src/skia/Paint/Paint.d.ts +3 -2
- package/lib/typescript/src/skia/Path/Path.d.ts +13 -0
- package/lib/typescript/src/skia/Path/PathFactory.d.ts +7 -1
- package/lib/typescript/src/skia/Picture/Picture.d.ts +2 -2
- package/lib/typescript/src/skia/RuntimeEffect/RuntimeEffect.d.ts +3 -3
- package/lib/typescript/src/skia/Shader/Shader.d.ts +2 -2
- package/lib/typescript/src/skia/Shader/ShaderFactory.d.ts +9 -9
- package/lib/typescript/src/skia/Skia.d.ts +5 -3
- package/lib/typescript/src/values/animation/types.d.ts +5 -5
- package/package.json +1 -1
- package/scripts/install-npm.js +1 -1
- package/src/renderer/Canvas.tsx +13 -6
- package/src/renderer/components/Paint.tsx +2 -2
- package/src/renderer/components/colorFilters/Lerp.tsx +1 -1
- package/src/renderer/components/shaders/Shader.tsx +1 -1
- package/src/renderer/components/shapes/Path.tsx +12 -4
- package/src/renderer/nodes/Node.ts +3 -3
- package/src/renderer/processors/Circles.ts +2 -1
- package/src/renderer/processors/Font.ts +1 -1
- package/src/renderer/processors/Paint.ts +5 -0
- package/src/renderer/processors/Rects.ts +3 -2
- package/src/skia/Color.ts +3 -20
- package/src/skia/Image/Image.ts +3 -3
- package/src/skia/ImageFilter/ImageFilterFactory.ts +2 -2
- package/src/skia/Paint/Paint.ts +9 -2
- package/src/skia/Paint/usePaint.ts +2 -4
- package/src/skia/Path/Path.ts +16 -0
- package/src/skia/Path/PathFactory.ts +8 -1
- package/src/skia/Picture/Picture.ts +2 -2
- package/src/skia/RuntimeEffect/RuntimeEffect.ts +4 -4
- package/src/skia/Shader/Shader.ts +2 -2
- package/src/skia/Shader/ShaderFactory.ts +9 -9
- package/src/skia/Skia.ts +47 -3
- package/src/values/animation/timing/functions/getResolvedParams.ts +2 -2
- package/src/values/animation/types.ts +5 -5
@@ -4,9 +4,7 @@
|
|
4
4
|
#include <algorithm>
|
5
5
|
#include <functional>
|
6
6
|
#include <chrono>
|
7
|
-
#include <mutex>
|
8
7
|
#include <unordered_map>
|
9
|
-
#include <utility>
|
10
8
|
#include <memory>
|
11
9
|
|
12
10
|
#include <jsi/jsi.h>
|
@@ -22,16 +20,15 @@ using namespace facebook;
|
|
22
20
|
Implements a readonly Value that is updated every time the screen is redrawn. Its value will be the
|
23
21
|
number of milliseconds since the animation value was started.
|
24
22
|
*/
|
25
|
-
class RNSkReadonlyValue : public JsiSkHostObject
|
23
|
+
class RNSkReadonlyValue : public JsiSkHostObject,
|
24
|
+
public std::enable_shared_from_this<RNSkReadonlyValue>
|
26
25
|
{
|
27
26
|
public:
|
28
27
|
RNSkReadonlyValue(std::shared_ptr<RNSkPlatformContext> platformContext)
|
29
28
|
: JsiSkHostObject(platformContext),
|
30
|
-
_propNameId(jsi::PropNameID::forUtf8(*platformContext->getJsRuntime(), "value")) {}
|
29
|
+
_propNameId(jsi::PropNameID::forUtf8(*platformContext->getJsRuntime(), "value")) { }
|
31
30
|
|
32
|
-
~RNSkReadonlyValue() {
|
33
|
-
_invalidated = true;
|
34
|
-
}
|
31
|
+
virtual ~RNSkReadonlyValue() { }
|
35
32
|
|
36
33
|
JSI_PROPERTY_GET(__typename__) {
|
37
34
|
return jsi::String::createFromUtf8(runtime, "RNSkValue");
|
@@ -43,8 +40,7 @@ public:
|
|
43
40
|
|
44
41
|
JSI_EXPORT_PROPERTY_GETTERS(JSI_EXPORT_PROP_GET(RNSkReadonlyValue, __typename__),
|
45
42
|
JSI_EXPORT_PROP_GET(RNSkReadonlyValue, current))
|
46
|
-
|
47
|
-
|
43
|
+
|
48
44
|
JSI_HOST_FUNCTION(addListener) {
|
49
45
|
if(!arguments[0].isObject() || !arguments[0].asObject(runtime).isFunction(runtime)) {
|
50
46
|
jsi::detail::throwJSError(runtime, "Expected function as first parameter.");
|
@@ -52,8 +48,13 @@ public:
|
|
52
48
|
}
|
53
49
|
auto callback = std::make_shared<jsi::Function>(arguments[0].asObject(runtime).asFunction(runtime));
|
54
50
|
|
55
|
-
auto unsubscribe = addListener([
|
56
|
-
|
51
|
+
auto unsubscribe = addListener([weakSelf = weak_from_this(),
|
52
|
+
callback = std::move(callback)](jsi::Runtime& runtime){
|
53
|
+
auto self = weakSelf.lock();
|
54
|
+
if(self) {
|
55
|
+
auto selfReadonlyValue = std::dynamic_pointer_cast<RNSkReadonlyValue>(self);
|
56
|
+
callback->call(runtime, selfReadonlyValue->get_current(runtime));
|
57
|
+
}
|
57
58
|
});
|
58
59
|
|
59
60
|
return jsi::Function::createFromHostFunction(runtime,
|
@@ -76,9 +77,10 @@ public:
|
|
76
77
|
std::lock_guard<std::mutex> lock(_mutex);
|
77
78
|
auto listenerId = _listenerId++;
|
78
79
|
_listeners.emplace(listenerId, cb);
|
79
|
-
return [
|
80
|
-
|
81
|
-
|
80
|
+
return [weakSelf = weak_from_this(), listenerId]() {
|
81
|
+
auto self = weakSelf.lock();
|
82
|
+
if(self) {
|
83
|
+
self->removeListener(listenerId);
|
82
84
|
}
|
83
85
|
};
|
84
86
|
}
|
@@ -104,6 +106,7 @@ public:
|
|
104
106
|
}
|
105
107
|
|
106
108
|
protected:
|
109
|
+
|
107
110
|
/**
|
108
111
|
Notifies listeners about changes
|
109
112
|
@param runtime Current JS Runtime
|
@@ -128,8 +131,6 @@ protected:
|
|
128
131
|
_listeners.erase(listenerId);
|
129
132
|
}
|
130
133
|
|
131
|
-
std::atomic<bool> _invalidated = { false };
|
132
|
-
|
133
134
|
private:
|
134
135
|
jsi::PropNameID _propNameId;
|
135
136
|
std::shared_ptr<jsi::Object> _valueHolder;
|
@@ -76,11 +76,16 @@ public:
|
|
76
76
|
|
77
77
|
private:
|
78
78
|
void subscribe(std::shared_ptr<RNSkAnimation> animation) {
|
79
|
-
unsubscribe();
|
80
79
|
if(animation != nullptr) {
|
81
80
|
_animation = animation;
|
82
|
-
|
83
|
-
|
81
|
+
_unsubscribe = std::make_shared<std::function<void()>>(
|
82
|
+
_animation->addListener([weakSelf = weak_from_this()](jsi::Runtime &runtime) {
|
83
|
+
auto self = weakSelf.lock();
|
84
|
+
if(self) {
|
85
|
+
auto selfAsThis = std::dynamic_pointer_cast<RNSkValue>(self);
|
86
|
+
selfAsThis->animationDidUpdate(runtime);
|
87
|
+
}
|
88
|
+
}));
|
84
89
|
// Start the animation
|
85
90
|
_animation->startClock();
|
86
91
|
}
|
@@ -1,5 +1,6 @@
|
|
1
1
|
#pragma once
|
2
2
|
|
3
|
+
#include <RNSkLog.h>
|
3
4
|
#include <chrono>
|
4
5
|
|
5
6
|
#define NUMBER_OF_DURATION_SAMPLES 10
|
@@ -12,7 +13,7 @@ using ms = duration<float, std::milli>;
|
|
12
13
|
|
13
14
|
class RNSkTimingInfo {
|
14
15
|
public:
|
15
|
-
RNSkTimingInfo() {
|
16
|
+
RNSkTimingInfo(const std::string &name): _name(std::move(name)) {
|
16
17
|
reset();
|
17
18
|
}
|
18
19
|
|
@@ -25,6 +26,7 @@ public:
|
|
25
26
|
_prevFpsTimer = -1;
|
26
27
|
_frameCount = 0;
|
27
28
|
_lastFrameCount = -1;
|
29
|
+
_didSkip = false;
|
28
30
|
}
|
29
31
|
|
30
32
|
void beginTiming() {
|
@@ -35,6 +37,14 @@ public:
|
|
35
37
|
time_point<steady_clock> stop = high_resolution_clock::now();
|
36
38
|
addLastDuration(duration_cast<milliseconds>(stop - _start).count());
|
37
39
|
tick(stop);
|
40
|
+
if(_didSkip) {
|
41
|
+
_didSkip = false;
|
42
|
+
RNSkLogger::logToConsole("%s: Skipped frame. Previous frame time: %lldms", _name.c_str(), _lastDuration);
|
43
|
+
}
|
44
|
+
}
|
45
|
+
|
46
|
+
void markSkipped() {
|
47
|
+
_didSkip = true;
|
38
48
|
}
|
39
49
|
|
40
50
|
long getAverage() { return static_cast<long>(_average); }
|
@@ -86,6 +96,8 @@ private:
|
|
86
96
|
long _prevFpsTimer;
|
87
97
|
double _frameCount;
|
88
98
|
double _lastFrameCount;
|
99
|
+
double _didSkip;
|
100
|
+
std::string _name;
|
89
101
|
};
|
90
102
|
|
91
103
|
} // namespace RNSkia
|
@@ -21,25 +21,23 @@
|
|
21
21
|
class RNSkDrawViewImpl : public RNSkia::RNSkDrawView {
|
22
22
|
public:
|
23
23
|
RNSkDrawViewImpl(std::shared_ptr<RNSkia::RNSkPlatformContext> context);
|
24
|
+
~RNSkDrawViewImpl();
|
24
25
|
|
25
|
-
|
26
|
+
CALayer* getLayer() { return _layer; }
|
26
27
|
|
27
|
-
|
28
|
+
void setSize(int width, int height);
|
28
29
|
|
29
30
|
protected:
|
30
|
-
|
31
|
-
|
32
|
-
void onInvalidated() override {
|
33
|
-
setNativeDrawFunc(nullptr);
|
34
|
-
};
|
31
|
+
float getScaledWidth() override { return _width * _context->getPixelDensity(); };
|
32
|
+
float getScaledHeight() override { return _height * _context->getPixelDensity(); };
|
35
33
|
|
36
34
|
private:
|
37
|
-
void
|
35
|
+
void drawPicture(const sk_sp<SkPicture> picture) override;
|
38
36
|
bool createSkiaSurface();
|
39
37
|
|
40
38
|
int _nativeId;
|
41
|
-
|
42
|
-
|
39
|
+
float _width = -1;
|
40
|
+
float _height = -1;
|
43
41
|
|
44
42
|
#pragma clang diagnostic push
|
45
43
|
#pragma clang diagnostic ignored "-Wunguarded-availability-new"
|
@@ -19,19 +19,34 @@ sk_sp<GrDirectContext> RNSkDrawViewImpl::_skContext = nullptr;
|
|
19
19
|
|
20
20
|
RNSkDrawViewImpl::RNSkDrawViewImpl(std::shared_ptr<RNSkia::RNSkPlatformContext> context):
|
21
21
|
_context(context), RNSkia::RNSkDrawView(context) {
|
22
|
-
|
23
22
|
#pragma clang diagnostic push
|
24
23
|
#pragma clang diagnostic ignored "-Wunguarded-availability-new"
|
25
|
-
|
24
|
+
_layer = [CAMetalLayer layer];
|
26
25
|
#pragma clang diagnostic pop
|
27
26
|
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
27
|
+
_layer.framebufferOnly = NO;
|
28
|
+
_layer.device = _device;
|
29
|
+
_layer.opaque = false;
|
30
|
+
_layer.contentsScale = _context->getPixelDensity();
|
31
|
+
_layer.pixelFormat = MTLPixelFormatBGRA8Unorm;
|
32
|
+
}
|
33
|
+
|
34
|
+
RNSkDrawViewImpl::~RNSkDrawViewImpl() {
|
35
|
+
if([[NSThread currentThread] isMainThread]) {
|
36
|
+
_layer = NULL;
|
37
|
+
} else {
|
38
|
+
__block auto tempLayer = _layer;
|
39
|
+
dispatch_async(dispatch_get_main_queue(), ^{
|
40
|
+
// By using the tempLayer variable in the block we capture it and it will be
|
41
|
+
// released after the block has finished. This way the CAMetalLayer dealloc will
|
42
|
+
// only be called on the main thread. Problem: this destructor might be called from
|
43
|
+
// releasing the RNSkDrawViewImpl from a thread capture (after dtor has started),
|
44
|
+
// which would cause the CAMetalLayer dealloc to be called on another thread which
|
45
|
+
// causes a crash.
|
46
|
+
// https://github.com/Shopify/react-native-skia/issues/398
|
47
|
+
tempLayer = tempLayer;
|
48
|
+
});
|
49
|
+
}
|
35
50
|
}
|
36
51
|
|
37
52
|
void RNSkDrawViewImpl::setSize(int width, int height) {
|
@@ -44,7 +59,7 @@ void RNSkDrawViewImpl::setSize(int width, int height) {
|
|
44
59
|
requestRedraw();
|
45
60
|
}
|
46
61
|
|
47
|
-
void RNSkDrawViewImpl::
|
62
|
+
void RNSkDrawViewImpl::drawPicture(const sk_sp<SkPicture> picture) {
|
48
63
|
if(_width == -1 && _height == -1) {
|
49
64
|
return;
|
50
65
|
}
|
@@ -26,53 +26,58 @@
|
|
26
26
|
_nativeId = 0;
|
27
27
|
_debugMode = false;
|
28
28
|
_drawingMode = RNSkia::RNSkDrawingMode::Default;
|
29
|
+
|
29
30
|
// Listen to notifications about module invalidation
|
31
|
+
__unsafe_unretained SkiaDrawView *weakSelf = self;
|
30
32
|
auto nc = [NSNotificationCenter defaultCenter];
|
31
33
|
[nc addObserverForName:RCTBridgeWillInvalidateModulesNotification
|
32
34
|
object:nil
|
33
35
|
queue:nil
|
34
36
|
usingBlock:^(NSNotification *notification){
|
35
|
-
// Remove local variables
|
36
|
-
|
37
|
+
// Remove local variables when the bridge is teared down.
|
38
|
+
weakSelf->_impl = nullptr;
|
39
|
+
weakSelf->_manager = nullptr;
|
37
40
|
}];
|
38
41
|
}
|
39
42
|
return self;
|
40
43
|
}
|
41
44
|
|
42
|
-
- (void)dealloc {
|
43
|
-
if(_manager != nullptr) {
|
44
|
-
_manager->unregisterSkiaDrawView(_nativeId);
|
45
|
-
}
|
46
|
-
}
|
47
|
-
|
48
45
|
#pragma mark Lifecycle
|
49
46
|
|
50
|
-
- (void)
|
51
|
-
[super willMoveToWindow: newWindow];
|
52
|
-
|
47
|
+
- (void) willMoveToSuperview:(UIView *)newWindow {
|
53
48
|
if (newWindow == NULL) {
|
54
49
|
// Remove implementation view when the parent view is not set
|
55
50
|
if(_impl != nullptr) {
|
51
|
+
[_impl->getLayer() removeFromSuperlayer];
|
52
|
+
|
56
53
|
if(_nativeId != 0 && _manager != nullptr) {
|
57
54
|
_manager->setSkiaDrawView(_nativeId, nullptr);
|
58
55
|
}
|
59
|
-
|
56
|
+
|
60
57
|
_impl = nullptr;
|
61
58
|
}
|
62
59
|
} else {
|
63
60
|
// Create implementation view when the parent view is set
|
64
61
|
if(_impl == nullptr && _manager != nullptr) {
|
65
62
|
_impl = std::make_shared<RNSkDrawViewImpl>(_manager->getPlatformContext());
|
66
|
-
[self.layer addSublayer:_impl->getLayer()];
|
63
|
+
[self.layer addSublayer: _impl->getLayer()];
|
67
64
|
if(_nativeId != 0) {
|
68
|
-
_manager->setSkiaDrawView(_nativeId, _impl
|
65
|
+
_manager->setSkiaDrawView(_nativeId, _impl);
|
69
66
|
}
|
70
67
|
_impl->setDrawingMode(_drawingMode);
|
71
|
-
_impl->setShowDebugOverlays(_debugMode);
|
68
|
+
_impl->setShowDebugOverlays(_debugMode);
|
72
69
|
}
|
73
70
|
}
|
74
71
|
}
|
75
72
|
|
73
|
+
- (void) dealloc {
|
74
|
+
auto nc = [NSNotificationCenter defaultCenter];
|
75
|
+
[nc removeObserver:self name:RCTBridgeWillInvalidateModulesNotification object:nil];
|
76
|
+
if(_manager != nullptr && _nativeId != 0) {
|
77
|
+
_manager->unregisterSkiaDrawView(_nativeId);
|
78
|
+
}
|
79
|
+
}
|
80
|
+
|
76
81
|
#pragma mark Layout
|
77
82
|
|
78
83
|
- (void) layoutSubviews {
|
@@ -103,7 +108,7 @@
|
|
103
108
|
_nativeId = nativeId;
|
104
109
|
|
105
110
|
if(_impl != nullptr) {
|
106
|
-
_manager->registerSkiaDrawView(nativeId, _impl
|
111
|
+
_manager->registerSkiaDrawView(nativeId, _impl);
|
107
112
|
}
|
108
113
|
}
|
109
114
|
|
@@ -3,7 +3,7 @@
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
4
4
|
value: true
|
5
5
|
});
|
6
|
-
exports.useCanvasSize = exports.useCanvasRef = exports.skiaReconciler = exports.Canvas = void 0;
|
6
|
+
exports.useCanvasSize = exports.useCanvasRef = exports.useCanvas = exports.skiaReconciler = exports.Canvas = void 0;
|
7
7
|
|
8
8
|
var _react = _interopRequireWildcard(require("react"));
|
9
9
|
|
@@ -15,6 +15,8 @@ var _skia = require("../skia");
|
|
15
15
|
|
16
16
|
var _useValue = require("../values/hooks/useValue");
|
17
17
|
|
18
|
+
var _Paint = require("../skia/Paint/Paint");
|
19
|
+
|
18
20
|
var _HostConfig = require("./HostConfig");
|
19
21
|
|
20
22
|
var _processors = require("./processors");
|
@@ -32,14 +34,23 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
32
34
|
// import { debugTree } from "./nodes";
|
33
35
|
const CanvasContext = /*#__PURE__*/_react.default.createContext(null);
|
34
36
|
|
35
|
-
const
|
36
|
-
const
|
37
|
+
const useCanvas = () => {
|
38
|
+
const size = (0, _react.useContext)(CanvasContext);
|
37
39
|
|
38
|
-
if (!
|
40
|
+
if (!size) {
|
39
41
|
throw new Error("Canvas context is not available");
|
40
42
|
}
|
41
43
|
|
42
|
-
return
|
44
|
+
return {
|
45
|
+
size
|
46
|
+
};
|
47
|
+
};
|
48
|
+
|
49
|
+
exports.useCanvas = useCanvas;
|
50
|
+
|
51
|
+
const useCanvasSize = () => {
|
52
|
+
console.warn("useCanvasSize is deprecated, use the size member of useCanvas() instead.");
|
53
|
+
return useCanvas().size;
|
43
54
|
};
|
44
55
|
|
45
56
|
exports.useCanvasSize = useCanvasSize;
|
@@ -109,9 +120,7 @@ const Canvas = /*#__PURE__*/(0, _react.forwardRef)((_ref, forwardedRef) => {
|
|
109
120
|
};
|
110
121
|
}
|
111
122
|
|
112
|
-
const paint =
|
113
|
-
|
114
|
-
paint.setAntiAlias(true);
|
123
|
+
const paint = (0, _Paint.SkiaPaint)();
|
115
124
|
const ctx = {
|
116
125
|
width,
|
117
126
|
height,
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["Canvas.tsx"],"names":["CanvasContext","React","createContext","
|
1
|
+
{"version":3,"sources":["Canvas.tsx"],"names":["CanvasContext","React","createContext","useCanvas","size","Error","useCanvasSize","console","warn","skiaReconciler","skHostConfig","injectIntoDevTools","bundleType","version","rendererPackageName","render","element","root","container","updateContainer","depMgr","subscribe","useCanvasRef","defaultFontMgr","Skia","FontMgr","RefDefault","Canvas","forwardedRef","children","style","debug","mode","onTouch","fontMgr","canvasCtx","width","height","innerRef","ref","useCombinedRefs","tick","setTick","redraw","t","Container","DependencyManager","createContainer","onDraw","canvas","info","timestamp","touches","current","paint","ctx","opacity","center","draw","unsubscribe","refs","targetRef","useRef","useEffect","forEach"],"mappings":"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","sourcesContent":["import React, {\n useEffect,\n useState,\n useCallback,\n useMemo,\n useContext,\n forwardRef,\n useRef,\n} from \"react\";\nimport type {\n RefObject,\n ReactNode,\n ComponentProps,\n MutableRefObject,\n ForwardedRef,\n} from \"react\";\nimport type { OpaqueRoot } from \"react-reconciler\";\nimport ReactReconciler from \"react-reconciler\";\n\nimport { SkiaView, useDrawCallback } from \"../views\";\nimport type { TouchHandler } from \"../views\";\nimport { Skia } from \"../skia\";\nimport type { FontMgr } from \"../skia/FontMgr/FontMgr\";\nimport { useValue } from \"../values/hooks/useValue\";\nimport type { SkiaReadonlyValue } from \"../values/types\";\nimport { SkiaPaint } from \"../skia/Paint/Paint\";\n\nimport { debug as hostDebug, skHostConfig } from \"./HostConfig\";\n// import { debugTree } from \"./nodes\";\nimport { vec } from \"./processors\";\nimport { Container } from \"./nodes\";\nimport { DependencyManager } from \"./DependencyManager\";\n\nconst CanvasContext = React.createContext<SkiaReadonlyValue<{\n width: number;\n height: number;\n}> | null>(null);\n\nexport const useCanvas = () => {\n const size = useContext(CanvasContext);\n if (!size) {\n throw new Error(\"Canvas context is not available\");\n }\n return { size };\n};\n\nexport const useCanvasSize = () => {\n console.warn(\n \"useCanvasSize is deprecated, use the size member of useCanvas() instead.\"\n );\n return useCanvas().size;\n};\n\nexport const skiaReconciler = ReactReconciler(skHostConfig);\n\nskiaReconciler.injectIntoDevTools({\n bundleType: 1,\n version: \"0.0.1\",\n rendererPackageName: \"react-native-skia\",\n});\n\nconst render = (element: ReactNode, root: OpaqueRoot, container: Container) => {\n skiaReconciler.updateContainer(element, root, null, () => {\n hostDebug(\"updateContainer\");\n\n container.depMgr.subscribe();\n });\n};\n\nexport const useCanvasRef = () => useRef<SkiaView>(null);\n\nexport interface CanvasProps extends ComponentProps<typeof SkiaView> {\n ref?: RefObject<SkiaView>;\n children: ReactNode;\n onTouch?: TouchHandler;\n fontMgr?: FontMgr;\n}\n\nconst defaultFontMgr = Skia.FontMgr.RefDefault();\n\nexport const Canvas = forwardRef<SkiaView, CanvasProps>(\n ({ children, style, debug, mode, onTouch, fontMgr }, forwardedRef) => {\n const canvasCtx = useValue({ width: 0, height: 0 });\n const innerRef = useCanvasRef();\n const ref = useCombinedRefs(forwardedRef, innerRef);\n const [tick, setTick] = useState(0);\n const redraw = useCallback(() => setTick((t) => t + 1), []);\n\n const container = useMemo(\n () => new Container(new DependencyManager(ref), redraw),\n [redraw, ref]\n );\n\n const root = useMemo(\n () => skiaReconciler.createContainer(container, 0, false, null),\n [container]\n );\n // Render effect\n useEffect(() => {\n render(\n <CanvasContext.Provider value={canvasCtx}>\n {children}\n </CanvasContext.Provider>,\n root,\n container\n );\n }, [children, root, redraw, container, canvasCtx]);\n\n // Draw callback\n const onDraw = useDrawCallback(\n (canvas, info) => {\n // TODO: if tree is empty (count === 1) maybe we should not render?\n const { width, height, timestamp } = info;\n if (onTouch) {\n onTouch(info.touches);\n }\n if (\n width !== canvasCtx.current.width ||\n height !== canvasCtx.current.height\n ) {\n canvasCtx.current = { width, height };\n }\n const paint = SkiaPaint();\n const ctx = {\n width,\n height,\n timestamp,\n canvas,\n paint,\n opacity: 1,\n ref,\n center: vec(width / 2, height / 2),\n fontMgr: fontMgr ?? defaultFontMgr,\n };\n container.draw(ctx);\n },\n [tick, onTouch]\n );\n\n useEffect(() => {\n return () => {\n container.depMgr.unsubscribe();\n };\n }, [container]);\n\n return (\n <SkiaView\n ref={ref}\n style={style}\n onDraw={onDraw}\n mode={mode}\n debug={debug}\n />\n );\n }\n);\n\n/**\n * Combines a list of refs into a single ref. This can be used to provide\n * both a forwarded ref and an internal ref keeping the same functionality\n * on both of the refs.\n * @param refs Array of refs to combine\n * @returns A single ref that can be used in a ref prop.\n */\nconst useCombinedRefs = <T,>(\n ...refs: Array<MutableRefObject<T> | ForwardedRef<T>>\n) => {\n const targetRef = React.useRef<T>(null);\n React.useEffect(() => {\n refs.forEach((ref) => {\n if (ref) {\n if (typeof ref === \"function\") {\n ref(targetRef.current);\n } else {\n ref.current = targetRef.current;\n }\n }\n });\n }, [refs]);\n return targetRef;\n};\n"]}
|
@@ -23,7 +23,7 @@ const usePaintRef = () => (0, _react.useRef)(null);
|
|
23
23
|
|
24
24
|
exports.usePaintRef = usePaintRef;
|
25
25
|
const Paint = /*#__PURE__*/(0, _react.forwardRef)((props, ref) => {
|
26
|
-
const paint = (0, _react.useMemo)(() => _skia.
|
26
|
+
const paint = (0, _react.useMemo)(() => (0, _skia.SkiaPaint)(), []);
|
27
27
|
(0, _react.useImperativeHandle)(ref, () => paint, [paint]);
|
28
28
|
const onDeclare = (0, _react.useMemo)(() => (0, _nodes.createDeclaration)((paintProps, children, ctx) => (0, _processors.processPaint)(paint, ctx.opacity, paintProps, children)), [paint]);
|
29
29
|
return /*#__PURE__*/_react.default.createElement("skDeclaration", _extends({
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["Paint.tsx"],"names":["usePaintRef","Paint","props","ref","paint","
|
1
|
+
{"version":3,"sources":["Paint.tsx"],"names":["usePaintRef","Paint","props","ref","paint","onDeclare","paintProps","children","ctx","opacity"],"mappings":";;;;;;;AACA;;AAGA;;AAEA;;AACA;;;;;;;;AAEO,MAAMA,WAAW,GAAG,MAAM,mBAAgB,IAAhB,CAA1B;;;AAMA,MAAMC,KAAK,gBAAG,uBACnB,CAACC,KAAD,EAAQC,GAAR,KAAgB;AACd,QAAMC,KAAK,GAAG,oBAAQ,MAAM,sBAAd,EAA2B,EAA3B,CAAd;AACA,kCAAoBD,GAApB,EAAyB,MAAMC,KAA/B,EAAsC,CAACA,KAAD,CAAtC;AACA,QAAMC,SAAS,GAAG,oBAChB,MACE,8BAA8B,CAACC,UAAD,EAAaC,QAAb,EAAuBC,GAAvB,KAC5B,8BAAaJ,KAAb,EAAoBI,GAAG,CAACC,OAAxB,EAAiCH,UAAjC,EAA6CC,QAA7C,CADF,CAFc,EAKhB,CAACH,KAAD,CALgB,CAAlB;AAOA,sBAAO;AAAe,IAAA,SAAS,EAAEC;AAA1B,KAAyCH,KAAzC,EAAP;AACD,CAZkB,CAAd","sourcesContent":["import type { ReactNode } from \"react\";\nimport React, { useRef, useMemo, forwardRef, useImperativeHandle } from \"react\";\n\nimport type { SkPaint } from \"../../skia\";\nimport { SkiaPaint } from \"../../skia\";\nimport type { CustomPaintProps, AnimatedProps } from \"../processors\";\nimport { processPaint } from \"../processors\";\nimport { createDeclaration } from \"../nodes\";\n\nexport const usePaintRef = () => useRef<SkPaint>(null);\n\nexport interface PaintProps extends Omit<CustomPaintProps, \"paint\"> {\n children?: ReactNode | ReactNode[];\n}\n\nexport const Paint = forwardRef<SkPaint, AnimatedProps<PaintProps>>(\n (props, ref) => {\n const paint = useMemo(() => SkiaPaint(), []);\n useImperativeHandle(ref, () => paint, [paint]);\n const onDeclare = useMemo(\n () =>\n createDeclaration<PaintProps>((paintProps, children, ctx) =>\n processPaint(paint, ctx.opacity, paintProps, children)\n ),\n [paint]\n );\n return <skDeclaration onDeclare={onDeclare} {...props} />;\n }\n);\n"]}
|
@@ -25,7 +25,7 @@ const onDeclare = (0, _Declaration.createDeclaration)((_ref, children) => {
|
|
25
25
|
} = _ref;
|
26
26
|
const [src, dst] = children.filter(_ColorFilter.isColorFilter);
|
27
27
|
|
28
|
-
const cf = _skia.Skia.ColorFilter.MakeLerp(t,
|
28
|
+
const cf = _skia.Skia.ColorFilter.MakeLerp(t, src, dst);
|
29
29
|
|
30
30
|
return (0, _Compose.composeColorFilter)(cf, children.filter(c => c !== src && c !== dst));
|
31
31
|
});
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["Lerp.tsx"],"names":["onDeclare","children","t","src","dst","filter","isColorFilter","cf","Skia","ColorFilter","MakeLerp","c","Lerp","props"],"mappings":";;;;;;;AAAA;;AAGA;;AACA;;AAEA;;AAEA;;;;;;AAOA,MAAMA,SAAS,GAAG,oCAA6B,OAAQC,QAAR,KAAqB;AAAA,MAApB;AAAEC,IAAAA;AAAF,GAAoB;AAClE,QAAM,CAACC,GAAD,EAAMC,GAAN,IAAaH,QAAQ,CAACI,MAAT,CAAgBC,0BAAhB,CAAnB;;AACA,QAAMC,EAAE,GAAGC,WAAKC,WAAL,CAAiBC,QAAjB,CAA0BR,CAA1B,
|
1
|
+
{"version":3,"sources":["Lerp.tsx"],"names":["onDeclare","children","t","src","dst","filter","isColorFilter","cf","Skia","ColorFilter","MakeLerp","c","Lerp","props"],"mappings":";;;;;;;AAAA;;AAGA;;AACA;;AAEA;;AAEA;;;;;;AAOA,MAAMA,SAAS,GAAG,oCAA6B,OAAQC,QAAR,KAAqB;AAAA,MAApB;AAAEC,IAAAA;AAAF,GAAoB;AAClE,QAAM,CAACC,GAAD,EAAMC,GAAN,IAAaH,QAAQ,CAACI,MAAT,CAAgBC,0BAAhB,CAAnB;;AACA,QAAMC,EAAE,GAAGC,WAAKC,WAAL,CAAiBC,QAAjB,CAA0BR,CAA1B,EAA6BC,GAA7B,EAAkCC,GAAlC,CAAX;;AACA,SAAO,iCACLG,EADK,EAELN,QAAQ,CAACI,MAAT,CAAiBM,CAAD,IAAOA,CAAC,KAAKR,GAAN,IAAaQ,CAAC,KAAKP,GAA1C,CAFK,CAAP;AAID,CAPiB,CAAlB;;AASO,MAAMQ,IAAI,GAAIC,KAAD,IAAqC;AACvD,sBAAO;AAAe,IAAA,SAAS,EAAEb;AAA1B,KAAyCa,KAAzC,EAAP;AACD,CAFM","sourcesContent":["import React from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { Skia } from \"../../../skia\";\nimport { createDeclaration } from \"../../nodes/Declaration\";\nimport type { AnimatedProps } from \"../../processors/Animations/Animations\";\nimport { isColorFilter } from \"../../../skia/ColorFilter/ColorFilter\";\n\nimport { composeColorFilter } from \"./Compose\";\n\nexport interface LerpProps {\n t: number;\n children: ReactNode | ReactNode[];\n}\n\nconst onDeclare = createDeclaration<LerpProps>(({ t }, children) => {\n const [src, dst] = children.filter(isColorFilter);\n const cf = Skia.ColorFilter.MakeLerp(t, src, dst);\n return composeColorFilter(\n cf,\n children.filter((c) => c !== src && c !== dst)\n );\n});\n\nexport const Lerp = (props: AnimatedProps<LerpProps>) => {\n return <skDeclaration onDeclare={onDeclare} {...props} />;\n};\n"]}
|
@@ -17,8 +17,8 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
17
17
|
|
18
18
|
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
19
19
|
|
20
|
-
// We
|
21
|
-
|
20
|
+
const isVector = obj => // We have an issue to check property existence on JSI backed instances
|
21
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
22
22
|
obj.x !== undefined && obj.y !== undefined;
|
23
23
|
|
24
24
|
const processValue = value => {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["Shader.tsx"],"names":["isVector","obj","x","undefined","y","processValue","value","onDeclare","children","uniforms","source","opaque","transform","processedUniforms","Array","getUniformCount","fill","flatMap","_","i","name","getUniformName","Error","isArray","names","Object","keys","length","usedUniforms","map","unusedUniform","indexOf","filter","n","console","warn","join","makeShaderWithChildren","isShader","Shader","props","defaultProps"],"mappings":";;;;;;;AAAA;;AAGA;;AAGA;;AACA;;;;;;AAEA
|
1
|
+
{"version":3,"sources":["Shader.tsx"],"names":["isVector","obj","x","undefined","y","processValue","value","onDeclare","children","uniforms","source","opaque","transform","processedUniforms","Array","getUniformCount","fill","flatMap","_","i","name","getUniformName","Error","isArray","names","Object","keys","length","usedUniforms","map","unusedUniform","indexOf","filter","n","console","warn","join","makeShaderWithChildren","isShader","Shader","props","defaultProps"],"mappings":";;;;;;;AAAA;;AAGA;;AAGA;;AACA;;;;;;AAEA,MAAMA,QAAQ,GAAIC,GAAD,IACf;AACA;AACCA,GAAD,CAAaC,CAAb,KAAmBC,SAAnB,IAAiCF,GAAD,CAAaG,CAAb,KAAmBD,SAHrD;;AAaA,MAAME,YAAY,GAAIC,KAAD,IAAqD;AACxE,MAAIN,QAAQ,CAACM,KAAD,CAAZ,EAAqB;AACnB,WAAO,CAACA,KAAK,CAACJ,CAAP,EAAUI,KAAK,CAACF,CAAhB,CAAP;AACD;;AACD,SAAOE,KAAP;AACD,CALD;;AAcA,MAAMC,SAAS,GAAG,oCAChB,OAA6CC,QAA7C,KAA0D;AAAA,MAAzD;AAAEC,IAAAA,QAAF;AAAYC,IAAAA,MAAZ;AAAoBC,IAAAA,MAApB;AAA4B,OAAGC;AAA/B,GAAyD;AACxD,QAAMC,iBAAiB,GAAG,IAAIC,KAAJ,CAAUJ,MAAM,CAACK,eAAP,EAAV,EACvBC,IADuB,CAClB,CADkB,EAEvBC,OAFuB,CAEf,CAACC,CAAD,EAAIC,CAAJ,KAAU;AACjB,UAAMC,IAAI,GAAGV,MAAM,CAACW,cAAP,CAAsBF,CAAtB,CAAb;AACA,UAAMb,KAAK,GAAGG,QAAQ,CAACW,IAAD,CAAtB;;AACA,QAAId,KAAK,KAAKH,SAAd,EAAyB;AACvB,YAAM,IAAImB,KAAJ,CAAW,kCAAiCF,IAAK,EAAjD,CAAN;AACD;;AACD,QAAIN,KAAK,CAACS,OAAN,CAAcjB,KAAd,CAAJ,EAA0B;AACxB,aAAOA,KAAK,CAACW,OAAN,CAAcZ,YAAd,CAAP;AACD;;AACD,WAAOA,YAAY,CAACC,KAAD,CAAnB;AACD,GAZuB,CAA1B;AAaA,QAAMkB,KAAK,GAAGC,MAAM,CAACC,IAAP,CAAYjB,QAAZ,CAAd;;AACA,MAAIe,KAAK,CAACG,MAAN,GAAejB,MAAM,CAACK,eAAP,EAAnB,EAA6C;AAC3C,UAAMa,YAAY,GAAG,IAAId,KAAJ,CAAUJ,MAAM,CAACK,eAAP,EAAV,EAClBC,IADkB,CACb,CADa,EAElBa,GAFkB,CAEd,CAACX,CAAD,EAAIC,CAAJ,KAAUT,MAAM,CAACW,cAAP,CAAsBF,CAAtB,CAFI,CAArB;AAGA,UAAMW,aAAa,GAAGN,KAAK,CACxBK,GADmB,CACdT,IAAD,IAAU;AACb,UAAIQ,YAAY,CAACG,OAAb,CAAqBX,IAArB,MAA+B,CAAC,CAApC,EAAuC;AACrC,eAAOA,IAAP;AACD;;AACD,aAAO,IAAP;AACD,KANmB,EAOnBY,MAPmB,CAOXC,CAAD,IAAOA,CAAC,KAAK,IAPD,CAAtB;AAQAC,IAAAA,OAAO,CAACC,IAAR,CACE,oCAAoCL,aAAa,CAACM,IAAd,CAAmB,IAAnB,CADtC;AAGD;;AACD,SAAO1B,MAAM,CAAC2B,sBAAP,CACLxB,iBADK,EAELF,MAFK,EAGLH,QAAQ,CAACwB,MAAT,CAAgBM,cAAhB,CAHK,EAIL,6BAAY1B,SAAZ,CAJK,CAAP;AAMD,CAtCe,CAAlB;;AAyCO,MAAM2B,MAAM,GAAIC,KAAD,IAAuC;AAC3D,sBAAO;AAAe,IAAA,SAAS,EAAEjC;AAA1B,KAAyCiC,KAAzC,EAAP;AACD,CAFM;;;AAIPD,MAAM,CAACE,YAAP,GAAsB;AACpBhC,EAAAA,QAAQ,EAAE;AADU,CAAtB","sourcesContent":["import React from \"react\";\nimport type { ReactNode } from \"react\";\n\nimport { isShader } from \"../../../skia\";\nimport type { IRuntimeEffect } from \"../../../skia\";\nimport type { Vector, AnimatedProps, TransformProps } from \"../../processors\";\nimport { createDeclaration } from \"../../nodes/Declaration\";\nimport { localMatrix } from \"../../processors\";\n\nconst isVector = (obj: unknown): obj is Vector =>\n // We have an issue to check property existence on JSI backed instances\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (obj as any).x !== undefined && (obj as any).y !== undefined;\n\ntype UniformValue = number | Vector | readonly number[];\n\ntype Uniform = UniformValue | readonly UniformValue[];\n\ninterface Uniforms {\n [name: string]: Uniform;\n}\n\nconst processValue = (value: UniformValue): number | readonly number[] => {\n if (isVector(value)) {\n return [value.x, value.y];\n }\n return value;\n};\n\nexport interface ShaderProps extends TransformProps {\n source: IRuntimeEffect;\n uniforms: Uniforms;\n opaque?: boolean;\n children?: ReactNode | ReactNode[];\n}\n\nconst onDeclare = createDeclaration<ShaderProps>(\n ({ uniforms, source, opaque, ...transform }, children) => {\n const processedUniforms = new Array(source.getUniformCount())\n .fill(0)\n .flatMap((_, i) => {\n const name = source.getUniformName(i);\n const value = uniforms[name];\n if (value === undefined) {\n throw new Error(`No value specified for uniform ${name}`);\n }\n if (Array.isArray(value)) {\n return value.flatMap(processValue);\n }\n return processValue(value as UniformValue);\n });\n const names = Object.keys(uniforms);\n if (names.length > source.getUniformCount()) {\n const usedUniforms = new Array(source.getUniformCount())\n .fill(0)\n .map((_, i) => source.getUniformName(i));\n const unusedUniform = names\n .map((name) => {\n if (usedUniforms.indexOf(name) === -1) {\n return name;\n }\n return null;\n })\n .filter((n) => n !== null);\n console.warn(\n \"Unused uniforms were provided: \" + unusedUniform.join(\", \")\n );\n }\n return source.makeShaderWithChildren(\n processedUniforms,\n opaque,\n children.filter(isShader),\n localMatrix(transform)\n );\n }\n);\n\nexport const Shader = (props: AnimatedProps<ShaderProps>) => {\n return <skDeclaration onDeclare={onDeclare} {...props} />;\n};\n\nShader.defaultProps = {\n uniforms: [],\n};\n"]}
|
@@ -11,6 +11,8 @@ var _nodes = require("../../nodes");
|
|
11
11
|
|
12
12
|
var _processors = require("../../processors");
|
13
13
|
|
14
|
+
var _skia = require("../../../skia");
|
15
|
+
|
14
16
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
15
17
|
|
16
18
|
function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
|
@@ -24,15 +26,21 @@ const onDraw = (0, _nodes.createDrawing)((_ref, _ref2) => {
|
|
24
26
|
start,
|
25
27
|
end,
|
26
28
|
stroke,
|
29
|
+
fillType,
|
27
30
|
...pathProps
|
28
31
|
} = _ref2;
|
29
32
|
const hasStartOffset = start !== 0;
|
30
|
-
const hasEndOffset =
|
33
|
+
const hasEndOffset = end !== 1;
|
31
34
|
const hasStrokeOptions = stroke !== undefined;
|
32
|
-
const
|
35
|
+
const hasFillType = !!fillType;
|
36
|
+
const willMutatePath = hasStartOffset || hasEndOffset || hasStrokeOptions || hasFillType;
|
33
37
|
const pristinePath = (0, _processors.processPath)(pathProps.path);
|
34
38
|
const path = willMutatePath ? pristinePath.copy() : pristinePath;
|
35
39
|
|
40
|
+
if (hasFillType) {
|
41
|
+
path.setFillType(_skia.FillType[(0, _processors.enumKey)(fillType)]);
|
42
|
+
}
|
43
|
+
|
36
44
|
if (hasStrokeOptions) {
|
37
45
|
path.stroke(stroke);
|
38
46
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["Path.tsx"],"names":["onDraw","canvas","paint","start","end","stroke","pathProps","hasStartOffset","hasEndOffset","hasStrokeOptions","undefined","willMutatePath","pristinePath","path","copy","trim","drawPath","Path","props","defaultProps"],"mappings":";;;;;;;AAAA;;
|
1
|
+
{"version":3,"sources":["Path.tsx"],"names":["onDraw","canvas","paint","start","end","stroke","fillType","pathProps","hasStartOffset","hasEndOffset","hasStrokeOptions","undefined","hasFillType","willMutatePath","pristinePath","path","copy","setFillType","FillType","trim","drawPath","Path","props","defaultProps"],"mappings":";;;;;;;AAAA;;AAQA;;AACA;;AACA;;;;;;AAgBA,MAAMA,MAAM,GAAG,0BACb,iBAAuE;AAAA,MAAtE;AAAEC,IAAAA,MAAF;AAAUC,IAAAA;AAAV,GAAsE;AAAA,MAAnD;AAAEC,IAAAA,KAAF;AAASC,IAAAA,GAAT;AAAcC,IAAAA,MAAd;AAAsBC,IAAAA,QAAtB;AAAgC,OAAGC;AAAnC,GAAmD;AACrE,QAAMC,cAAc,GAAGL,KAAK,KAAK,CAAjC;AACA,QAAMM,YAAY,GAAGL,GAAG,KAAK,CAA7B;AACA,QAAMM,gBAAgB,GAAGL,MAAM,KAAKM,SAApC;AACA,QAAMC,WAAW,GAAG,CAAC,CAACN,QAAtB;AACA,QAAMO,cAAc,GAClBL,cAAc,IAAIC,YAAlB,IAAkCC,gBAAlC,IAAsDE,WADxD;AAEA,QAAME,YAAY,GAAG,6BAAYP,SAAS,CAACQ,IAAtB,CAArB;AACA,QAAMA,IAAI,GAAGF,cAAc,GAAGC,YAAY,CAACE,IAAb,EAAH,GAAyBF,YAApD;;AACA,MAAIF,WAAJ,EAAiB;AACfG,IAAAA,IAAI,CAACE,WAAL,CAAiBC,eAAS,yBAAQZ,QAAR,CAAT,CAAjB;AACD;;AACD,MAAII,gBAAJ,EAAsB;AACpBK,IAAAA,IAAI,CAACV,MAAL,CAAYA,MAAZ;AACD;;AACD,MAAIG,cAAc,IAAIC,YAAtB,EAAoC;AAClCM,IAAAA,IAAI,CAACI,IAAL,CAAUhB,KAAV,EAAiBC,GAAjB,EAAsB,KAAtB;AACD;;AACDH,EAAAA,MAAM,CAACmB,QAAP,CAAgBL,IAAhB,EAAsBb,KAAtB;AACD,CApBY,CAAf;;AAuBO,MAAMmB,IAAI,GAAIC,KAAD,IAAqC;AACvD,sBAAO;AAAW,IAAA,MAAM,EAAEtB;AAAnB,KAA+BsB,KAA/B,EAAP;AACD,CAFM;;;AAIPD,IAAI,CAACE,YAAL,GAAoB;AAClBpB,EAAAA,KAAK,EAAE,CADW;AAElBC,EAAAA,GAAG,EAAE;AAFa,CAApB","sourcesContent":["import React from \"react\";\n\nimport type {\n CustomPaintProps,\n AnimatedProps,\n PathDef,\n SkEnum,\n} from \"../../processors\";\nimport { createDrawing } from \"../../nodes\";\nimport { processPath, enumKey } from \"../../processors\";\nimport { FillType } from \"../../../skia\";\n\ninterface StrokeOpts {\n width?: number;\n strokeMiterlimit?: number;\n precision?: number;\n}\n\nexport interface PathProps extends CustomPaintProps {\n path: PathDef;\n start: number;\n end: number;\n stroke?: StrokeOpts;\n fillType?: SkEnum<typeof FillType>;\n}\n\nconst onDraw = createDrawing<PathProps>(\n ({ canvas, paint }, { start, end, stroke, fillType, ...pathProps }) => {\n const hasStartOffset = start !== 0;\n const hasEndOffset = end !== 1;\n const hasStrokeOptions = stroke !== undefined;\n const hasFillType = !!fillType;\n const willMutatePath =\n hasStartOffset || hasEndOffset || hasStrokeOptions || hasFillType;\n const pristinePath = processPath(pathProps.path);\n const path = willMutatePath ? pristinePath.copy() : pristinePath;\n if (hasFillType) {\n path.setFillType(FillType[enumKey(fillType)]);\n }\n if (hasStrokeOptions) {\n path.stroke(stroke);\n }\n if (hasStartOffset || hasEndOffset) {\n path.trim(start, end, false);\n }\n canvas.drawPath(path, paint);\n }\n);\n\nexport const Path = (props: AnimatedProps<PathProps>) => {\n return <skDrawing onDraw={onDraw} {...props} />;\n};\n\nPath.defaultProps = {\n start: 0,\n end: 1,\n};\n"]}
|
@@ -48,7 +48,9 @@ class Node {
|
|
48
48
|
visit(ctx, children) {
|
49
49
|
const returnedValues = [];
|
50
50
|
(children !== null && children !== void 0 ? children : this.children).forEach(child => {
|
51
|
-
if (
|
51
|
+
if (child.memoized && child.memoizable) {
|
52
|
+
returnedValues.push(child.memoized);
|
53
|
+
} else {
|
52
54
|
const ret = child.draw(ctx);
|
53
55
|
|
54
56
|
if (ret) {
|
@@ -58,8 +60,6 @@ class Node {
|
|
58
60
|
child.memoized = ret;
|
59
61
|
}
|
60
62
|
}
|
61
|
-
} else {
|
62
|
-
returnedValues.push(child.memoized);
|
63
63
|
}
|
64
64
|
});
|
65
65
|
return returnedValues;
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["Node.ts"],"names":["NodeType","Node","constructor","depMgr","props","_props","unSubscribeNode","subscribeNode","visit","ctx","children","returnedValues","forEach","child","memoized","
|
1
|
+
{"version":3,"sources":["Node.ts"],"names":["NodeType","Node","constructor","depMgr","props","_props","unSubscribeNode","subscribeNode","visit","ctx","children","returnedValues","forEach","child","memoized","memoizable","push","ret","draw"],"mappings":";;;;;;;;;IAKYA,Q;;;WAAAA,Q;AAAAA,EAAAA,Q;AAAAA,EAAAA,Q;GAAAA,Q,wBAAAA,Q;;AAOL,MAAeC,IAAf,CAAiC;AAQtCC,EAAAA,WAAW,CAACC,MAAD,EAA4BC,KAA5B,EAAqD;AAAA,sCAPpC,EAOoC;;AAAA;;AAAA,wCALnD,KAKmD;;AAAA,sCAJ3B,IAI2B;;AAAA;;AAAA;;AAC9D,SAAKC,MAAL,GAAcD,KAAd;AACA,SAAKD,MAAL,GAAcA,MAAd;AACA,SAAKA,MAAL,CAAYG,eAAZ,CAA4B,IAA5B;AACA,SAAKH,MAAL,CAAYI,aAAZ,CAA0B,IAA1B,EAAgCH,KAAhC;AACD;;AAIQ,MAALA,KAAK,CAACA,KAAD,EAA0B;AACjC,SAAKD,MAAL,CAAYG,eAAZ,CAA4B,IAA5B;AACA,SAAKH,MAAL,CAAYI,aAAZ,CAA0B,IAA1B,EAAgCH,KAAhC;AACA,SAAKC,MAAL,GAAcD,KAAd;AACD;;AAEQ,MAALA,KAAK,GAAG;AACV,WAAO,KAAKC,MAAZ;AACD;;AAEDG,EAAAA,KAAK,CAACC,GAAD,EAAsBC,QAAtB,EAAyC;AAC5C,UAAMC,cAAkD,GAAG,EAA3D;AACA,KAACD,QAAD,aAACA,QAAD,cAACA,QAAD,GAAa,KAAKA,QAAlB,EAA4BE,OAA5B,CAAqCC,KAAD,IAAW;AAC7C,UAAIA,KAAK,CAACC,QAAN,IAAkBD,KAAK,CAACE,UAA5B,EAAwC;AACtCJ,QAAAA,cAAc,CAACK,IAAf,CAAoBH,KAAK,CAACC,QAA1B;AACD,OAFD,MAEO;AACL,cAAMG,GAAG,GAAGJ,KAAK,CAACK,IAAN,CAAWT,GAAX,CAAZ;;AACA,YAAIQ,GAAJ,EAAS;AACPN,UAAAA,cAAc,CAACK,IAAf,CAAoBC,GAApB;;AACA,cAAIJ,KAAK,CAACE,UAAV,EAAsB;AACpBF,YAAAA,KAAK,CAACC,QAAN,GAAiBG,GAAjB;AACD;AACF;AACF;AACF,KAZD;AAaA,WAAON,cAAP;AACD;;AA3CqC","sourcesContent":["import type { SkJSIInstance } from \"../../skia/JsiInstance\";\nimport type { DependencyManager } from \"../DependencyManager\";\nimport type { DrawingContext } from \"../DrawingContext\";\nimport type { AnimatedProps } from \"../processors\";\n\nexport enum NodeType {\n Declaration = \"skDeclaration\",\n Drawing = \"skDrawing\",\n}\n\ntype DeclarationResult = SkJSIInstance<string> | null;\n\nexport abstract class Node<P = unknown> {\n readonly children: Node[] = [];\n _props: AnimatedProps<P>;\n memoizable = false;\n memoized: DeclarationResult | null = null;\n parent?: Node;\n depMgr: DependencyManager;\n\n constructor(depMgr: DependencyManager, props: AnimatedProps<P>) {\n this._props = props;\n this.depMgr = depMgr;\n this.depMgr.unSubscribeNode(this);\n this.depMgr.subscribeNode(this, props);\n }\n\n abstract draw(ctx: DrawingContext): void | DeclarationResult;\n\n set props(props: AnimatedProps<P>) {\n this.depMgr.unSubscribeNode(this);\n this.depMgr.subscribeNode(this, props);\n this._props = props;\n }\n\n get props() {\n return this._props;\n }\n\n visit(ctx: DrawingContext, children?: Node[]) {\n const returnedValues: Exclude<DeclarationResult, null>[] = [];\n (children ?? this.children).forEach((child) => {\n if (child.memoized && child.memoizable) {\n returnedValues.push(child.memoized);\n } else {\n const ret = child.draw(ctx);\n if (ret) {\n returnedValues.push(ret);\n if (child.memoizable) {\n child.memoized = ret;\n }\n }\n }\n });\n return returnedValues;\n }\n}\n"]}
|
@@ -7,8 +7,9 @@ exports.processCircle = void 0;
|
|
7
7
|
|
8
8
|
var _Vector = require("./math/Vector");
|
9
9
|
|
10
|
-
const isCircleScalarDef = def => //
|
11
|
-
|
10
|
+
const isCircleScalarDef = def => // We have an issue to check property existence on JSI backed instances
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
12
|
+
def.cx !== undefined;
|
12
13
|
|
13
14
|
const processCircle = def => {
|
14
15
|
if (isCircleScalarDef(def)) {
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"sources":["Circles.ts"],"names":["isCircleScalarDef","def","cx","processCircle","c","cy","r"],"mappings":";;;;;;;AACA;;AAeA,MAAMA,iBAAiB,GAAIC,GAAD,IACxB;AACCA,GAAD,CAAaC,
|
1
|
+
{"version":3,"sources":["Circles.ts"],"names":["isCircleScalarDef","def","cx","undefined","processCircle","c","cy","r"],"mappings":";;;;;;;AACA;;AAeA,MAAMA,iBAAiB,GAAIC,GAAD,IACxB;AACA;AACCA,GAAD,CAAaC,EAAb,KAAoBC,SAHtB;;AAIO,MAAMC,aAAa,GAAIH,GAAD,IAAoB;AAC/C,MAAID,iBAAiB,CAACC,GAAD,CAArB,EAA4B;AAC1B,WAAO;AAAEI,MAAAA,CAAC,EAAE,iBAAIJ,GAAG,CAACC,EAAR,EAAYD,GAAG,CAACK,EAAhB,CAAL;AAA0BC,MAAAA,CAAC,EAAEN,GAAG,CAACM;AAAjC,KAAP;AACD;;AACD,SAAON,GAAP;AACD,CALM","sourcesContent":["import type { Vector } from \"./math/Vector\";\nimport { vec } from \"./math/Vector\";\n\ninterface PointCircleDef {\n c: Vector;\n r: number;\n}\n\ninterface ScalarCircleDef {\n cx: number;\n cy: number;\n r: number;\n}\n\nexport type CircleDef = PointCircleDef | ScalarCircleDef;\n\nconst isCircleScalarDef = (def: CircleDef): def is ScalarCircleDef =>\n // We have an issue to check property existence on JSI backed instances\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (def as any).cx !== undefined;\nexport const processCircle = (def: CircleDef) => {\n if (isCircleScalarDef(def)) {\n return { c: vec(def.cx, def.cy), r: def.r };\n }\n return def;\n};\n"]}
|