@shopify/react-native-skia 1.5.5 → 1.5.7

Sign up to get free protection for your applications and to get access to all the features.
Files changed (25) hide show
  1. package/android/CMakeLists.txt +1 -1
  2. package/android/cpp/jni/include/JniSkiaBaseView.h +2 -2
  3. package/android/cpp/jni/include/JniSkiaDomView.h +2 -2
  4. package/android/cpp/jni/include/JniSkiaPictureView.h +2 -2
  5. package/android/cpp/rnskia-android/OpenGLContext.h +29 -23
  6. package/android/cpp/rnskia-android/OpenGLWindowContext.cpp +25 -37
  7. package/android/cpp/rnskia-android/OpenGLWindowContext.h +23 -26
  8. package/android/cpp/rnskia-android/RNSkAndroidPlatformContext.h +2 -2
  9. package/android/cpp/rnskia-android/RNSkAndroidView.h +3 -3
  10. package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.cpp +13 -4
  11. package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.h +1 -1
  12. package/android/cpp/rnskia-android/{opengl → gl}/Context.h +8 -8
  13. package/android/cpp/rnskia-android/{opengl → gl}/Display.h +12 -8
  14. package/android/cpp/rnskia-android/{opengl → gl}/Error.cpp +1 -1
  15. package/android/cpp/rnskia-android/{opengl → gl}/Surface.h +7 -7
  16. package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseView.java +7 -7
  17. package/android/src/main/java/com/shopify/reactnative/skia/SkiaDomView.java +1 -3
  18. package/android/src/main/java/com/shopify/reactnative/skia/SkiaPictureView.java +1 -3
  19. package/cpp/api/JsiSkiaContext.h +3 -0
  20. package/ios/RNSkia-iOS/RNSkMetalCanvasProvider.mm +3 -0
  21. package/ios/RNSkia-iOS/SkiaCVPixelBufferUtils.mm +8 -4
  22. package/ios/RNSkia-iOS/SkiaMetalSurfaceFactory.h +2 -2
  23. package/package.json +1 -1
  24. package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaDrawViewManagerInterface.java +0 -18
  25. /package/android/cpp/rnskia-android/{opengl → gl}/Error.h +0 -0
@@ -74,7 +74,7 @@ add_library(
74
74
  "${PROJECT_SOURCE_DIR}/cpp/jni/JniSkiaManager.cpp"
75
75
 
76
76
  "${PROJECT_SOURCE_DIR}/cpp/jni/JniPlatformContext.cpp"
77
- "${PROJECT_SOURCE_DIR}/cpp/rnskia-android/opengl/Error.cpp"
77
+ "${PROJECT_SOURCE_DIR}/cpp/rnskia-android/gl/Error.cpp"
78
78
  "${PROJECT_SOURCE_DIR}/cpp/rnskia-android/RNSkOpenGLCanvasProvider.cpp"
79
79
  "${PROJECT_SOURCE_DIR}/cpp/rnskia-android/AHardwareBufferUtils.cpp"
80
80
  "${PROJECT_SOURCE_DIR}/cpp/rnskia-android/RNSkAndroidVideo.cpp"
@@ -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(); }
@@ -2,7 +2,7 @@
2
2
 
3
3
  #include "GrAHardwareBufferUtils.h"
4
4
  #include "OpenGLWindowContext.h"
5
- #include "opengl/Display.h"
5
+ #include "gl/Display.h"
6
6
 
7
7
  #include "include/core/SkCanvas.h"
8
8
  #include "include/core/SkColorSpace.h"
@@ -14,8 +14,12 @@
14
14
  #include "include/gpu/ganesh/gl/GrGLInterface.h"
15
15
  #include "src/gpu/ganesh/gl/GrGLDefines.h"
16
16
 
