@shopify/react-native-skia 1.7.0 → 1.7.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (28) hide show
  1. package/android/cpp/jni/include/JniSkiaBaseView.h +2 -2
  2. package/android/cpp/rnskia-android/GrAHardwareBufferUtils.cpp +14 -14
  3. package/android/cpp/rnskia-android/MainThreadDispatcher.h +2 -2
  4. package/android/cpp/rnskia-android/OpenGLContext.h +11 -5
  5. package/android/cpp/rnskia-android/OpenGLWindowContext.h +1 -1
  6. package/android/cpp/rnskia-android/RNSkAndroidPlatformContext.h +8 -10
  7. package/android/cpp/rnskia-android/RNSkAndroidVideo.cpp +1 -1
  8. package/android/cpp/rnskia-android/RNSkAndroidVideo.h +1 -1
  9. package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.cpp +3 -3
  10. package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseView.java +0 -13
  11. package/android/src/main/java/com/shopify/reactnative/skia/SkiaTextureView.java +2 -31
  12. package/cpp/api/JsiSkApi.h +1 -1
  13. package/cpp/api/JsiSkCanvas.h +1 -1
  14. package/cpp/api/JsiSkColor.h +2 -2
  15. package/cpp/api/third_party/CSSColorParser.h +1 -1
  16. package/cpp/api/third_party/base64.cpp +4 -4
  17. package/cpp/rnskia/RNSkManager.cpp +1 -1
  18. package/cpp/rnskia/RNSkPlatformContext.h +0 -1
  19. package/ios/RNSkia-iOS/RNSkiOSPlatformContext.h +0 -4
  20. package/ios/RNSkia-iOS/SkiaDomView.mm +3 -3
  21. package/ios/RNSkia-iOS/SkiaDomViewManager.mm +2 -1
  22. package/ios/RNSkia-iOS/SkiaManager.h +6 -0
  23. package/ios/RNSkia-iOS/SkiaManager.mm +17 -0
  24. package/ios/RNSkia-iOS/SkiaPictureView.mm +3 -3
  25. package/ios/RNSkia-iOS/SkiaPictureViewManager.mm +2 -1
  26. package/ios/RNSkia-iOS/SkiaUIView.h +0 -1
  27. package/ios/RNSkia-iOS/SkiaUIView.mm +1 -7
  28. package/package.json +1 -1
