@shopify/react-native-skia 1.5.10 → 1.7.0
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 +6 -5
- package/android/cpp/jni/include/JniSkiaDomView.h +6 -4
- package/android/cpp/jni/include/JniSkiaManager.h +2 -2
- package/android/cpp/jni/include/JniSkiaPictureView.h +6 -4
- package/android/cpp/rnskia-android/MainThreadDispatcher.h +3 -0
- package/android/cpp/rnskia-android/OpenGLContext.h +44 -9
- package/android/cpp/rnskia-android/OpenGLWindowContext.cpp +0 -1
- 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 +10 -13
- package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.cpp +42 -36
- package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.h +2 -2
- package/android/cpp/rnskia-android/gl/Display.h +2 -0
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaAHBView.java +113 -0
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseView.java +45 -54
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseViewManager.java +5 -0
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaDomView.java +2 -2
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaPictureView.java +2 -2
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaSurfaceView.java +42 -0
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaTextureView.java +90 -0
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaViewAPI.java +16 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaDomViewManagerDelegate.java +3 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaDomViewManagerInterface.java +1 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaPictureViewManagerDelegate.java +3 -1
- package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaPictureViewManagerInterface.java +1 -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.cpp +0 -20
- package/cpp/rnskia/RNSkDomView.h +4 -9
- package/cpp/rnskia/RNSkJsiViewApi.h +3 -3
- package/cpp/rnskia/RNSkPictureView.h +11 -28
- package/cpp/rnskia/RNSkPlatformContext.h +18 -12
- package/cpp/rnskia/RNSkView.h +5 -29
- 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 +9 -2
- package/ios/RNSkia-iOS/SkiaDomViewManager.mm +5 -0
- package/ios/RNSkia-iOS/SkiaManager.mm +1 -2
- package/ios/RNSkia-iOS/SkiaPictureView.mm +1 -0
- package/ios/RNSkia-iOS/SkiaPictureViewManager.mm +5 -0
- package/ios/RNSkia-iOS/SkiaUIView.h +1 -0
- package/ios/RNSkia-iOS/SkiaUIView.mm +21 -14
- package/lib/commonjs/skia/types/Image/ColorType.d.ts +21 -0
- package/lib/commonjs/skia/types/Image/ColorType.js +29 -0
- package/lib/commonjs/skia/types/Image/ColorType.js.map +1 -0
- package/lib/commonjs/skia/types/Image/ColorType.web.d.ts +19 -0
- package/lib/commonjs/skia/types/Image/ColorType.web.js +27 -0
- package/lib/commonjs/skia/types/Image/ColorType.web.js.map +1 -0
- 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 +19 -19
- package/lib/commonjs/skia/types/Image/ImageFactory.js +1 -21
- package/lib/commonjs/skia/types/Image/ImageFactory.js.map +1 -1
- package/lib/commonjs/skia/types/Image/index.d.ts +1 -0
- package/lib/commonjs/skia/types/Image/index.js +11 -0
- package/lib/commonjs/skia/types/Image/index.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/commonjs/specs/SkiaPictureViewNativeComponent.d.ts +1 -0
- package/lib/commonjs/specs/SkiaPictureViewNativeComponent.js.map +1 -1
- package/lib/commonjs/views/SkiaDomView.js +3 -1
- package/lib/commonjs/views/SkiaDomView.js.map +1 -1
- package/lib/commonjs/views/SkiaPictureView.js +5 -1
- package/lib/commonjs/views/SkiaPictureView.js.map +1 -1
- package/lib/commonjs/views/types.d.ts +2 -0
- package/lib/commonjs/views/types.js.map +1 -1
- package/lib/module/skia/types/Image/ColorType.d.ts +21 -0
- package/lib/module/skia/types/Image/ColorType.js +23 -0
- package/lib/module/skia/types/Image/ColorType.js.map +1 -0
- package/lib/module/skia/types/Image/ColorType.web.d.ts +19 -0
- package/lib/module/skia/types/Image/ColorType.web.js +21 -0
- package/lib/module/skia/types/Image/ColorType.web.js.map +1 -0
- 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 +19 -19
- package/lib/module/skia/types/Image/ImageFactory.js +0 -20
- package/lib/module/skia/types/Image/ImageFactory.js.map +1 -1
- package/lib/module/skia/types/Image/index.d.ts +1 -0
- package/lib/module/skia/types/Image/index.js +1 -0
- package/lib/module/skia/types/Image/index.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/module/specs/SkiaPictureViewNativeComponent.d.ts +1 -0
- package/lib/module/specs/SkiaPictureViewNativeComponent.js.map +1 -1
- package/lib/module/views/SkiaDomView.js +3 -1
- package/lib/module/views/SkiaDomView.js.map +1 -1
- package/lib/module/views/SkiaPictureView.js +5 -1
- package/lib/module/views/SkiaPictureView.js.map +1 -1
- package/lib/module/views/types.d.ts +2 -0
- package/lib/module/views/types.js.map +1 -1
- package/lib/typescript/lib/commonjs/skia/types/Image/ColorType.d.ts +2 -0
- package/lib/typescript/lib/commonjs/skia/types/Image/ColorType.web.d.ts +2 -0
- package/lib/typescript/lib/commonjs/skia/types/Image/ImageFactory.d.ts +0 -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/Image/ColorType.d.ts +1 -0
- package/lib/typescript/lib/module/skia/types/Image/ColorType.web.d.ts +1 -0
- package/lib/typescript/lib/module/skia/types/Image/ImageFactory.d.ts +0 -1
- package/lib/typescript/lib/module/skia/types/Image/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/ColorType.d.ts +21 -0
- package/lib/typescript/src/skia/types/Image/ColorType.web.d.ts +19 -0
- package/lib/typescript/src/skia/types/Image/Image.d.ts +10 -0
- package/lib/typescript/src/skia/types/Image/ImageFactory.d.ts +19 -19
- package/lib/typescript/src/skia/types/Image/index.d.ts +1 -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/lib/typescript/src/specs/SkiaPictureViewNativeComponent.d.ts +1 -0
- package/lib/typescript/src/views/types.d.ts +2 -0
- package/package.json +1 -1
- package/src/renderer/__tests__/e2e/Matrix4.spec.tsx +93 -0
- package/src/skia/__tests__/Enums.spec.ts +2 -2
- package/src/skia/types/Image/ColorType.ts +21 -0
- package/src/skia/types/Image/ColorType.web.ts +19 -0
- package/src/skia/types/Image/Image.ts +11 -0
- package/src/skia/types/Image/ImageFactory.ts +25 -20
- package/src/skia/types/Image/index.ts +1 -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/src/specs/SkiaPictureViewNativeComponent.ts +1 -0
- package/src/views/SkiaDomView.tsx +2 -1
- package/src/views/SkiaPictureView.tsx +4 -1
- package/src/views/types.ts +3 -0
- package/cpp/jsi/JsiValueWrapper.h +0 -164
- package/ios/RNSkia-iOS/SkiaMetalSurfaceFactory.h +0 -128
- package/ios/RNSkia-iOS/SkiaMetalSurfaceFactory.mm +0 -92
|
@@ -29,12 +29,14 @@ public:
|
|
|
29
29
|
}
|
|
30
30
|
|
|
31
31
|
protected:
|
|
32
|
-
virtual void surfaceAvailable(jobject surface, int width, int height
|
|
33
|
-
|
|
32
|
+
virtual void surfaceAvailable(jobject surface, int width, int height,
|
|
33
|
+
bool opaque) {
|
|
34
|
+
_skiaAndroidView->surfaceAvailable(surface, width, height, opaque);
|
|
34
35
|
}
|
|
35
36
|
|
|
36
|
-
virtual void surfaceSizeChanged(jobject surface, int width, int height
|
|
37
|
-
|
|
37
|
+
virtual void surfaceSizeChanged(jobject surface, int width, int height,
|
|
38
|
+
bool opaque) {
|
|
39
|
+
_skiaAndroidView->surfaceSizeChanged(surface, width, height, opaque);
|
|
38
40
|
}
|
|
39
41
|
|
|
40
42
|
virtual void surfaceDestroyed() { _skiaAndroidView->surfaceDestroyed(); }
|
|
@@ -53,7 +55,6 @@ protected:
|
|
|
53
55
|
_skiaAndroidView->getSkiaView()->getNativeId(), nullptr);
|
|
54
56
|
getSkiaManager()->unregisterSkiaView(
|
|
55
57
|
_skiaAndroidView->getSkiaView()->getNativeId());
|
|
56
|
-
_skiaAndroidView->viewDidUnmount();
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
private:
|
|
@@ -46,12 +46,14 @@ public:
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
protected:
|
|
49
|
-
void surfaceAvailable(jobject surface, int width, int height
|
|
50
|
-
|
|
49
|
+
void surfaceAvailable(jobject surface, int width, int height,
|
|
50
|
+
bool opaque) override {
|
|
51
|
+
JniSkiaBaseView::surfaceAvailable(surface, width, height, opaque);
|
|
51
52
|
}
|
|
52
53
|
|
|
53
|
-
void surfaceSizeChanged(jobject surface, int width, int height
|
|
54
|
-
|
|
54
|
+
void surfaceSizeChanged(jobject surface, int width, int height,
|
|
55
|
+
bool opaque) override {
|
|
56
|
+
JniSkiaBaseView::surfaceSizeChanged(surface, width, height, opaque);
|
|
55
57
|
}
|
|
56
58
|
|
|
57
59
|
void surfaceDestroyed() override { JniSkiaBaseView::surfaceDestroyed(); }
|
|
@@ -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;
|
|
@@ -48,12 +48,14 @@ public:
|
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
protected:
|
|
51
|
-
void surfaceAvailable(jobject surface, int width, int height
|
|
52
|
-
|
|
51
|
+
void surfaceAvailable(jobject surface, int width, int height,
|
|
52
|
+
bool opaque) override {
|
|
53
|
+
JniSkiaBaseView::surfaceAvailable(surface, width, height, opaque);
|
|
53
54
|
}
|
|
54
55
|
|
|
55
|
-
void surfaceSizeChanged(jobject surface, int width, int height
|
|
56
|
-
|
|
56
|
+
void surfaceSizeChanged(jobject surface, int width, int height,
|
|
57
|
+
bool opaque) override {
|
|
58
|
+
JniSkiaBaseView::surfaceSizeChanged(surface, width, height, opaque);
|
|
57
59
|
}
|
|
58
60
|
|
|
59
61
|
void surfaceDestroyed() override { JniSkiaBaseView::surfaceDestroyed(); }
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
#pragma once
|
|
2
2
|
|
|
3
3
|
#include <android/looper.h>
|
|
4
|
+
#include <queue>
|
|
4
5
|
#include <unistd.h>
|
|
5
6
|
|
|
6
7
|
class MainThreadDispatcher {
|
|
@@ -27,6 +28,8 @@ public:
|
|
|
27
28
|
return instance;
|
|
28
29
|
}
|
|
29
30
|
|
|
31
|
+
bool isOnMainThread() { return ALooper_forThread() == mainLooper; }
|
|
32
|
+
|
|
30
33
|
void post(std::function<void()> task) {
|
|
31
34
|
// TODO: this is disabled for now but we can clean this up
|
|
32
35
|
// if (ALooper_forThread() == mainLooper) {
|
|
@@ -16,6 +16,36 @@
|
|
|
16
16
|
|
|
17
17
|
namespace RNSkia {
|
|
18
18
|
|
|
19
|
+
class OpenGLSharedContext {
|
|
20
|
+
public:
|
|
21
|
+
OpenGLSharedContext(const OpenGLSharedContext &) = delete;
|
|
22
|
+
OpenGLSharedContext &operator=(const OpenGLSharedContext &) = delete;
|
|
23
|
+
|
|
24
|
+
static OpenGLSharedContext &getInstance() {
|
|
25
|
+
static OpenGLSharedContext instance;
|
|
26
|
+
return instance;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
gl::Display *getDisplay() { return _glDisplay.get(); }
|
|
30
|
+
gl::Context *getContext() { return _glContext.get(); }
|
|
31
|
+
gl::Surface *getSurface() { return _glSurface.get(); };
|
|
32
|
+
EGLConfig getConfig() { return _glConfig; }
|
|
33
|
+
|
|
34
|
+
private:
|
|
35
|
+
std::unique_ptr<gl::Display> _glDisplay;
|
|
36
|
+
std::unique_ptr<gl::Context> _glContext;
|
|
37
|
+
std::unique_ptr<gl::Surface> _glSurface;
|
|
38
|
+
EGLConfig _glConfig;
|
|
39
|
+
|
|
40
|
+
OpenGLSharedContext() {
|
|
41
|
+
_glDisplay = std::make_unique<gl::Display>();
|
|
42
|
+
_glConfig = _glDisplay->chooseConfig();
|
|
43
|
+
_glContext = _glDisplay->makeContext(_glConfig, nullptr);
|
|
44
|
+
_glSurface = _glDisplay->makePixelBufferSurface(_glConfig, 1, 1);
|
|
45
|
+
_glContext->makeCurrent(_glSurface.get());
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
19
49
|
class OpenGLContext {
|
|
20
50
|
public:
|
|
21
51
|
friend class OpenGLWindowContext;
|
|
@@ -39,8 +69,11 @@ public:
|
|
|
39
69
|
}
|
|
40
70
|
|
|
41
71
|
// Create texture
|
|
72
|
+
auto GL_RGBA8 = 0x8058;
|
|
73
|
+
auto format = GrBackendFormats::MakeGL(GL_RGBA8, GL_TEXTURE_2D);
|
|
42
74
|
auto texture = _directContext->createBackendTexture(
|
|
43
|
-
width, height,
|
|
75
|
+
width, height, format, SkColors::kTransparent, skgpu::Mipmapped::kNo,
|
|
76
|
+
GrRenderable::kYes);
|
|
44
77
|
|
|
45
78
|
if (!texture.isValid()) {
|
|
46
79
|
RNSkLogger::logToConsole("couldn't create offscreen texture %dx%d", width,
|
|
@@ -128,24 +161,26 @@ public:
|
|
|
128
161
|
// TODO: remove width, height
|
|
129
162
|
std::unique_ptr<WindowContext> MakeWindow(ANativeWindow *window, int width,
|
|
130
163
|
int height) {
|
|
164
|
+
auto display = OpenGLSharedContext::getInstance().getDisplay();
|
|
131
165
|
return std::make_unique<OpenGLWindowContext>(
|
|
132
|
-
_directContext.get(),
|
|
166
|
+
_directContext.get(), display, _glContext.get(), window,
|
|
167
|
+
OpenGLSharedContext::getInstance().getConfig());
|
|
133
168
|
}
|
|
134
169
|
|
|
135
170
|
GrDirectContext *getDirectContext() { return _directContext.get(); }
|
|
171
|
+
void makeCurrent() { _glContext->makeCurrent(_glSurface.get()); }
|
|
136
172
|
|
|
137
173
|
private:
|
|
138
|
-
EGLConfig _glConfig;
|
|
139
|
-
std::unique_ptr<gl::Display> _glDisplay;
|
|
140
174
|
std::unique_ptr<gl::Context> _glContext;
|
|
141
175
|
std::unique_ptr<gl::Surface> _glSurface;
|
|
142
176
|
sk_sp<GrDirectContext> _directContext;
|
|
143
177
|
|
|
144
178
|
OpenGLContext() {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
179
|
+
auto display = OpenGLSharedContext::getInstance().getDisplay();
|
|
180
|
+
auto sharedContext = OpenGLSharedContext::getInstance().getContext();
|
|
181
|
+
auto glConfig = OpenGLSharedContext::getInstance().getConfig();
|
|
182
|
+
_glContext = display->makeContext(glConfig, sharedContext);
|
|
183
|
+
_glSurface = display->makePixelBufferSurface(glConfig, 1, 1);
|
|
149
184
|
_glContext->makeCurrent(_glSurface.get());
|
|
150
185
|
auto backendInterface = GrGLMakeNativeInterface();
|
|
151
186
|
_directContext = GrDirectContexts::MakeGL(backendInterface);
|
|
@@ -156,4 +191,4 @@ private:
|
|
|
156
191
|
}
|
|
157
192
|
};
|
|
158
193
|
|
|
159
|
-
} // namespace RNSkia
|
|
194
|
+
} // namespace RNSkia
|
|
@@ -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();
|
|
@@ -11,18 +11,18 @@ namespace RNSkia {
|
|
|
11
11
|
|
|
12
12
|
class RNSkBaseAndroidView {
|
|
13
13
|
public:
|
|
14
|
-
virtual void surfaceAvailable(jobject surface, int width, int height
|
|
14
|
+
virtual void surfaceAvailable(jobject surface, int width, int height,
|
|
15
|
+
bool opaque) = 0;
|
|
15
16
|
|
|
16
17
|
virtual void surfaceDestroyed() = 0;
|
|
17
18
|
|
|
18
|
-
virtual void surfaceSizeChanged(jobject surface, int width, int height
|
|
19
|
+
virtual void surfaceSizeChanged(jobject surface, int width, int height,
|
|
20
|
+
bool opaque) = 0;
|
|
19
21
|
|
|
20
22
|
virtual float getPixelDensity() = 0;
|
|
21
23
|
|
|
22
24
|
virtual void setShowDebugInfo(bool show) = 0;
|
|
23
25
|
|
|
24
|
-
virtual void viewDidUnmount() = 0;
|
|
25
|
-
|
|
26
26
|
virtual std::shared_ptr<RNSkView> getSkiaView() = 0;
|
|
27
27
|
};
|
|
28
28
|
|
|
@@ -34,12 +34,10 @@ public:
|
|
|
34
34
|
std::make_shared<RNSkOpenGLCanvasProvider>(
|
|
35
35
|
std::bind(&RNSkia::RNSkView::requestRedraw, this), context)) {}
|
|
36
36
|
|
|
37
|
-
void surfaceAvailable(jobject surface, int width, int height
|
|
37
|
+
void surfaceAvailable(jobject surface, int width, int height,
|
|
38
|
+
bool opaque) override {
|
|
38
39
|
std::static_pointer_cast<RNSkOpenGLCanvasProvider>(T::getCanvasProvider())
|
|
39
|
-
->surfaceAvailable(surface, width, height);
|
|
40
|
-
|
|
41
|
-
// Try to render directly when the surface has been set so that
|
|
42
|
-
// we don't have to wait until the draw loop returns.
|
|
40
|
+
->surfaceAvailable(surface, width, height, opaque);
|
|
43
41
|
RNSkView::redraw();
|
|
44
42
|
}
|
|
45
43
|
|
|
@@ -48,9 +46,10 @@ public:
|
|
|
48
46
|
->surfaceDestroyed();
|
|
49
47
|
}
|
|
50
48
|
|
|
51
|
-
void surfaceSizeChanged(jobject surface, int width, int height
|
|
49
|
+
void surfaceSizeChanged(jobject surface, int width, int height,
|
|
50
|
+
bool opaque) override {
|
|
52
51
|
std::static_pointer_cast<RNSkOpenGLCanvasProvider>(T::getCanvasProvider())
|
|
53
|
-
->surfaceSizeChanged(surface, width, height);
|
|
52
|
+
->surfaceSizeChanged(surface, width, height, opaque);
|
|
54
53
|
// This is only need for the first time to frame, this renderImmediate call
|
|
55
54
|
// will invoke updateTexImage for the previous frame
|
|
56
55
|
RNSkView::redraw();
|
|
@@ -62,8 +61,6 @@ public:
|
|
|
62
61
|
|
|
63
62
|
void setShowDebugInfo(bool show) override { T::setShowDebugOverlays(show); }
|
|
64
63
|
|
|
65
|
-
void viewDidUnmount() override {}
|
|
66
|
-
|
|
67
64
|
std::shared_ptr<RNSkView> getSkiaView() override {
|
|
68
65
|
return T::shared_from_this();
|
|
69
66
|
}
|
|
@@ -46,22 +46,24 @@ float RNSkOpenGLCanvasProvider::getScaledHeight() {
|
|
|
46
46
|
|
|
47
47
|
bool RNSkOpenGLCanvasProvider::renderToCanvas(
|
|
48
48
|
const std::function<void(SkCanvas *)> &cb) {
|
|
49
|
-
JNIEnv *env = facebook::jni::Environment::current();
|
|
50
49
|
if (_surfaceHolder != nullptr && cb != nullptr) {
|
|
51
50
|
// Get the surface
|
|
52
51
|
auto surface = _surfaceHolder->getSurface();
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
52
|
+
if (_jSurfaceTexture) {
|
|
53
|
+
JNIEnv *env = facebook::jni::Environment::current();
|
|
54
|
+
env->CallVoidMethod(_jSurfaceTexture, _updateTexImageMethod);
|
|
55
|
+
|
|
56
|
+
// Check for exceptions
|
|
57
|
+
if (env->ExceptionCheck()) {
|
|
58
|
+
RNSkLogger::logToConsole(
|
|
59
|
+
"updateAndRelease() failed. The exception above "
|
|
60
|
+
"can safely be ignored");
|
|
61
|
+
env->ExceptionClear();
|
|
62
|
+
}
|
|
60
63
|
}
|
|
61
64
|
if (surface) {
|
|
62
65
|
// Draw into canvas using callback
|
|
63
66
|
cb(surface->getCanvas());
|
|
64
|
-
|
|
65
67
|
// Swap buffers and show on screen
|
|
66
68
|
_surfaceHolder->present();
|
|
67
69
|
return true;
|
|
@@ -74,32 +76,36 @@ bool RNSkOpenGLCanvasProvider::renderToCanvas(
|
|
|
74
76
|
}
|
|
75
77
|
|
|
76
78
|
void RNSkOpenGLCanvasProvider::surfaceAvailable(jobject jSurfaceTexture,
|
|
77
|
-
int width, int height
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
79
|
+
int width, int height,
|
|
80
|
+
bool opaque) {
|
|
81
|
+
// Release the old surface
|
|
82
|
+
_surfaceHolder = nullptr;
|
|
83
|
+
|
|
82
84
|
// Create renderer!
|
|
85
|
+
ANativeWindow *window = nullptr;
|
|
83
86
|
JNIEnv *env = facebook::jni::Environment::current();
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
87
|
+
if (!opaque) {
|
|
88
|
+
_jSurfaceTexture = env->NewGlobalRef(jSurfaceTexture);
|
|
89
|
+
jclass surfaceClass = env->FindClass("android/view/Surface");
|
|
90
|
+
jmethodID surfaceConstructor = env->GetMethodID(
|
|
91
|
+
surfaceClass, "<init>", "(Landroid/graphics/SurfaceTexture;)V");
|
|
92
|
+
// Create a new Surface instance
|
|
93
|
+
auto jSurface =
|
|
94
|
+
env->NewObject(surfaceClass, surfaceConstructor, jSurfaceTexture);
|
|
95
|
+
window = ANativeWindow_fromSurface(env, jSurface);
|
|
96
|
+
|
|
97
|
+
jclass surfaceTextureClass = env->GetObjectClass(_jSurfaceTexture);
|
|
98
|
+
_updateTexImageMethod =
|
|
99
|
+
env->GetMethodID(surfaceTextureClass, "updateTexImage", "()V");
|
|
100
|
+
|
|
101
|
+
// Acquire the native window from the Surface
|
|
102
|
+
// Clean up local references
|
|
103
|
+
env->DeleteLocalRef(jSurface);
|
|
104
|
+
env->DeleteLocalRef(surfaceClass);
|
|
105
|
+
env->DeleteLocalRef(surfaceTextureClass);
|
|
106
|
+
} else {
|
|
107
|
+
window = ANativeWindow_fromSurface(env, jSurfaceTexture);
|
|
108
|
+
}
|
|
103
109
|
#if defined(SK_GRAPHITE)
|
|
104
110
|
_surfaceHolder = DawnContext::getInstance().MakeWindow(window, width, height);
|
|
105
111
|
#else
|
|
@@ -121,8 +127,8 @@ void RNSkOpenGLCanvasProvider::surfaceDestroyed() {
|
|
|
121
127
|
}
|
|
122
128
|
}
|
|
123
129
|
|
|
124
|
-
void RNSkOpenGLCanvasProvider::surfaceSizeChanged(jobject
|
|
125
|
-
int
|
|
130
|
+
void RNSkOpenGLCanvasProvider::surfaceSizeChanged(jobject jSurface, int width,
|
|
131
|
+
int height, bool opaque) {
|
|
126
132
|
if (width == 0 && height == 0) {
|
|
127
133
|
// Setting width/height to zero is nothing we need to care about when
|
|
128
134
|
// it comes to invalidating the surface.
|
|
@@ -131,7 +137,7 @@ void RNSkOpenGLCanvasProvider::surfaceSizeChanged(jobject jSurfaceTexture,
|
|
|
131
137
|
|
|
132
138
|
if (_surfaceHolder == nullptr) {
|
|
133
139
|
_surfaceHolder = nullptr;
|
|
134
|
-
surfaceAvailable(
|
|
140
|
+
surfaceAvailable(jSurface, width, height, opaque);
|
|
135
141
|
} else {
|
|
136
142
|
_surfaceHolder->resize(width, height);
|
|
137
143
|
}
|
|
@@ -27,11 +27,11 @@ public:
|
|
|
27
27
|
|
|
28
28
|
bool renderToCanvas(const std::function<void(SkCanvas *)> &cb) override;
|
|
29
29
|
|
|
30
|
-
void surfaceAvailable(jobject surface, int width, int height);
|
|
30
|
+
void surfaceAvailable(jobject surface, int width, int height, bool opaque);
|
|
31
31
|
|
|
32
32
|
void surfaceDestroyed();
|
|
33
33
|
|
|
34
|
-
void surfaceSizeChanged(jobject jSurface, int width, int height);
|
|
34
|
+
void surfaceSizeChanged(jobject jSurface, int width, int height, bool opaque);
|
|
35
35
|
|
|
36
36
|
private:
|
|
37
37
|
std::unique_ptr<WindowContext> _surfaceHolder = nullptr;
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
package com.shopify.reactnative.skia;
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
import android.annotation.SuppressLint;
|
|
5
|
+
import android.content.Context;
|
|
6
|
+
import android.graphics.Bitmap;
|
|
7
|
+
import android.graphics.Canvas;
|
|
8
|
+
import android.graphics.Matrix;
|
|
9
|
+
import android.graphics.PixelFormat;
|
|
10
|
+
import android.hardware.HardwareBuffer;
|
|
11
|
+
import android.media.Image;
|
|
12
|
+
import android.media.ImageReader;
|
|
13
|
+
import android.os.Build;
|
|
14
|
+
import android.util.Log;
|
|
15
|
+
import android.view.View;
|
|
16
|
+
|
|
17
|
+
import androidx.annotation.NonNull;
|
|
18
|
+
import androidx.annotation.RequiresApi;
|
|
19
|
+
|
|
20
|
+
@SuppressLint("ViewConstructor")
|
|
21
|
+
@RequiresApi(api = Build.VERSION_CODES.Q)
|
|
22
|
+
public class SkiaAHBView extends View implements ImageReader.OnImageAvailableListener {
|
|
23
|
+
|
|
24
|
+
private ImageReader mReader;
|
|
25
|
+
|
|
26
|
+
private Bitmap mBitmap = null;
|
|
27
|
+
|
|
28
|
+
private final Matrix matrix = new Matrix();
|
|
29
|
+
|
|
30
|
+
SkiaViewAPI mApi;
|
|
31
|
+
boolean mDebug;
|
|
32
|
+
|
|
33
|
+
public SkiaAHBView(Context context, SkiaViewAPI api, boolean debug) {
|
|
34
|
+
super(context);
|
|
35
|
+
mApi = api;
|
|
36
|
+
mDebug = debug;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
private ImageReader createReader() {
|
|
40
|
+
ImageReader reader = ImageReader.newInstance(getWidth(), getHeight(), PixelFormat.RGBA_8888, 2, HardwareBuffer.USAGE_GPU_SAMPLED_IMAGE |
|
|
41
|
+
HardwareBuffer.USAGE_GPU_COLOR_OUTPUT);
|
|
42
|
+
reader.setOnImageAvailableListener(this, null);
|
|
43
|
+
return reader;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
@Override
|
|
47
|
+
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
|
|
48
|
+
super.onLayout(changed, left, top, right, bottom);
|
|
49
|
+
int width = getWidth();
|
|
50
|
+
int height = getHeight();
|
|
51
|
+
if (mReader == null) {
|
|
52
|
+
mReader = createReader();
|
|
53
|
+
mApi.onSurfaceCreated(mReader.getSurface(), width, height);
|
|
54
|
+
} else {
|
|
55
|
+
mReader = createReader();
|
|
56
|
+
mApi.onSurfaceChanged(mReader.getSurface(), width, height);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
@Override
|
|
61
|
+
public void onImageAvailable(ImageReader reader) {
|
|
62
|
+
try (Image image = reader.acquireLatestImage()) {
|
|
63
|
+
if (image != null) {
|
|
64
|
+
HardwareBuffer hb = image.getHardwareBuffer();
|
|
65
|
+
if (mDebug) {
|
|
66
|
+
textureUpdated(image.getTimestamp());
|
|
67
|
+
}
|
|
68
|
+
if (hb != null) {
|
|
69
|
+
Bitmap bitmap = Bitmap.wrapHardwareBuffer(hb, null);
|
|
70
|
+
if (bitmap != null) {
|
|
71
|
+
mBitmap = bitmap;
|
|
72
|
+
hb.close();
|
|
73
|
+
invalidate();
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
@Override
|
|
81
|
+
protected void onDraw(@NonNull Canvas canvas) {
|
|
82
|
+
super.onDraw(canvas);
|
|
83
|
+
if (mBitmap != null) {
|
|
84
|
+
float viewWidth = getWidth();
|
|
85
|
+
float viewHeight = getHeight();
|
|
86
|
+
float bitmapWidth = mBitmap.getWidth();
|
|
87
|
+
float bitmapHeight = mBitmap.getHeight();
|
|
88
|
+
|
|
89
|
+
// Calculate the scale factors
|
|
90
|
+
float scaleX = viewWidth / bitmapWidth;
|
|
91
|
+
float scaleY = viewHeight / bitmapHeight;
|
|
92
|
+
|
|
93
|
+
// Reset the matrix and apply scaling
|
|
94
|
+
matrix.reset();
|
|
95
|
+
matrix.setScale(scaleX, scaleY);
|
|
96
|
+
|
|
97
|
+
canvas.drawBitmap(mBitmap, matrix, null);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
private long _prevTimestamp = 0;
|
|
102
|
+
public void textureUpdated(long ts) {
|
|
103
|
+
long frameDuration = (ts - _prevTimestamp)/1000000;
|
|
104
|
+
Log.i("SkiaAHBView", "onSurfaceTextureUpdated "+frameDuration+"ms");
|
|
105
|
+
_prevTimestamp = ts;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
@Override
|
|
109
|
+
protected void onDetachedFromWindow() {
|
|
110
|
+
super.onDetachedFromWindow();
|
|
111
|
+
mApi.onSurfaceDestroyed();
|
|
112
|
+
}
|
|
113
|
+
}
|