17
+ namespace RNSkia {
18
+
17
19
  class OpenGLContext {
18
20
  public:
21
+ friend class OpenGLWindowContext;
22
+
19
23
  OpenGLContext(const OpenGLContext &) = delete;
20
24
  OpenGLContext &operator=(const OpenGLContext &) = delete;
21
25
 
@@ -29,7 +33,7 @@ public:
29
33
 
30
34
  SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
31
35
 
32
- auto result = _ctx->makeCurrent(*_surface);
36
+ auto result = _glContext->makeCurrent(_glSurface.get());
33
37
  if (!result) {
34
38
  return nullptr;
35
39
  }
@@ -39,8 +43,8 @@ public:
39
43
  width, height, colorType, skgpu::Mipmapped::kNo, GrRenderable::kYes);
40
44
 
41
45
  if (!texture.isValid()) {
42
- RNSkia::RNSkLogger::logToConsole(
43
- "couldn't create offscreen texture %dx%d", width, height);
46
+ RNSkLogger::logToConsole("couldn't create offscreen texture %dx%d", width,
47
+ height);
44
48
  }
45
49
 
46
50
  struct ReleaseContext {
@@ -68,9 +72,9 @@ public:
68
72
  #if __ANDROID_API__ >= 26
69
73
  const AHardwareBuffer *hardwareBuffer =
70
74
  static_cast<AHardwareBuffer *>(buffer);
71
- RNSkia::DeleteImageProc deleteImageProc = nullptr;
72
- RNSkia::UpdateImageProc updateImageProc = nullptr;
73
- RNSkia::TexImageCtx deleteImageCtx = nullptr;
75
+ DeleteImageProc deleteImageProc = nullptr;
76
+ UpdateImageProc updateImageProc = nullptr;
77
+ TexImageCtx deleteImageCtx = nullptr;
74
78
 
75
79
  AHardwareBuffer_Desc description;
76
80
  AHardwareBuffer_describe(hardwareBuffer, &description);
@@ -100,12 +104,12 @@ public:
100
104
  }
101
105
  }
102
106
 
103
- auto backendTex = RNSkia::MakeGLBackendTexture(
107
+ auto backendTex = MakeGLBackendTexture(
104
108
  _directContext.get(), const_cast<AHardwareBuffer *>(hardwareBuffer),
105
109
  description.width, description.height, &deleteImageProc,
106
110
  &updateImageProc, &deleteImageCtx, false, format, false);
107
111
  if (!backendTex.isValid()) {
108
- RNSkia::RNSkLogger::logToConsole(
112
+ RNSkLogger::logToConsole(
109
113
  "Failed to convert HardwareBuffer to OpenGL Texture!");
110
114
  return nullptr;
111
115
  }
@@ -121,26 +125,26 @@ public:
121
125
  #endif
122
126
  }
123
127
 
124
- std::unique_ptr<RNSkia::WindowContext> MakeWindow(ANativeWindow *window,
125
- int width, int height) {
126
- return std::make_unique<RNSkia::OpenGLWindowContext>(
127
- _config, _display.get(), _ctx.get(), _directContext.get(), window,
128
- width, height);
128
+ // TODO: remove width, height
129
+ std::unique_ptr<WindowContext> MakeWindow(ANativeWindow *window, int width,
130
+ int height) {
131
+ return std::make_unique<OpenGLWindowContext>(
132
+ _directContext, _glDisplay.get(), _glContext.get(), window);
129
133
  }
130
134
 
131
135
  private:
132
- EGLConfig _config;
133
- std::unique_ptr<RNSkia::Display> _display;
134
- std::unique_ptr<RNSkia::Context> _ctx;
135
- std::unique_ptr<RNSkia::Surface> _surface;
136
+ EGLConfig _glConfig;
137
+ std::unique_ptr<gl::Display> _glDisplay;
138
+ std::unique_ptr<gl::Context> _glContext;
139
+ std::unique_ptr<gl::Surface> _glSurface;
136
140
  sk_sp<GrDirectContext> _directContext;
137
141
 
138
142
  OpenGLContext() {
139
- _display = std::make_unique<RNSkia::Display>();
140
- _config = _display->chooseConfig();
141
- _ctx = _display->makeContext(_config, nullptr);
142
- _surface = _display->makePixelBufferSurface(_config, 1, 1);
143
- _ctx->makeCurrent(*_surface);
143
+ _glDisplay = std::make_unique<gl::Display>();
144
+ _glConfig = _glDisplay->chooseConfig();
145
+ _glContext = _glDisplay->makeContext(_glConfig, nullptr);
146
+ _glSurface = _glDisplay->makePixelBufferSurface(_glConfig, 1, 1);
147
+ _glContext->makeCurrent(_glSurface.get());
144
148
  auto backendInterface = GrGLMakeNativeInterface();
145
149
  _directContext = GrDirectContexts::MakeGL(backendInterface);
146
150
 
@@ -149,3 +153,5 @@ private:
149
153
  }
150
154
  }
151
155
  };
