@shopify/react-native-skia 1.5.6 → 1.5.8

Sign up to get free protection for your applications and to get access to all the features.
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
- }