@shopify/react-native-skia 1.5.7 → 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.
@@ -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")
@@ -129,9 +129,11 @@ public:
129
129
  std::unique_ptr<WindowContext> MakeWindow(ANativeWindow *window, int width,
130
130
  int height) {
131
131
  return std::make_unique<OpenGLWindowContext>(
132
- _directContext, _glDisplay.get(), _glContext.get(), window);
132
+ _directContext.get(), _glDisplay.get(), _glContext.get(), window);
133
133
  }
134
134
 
135
+ GrDirectContext *getDirectContext() { return _directContext.get(); }
136
+
135
137
  private:
136
138
  EGLConfig _glConfig;
137
139
  std::unique_ptr<gl::Display> _glDisplay;
@@ -45,7 +45,7 @@ sk_sp<SkSurface> OpenGLWindowContext::getSurface() {
45
45
  sk_sp<SkColorSpace> colorSpace(nullptr);
46
46
  SkSurfaceProps surfaceProps(0, kRGB_H_SkPixelGeometry);
47
47
  _skSurface = SkSurfaces::WrapBackendRenderTarget(
48
- _directContext.get(), backendRT, kBottomLeft_GrSurfaceOrigin,
48
+ _directContext, backendRT, kBottomLeft_GrSurfaceOrigin,
49
49
  kRGBA_8888_SkColorType, colorSpace, &surfaceProps);
50
50
  }
51
51
  return _skSurface;
@@ -33,9 +33,8 @@ namespace RNSkia {
33
33
 
34
34
  class OpenGLWindowContext : public WindowContext {
35
35
  public:
36
- OpenGLWindowContext(sk_sp<GrDirectContext> directContext,
37
- gl::Display *display, gl::Context *glContext,
38
- ANativeWindow *window)
36
+ OpenGLWindowContext(GrDirectContext *directContext, gl::Display *display,
37
+ gl::Context *glContext, ANativeWindow *window)
39
38
  : _directContext(directContext), _display(display), _glContext(glContext),
40
39
  _window(window) {
41
40
  ANativeWindow_acquire(_window);
@@ -60,11 +59,11 @@ public:
60
59
  void resize(int width, int height) override { _skSurface = nullptr; }
61
60
 
62
61
  private:
63
- sk_sp<GrDirectContext> _directContext;
62
+ GrDirectContext *_directContext;
64
63
  gl::Display *_display;
64
+ gl::Context *_glContext = nullptr;
65
65
  ANativeWindow *_window;
66
66
  sk_sp<SkSurface> _skSurface = nullptr;
67
- gl::Context *_glContext = nullptr;
68
67
  std::unique_ptr<gl::Surface> _glSurface = nullptr;
69
68
  };
70
69
 
@@ -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
  }
@@ -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
  }
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.7",
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
  });