@shopify/react-native-skia 1.4.2 → 1.5.0
Sign up to get free protection for your applications and to get access to all the features.
- package/android/CMakeLists.txt +38 -6
- package/android/build.gradle +1 -0
- package/android/cpp/jni/include/JniSkiaBaseView.h +0 -3
- package/android/cpp/jni/include/JniSkiaDomView.h +0 -6
- package/android/cpp/jni/include/JniSkiaPictureView.h +0 -5
- package/android/cpp/rnskia-android/RNSkAndroidView.h +0 -20
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseView.java +0 -72
- package/cpp/rnskia/RNSkDomView.cpp +0 -79
- package/cpp/rnskia/RNSkDomView.h +1 -39
- package/cpp/rnskia/RNSkPictureView.h +0 -1
- package/cpp/rnskia/RNSkView.h +0 -17
- package/ios/RNSkia-iOS/SkiaUIView.mm +0 -51
- package/lib/commonjs/mock/index.js +0 -1
- package/lib/commonjs/mock/index.js.map +1 -1
- package/lib/commonjs/renderer/Canvas.d.ts +1 -2
- package/lib/commonjs/renderer/Canvas.js +0 -3
- package/lib/commonjs/renderer/Canvas.js.map +1 -1
- package/lib/commonjs/skia/web/JsiSkia.js.map +1 -1
- package/lib/commonjs/views/SkiaBaseWebView.d.ts +2 -11
- package/lib/commonjs/views/SkiaBaseWebView.js +3 -31
- package/lib/commonjs/views/SkiaBaseWebView.js.map +1 -1
- package/lib/commonjs/views/SkiaDomView.js +0 -12
- package/lib/commonjs/views/SkiaDomView.js.map +1 -1
- package/lib/commonjs/views/SkiaDomView.web.d.ts +2 -2
- package/lib/commonjs/views/SkiaDomView.web.js +1 -6
- package/lib/commonjs/views/SkiaDomView.web.js.map +1 -1
- package/lib/commonjs/views/SkiaJSDomView.js +0 -12
- package/lib/commonjs/views/SkiaJSDomView.js.map +1 -1
- package/lib/commonjs/views/index.d.ts +0 -1
- package/lib/commonjs/views/index.js +0 -11
- package/lib/commonjs/views/index.js.map +1 -1
- package/lib/commonjs/views/types.d.ts +0 -26
- package/lib/commonjs/views/types.js +0 -8
- package/lib/commonjs/views/types.js.map +1 -1
- package/lib/module/mock/index.js +0 -1
- package/lib/module/mock/index.js.map +1 -1
- package/lib/module/renderer/Canvas.d.ts +1 -2
- package/lib/module/renderer/Canvas.js +0 -3
- package/lib/module/renderer/Canvas.js.map +1 -1
- package/lib/module/skia/web/JsiSkia.js.map +1 -1
- package/lib/module/views/SkiaBaseWebView.d.ts +2 -11
- package/lib/module/views/SkiaBaseWebView.js +3 -31
- package/lib/module/views/SkiaBaseWebView.js.map +1 -1
- package/lib/module/views/SkiaDomView.js +0 -12
- package/lib/module/views/SkiaDomView.js.map +1 -1
- package/lib/module/views/SkiaDomView.web.d.ts +2 -2
- package/lib/module/views/SkiaDomView.web.js +1 -6
- package/lib/module/views/SkiaDomView.web.js.map +1 -1
- package/lib/module/views/SkiaJSDomView.js +0 -12
- package/lib/module/views/SkiaJSDomView.js.map +1 -1
- package/lib/module/views/index.d.ts +0 -1
- package/lib/module/views/index.js +0 -1
- package/lib/module/views/index.js.map +1 -1
- package/lib/module/views/types.d.ts +0 -26
- package/lib/module/views/types.js +1 -7
- package/lib/module/views/types.js.map +1 -1
- package/lib/typescript/lib/commonjs/mock/index.d.ts +0 -1
- package/lib/typescript/lib/commonjs/views/SkiaBaseWebView.d.ts +0 -3
- package/lib/typescript/lib/commonjs/views/SkiaDomView.web.d.ts +1 -1
- package/lib/typescript/lib/commonjs/views/types.d.ts +0 -1
- package/lib/typescript/lib/module/mock/index.d.ts +0 -1
- package/lib/typescript/lib/module/views/SkiaBaseWebView.d.ts +0 -3
- package/lib/typescript/lib/module/views/SkiaDomView.web.d.ts +1 -1
- package/lib/typescript/lib/module/views/index.d.ts +0 -1
- package/lib/typescript/lib/module/views/types.d.ts +1 -1
- package/lib/typescript/src/renderer/Canvas.d.ts +1 -2
- package/lib/typescript/src/views/SkiaBaseWebView.d.ts +2 -11
- package/lib/typescript/src/views/SkiaDomView.web.d.ts +2 -2
- package/lib/typescript/src/views/index.d.ts +0 -1
- package/lib/typescript/src/views/types.d.ts +0 -26
- package/package.json +1 -1
- package/src/mock/index.ts +0 -1
- package/src/renderer/Canvas.tsx +1 -5
- package/src/renderer/__tests__/setup.tsx +0 -2
- package/src/skia/web/JsiSkia.ts +1 -1
- package/src/views/SkiaBaseWebView.tsx +5 -42
- package/src/views/SkiaDomView.tsx +2 -14
- package/src/views/SkiaDomView.web.tsx +2 -9
- package/src/views/SkiaJSDomView.tsx +2 -14
- package/src/views/index.ts +0 -1
- package/src/views/types.ts +0 -32
- package/cpp/rnskia/RNSkInfoParameter.h +0 -92
- package/lib/commonjs/renderer/__tests__/TouchHandler.spec.d.ts +0 -1
- package/lib/commonjs/views/useTouchHandler.d.ts +0 -22
- package/lib/commonjs/views/useTouchHandler.js +0 -83
- package/lib/commonjs/views/useTouchHandler.js.map +0 -1
- package/lib/module/renderer/__tests__/TouchHandler.spec.d.ts +0 -1
- package/lib/module/views/useTouchHandler.d.ts +0 -22
- package/lib/module/views/useTouchHandler.js +0 -75
- package/lib/module/views/useTouchHandler.js.map +0 -1
- package/lib/typescript/lib/commonjs/views/useTouchHandler.d.ts +0 -12
- package/lib/typescript/lib/module/views/useTouchHandler.d.ts +0 -2
- package/lib/typescript/src/renderer/__tests__/TouchHandler.spec.d.ts +0 -1
- package/lib/typescript/src/views/useTouchHandler.d.ts +0 -22
- package/src/renderer/__tests__/TouchHandler.spec.tsx +0 -113
- package/src/views/useTouchHandler.ts +0 -107
package/android/CMakeLists.txt
CHANGED
@@ -155,10 +155,13 @@ endif()
|
|
155
155
|
message("-- JSI : " ${JSI_LIB})
|
156
156
|
|
157
157
|
unset(REACT_LIB CACHE)
|
158
|
-
if(${REACT_NATIVE_VERSION} GREATER_EQUAL
|
158
|
+
if(${REACT_NATIVE_VERSION} GREATER_EQUAL 76)
|
159
|
+
# RN 0.76 packs react_nativemodule_core into ReactAndroid::reactnative
|
160
|
+
set (REACT_LIB ReactAndroid::reactnative)
|
161
|
+
elseif(${REACT_NATIVE_VERSION} GREATER_EQUAL 71)
|
159
162
|
# RN 0.71 distributes prebuilt binaries.
|
160
163
|
set (REACT_LIB ReactAndroid::react_nativemodule_core)
|
161
|
-
else()
|
164
|
+
else()
|
162
165
|
find_library(
|
163
166
|
REACT_LIB
|
164
167
|
react_nativemodule_core
|
@@ -183,7 +186,10 @@ endif()
|
|
183
186
|
message("-- FBJNI : " ${FBJNI_LIBRARY})
|
184
187
|
|
185
188
|
unset(REACTNATIVEJNI_LIB CACHE)
|
186
|
-
if(${REACT_NATIVE_VERSION} GREATER_EQUAL
|
189
|
+
if(${REACT_NATIVE_VERSION} GREATER_EQUAL 76)
|
190
|
+
# RN 0.76 doesn't have reactnativejni
|
191
|
+
# DO NOTHING, we'll not link these libraries
|
192
|
+
elseif(${REACT_NATIVE_VERSION} GREATER_EQUAL 71)
|
187
193
|
# RN 0.71 distributes prebuilt binaries.
|
188
194
|
set (REACTNATIVEJNI_LIB "ReactAndroid::reactnativejni")
|
189
195
|
else()
|
@@ -197,7 +203,10 @@ endif()
|
|
197
203
|
message("-- REACTNATIVEJNI : " ${REACTNATIVEJNI_LIB})
|
198
204
|
|
199
205
|
unset(RUNTIMEEXECUTOR_LIB CACHE)
|
200
|
-
if(${REACT_NATIVE_VERSION} GREATER_EQUAL
|
206
|
+
if(${REACT_NATIVE_VERSION} GREATER_EQUAL 76)
|
207
|
+
# RN 0.76 doesn't have runtimeexecutor
|
208
|
+
# DO NOTHING, we'll not link these libraries
|
209
|
+
elseif(${REACT_NATIVE_VERSION} GREATER_EQUAL 71)
|
201
210
|
# RN 0.71 distributes prebuilt binaries.
|
202
211
|
set (RUNTIMEEXECUTOR_LIB "ReactAndroid::runtimeexecutor")
|
203
212
|
else()
|
@@ -211,7 +220,10 @@ endif()
|
|
211
220
|
message("-- RUNTIMEEXECUTOR : " ${RUNTIMEEXECUTOR_LIB})
|
212
221
|
|
213
222
|
unset(TURBOMODULES_LIB CACHE)
|
214
|
-
if(${REACT_NATIVE_VERSION} GREATER_EQUAL
|
223
|
+
if(${REACT_NATIVE_VERSION} GREATER_EQUAL 76)
|
224
|
+
# RN 0.76 doesn't have turbomodulejsijni
|
225
|
+
# DO NOTHING, we'll not link these libraries
|
226
|
+
elseif(${REACT_NATIVE_VERSION} GREATER_EQUAL 71)
|
215
227
|
# RN 0.71 distributes prebuilt binaries.
|
216
228
|
set (TURBOMODULES_LIB "ReactAndroid::turbomodulejsijni")
|
217
229
|
else()
|
@@ -227,7 +239,26 @@ message("-- TURBO : " ${TURBOMODULES_LIB})
|
|
227
239
|
add_definitions(-DREACT_NATIVE_VERSION=${REACT_NATIVE_VERSION})
|
228
240
|
|
229
241
|
# Link
|
230
|
-
|
242
|
+
if(${REACT_NATIVE_VERSION} GREATER_EQUAL 76)
|
243
|
+
target_link_libraries(
|
244
|
+
${PACKAGE_NAME}
|
245
|
+
${LOG_LIB}
|
246
|
+
${REACT_LIB}
|
247
|
+
${FBJNI_LIBRARY}
|
248
|
+
${JSI_LIB}
|
249
|
+
${SKIA_SVG_LIB}
|
250
|
+
${SKIA_SKSHAPER_LIB}
|
251
|
+
${SKIA_SKPARAGRAPH_LIB}
|
252
|
+
${SKIA_SKUNICODE_CORE_LIB}
|
253
|
+
${SKIA_SKUNICODE_ICU_LIB}
|
254
|
+
${SKIA_LIB}
|
255
|
+
-ljnigraphics
|
256
|
+
-lGLESv2
|
257
|
+
-lEGL
|
258
|
+
-landroid
|
259
|
+
)
|
260
|
+
else()
|
261
|
+
target_link_libraries(
|
231
262
|
${PACKAGE_NAME}
|
232
263
|
${LOG_LIB}
|
233
264
|
${FBJNI_LIBRARY}
|
@@ -247,3 +278,4 @@ target_link_libraries(
|
|
247
278
|
-lEGL
|
248
279
|
-landroid
|
249
280
|
)
|
281
|
+
endif()
|
package/android/build.gradle
CHANGED
@@ -29,9 +29,6 @@ public:
|
|
29
29
|
}
|
30
30
|
|
31
31
|
protected:
|
32
|
-
virtual void updateTouchPoints(jni::JArrayDouble touches) {
|
33
|
-
_skiaAndroidView->updateTouchPoints(touches);
|
34
|
-
}
|
35
32
|
|
36
33
|
virtual void surfaceAvailable(jobject surface, int width, int height) {
|
37
34
|
_skiaAndroidView->surfaceAvailable(surface, width, height);
|
@@ -42,17 +42,11 @@ public:
|
|
42
42
|
JniSkiaDomView::surfaceSizeChanged),
|
43
43
|
makeNativeMethod("setMode", JniSkiaDomView::setMode),
|
44
44
|
makeNativeMethod("setDebugMode", JniSkiaDomView::setDebugMode),
|
45
|
-
makeNativeMethod("updateTouchPoints",
|
46
|
-
JniSkiaDomView::updateTouchPoints),
|
47
45
|
makeNativeMethod("registerView", JniSkiaDomView::registerView),
|
48
46
|
makeNativeMethod("unregisterView", JniSkiaDomView::unregisterView)});
|
49
47
|
}
|
50
48
|
|
51
49
|
protected:
|
52
|
-
void updateTouchPoints(jni::JArrayDouble touches) override {
|
53
|
-
JniSkiaBaseView::updateTouchPoints(touches);
|
54
|
-
}
|
55
|
-
|
56
50
|
void surfaceAvailable(jobject surface, int width, int height) override {
|
57
51
|
JniSkiaBaseView::surfaceAvailable(surface, width, height);
|
58
52
|
}
|
@@ -43,17 +43,12 @@ public:
|
|
43
43
|
JniSkiaPictureView::surfaceSizeChanged),
|
44
44
|
makeNativeMethod("setMode", JniSkiaPictureView::setMode),
|
45
45
|
makeNativeMethod("setDebugMode", JniSkiaPictureView::setDebugMode),
|
46
|
-
makeNativeMethod("updateTouchPoints",
|
47
|
-
JniSkiaPictureView::updateTouchPoints),
|
48
46
|
makeNativeMethod("registerView", JniSkiaPictureView::registerView),
|
49
47
|
makeNativeMethod("unregisterView",
|
50
48
|
JniSkiaPictureView::unregisterView)});
|
51
49
|
}
|
52
50
|
|
53
51
|
protected:
|
54
|
-
void updateTouchPoints(jni::JArrayDouble touches) override {
|
55
|
-
JniSkiaBaseView::updateTouchPoints(touches);
|
56
|
-
}
|
57
52
|
|
58
53
|
void surfaceAvailable(jobject surface, int width, int height) override {
|
59
54
|
JniSkiaBaseView::surfaceAvailable(surface, width, height);
|
@@ -19,8 +19,6 @@ public:
|
|
19
19
|
|
20
20
|
virtual float getPixelDensity() = 0;
|
21
21
|
|
22
|
-
virtual void updateTouchPoints(jni::JArrayDouble touches) = 0;
|
23
|
-
|
24
22
|
virtual void setMode(std::string mode) = 0;
|
25
23
|
|
26
24
|
virtual void setShowDebugInfo(bool show) = 0;
|
@@ -76,24 +74,6 @@ public:
|
|
76
74
|
|
77
75
|
void viewDidUnmount() override { T::endDrawingLoop(); }
|
78
76
|
|
79
|
-
void updateTouchPoints(jni::JArrayDouble touches) override {
|
80
|
-
// Create touch points
|
81
|
-
std::vector<RNSkia::RNSkTouchInfo> points;
|
82
|
-
auto pin = touches.pin();
|
83
|
-
auto scale = getPixelDensity();
|
84
|
-
points.reserve(pin.size() / 5);
|
85
|
-
for (size_t i = 0; i < pin.size(); i += 5) {
|
86
|
-
RNSkTouchInfo point;
|
87
|
-
point.x = pin[i] / scale;
|
88
|
-
point.y = pin[i + 1] / scale;
|
89
|
-
point.force = pin[i + 2];
|
90
|
-
point.type = (RNSkia::RNSkTouchInfo::TouchType)pin[i + 3];
|
91
|
-
point.id = pin[i + 4];
|
92
|
-
points.push_back(point);
|
93
|
-
}
|
94
|
-
T::updateTouchState(points);
|
95
|
-
}
|
96
|
-
|
97
77
|
std::shared_ptr<RNSkView> getSkiaView() override {
|
98
78
|
return T::shared_from_this();
|
99
79
|
}
|
@@ -53,76 +53,6 @@ public abstract class SkiaBaseView extends ReactViewGroup implements TextureView
|
|
53
53
|
mTexture.layout(0, 0, this.getMeasuredWidth(), this.getMeasuredHeight());
|
54
54
|
}
|
55
55
|
|
56
|
-
@Override
|
57
|
-
public boolean onTouchEvent(MotionEvent ev) {
|
58
|
-
// https://developer.android.com/training/gestures/multi
|
59
|
-
int action = ev.getActionMasked();
|
60
|
-
|
61
|
-
MotionEvent.PointerCoords r = new MotionEvent.PointerCoords();
|
62
|
-
|
63
|
-
double[] points;
|
64
|
-
|
65
|
-
// If this is a pointer_up/down event we need to handle it a bit specialized
|
66
|
-
switch (action) {
|
67
|
-
case MotionEvent.ACTION_POINTER_DOWN:
|
68
|
-
case MotionEvent.ACTION_POINTER_UP: {
|
69
|
-
points = new double[5];
|
70
|
-
int pointerIndex = ev.getActionIndex();
|
71
|
-
ev.getPointerCoords(pointerIndex, r);
|
72
|
-
points[0] = r.x;
|
73
|
-
points[1] = r.y;
|
74
|
-
points[2] = ev.getPressure(pointerIndex);
|
75
|
-
points[3] = motionActionToType(action);
|
76
|
-
points[4] = ev.getPointerId(pointerIndex);
|
77
|
-
|
78
|
-
updateTouchPoints(points);
|
79
|
-
|
80
|
-
break;
|
81
|
-
}
|
82
|
-
default: {
|
83
|
-
// For the rest we can just handle it like expected
|
84
|
-
int count = ev.getPointerCount();
|
85
|
-
int pointerIndex = 0;
|
86
|
-
points = new double[5 * count];
|
87
|
-
for (int i = 0; i < count; i++) {
|
88
|
-
ev.getPointerCoords(i, r);
|
89
|
-
points[pointerIndex++] = r.x;
|
90
|
-
points[pointerIndex++] = r.y;
|
91
|
-
points[pointerIndex++] = ev.getPressure(i);
|
92
|
-
points[pointerIndex++] = motionActionToType(action);
|
93
|
-
points[pointerIndex++] = ev.getPointerId(i);
|
94
|
-
}
|
95
|
-
|
96
|
-
updateTouchPoints(points);
|
97
|
-
|
98
|
-
break;
|
99
|
-
}
|
100
|
-
}
|
101
|
-
|
102
|
-
return true;
|
103
|
-
}
|
104
|
-
|
105
|
-
private static int motionActionToType(int action) {
|
106
|
-
int actionType = 3;
|
107
|
-
switch (action) {
|
108
|
-
case MotionEvent.ACTION_DOWN:
|
109
|
-
case MotionEvent.ACTION_POINTER_DOWN:
|
110
|
-
actionType = 0;
|
111
|
-
break;
|
112
|
-
case MotionEvent.ACTION_MOVE:
|
113
|
-
actionType = 1;
|
114
|
-
break;
|
115
|
-
case MotionEvent.ACTION_UP:
|
116
|
-
case MotionEvent.ACTION_POINTER_UP:
|
117
|
-
actionType = 2;
|
118
|
-
break;
|
119
|
-
case MotionEvent.ACTION_CANCEL:
|
120
|
-
actionType = 3;
|
121
|
-
break;
|
122
|
-
}
|
123
|
-
return actionType;
|
124
|
-
}
|
125
|
-
|
126
56
|
@Override
|
127
57
|
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
|
128
58
|
Log.i(tag, "onSurfaceTextureAvailable " + width + "/" + height);
|
@@ -172,8 +102,6 @@ public abstract class SkiaBaseView extends ReactViewGroup implements TextureView
|
|
172
102
|
|
173
103
|
protected abstract void setDebugMode(boolean show);
|
174
104
|
|
175
|
-
protected abstract void updateTouchPoints(double[] points);
|
176
|
-
|
177
105
|
protected abstract void registerView(int nativeId);
|
178
106
|
|
179
107
|
protected abstract void unregisterView();
|
@@ -17,7 +17,6 @@ RNSkDomRenderer::RNSkDomRenderer(std::function<void()> requestRedraw,
|
|
17
17
|
std::shared_ptr<RNSkPlatformContext> context)
|
18
18
|
: RNSkRenderer(requestRedraw), _platformContext(std::move(context)),
|
19
19
|
_renderLock(std::make_shared<std::timed_mutex>()),
|
20
|
-
_touchCallbackLock(std::make_shared<std::timed_mutex>()),
|
21
20
|
_renderTimingInfo("SKIA/RENDER") {}
|
22
21
|
|
23
22
|
RNSkDomRenderer::~RNSkDomRenderer() {
|
@@ -29,10 +28,6 @@ RNSkDomRenderer::~RNSkDomRenderer() {
|
|
29
28
|
|
30
29
|
bool RNSkDomRenderer::tryRender(
|
31
30
|
std::shared_ptr<RNSkCanvasProvider> canvasProvider) {
|
32
|
-
// If we have touches we need to call the touch callback as well
|
33
|
-
if (_currentTouches.size() > 0) {
|
34
|
-
callOnTouch();
|
35
|
-
}
|
36
31
|
|
37
32
|
// We render on the main thread
|
38
33
|
if (_renderLock->try_lock()) {
|
@@ -70,11 +65,6 @@ void RNSkDomRenderer::setRoot(std::shared_ptr<JsiDomRenderNode> node) {
|
|
70
65
|
_root = node;
|
71
66
|
}
|
72
67
|
|
73
|
-
void RNSkDomRenderer::setOnTouchCallback(
|
74
|
-
std::shared_ptr<jsi::Function> onTouchCallback) {
|
75
|
-
_touchCallback = onTouchCallback;
|
76
|
-
}
|
77
|
-
|
78
68
|
void RNSkDomRenderer::renderCanvas(SkCanvas *canvas, float scaledWidth,
|
79
69
|
float scaledHeight) {
|
80
70
|
_renderTimingInfo.beginTiming();
|
@@ -125,75 +115,6 @@ void RNSkDomRenderer::renderCanvas(SkCanvas *canvas, float scaledWidth,
|
|
125
115
|
_renderTimingInfo.stopTiming();
|
126
116
|
}
|
127
117
|
|
128
|
-
void RNSkDomRenderer::updateTouches(std::vector<RNSkTouchInfo> &touches) {
|
129
|
-
std::lock_guard<std::mutex> lock(_touchMutex);
|
130
|
-
// Add timestamp
|
131
|
-
auto ms = std::chrono::duration_cast<std::chrono::milliseconds>(
|
132
|
-
std::chrono::system_clock::now().time_since_epoch())
|
133
|
-
.count();
|
134
|
-
|
135
|
-
for (size_t i = 0; i < touches.size(); i++) {
|
136
|
-
touches.at(i).timestamp = ms;
|
137
|
-
}
|
138
|
-
_currentTouches.push_back(std::move(touches));
|
139
|
-
}
|
140
|
-
|
141
|
-
void RNSkDomRenderer::callOnTouch() {
|
142
|
-
|
143
|
-
if (_touchCallback == nullptr) {
|
144
|
-
return;
|
145
|
-
}
|
146
|
-
|
147
|
-
if (_touchCallbackLock->try_lock()) {
|
148
|
-
|
149
|
-
{
|
150
|
-
std::lock_guard<std::mutex> lock(_touchMutex);
|
151
|
-
_touchesCache.clear();
|
152
|
-
_touchesCache.reserve(_currentTouches.size());
|
153
|
-
for (size_t i = 0; i < _currentTouches.size(); ++i) {
|
154
|
-
_touchesCache.push_back(_currentTouches.at(i));
|
155
|
-
}
|
156
|
-
_currentTouches.clear();
|
157
|
-
}
|
158
|
-
|
159
|
-
// We have an onDraw method - use it to render since we don't have a
|
160
|
-
// DOM-node yet.
|
161
|
-
_platformContext->runOnJavascriptThread([weakSelf = weak_from_this()]() {
|
162
|
-
auto self = weakSelf.lock();
|
163
|
-
if (self) {
|
164
|
-
jsi::Runtime &runtime = *self->_platformContext->getJsRuntime();
|
165
|
-
// Set up touches
|
166
|
-
auto size = self->_touchesCache.size();
|
167
|
-
auto ops = jsi::Array(runtime, size);
|
168
|
-
for (size_t i = 0; i < size; i++) {
|
169
|
-
auto cur = self->_touchesCache.at(i);
|
170
|
-
auto curSize = cur.size();
|
171
|
-
auto touches = jsi::Array(runtime, curSize);
|
172
|
-
for (size_t n = 0; n < curSize; n++) {
|
173
|
-
auto touchObj = jsi::Object(runtime);
|
174
|
-
auto t = cur.at(n);
|
175
|
-
touchObj.setProperty(runtime, "x", t.x);
|
176
|
-
touchObj.setProperty(runtime, "y", t.y);
|
177
|
-
touchObj.setProperty(runtime, "force", t.force);
|
178
|
-
touchObj.setProperty(runtime, "type", static_cast<double>(t.type));
|
179
|
-
touchObj.setProperty(runtime, "timestamp",
|
180
|
-
static_cast<double>(t.timestamp) / 1000.0);
|
181
|
-
touchObj.setProperty(runtime, "id", static_cast<double>(t.id));
|
182
|
-
touches.setValueAtIndex(runtime, n, touchObj);
|
183
|
-
}
|
184
|
-
ops.setValueAtIndex(runtime, i, touches);
|
185
|
-
}
|
186
|
-
// Call on touch callback
|
187
|
-
self->_touchCallback->call(runtime, ops, 1);
|
188
|
-
}
|
189
|
-
self->_touchCallbackLock->unlock();
|
190
|
-
});
|
191
|
-
} else {
|
192
|
-
// We'll try next time - schedule a new redraw
|
193
|
-
_requestRedraw();
|
194
|
-
}
|
195
|
-
}
|
196
|
-
|
197
118
|
void RNSkDomRenderer::renderDebugOverlays(SkCanvas *canvas) {
|
198
119
|
if (!getShowDebugOverlays()) {
|
199
120
|
return;
|
package/cpp/rnskia/RNSkDomView.h
CHANGED
@@ -13,7 +13,6 @@
|
|
13
13
|
#include "RNSkView.h"
|
14
14
|
|
15
15
|
#include "JsiDomRenderNode.h"
|
16
|
-
#include "RNSkInfoParameter.h"
|
17
16
|
#include "RNSkLog.h"
|
18
17
|
#include "RNSkPlatformContext.h"
|
19
18
|
#include "RNSkTimingInfo.h"
|
@@ -50,29 +49,19 @@ public:
|
|
50
49
|
|
51
50
|
void setRoot(std::shared_ptr<JsiDomRenderNode> node);
|
52
51
|
|
53
|
-
void setOnTouchCallback(std::shared_ptr<jsi::Function> onTouchCallback);
|
54
|
-
|
55
|
-
void updateTouches(std::vector<RNSkTouchInfo> &touches);
|
56
|
-
|
57
52
|
private:
|
58
|
-
void callOnTouch();
|
59
53
|
void renderCanvas(SkCanvas *canvas, float scaledWidth, float scaledHeight);
|
60
54
|
void renderDebugOverlays(SkCanvas *canvas);
|
61
55
|
|
62
56
|
std::shared_ptr<RNSkPlatformContext> _platformContext;
|
63
|
-
std::shared_ptr<jsi::Function> _touchCallback;
|
64
57
|
|
65
58
|
std::shared_ptr<std::timed_mutex> _renderLock;
|
66
|
-
std::shared_ptr<std::timed_mutex> _touchCallbackLock;
|
67
59
|
|
68
60
|
std::shared_ptr<JsiDomRenderNode> _root;
|
69
61
|
std::shared_ptr<DrawingContext> _drawingContext;
|
70
62
|
|
71
63
|
RNSkTimingInfo _renderTimingInfo;
|
72
64
|
|
73
|
-
std::mutex _touchMutex;
|
74
|
-
std::vector<std::vector<RNSkTouchInfo>> _currentTouches;
|
75
|
-
std::vector<std::vector<RNSkTouchInfo>> _touchesCache;
|
76
65
|
std::mutex _rootLock;
|
77
66
|
};
|
78
67
|
|
@@ -87,40 +76,13 @@ public:
|
|
87
76
|
std::make_shared<RNSkDomRenderer>(
|
88
77
|
std::bind(&RNSkView::requestRedraw, this), context)) {}
|
89
78
|
|
90
|
-
void updateTouchState(std::vector<RNSkTouchInfo> &touches) override {
|
91
|
-
std::static_pointer_cast<RNSkDomRenderer>(getRenderer())
|
92
|
-
->updateTouches(touches);
|
93
|
-
RNSkView::updateTouchState(touches);
|
94
|
-
}
|
95
|
-
|
96
79
|
void setJsiProperties(
|
97
80
|
std::unordered_map<std::string, JsiValueWrapper> &props) override {
|
98
81
|
|
99
82
|
RNSkView::setJsiProperties(props);
|
100
83
|
|
101
84
|
for (auto &prop : props) {
|
102
|
-
if (prop.first == "
|
103
|
-
if (prop.second.isUndefinedOrNull()) {
|
104
|
-
// Clear touchCallback
|
105
|
-
std::static_pointer_cast<RNSkDomRenderer>(getRenderer())
|
106
|
-
->setOnTouchCallback(nullptr);
|
107
|
-
requestRedraw();
|
108
|
-
continue;
|
109
|
-
|
110
|
-
} else if (prop.second.getType() != JsiWrapperValueType::Function) {
|
111
|
-
// We expect a function for the draw callback custom property
|
112
|
-
throw std::runtime_error(
|
113
|
-
"Expected a function for the onTouch property.");
|
114
|
-
}
|
115
|
-
|
116
|
-
// Save callback
|
117
|
-
std::static_pointer_cast<RNSkDomRenderer>(getRenderer())
|
118
|
-
->setOnTouchCallback(prop.second.getAsFunction());
|
119
|
-
|
120
|
-
// Request redraw
|
121
|
-
requestRedraw();
|
122
|
-
|
123
|
-
} else if (prop.first == "root") {
|
85
|
+
if (prop.first == "root") {
|
124
86
|
// Save root
|
125
87
|
if (prop.second.isUndefined() || prop.second.isNull()) {
|
126
88
|
std::static_pointer_cast<RNSkDomRenderer>(getRenderer())
|
package/cpp/rnskia/RNSkView.h
CHANGED
@@ -138,16 +138,6 @@ private:
|
|
138
138
|
|
139
139
|
enum RNSkDrawingMode { Default, Continuous };
|
140
140
|
|
141
|
-
using RNSkTouchInfo = struct {
|
142
|
-
enum TouchType { Start, Active, End, Cancelled };
|
143
|
-
double x;
|
144
|
-
double y;
|
145
|
-
double force;
|
146
|
-
TouchType type;
|
147
|
-
size_t id;
|
148
|
-
long timestamp;
|
149
|
-
};
|
150
|
-
|
151
141
|
class RNSkView : public std::enable_shared_from_this<RNSkView> {
|
152
142
|
public:
|
153
143
|
/**
|
@@ -218,13 +208,6 @@ public:
|
|
218
208
|
requestRedraw();
|
219
209
|
}
|
220
210
|
|
221
|
-
/**
|
222
|
-
Update touch state with new touch points
|
223
|
-
*/
|
224
|
-
virtual void updateTouchState(std::vector<RNSkTouchInfo> &) {
|
225
|
-
requestRedraw();
|
226
|
-
}
|
227
|
-
|
228
211
|
/**
|
229
212
|
Renders the view into an SkImage instead of the screen.
|
230
213
|
*/
|
@@ -177,55 +177,4 @@
|
|
177
177
|
return _impl;
|
178
178
|
}
|
179
179
|
|
180
|
-
#pragma mark Touch handling
|
181
|
-
|
182
|
-
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
|
183
|
-
[self handleTouches:touches withEvent:event];
|
184
|
-
}
|
185
|
-
|
186
|
-
- (void)touchesMoved:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
|
187
|
-
[self handleTouches:touches withEvent:event];
|
188
|
-
}
|
189
|
-
|
190
|
-
- (void)touchesEnded:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
|
191
|
-
[self handleTouches:touches withEvent:event];
|
192
|
-
}
|
193
|
-
|
194
|
-
- (void)handleTouches:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
|
195
|
-
if (event.type == UIEventTypeTouches) {
|
196
|
-
std::vector<RNSkia::RNSkTouchInfo> nextTouches;
|
197
|
-
for (UITouch *touch in touches) {
|
198
|
-
auto position = [touch preciseLocationInView:self];
|
199
|
-
RNSkia::RNSkTouchInfo nextTouch;
|
200
|
-
nextTouch.x = position.x;
|
201
|
-
nextTouch.y = position.y;
|
202
|
-
nextTouch.force = [touch force];
|
203
|
-
nextTouch.id = [touch hash];
|
204
|
-
auto phase = [touch phase];
|
205
|
-
switch (phase) {
|
206
|
-
case UITouchPhaseBegan:
|
207
|
-
nextTouch.type = RNSkia::RNSkTouchInfo::TouchType::Start;
|
208
|
-
break;
|
209
|
-
case UITouchPhaseMoved:
|
210
|
-
nextTouch.type = RNSkia::RNSkTouchInfo::TouchType::Active;
|
211
|
-
break;
|
212
|
-
case UITouchPhaseEnded:
|
213
|
-
nextTouch.type = RNSkia::RNSkTouchInfo::TouchType::End;
|
214
|
-
break;
|
215
|
-
case UITouchPhaseCancelled:
|
216
|
-
nextTouch.type = RNSkia::RNSkTouchInfo::TouchType::Cancelled;
|
217
|
-
break;
|
218
|
-
default:
|
219
|
-
nextTouch.type = RNSkia::RNSkTouchInfo::TouchType::Active;
|
220
|
-
break;
|
221
|
-
}
|
222
|
-
|
223
|
-
nextTouches.push_back(nextTouch);
|
224
|
-
}
|
225
|
-
if (_impl != nullptr) {
|
226
|
-
_impl->getDrawView()->updateTouchState(nextTouches);
|
227
|
-
}
|
228
|
-
}
|
229
|
-
}
|
230
|
-
|
231
180
|
@end
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["_web","require","Noop","undefined","NoopValue","current","NoopSharedValue","value","Mock","CanvasKit","global","SkiaApi","JsiSkApi","Skia","Canvas","useValue","useComputedValue","
|
1
|
+
{"version":3,"names":["_web","require","Noop","undefined","NoopValue","current","NoopSharedValue","value","Mock","CanvasKit","global","SkiaApi","JsiSkApi","Skia","Canvas","useValue","useComputedValue","useTiming","useLoop","useSpring","useClockValue","useValueEffect","useClock","usePathInterpolation","useImageAsTexture","useTextureValue","useTextureValueFromPicture","useRSXformBuffer","usePointBuffer","useColorBuffer","useRectBuffer","useBuffer","useRawData","useData","useFont","Font","useFonts","useTypeface","useImage","useSVG","useVideo","exports"],"sources":["index.ts"],"sourcesContent":["import type { CanvasKit } from \"canvaskit-wasm\";\n\nimport { JsiSkApi } from \"../skia/web\";\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst Noop: () => any = () => undefined;\nconst NoopValue = () => ({ current: 0 });\nconst NoopSharedValue = () => ({ value: 0 });\n\nexport const Mock = (CanvasKit: CanvasKit) => {\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n global.SkiaApi = JsiSkApi(CanvasKit);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n const Skia = global.SkiaApi;\n return {\n Skia,\n ...require(\"../renderer/components\"),\n ...require(\"../skia\"),\n ...require(\"../animation\"),\n ...require(\"../dom/types\"),\n ...require(\"../dom/nodes\"),\n // We could use the real Canvas if we mock the SkiaView component for node\n Canvas: Noop,\n // Skia Animations\n useValue: NoopValue,\n useComputedValue: NoopValue,\n useTiming: NoopValue,\n useLoop: NoopValue,\n useSpring: NoopValue,\n useClockValue: NoopValue,\n useValueEffect: Noop,\n // Reanimated hooks\n useClock: NoopSharedValue,\n usePathInterpolation: NoopSharedValue,\n useImageAsTexture: NoopSharedValue,\n useTextureValue: NoopSharedValue,\n useTextureValueFromPicture: NoopSharedValue,\n useRSXformBuffer: NoopSharedValue,\n usePointBuffer: NoopSharedValue,\n useColorBuffer: NoopSharedValue,\n useRectBuffer: NoopSharedValue,\n useBuffer: NoopSharedValue,\n useRawData: Noop,\n useData: Noop,\n useFont: () => Skia.Font(undefined, 0),\n useFonts: Noop,\n useTypeface: () => null,\n useImage: () => null,\n useSVG: () => null,\n useVideo: () => null,\n };\n};\n"],"mappings":";;;;;;AAEA,IAAAA,IAAA,GAAAC,OAAA;AAEA;AACA,MAAMC,IAAe,GAAGA,CAAA,KAAMC,SAAS;AACvC,MAAMC,SAAS,GAAGA,CAAA,MAAO;EAAEC,OAAO,EAAE;AAAE,CAAC,CAAC;AACxC,MAAMC,eAAe,GAAGA,CAAA,MAAO;EAAEC,KAAK,EAAE;AAAE,CAAC,CAAC;AAErC,MAAMC,IAAI,GAAIC,SAAoB,IAAK;EAC5C;EACA;EACAC,MAAM,CAACC,OAAO,GAAG,IAAAC,aAAQ,EAACH,SAAS,CAAC;EACpC;EACA;EACA,MAAMI,IAAI,GAAGH,MAAM,CAACC,OAAO;EAC3B,OAAO;IACLE,IAAI;IACJ,GAAGZ,OAAO,CAAC,wBAAwB,CAAC;IACpC,GAAGA,OAAO,CAAC,SAAS,CAAC;IACrB,GAAGA,OAAO,CAAC,cAAc,CAAC;IAC1B,GAAGA,OAAO,CAAC,cAAc,CAAC;IAC1B,GAAGA,OAAO,CAAC,cAAc,CAAC;IAC1B;IACAa,MAAM,EAAEZ,IAAI;IACZ;IACAa,QAAQ,EAAEX,SAAS;IACnBY,gBAAgB,EAAEZ,SAAS;IAC3Ba,SAAS,EAAEb,SAAS;IACpBc,OAAO,EAAEd,SAAS;IAClBe,SAAS,EAAEf,SAAS;IACpBgB,aAAa,EAAEhB,SAAS;IACxBiB,cAAc,EAAEnB,IAAI;IACpB;IACAoB,QAAQ,EAAEhB,eAAe;IACzBiB,oBAAoB,EAAEjB,eAAe;IACrCkB,iBAAiB,EAAElB,eAAe;IAClCmB,eAAe,EAAEnB,eAAe;IAChCoB,0BAA0B,EAAEpB,eAAe;IAC3CqB,gBAAgB,EAAErB,eAAe;IACjCsB,cAAc,EAAEtB,eAAe;IAC/BuB,cAAc,EAAEvB,eAAe;IAC/BwB,aAAa,EAAExB,eAAe;IAC9ByB,SAAS,EAAEzB,eAAe;IAC1B0B,UAAU,EAAE9B,IAAI;IAChB+B,OAAO,EAAE/B,IAAI;IACbgC,OAAO,EAAEA,CAAA,KAAMrB,IAAI,CAACsB,IAAI,CAAChC,SAAS,EAAE,CAAC,CAAC;IACtCiC,QAAQ,EAAElC,IAAI;IACdmC,WAAW,EAAEA,CAAA,KAAM,IAAI;IACvBC,QAAQ,EAAEA,CAAA,KAAM,IAAI;IACpBC,MAAM,EAAEA,CAAA,KAAM,IAAI;IAClBC,QAAQ,EAAEA,CAAA,KAAM;EAClB,CAAC;AACH,CAAC;AAACC,OAAA,CAAAjC,IAAA,GAAAA,IAAA","ignoreList":[]}
|
@@ -1,11 +1,10 @@
|
|
1
1
|
import React from "react";
|
2
2
|
import type { RefObject, ReactNode, FunctionComponent } from "react";
|
3
3
|
import { SkiaDomView } from "../views";
|
4
|
-
import type {
|
4
|
+
import type { SkiaBaseViewProps } from "../views";
|
5
5
|
export declare const useCanvasRef: () => React.RefObject<SkiaDomView>;
|
6
6
|
export interface CanvasProps extends SkiaBaseViewProps {
|
7
7
|
ref?: RefObject<SkiaDomView>;
|
8
8
|
children: ReactNode;
|
9
|
-
onTouch?: TouchHandler;
|
10
9
|
}
|
11
10
|
export declare const Canvas: FunctionComponent<CanvasProps & React.RefAttributes<SkiaDomView>>;
|
@@ -37,7 +37,6 @@ const Canvas = exports.Canvas = /*#__PURE__*/(0, _react.forwardRef)(({
|
|
37
37
|
style,
|
38
38
|
debug,
|
39
39
|
mode,
|
40
|
-
onTouch,
|
41
40
|
onSize: _onSize,
|
42
41
|
onLayout: _onLayout,
|
43
42
|
...props
|
@@ -70,7 +69,6 @@ const Canvas = exports.Canvas = /*#__PURE__*/(0, _react.forwardRef)(({
|
|
70
69
|
ref: ref,
|
71
70
|
style: style,
|
72
71
|
root: root.dom,
|
73
|
-
onTouch: onTouch,
|
74
72
|
onLayout: onLayout,
|
75
73
|
mode: mode,
|
76
74
|
debug: debug
|
@@ -83,7 +81,6 @@ const Canvas = exports.Canvas = /*#__PURE__*/(0, _react.forwardRef)(({
|
|
83
81
|
ref: ref,
|
84
82
|
style: style,
|
85
83
|
root: root.dom,
|
86
|
-
onTouch: onTouch,
|
87
84
|
onLayout: onLayout,
|
88
85
|
mode: mode,
|
89
86
|
debug: debug
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["_react","_interopRequireWildcard","require","_views","_Skia","_SkiaJSDomView","_Reconciler","_HostComponents","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","_extends","assign","bind","arguments","length","apply","useCanvasRef","useRef","exports","useOnSizeEvent","resultValue","onLayout","useCallback","event","width","height","nativeEvent","layout","value","Canvas","forwardRef","children","style","debug","mode","
|
1
|
+
{"version":3,"names":["_react","_interopRequireWildcard","require","_views","_Skia","_SkiaJSDomView","_Reconciler","_HostComponents","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","_extends","assign","bind","arguments","length","apply","useCanvasRef","useRef","exports","useOnSizeEvent","resultValue","onLayout","useCallback","event","width","height","nativeEvent","layout","value","Canvas","forwardRef","children","style","debug","mode","onSize","_onSize","_onLayout","props","forwardedRef","innerRef","ref","useCombinedRefs","redraw","_innerRef$current","current","getNativeId","_innerRef$current$nat","_innerRef$current2","id","nativeId","root","useMemo","SkiaRoot","Skia","NATIVE_DOM","useEffect","render","unmount","createElement","SkiaDomView","dom","SkiaJSDomView","refs","targetRef","React","forEach"],"sources":["Canvas.tsx"],"sourcesContent":["import React, {\n useEffect,\n useCallback,\n useMemo,\n forwardRef,\n useRef,\n} from \"react\";\nimport type {\n RefObject,\n ReactNode,\n MutableRefObject,\n ForwardedRef,\n FunctionComponent,\n} from \"react\";\nimport type { LayoutChangeEvent } from \"react-native\";\n\nimport { SkiaDomView } from \"../views\";\nimport { Skia } from \"../skia/Skia\";\nimport type { SkiaBaseViewProps } from \"../views\";\nimport { SkiaJSDomView } from \"../views/SkiaJSDomView\";\n\nimport { SkiaRoot } from \"./Reconciler\";\nimport { NATIVE_DOM } from \"./HostComponents\";\n\nexport const useCanvasRef = () => useRef<SkiaDomView>(null);\n\nexport interface CanvasProps extends SkiaBaseViewProps {\n ref?: RefObject<SkiaDomView>;\n children: ReactNode;\n}\n\nconst useOnSizeEvent = (\n resultValue: SkiaBaseViewProps[\"onSize\"],\n onLayout?: (event: LayoutChangeEvent) => void\n) => {\n return useCallback(\n (event: LayoutChangeEvent) => {\n if (onLayout) {\n onLayout(event);\n }\n const { width, height } = event.nativeEvent.layout;\n\n if (resultValue) {\n resultValue.value = { width, height };\n }\n },\n [onLayout, resultValue]\n );\n};\n\nexport const Canvas = forwardRef<SkiaDomView, CanvasProps>(\n (\n {\n children,\n style,\n debug,\n mode,\n onSize: _onSize,\n onLayout: _onLayout,\n ...props\n },\n forwardedRef\n ) => {\n const onLayout = useOnSizeEvent(_onSize, _onLayout);\n const innerRef = useCanvasRef();\n const ref = useCombinedRefs(forwardedRef, innerRef);\n const redraw = useCallback(() => {\n innerRef.current?.redraw();\n }, [innerRef]);\n const getNativeId = useCallback(() => {\n const id = innerRef.current?.nativeId ?? -1;\n return id;\n }, [innerRef]);\n\n const root = useMemo(\n () => new SkiaRoot(Skia, NATIVE_DOM, redraw, getNativeId),\n [redraw, getNativeId]\n );\n\n // Render effect\n useEffect(() => {\n root.render(children);\n }, [children, root, redraw]);\n\n useEffect(() => {\n return () => {\n root.unmount();\n };\n }, [root]);\n\n if (NATIVE_DOM) {\n return (\n <SkiaDomView\n ref={ref}\n style={style}\n root={root.dom}\n onLayout={onLayout}\n mode={mode}\n debug={debug}\n {...props}\n />\n );\n } else {\n return (\n <SkiaJSDomView\n Skia={Skia}\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ref={ref as any}\n style={style}\n root={root.dom}\n onLayout={onLayout}\n mode={mode}\n debug={debug}\n {...props}\n />\n );\n }\n }\n) as FunctionComponent<CanvasProps & React.RefAttributes<SkiaDomView>>;\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"],"mappings":";;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AAgBA,IAAAC,MAAA,GAAAD,OAAA;AACA,IAAAE,KAAA,GAAAF,OAAA;AAEA,IAAAG,cAAA,GAAAH,OAAA;AAEA,IAAAI,WAAA,GAAAJ,OAAA;AACA,IAAAK,eAAA,GAAAL,OAAA;AAA8C,SAAAM,yBAAAC,CAAA,6BAAAC,OAAA,mBAAAC,CAAA,OAAAD,OAAA,IAAAE,CAAA,OAAAF,OAAA,YAAAF,wBAAA,YAAAA,CAAAC,CAAA,WAAAA,CAAA,GAAAG,CAAA,GAAAD,CAAA,KAAAF,CAAA;AAAA,SAAAR,wBAAAQ,CAAA,EAAAE,CAAA,SAAAA,CAAA,IAAAF,CAAA,IAAAA,CAAA,CAAAI,UAAA,SAAAJ,CAAA,eAAAA,CAAA,uBAAAA,CAAA,yBAAAA,CAAA,WAAAK,OAAA,EAAAL,CAAA,QAAAG,CAAA,GAAAJ,wBAAA,CAAAG,CAAA,OAAAC,CAAA,IAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,UAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,OAAAQ,CAAA,KAAAC,SAAA,UAAAC,CAAA,GAAAC,MAAA,CAAAC,cAAA,IAAAD,MAAA,CAAAE,wBAAA,WAAAC,CAAA,IAAAd,CAAA,oBAAAc,CAAA,OAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,EAAAc,CAAA,SAAAG,CAAA,GAAAP,CAAA,GAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,EAAAc,CAAA,UAAAG,CAAA,KAAAA,CAAA,CAAAV,GAAA,IAAAU,CAAA,CAAAC,GAAA,IAAAP,MAAA,CAAAC,cAAA,CAAAJ,CAAA,EAAAM,CAAA,EAAAG,CAAA,IAAAT,CAAA,CAAAM,CAAA,IAAAd,CAAA,CAAAc,CAAA,YAAAN,CAAA,CAAAH,OAAA,GAAAL,CAAA,EAAAG,CAAA,IAAAA,CAAA,CAAAe,GAAA,CAAAlB,CAAA,EAAAQ,CAAA,GAAAA,CAAA;AAAA,SAAAW,SAAA,WAAAA,QAAA,GAAAR,MAAA,CAAAS,MAAA,GAAAT,MAAA,CAAAS,MAAA,CAAAC,IAAA,eAAAb,CAAA,aAAAR,CAAA,MAAAA,CAAA,GAAAsB,SAAA,CAAAC,MAAA,EAAAvB,CAAA,UAAAG,CAAA,GAAAmB,SAAA,CAAAtB,CAAA,YAAAE,CAAA,IAAAC,CAAA,OAAAY,cAAA,CAAAC,IAAA,CAAAb,CAAA,EAAAD,CAAA,MAAAM,CAAA,CAAAN,CAAA,IAAAC,CAAA,CAAAD,CAAA,aAAAM,CAAA,KAAAW,QAAA,CAAAK,KAAA,OAAAF,SAAA;AAEvC,MAAMG,YAAY,GAAGA,CAAA,KAAM,IAAAC,aAAM,EAAc,IAAI,CAAC;AAACC,OAAA,CAAAF,YAAA,GAAAA,YAAA;AAO5D,MAAMG,cAAc,GAAGA,CACrBC,WAAwC,EACxCC,QAA6C,KAC1C;EACH,OAAO,IAAAC,kBAAW,EACfC,KAAwB,IAAK;IAC5B,IAAIF,QAAQ,EAAE;MACZA,QAAQ,CAACE,KAAK,CAAC;IACjB;IACA,MAAM;MAAEC,KAAK;MAAEC;IAAO,CAAC,GAAGF,KAAK,CAACG,WAAW,CAACC,MAAM;IAElD,IAAIP,WAAW,EAAE;MACfA,WAAW,CAACQ,KAAK,GAAG;QAAEJ,KAAK;QAAEC;MAAO,CAAC;IACvC;EACF,CAAC,EACD,CAACJ,QAAQ,EAAED,WAAW,CACxB,CAAC;AACH,CAAC;AAEM,MAAMS,MAAM,GAAAX,OAAA,CAAAW,MAAA,gBAAG,IAAAC,iBAAU,EAC9B,CACE;EACEC,QAAQ;EACRC,KAAK;EACLC,KAAK;EACLC,IAAI;EACJC,MAAM,EAAEC,OAAO;EACff,QAAQ,EAAEgB,SAAS;EACnB,GAAGC;AACL,CAAC,EACDC,YAAY,KACT;EACH,MAAMlB,QAAQ,GAAGF,cAAc,CAACiB,OAAO,EAAEC,SAAS,CAAC;EACnD,MAAMG,QAAQ,GAAGxB,YAAY,CAAC,CAAC;EAC/B,MAAMyB,GAAG,GAAGC,eAAe,CAACH,YAAY,EAAEC,QAAQ,CAAC;EACnD,MAAMG,MAAM,GAAG,IAAArB,kBAAW,EAAC,MAAM;IAAA,IAAAsB,iBAAA;IAC/B,CAAAA,iBAAA,GAAAJ,QAAQ,CAACK,OAAO,cAAAD,iBAAA,eAAhBA,iBAAA,CAAkBD,MAAM,CAAC,CAAC;EAC5B,CAAC,EAAE,CAACH,QAAQ,CAAC,CAAC;EACd,MAAMM,WAAW,GAAG,IAAAxB,kBAAW,EAAC,MAAM;IAAA,IAAAyB,qBAAA,EAAAC,kBAAA;IACpC,MAAMC,EAAE,IAAAF,qBAAA,IAAAC,kBAAA,GAAGR,QAAQ,CAACK,OAAO,cAAAG,kBAAA,uBAAhBA,kBAAA,CAAkBE,QAAQ,cAAAH,qBAAA,cAAAA,qBAAA,GAAI,CAAC,CAAC;IAC3C,OAAOE,EAAE;EACX,CAAC,EAAE,CAACT,QAAQ,CAAC,CAAC;EAEd,MAAMW,IAAI,GAAG,IAAAC,cAAO,EAClB,MAAM,IAAIC,oBAAQ,CAACC,UAAI,EAAEC,0BAAU,EAAEZ,MAAM,EAAEG,WAAW,CAAC,EACzD,CAACH,MAAM,EAAEG,WAAW,CACtB,CAAC;;EAED;EACA,IAAAU,gBAAS,EAAC,MAAM;IACdL,IAAI,CAACM,MAAM,CAAC1B,QAAQ,CAAC;EACvB,CAAC,EAAE,CAACA,QAAQ,EAAEoB,IAAI,EAAER,MAAM,CAAC,CAAC;EAE5B,IAAAa,gBAAS,EAAC,MAAM;IACd,OAAO,MAAM;MACXL,IAAI,CAACO,OAAO,CAAC,CAAC;IAChB,CAAC;EACH,CAAC,EAAE,CAACP,IAAI,CAAC,CAAC;EAEV,IAAII,0BAAU,EAAE;IACd,oBACEzE,MAAA,CAAAc,OAAA,CAAA+D,aAAA,CAAC1E,MAAA,CAAA2E,WAAW,EAAAlD,QAAA;MACV+B,GAAG,EAAEA,GAAI;MACTT,KAAK,EAAEA,KAAM;MACbmB,IAAI,EAAEA,IAAI,CAACU,GAAI;MACfxC,QAAQ,EAAEA,QAAS;MACnBa,IAAI,EAAEA,IAAK;MACXD,KAAK,EAAEA;IAAM,GACTK,KAAK,CACV,CAAC;EAEN,CAAC,MAAM;IACL,oBACExD,MAAA,CAAAc,OAAA,CAAA+D,aAAA,CAACxE,cAAA,CAAA2E,aAAa,EAAApD,QAAA;MACZ4C,IAAI,EAAEA;MACN;MAAA;MACAb,GAAG,EAAEA,GAAW;MAChBT,KAAK,EAAEA,KAAM;MACbmB,IAAI,EAAEA,IAAI,CAACU,GAAI;MACfxC,QAAQ,EAAEA,QAAS;MACnBa,IAAI,EAAEA,IAAK;MACXD,KAAK,EAAEA;IAAM,GACTK,KAAK,CACV,CAAC;EAEN;AACF,CACF,CAAsE;;AAEtE;AACA;AACA;AACA;AACA;AACA;AACA;AACA,MAAMI,eAAe,GAAGA,CACtB,GAAGqB,IAAkD,KAClD;EACH,MAAMC,SAAS,GAAGC,cAAK,CAAChD,MAAM,CAAI,IAAI,CAAC;EACvCgD,cAAK,CAACT,SAAS,CAAC,MAAM;IACpBO,IAAI,CAACG,OAAO,CAAEzB,GAAG,IAAK;MACpB,IAAIA,GAAG,EAAE;QACP,IAAI,OAAOA,GAAG,KAAK,UAAU,EAAE;UAC7BA,GAAG,CAACuB,SAAS,CAACnB,OAAO,CAAC;QACxB,CAAC,MAAM;UACLJ,GAAG,CAACI,OAAO,GAAGmB,SAAS,CAACnB,OAAO;QACjC;MACF;IACF,CAAC,CAAC;EACJ,CAAC,EAAE,CAACkB,IAAI,CAAC,CAAC;EACV,OAAOC,SAAS;AAClB,CAAC","ignoreList":[]}
|