@shopify/react-native-skia 1.5.6 → 1.5.8

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.
Files changed (27) 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 +5 -1
  6. package/android/cpp/rnskia-android/OpenGLWindowContext.cpp +20 -49
  7. package/android/cpp/rnskia-android/OpenGLWindowContext.h +13 -16
  8. package/android/cpp/rnskia-android/RNSkAndroidPlatformContext.h +6 -0
  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/gl/Display.h +4 -0
  13. package/android/src/main/java/com/shopify/reactnative/skia/SkiaBaseView.java +7 -7
  14. package/android/src/main/java/com/shopify/reactnative/skia/SkiaDomView.java +1 -3
  15. package/android/src/main/java/com/shopify/reactnative/skia/SkiaPictureView.java +1 -3
  16. package/cpp/api/JsiSkImage.h +20 -4
  17. package/cpp/rnskia/RNSkPlatformContext.h +4 -0
  18. package/cpp/rnskia/RNSkView.h +5 -2
  19. package/ios/RNSkia-iOS/MetalContext.h +2 -0
  20. package/ios/RNSkia-iOS/RNSkiOSPlatformContext.h +3 -0
  21. package/ios/RNSkia-iOS/RNSkiOSPlatformContext.mm +6 -0
  22. package/ios/RNSkia-iOS/SkiaMetalSurfaceFactory.h +2 -2
  23. package/package.json +1 -1
  24. package/react-native-skia.podspec +2 -2
  25. package/src/renderer/__tests__/e2e/Image.spec.tsx +2 -64
  26. package/src/skia/__tests__/assets/oslo-mini.jpg +0 -0
  27. package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaDrawViewManagerInterface.java +0 -18
@@ -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>(this, window, width, height);
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 = kN32_SkColorType;
26
+ auto colorType = kRGBA_8888_SkColorType;
58
27
 
59
28
  auto maxSamples =
60
- _context->_directContext->maxSurfaceSampleCountForColorType(colorType);
29
+ _directContext->maxSurfaceSampleCountForColorType(colorType);
61
30
 
62
31
  if (samples > maxSamples) {
63
32
  samples = maxSamples;
64
33
  }
65
34
 
66
- auto renderTarget = GrBackendRenderTargets::MakeGL(_width, _height, samples,
67
- stencil, fboInfo);
68
-
69
- SkSurfaceProps props(0, kUnknown_SkPixelGeometry);
70
-
71
- // 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);
72
47
  _skSurface = SkSurfaces::WrapBackendRenderTarget(
73
- _context->_directContext.get(), renderTarget,
74
- kBottomLeft_GrSurfaceOrigin, colorType, nullptr, &props,
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
- _context->_glContext->makeCurrent(_glSurface);
86
- _context->_directContext->flushAndSubmit();
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(OpenGLContext *context, ANativeWindow *window, int width,
39
- int height)
40
- : _context(context), _window(window), _width(width), _height(height) {
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
- void resize(int width, int height) override {
55
- _skSurface = nullptr;
56
- _width = width;
57
- _height = height;
58
- }
55
+ int getWidth() override { return ANativeWindow_getWidth(_window); };
59
56
 
60
- int getWidth() override { return _width; };
57
+ int getHeight() override { return ANativeWindow_getHeight(_window); };
61
58
 
62
- int getHeight() override { return _height; };
59
+ void resize(int width, int height) override { _skSurface = nullptr; }
63
60
 
64
61
  private:
65
- OpenGLContext *_context;
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 *_glSurface = nullptr;
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(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;
@@ -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
- //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();
@@ -92,7 +92,11 @@ public:
92
92
  image = DawnContext::getInstance().MakeRasterImage(image);
93
93
  #else
94
94
  if (image->isTextureBacked()) {
95
- image = image->makeNonTextureImage();
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
- if (!getObject()->readPixels(info, bfrPtr, bytesPerRow, srcX, srcY)) {
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 rasterImage = getObject()->makeNonTextureImage();
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;
@@ -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), _width(width), _height(height) {
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
- return image->makeNonTextureImage();
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 };
@@ -37,6 +37,8 @@ public:
37
37
  height);
38
38
  }
39
39
 
40
+ GrDirectContext *getDirectContext() { return _context.skContext.get(); }
41
+
40
42
  private:
41
43
  friend class RNSkia::RNSkiOSPlatformContext;
42
44
  id<MTLDevice> _device;
@@ -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.6",
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
- 170, 186, 199, 255, 170, 186, 199, 255, 170, 186, 199, 255, 170, 186, 199,
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
  });
@@ -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
- }