@@ -20,9 +20,9 @@ class JniSkiaBaseView {
20
20
  public:
21
21
  JniSkiaBaseView(jni::alias_ref<JniSkiaManager::javaobject> skiaManager,
22
22
  std::shared_ptr<RNSkBaseAndroidView> skiaView)
23
- : _manager(skiaManager->cthis()), _skiaAndroidView(skiaView) {}
23
+ : _manager(skiaManager->cthis()), _skiaAndroidView(std::move(skiaView)) {}
24
24
 
25
- ~JniSkiaBaseView() {}
25
+ ~JniSkiaBaseView() = default;
26
26
 
27
27
  std::shared_ptr<RNSkManager> getSkiaManager() {
28
28
  return _manager->getSkiaManager();
@@ -41,7 +41,7 @@ GrBackendFormat GetGLBackendFormat(GrDirectContext *dContext,
41
41
  bool requireKnownFormat) {
42
42
  GrBackendApi backend = dContext->backend();
43
43
  if (backend != GrBackendApi::kOpenGL) {
44
- return GrBackendFormat();
44
+ return {};
45
45
  }
46
46
  switch (bufferFormat) {
47
47
  // TODO: find out if we can detect, which graphic buffers support
@@ -63,7 +63,7 @@ GrBackendFormat GetGLBackendFormat(GrDirectContext *dContext,
63
63
  #endif
64
64
  default:
65
65
  if (requireKnownFormat) {
66
- return GrBackendFormat();
66
+ return {};
67
67
  } else {
68
68
  return GrBackendFormats::MakeGL(GR_GL_RGBA8, GR_GL_TEXTURE_EXTERNAL);
69
69
  }
@@ -110,12 +110,12 @@ void GLTextureHelper::rebind(GrDirectContext *dContext) {
110
110
  }
111
111
 
112
112
  void delete_gl_texture(void *context) {
113
- GLTextureHelper *cleanupHelper = static_cast<GLTextureHelper *>(context);
113
+ auto cleanupHelper = static_cast<GLTextureHelper *>(context);
114
114
  delete cleanupHelper;
115
115
  }
116
116
 
117
117
  void update_gl_texture(void *context, GrDirectContext *dContext) {
118
- GLTextureHelper *cleanupHelper = static_cast<GLTextureHelper *>(context);
118
+ auto cleanupHelper = static_cast<GLTextureHelper *>(context);
119
119
  cleanupHelper->rebind(dContext);
120
120
  }
121
121
 
@@ -127,13 +127,13 @@ static GrBackendTexture make_gl_backend_texture(
127
127
  while (GL_NO_ERROR != glGetError()) {
128
128
  } // clear GL errors
129
129
 
130
- EGLGetNativeClientBufferANDROIDProc eglGetNativeClientBufferANDROID =
130
+ auto eglGetNativeClientBufferANDROID =
131
131
  (EGLGetNativeClientBufferANDROIDProc)eglGetProcAddress(
132
132
  "eglGetNativeClientBufferANDROID");
133
133
  if (!eglGetNativeClientBufferANDROID) {
134
134
  RNSkLogger::logToConsole(
135
135
  "Failed to get the eglGetNativeClientBufferAndroid proc");
136
- return GrBackendTexture();
136
+ return {};
137
137
  }
138
138
 
139
139
  EGLClientBuffer clientBuffer =
@@ -149,14 +149,14 @@ static GrBackendTexture make_gl_backend_texture(
149
149
  if (EGL_NO_IMAGE_KHR == image) {
150
150
  SkDebugf("Could not create EGL image, err = (%#x)",
151
151
  static_cast<int>(eglGetError()));
152
- return GrBackendTexture();
152
+ return {};
153
153
  }
154
154
 
155
155
  GrGLuint texID;
156
156
  glGenTextures(1, &texID);
157
157
  if (!texID) {
158
158
  eglDestroyImageKHR(display, image);
159
- return GrBackendTexture();
159
+ return {};
160
160
  }
161
161
 
162
162
  GrGLuint target = isRenderable ? GR_GL_TEXTURE_2D : GR_GL_TEXTURE_EXTERNAL;
@@ -167,7 +167,7 @@ static GrBackendTexture make_gl_backend_texture(
167
167
  SkDebugf("glBindTexture failed (%#x)", static_cast<int>(status));
168
168
  glDeleteTextures(1, &texID);
169
169
  eglDestroyImageKHR(display, image);
170
- return GrBackendTexture();
170
+ return {};
171
171
  }
172
172
  glEGLImageTargetTexture2DOES(target, image);
173
173
  if ((status = glGetError()) != GL_NO_ERROR) {
@@ -175,7 +175,7 @@ static GrBackendTexture make_gl_backend_texture(
175
175
  static_cast<int>(status));
176
176
  glDeleteTextures(1, &texID);
177
177
  eglDestroyImageKHR(display, image);
178
- return GrBackendTexture();
178
+ return {};
179
179
  }
180
180
  dContext->resetContext(kTextureBinding_GrGLBackendState);
181
181
 
@@ -223,16 +223,16 @@ MakeGLBackendTexture(GrDirectContext *dContext, AHardwareBuffer *hardwareBuffer,
223
223
  bool isProtectedContent,
224
224
  const GrBackendFormat &backendFormat, bool isRenderable) {
225
225
  SkASSERT(dContext);
226
- if (!dContext || dContext->abandoned()) {
227
- return GrBackendTexture();
226
+ if (dContext->abandoned()) {
227
+ return {};
228
228
  }
229
229
 
230
230
  if (GrBackendApi::kOpenGL != dContext->backend()) {
231
- return GrBackendTexture();
231
+ return {};
232
232
  }
233
233
 
234
234
  if (isProtectedContent && !can_import_protected_content(dContext)) {
235
- return GrBackendTexture();
235
+ return {};
236
236
  }
237
237
 
238
238
  return make_gl_backend_texture(
@@ -6,8 +6,8 @@
6
6
 
7
7
  class MainThreadDispatcher {
8
8
  private:
9
- ALooper *mainLooper;
10
- int messagePipe[2];
9
+ ALooper *mainLooper = nullptr;
10
+ int messagePipe[2] = { -1, -1 };
11
11
  std::queue<std::function<void()>> taskQueue;
12
12
  std::mutex queueMutex;
13
13
 
@@ -117,17 +117,23 @@ public:
117
117
  // GR_GL_TEXTURE_2D
118
118
  case AHARDWAREBUFFER_FORMAT_R8G8B8A8_UNORM:
119
119
  format = GrBackendFormats::MakeGL(GR_GL_RGBA8, GR_GL_TEXTURE_EXTERNAL);
120
+ break;
120
121
  case AHARDWAREBUFFER_FORMAT_R16G16B16A16_FLOAT:
121
122
  format = GrBackendFormats::MakeGL(GR_GL_RGBA16F, GR_GL_TEXTURE_EXTERNAL);
123
+ break;
122
124
  case AHARDWAREBUFFER_FORMAT_R5G6B5_UNORM:
123
- format = GrBackendFormats::MakeGL(GR_GL_RGB565, GR_GL_TEXTURE_EXTERNAL);
125
+ GrBackendFormats::MakeGL(GR_GL_RGB565, GR_GL_TEXTURE_EXTERNAL);
126
+ break;
124
127
  case AHARDWAREBUFFER_FORMAT_R10G10B10A2_UNORM:
125
128
  format = GrBackendFormats::MakeGL(GR_GL_RGB10_A2, GR_GL_TEXTURE_EXTERNAL);
129
+ break;
126
130
  case AHARDWAREBUFFER_FORMAT_R8G8B8_UNORM:
127
131
  format = GrBackendFormats::MakeGL(GR_GL_RGB8, GR_GL_TEXTURE_EXTERNAL);
132
+ break;
128
133
  #if __ANDROID_API__ >= 33
129
134
  case AHARDWAREBUFFER_FORMAT_R8_UNORM:
130
135
  format = GrBackendFormats::MakeGL(GR_GL_R8, GR_GL_TEXTURE_EXTERNAL);
136
+ break;
131
137
  #endif
132
138
  default:
133
139
  if (requireKnownFormat) {
@@ -136,10 +142,11 @@ public:
136
142
  format = GrBackendFormats::MakeGL(GR_GL_RGBA8, GR_GL_TEXTURE_EXTERNAL);
137
143
  }
138
144
  }
139
-
145
+ auto width = static_cast<int>(description.width);
146
+ auto height = static_cast<int>(description.height);
140
147
  auto backendTex = MakeGLBackendTexture(
141
148
  _directContext.get(), const_cast<AHardwareBuffer *>(hardwareBuffer),
142
- description.width, description.height, &deleteImageProc,
149
+ width, height, &deleteImageProc,
143
150
  &updateImageProc, &deleteImageCtx, false, format, false);
144
151
  if (!backendTex.isValid()) {
145
152
  RNSkLogger::logToConsole(
@@ -159,8 +166,7 @@ public:
159
166
  }
160
167
 
161
168
  // TODO: remove width, height
162
- std::unique_ptr<WindowContext> MakeWindow(ANativeWindow *window, int width,
163
- int height) {
169
+ std::unique_ptr<WindowContext> MakeWindow(ANativeWindow *window) {
164
170
  auto display = OpenGLSharedContext::getInstance().getDisplay();
165
171
  return std::make_unique<OpenGLWindowContext>(
166
172
  _directContext.get(), display, _glContext.get(), window,
@@ -42,7 +42,7 @@ public:
42
42
  _glSurface = display->makeWindowSurface(config, _window);
43
43
  }
44
44
 
45
- ~OpenGLWindowContext() {
45
+ ~OpenGLWindowContext() override {
46
46
  _skSurface = nullptr;
47
47
  _glSurface = nullptr;
48
48
  ANativeWindow_release(_window);
@@ -1,6 +1,5 @@
1
1
  #pragma once
2
2
 
3
- // TODO: Add android flags
4
3
  #if __ANDROID_API__ >= 26
5
4
  #include <android/hardware_buffer.h>
6
5
  #endif
@@ -28,18 +27,17 @@
28
27
  #pragma clang diagnostic pop
29
28
 
30
29
  namespace RNSkia {
31
- namespace jsi = facebook::jsi;
32
30
 
33
31
  class RNSkAndroidPlatformContext : public RNSkPlatformContext {
34
32
  public:
35
33
  RNSkAndroidPlatformContext(
36
34
  JniPlatformContext *jniPlatformContext,
37
35
  std::shared_ptr<facebook::react::CallInvoker> jsCallInvoker)
38
- : RNSkPlatformContext(jsCallInvoker,
36
+ : RNSkPlatformContext(std::move(jsCallInvoker),
39
37
  jniPlatformContext->getPixelDensity()),
40
38
  _jniPlatformContext(jniPlatformContext) {}
41
39
 
42
- ~RNSkAndroidPlatformContext() {}
40
+ ~RNSkAndroidPlatformContext() override = default;
43
41
 
44
42
  void performStreamOperation(
45
43
  const std::string &sourceUri,
@@ -65,7 +63,7 @@ public:
65
63
  return DawnContext::getInstance().MakeWindow(surface, width, height);
66
64
  #else
67
65
  auto aWindow = reinterpret_cast<ANativeWindow *>(surface);
68
- return OpenGLContext::getInstance().MakeWindow(aWindow, width, height);
66
+ return OpenGLContext::getInstance().MakeWindow(aWindow);
69
67
  #endif
70
68
  }
71
69
 
@@ -89,7 +87,7 @@ public:
89
87
 
90
88
  OpenGLContext::getInstance().makeCurrent();
91
89
  if (glIsTexture(textureInfo.fID) == GL_FALSE) {
92
- throw new std::runtime_error("Invalid textureInfo");
90
+ throw std::runtime_error("Invalid textureInfo");
93
91
  }
94
92
 
95
93
  GrBackendTexture backendTexture = GrBackendTextures::MakeGL(
@@ -109,7 +107,7 @@ public:
109
107
 
110
108
  void releaseNativeBuffer(uint64_t pointer) override {
111
109
  #if __ANDROID_API__ >= 26
112
- AHardwareBuffer *buffer = reinterpret_cast<AHardwareBuffer *>(pointer);
110
+ auto *buffer = reinterpret_cast<AHardwareBuffer *>(pointer);
113
111
  AHardwareBuffer_release(buffer);
114
112
  #endif
115
113
  }
@@ -178,16 +176,16 @@ public:
178
176
  if (!SkImages::GetBackendTextureFromImage(image, &texture, true)) {
179
177
  throw std::runtime_error("Couldn't get backend texture from image.");
180
178
  }
181
- return getJSITextureInfo(texture);
179
+ return getTextureInfo(texture);
182
180
  }
183
181
 
184
182
  const TextureInfo getTexture(sk_sp<SkSurface> surface) override {
185
183
  GrBackendTexture texture = SkSurfaces::GetBackendTexture(
186
184
  surface.get(), SkSurface::BackendHandleAccess::kFlushRead);
187
- return getJSITextureInfo(texture);
185
+ return getTextureInfo(texture);
188
186
  }
189
187
 
190
- static const TextureInfo getJSITextureInfo(const GrBackendTexture &texture) {
188
+ static TextureInfo getTextureInfo(const GrBackendTexture &texture) {
191
189
  if (!texture.isValid()) {
192
190
  throw std::runtime_error("invalid backend texture");
193
191
  }
@@ -35,7 +35,7 @@ RNSkAndroidVideo::RNSkAndroidVideo(jni::global_ref<jobject> jniVideo)
35
35
  #endif
36
36
  }
37
37
 
38
- RNSkAndroidVideo::~RNSkAndroidVideo() {}
38
+ RNSkAndroidVideo::~RNSkAndroidVideo() = default;
39
39
 
40
40
  sk_sp<SkImage> RNSkAndroidVideo::nextImage(double *timeStamp) {
41
41
  #if __ANDROID_API__ >= 26
@@ -26,7 +26,7 @@ private:
26
26
 
27
27
  public:
28
28
  explicit RNSkAndroidVideo(jni::global_ref<jobject> jniVideo);
29
- ~RNSkAndroidVideo();
29
+ ~RNSkAndroidVideo() override;
30
30
  sk_sp<SkImage> nextImage(double *timeStamp = nullptr) override;
31
31
  double duration() override;
32
32
  double framerate() override;
@@ -26,9 +26,9 @@ namespace RNSkia {
26
26
  RNSkOpenGLCanvasProvider::RNSkOpenGLCanvasProvider(
27
27
  std::function<void()> requestRedraw,
28
28
  std::shared_ptr<RNSkia::RNSkPlatformContext> platformContext)
29
- : RNSkCanvasProvider(requestRedraw), _platformContext(platformContext) {}
29
+ : RNSkCanvasProvider(std::move(requestRedraw)), _platformContext(std::move(platformContext)) {}
30
30
 
31
- RNSkOpenGLCanvasProvider::~RNSkOpenGLCanvasProvider() {}
31
+ RNSkOpenGLCanvasProvider::~RNSkOpenGLCanvasProvider() = default;
32
32
 
33
33
  float RNSkOpenGLCanvasProvider::getScaledWidth() {
34
34
  if (_surfaceHolder) {
@@ -110,7 +110,7 @@ void RNSkOpenGLCanvasProvider::surfaceAvailable(jobject jSurfaceTexture,
110
110
  _surfaceHolder = DawnContext::getInstance().MakeWindow(window, width, height);
111
111
  #else
112
112
  _surfaceHolder =
113
- OpenGLContext::getInstance().MakeWindow(window, width, height);
113
+ OpenGLContext::getInstance().MakeWindow(window);
114
114
  #endif
115
115
 
116
116
  // Post redraw request to ensure we paint in the next draw cycle.
@@ -32,20 +32,7 @@ public abstract class SkiaBaseView extends ReactViewGroup implements SkiaViewAPI
32
32
  }
33
33
  }
34
34
 
35
- @Override
36
- protected void onAttachedToWindow() {
37
- super.onAttachedToWindow();
38
- if (getMeasuredWidth() == 0) {
39
- if (mView instanceof SkiaTextureView) {
40
- ((SkiaTextureView) mView).createSurfaceTexture();
41
- }
42
- }
43
- }
44
-
45
35
  void dropInstance() {
46
- if (mView instanceof SkiaTextureView) {
47
- ((SkiaTextureView)mView).isDropped = true;
48
- }
49
36
  unregisterView();
50
37
  }
51
38
 
@@ -15,9 +15,6 @@ public class SkiaTextureView extends TextureView implements TextureView.SurfaceT
15
15
 
16
16
  SkiaViewAPI mApi;
17
17
  boolean mDebug;
18
- boolean pristine = true;
19
-
20
- public boolean isDropped = false;
21
18
 
22
19
  public SkiaTextureView(Context context, SkiaViewAPI api, boolean debug) {
23
20
  super(context);
@@ -27,22 +24,6 @@ public class SkiaTextureView extends TextureView implements TextureView.SurfaceT
27
24
  setSurfaceTextureListener(this);
28
25
  }
29
26
 
30
- public void createSurfaceTexture() {
31
- if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
32
- Log.i(tag, "Create SurfaceTexture");
33
- SurfaceTexture surfaceTexture = new SurfaceTexture(false);
34
- setSurfaceTexture(surfaceTexture);
35
- onSurfaceTextureAvailable(surfaceTexture, getWidth(), getHeight());
36
- }
37
- }
38
-
39
- private void reCreateSurfaceTexture() {
40
- boolean surfaceIsAlreadyAvailable = getSurfaceTexture() != null;
41
- if (surfaceIsAlreadyAvailable) {
42
- createSurfaceTexture();
43
- }
44
- }
45
-
46
27
  @Override
47
28
  protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
48
29
  super.onLayout(changed, left, top, right, bottom);
@@ -57,23 +38,13 @@ public class SkiaTextureView extends TextureView implements TextureView.SurfaceT
57
38
  @Override
58
39
  public void onSurfaceTextureSizeChanged(@NonNull SurfaceTexture surfaceTexture, int width, int height) {
59
40
  Log.i(tag, "onSurfaceTextureSizeChanged: " + width + "x" + height);
60
- if (isDropped) {
61
- return;
62
- }
63
- mApi.onSurfaceTextureCreated(surfaceTexture, width, height);
41
+ mApi.onSurfaceTextureChanged(surfaceTexture, width, height);
64
42
  }
65
43
 
66
44
  @Override
67
45
  public boolean onSurfaceTextureDestroyed(@NonNull SurfaceTexture surfaceTexture) {
68
46
  mApi.onSurfaceDestroyed();
69
- // Because of React Native Screens (which dettach the view), we always keep the surface alive.
70
- // If not, Texture view will recreate the texture surface by itself and
71
- // we will lose the fast first time to frame.
72
- // We only delete the surface when the view is dropped (destroySurface invoked by SkiaBaseViewManager);
73
- if (!isDropped) {
74
- reCreateSurfaceTexture();
75
- }
76
- return false;
47
+ return true;
77
48
  }
78
49
 
79
50
  private long _prevTimestamp = 0;
@@ -64,7 +64,7 @@ public:
64
64
  * and provide functions for accessing and creating the Skia wrapper objects
65
65
  * @param context Platform context
66
66
  */
67
- JsiSkApi(jsi::Runtime &runtime, std::shared_ptr<RNSkPlatformContext> context)
67
+ explicit JsiSkApi(const std::shared_ptr<RNSkPlatformContext> &context)
68
68
  : JsiSkHostObject(context) {
69
69
  // We create the system font manager eagerly since it has proven to be too
70
70
  // slow to do it on demand
@@ -83,7 +83,7 @@ public:
83
83
  auto src = JsiSkRect::fromValue(runtime, arguments[1]);
84
84
  auto dest = JsiSkRect::fromValue(runtime, arguments[2]);
85
85
  auto paint = JsiSkPaint::fromValue(runtime, arguments[3]);
86
- auto fastSample = count < 5 ? false : arguments[4].getBool();
86
+ auto fastSample = count >= 5 && arguments[4].getBool();
87
87
  _canvas->drawImageRect(image, *src, *dest, SkSamplingOptions(), paint.get(),
88
88
  fastSample ? SkCanvas::kFast_SrcRectConstraint
89
89
  : SkCanvas::kStrict_SrcRectConstraint);
@@ -24,7 +24,7 @@ class JsiSkColor : public RNJsi::JsiHostObject {
24
24
  public:
25
25
  JsiSkColor() : JsiHostObject() {}
26
26
 
27
- ~JsiSkColor() {}
27
+ ~JsiSkColor() override = default;
28
28
 
29
29
  static jsi::Object toValue(jsi::Runtime &runtime, SkColor color) {
30
30
  auto result = runtime.global()
@@ -63,7 +63,7 @@ public:
63
63
  * @return A function for creating a new host object wrapper for the SkColor
64
64
  * class
65
65
  */
66
- static const jsi::HostFunctionType createCtor() {
66
+ static jsi::HostFunctionType createCtor() {
67
67
  return JSI_HOST_FUNCTION_LAMBDA {
68
68
  if (arguments[0].isNumber()) {
69
69
  return JsiSkColor::toValue(runtime, arguments[0].getNumber());
@@ -34,7 +34,7 @@
34
34
  namespace CSSColorParser {
35
35
 
36
36
  struct Color {
37
- inline Color() {}
37
+ inline Color() = default;
38
38
  inline Color(unsigned char r_, unsigned char g_, unsigned char b_, float a_)
39
39
  : r(r_), g(g_), b(b_), a(a_ > 1 ? 1
40
40
  : a_ < 0 ? 0
@@ -26,8 +26,8 @@ namespace RNSkia {
26
26
 
27
27
  Base64::Error Base64::Decode(const void *srcv, size_t srcLength, void *dstv,
28
28
  size_t *dstLength) {
29
- const unsigned char *src = static_cast<const unsigned char *>(srcv);
30
- unsigned char *dst = static_cast<unsigned char *>(dstv);
29
+ auto *src = static_cast<const unsigned char *>(srcv);
30
+ auto *dst = static_cast<unsigned char *>(dstv);
31
31
 
32
32
  int i = 0;
33
33
  bool padTwo = false;
@@ -112,8 +112,8 @@ Base64::Error Base64::Decode(const void *srcv, size_t srcLength, void *dstv,
112
112
  }
113
113
 
114
114
  size_t Base64::Encode(const void *srcv, size_t length, void *dstv) {
115
- const unsigned char *src = static_cast<const unsigned char *>(srcv);
116
- unsigned char *dst = static_cast<unsigned char *>(dstv);
115
+ auto *src = static_cast<const unsigned char *>(srcv);
116
+ auto *dst = static_cast<unsigned char *>(dstv);
117
117
 
118
118
  const char *encode = kDefaultEncode;
119
119
  if (dst) {
@@ -69,7 +69,7 @@ void RNSkManager::installBindings() {
69
69
  // Create the API objects and install it on the global object in the
70
70
  // provided runtime.
71
71
 
72
- auto skiaApi = std::make_shared<JsiSkApi>(*_jsRuntime, _platformContext);
72
+ auto skiaApi = std::make_shared<JsiSkApi>(_platformContext);
73
73
  _jsRuntime->global().setProperty(
74
74
  *_jsRuntime, "SkiaApi",
75
75
  jsi::Object::createFromHostObject(*_jsRuntime, std::move(skiaApi)));
@@ -27,7 +27,6 @@
27
27
 
28
28
  namespace RNSkia {
29
29
 
30
- namespace jsi = facebook::jsi;
31
30
  namespace react = facebook::react;
32
31
 
33
32
  struct TextureInfo {
@@ -10,8 +10,6 @@
10
10
  #include "RNSkPlatformContext.h"
11
11
  #include "ViewScreenshotService.h"
12
12
 
13
- #include <jsi/jsi.h>
14
-
15
13
  namespace facebook {
16
14
  namespace react {
17
15
  class CallInvoker;
@@ -20,8 +18,6 @@ class CallInvoker;
20
18
 
21
19
  namespace RNSkia {
22
20
 
23
- namespace jsi = facebook::jsi;
24
-
25
21
  class RNSkiOSPlatformContext : public RNSkPlatformContext {
26
22
  public:
27
23
  RNSkiOSPlatformContext(
@@ -24,10 +24,10 @@ using namespace facebook::react;
24
24
 
25
25
  - (instancetype)initWithFrame:(CGRect)frame {
26
26
  if (self = [super initWithFrame:frame]) {
27
- auto skManager = [[self skiaManager] skManager];
28
- // Pass SkManager as a raw pointer to avoid circular dependenciesr
27
+ // Pass SkManager as a raw pointer to avoid circular dependencies
28
+ auto skManager = [SkiaManager latestActiveSkManager].get();
29
29
  [self
30
- initCommon:skManager.get()
30
+ initCommon:skManager
31
31
  factory:[](std::shared_ptr<RNSkia::RNSkPlatformContext> context) {
32
32
  return std::make_shared<RNSkiOSView<RNSkia::RNSkDomView>>(context);
33
33
  }];
@@ -15,7 +15,8 @@
15
15
  RCT_EXPORT_MODULE(SkiaDomView)
16
16
 
17
17
  - (SkiaManager *)skiaManager {
18
- auto bridge = [RCTBridge currentBridge];
18
+ auto bridge = self.bridge;
19
+ RCTAssert(bridge, @"Bridge must not be nil.");
19
20
  auto skiaModule = (RNSkiaModule *)[bridge moduleForName:@"RNSkiaModule"];
20
21
  return [skiaModule manager];
21
22
  }
@@ -16,4 +16,10 @@
16
16
  jsInvoker:(std::shared_ptr<facebook::react::CallInvoker>)
17
17
  jsInvoker;
18
18
 
19
+ #ifdef RCT_NEW_ARCH_ENABLED
20
+ // Fabric components do not have a better way to interact with TurboModules.
21
+ // Workaround to get the SkManager instance from singleton.
22
+ + (std::shared_ptr<RNSkia::RNSkManager>)latestActiveSkManager;
23
+ #endif // RCT_NEW_ARCH_ENABLED
24
+
19
25
  @end
@@ -8,6 +8,8 @@
8
8
 
9
9
  #import "RNSkiOSPlatformContext.h"
10
10
 
11
+ static __weak SkiaManager *sharedInstance = nil;
12
+
11
13
  @implementation SkiaManager {
12
14
  std::shared_ptr<RNSkia::RNSkManager> _skManager;
13
15
  __weak RCTBridge *weakBridge;
@@ -29,6 +31,7 @@
29
31
  jsInvoker {
30
32
  self = [super init];
31
33
  if (self) {
34
+ sharedInstance = self;
32
35
  RCTCxxBridge *cxxBridge = (RCTCxxBridge *)bridge;
33
36
  if (cxxBridge.runtime) {
34
37
 
@@ -44,4 +47,18 @@
44
47
  return self;
45
48
  }
46
49
 
50
+ - (void)dealloc
51
+ {
52
+ sharedInstance = nil;
53
+ }
54
+
55
+ #ifdef RCT_NEW_ARCH_ENABLED
56
+ + (std::shared_ptr<RNSkia::RNSkManager>)latestActiveSkManager
57
+ {
58
+ if (sharedInstance != nil) {
59
+ return [sharedInstance skManager];
60
+ }
61
+ return nullptr;
62
+ }
63
+ #endif // RCT_NEW_ARCH_ENABLED
47
64
  @end
@@ -24,9 +24,9 @@ using namespace facebook::react;
24
24
 
25
25
  - (instancetype)initWithFrame:(CGRect)frame {
26
26
  if (self = [super initWithFrame:frame]) {
27
- auto skManager = [[self skiaManager] skManager];
28
- // Pass SkManager as a raw pointer to avoid circular dependenciesr
29
- [self initCommon:skManager.get()
27
+ // Pass SkManager as a raw pointer to avoid circular dependencies
28
+ auto skManager = [SkiaManager latestActiveSkManager].get();
29
+ [self initCommon:skManager
30
30
  factory:[](std::shared_ptr<RNSkia::RNSkPlatformContext> context) {
31
31
  return std::make_shared<RNSkiOSView<RNSkia::RNSkPictureView>>(
32
32
  context);
@@ -15,7 +15,8 @@
15
15
  RCT_EXPORT_MODULE(SkiaPictureView)
16
16
 
17
17
  - (SkiaManager *)skiaManager {
18
- auto bridge = [RCTBridge currentBridge];
18
+ auto bridge = self.bridge;
19
+ RCTAssert(bridge, @"Bridge must not be nil.");
19
20
  auto skiaModule = (RNSkiaModule *)[bridge moduleForName:@"RNSkiaModule"];
20
21
  return [skiaModule manager];
21
22
  }
@@ -29,7 +29,6 @@
29
29
  factory:(std::function<std::shared_ptr<RNSkBaseiOSView>(
30
30
  std::shared_ptr<RNSkia::RNSkPlatformContext>)>)factory;
31
31
  - (std::shared_ptr<RNSkBaseiOSView>)impl;
32
- - (SkiaManager *)skiaManager;
33
32
 
34
33
  - (void)setDebugMode:(bool)debugMode;
35
34
  - (void)setOpaque:(bool)opaque;
@@ -48,12 +48,6 @@
48
48
  _factory = factory;
49
49
  }
50
50
 
51
- - (SkiaManager *)skiaManager {
52
- auto bridge = [RCTBridge currentBridge];
53
- auto skiaModule = (RNSkiaModule *)[bridge moduleForName:@"RNSkiaModule"];
54
- return [skiaModule manager];
55
- }
56
-
57
51
  - (void)willInvalidateModules {
58
52
  _impl = nullptr;
59
53
  _manager = nullptr;
@@ -114,7 +108,7 @@
114
108
  // this flag is only set when the view is inserted and we want to set the
115
109
  // manager here since the view could be recycled or the app could be
116
110
  // refreshed and we would have a stale manager then
117
- _manager = [[self skiaManager] skManager].get();
111
+ _manager = [SkiaManager latestActiveSkManager].get();
118
112
  }
119
113
  }
120
114
  #endif // RCT_NEW_ARCH_ENABLED
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.7.0",
10
+ "version": "1.7.2",
11
11
  "description": "High-performance React Native Graphics using Skia",
12
12
  "main": "lib/module/index.js",
13
13
  "react-native": "src/index.ts",