@shopify/react-native-skia 1.6.0 → 1.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/android/cpp/jni/include/JniSkiaBaseView.h +2 -3
- package/android/cpp/jni/include/JniSkiaManager.h +2 -2
- package/android/cpp/rnskia-android/GrAHardwareBufferUtils.cpp +14 -14
- package/android/cpp/rnskia-android/MainThreadDispatcher.h +4 -6
- package/android/cpp/rnskia-android/OpenGLContext.h +24 -10
- package/android/cpp/rnskia-android/OpenGLWindowContext.h +3 -3
- package/android/cpp/rnskia-android/RNSkAndroidPlatformContext.h +64 -8
- package/android/cpp/rnskia-android/RNSkAndroidVideo.cpp +1 -1
- package/android/cpp/rnskia-android/RNSkAndroidVideo.h +1 -1
- package/android/cpp/rnskia-android/RNSkAndroidView.h +0 -4
- package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.cpp +3 -3
- package/android/cpp/rnskia-android/gl/Display.h +2 -0
- package/cpp/api/JsiSkApi.h +1 -1
- package/cpp/api/JsiSkCanvas.h +1 -1
- package/cpp/api/JsiSkColor.h +2 -2
- 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/api/third_party/CSSColorParser.h +1 -1
- package/cpp/api/third_party/base64.cpp +4 -4
- package/cpp/jsi/ViewProperty.h +48 -0
- package/cpp/rnskia/RNSkDomView.h +4 -7
- package/cpp/rnskia/RNSkJsiViewApi.h +3 -3
- package/cpp/rnskia/RNSkManager.cpp +1 -1
- package/cpp/rnskia/RNSkPictureView.h +8 -18
- package/cpp/rnskia/RNSkPlatformContext.h +18 -13
- 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 -29
- package/ios/RNSkia-iOS/RNSkiOSPlatformContext.mm +88 -2
- package/ios/RNSkia-iOS/SkiaCVPixelBufferUtils.mm +17 -6
- package/ios/RNSkia-iOS/SkiaDomView.mm +3 -3
- package/ios/RNSkia-iOS/SkiaDomViewManager.mm +2 -1
- package/ios/RNSkia-iOS/SkiaManager.h +6 -0
- package/ios/RNSkia-iOS/SkiaManager.mm +18 -2
- package/ios/RNSkia-iOS/SkiaPictureView.mm +3 -3
- package/ios/RNSkia-iOS/SkiaPictureViewManager.mm +2 -1
- package/ios/RNSkia-iOS/SkiaUIView.h +0 -1
- package/ios/RNSkia-iOS/SkiaUIView.mm +18 -22
- 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
|
@@ -20,9 +20,9 @@ class JniSkiaBaseView {
|
|
|
20
20
|
public:
|
|
21
21
|
JniSkiaBaseView(jni::alias_ref<JniSkiaManager::javaobject> skiaManager,
|
|
22
22
|
std::shared_ptr<RNSkBaseAndroidView> skiaView)
|
|
23
|
-
: _manager(skiaManager->cthis()), _skiaAndroidView(skiaView) {}
|
|
23
|
+
: _manager(skiaManager->cthis()), _skiaAndroidView(std::move(skiaView)) {}
|
|
24
24
|
|
|
25
|
-
~JniSkiaBaseView()
|
|
25
|
+
~JniSkiaBaseView() = default;
|
|
26
26
|
|
|
27
27
|
std::shared_ptr<RNSkManager> getSkiaManager() {
|
|
28
28
|
return _manager->getSkiaManager();
|
|
@@ -55,7 +55,6 @@ protected:
|
|
|
55
55
|
_skiaAndroidView->getSkiaView()->getNativeId(), nullptr);
|
|
56
56
|
getSkiaManager()->unregisterSkiaView(
|
|
57
57
|
_skiaAndroidView->getSkiaView()->getNativeId());
|
|
58
|
-
_skiaAndroidView->viewDidUnmount();
|
|
59
58
|
}
|
|
60
59
|
|
|
61
60
|
private:
|
|
@@ -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;
|
|
@@ -41,7 +41,7 @@ GrBackendFormat GetGLBackendFormat(GrDirectContext *dContext,
|
|
|
41
41
|
bool requireKnownFormat) {
|
|
42
42
|
GrBackendApi backend = dContext->backend();
|
|
43
43
|
if (backend != GrBackendApi::kOpenGL) {
|
|
44
|
-
return
|
|
44
|
+
return {};
|
|
45
45
|
}
|
|
46
46
|
switch (bufferFormat) {
|
|
47
47
|
// TODO: find out if we can detect, which graphic buffers support
|
|
@@ -63,7 +63,7 @@ GrBackendFormat GetGLBackendFormat(GrDirectContext *dContext,
|
|
|
63
63
|
#endif
|
|
64
64
|
default:
|
|
65
65
|
if (requireKnownFormat) {
|
|
66
|
-
return
|
|
66
|
+
return {};
|
|
67
67
|
} else {
|
|
68
68
|
return GrBackendFormats::MakeGL(GR_GL_RGBA8, GR_GL_TEXTURE_EXTERNAL);
|
|
69
69
|
}
|
|
@@ -110,12 +110,12 @@ void GLTextureHelper::rebind(GrDirectContext *dContext) {
|
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
void delete_gl_texture(void *context) {
|
|
113
|
-
|
|
113
|
+
auto cleanupHelper = static_cast<GLTextureHelper *>(context);
|
|
114
114
|
delete cleanupHelper;
|
|
115
115
|
}
|
|
116
116
|
|
|
117
117
|
void update_gl_texture(void *context, GrDirectContext *dContext) {
|
|
118
|
-
|
|
118
|
+
auto cleanupHelper = static_cast<GLTextureHelper *>(context);
|
|
119
119
|
cleanupHelper->rebind(dContext);
|
|
120
120
|
}
|
|
121
121
|
|
|
@@ -127,13 +127,13 @@ static GrBackendTexture make_gl_backend_texture(
|
|
|
127
127
|
while (GL_NO_ERROR != glGetError()) {
|
|
128
128
|
} // clear GL errors
|
|
129
129
|
|
|
130
|
-
|
|
130
|
+
auto eglGetNativeClientBufferANDROID =
|
|
131
131
|
(EGLGetNativeClientBufferANDROIDProc)eglGetProcAddress(
|
|
132
132
|
"eglGetNativeClientBufferANDROID");
|
|
133
133
|
if (!eglGetNativeClientBufferANDROID) {
|
|
134
134
|
RNSkLogger::logToConsole(
|
|
135
135
|
"Failed to get the eglGetNativeClientBufferAndroid proc");
|
|
136
|
-
return
|
|
136
|
+
return {};
|
|
137
137
|
}
|
|
138
138
|
|
|
139
139
|
EGLClientBuffer clientBuffer =
|
|
@@ -149,14 +149,14 @@ static GrBackendTexture make_gl_backend_texture(
|
|
|
149
149
|
if (EGL_NO_IMAGE_KHR == image) {
|
|
150
150
|
SkDebugf("Could not create EGL image, err = (%#x)",
|
|
151
151
|
static_cast<int>(eglGetError()));
|
|
152
|
-
return
|
|
152
|
+
return {};
|
|
153
153
|
}
|
|
154
154
|
|
|
155
155
|
GrGLuint texID;
|
|
156
156
|
glGenTextures(1, &texID);
|
|
157
157
|
if (!texID) {
|
|
158
158
|
eglDestroyImageKHR(display, image);
|
|
159
|
-
return
|
|
159
|
+
return {};
|
|
160
160
|
}
|
|
161
161
|
|
|
162
162
|
GrGLuint target = isRenderable ? GR_GL_TEXTURE_2D : GR_GL_TEXTURE_EXTERNAL;
|
|
@@ -167,7 +167,7 @@ static GrBackendTexture make_gl_backend_texture(
|
|
|
167
167
|
SkDebugf("glBindTexture failed (%#x)", static_cast<int>(status));
|
|
168
168
|
glDeleteTextures(1, &texID);
|
|
169
169
|
eglDestroyImageKHR(display, image);
|
|
170
|
-
return
|
|
170
|
+
return {};
|
|
171
171
|
}
|
|
172
172
|
glEGLImageTargetTexture2DOES(target, image);
|
|
173
173
|
if ((status = glGetError()) != GL_NO_ERROR) {
|
|
@@ -175,7 +175,7 @@ static GrBackendTexture make_gl_backend_texture(
|
|
|
175
175
|
static_cast<int>(status));
|
|
176
176
|
glDeleteTextures(1, &texID);
|
|
177
177
|
eglDestroyImageKHR(display, image);
|
|
178
|
-
return
|
|
178
|
+
return {};
|
|
179
179
|
}
|
|
180
180
|
dContext->resetContext(kTextureBinding_GrGLBackendState);
|
|
181
181
|
|
|
@@ -223,16 +223,16 @@ MakeGLBackendTexture(GrDirectContext *dContext, AHardwareBuffer *hardwareBuffer,
|
|
|
223
223
|
bool isProtectedContent,
|
|
224
224
|
const GrBackendFormat &backendFormat, bool isRenderable) {
|
|
225
225
|
SkASSERT(dContext);
|
|
226
|
-
if (
|
|
227
|
-
return
|
|
226
|
+
if (dContext->abandoned()) {
|
|
227
|
+
return {};
|
|
228
228
|
}
|
|
229
229
|
|
|
230
230
|
if (GrBackendApi::kOpenGL != dContext->backend()) {
|
|
231
|
-
return
|
|
231
|
+
return {};
|
|
232
232
|
}
|
|
233
233
|
|
|
234
234
|
if (isProtectedContent && !can_import_protected_content(dContext)) {
|
|
235
|
-
return
|
|
235
|
+
return {};
|
|
236
236
|
}
|
|
237
237
|
|
|
238
238
|
return make_gl_backend_texture(
|
|
@@ -1,13 +1,13 @@
|
|
|
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:
|
|
9
|
-
ALooper *mainLooper;
|
|
10
|
-
int messagePipe[2];
|
|
9
|
+
ALooper *mainLooper = nullptr;
|
|
10
|
+
int messagePipe[2] = { -1, -1 };
|
|
11
11
|
std::queue<std::function<void()>> taskQueue;
|
|
12
12
|
std::mutex queueMutex;
|
|
13
13
|
|
|
@@ -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
|
|
|
@@ -111,17 +117,23 @@ public:
|
|
|
111
117
|
// GR_GL_TEXTURE_2D
|
|
112
118
|
case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM:
|
|
113
119
|
format = GrBackendFormats::MakeGL(GR_GL_RGBA8, GR_GL_TEXTURE_EXTERNAL);
|
|
120
|
+
break;
|
|
114
121
|
case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT:
|
|
115
122
|
format = GrBackendFormats::MakeGL(GR_GL_RGBA16F, GR_GL_TEXTURE_EXTERNAL);
|
|
123
|
+
break;
|
|
116
124
|
case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM:
|
|
117
|
-
|
|
125
|
+
GrBackendFormats::MakeGL(GR_GL_RGB565, GR_GL_TEXTURE_EXTERNAL);
|
|
126
|
+
break;
|
|
118
127
|
case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM:
|
|
119
128
|
format = GrBackendFormats::MakeGL(GR_GL_RGB10_A2, GR_GL_TEXTURE_EXTERNAL);
|
|
129
|
+
break;
|
|
120
130
|
case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM:
|
|
121
131
|
format = GrBackendFormats::MakeGL(GR_GL_RGB8, GR_GL_TEXTURE_EXTERNAL);
|
|
132
|
+
break;
|
|
122
133
|
#if __ANDROID_API__ >= 33
|
|
123
134
|
case AHARDWAREBUFFER_FORMAT_R8_UNORM:
|
|
124
135
|
format = GrBackendFormats::MakeGL(GR_GL_R8, GR_GL_TEXTURE_EXTERNAL);
|
|
136
|
+
break;
|
|
125
137
|
#endif
|
|
126
138
|
default:
|
|
127
139
|
if (requireKnownFormat) {
|
|
@@ -130,10 +142,11 @@ public:
|
|
|
130
142
|
format = GrBackendFormats::MakeGL(GR_GL_RGBA8, GR_GL_TEXTURE_EXTERNAL);
|
|
131
143
|
}
|
|
132
144
|
}
|
|
133
|
-
|
|
145
|
+
auto width = static_cast<int>(description.width);
|
|
146
|
+
auto height = static_cast<int>(description.height);
|
|
134
147
|
auto backendTex = MakeGLBackendTexture(
|
|
135
148
|
_directContext.get(), const_cast<AHardwareBuffer *>(hardwareBuffer),
|
|
136
|
-
|
|
149
|
+
width, height, &deleteImageProc,
|
|
137
150
|
&updateImageProc, &deleteImageCtx, false, format, false);
|
|
138
151
|
if (!backendTex.isValid()) {
|
|
139
152
|
RNSkLogger::logToConsole(
|
|
@@ -153,14 +166,15 @@ public:
|
|
|
153
166
|
}
|
|
154
167
|
|
|
155
168
|
// TODO: remove width, height
|
|
156
|
-
std::unique_ptr<WindowContext> MakeWindow(ANativeWindow *window
|
|
157
|
-
int height) {
|
|
169
|
+
std::unique_ptr<WindowContext> MakeWindow(ANativeWindow *window) {
|
|
158
170
|
auto display = OpenGLSharedContext::getInstance().getDisplay();
|
|
159
|
-
return std::make_unique<OpenGLWindowContext>(
|
|
160
|
-
|
|
171
|
+
return std::make_unique<OpenGLWindowContext>(
|
|
172
|
+
_directContext.get(), display, _glContext.get(), window,
|
|
173
|
+
OpenGLSharedContext::getInstance().getConfig());
|
|
161
174
|
}
|
|
162
175
|
|
|
163
176
|
GrDirectContext *getDirectContext() { return _directContext.get(); }
|
|
177
|
+
void makeCurrent() { _glContext->makeCurrent(_glSurface.get()); }
|
|
164
178
|
|
|
165
179
|
private:
|
|
166
180
|
std::unique_ptr<gl::Context> _glContext;
|
|
@@ -170,7 +184,7 @@ private:
|
|
|
170
184
|
OpenGLContext() {
|
|
171
185
|
auto display = OpenGLSharedContext::getInstance().getDisplay();
|
|
172
186
|
auto sharedContext = OpenGLSharedContext::getInstance().getContext();
|
|
173
|
-
auto glConfig =
|
|
187
|
+
auto glConfig = OpenGLSharedContext::getInstance().getConfig();
|
|
174
188
|
_glContext = display->makeContext(glConfig, sharedContext);
|
|
175
189
|
_glSurface = display->makePixelBufferSurface(glConfig, 1, 1);
|
|
176
190
|
_glContext->makeCurrent(_glSurface.get());
|
|
@@ -34,15 +34,15 @@ 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
|
|
|
45
|
-
~OpenGLWindowContext() {
|
|
45
|
+
~OpenGLWindowContext() override {
|
|
46
46
|
_skSurface = nullptr;
|
|
47
47
|
_glSurface = nullptr;
|
|
48
48
|
ANativeWindow_release(_window);
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
|
-
// TODO: Add android flags
|
|
4
3
|
#if __ANDROID_API__ >= 26
|
|
5
4
|
#include <android/hardware_buffer.h>
|
|
6
5
|
#endif
|
|
@@ -20,7 +19,6 @@
|
|
|
20
19
|
#include "MainThreadDispatcher.h"
|
|
21
20
|
#include "RNSkAndroidVideo.h"
|
|
22
21
|
#include "RNSkPlatformContext.h"
|
|
23
|
-
|
|
24
22
|
#pragma clang diagnostic push
|
|
25
23
|
#pragma clang diagnostic ignored "-Wdocumentation"
|
|
26
24
|
|
|
@@ -29,18 +27,17 @@
|
|
|
29
27
|
#pragma clang diagnostic pop
|
|
30
28
|
|
|
31
29
|
namespace RNSkia {
|
|
32
|
-
namespace jsi = facebook::jsi;
|
|
33
30
|
|
|
34
31
|
class RNSkAndroidPlatformContext : public RNSkPlatformContext {
|
|
35
32
|
public:
|
|
36
33
|
RNSkAndroidPlatformContext(
|
|
37
|
-
JniPlatformContext *jniPlatformContext,
|
|
34
|
+
JniPlatformContext *jniPlatformContext,
|
|
38
35
|
std::shared_ptr<facebook::react::CallInvoker> jsCallInvoker)
|
|
39
|
-
: RNSkPlatformContext(
|
|
36
|
+
: RNSkPlatformContext(std::move(jsCallInvoker),
|
|
40
37
|
jniPlatformContext->getPixelDensity()),
|
|
41
38
|
_jniPlatformContext(jniPlatformContext) {}
|
|
42
39
|
|
|
43
|
-
~RNSkAndroidPlatformContext()
|
|
40
|
+
~RNSkAndroidPlatformContext() override = default;
|
|
44
41
|
|
|
45
42
|
void performStreamOperation(
|
|
46
43
|
const std::string &sourceUri,
|
|
@@ -66,7 +63,7 @@ public:
|
|
|
66
63
|
return DawnContext::getInstance().MakeWindow(surface, width, height);
|
|
67
64
|
#else
|
|
68
65
|
auto aWindow = reinterpret_cast<ANativeWindow *>(surface);
|
|
69
|
-
return OpenGLContext::getInstance().MakeWindow(aWindow
|
|
66
|
+
return OpenGLContext::getInstance().MakeWindow(aWindow);
|
|
70
67
|
#endif
|
|
71
68
|
}
|
|
72
69
|
|
|
@@ -78,6 +75,31 @@ public:
|
|
|
78
75
|
#endif
|
|
79
76
|
}
|
|
80
77
|
|
|
78
|
+
sk_sp<SkImage> makeImageFromNativeTexture(const TextureInfo &texInfo,
|
|
79
|
+
int width, int height,
|
|
80
|
+
bool mipMapped) override {
|
|
81
|
+
GrGLTextureInfo textureInfo;
|
|
82
|
+
textureInfo.fTarget = (GrGLenum)texInfo.glTarget;
|
|
83
|
+
textureInfo.fID = (GrGLuint)texInfo.glID;
|
|
84
|
+
textureInfo.fFormat = (GrGLenum)texInfo.glFormat;
|
|
85
|
+
textureInfo.fProtected =
|
|
86
|
+
texInfo.glProtected ? skgpu::Protected::kYes : skgpu::Protected::kNo;
|
|
87
|
+
|
|
88
|
+
OpenGLContext::getInstance().makeCurrent();
|
|
89
|
+
if (glIsTexture(textureInfo.fID) == GL_FALSE) {
|
|
90
|
+
throw std::runtime_error("Invalid textureInfo");
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
GrBackendTexture backendTexture = GrBackendTextures::MakeGL(
|
|
94
|
+
width, height,
|
|
95
|
+
mipMapped ? skgpu::Mipmapped::kYes : skgpu::Mipmapped::kNo,
|
|
96
|
+
textureInfo);
|
|
97
|
+
return SkImages::BorrowTextureFrom(
|
|
98
|
+
OpenGLContext::getInstance().getDirectContext(), backendTexture,
|
|
99
|
+
kTopLeft_GrSurfaceOrigin, kRGBA_8888_SkColorType, kUnpremul_SkAlphaType,
|
|
100
|
+
nullptr);
|
|
101
|
+
}
|
|
102
|
+
|
|
81
103
|
std::shared_ptr<RNSkVideo> createVideo(const std::string &url) override {
|
|
82
104
|
auto jniVideo = _jniPlatformContext->createVideo(url);
|
|
83
105
|
return std::make_shared<RNSkAndroidVideo>(jniVideo);
|
|
@@ -85,7 +107,7 @@ public:
|
|
|
85
107
|
|
|
86
108
|
void releaseNativeBuffer(uint64_t pointer) override {
|
|
87
109
|
#if __ANDROID_API__ >= 26
|
|
88
|
-
|
|
110
|
+
auto *buffer = reinterpret_cast<AHardwareBuffer *>(pointer);
|
|
89
111
|
AHardwareBuffer_release(buffer);
|
|
90
112
|
#endif
|
|
91
113
|
}
|
|
@@ -149,6 +171,40 @@ public:
|
|
|
149
171
|
#endif
|
|
150
172
|
}
|
|
151
173
|
|
|
174
|
+
const TextureInfo getTexture(sk_sp<SkImage> image) override {
|
|
175
|
+
GrBackendTexture texture;
|
|
176
|
+
if (!SkImages::GetBackendTextureFromImage(image, &texture, true)) {
|
|
177
|
+
throw std::runtime_error("Couldn't get backend texture from image.");
|
|
178
|
+
}
|
|
179
|
+
return getTextureInfo(texture);
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
const TextureInfo getTexture(sk_sp<SkSurface> surface) override {
|
|
183
|
+
GrBackendTexture texture = SkSurfaces::GetBackendTexture(
|
|
184
|
+
surface.get(), SkSurface::BackendHandleAccess::kFlushRead);
|
|
185
|
+
return getTextureInfo(texture);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
static TextureInfo getTextureInfo(const GrBackendTexture &texture) {
|
|
189
|
+
if (!texture.isValid()) {
|
|
190
|
+
throw std::runtime_error("invalid backend texture");
|
|
191
|
+
}
|
|
192
|
+
GrGLTextureInfo textureInfo;
|
|
193
|
+
if (!GrBackendTextures::GetGLTextureInfo(texture, &textureInfo)) {
|
|
194
|
+
throw std::runtime_error("couldn't get OpenGL texture");
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
OpenGLContext::getInstance().makeCurrent();
|
|
198
|
+
glFlush();
|
|
199
|
+
|
|
200
|
+
TextureInfo texInfo;
|
|
201
|
+
texInfo.glProtected = textureInfo.isProtected();
|
|
202
|
+
texInfo.glID = textureInfo.fID;
|
|
203
|
+
texInfo.glFormat = textureInfo.fFormat;
|
|
204
|
+
texInfo.glTarget = textureInfo.fTarget;
|
|
205
|
+
return texInfo;
|
|
206
|
+
}
|
|
207
|
+
|
|
152
208
|
#if !defined(SK_GRAPHITE)
|
|
153
209
|
GrDirectContext *getDirectContext() override {
|
|
154
210
|
return OpenGLContext::getInstance().getDirectContext();
|
|
@@ -35,7 +35,7 @@ RNSkAndroidVideo::RNSkAndroidVideo(jni::global_ref<jobject> jniVideo)
|
|
|
35
35
|
#endif
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
-
RNSkAndroidVideo::~RNSkAndroidVideo()
|
|
38
|
+
RNSkAndroidVideo::~RNSkAndroidVideo() = default;
|
|
39
39
|
|
|
40
40
|
sk_sp<SkImage> RNSkAndroidVideo::nextImage(double *timeStamp) {
|
|
41
41
|
#if __ANDROID_API__ >= 26
|
|
@@ -26,7 +26,7 @@ private:
|
|
|
26
26
|
|
|
27
27
|
public:
|
|
28
28
|
explicit RNSkAndroidVideo(jni::global_ref<jobject> jniVideo);
|
|
29
|
-
~RNSkAndroidVideo();
|
|
29
|
+
~RNSkAndroidVideo() override;
|
|
30
30
|
sk_sp<SkImage> nextImage(double *timeStamp = nullptr) override;
|
|
31
31
|
double duration() override;
|
|
32
32
|
double framerate() override;
|
|
@@ -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,9 +26,9 @@ namespace RNSkia {
|
|
|
26
26
|
RNSkOpenGLCanvasProvider::RNSkOpenGLCanvasProvider(
|
|
27
27
|
std::function<void()> requestRedraw,
|
|
28
28
|
std::shared_ptr<RNSkia::RNSkPlatformContext> platformContext)
|
|
29
|
-
: RNSkCanvasProvider(requestRedraw), _platformContext(platformContext) {}
|
|
29
|
+
: RNSkCanvasProvider(std::move(requestRedraw)), _platformContext(std::move(platformContext)) {}
|
|
30
30
|
|
|
31
|
-
RNSkOpenGLCanvasProvider::~RNSkOpenGLCanvasProvider()
|
|
31
|
+
RNSkOpenGLCanvasProvider::~RNSkOpenGLCanvasProvider() = default;
|
|
32
32
|
|
|
33
33
|
float RNSkOpenGLCanvasProvider::getScaledWidth() {
|
|
34
34
|
if (_surfaceHolder) {
|
|
@@ -110,7 +110,7 @@ void RNSkOpenGLCanvasProvider::surfaceAvailable(jobject jSurfaceTexture,
|
|
|
110
110
|
_surfaceHolder = DawnContext::getInstance().MakeWindow(window, width, height);
|
|
111
111
|
#else
|
|
112
112
|
_surfaceHolder =
|
|
113
|
-
OpenGLContext::getInstance().MakeWindow(window
|
|
113
|
+
OpenGLContext::getInstance().MakeWindow(window);
|
|
114
114
|
#endif
|
|
115
115
|
|
|
116
116
|
// Post redraw request to ensure we paint in the next draw cycle.
|
package/cpp/api/JsiSkApi.h
CHANGED
|
@@ -64,7 +64,7 @@ public:
|
|
|
64
64
|
* and provide functions for accessing and creating the Skia wrapper objects
|
|
65
65
|
* @param context Platform context
|
|
66
66
|
*/
|
|
67
|
-
JsiSkApi(
|
|
67
|
+
explicit JsiSkApi(const std::shared_ptr<RNSkPlatformContext> &context)
|
|
68
68
|
: JsiSkHostObject(context) {
|
|
69
69
|
// We create the system font manager eagerly since it has proven to be too
|
|
70
70
|
// slow to do it on demand
|
package/cpp/api/JsiSkCanvas.h
CHANGED
|
@@ -83,7 +83,7 @@ public:
|
|
|
83
83
|
auto src = JsiSkRect::fromValue(runtime, arguments[1]);
|
|
84
84
|
auto dest = JsiSkRect::fromValue(runtime, arguments[2]);
|
|
85
85
|
auto paint = JsiSkPaint::fromValue(runtime, arguments[3]);
|
|
86
|
-
auto fastSample = count
|
|
86
|
+
auto fastSample = count >= 5 && arguments[4].getBool();
|
|
87
87
|
_canvas->drawImageRect(image, *src, *dest, SkSamplingOptions(), paint.get(),
|
|
88
88
|
fastSample ? SkCanvas::kFast_SrcRectConstraint
|
|
89
89
|
: SkCanvas::kStrict_SrcRectConstraint);
|
package/cpp/api/JsiSkColor.h
CHANGED
|
@@ -24,7 +24,7 @@ class JsiSkColor : public RNJsi::JsiHostObject {
|
|
|
24
24
|
public:
|
|
25
25
|
JsiSkColor() : JsiHostObject() {}
|
|
26
26
|
|
|
27
|
-
~JsiSkColor()
|
|
27
|
+
~JsiSkColor() override = default;
|
|
28
28
|
|
|
29
29
|
static jsi::Object toValue(jsi::Runtime &runtime, SkColor color) {
|
|
30
30
|
auto result = runtime.global()
|
|
@@ -63,7 +63,7 @@ public:
|
|
|
63
63
|
* @return A function for creating a new host object wrapper for the SkColor
|
|
64
64
|
* class
|
|
65
65
|
*/
|
|
66
|
-
static
|
|
66
|
+
static jsi::HostFunctionType createCtor() {
|
|
67
67
|
return JSI_HOST_FUNCTION_LAMBDA {
|
|
68
68
|
if (arguments[0].isNumber()) {
|
|
69
69
|
return JsiSkColor::toValue(runtime, arguments[0].getNumber());
|
|
@@ -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
|