156
+
157
+ } // namespace RNSkia
@@ -1,6 +1,8 @@
1
1
  #include "OpenGLWindowContext.h"
2
2
  #include "GrAHardwareBufferUtils.h"
3
3
 
4
+ #include "OpenGLContext.h"
5
+
4
6
  #pragma clang diagnostic push
5
7
  #pragma clang diagnostic ignored "-Wdocumentation"
6
8
 
@@ -14,35 +16,14 @@ namespace RNSkia {
14
16
 
15
17
  sk_sp<SkSurface> OpenGLWindowContext::getSurface() {
16
18
  if (_skSurface == nullptr) {
17
-
18
- struct ReleaseContext {
19
- std::unique_ptr<Surface> surface = nullptr;
20
- };
21
-
22
- auto releaseCtx = new ReleaseContext();
23
- releaseCtx->surface = _display->makeWindowSurface(_config, _window);
24
- _surface = releaseCtx->surface.get();
25
-
26
- // Now make this one current
27
- _context->makeCurrent(*releaseCtx->surface);
28
-
29
- // Set up parameters for the render target so that it
30
- // matches the underlying OpenGL context.
31
- GrGLFramebufferInfo fboInfo;
32
-
33
- // We pass 0 as the framebuffer id, since the
34
- // underlying Skia GrGlGpu will read this when wrapping the context in the
35
- // render target and the GrGlGpu object.
36
- fboInfo.fFBOID = 0;
37
- fboInfo.fFormat = 0x8058; // GL_RGBA8
38
-
19
+ _glContext->makeCurrent(_glSurface.get());
39
20
  GLint stencil;
40
21
  glGetIntegerv(GL_STENCIL_BITS, &stencil);
41
22
 
42
23
  GLint samples;
43
24
  glGetIntegerv(GL_SAMPLES, &samples);
44
25
 
45
- auto colorType = kN32_SkColorType;
26
+ auto colorType = kRGBA_8888_SkColorType;
46
27
 
47
28
  auto maxSamples =
48
29
  _directContext->maxSurfaceSampleCountForColorType(colorType);
@@ -51,23 +32,30 @@ sk_sp<SkSurface> OpenGLWindowContext::getSurface() {
51
32
  samples = maxSamples;
52
33
  }
53
34
 
54
- auto renderTarget = GrBackendRenderTargets::MakeGL(_width, _height, samples,
55
- stencil, fboInfo);
56
-
57
- SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
58
-
59
-
60
- // Create surface object
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);
61
47
  _skSurface = SkSurfaces::WrapBackendRenderTarget(
62
- _directContext, renderTarget, kBottomLeft_GrSurfaceOrigin, colorType,
63
- nullptr, &props,
64
- [](void *addr) {
65
- auto releaseCtx = reinterpret_cast<ReleaseContext *>(addr);
66
- delete releaseCtx;
67
- },
68
- reinterpret_cast<void *>(releaseCtx));
48
+ _directContext.get(), backendRT, kBottomLeft_GrSurfaceOrigin,
49
+ kRGBA_8888_SkColorType, colorSpace, &surfaceProps);
69
50
  }
70
51
  return _skSurface;
71
52
  }
72
53
 
54
+ void OpenGLWindowContext::present() {
55
+ _glContext->makeCurrent(_glSurface.get());
56
+ // TODO: is flushAndSubmit needed here?
57
+ _directContext->flushAndSubmit();
58
+ _glSurface->present();
59
+ }
60
+
73
61
  } // namespace RNSkia
@@ -14,7 +14,7 @@
14
14
  #include <unordered_map>
15
15
 
16
16
  #include "WindowContext.h"
17
- #include "opengl/Display.h"
17
+ #include "gl/Display.h"
18
18
 
19
19
  #pragma clang diagnostic push
20
20
  #pragma clang diagnostic ignored "-Wdocumentation"
