@shopify/react-native-skia 1.5.6 → 1.5.8
Sign up to get free protection for your applications and to get access to all the features.
- package/android/CMakeLists.txt +1 -1
- package/android/cpp/jni/include/JniSkiaBaseView.h +2 -2
- package/android/cpp/jni/include/JniSkiaDomView.h +2 -2
- package/android/cpp/jni/include/JniSkiaPictureView.h +2 -2
- package/android/cpp/rnskia-android/OpenGLContext.h +5 -1
- package/android/cpp/rnskia-android/OpenGLWindowContext.cpp +20 -49
- package/android/cpp/rnskia-android/OpenGLWindowContext.h +13 -16
- package/android/cpp/rnskia-android/RNSkAndroidPlatformContext.h +6 -0
- package/android/cpp/rnskia-android/RNSkAndroidView.h +3 -3
- package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.cpp +13 -4
- package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.h +1 -1
- package/android/cpp/rnskia-android/gl/Display.h +4 -0
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseView.java +7 -7
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaDomView.java +1 -3
- package/android/src/main/java/com/shopify/reactnative/skia/SkiaPictureView.java +1 -3
- package/cpp/api/JsiSkImage.h +20 -4
- package/cpp/rnskia/RNSkPlatformContext.h +4 -0
- package/cpp/rnskia/RNSkView.h +5 -2
- package/ios/RNSkia-iOS/MetalContext.h +2 -0
- package/ios/RNSkia-iOS/RNSkiOSPlatformContext.h +3 -0
- package/ios/RNSkia-iOS/RNSkiOSPlatformContext.mm +6 -0
- package/ios/RNSkia-iOS/SkiaMetalSurfaceFactory.h +2 -2
- package/package.json +1 -1
- package/react-native-skia.podspec +2 -2
- package/src/renderer/__tests__/e2e/Image.spec.tsx +2 -64
- package/src/skia/__tests__/assets/oslo-mini.jpg +0 -0
- package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaDrawViewManagerInterface.java +0 -18
package/android/CMakeLists.txt
CHANGED
@@ -4,7 +4,7 @@ cmake_minimum_required(VERSION 3.4.1)
|
|
4
4
|
set (CMAKE_VERBOSE_MAKEFILE ON)
|
5
5
|
set (CMAKE_CXX_STANDARD 17)
|
6
6
|
set(SK_GRAPHITE OFF)
|
7
|
-
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSK_BUILD_FOR_ANDROID -DFOLLY_NO_CONFIG=1 -DFOLLY_HAVE_CLOCK_GETTIME=1 -DFOLLY_HAVE_MEMRCHR=1 -DFOLLY_USE_LIBCPP=1 -DFOLLY_MOBILE=1 -DON_ANDROID -DONANDROID")
|
7
|
+
set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSK_BUILD_FOR_ANDROID -DSK_IMAGE_READ_PIXELS_DISABLE_LEGACY_API -DFOLLY_NO_CONFIG=1 -DFOLLY_HAVE_CLOCK_GETTIME=1 -DFOLLY_HAVE_MEMRCHR=1 -DFOLLY_USE_LIBCPP=1 -DFOLLY_MOBILE=1 -DON_ANDROID -DONANDROID")
|
8
8
|
set (PACKAGE_NAME "rnskia")
|
9
9
|
set (SKIA_LIB "skia")
|
10
10
|
set (SKIA_SVG_LIB "svg")
|
@@ -33,8 +33,8 @@ protected:
|
|
33
33
|
_skiaAndroidView->surfaceAvailable(surface, width, height);
|
34
34
|
}
|
35
35
|
|
36
|
-
virtual void surfaceSizeChanged(int width, int height) {
|
37
|
-
_skiaAndroidView->surfaceSizeChanged(width, height);
|
36
|
+
virtual void surfaceSizeChanged(jobject surface, int width, int height) {
|
37
|
+
_skiaAndroidView->surfaceSizeChanged(surface, width, height);
|
38
38
|
}
|
39
39
|
|
40
40
|
virtual void surfaceDestroyed() { _skiaAndroidView->surfaceDestroyed(); }
|
@@ -51,8 +51,8 @@ protected:
|
|
51
51
|
JniSkiaBaseView::surfaceAvailable(surface, width, height);
|
52
52
|
}
|
53
53
|
|
54
|
-
void surfaceSizeChanged(int width, int height) override {
|
55
|
-
JniSkiaBaseView::surfaceSizeChanged(width, height);
|
54
|
+
void surfaceSizeChanged(jobject surface, int width, int height) override {
|
55
|
+
JniSkiaBaseView::surfaceSizeChanged(surface, width, height);
|
56
56
|
}
|
57
57
|
|
58
58
|
void surfaceDestroyed() override { JniSkiaBaseView::surfaceDestroyed(); }
|
@@ -53,8 +53,8 @@ protected:
|
|
53
53
|
JniSkiaBaseView::surfaceAvailable(surface, width, height);
|
54
54
|
}
|
55
55
|
|
56
|
-
void surfaceSizeChanged(int width, int height) override {
|
57
|
-
JniSkiaBaseView::surfaceSizeChanged(width, height);
|
56
|
+
void surfaceSizeChanged(jobject surface, int width, int height) override {
|
57
|
+
JniSkiaBaseView::surfaceSizeChanged(surface, width, height);
|
58
58
|
}
|
59
59
|
|
60
60
|
void surfaceDestroyed() override { JniSkiaBaseView::surfaceDestroyed(); }
|
@@ -125,11 +125,15 @@ public:
|
|
125
125
|
#endif
|
126
126
|
}
|
127
127
|
|
128
|
+
// TODO: remove width, height
|
128
129
|
std::unique_ptr<WindowContext> MakeWindow(ANativeWindow *window, int width,
|
129
130
|
int height) {
|
130
|
-
return std::make_unique<OpenGLWindowContext>(
|
131
|
+
return std::make_unique<OpenGLWindowContext>(
|
132
|
+
_directContext.get(), _glDisplay.get(), _glContext.get(), window);
|
131
133
|
}
|
132
134
|
|
135
|
+
GrDirectContext *getDirectContext() { return _directContext.get(); }
|
136
|
+
|
133
137
|
private:
|
134
138
|
EGLConfig _glConfig;
|
135
139
|
std::unique_ptr<gl::Display> _glDisplay;
|
@@ -16,74 +16,45 @@ namespace RNSkia {
|
|
16
16
|
|
17
17
|
sk_sp<SkSurface> OpenGLWindowContext::getSurface() {
|
18
18
|
if (_skSurface == nullptr) {
|
19
|
-
|
20
|
-
struct ReleaseContext {
|
21
|
-
std::unique_ptr<gl::Surface> surface = nullptr;
|
22
|
-
};
|
23
|
-
|
24
|
-
if (!_window) {
|
25
|
-
throw std::runtime_error("No native window provided");
|
26
|
-
}
|
27
|
-
auto releaseCtx = new ReleaseContext();
|
28
|
-
releaseCtx->surface =
|
29
|
-
_context->_glDisplay->makeWindowSurface(_context->_glConfig, _window);
|
30
|
-
if (!releaseCtx->surface) {
|
31
|
-
throw std::runtime_error("Failed to create window surface");
|
32
|
-
}
|
33
|
-
_glSurface = releaseCtx->surface.get();
|
34
|
-
|
35
|
-
// Now make this one current
|
36
|
-
auto success = _context->_glContext->makeCurrent(releaseCtx->surface.get());
|
37
|
-
if (!success) {
|
38
|
-
throw std::runtime_error("Failed to make window surface current");
|
39
|
-
}
|
40
|
-
|
41
|
-
// Set up parameters for the render target so that it
|
42
|
-
// matches the underlying OpenGL context.
|
43
|
-
GrGLFramebufferInfo fboInfo;
|
44
|
-
|
45
|
-
// We pass 0 as the framebuffer id, since the
|
46
|
-
// underlying Skia GrGlGpu will read this when wrapping the context in the
|
47
|
-
// render target and the GrGlGpu object.
|
48
|
-
fboInfo.fFBOID = 0;
|
49
|
-
fboInfo.fFormat = 0x8058; // GL_RGBA8
|
50
|
-
|
19
|
+
_glContext->makeCurrent(_glSurface.get());
|
51
20
|
GLint stencil;
|
52
21
|
glGetIntegerv(GL_STENCIL_BITS, &stencil);
|
53
22
|
|
54
23
|
GLint samples;
|
55
24
|
glGetIntegerv(GL_SAMPLES, &samples);
|
56
25
|
|
57
|
-
auto colorType =
|
26
|
+
auto colorType = kRGBA_8888_SkColorType;
|
58
27
|
|
59
28
|
auto maxSamples =
|
60
|
-
|
29
|
+
_directContext->maxSurfaceSampleCountForColorType(colorType);
|
61
30
|
|
62
31
|
if (samples > maxSamples) {
|
63
32
|
samples = maxSamples;
|
64
33
|
}
|
65
34
|
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
35
|
+
GrGLFramebufferInfo fbInfo;
|
36
|
+
fbInfo.fFBOID = 0;
|
37
|
+
fbInfo.fFormat = GR_GL_RGBA8;
|
38
|
+
// fbInfo.fProtected =
|
39
|
+
// skgpu::Protected(fDisplayParams.fCreateProtectedNativeBackend);
|
40
|
+
|
41
|
+
auto width = ANativeWindow_getWidth(_window);
|
42
|
+
auto height = ANativeWindow_getHeight(_window);
|
43
|
+
auto backendRT =
|
44
|
+
GrBackendRenderTargets::MakeGL(width, height, samples, stencil, fbInfo);
|
45
|
+
sk_sp<SkColorSpace> colorSpace(nullptr);
|
46
|
+
SkSurfaceProps surfaceProps(0, kRGB_H_SkPixelGeometry);
|
72
47
|
_skSurface = SkSurfaces::WrapBackendRenderTarget(
|
73
|
-
|
74
|
-
|
75
|
-
[](void *addr) {
|
76
|
-
auto releaseCtx = reinterpret_cast<ReleaseContext *>(addr);
|
77
|
-
delete releaseCtx;
|
78
|
-
},
|
79
|
-
reinterpret_cast<void *>(releaseCtx));
|
48
|
+
_directContext, backendRT, kBottomLeft_GrSurfaceOrigin,
|
49
|
+
kRGBA_8888_SkColorType, colorSpace, &surfaceProps);
|
80
50
|
}
|
81
51
|
return _skSurface;
|
82
52
|
}
|
83
53
|
|
84
54
|
void OpenGLWindowContext::present() {
|
85
|
-
|
86
|
-
|
55
|
+
_glContext->makeCurrent(_glSurface.get());
|
56
|
+
// TODO: is flushAndSubmit needed here?
|
57
|
+
_directContext->flushAndSubmit();
|
87
58
|
_glSurface->present();
|
88
59
|
}
|
89
60
|
|
@@ -31,14 +31,15 @@
|
|
31
31
|
|
32
32
|
namespace RNSkia {
|
33
33
|
|
34
|
-
class OpenGLContext;
|
35
|
-
|
36
34
|
class OpenGLWindowContext : public WindowContext {
|
37
35
|
public:
|
38
|
-
OpenGLWindowContext(
|
39
|
-
|
40
|
-
:
|
36
|
+
OpenGLWindowContext(GrDirectContext *directContext, gl::Display *display,
|
37
|
+
gl::Context *glContext, ANativeWindow *window)
|
38
|
+
: _directContext(directContext), _display(display), _glContext(glContext),
|
39
|
+
_window(window) {
|
41
40
|
ANativeWindow_acquire(_window);
|
41
|
+
auto config = display->chooseConfig();
|
42
|
+
_glSurface = display->makeWindowSurface(config, _window);
|
42
43
|
}
|
43
44
|
|
44
45
|
~OpenGLWindowContext() {
|
@@ -51,23 +52,19 @@ public:
|
|
51
52
|
|
52
53
|
void present() override;
|
53
54
|
|
54
|
-
|
55
|
-
_skSurface = nullptr;
|
56
|
-
_width = width;
|
57
|
-
_height = height;
|
58
|
-
}
|
55
|
+
int getWidth() override { return ANativeWindow_getWidth(_window); };
|
59
56
|
|
60
|
-
int
|
57
|
+
int getHeight() override { return ANativeWindow_getHeight(_window); };
|
61
58
|
|
62
|
-
int
|
59
|
+
void resize(int width, int height) override { _skSurface = nullptr; }
|
63
60
|
|
64
61
|
private:
|
65
|
-
|
62
|
+
GrDirectContext *_directContext;
|
63
|
+
gl::Display *_display;
|
64
|
+
gl::Context *_glContext = nullptr;
|
66
65
|
ANativeWindow *_window;
|
67
66
|
sk_sp<SkSurface> _skSurface = nullptr;
|
68
|
-
gl::Surface
|
69
|
-
int _width = 0;
|
70
|
-
int _height = 0;
|
67
|
+
std::unique_ptr<gl::Surface> _glSurface = nullptr;
|
71
68
|
};
|
72
69
|
|
73
70
|
} // namespace RNSkia
|
@@ -152,6 +152,12 @@ public:
|
|
152
152
|
#endif
|
153
153
|
}
|
154
154
|
|
155
|
+
#if !defined(SK_GRAPHITE)
|
156
|
+
GrDirectContext *getDirectContext() override {
|
157
|
+
return OpenGLContext::getInstance().getDirectContext();
|
158
|
+
}
|
159
|
+
#endif
|
160
|
+
|
155
161
|
sk_sp<SkFontMgr> createFontMgr() override {
|
156
162
|
return SkFontMgr_New_Android(nullptr);
|
157
163
|
}
|
@@ -15,7 +15,7 @@ public:
|
|
15
15
|
|
16
16
|
virtual void surfaceDestroyed() = 0;
|
17
17
|
|
18
|
-
virtual void surfaceSizeChanged(int width, int height) = 0;
|
18
|
+
virtual void surfaceSizeChanged(jobject surface, int width, int height) = 0;
|
19
19
|
|
20
20
|
virtual float getPixelDensity() = 0;
|
21
21
|
|
@@ -50,9 +50,9 @@ public:
|
|
50
50
|
->surfaceDestroyed();
|
51
51
|
}
|
52
52
|
|
53
|
-
void surfaceSizeChanged(int width, int height) override {
|
53
|
+
void surfaceSizeChanged(jobject surface, int width, int height) override {
|
54
54
|
std::static_pointer_cast<RNSkOpenGLCanvasProvider>(T::getCanvasProvider())
|
55
|
-
->surfaceSizeChanged(width, height);
|
55
|
+
->surfaceSizeChanged(surface, width, height);
|
56
56
|
// This is only need for the first time to frame, this renderImmediate call
|
57
57
|
// will invoke updateTexImage for the previous frame
|
58
58
|
RNSkView::renderImmediate();
|
@@ -76,6 +76,10 @@ bool RNSkOpenGLCanvasProvider::renderToCanvas(
|
|
76
76
|
|
77
77
|
void RNSkOpenGLCanvasProvider::surfaceAvailable(jobject jSurfaceTexture,
|
78
78
|
int width, int height) {
|
79
|
+
// If the surface is 0, we can skip it
|
80
|
+
if (width == 0 && height == 0) {
|
81
|
+
return;
|
82
|
+
}
|
79
83
|
// Create renderer!
|
80
84
|
JNIEnv *env = facebook::jni::Environment::current();
|
81
85
|
|
@@ -118,17 +122,22 @@ void RNSkOpenGLCanvasProvider::surfaceDestroyed() {
|
|
118
122
|
}
|
119
123
|
}
|
120
124
|
|
121
|
-
void RNSkOpenGLCanvasProvider::surfaceSizeChanged(
|
125
|
+
void RNSkOpenGLCanvasProvider::surfaceSizeChanged(jobject jSurfaceTexture,
|
126
|
+
int width, int height) {
|
122
127
|
if (width == 0 && height == 0) {
|
123
128
|
// Setting width/height to zero is nothing we need to care about when
|
124
129
|
// it comes to invalidating the surface.
|
125
130
|
return;
|
126
131
|
}
|
127
132
|
|
128
|
-
|
129
|
-
|
133
|
+
if (_surfaceHolder == nullptr) {
|
134
|
+
_surfaceHolder = nullptr;
|
135
|
+
surfaceAvailable(jSurfaceTexture, width, height);
|
136
|
+
} else {
|
137
|
+
_surfaceHolder->resize(width, height);
|
138
|
+
}
|
130
139
|
|
131
140
|
// Redraw after size change
|
132
141
|
_requestRedraw();
|
133
142
|
}
|
134
|
-
} // namespace RNSkia
|
143
|
+
} // namespace RNSkia
|
@@ -35,6 +35,10 @@ public:
|
|
35
35
|
|
36
36
|
bool isValid() const { return _display != EGL_NO_DISPLAY; }
|
37
37
|
|
38
|
+
void clearContext() {
|
39
|
+
eglMakeCurrent(_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
|
40
|
+
}
|
41
|
+
|
38
42
|
EGLConfig chooseConfig() {
|
39
43
|
|
40
44
|
EGLint att[] = {EGL_RENDERABLE_TYPE,
|
@@ -64,7 +64,7 @@ public abstract class SkiaBaseView extends ReactViewGroup implements TextureView
|
|
64
64
|
return;
|
65
65
|
}
|
66
66
|
Log.i(tag, "onSurfaceTextureSizeChanged " + width + "/" + height);
|
67
|
-
surfaceSizeChanged(width, height);
|
67
|
+
surfaceSizeChanged(surface, width, height);
|
68
68
|
}
|
69
69
|
|
70
70
|
@Override
|
@@ -82,18 +82,18 @@ public abstract class SkiaBaseView extends ReactViewGroup implements TextureView
|
|
82
82
|
return false;
|
83
83
|
}
|
84
84
|
|
85
|
-
|
85
|
+
private long _prevTimestamp = 0;
|
86
86
|
@Override
|
87
87
|
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
88
|
+
long timestamp = surface.getTimestamp();
|
89
|
+
long frameDuration = (timestamp - _prevTimestamp)/1000000;
|
90
|
+
Log.i(tag, "onSurfaceTextureUpdated "+frameDuration+"ms");
|
91
|
+
_prevTimestamp = timestamp;
|
92
92
|
}
|
93
93
|
|
94
94
|
protected abstract void surfaceAvailable(Object surface, int width, int height);
|
95
95
|
|
96
|
-
protected abstract void surfaceSizeChanged(int width, int height);
|
96
|
+
protected abstract void surfaceSizeChanged(Object surface, int width, int height);
|
97
97
|
|
98
98
|
protected abstract void surfaceDestroyed();
|
99
99
|
|
@@ -27,7 +27,7 @@ public class SkiaDomView extends SkiaBaseView {
|
|
27
27
|
|
28
28
|
protected native void surfaceAvailable(Object surface, int width, int height);
|
29
29
|
|
30
|
-
protected native void surfaceSizeChanged(int width, int height);
|
30
|
+
protected native void surfaceSizeChanged(Object surface, int width, int height);
|
31
31
|
|
32
32
|
protected native void surfaceDestroyed();
|
33
33
|
|
@@ -37,8 +37,6 @@ public class SkiaDomView extends SkiaBaseView {
|
|
37
37
|
|
38
38
|
protected native void setDebugMode(boolean show);
|
39
39
|
|
40
|
-
protected native void updateTouchPoints(double[] points);
|
41
|
-
|
42
40
|
protected native void registerView(int nativeId);
|
43
41
|
|
44
42
|
protected native void unregisterView();
|
@@ -26,7 +26,7 @@ public class SkiaPictureView extends SkiaBaseView {
|
|
26
26
|
|
27
27
|
protected native void surfaceAvailable(Object surface, int width, int height);
|
28
28
|
|
29
|
-
protected native void surfaceSizeChanged(int width, int height);
|
29
|
+
protected native void surfaceSizeChanged(Object surface, int width, int height);
|
30
30
|
|
31
31
|
protected native void surfaceDestroyed();
|
32
32
|
|
@@ -36,8 +36,6 @@ public class SkiaPictureView extends SkiaBaseView {
|
|
36
36
|
|
37
37
|
protected native void setDebugMode(boolean show);
|
38
38
|
|
39
|
-
protected native void updateTouchPoints(double[] points);
|
40
|
-
|
41
39
|
protected native void registerView(int nativeId);
|
42
40
|
|
43
41
|
protected native void unregisterView();
|
package/cpp/api/JsiSkImage.h
CHANGED
@@ -92,7 +92,11 @@ public:
|
|
92
92
|
image = DawnContext::getInstance().MakeRasterImage(image);
|
93
93
|
#else
|
94
94
|
if (image->isTextureBacked()) {
|
95
|
-
|
95
|
+
auto grContext = getContext()->getDirectContext();
|
96
|
+
image = image->makeRasterImage(grContext);
|
97
|
+
if (!image) {
|
98
|
+
return nullptr;
|
99
|
+
}
|
96
100
|
}
|
97
101
|
#endif
|
98
102
|
sk_sp<SkData> data;
|
@@ -121,6 +125,9 @@ public:
|
|
121
125
|
|
122
126
|
JSI_HOST_FUNCTION(encodeToBytes) {
|
123
127
|
auto data = encodeImageData(arguments, count);
|
128
|
+
if (!data) {
|
129
|
+
return jsi::Value::null();
|
130
|
+
}
|
124
131
|
|
125
132
|
auto arrayCtor =
|
126
133
|
runtime.global().getPropertyAsFunction(runtime, "Uint8Array");
|
@@ -141,6 +148,9 @@ public:
|
|
141
148
|
|
142
149
|
JSI_HOST_FUNCTION(encodeToBase64) {
|
143
150
|
auto data = encodeImageData(arguments, count);
|
151
|
+
if (!data) {
|
152
|
+
return jsi::Value::null();
|
153
|
+
}
|
144
154
|
|
145
155
|
auto len = Base64::Encode(data->bytes(), data->size(), nullptr);
|
146
156
|
auto buffer = std::string(len, 0);
|
@@ -182,10 +192,15 @@ public:
|
|
182
192
|
.asObject(runtime)
|
183
193
|
.getArrayBuffer(runtime);
|
184
194
|
auto bfrPtr = reinterpret_cast<void *>(buffer.data(runtime));
|
185
|
-
|
186
|
-
|
195
|
+
#if defined(SK_GRAPHITE)
|
196
|
+
throw std::runtime_error("Not implemented yet");
|
197
|
+
#else
|
198
|
+
auto grContext = getContext()->getDirectContext();
|
199
|
+
if (!getObject()->readPixels(grContext, info, bfrPtr, bytesPerRow, srcX,
|
200
|
+
srcY)) {
|
187
201
|
return jsi::Value::null();
|
188
202
|
}
|
203
|
+
#endif
|
189
204
|
return dest;
|
190
205
|
}
|
191
206
|
|
@@ -193,7 +208,8 @@ public:
|
|
193
208
|
#if defined(SK_GRAPHITE)
|
194
209
|
auto rasterImage = DawnContext::getInstance().MakeRasterImage(getObject());
|
195
210
|
#else
|
196
|
-
auto
|
211
|
+
auto grContext = getContext()->getDirectContext();
|
212
|
+
auto rasterImage = getObject()->makeRasterImage(grContext);
|
197
213
|
#endif
|
198
214
|
return jsi::Object::createFromHostObject(
|
199
215
|
runtime, std::make_shared<JsiSkImage>(getContext(), rasterImage));
|
@@ -147,6 +147,10 @@ public:
|
|
147
147
|
*/
|
148
148
|
virtual sk_sp<SkImage> makeImageFromNativeBuffer(void *buffer) = 0;
|
149
149
|
|
150
|
+
#if !defined(SK_GRAPHITE)
|
151
|
+
virtual GrDirectContext *getDirectContext() = 0;
|
152
|
+
#endif
|
153
|
+
|
150
154
|
virtual void releaseNativeBuffer(uint64_t pointer) = 0;
|
151
155
|
|
152
156
|
virtual uint64_t makeNativeBuffer(sk_sp<SkImage> image) = 0;
|
package/cpp/rnskia/RNSkView.h
CHANGED
@@ -90,7 +90,8 @@ public:
|
|
90
90
|
RNSkOffscreenCanvasProvider(std::shared_ptr<RNSkPlatformContext> context,
|
91
91
|
std::function<void()> requestRedraw, float width,
|
92
92
|
float height)
|
93
|
-
: RNSkCanvasProvider(requestRedraw),
|
93
|
+
: RNSkCanvasProvider(requestRedraw), _context(context), _width(width),
|
94
|
+
_height(height) {
|
94
95
|
_surface = context->makeOffscreenSurface(_width, _height);
|
95
96
|
_pd = context->getPixelDensity();
|
96
97
|
}
|
@@ -113,7 +114,8 @@ public:
|
|
113
114
|
_surface->recorder()->snap().get());
|
114
115
|
return DawnContext::getInstance().MakeRasterImage(image);
|
115
116
|
#else
|
116
|
-
|
117
|
+
auto grContext = _context->getDirectContext();
|
118
|
+
return image->makeRasterImage(grContext);
|
117
119
|
#endif
|
118
120
|
}
|
119
121
|
|
@@ -140,6 +142,7 @@ private:
|
|
140
142
|
float _height;
|
141
143
|
float _pd = 1.0f;
|
142
144
|
sk_sp<SkSurface> _surface;
|
145
|
+
std::shared_ptr<RNSkPlatformContext> _context;
|
143
146
|
};
|
144
147
|
|
145
148
|
enum RNSkDrawingMode { Default, Continuous };
|
@@ -76,6 +76,9 @@ public:
|
|
76
76
|
|
77
77
|
void raiseError(const std::exception &err) override;
|
78
78
|
sk_sp<SkSurface> makeOffscreenSurface(int width, int height) override;
|
79
|
+
#if !defined(SK_GRAPHITE)
|
80
|
+
GrDirectContext *getDirectContext() override;
|
81
|
+
#endif
|
79
82
|
sk_sp<SkFontMgr> createFontMgr() override;
|
80
83
|
|
81
84
|
void willInvalidateModules() {
|
@@ -192,6 +192,12 @@ sk_sp<SkImage> RNSkiOSPlatformContext::makeImageFromNativeBuffer(void *buffer) {
|
|
192
192
|
#endif
|
193
193
|
}
|
194
194
|
|
195
|
+
#if !defined(SK_GRAPHITE)
|
196
|
+
GrDirectContext *RNSkiOSPlatformContext::getDirectContext() {
|
197
|
+
return MetalContext::getInstance().getDirectContext();
|
198
|
+
}
|
199
|
+
#endif
|
200
|
+
|
195
201
|
sk_sp<SkFontMgr> RNSkiOSPlatformContext::createFontMgr() {
|
196
202
|
return SkFontMgr_New_CoreText(nullptr);
|
197
203
|
}
|
@@ -107,8 +107,6 @@ public:
|
|
107
107
|
_skSurface = nullptr;
|
108
108
|
}
|
109
109
|
|
110
|
-
void resize(int width, int height) override { _skSurface = nullptr; }
|
111
|
-
|
112
110
|
int getWidth() override {
|
113
111
|
return _layer.frame.size.width * _layer.contentsScale;
|
114
112
|
};
|
@@ -117,6 +115,8 @@ public:
|
|
117
115
|
return _layer.frame.size.height * _layer.contentsScale;
|
118
116
|
};
|
119
117
|
|
118
|
+
void resize(int width, int height) override { _skSurface = nullptr; }
|
119
|
+
|
120
120
|
private:
|
121
121
|
SkiaMetalContext *_context;
|
122
122
|
sk_sp<SkSurface> _skSurface = nullptr;
|
package/package.json
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
"setup-skia-web": "./scripts/setup-canvaskit.js"
|
8
8
|
},
|
9
9
|
"title": "React Native Skia",
|
10
|
-
"version": "1.5.
|
10
|
+
"version": "1.5.8",
|
11
11
|
"description": "High-performance React Native Graphics using Skia",
|
12
12
|
"main": "lib/module/index.js",
|
13
13
|
"react-native": "src/index.ts",
|
@@ -9,8 +9,8 @@ use_graphite = ENV['SK_GRAPHITE'] == '1'
|
|
9
9
|
|
10
10
|
# Set preprocessor definitions based on GRAPHITE flag
|
11
11
|
preprocessor_defs = use_graphite ?
|
12
|
-
'$(inherited) SK_GRAPHITE=1' :
|
13
|
-
'$(inherited) SK_METAL=1 SK_GANESH=1'
|
12
|
+
'$(inherited) SK_GRAPHITE=1 SK_IMAGE_READ_PIXELS_DISABLE_LEGACY_API=1' :
|
13
|
+
'$(inherited) SK_METAL=1 SK_GANESH=1 SK_IMAGE_READ_PIXELS_DISABLE_LEGACY_API=1'
|
14
14
|
|
15
15
|
# Define base frameworks
|
16
16
|
base_frameworks = ['libs/ios/libskia.xcframework',
|
@@ -43,51 +43,17 @@ describe("Image loading from bundles", () => {
|
|
43
43
|
},
|
44
44
|
{
|
45
45
|
data: Array.from(
|
46
|
-
loadImage("skia/__tests__/assets/oslo.jpg").encodeToBytes()
|
46
|
+
loadImage("skia/__tests__/assets/oslo-mini.jpg").encodeToBytes()
|
47
47
|
),
|
48
48
|
}
|
49
49
|
);
|
50
50
|
expect(pixels).toBeDefined();
|
51
51
|
expect(pixels).toEqual([
|
52
|
-
|
52
|
+
171, 188, 198, 255, 171, 188, 198, 255, 171, 188, 198, 255, 171, 188, 198,
|
53
53
|
255,
|
54
54
|
]);
|
55
55
|
});
|
56
56
|
|
57
|
-
// it("should read pixels from an image using a preallocated buffer", async () => {
|
58
|
-
// const pixels = await surface.eval(
|
59
|
-
// (Skia, { colorType, alphaType, data }) => {
|
60
|
-
// const image = Skia.Image.MakeImageFromEncoded(
|
61
|
-
// Skia.Data.fromBytes(new Uint8Array(data))
|
62
|
-
// )!;
|
63
|
-
// const result = new Uint8Array(16);
|
64
|
-
// image.readPixels(
|
65
|
-
// 0,
|
66
|
-
// 0,
|
67
|
-
// {
|
68
|
-
// width: 2,
|
69
|
-
// height: 2,
|
70
|
-
// colorType,
|
71
|
-
// alphaType,
|
72
|
-
// },
|
73
|
-
// result
|
74
|
-
// );
|
75
|
-
// return result;
|
76
|
-
// },
|
77
|
-
// {
|
78
|
-
// colorType: ColorType.RGBA_8888,
|
79
|
-
// alphaType: AlphaType.Unpremul,
|
80
|
-
// data: Array.from(
|
81
|
-
// loadImage("skia/__tests__/assets/oslo.jpg").encodeToBytes()
|
82
|
-
// ),
|
83
|
-
// }
|
84
|
-
// );
|
85
|
-
// expect(pixels).toBeDefined();
|
86
|
-
// expect(Array.from(pixels!)).toEqual([
|
87
|
-
// 170, 186, 199, 255, 170, 186, 199, 255, 170, 186, 199, 255, 170, 186, 199,
|
88
|
-
// 255,
|
89
|
-
// ]);
|
90
|
-
// });
|
91
57
|
it("should read pixels from a canvas", async () => {
|
92
58
|
const pixels = await surface.eval(
|
93
59
|
(Skia, { colorType, alphaType }) => {
|
@@ -108,32 +74,4 @@ describe("Image loading from bundles", () => {
|
|
108
74
|
expect(pixels).toBeDefined();
|
109
75
|
expect(Array.from(pixels!)).toEqual([255, 0, 0, 255]);
|
110
76
|
});
|
111
|
-
// it("should read pixels from a canvas using a preallocated buffer", async () => {
|
112
|
-
// const pixels = await surface.eval(
|
113
|
-
// (Skia, { colorType, alphaType }) => {
|
114
|
-
// const offscreen = Skia.Surface.MakeOffscreen(10, 10)!;
|
115
|
-
// const canvas = offscreen.getCanvas();
|
116
|
-
// canvas.drawColor(Skia.Color("red"));
|
117
|
-
// const result = new Uint8Array(4);
|
118
|
-
// canvas.readPixels(0, 0, {
|
119
|
-
// width: 1,
|
120
|
-
// height: 1,
|
121
|
-
// colorType,
|
122
|
-
// alphaType,
|
123
|
-
// }, result);
|
124
|
-
// },
|
125
|
-
// { colorType: ColorType.RGBA_8888, alphaType: AlphaType.Unpremul }
|
126
|
-
// );
|
127
|
-
// expect(pixels).toBeDefined();
|
128
|
-
// expect(Array.from(pixels!)).toEqual([255, 0, 0, 255]);
|
129
|
-
// });
|
130
|
-
// This test should only run on CI because it will trigger a redbox.
|
131
|
-
// While this is fine on CI, it is undesirable on local dev.
|
132
|
-
// it("should not crash with an invalid viewTag", async () => {
|
133
|
-
// const result = await surface.eval((Skia) => {
|
134
|
-
// Skia.Image.MakeImageFromViewTag(-1);
|
135
|
-
// return true;
|
136
|
-
// });
|
137
|
-
// expect(result).toBe(true);
|
138
|
-
// });
|
139
77
|
});
|
Binary file
|
package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaDrawViewManagerInterface.java
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
/**
|
2
|
-
* This code was generated by [react-native-codegen](https://www.npmjs.com/package/react-native-codegen).
|
3
|
-
*
|
4
|
-
* Do not edit this file as changes may cause incorrect behavior and will be lost
|
5
|
-
* once the code is regenerated.
|
6
|
-
*
|
7
|
-
* @generated by codegen project: GeneratePropsJavaInterface.js
|
8
|
-
*/
|
9
|
-
|
10
|
-
package com.facebook.react.viewmanagers;
|
11
|
-
|
12
|
-
import android.view.View;
|
13
|
-
import androidx.annotation.Nullable;
|
14
|
-
|
15
|
-
public interface SkiaDrawViewManagerInterface<T extends View> {
|
16
|
-
void setMode(T view, @Nullable String value);
|
17
|
-
void setDebug(T view, boolean value);
|
18
|
-
}
|