@shopify/react-native-skia 1.5.5 → 1.5.6

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.
@@ -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"
@@ -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,24 @@ 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
+ std::unique_ptr<WindowContext> MakeWindow(ANativeWindow *window, int width,
129
+ int height) {
130
+ return std::make_unique<OpenGLWindowContext>(this, window, width, height);
129
131
  }
130
132
 
131
133
  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;
134
+ EGLConfig _glConfig;
135
+ std::unique_ptr<gl::Display> _glDisplay;
136
+ std::unique_ptr<gl::Context> _glContext;
137
+ std::unique_ptr<gl::Surface> _glSurface;
136
138
  sk_sp<GrDirectContext> _directContext;
137
139
 
138
140
  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);
141
+ _glDisplay = std::make_unique<gl::Display>();
142
+ _glConfig = _glDisplay->chooseConfig();
143
+ _glContext = _glDisplay->makeContext(_glConfig, nullptr);
144
+ _glSurface = _glDisplay->makePixelBufferSurface(_glConfig, 1, 1);
145
+ _glContext->makeCurrent(_glSurface.get());
144
146
  auto backendInterface = GrGLMakeNativeInterface();
145
147
  _directContext = GrDirectContexts::MakeGL(backendInterface);
146
148
 
@@ -149,3 +151,5 @@ private:
149
151
  }
150
152
  }
151
153
  };
154
+
155
+ } // 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
 