@@ -33,42 +33,39 @@ namespace RNSkia {
33
33
 
34
34
  class OpenGLWindowContext : public WindowContext {
35
35
  public:
36
- OpenGLWindowContext(EGLConfig &config, Display *display, Context *context,
37
- GrDirectContext *directContext, ANativeWindow *window,
38
- int width, int height)
39
- : _config(config), _display(display), _directContext(directContext),
40
- _context(context), _window(window), _width(width), _height(height) {}
36
+ OpenGLWindowContext(sk_sp<GrDirectContext> directContext,
37
+ gl::Display *display, gl::Context *glContext,
38
+ ANativeWindow *window)
39
+ : _directContext(directContext), _display(display), _glContext(glContext),
40
+ _window(window) {
41
+ ANativeWindow_acquire(_window);
42
+ auto config = display->chooseConfig();
43
+ _glSurface = display->makeWindowSurface(config, _window);
44
+ }
41
45
 
42
- ~OpenGLWindowContext() { ANativeWindow_release(_window); }
46
+ ~OpenGLWindowContext() {
47
+ _skSurface = nullptr;
48
+ _glSurface = nullptr;
49
+ ANativeWindow_release(_window);
50
+ }
43
51
 
44
52
  sk_sp<SkSurface> getSurface() override;
45
53
 
46
- void present() override {
47
- _context->makeCurrent(*_surface);
48
- _directContext->flushAndSubmit();
49
- _surface->Present();
50
- }
54
+ void present() override;
51
55
 
52
- void resize(int width, int height) override {
53
- _skSurface = nullptr;
54
- _width = width;
55
- _height = height;
56
- }
56
+ int getWidth() override { return ANativeWindow_getWidth(_window); };
57
57
 
58
- int getWidth() override { return _width; };
58
+ int getHeight() override { return ANativeWindow_getHeight(_window); };
59
59
 
60
- int getHeight() override { return _height; };
60
+ void resize(int width, int height) override { _skSurface = nullptr; }
61
61
 
62
62
  private:
63
+ sk_sp<GrDirectContext> _directContext;
64
+ gl::Display *_display;
63
65
  ANativeWindow *_window;
64
66
  sk_sp<SkSurface> _skSurface = nullptr;
65
- EGLConfig _config;
66
- Context *_context;
67
- Surface* _surface;
68
- Display *_display;
69
- GrDirectContext *_directContext;
70
- int _width = 0;
71
- int _height = 0;
67
+ gl::Context *_glContext = nullptr;
68
+ std::unique_ptr<gl::Surface> _glSurface = nullptr;
72
69
  };
73
70
 
74
71
  } // namespace RNSkia
@@ -68,8 +68,8 @@ public:
68
68
  #if defined(SK_GRAPHITE)
69
69
  return DawnContext::getInstance().MakeWindow(surface, width, height);
70
70
  #else
71
- return OpenGLContext::getInstance().MakeWindow(
72
- reinterpret_cast<ANativeWindow *>(surface), width, height);
71
+ auto aWindow = reinterpret_cast<ANativeWindow *>(surface);
72
+ return OpenGLContext::getInstance().MakeWindow(aWindow, width, height);
73
73
  #endif
74
74
  }
75
75
 
