@shopify/react-native-skia 1.6.0 → 1.7.0
Sign up to get free protection for your applications and to get access to all the features.
- package/android/cpp/jni/include/JniSkiaBaseView.h +0 -1
- package/android/cpp/jni/include/JniSkiaManager.h +2 -2
- package/android/cpp/rnskia-android/MainThreadDispatcher.h +2 -4
- package/android/cpp/rnskia-android/OpenGLContext.h +13 -5
- package/android/cpp/rnskia-android/OpenGLWindowContext.h +2 -2
- package/android/cpp/rnskia-android/RNSkAndroidPlatformContext.h +61 -3
- package/android/cpp/rnskia-android/RNSkAndroidView.h +0 -4
- package/android/cpp/rnskia-android/gl/Display.h +2 -0
- package/cpp/api/JsiSkContourMeasure.h +1 -5
- package/cpp/api/JsiSkImage.h +11 -0
- package/cpp/api/JsiSkImageFactory.h +14 -0
- package/cpp/api/JsiSkPicture.h +2 -0
- package/cpp/api/JsiSkSurface.h +7 -0
- package/cpp/api/JsiTextureInfo.h +53 -0
- package/cpp/jsi/ViewProperty.h +48 -0
- package/cpp/rnskia/RNSkDomView.h +4 -7
- package/cpp/rnskia/RNSkJsiViewApi.h +3 -3
- package/cpp/rnskia/RNSkPictureView.h +8 -18
- package/cpp/rnskia/RNSkPlatformContext.h +18 -12
- package/cpp/rnskia/RNSkView.h +2 -8
- package/ios/RNSkia-iOS/MetalContext.h +101 -15
- package/ios/RNSkia-iOS/MetalContext.mm +9 -8
- package/ios/RNSkia-iOS/MetalWindowContext.h +39 -0
- package/ios/RNSkia-iOS/MetalWindowContext.mm +60 -0
- package/ios/RNSkia-iOS/RNSkiOSPlatformContext.h +13 -25
- package/ios/RNSkia-iOS/RNSkiOSPlatformContext.mm +88 -2
- package/ios/RNSkia-iOS/SkiaCVPixelBufferUtils.mm +17 -6
- package/ios/RNSkia-iOS/SkiaManager.mm +1 -2
- package/ios/RNSkia-iOS/SkiaUIView.mm +17 -15
- package/lib/commonjs/skia/types/Image/Image.d.ts +10 -0
- package/lib/commonjs/skia/types/Image/Image.js.map +1 -1
- package/lib/commonjs/skia/types/Image/ImageFactory.d.ts +18 -0
- package/lib/commonjs/skia/types/Image/ImageFactory.js.map +1 -1
- package/lib/commonjs/skia/types/Matrix4.d.ts +6 -0
- package/lib/commonjs/skia/types/Matrix4.js +69 -1
- package/lib/commonjs/skia/types/Matrix4.js.map +1 -1
- package/lib/commonjs/skia/types/Surface/Surface.d.ts +11 -0
- package/lib/commonjs/skia/types/Surface/Surface.js.map +1 -1
- package/lib/commonjs/skia/web/JsiSkImage.d.ts +1 -0
- package/lib/commonjs/skia/web/JsiSkImage.js +4 -0
- package/lib/commonjs/skia/web/JsiSkImage.js.map +1 -1
- package/lib/commonjs/skia/web/JsiSkImageFactory.d.ts +1 -0
- package/lib/commonjs/skia/web/JsiSkImageFactory.js +3 -0
- package/lib/commonjs/skia/web/JsiSkImageFactory.js.map +1 -1
- package/lib/commonjs/skia/web/JsiSkSurface.d.ts +1 -0
- package/lib/commonjs/skia/web/JsiSkSurface.js +4 -0
- package/lib/commonjs/skia/web/JsiSkSurface.js.map +1 -1
- package/lib/module/skia/types/Image/Image.d.ts +10 -0
- package/lib/module/skia/types/Image/Image.js.map +1 -1
- package/lib/module/skia/types/Image/ImageFactory.d.ts +18 -0
- package/lib/module/skia/types/Image/ImageFactory.js.map +1 -1
- package/lib/module/skia/types/Matrix4.d.ts +6 -0
- package/lib/module/skia/types/Matrix4.js +67 -0
- package/lib/module/skia/types/Matrix4.js.map +1 -1
- package/lib/module/skia/types/Surface/Surface.d.ts +11 -0
- package/lib/module/skia/types/Surface/Surface.js.map +1 -1
- package/lib/module/skia/web/JsiSkImage.d.ts +1 -0
- package/lib/module/skia/web/JsiSkImage.js +4 -0
- package/lib/module/skia/web/JsiSkImage.js.map +1 -1
- package/lib/module/skia/web/JsiSkImageFactory.d.ts +1 -0
- package/lib/module/skia/web/JsiSkImageFactory.js +3 -0
- package/lib/module/skia/web/JsiSkImageFactory.js.map +1 -1
- package/lib/module/skia/web/JsiSkSurface.d.ts +1 -0
- package/lib/module/skia/web/JsiSkSurface.js +4 -0
- package/lib/module/skia/web/JsiSkSurface.js.map +1 -1
- package/lib/typescript/lib/commonjs/skia/types/Matrix4.d.ts +6 -0
- package/lib/typescript/lib/commonjs/skia/web/JsiSkImage.d.ts +1 -0
- package/lib/typescript/lib/commonjs/skia/web/JsiSkImageFactory.d.ts +1 -0
- package/lib/typescript/lib/commonjs/skia/web/JsiSkSurface.d.ts +1 -0
- package/lib/typescript/lib/module/mock/index.d.ts +1 -0
- package/lib/typescript/lib/module/skia/types/Matrix4.d.ts +1 -0
- package/lib/typescript/lib/module/skia/web/JsiSkImage.d.ts +1 -0
- package/lib/typescript/lib/module/skia/web/JsiSkImageFactory.d.ts +1 -0
- package/lib/typescript/lib/module/skia/web/JsiSkSurface.d.ts +1 -0
- package/lib/typescript/src/skia/types/Image/Image.d.ts +10 -0
- package/lib/typescript/src/skia/types/Image/ImageFactory.d.ts +18 -0
- package/lib/typescript/src/skia/types/Matrix4.d.ts +6 -0
- package/lib/typescript/src/skia/types/Surface/Surface.d.ts +11 -0
- package/lib/typescript/src/skia/web/JsiSkImage.d.ts +1 -0
- package/lib/typescript/src/skia/web/JsiSkImageFactory.d.ts +1 -0
- package/lib/typescript/src/skia/web/JsiSkSurface.d.ts +1 -0
- package/package.json +1 -1
- package/src/renderer/__tests__/e2e/Matrix4.spec.tsx +93 -0
- package/src/skia/types/Image/Image.ts +11 -0
- package/src/skia/types/Image/ImageFactory.ts +24 -0
- package/src/skia/types/Matrix4.ts +101 -0
- package/src/skia/types/Surface/Surface.ts +12 -0
- package/src/skia/web/JsiSkImage.ts +5 -0
- package/src/skia/web/JsiSkImageFactory.ts +4 -0
- package/src/skia/web/JsiSkSurface.ts +5 -0
- package/cpp/jsi/JsiValueWrapper.h +0 -164
- package/ios/RNSkia-iOS/SkiaMetalSurfaceFactory.h +0 -128
- package/ios/RNSkia-iOS/SkiaMetalSurfaceFactory.mm +0 -92
@@ -44,8 +44,8 @@ public:
|
|
44
44
|
JniPlatformContext *platformContext)
|
45
45
|
: _javaPart(jni::make_global(jThis)), _jsRuntime(runtime),
|
46
46
|
_jsCallInvoker(jsCallInvoker),
|
47
|
-
_context(std::make_shared<RNSkAndroidPlatformContext>(
|
48
|
-
|
47
|
+
_context(std::make_shared<RNSkAndroidPlatformContext>(platformContext,
|
48
|
+
jsCallInvoker)) {}
|
49
49
|
|
50
50
|
std::shared_ptr<RNSkAndroidPlatformContext> getPlatformContext() {
|
51
51
|
return _context;
|
@@ -1,8 +1,8 @@
|
|
1
1
|
#pragma once
|
2
2
|
|
3
3
|
#include <android/looper.h>
|
4
|
-
#include <unistd.h>
|
5
4
|
#include <queue>
|
5
|
+
#include <unistd.h>
|
6
6
|
|
7
7
|
class MainThreadDispatcher {
|
8
8
|
private:
|
@@ -28,9 +28,7 @@ public:
|
|
28
28
|
return instance;
|
29
29
|
}
|
30
30
|
|
31
|
-
bool isOnMainThread() {
|
32
|
-
return ALooper_forThread() == mainLooper;
|
33
|
-
}
|
31
|
+
bool isOnMainThread() { return ALooper_forThread() == mainLooper; }
|
34
32
|
|
35
33
|
void post(std::function<void()> task) {
|
36
34
|
// TODO: this is disabled for now but we can clean this up
|
@@ -28,15 +28,21 @@ public:
|
|
28
28
|
|
29
29
|
gl::Display *getDisplay() { return _glDisplay.get(); }
|
30
30
|
gl::Context *getContext() { return _glContext.get(); }
|
31
|
+
gl::Surface *getSurface() { return _glSurface.get(); };
|
32
|
+
EGLConfig getConfig() { return _glConfig; }
|
31
33
|
|
32
34
|
private:
|
33
35
|
std::unique_ptr<gl::Display> _glDisplay;
|
34
36
|
std::unique_ptr<gl::Context> _glContext;
|
37
|
+
std::unique_ptr<gl::Surface> _glSurface;
|
38
|
+
EGLConfig _glConfig;
|
35
39
|
|
36
40
|
OpenGLSharedContext() {
|
37
41
|
_glDisplay = std::make_unique<gl::Display>();
|
38
|
-
|
39
|
-
_glContext = _glDisplay->makeContext(
|
42
|
+
_glConfig = _glDisplay->chooseConfig();
|
43
|
+
_glContext = _glDisplay->makeContext(_glConfig, nullptr);
|
44
|
+
_glSurface = _glDisplay->makePixelBufferSurface(_glConfig, 1, 1);
|
45
|
+
_glContext->makeCurrent(_glSurface.get());
|
40
46
|
}
|
41
47
|
};
|
42
48
|
|
@@ -156,11 +162,13 @@ public:
|
|
156
162
|
std::unique_ptr<WindowContext> MakeWindow(ANativeWindow *window, int width,
|
157
163
|
int height) {
|
158
164
|
auto display = OpenGLSharedContext::getInstance().getDisplay();
|
159
|
-
return std::make_unique<OpenGLWindowContext>(
|
160
|
-
|
165
|
+
return std::make_unique<OpenGLWindowContext>(
|
166
|
+
_directContext.get(), display, _glContext.get(), window,
|
167
|
+
OpenGLSharedContext::getInstance().getConfig());
|
161
168
|
}
|
162
169
|
|
163
170
|
GrDirectContext *getDirectContext() { return _directContext.get(); }
|
171
|
+
void makeCurrent() { _glContext->makeCurrent(_glSurface.get()); }
|
164
172
|
|
165
173
|
private:
|
166
174
|
std::unique_ptr<gl::Context> _glContext;
|
@@ -170,7 +178,7 @@ private:
|
|
170
178
|
OpenGLContext() {
|
171
179
|
auto display = OpenGLSharedContext::getInstance().getDisplay();
|
172
180
|
auto sharedContext = OpenGLSharedContext::getInstance().getContext();
|
173
|
-
auto glConfig =
|
181
|
+
auto glConfig = OpenGLSharedContext::getInstance().getConfig();
|
174
182
|
_glContext = display->makeContext(glConfig, sharedContext);
|
175
183
|
_glSurface = display->makePixelBufferSurface(glConfig, 1, 1);
|
176
184
|
_glContext->makeCurrent(_glSurface.get());
|
@@ -34,11 +34,11 @@ namespace RNSkia {
|
|
34
34
|
class OpenGLWindowContext : public WindowContext {
|
35
35
|
public:
|
36
36
|
OpenGLWindowContext(GrDirectContext *directContext, gl::Display *display,
|
37
|
-
gl::Context *glContext, ANativeWindow *window
|
37
|
+
gl::Context *glContext, ANativeWindow *window,
|
38
|
+
EGLConfig config)
|
38
39
|
: _directContext(directContext), _display(display), _glContext(glContext),
|
39
40
|
_window(window) {
|
40
41
|
ANativeWindow_acquire(_window);
|
41
|
-
auto config = display->chooseConfig();
|
42
42
|
_glSurface = display->makeWindowSurface(config, _window);
|
43
43
|
}
|
44
44
|
|
@@ -20,7 +20,6 @@
|
|
20
20
|
#include "MainThreadDispatcher.h"
|
21
21
|
#include "RNSkAndroidVideo.h"
|
22
22
|
#include "RNSkPlatformContext.h"
|
23
|
-
|
24
23
|
#pragma clang diagnostic push
|
25
24
|
#pragma clang diagnostic ignored "-Wdocumentation"
|
26
25
|
|
@@ -34,9 +33,9 @@ namespace jsi = facebook::jsi;
|
|
34
33
|
class RNSkAndroidPlatformContext : public RNSkPlatformContext {
|
35
34
|
public:
|
36
35
|
RNSkAndroidPlatformContext(
|
37
|
-
JniPlatformContext *jniPlatformContext,
|
36
|
+
JniPlatformContext *jniPlatformContext,
|
38
37
|
std::shared_ptr<facebook::react::CallInvoker> jsCallInvoker)
|
39
|
-
: RNSkPlatformContext(
|
38
|
+
: RNSkPlatformContext(jsCallInvoker,
|
40
39
|
jniPlatformContext->getPixelDensity()),
|
41
40
|
_jniPlatformContext(jniPlatformContext) {}
|
42
41
|
|
@@ -78,6 +77,31 @@ public:
|
|
78
77
|
#endif
|
79
78
|
}
|
80
79
|
|
80
|
+
sk_sp<SkImage> makeImageFromNativeTexture(const TextureInfo &texInfo,
|
81
|
+
int width, int height,
|
82
|
+
bool mipMapped) override {
|
83
|
+
GrGLTextureInfo textureInfo;
|
84
|
+
textureInfo.fTarget = (GrGLenum)texInfo.glTarget;
|
85
|
+
textureInfo.fID = (GrGLuint)texInfo.glID;
|
86
|
+
textureInfo.fFormat = (GrGLenum)texInfo.glFormat;
|
87
|
+
textureInfo.fProtected =
|
88
|
+
texInfo.glProtected ? skgpu::Protected::kYes : skgpu::Protected::kNo;
|
89
|
+
|
90
|
+
OpenGLContext::getInstance().makeCurrent();
|
91
|
+
if (glIsTexture(textureInfo.fID) == GL_FALSE) {
|
92
|
+
throw new std::runtime_error("Invalid textureInfo");
|
93
|
+
}
|
94
|
+
|
95
|
+
GrBackendTexture backendTexture = GrBackendTextures::MakeGL(
|
96
|
+
width, height,
|
97
|
+
mipMapped ? skgpu::Mipmapped::kYes : skgpu::Mipmapped::kNo,
|
98
|
+
textureInfo);
|
99
|
+
return SkImages::BorrowTextureFrom(
|
100
|
+
OpenGLContext::getInstance().getDirectContext(), backendTexture,
|
101
|
+
kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, kUnpremul_SkAlphaType,
|
102
|
+
nullptr);
|
103
|
+
}
|
104
|
+
|
81
105
|
std::shared_ptr<RNSkVideo> createVideo(const std::string &url) override {
|
82
106
|
auto jniVideo = _jniPlatformContext->createVideo(url);
|
83
107
|
return std::make_shared<RNSkAndroidVideo>(jniVideo);
|
@@ -149,6 +173,40 @@ public:
|
|
149
173
|
#endif
|
150
174
|
}
|
151
175
|
|
176
|
+
const TextureInfo getTexture(sk_sp<SkImage> image) override {
|
177
|
+
GrBackendTexture texture;
|
178
|
+
if (!SkImages::GetBackendTextureFromImage(image, &texture, true)) {
|
179
|
+
throw std::runtime_error("Couldn't get backend texture from image.");
|
180
|
+
}
|
181
|
+
return getJSITextureInfo(texture);
|
182
|
+
}
|
183
|
+
|
184
|
+
const TextureInfo getTexture(sk_sp<SkSurface> surface) override {
|
185
|
+
GrBackendTexture texture = SkSurfaces::GetBackendTexture(
|
186
|
+
surface.get(), SkSurface::BackendHandleAccess::kFlushRead);
|
187
|
+
return getJSITextureInfo(texture);
|
188
|
+
}
|
189
|
+
|
190
|
+
static const TextureInfo getJSITextureInfo(const GrBackendTexture &texture) {
|
191
|
+
if (!texture.isValid()) {
|
192
|
+
throw std::runtime_error("invalid backend texture");
|
193
|
+
}
|
194
|
+
GrGLTextureInfo textureInfo;
|
195
|
+
if (!GrBackendTextures::GetGLTextureInfo(texture, &textureInfo)) {
|
196
|
+
throw std::runtime_error("couldn't get OpenGL texture");
|
197
|
+
}
|
198
|
+
|
199
|
+
OpenGLContext::getInstance().makeCurrent();
|
200
|
+
glFlush();
|
201
|
+
|
202
|
+
TextureInfo texInfo;
|
203
|
+
texInfo.glProtected = textureInfo.isProtected();
|
204
|
+
texInfo.glID = textureInfo.fID;
|
205
|
+
texInfo.glFormat = textureInfo.fFormat;
|
206
|
+
texInfo.glTarget = textureInfo.fTarget;
|
207
|
+
return texInfo;
|
208
|
+
}
|
209
|
+
|
152
210
|
#if !defined(SK_GRAPHITE)
|
153
211
|
GrDirectContext *getDirectContext() override {
|
154
212
|
return OpenGLContext::getInstance().getDirectContext();
|
@@ -23,8 +23,6 @@ public:
|
|
23
23
|
|
24
24
|
virtual void setShowDebugInfo(bool show) = 0;
|
25
25
|
|
26
|
-
virtual void viewDidUnmount() = 0;
|
27
|
-
|
28
26
|
virtual std::shared_ptr<RNSkView> getSkiaView() = 0;
|
29
27
|
};
|
30
28
|
|
@@ -63,8 +61,6 @@ public:
|
|
63
61
|
|
64
62
|
void setShowDebugInfo(bool show) override { T::setShowDebugOverlays(show); }
|
65
63
|
|
66
|
-
void viewDidUnmount() override {}
|
67
|
-
|
68
64
|
std::shared_ptr<RNSkView> getSkiaView() override {
|
69
65
|
return T::shared_from_this();
|
70
66
|
}
|
@@ -26,11 +26,7 @@ public:
|
|
26
26
|
JsiSkContourMeasure(std::shared_ptr<RNSkPlatformContext> context,
|
27
27
|
const sk_sp<SkContourMeasure> contourMeasure)
|
28
28
|
: JsiSkWrappingSkPtrHostObject(std::move(context),
|
29
|
-
std::move(contourMeasure)) {
|
30
|
-
if (contourMeasure == nullptr) {
|
31
|
-
throw jsi::JSError(*context->getJsRuntime(), "Contour measure is null");
|
32
|
-
}
|
33
|
-
}
|
29
|
+
std::move(contourMeasure)) {}
|
34
30
|
|
35
31
|
JSI_HOST_FUNCTION(getPosTan) {
|
36
32
|
auto dist = arguments[0].asNumber();
|
package/cpp/api/JsiSkImage.h
CHANGED
@@ -10,6 +10,7 @@
|
|
10
10
|
#include "JsiSkShader.h"
|
11
11
|
#include "third_party/base64.h"
|
12
12
|
|
13
|
+
#include "JsiTextureInfo.h"
|
13
14
|
#include "RNSkTypedArray.h"
|
14
15
|
|
15
16
|
#if defined(SK_GRAPHITE)
|
@@ -215,6 +216,15 @@ public:
|
|
215
216
|
runtime, std::make_shared<JsiSkImage>(getContext(), rasterImage));
|
216
217
|
}
|
217
218
|
|
219
|
+
JSI_HOST_FUNCTION(getNativeTextureUnstable) {
|
220
|
+
auto image = getObject();
|
221
|
+
if (!image->isTextureBacked()) {
|
222
|
+
return jsi::Value::null();
|
223
|
+
}
|
224
|
+
auto texInfo = getContext()->getTexture(image);
|
225
|
+
return JsiTextureInfo::toValue(runtime, texInfo);
|
226
|
+
}
|
227
|
+
|
218
228
|
EXPORT_JSI_API_TYPENAME(JsiSkImage, Image)
|
219
229
|
|
220
230
|
JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkImage, width),
|
@@ -226,6 +236,7 @@ public:
|
|
226
236
|
JSI_EXPORT_FUNC(JsiSkImage, encodeToBase64),
|
227
237
|
JSI_EXPORT_FUNC(JsiSkImage, readPixels),
|
228
238
|
JSI_EXPORT_FUNC(JsiSkImage, makeNonTextureImage),
|
239
|
+
JSI_EXPORT_FUNC(JsiSkImage, getNativeTextureUnstable),
|
229
240
|
JSI_EXPORT_FUNC(JsiSkImage, dispose))
|
230
241
|
|
231
242
|
JsiSkImage(std::shared_ptr<RNSkPlatformContext> context,
|
@@ -78,10 +78,24 @@ public:
|
|
78
78
|
});
|
79
79
|
}
|
80
80
|
|
81
|
+
JSI_HOST_FUNCTION(MakeImageFromNativeTextureUnstable) {
|
82
|
+
auto texInfo = JsiTextureInfo::fromValue(runtime, arguments[0]);
|
83
|
+
auto image = getContext()->makeImageFromNativeTexture(
|
84
|
+
texInfo, arguments[1].asNumber(), arguments[2].asNumber(),
|
85
|
+
count > 3 && arguments[3].asBool());
|
86
|
+
if (image == nullptr) {
|
87
|
+
throw std::runtime_error("Failed to convert native texture to SkImage!");
|
88
|
+
}
|
89
|
+
return jsi::Object::createFromHostObject(
|
90
|
+
runtime, std::make_shared<JsiSkImage>(getContext(), std::move(image)));
|
91
|
+
}
|
92
|
+
|
81
93
|
JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkImageFactory, MakeImageFromEncoded),
|
82
94
|
JSI_EXPORT_FUNC(JsiSkImageFactory, MakeImageFromViewTag),
|
83
95
|
JSI_EXPORT_FUNC(JsiSkImageFactory,
|
84
96
|
MakeImageFromNativeBuffer),
|
97
|
+
JSI_EXPORT_FUNC(JsiSkImageFactory,
|
98
|
+
MakeImageFromNativeTextureUnstable),
|
85
99
|
JSI_EXPORT_FUNC(JsiSkImageFactory, MakeImage))
|
86
100
|
|
87
101
|
explicit JsiSkImageFactory(std::shared_ptr<RNSkPlatformContext> context)
|
package/cpp/api/JsiSkPicture.h
CHANGED
package/cpp/api/JsiSkSurface.h
CHANGED
@@ -6,6 +6,7 @@
|
|
6
6
|
#include <jsi/jsi.h>
|
7
7
|
|
8
8
|
#include "JsiSkHostObjects.h"
|
9
|
+
#include "JsiTextureInfo.h"
|
9
10
|
|
10
11
|
#include "JsiSkCanvas.h"
|
11
12
|
#include "JsiSkImage.h"
|
@@ -78,11 +79,17 @@ public:
|
|
78
79
|
runtime, std::make_shared<JsiSkImage>(getContext(), std::move(image)));
|
79
80
|
}
|
80
81
|
|
82
|
+
JSI_HOST_FUNCTION(getNativeTextureUnstable) {
|
83
|
+
auto texInfo = getContext()->getTexture(getObject());
|
84
|
+
return JsiTextureInfo::toValue(runtime, texInfo);
|
85
|
+
}
|
86
|
+
|
81
87
|
JSI_EXPORT_FUNCTIONS(JSI_EXPORT_FUNC(JsiSkSurface, width),
|
82
88
|
JSI_EXPORT_FUNC(JsiSkSurface, height),
|
83
89
|
JSI_EXPORT_FUNC(JsiSkSurface, getCanvas),
|
84
90
|
JSI_EXPORT_FUNC(JsiSkSurface, makeImageSnapshot),
|
85
91
|
JSI_EXPORT_FUNC(JsiSkSurface, flush),
|
92
|
+
JSI_EXPORT_FUNC(JsiSkSurface, getNativeTextureUnstable),
|
86
93
|
JSI_EXPORT_FUNC(JsiSkSurface, dispose))
|
87
94
|
};
|
88
95
|
|
@@ -0,0 +1,53 @@
|
|
1
|
+
#pragma once
|
2
|
+
|
3
|
+
#include <jsi/jsi.h>
|
4
|
+
|
5
|
+
#include "RNSkPlatformContext.h"
|
6
|
+
|
7
|
+
namespace jsi = facebook::jsi;
|
8
|
+
namespace react = facebook::react;
|
9
|
+
|
10
|
+
namespace RNSkia {
|
11
|
+
|
12
|
+
namespace JsiTextureInfo {
|
13
|
+
|
14
|
+
inline jsi::Value toValue(jsi::Runtime &runtime, const TextureInfo &texInfo) {
|
15
|
+
jsi::Object textureInfo(runtime);
|
16
|
+
textureInfo.setProperty(
|
17
|
+
runtime, "mtlTexture",
|
18
|
+
jsi::BigInt::fromUint64(runtime,
|
19
|
+
reinterpret_cast<uint64_t>(texInfo.mtlTexture)));
|
20
|
+
textureInfo.setProperty(runtime, "glTarget",
|
21
|
+
static_cast<int>(texInfo.glTarget));
|
22
|
+
textureInfo.setProperty(runtime, "glID", static_cast<int>(texInfo.glID));
|
23
|
+
textureInfo.setProperty(runtime, "glFormat",
|
24
|
+
static_cast<int>(texInfo.glFormat));
|
25
|
+
textureInfo.setProperty(runtime, "glProtected",
|
26
|
+
static_cast<int>(texInfo.glProtected));
|
27
|
+
return textureInfo;
|
28
|
+
}
|
29
|
+
|
30
|
+
inline TextureInfo fromValue(jsi::Runtime &runtime, const jsi::Value &value) {
|
31
|
+
auto object = value.getObject(runtime);
|
32
|
+
TextureInfo texInfo;
|
33
|
+
if (object.hasProperty(runtime, "mtlTexture")) {
|
34
|
+
texInfo.mtlTexture =
|
35
|
+
reinterpret_cast<const void *>(object.getProperty(runtime, "mtlTexture")
|
36
|
+
.asBigInt(runtime)
|
37
|
+
.asUint64(runtime));
|
38
|
+
}
|
39
|
+
if (object.hasProperty(runtime, "glID")) {
|
40
|
+
texInfo.glTarget = static_cast<unsigned int>(
|
41
|
+
object.getProperty(runtime, "glTarget").asNumber());
|
42
|
+
texInfo.glID = static_cast<unsigned int>(
|
43
|
+
object.getProperty(runtime, "glID").asNumber());
|
44
|
+
texInfo.glFormat = static_cast<unsigned int>(
|
45
|
+
object.getProperty(runtime, "glFormat").asNumber());
|
46
|
+
texInfo.glProtected =
|
47
|
+
object.getProperty(runtime, "glProtected").asNumber() != 0;
|
48
|
+
}
|
49
|
+
return texInfo;
|
50
|
+
}
|
51
|
+
|
52
|
+
} // namespace JsiTextureInfo
|
53
|
+
} // namespace RNSkia
|
@@ -0,0 +1,48 @@
|
|
1
|
+
#pragma once
|
2
|
+
|
3
|
+
#include <jsi/jsi.h>
|
4
|
+
#include <memory>
|
5
|
+
#include <string>
|
6
|
+
|
7
|
+
#include "JsiDomRenderNode.h"
|
8
|
+
#include "JsiSkPicture.h"
|
9
|
+
|
10
|
+
namespace RNJsi {
|
11
|
+
namespace jsi = facebook::jsi;
|
12
|
+
|
13
|
+
class ViewProperty {
|
14
|
+
public:
|
15
|
+
ViewProperty(jsi::Runtime &runtime, const jsi::Value &value) {
|
16
|
+
if (value.isObject()) {
|
17
|
+
auto object = value.asObject(runtime);
|
18
|
+
if (object.isHostObject(runtime)) {
|
19
|
+
auto hostObject = object.asHostObject(runtime);
|
20
|
+
auto dom =
|
21
|
+
std::dynamic_pointer_cast<RNSkia::JsiDomRenderNode>(hostObject);
|
22
|
+
if (dom) {
|
23
|
+
_value = dom;
|
24
|
+
} else {
|
25
|
+
auto jsiPicture =
|
26
|
+
std::dynamic_pointer_cast<RNSkia::JsiSkPicture>(hostObject);
|
27
|
+
if (jsiPicture) {
|
28
|
+
_value = jsiPicture->getObject();
|
29
|
+
}
|
30
|
+
}
|
31
|
+
}
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
bool isNull() { return std::holds_alternative<nullptr_t>(_value); }
|
36
|
+
|
37
|
+
std::shared_ptr<RNSkia::JsiDomRenderNode> getDomRenderNode() {
|
38
|
+
return std::get<std::shared_ptr<RNSkia::JsiDomRenderNode>>(_value);
|
39
|
+
}
|
40
|
+
|
41
|
+
sk_sp<SkPicture> getPicture() { return std::get<sk_sp<SkPicture>>(_value); }
|
42
|
+
|
43
|
+
private:
|
44
|
+
std::variant<nullptr_t, sk_sp<SkPicture>,
|
45
|
+
std::shared_ptr<RNSkia::JsiDomRenderNode>>
|
46
|
+
_value = nullptr;
|
47
|
+
};
|
48
|
+
} // namespace RNJsi
|
package/cpp/rnskia/RNSkDomView.h
CHANGED
@@ -9,8 +9,8 @@
|
|
9
9
|
|
10
10
|
#include <jsi/jsi.h>
|
11
11
|
|
12
|
-
#include "JsiValueWrapper.h"
|
13
12
|
#include "RNSkView.h"
|
13
|
+
#include "ViewProperty.h"
|
14
14
|
|
15
15
|
#include "JsiDomRenderNode.h"
|
16
16
|
#include "RNSkLog.h"
|
@@ -75,20 +75,17 @@ public:
|
|
75
75
|
std::bind(&RNSkView::requestRedraw, this), context)) {}
|
76
76
|
|
77
77
|
void setJsiProperties(
|
78
|
-
std::unordered_map<std::string,
|
79
|
-
|
80
|
-
RNSkView::setJsiProperties(props);
|
78
|
+
std::unordered_map<std::string, ViewProperty> &props) override {
|
81
79
|
|
82
80
|
for (auto &prop : props) {
|
83
81
|
if (prop.first == "root") {
|
84
82
|
// Save root
|
85
|
-
if (prop.second.
|
83
|
+
if (prop.second.isNull()) {
|
86
84
|
std::static_pointer_cast<RNSkDomRenderer>(getRenderer())
|
87
85
|
->setRoot(nullptr);
|
88
86
|
} else {
|
89
87
|
std::static_pointer_cast<RNSkDomRenderer>(getRenderer())
|
90
|
-
->setRoot(
|
91
|
-
prop.second.getAsHostObject()));
|
88
|
+
->setRoot(prop.second.getDomRenderNode());
|
92
89
|
}
|
93
90
|
|
94
91
|
// Request redraw
|
@@ -9,9 +9,9 @@
|
|
9
9
|
#include <vector>
|
10
10
|
|
11
11
|
#include "JsiHostObject.h"
|
12
|
-
#include "JsiValueWrapper.h"
|
13
12
|
#include "RNSkPlatformContext.h"
|
14
13
|
#include "RNSkView.h"
|
14
|
+
#include "ViewProperty.h"
|
15
15
|
#include <jsi/jsi.h>
|
16
16
|
|
17
17
|
namespace RNSkia {
|
@@ -20,7 +20,7 @@ namespace jsi = facebook::jsi;
|
|
20
20
|
using RNSkViewInfo = struct RNSkViewInfo {
|
21
21
|
RNSkViewInfo() { view = nullptr; }
|
22
22
|
std::shared_ptr<RNSkView> view;
|
23
|
-
std::unordered_map<std::string, RNJsi::
|
23
|
+
std::unordered_map<std::string, RNJsi::ViewProperty> props;
|
24
24
|
};
|
25
25
|
|
26
26
|
class RNSkJsiViewApi : public RNJsi::JsiHostObject,
|
@@ -57,7 +57,7 @@ public:
|
|
57
57
|
auto info = getEnsuredViewInfo(nativeId);
|
58
58
|
|
59
59
|
info->props.insert_or_assign(arguments[1].asString(runtime).utf8(runtime),
|
60
|
-
RNJsi::
|
60
|
+
RNJsi::ViewProperty(runtime, arguments[2]));
|
61
61
|
|
62
62
|
// Now let's see if we have a view that we can update
|
63
63
|
if (info->view != nullptr) {
|
@@ -9,8 +9,8 @@
|
|
9
9
|
|
10
10
|
#include <jsi/jsi.h>
|
11
11
|
|
12
|
-
#include "JsiValueWrapper.h"
|
13
12
|
#include "RNSkView.h"
|
13
|
+
#include "ViewProperty.h"
|
14
14
|
|
15
15
|
#include "JsiSkPicture.h"
|
16
16
|
#include "RNSkLog.h"
|
@@ -40,19 +40,16 @@ class RNSkPictureRenderer
|
|
40
40
|
public:
|
41
41
|
RNSkPictureRenderer(std::function<void()> requestRedraw,
|
42
42
|
std::shared_ptr<RNSkPlatformContext> context)
|
43
|
-
: RNSkRenderer(std::move(requestRedraw)),
|
43
|
+
: RNSkRenderer(std::move(requestRedraw)),
|
44
|
+
_platformContext(std::move(context)) {}
|
44
45
|
|
45
46
|
void
|
46
47
|
renderImmediate(std::shared_ptr<RNSkCanvasProvider> canvasProvider) override {
|
47
48
|
performDraw(canvasProvider);
|
48
49
|
}
|
49
50
|
|
50
|
-
void setPicture(
|
51
|
-
|
52
|
-
_picture = nullptr;
|
53
|
-
} else {
|
54
|
-
_picture = std::dynamic_pointer_cast<JsiSkPicture>(picture)->getObject();
|
55
|
-
}
|
51
|
+
void setPicture(sk_sp<SkPicture> picture) {
|
52
|
+
_picture = picture;
|
56
53
|
_requestRedraw();
|
57
54
|
}
|
58
55
|
|
@@ -88,27 +85,20 @@ public:
|
|
88
85
|
std::bind(&RNSkPictureView::requestRedraw, this), context)) {}
|
89
86
|
|
90
87
|
void setJsiProperties(
|
91
|
-
std::unordered_map<std::string, RNJsi::
|
92
|
-
|
93
|
-
RNSkView::setJsiProperties(props);
|
88
|
+
std::unordered_map<std::string, RNJsi::ViewProperty> &props) override {
|
94
89
|
|
95
90
|
for (auto &prop : props) {
|
96
91
|
if (prop.first == "picture") {
|
97
|
-
if (prop.second.
|
92
|
+
if (prop.second.isNull()) {
|
98
93
|
// Clear picture
|
99
94
|
std::static_pointer_cast<RNSkPictureRenderer>(getRenderer())
|
100
95
|
->setPicture(nullptr);
|
101
96
|
continue;
|
102
|
-
} else if (prop.second.getType() !=
|
103
|
-
RNJsi::JsiWrapperValueType::HostObject) {
|
104
|
-
// We expect a function for the picture custom property
|
105
|
-
throw std::runtime_error(
|
106
|
-
"Expected an object for the picture custom property.");
|
107
97
|
}
|
108
98
|
|
109
99
|
// Save picture
|
110
100
|
std::static_pointer_cast<RNSkPictureRenderer>(getRenderer())
|
111
|
-
->setPicture(prop.second.
|
101
|
+
->setPicture(prop.second.getPicture());
|
112
102
|
}
|
113
103
|
}
|
114
104
|
}
|
@@ -23,8 +23,6 @@
|
|
23
23
|
|
24
24
|
#pragma clang diagnostic pop
|
25
25
|
|
26
|
-
#include <jsi/jsi.h>
|
27
|
-
|
28
26
|
#include <ReactCommon/CallInvoker.h>
|
29
27
|
|
30
28
|
namespace RNSkia {
|
@@ -32,16 +30,22 @@ namespace RNSkia {
|
|
32
30
|
namespace jsi = facebook::jsi;
|
33
31
|
namespace react = facebook::react;
|
34
32
|
|
33
|
+
struct TextureInfo {
|
34
|
+
const void *mtlTexture = nullptr;
|
35
|
+
unsigned int glTarget = 0;
|
36
|
+
unsigned int glID = 0;
|
37
|
+
unsigned int glFormat = 0;
|
38
|
+
bool glProtected = false;
|
39
|
+
};
|
40
|
+
|
35
41
|
class RNSkPlatformContext {
|
36
42
|
public:
|
37
43
|
/**
|
38
44
|
* Constructor
|
39
45
|
*/
|
40
|
-
RNSkPlatformContext(
|
41
|
-
std::shared_ptr<react::CallInvoker> callInvoker,
|
46
|
+
RNSkPlatformContext(std::shared_ptr<react::CallInvoker> callInvoker,
|
42
47
|
float pixelDensity)
|
43
|
-
: _pixelDensity(pixelDensity),
|
44
|
-
_callInvoker(callInvoker) {}
|
48
|
+
: _pixelDensity(pixelDensity), _callInvoker(callInvoker) {}
|
45
49
|
|
46
50
|
virtual ~RNSkPlatformContext() = default;
|
47
51
|
|
@@ -65,11 +69,6 @@ public:
|
|
65
69
|
*/
|
66
70
|
virtual sk_sp<SkImage> takeScreenshotFromViewTag(size_t tag) = 0;
|
67
71
|
|
68
|
-
/**
|
69
|
-
Returns the javascript runtime
|
70
|
-
*/
|
71
|
-
jsi::Runtime *getJsRuntime() { return _jsRuntime; }
|
72
|
-
|
73
72
|
/**
|
74
73
|
* Returns an SkStream wrapping the require uri provided.
|
75
74
|
* @param sourceUri Uri for the resource to load as a string
|
@@ -107,6 +106,10 @@ public:
|
|
107
106
|
*/
|
108
107
|
virtual sk_sp<SkImage> makeImageFromNativeBuffer(void *buffer) = 0;
|
109
108
|
|
109
|
+
virtual sk_sp<SkImage>
|
110
|
+
makeImageFromNativeTexture(const TextureInfo &textureInfo, int width,
|
111
|
+
int height, bool mipMapped) = 0;
|
112
|
+
|
110
113
|
#if !defined(SK_GRAPHITE)
|
111
114
|
virtual GrDirectContext *getDirectContext() = 0;
|
112
115
|
#endif
|
@@ -115,6 +118,10 @@ public:
|
|
115
118
|
|
116
119
|
virtual uint64_t makeNativeBuffer(sk_sp<SkImage> image) = 0;
|
117
120
|
|
121
|
+
virtual const TextureInfo getTexture(sk_sp<SkSurface> image) = 0;
|
122
|
+
|
123
|
+
virtual const TextureInfo getTexture(sk_sp<SkImage> image) = 0;
|
124
|
+
|
118
125
|
virtual std::shared_ptr<RNSkVideo> createVideo(const std::string &url) = 0;
|
119
126
|
|
120
127
|
/**
|
@@ -154,7 +161,6 @@ public:
|
|
154
161
|
|
155
162
|
private:
|
156
163
|
float _pixelDensity;
|
157
|
-
jsi::Runtime *_jsRuntime;
|
158
164
|
std::shared_ptr<react::CallInvoker> _callInvoker;
|
159
165
|
};
|
160
166
|
} // namespace RNSkia
|
package/cpp/rnskia/RNSkView.h
CHANGED
@@ -6,8 +6,8 @@
|
|
6
6
|
#include <unordered_map>
|
7
7
|
#include <vector>
|
8
8
|
|
9
|
-
#include "JsiValueWrapper.h"
|
10
9
|
#include "RNSkPlatformContext.h"
|
10
|
+
#include "ViewProperty.h"
|
11
11
|
|
12
12
|
#include "JsiSkImage.h"
|
13
13
|
#include "JsiSkPoint.h"
|
@@ -143,14 +143,8 @@ public:
|
|
143
143
|
*/
|
144
144
|
virtual ~RNSkView() {}
|
145
145
|
|
146
|
-
/**
|
147
|
-
Sets custom properties. Custom properties are properties that are set
|
148
|
-
directly from Javascript without having to go through the async bridge.
|
149
|
-
*/
|
150
146
|
virtual void setJsiProperties(
|
151
|
-
std::unordered_map<std::string, RNJsi::
|
152
|
-
// Nothing here...
|
153
|
-
}
|
147
|
+
std::unordered_map<std::string, RNJsi::ViewProperty> &props) = 0;
|
154
148
|
|
155
149
|
void requestRedraw() {
|
156
150
|
if (!_redrawRequested) {
|