@@ -16,15 +18,25 @@ sk_sp<SkSurface> OpenGLWindowContext::getSurface() {
16
18
  if (_skSurface == nullptr) {
17
19
 
18
20
  struct ReleaseContext {
19
- std::unique_ptr<Surface> surface = nullptr;
21
+ std::unique_ptr<gl::Surface> surface = nullptr;
20
22
  };
21
23
 
24
+ if (!_window) {
25
+ throw std::runtime_error("No native window provided");
26
+ }
22
27
  auto releaseCtx = new ReleaseContext();
23
- releaseCtx->surface = _display->makeWindowSurface(_config, _window);
24
- _surface = releaseCtx->surface.get();
25
-
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
+
26
35
  // Now make this one current
27
- _context->makeCurrent(*releaseCtx->surface);
36
+ auto success = _context->_glContext->makeCurrent(releaseCtx->surface.get());
37
+ if (!success) {
38
+ throw std::runtime_error("Failed to make window surface current");
39
+ }
28
40
 
29
41
  // Set up parameters for the render target so that it
30
42
  // matches the underlying OpenGL context.
@@ -45,7 +57,7 @@ sk_sp<SkSurface> OpenGLWindowContext::getSurface() {
45
57
  auto colorType = kN32_SkColorType;
46
58
 
47
59
  auto maxSamples =
48
- _directContext->maxSurfaceSampleCountForColorType(colorType);
60
+ _context->_directContext->maxSurfaceSampleCountForColorType(colorType);
49
61
 
50
62
  if (samples > maxSamples) {
51
63
  samples = maxSamples;
@@ -56,11 +68,10 @@ sk_sp<SkSurface> OpenGLWindowContext::getSurface() {
56
68
 
57
69
  SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
58
70
 
59
-
60
71
  // Create surface object
61
72
  _skSurface = SkSurfaces::WrapBackendRenderTarget(
62
- _directContext, renderTarget, kBottomLeft_GrSurfaceOrigin, colorType,
63
- nullptr, &props,
73
+ _context->_directContext.get(), renderTarget,
74
+ kBottomLeft_GrSurfaceOrigin, colorType, nullptr, &props,
64
75
  [](void *addr) {
65
76
  auto releaseCtx = reinterpret_cast<ReleaseContext *>(addr);
66
77
  delete releaseCtx;
@@ -70,4 +81,10 @@ sk_sp<SkSurface> OpenGLWindowContext::getSurface() {
70
81
  return _skSurface;
71
82
  }
72
83
 
84
+ void OpenGLWindowContext::present() {
85
+ _context->_glContext->makeCurrent(_glSurface);
86
+ _context->_directContext->flushAndSubmit();
87
+ _glSurface->present();
88
+ }
89
+
73
90
  } // 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"
@@ -31,23 +31,25 @@
31
31
 
32
32
  namespace RNSkia {
33
33
 
34
+ class OpenGLContext;
35
+
34
36
  class OpenGLWindowContext : public WindowContext {
35
37
  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) {}
38
+ OpenGLWindowContext(OpenGLContext *context, ANativeWindow *window, int width,
39
+ int height)
40
+ : _context(context), _window(window), _width(width), _height(height) {
41
+ ANativeWindow_acquire(_window);
42
+ }
41
43
 
42
- ~OpenGLWindowContext() { ANativeWindow_release(_window); }
44
+ ~OpenGLWindowContext() {
45
+ _skSurface = nullptr;
46
+ _glSurface = nullptr;
47
+ ANativeWindow_release(_window);
48
+ }
43
49
 
44
50
  sk_sp<SkSurface> getSurface() override;
45
51
 
46
- void present() override {
47
- _context->makeCurrent(*_surface);
48
- _directContext->flushAndSubmit();
49
- _surface->Present();
50
- }
52
+ void present() override;
51
53
 
52
54
  void resize(int width, int height) override {
53
55
  _skSurface = nullptr;
@@ -60,13 +62,10 @@ public:
60
62
  int getHeight() override { return _height; };
61
63
 
62
64
  private:
65
+ OpenGLContext *_context;
63
66
  ANativeWindow *_window;
64
67
  sk_sp<SkSurface> _skSurface = nullptr;
65
- EGLConfig _config;
66
- Context *_context;
67
- Surface* _surface;
68
- Display *_display;
69
- GrDirectContext *_directContext;
68
+ gl::Surface *_glSurface = nullptr;
70
69
  int _width = 0;
71
70
  int _height = 0;
72
71
  };
@@ -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
 
@@ -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,7 @@ public:
35
35
 
36
36
  bool isValid() const { return _display != EGL_NO_DISPLAY; }
37
37
 
38
- EGLConfig chooseConfig() const {
38
+ EGLConfig chooseConfig() {
39
39
 
40
40
  EGLint att[] = {EGL_RENDERABLE_TYPE,
41
41
  EGL_OPENGL_ES2_BIT,
@@ -82,14 +82,14 @@ public:
82
82
  }
83
83
 
84
84
  std::unique_ptr<Surface> makeWindowSurface(const EGLConfig &config,
85
- EGLNativeWindowType window) {
85
+ ANativeWindow *window) {
86
86
  const EGLint attribs[] = {EGL_NONE};
87
87
  auto surface = eglCreateWindowSurface(_display, config, window, attribs);
88
88
  if (surface == EGL_NO_SURFACE) {
89
89
  LOG_EGL_ERROR;
90
90
  return nullptr;
91
91
  }
92
- return std::unique_ptr<Surface>(new Surface(_display, surface));
92
+ return std::make_unique<Surface>(_display, surface);
93
93
  }
94
94
 
95
95
  std::unique_ptr<Surface> makePixelBufferSurface(const EGLConfig &config,
@@ -101,7 +101,7 @@ public:
101
101
  LOG_EGL_ERROR;
102
102
  return nullptr;
103
103
  }
104
- return std::unique_ptr<Surface>(new Surface(_display, surface));
104
+ return std::make_unique<Surface>(_display, surface);
105
105
  }
106
106
 
107
107
  const EGLDisplay &getHandle() const { return _display; }
@@ -114,4 +114,4 @@ private:
114
114
  Display &operator=(const Display &) = delete;
115
115
  };
116
116
 
117
- } // namespace RNSkia
117
+ } // 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
@@ -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
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.6",
11
11
  "description": "High-performance React Native Graphics using Skia",
12
12
  "main": "lib/module/index.js",
13
13
  "react-native": "src/index.ts",