@@ -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(int width, int height) {
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
- // Recreate RenderContext surface based on size change???
129
- _surfaceHolder->resize(width, height);
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
@@ -31,7 +31,7 @@ public:
31
31
 
32
32
  void surfaceDestroyed();
33
33
 
34
- void surfaceSizeChanged(int width, int height);
34
+ void surfaceSizeChanged(jobject jSurface, int width, int height);
35
35
 
36
36
  private:
37
37
  std::unique_ptr<WindowContext> _surfaceHolder = nullptr;
@@ -1,9 +1,9 @@
1
1
  #pragma once
2
2
 
3
- #include "opengl/Error.h"
4
- #include "opengl/Surface.h"
3
+ #include "gl/Error.h"
4
+ #include "gl/Surface.h"
5
5
 
6
- namespace RNSkia {
6
+ namespace gl {
7
7
 
8
8
  class Surface;
9
9
  class Display;
@@ -22,20 +22,20 @@ public:
22
22
 
23
23
  const EGLContext &getHandle() const { return _context; }
24
24
 
25
- bool makeCurrent(const Surface &surface) const {
25
+ bool makeCurrent(const Surface *surface) {
26
26
  if (_context == EGL_NO_CONTEXT) {
27
27
  return false;
28
28
  }
29
29
  const auto result =
30
- eglMakeCurrentIfNecessary(_display, surface.getHandle(),
31
- surface.getHandle(), _context) == EGL_TRUE;
30
+ eglMakeCurrentIfNecessary(_display, surface->getHandle(),
31
+ surface->getHandle(), _context) == EGL_TRUE;
32
32
  if (!result) {
33
33
  LOG_EGL_ERROR;
34
34
  }
35
35
  return result;
36
36
  }
37
37
 
38
- bool clearCurrent() const {
38
+ bool clearCurrent() {
39
39
  const auto result =
40
40
  eglMakeCurrentIfNecessary(_display, EGL_NO_SURFACE, EGL_NO_SURFACE,
41
41
  EGL_NO_CONTEXT) == EGL_TRUE;
@@ -74,4 +74,4 @@ private:
74
74
  Context &operator=(const Context &) = delete;
75
75
  };
76
76
 
77
- } // namespace RNSkia
77
+ } // namespace gl
@@ -5,10 +5,10 @@
5
5
  #include "EGL/egl.h"
6
6
  #include "GLES2/gl2.h"
7
7
 
8
- #include "opengl/Context.h"
9
- #include "opengl/Error.h"
8
+ #include "gl/Context.h"
9
+ #include "gl/Error.h"
10
10
 
11
- namespace RNSkia {
11
+ namespace gl {
12
12
 
13
13
  class Context;
14
14
  class Surface;
@@ -35,7 +35,11 @@ public:
35
35
 
36
36
  bool isValid() const { return _display != EGL_NO_DISPLAY; }
37
37
 
38
- EGLConfig chooseConfig() const {
38
+ void clearContext() {
39
+ eglMakeCurrent(_display, EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT);
40
+ }
41
+
42
+ EGLConfig chooseConfig() {
39
43
 
40
44
  EGLint att[] = {EGL_RENDERABLE_TYPE,
41
45
  EGL_OPENGL_ES2_BIT,
@@ -82,14 +86,14 @@ public:
82
86
  }
83
87
 
84
88
  std::unique_ptr<Surface> makeWindowSurface(const EGLConfig &config,
85
- EGLNativeWindowType window) {
89
+ ANativeWindow *window) {
86
90
  const EGLint attribs[] = {EGL_NONE};
87
91
  auto surface = eglCreateWindowSurface(_display, config, window, attribs);
88
92
  if (surface == EGL_NO_SURFACE) {
89
93
  LOG_EGL_ERROR;
90
94
  return nullptr;
91
95
  }
92
- return std::unique_ptr<Surface>(new Surface(_display, surface));
96
+ return std::make_unique<Surface>(_display, surface);
93
97
  }
94
98
 
95
99
  std::unique_ptr<Surface> makePixelBufferSurface(const EGLConfig &config,
@@ -101,7 +105,7 @@ public:
101
105
  LOG_EGL_ERROR;
102
106
  return nullptr;
103
107
  }
104
- return std::unique_ptr<Surface>(new Surface(_display, surface));
108
+ return std::make_unique<Surface>(_display, surface);
105
109
  }
106
110
 
107
111
  const EGLDisplay &getHandle() const { return _display; }
@@ -114,4 +118,4 @@ private:
114
118
  Display &operator=(const Display &) = delete;
115
119
  };
116
120
 
117
- } // namespace RNSkia
121
+ } // namespace gl
@@ -1,4 +1,4 @@
1
- #include "opengl/Error.h"
1
+ #include "gl/Error.h"
2
2
 
3
3
  #include "RNSkLog.h"
4
4
 
@@ -1,11 +1,14 @@
1
1
  #pragma once
2
2
 
3
- #include "opengl/Error.h"
3
+ #include "gl/Error.h"
4
4
 
5
- namespace RNSkia {
5
+ namespace gl {
6
6
 
7
7
  class Surface {
8
8
  public:
9
+ Surface(EGLDisplay display, EGLSurface surface)
10
+ : _display(display), _surface(surface) {}
11
+
9
12
  ~Surface() {
10
13
  if (_surface != EGL_NO_SURFACE) {
11
14
  if (eglDestroySurface(_display, _surface) != EGL_TRUE) {
@@ -18,7 +21,7 @@ public:
18
21
 
19
22
  const EGLSurface &getHandle() const { return _surface; }
20
23
 
21
- bool Present() const {
24
+ bool present() {
22
25
  const auto result = eglSwapBuffers(_display, _surface) == EGL_TRUE;
23
26
  if (!result) {
24
27
  LOG_EGL_ERROR;
@@ -32,12 +35,9 @@ private:
32
35
  EGLDisplay _display = EGL_NO_DISPLAY;
33
36
  EGLSurface _surface = EGL_NO_SURFACE;
34
37
 
35
- Surface(EGLDisplay display, EGLSurface surface)
36
- : _display(display), _surface(surface) {}
37
-
38
38
  Surface(const Surface &) = delete;
39
39
 
40
40
  Surface &operator=(const Surface &) = delete;
41
41
  };
42
42
 
43
- } // Namespace RNSkia
43
+ } // Namespace gl
@@ -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
- //private long _prevTimestamp = 0;
85
+ private long _prevTimestamp = 0;
86
86
  @Override
87
87
  public void onSurfaceTextureUpdated(SurfaceTexture surface) {
88
- // long timestamp = surface.getTimestamp();
89
- // long frameDuration = (timestamp - _prevTimestamp)/1000000;
90
- // Log.i(tag, "onSurfaceTextureUpdated "+frameDuration+"ms");
91
- // _prevTimestamp = timestamp;
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();
@@ -69,6 +69,9 @@ public:
69
69
  void *surface = reinterpret_cast<void *>(nativeBufferPointer);
70
70
  auto width = static_cast<int>(arguments[1].asNumber());
71
71
  auto height = static_cast<int>(arguments[2].asNumber());
72
+ if (surface == nullptr) {
73
+ throw std::runtime_error("Surface is null");
74
+ }
72
75
  auto result =
73
76
  context->makeContextFromNativeSurface(surface, width, height);
74
77
  // Return the newly constructed object
@@ -77,6 +77,9 @@ bool RNSkMetalCanvasProvider::renderToCanvas(
77
77
  // usage growing very fast in the simulator without this.
78
78
  @autoreleasepool {
79
79
  auto surface = _ctx->getSurface();
80
+ if (!surface) {
81
+ return false;
82
+ }
80
83
  auto canvas = surface->getCanvas();
81
84
  cb(canvas);
82
85
  _ctx->present();
@@ -23,12 +23,16 @@
23
23
  #include <TargetConditionals.h>
24
24
  #if TARGET_RT_BIG_ENDIAN
25
25
  #define FourCC2Str(fourcc) \
26
- (const char[]){*((char *)&fourcc), *(((char *)&fourcc) + 1), \
27
- *(((char *)&fourcc) + 2), *(((char *)&fourcc) + 3), 0}
26
+ (const char[]) { \
27
+ *((char *)&fourcc), *(((char *)&fourcc) + 1), *(((char *)&fourcc) + 2), \
28
+ *(((char *)&fourcc) + 3), 0 \
29
+ }
28
30
  #else
29
31
  #define FourCC2Str(fourcc) \
30
- (const char[]){*(((char *)&fourcc) + 3), *(((char *)&fourcc) + 2), \
31
- *(((char *)&fourcc) + 1), *(((char *)&fourcc) + 0), 0}
32
+ (const char[]) { \
33
+ *(((char *)&fourcc) + 3), *(((char *)&fourcc) + 2), \
34
+ *(((char *)&fourcc) + 1), *(((char *)&fourcc) + 0), 0 \
35
+ }
32
36
  #endif
33
37
 
34
38
  // pragma MARK: TextureHolder
@@ -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.5",
10
+ "version": "1.5.7",
11
11
  "description": "High-performance React Native Graphics using Skia",
12
12
  "main": "lib/module/index.js",
13
13
  "react-native": "src/index.ts",
@@ -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
- }