@shopify/react-native-skia 2.2.3 → 2.2.5

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 (33) hide show
  1. package/android/CMakeLists.txt +12 -2
  2. package/android/build.gradle +1 -0
  3. package/android/cpp/rnskia-android/OpenGLWindowContext.h +1 -3
  4. package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.h +1 -1
  5. package/android/cpp/rnskia-android/gl/Error.cpp +36 -0
  6. package/android/cpp/rnskia-android/gl/Error.h +0 -36
  7. package/apple/MetalContext.h +6 -4
  8. package/apple/MetalWindowContext.mm +2 -2
  9. package/apple/RNSkAppleView.h +3 -3
  10. package/apple/RNSkMetalCanvasProvider.mm +3 -3
  11. package/cpp/api/JsiSkFont.h +0 -1
  12. package/cpp/api/JsiSkFontStyle.h +11 -8
  13. package/cpp/api/JsiSkMatrix.h +3 -0
  14. package/cpp/api/JsiSkParagraph.h +1 -1
  15. package/cpp/api/JsiSkParagraphStyle.h +3 -0
  16. package/cpp/api/JsiSkRSXform.h +3 -0
  17. package/cpp/api/JsiSkTextStyle.h +3 -3
  18. package/cpp/api/recorder/RNRecorder.h +4 -0
  19. package/cpp/api/third_party/SkottieUtils.h +10 -9
  20. package/cpp/rnskia/RNDawnContext.h +1 -1
  21. package/cpp/rnskia/RNSkJsiViewApi.h +8 -8
  22. package/cpp/rnskia/RNSkManager.cpp +2 -2
  23. package/cpp/rnskia/RNSkPictureView.h +3 -1
  24. package/cpp/rnskia/RNSkView.h +7 -5
  25. package/cpp/utils/RNSkTimingInfo.h +0 -1
  26. package/lib/commonjs/sksg/Recorder/commands/Drawing.js +2 -2
  27. package/lib/commonjs/sksg/Recorder/commands/Drawing.js.map +1 -1
  28. package/lib/module/sksg/Recorder/commands/Drawing.js +2 -2
  29. package/lib/module/sksg/Recorder/commands/Drawing.js.map +1 -1
  30. package/package.json +5 -5
  31. package/react-native-skia.podspec +1 -1
  32. package/src/renderer/__tests__/e2e/Drawings.spec.tsx +50 -1
  33. package/src/sksg/Recorder/commands/Drawing.ts +2 -2
@@ -2,7 +2,7 @@ project(RNSkia)
2
2
  cmake_minimum_required(VERSION 3.4.1)
3
3
 
4
4
  set (CMAKE_VERBOSE_MAKEFILE ON)
5
- set (CMAKE_CXX_STANDARD 17)
5
+ set (CMAKE_CXX_STANDARD 20)
6
6
 
7
7
  # Import prebuilt SKIA libraries path
8
8
  set (SKIA_LIBS_PATH "${CMAKE_CURRENT_SOURCE_DIR}/../libs/android/${ANDROID_ABI}")
@@ -50,7 +50,8 @@ else()
50
50
  message("-- SK_GRAPHITE: OFF (Graphite symbols not found in libskia)")
51
51
  endif()
52
52
 
53
- set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DSK_BUILD_FOR_ANDROID -DSK_DISABLE_LEGACY_SHAPER_FACTORY -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")
53
+ string(APPEND CMAKE_CXX_FLAGS " -DSK_BUILD_FOR_ANDROID -DSK_DISABLE_LEGACY_SHAPER_FACTORY -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")
54
+
54
55
  set (PACKAGE_NAME "rnskia")
55
56
  set (SKIA_LIB "skia")
56
57
  set (SKIA_SVG_LIB "svg")
@@ -300,6 +301,15 @@ message("-- TURBO : " ${TURBOMODULES_LIB})
300
301
 
301
302
  add_definitions(-DREACT_NATIVE_VERSION=${REACT_NATIVE_VERSION})
302
303
 
304
+ # Set RN_SERIALIZABLE_STATE and C++ flags for React Native 0.81+
305
+ if(${REACT_NATIVE_VERSION} GREATER_EQUAL 80)
306
+ include("${REACT_NATIVE_DIR}/ReactCommon/cmake-utils/react-native-flags.cmake")
307
+ target_compile_reactnative_options(${PACKAGE_NAME} PRIVATE)
308
+ else()
309
+ string(APPEND CMAKE_CXX_FLAGS
310
+ " -fexceptions -frtti -std=c++${CMAKE_CXX_STANDARD} -Wall -Werror -Wunused-function -Wunused-private-field -Woverloaded-virtual -Wreorder-ctor -Wdelete-non-abstract-non-virtual-dtor -Wmismatched-tags -Wunused-variable -Wpessimizing-move -Wswitch -Wdeprecated-declarations")
311
+ endif()
312
+
303
313
  # Link
304
314
  if(${REACT_NATIVE_VERSION} GREATER_EQUAL 76)
305
315
  set(COMMON_LIBS
@@ -155,6 +155,7 @@ android {
155
155
  abiFilters (*reactNativeArchitectures())
156
156
  arguments '-DANDROID_STL=c++_shared',
157
157
  "-DREACT_NATIVE_VERSION=${REACT_NATIVE_VERSION}",
158
+ "-DREACT_NATIVE_DIR=${defaultDir}",
158
159
  "-DNODE_MODULES_DIR=${nodeModules}",
159
160
  "-DPREBUILT_DIR=${prebuiltDir}",
160
161
  "-DANDROID_SUPPORT_FLEXIBLE_PAGE_SIZES=ON"
@@ -36,8 +36,7 @@ public:
36
36
  OpenGLWindowContext(GrDirectContext *directContext, gl::Display *display,
37
37
  gl::Context *glContext, ANativeWindow *window,
38
38
  EGLConfig config)
39
- : _directContext(directContext), _display(display), _glContext(glContext),
40
- _window(window) {
39
+ : _directContext(directContext), _glContext(glContext), _window(window) {
41
40
  ANativeWindow_acquire(_window);
42
41
  _glSurface = display->makeWindowSurface(config, _window);
43
42
  }
@@ -67,7 +66,6 @@ public:
67
66
 
68
67
  private:
69
68
  GrDirectContext *_directContext;
70
- gl::Display *_display;
71
69
  gl::Context *_glContext = nullptr;
72
70
  ANativeWindow *_window;
73
71
  sk_sp<SkSurface> _skSurface = nullptr;
@@ -19,7 +19,7 @@ public:
19
19
  std::function<void()> requestRedraw,
20
20
  std::shared_ptr<RNSkia::RNSkPlatformContext> platformContext);
21
21
 
22
- ~RNSkOpenGLCanvasProvider();
22
+ virtual ~RNSkOpenGLCanvasProvider();
23
23
 
24
24
  int getWidth() override;
25
25
 
@@ -2,6 +2,42 @@
2
2
 
3
3
  #include "RNSkLog.h"
4
4
 
5
+ static const char *EGLErrorToString(EGLint error) {
6
+ switch (error) {
7
+ case EGL_SUCCESS:
8
+ return "Success";
9
+ case EGL_NOT_INITIALIZED:
10
+ return "Not Initialized";
11
+ case EGL_BAD_ACCESS:
12
+ return "Bad Access";
13
+ case EGL_BAD_ALLOC:
14
+ return "Bad Alloc";
15
+ case EGL_BAD_ATTRIBUTE:
16
+ return "Bad Attribute";
17
+ case EGL_BAD_CONTEXT:
18
+ return "Bad Context";
19
+ case EGL_BAD_CONFIG:
20
+ return "Bad Config";
21
+ case EGL_BAD_CURRENT_SURFACE:
22
+ return "Bad Current Surface";
23
+ case EGL_BAD_DISPLAY:
24
+ return "Bad Display";
25
+ case EGL_BAD_SURFACE:
26
+ return "Bad Surface";
27
+ case EGL_BAD_MATCH:
28
+ return "Bad Match";
29
+ case EGL_BAD_PARAMETER:
30
+ return "Bad Parameter";
31
+ case EGL_BAD_NATIVE_PIXMAP:
32
+ return "Bad Native Pixmap";
33
+ case EGL_BAD_NATIVE_WINDOW:
34
+ return "Bad Native Window";
35
+ case EGL_CONTEXT_LOST:
36
+ return "Context Lost";
37
+ }
38
+ return "Unknown";
39
+ }
40
+
5
41
  void LogEGLError(const char *file, int line) {
6
42
  const auto error = eglGetError();
7
43
  RNSkia::RNSkLogger::logToConsole("EGL Error: %s (%d) in %s:%d",
@@ -5,40 +5,4 @@
5
5
 
6
6
  #define LOG_EGL_ERROR LogEGLError(__FILE__, __LINE__);
7
7
 
8
- static const char *EGLErrorToString(EGLint error) {
9
- switch (error) {
10
- case EGL_SUCCESS:
11
- return "Success";
12
- case EGL_NOT_INITIALIZED:
13
- return "Not Initialized";
14
- case EGL_BAD_ACCESS:
15
- return "Bad Access";
16
- case EGL_BAD_ALLOC:
17
- return "Bad Alloc";
18
- case EGL_BAD_ATTRIBUTE:
19
- return "Bad Attribute";
20
- case EGL_BAD_CONTEXT:
21
- return "Bad Context";
22
- case EGL_BAD_CONFIG:
23
- return "Bad Config";
24
- case EGL_BAD_CURRENT_SURFACE:
25
- return "Bad Current Surface";
26
- case EGL_BAD_DISPLAY:
27
- return "Bad Display";
28
- case EGL_BAD_SURFACE:
29
- return "Bad Surface";
30
- case EGL_BAD_MATCH:
31
- return "Bad Match";
32
- case EGL_BAD_PARAMETER:
33
- return "Bad Parameter";
34
- case EGL_BAD_NATIVE_PIXMAP:
35
- return "Bad Native Pixmap";
36
- case EGL_BAD_NATIVE_WINDOW:
37
- return "Bad Native Window";
38
- case EGL_CONTEXT_LOST:
39
- return "Context Lost";
40
- }
41
- return "Unknown";
42
- }
43
-
44
8
  void LogEGLError(const char *file, int line);
@@ -112,11 +112,13 @@ public:
112
112
  }
113
113
  }
114
114
 
115
- std::unique_ptr<RNSkia::WindowContext> MakeWindow(CALayer *window, int width,
116
- int height, bool useP3ColorSpace = true) {
115
+ std::unique_ptr<RNSkia::WindowContext>
116
+ MakeWindow(CALayer *window, int width, int height,
117
+ bool useP3ColorSpace = true) {
117
118
  auto device = MetalSharedContext::getInstance().getDevice();
118
- return std::make_unique<MetalWindowContext>(
119
- _directContext.get(), device, _commandQueue, window, width, height, useP3ColorSpace);
119
+ return std::make_unique<MetalWindowContext>(_directContext.get(), device,
120
+ _commandQueue, window, width,
121
+ height, useP3ColorSpace);
120
122
  }
121
123
 
122
124
  GrDirectContext *getDirectContext() { return _directContext.get(); }
@@ -27,8 +27,8 @@ MetalWindowContext::MetalWindowContext(GrDirectContext *directContext,
27
27
  BOOL supportsWideColor = NO;
28
28
  if (useP3ColorSpace) {
29
29
  if (@available(iOS 10.0, *)) {
30
- supportsWideColor =
31
- [UIScreen mainScreen].traitCollection.displayGamut == UIDisplayGamutP3;
30
+ supportsWideColor = [UIScreen mainScreen].traitCollection.displayGamut ==
31
+ UIDisplayGamutP3;
32
32
  }
33
33
  }
34
34
  if (supportsWideColor) {
@@ -17,9 +17,9 @@ public:
17
17
  template <class T> class RNSkAppleView : public RNSkBaseAppleView, public T {
18
18
  public:
19
19
  RNSkAppleView(std::shared_ptr<RNSkia::RNSkPlatformContext> context)
20
- : T(context,
21
- std::make_shared<RNSkMetalCanvasProvider>(
22
- std::bind(&RNSkia::RNSkView::requestRedraw, this), context, true)) {}
20
+ : T(context, std::make_shared<RNSkMetalCanvasProvider>(
21
+ std::bind(&RNSkia::RNSkView::requestRedraw, this),
22
+ context, true)) {}
23
23
 
24
24
  CALayer *getLayer() override {
25
25
  return std::static_pointer_cast<RNSkMetalCanvasProvider>(
@@ -23,9 +23,9 @@
23
23
 
24
24
  RNSkMetalCanvasProvider::RNSkMetalCanvasProvider(
25
25
  std::function<void()> requestRedraw,
26
- std::shared_ptr<RNSkia::RNSkPlatformContext> context,
27
- bool useP3ColorSpace)
28
- : RNSkCanvasProvider(requestRedraw), _context(context), _useP3ColorSpace(useP3ColorSpace) {
26
+ std::shared_ptr<RNSkia::RNSkPlatformContext> context, bool useP3ColorSpace)
27
+ : RNSkCanvasProvider(requestRedraw), _context(context),
28
+ _useP3ColorSpace(useP3ColorSpace) {
29
29
  #pragma clang diagnostic push
30
30
  #pragma clang diagnostic ignored "-Wunguarded-availability-new"
31
31
  _layer = [CAMetalLayer layer];
@@ -65,7 +65,6 @@ public:
65
65
  SkTextEncoding::kUTF8);
66
66
  std::vector<SkGlyphID> glyphs;
67
67
  glyphs.resize(numGlyphIDs);
68
- int glyphsSize = static_cast<int>(numGlyphIDs);
69
68
  auto g = SkSpan(glyphs.data(), glyphs.size());
70
69
  getObject()->textToGlyphs(str.c_str(), str.length(), SkTextEncoding::kUTF8,
71
70
  g);
@@ -37,17 +37,20 @@ public:
37
37
  return object.asHostObject<JsiSkFontStyle>(runtime)->getObject();
38
38
  } else {
39
39
  auto weightProp = object.getProperty(runtime, "weight");
40
- auto weight = static_cast<int>(weightProp.isUndefined()
41
- ? SkFontStyle::Weight::kNormal_Weight
42
- : weightProp.asNumber());
40
+ auto weight = static_cast<int>(
41
+ weightProp.isUndefined()
42
+ ? static_cast<double>(SkFontStyle::Weight::kNormal_Weight)
43
+ : weightProp.asNumber());
43
44
  auto widthProp = object.getProperty(runtime, "width");
44
- auto width = static_cast<int>(widthProp.isUndefined()
45
- ? SkFontStyle::Width::kNormal_Width
46
- : widthProp.asNumber());
45
+ auto width = static_cast<int>(
46
+ widthProp.isUndefined()
47
+ ? static_cast<double>(SkFontStyle::Width::kNormal_Width)
48
+ : widthProp.asNumber());
47
49
  auto slantProp = object.getProperty(runtime, "slant");
48
50
  auto slant = static_cast<SkFontStyle::Slant>(
49
- slantProp.isUndefined() ? SkFontStyle::Slant::kUpright_Slant
50
- : slantProp.asNumber());
51
+ slantProp.isUndefined()
52
+ ? static_cast<double>(SkFontStyle::Slant::kUpright_Slant)
53
+ : slantProp.asNumber());
51
54
  SkFontStyle style(weight, width, slant);
52
55
  return std::make_shared<SkFontStyle>(style);
53
56
  }
@@ -127,6 +127,8 @@ public:
127
127
  return thisValue.asObject(runtime);
128
128
  }
129
129
 
130
+ #pragma clang diagnostic push
131
+ #pragma clang diagnostic ignored "-Woverloaded-virtual"
130
132
  JSI_HOST_FUNCTION(get) {
131
133
  auto values = jsi::Array(runtime, 9);
132
134
  for (auto i = 0; i < 9; i++) {
@@ -134,6 +136,7 @@ public:
134
136
  }
135
137
  return values;
136
138
  }
139
+ #pragma clang diagnostic pop
137
140
 
138
141
  EXPORT_JSI_API_TYPENAME(JsiSkMatrix, Matrix)
139
142
 
@@ -141,7 +141,7 @@ public:
141
141
  explicit JsiSkParagraph(std::shared_ptr<RNSkPlatformContext> context,
142
142
  para::ParagraphBuilder *paragraphBuilder)
143
143
  : JsiSkWrappingSharedPtrHostObject<para::Paragraph>(
144
- std::move(context), std::move(paragraphBuilder->Build())) {}
144
+ std::move(context), paragraphBuilder->Build()) {}
145
145
  };
146
146
 
147
147
  } // namespace RNSkia
@@ -117,8 +117,11 @@ private:
117
117
  static void fromUTF8(
118
118
  const std::string &source,
119
119
  std::basic_string<T, std::char_traits<T>, std::allocator<T>> &result) {
120
+ #pragma clang diagnostic push
121
+ #pragma clang diagnostic ignored "-Wdeprecated-declarations"
120
122
  std::wstring_convert<std::codecvt_utf8_utf16<T>, T> convertor;
121
123
  result = convertor.from_bytes(source);
124
+ #pragma clang diagnostic pop
122
125
  }
123
126
  };
124
127
 
@@ -40,6 +40,8 @@ public:
40
40
  return jsi::Value(SkScalarToDouble(getObject()->fTy));
41
41
  }
42
42
 
43
+ #pragma clang diagnostic push
44
+ #pragma clang diagnostic ignored "-Woverloaded-virtual"
43
45
  JSI_HOST_FUNCTION(set) {
44
46
  auto scos = arguments[0].asNumber();
45
47
  auto ssin = arguments[1].asNumber();
@@ -48,6 +50,7 @@ public:
48
50
  getObject()->set(scos, ssin, tx, ty);
49
51
  return jsi::Value::undefined();
50
52
  }
53
+ #pragma clang diagnostic pop
51
54
 
52
55
  JSI_EXPORT_PROPERTY_GETTERS(JSI_EXPORT_PROP_GET(JsiSkRSXform, __typename__),
53
56
  JSI_EXPORT_PROP_GET(JsiSkRSXform, scos),
@@ -110,17 +110,17 @@ public:
110
110
  auto weight = static_cast<SkFontStyle::Weight>(
111
111
  propValue.hasProperty(runtime, "weight")
112
112
  ? propValue.getProperty(runtime, "weight").asNumber()
113
- : SkFontStyle::Weight::kNormal_Weight);
113
+ : static_cast<double>(SkFontStyle::Weight::kNormal_Weight));
114
114
 
115
115
  auto width = static_cast<SkFontStyle::Width>(
116
116
  propValue.hasProperty(runtime, "width")
117
117
  ? propValue.getProperty(runtime, "width").asNumber()
118
- : SkFontStyle::Width::kNormal_Width);
118
+ : static_cast<double>(SkFontStyle::Width::kNormal_Width));
119
119
 
120
120
  auto slant = static_cast<SkFontStyle::Slant>(
121
121
  propValue.hasProperty(runtime, "slant")
122
122
  ? propValue.getProperty(runtime, "slant").asNumber()
123
- : SkFontStyle::Slant::kUpright_Slant);
123
+ : static_cast<double>(SkFontStyle::Slant::kUpright_Slant));
124
124
 
125
125
  retVal.setFontStyle(SkFontStyle(weight, width, slant));
126
126
  }
@@ -631,6 +631,10 @@ public:
631
631
  skottieCmd->draw(ctx);
632
632
  break;
633
633
  }
634
+ default:
635
+ // Context commands (Group, SavePaint, RestorePaint, etc.) are not
636
+ // handled here
637
+ break;
634
638
  }
635
639
 
636
640
  ctx->restorePaint();
@@ -21,21 +21,23 @@
21
21
  struct SkSize;
22
22
 
23
23
  namespace skottie {
24
- class MarkerObserver;
24
+ class MarkerObserver;
25
25
 
26
- inline void PropertyObserver::onColorProperty(
27
- const char node_name[], const LazyHandle<ColorPropertyHandle> &) {}
26
+ inline void
27
+ PropertyObserver::onColorProperty(const char node_name[],
28
+ const LazyHandle<ColorPropertyHandle> &) {}
28
29
 
29
30
  inline void PropertyObserver::onOpacityProperty(
30
31
  const char node_name[], const LazyHandle<OpacityPropertyHandle> &) {}
31
- inline void PropertyObserver::onTextProperty(const char node_name[],
32
- const LazyHandle<TextPropertyHandle> &) {}
32
+ inline void
33
+ PropertyObserver::onTextProperty(const char node_name[],
34
+ const LazyHandle<TextPropertyHandle> &) {}
33
35
  inline void PropertyObserver::onTransformProperty(
34
36
  const char node_name[], const LazyHandle<TransformPropertyHandle> &) {}
35
- inline void PropertyObserver::onEnterNode(const char node_name[], NodeType node_type) {
36
- }
37
+ inline void PropertyObserver::onEnterNode(const char node_name[],
38
+ NodeType node_type) {}
37
39
  inline void PropertyObserver::onLeavingNode(const char node_name[],
38
- NodeType node_type) {}
40
+ NodeType node_type) {}
39
41
 
40
42
  } // namespace skottie
41
43
 
@@ -169,4 +171,3 @@ private:
169
171
  };
170
172
 
171
173
  } // namespace RNSkia
172
-
@@ -3,9 +3,9 @@
3
3
  #include <memory>
4
4
  #include <mutex>
5
5
 
6
+ #include "RNDawnUtils.h"
6
7
  #include "RNDawnWindowContext.h"
7
8
  #include "RNImageProvider.h"
8
- #include "RNDawnUtils.h"
9
9
 
10
10
  #include "include/core/SkData.h"
11
11
  #include "include/gpu/graphite/BackendTexture.h"
@@ -234,15 +234,13 @@ public:
234
234
 
235
235
  JSI_HOST_FUNCTION(size) {
236
236
  if (count != 1) {
237
- _platformContext->raiseError(
238
- std::string("size: Expected 1 argument, got " +
239
- std::to_string(count) + "."));
237
+ _platformContext->raiseError(std::string(
238
+ "size: Expected 1 argument, got " + std::to_string(count) + "."));
240
239
  return jsi::Value::undefined();
241
240
  }
242
241
 
243
242
  if (!arguments[0].isNumber()) {
244
- _platformContext->raiseError(
245
- "size: First argument must be a number");
243
+ _platformContext->raiseError("size: First argument must be a number");
246
244
  return jsi::Value::undefined();
247
245
  }
248
246
 
@@ -254,11 +252,13 @@ public:
254
252
  if (view != nullptr) {
255
253
  auto pixelDensity = _platformContext->getPixelDensity();
256
254
  auto sizeObj = jsi::Object(runtime);
257
- sizeObj.setProperty(runtime, "width", view->getScaledWidth() / pixelDensity);
258
- sizeObj.setProperty(runtime, "height", view->getScaledHeight() / pixelDensity);
255
+ sizeObj.setProperty(runtime, "width",
256
+ view->getScaledWidth() / pixelDensity);
257
+ sizeObj.setProperty(runtime, "height",
258
+ view->getScaledHeight() / pixelDensity);
259
259
  return sizeObj;
260
260
  }
261
-
261
+
262
262
  // Return default size if view not found
263
263
  auto sizeObj = jsi::Object(runtime);
264
264
  sizeObj.setProperty(runtime, "width", 0);
@@ -18,8 +18,8 @@ RNSkManager::RNSkManager(
18
18
  jsi::Runtime *jsRuntime,
19
19
  std::shared_ptr<facebook::react::CallInvoker> jsCallInvoker,
20
20
  std::shared_ptr<RNSkPlatformContext> platformContext)
21
- : _jsRuntime(jsRuntime), _jsCallInvoker(jsCallInvoker),
22
- _platformContext(platformContext),
21
+ : _jsRuntime(jsRuntime), _platformContext(platformContext),
22
+ _jsCallInvoker(jsCallInvoker),
23
23
  _viewApi(std::make_shared<RNSkJsiViewApi>(platformContext)) {
24
24
 
25
25
  // Register main runtime
@@ -27,7 +27,7 @@
27
27
  #pragma clang diagnostic pop
28
28
 
29
29
  class SkPicture;
30
- class SkRect;
30
+ struct SkRect;
31
31
  class SkImage;
32
32
 
33
33
  namespace RNSkia {
@@ -43,6 +43,8 @@ public:
43
43
  : RNSkRenderer(std::move(requestRedraw)),
44
44
  _platformContext(std::move(context)) {}
45
45
 
46
+ virtual ~RNSkPictureRenderer() = default;
47
+
46
48
  void
47
49
  renderImmediate(std::shared_ptr<RNSkCanvasProvider> canvasProvider) override {
48
50
  performDraw(canvasProvider);
@@ -69,15 +69,17 @@ protected:
69
69
 
70
70
  class RNSkOffscreenCanvasProvider : public RNSkCanvasProvider {
71
71
  public:
72
- RNSkOffscreenCanvasProvider(std::shared_ptr<RNSkPlatformContext> context,
73
- std::function<void()> requestRedraw, float width,
74
- float height)
75
- : RNSkCanvasProvider(requestRedraw), _context(context), _width(width),
76
- _height(height) {
72
+ RNSkOffscreenCanvasProvider(
73
+ const std::shared_ptr<RNSkPlatformContext> &context,
74
+ std::function<void()> requestRedraw, float width, float height)
75
+ : RNSkCanvasProvider(std::move(requestRedraw)), _width(width),
76
+ _height(height), _context(context) {
77
77
  _surface = context->makeOffscreenSurface(_width, _height);
78
78
  _pd = context->getPixelDensity();
79
79
  }
80
80
 
81
+ virtual ~RNSkOffscreenCanvasProvider() = default;
82
+
81
83
  /**
82
84
  Returns a snapshot of the current surface/canvas
83
85
  */
@@ -90,7 +90,6 @@ private:
90
90
  _frameCount++;
91
91
  }
92
92
 
93
- double _lastTimeStamp;
94
93
  long _lastDurations[NUMBER_OF_DURATION_SAMPLES];
95
94
  int _lastDurationIndex;
96
95
  int _lastDurationsCount;
@@ -180,8 +180,8 @@ const drawPath = (ctx, props) => {
180
180
  stroke,
181
181
  ...pathProps
182
182
  } = props;
183
- const start = (0, _processors.saturate)(trimStart);
184
- const end = (0, _processors.saturate)(trimEnd);
183
+ const start = Math.fround((0, _processors.saturate)(trimStart));
184
+ const end = Math.fround((0, _processors.saturate)(trimEnd));
185
185
  const hasStartOffset = start !== 0;
186
186
  const hasEndOffset = end !== 1;
187
187
  const hasStrokeOptions = stroke !== undefined;
@@ -1 +1 @@
1
- {"version":3,"names":["_nodes","require","_processors","_types","drawLine","ctx","props","p1","p2","canvas","x","y","paint","exports","drawOval","rect","processRect","Skia","drawImage","image","sampling","_props$fit","fit","src","dst","fitRects","width","height","isCubicSampling","drawImageRectCubic","B","C","_sampling$filter","_sampling$mipmap","drawImageRectOptions","filter","FilterMode","Linear","mipmap","MipmapMode","None","drawPoints","points","mode","PointMode","enumKey","drawVertices","textures","colors","indices","blendMode","vertexMode","VertexMode","Triangles","vertices","MakeVertices","map","c","processColor","undefined","defaultBlendMode","BlendMode","DstOver","SrcOver","blend","drawDiffRect","outer","inner","drawDRRect","drawTextPath","path","processPath","font","initialOffset","text","ids","getGlyphIDs","widths","getGlyphWidths","rsx","meas","ContourMeasureIter","cont","next","dist","i","length","substring","p","t","getPosTan","adjustedX","adjustedY","push","RSXform","derived","TextBlob","MakeFromRSXform","drawTextBlob","drawText","drawPatch","texture","patch","pos","c2","c1","drawPath","start","trimStart","end","trimEnd","fillType","stroke","pathProps","saturate","hasStartOffset","hasEndOffset","hasStrokeOptions","hasFillType","willMutatePath","pristinePath","copy","setFillType","FillType","trim","drawRect","drawRRect","processRRect","blob","drawGlyphs","glyphs","reduce","acc","glyph","id","positions","drawImageSVG","svg","save","translate","drawSvg","restore","drawParagraph","paragraph","layout","drawPicture","picture","drawAtlas","sprites","transforms","drawCircle","processCircle","r","drawSkottie","animation","frame","seekFrame","render"],"sources":["Drawing.ts"],"sourcesContent":["import {\n enumKey,\n fitRects,\n processCircle,\n processColor,\n processPath,\n processRect,\n processRRect,\n} from \"../../../dom/nodes\";\nimport type {\n AtlasProps,\n CircleProps,\n DiffRectProps,\n GlyphsProps,\n ImageProps,\n ImageSVGProps,\n LineProps,\n OvalProps,\n ParagraphProps,\n PatchProps,\n PathProps,\n PictureProps,\n PointsProps,\n RectProps,\n RoundedRectProps,\n SkottieProps,\n TextBlobProps,\n TextPathProps,\n TextProps,\n VerticesProps,\n} from \"../../../dom/types\";\nimport { saturate } from \"../../../renderer/processors\";\nimport type { SkPoint, SkRSXform } from \"../../../skia/types\";\nimport {\n BlendMode,\n FillType,\n FilterMode,\n isCubicSampling,\n MipmapMode,\n PointMode,\n VertexMode,\n} from \"../../../skia/types\";\nimport type { DrawingContext } from \"../DrawingContext\";\n\nexport const drawLine = (ctx: DrawingContext, props: LineProps) => {\n \"worklet\";\n const { p1, p2 } = props;\n ctx.canvas.drawLine(p1.x, p1.y, p2.x, p2.y, ctx.paint);\n};\n\nexport const drawOval = (ctx: DrawingContext, props: OvalProps) => {\n \"worklet\";\n const rect = processRect(ctx.Skia, props);\n ctx.canvas.drawOval(rect, ctx.paint);\n};\n\nexport const drawImage = (ctx: DrawingContext, props: ImageProps) => {\n \"worklet\";\n const { image, sampling } = props;\n if (image) {\n const fit = props.fit ?? \"contain\";\n const rect = processRect(ctx.Skia, props);\n const { src, dst } = fitRects(\n fit,\n {\n x: 0,\n y: 0,\n width: image.width(),\n height: image.height(),\n },\n rect\n );\n if (sampling && isCubicSampling(sampling)) {\n ctx.canvas.drawImageRectCubic(\n image,\n src,\n dst,\n sampling.B,\n sampling.C,\n ctx.paint\n );\n } else {\n ctx.canvas.drawImageRectOptions(\n image,\n src,\n dst,\n sampling?.filter ?? FilterMode.Linear,\n sampling?.mipmap ?? MipmapMode.None,\n ctx.paint\n );\n }\n }\n};\n\nexport const drawPoints = (ctx: DrawingContext, props: PointsProps) => {\n \"worklet\";\n const { points, mode } = props;\n ctx.canvas.drawPoints(PointMode[enumKey(mode)], points, ctx.paint);\n};\n\nexport const drawVertices = (ctx: DrawingContext, props: VerticesProps) => {\n \"worklet\";\n const { mode, textures, colors, indices, blendMode } = props;\n const vertexMode = mode ? VertexMode[enumKey(mode)] : VertexMode.Triangles;\n const vertices = ctx.Skia.MakeVertices(\n vertexMode,\n props.vertices,\n textures,\n colors ? colors.map((c) => processColor(ctx.Skia, c)) : undefined,\n indices\n );\n const defaultBlendMode = colors ? BlendMode.DstOver : BlendMode.SrcOver;\n const blend = blendMode ? BlendMode[enumKey(blendMode)] : defaultBlendMode;\n\n ctx.canvas.drawVertices(vertices, blend, ctx.paint);\n};\n\nexport const drawDiffRect = (ctx: DrawingContext, props: DiffRectProps) => {\n \"worklet\";\n const { outer, inner } = props;\n ctx.canvas.drawDRRect(outer, inner, ctx.paint);\n};\n\nexport const drawTextPath = (ctx: DrawingContext, props: TextPathProps) => {\n \"worklet\";\n const path = processPath(ctx.Skia, props.path);\n const { font, initialOffset } = props;\n if (font) {\n let { text } = props;\n const ids = font.getGlyphIDs(text);\n const widths = font.getGlyphWidths(ids);\n const rsx: SkRSXform[] = [];\n const meas = ctx.Skia.ContourMeasureIter(path, false, 1);\n let cont = meas.next();\n let dist = initialOffset;\n for (let i = 0; i < text.length && cont; i++) {\n const width = widths[i];\n dist += width / 2;\n if (dist > cont.length()) {\n // jump to next contour\n cont = meas.next();\n if (!cont) {\n // We have come to the end of the path - terminate the string\n // right here.\n text = text.substring(0, i);\n break;\n }\n dist = width / 2;\n }\n // Gives us the (x, y) coordinates as well as the cos/sin of the tangent\n // line at that position.\n const [p, t] = cont.getPosTan(dist);\n const adjustedX = p.x - (width / 2) * t.x;\n const adjustedY = p.y - (width / 2) * t.y;\n rsx.push(ctx.Skia.RSXform(t.x, t.y, adjustedX, adjustedY));\n dist += width / 2;\n }\n const derived = ctx.Skia.TextBlob.MakeFromRSXform(text, rsx, font);\n ctx.canvas.drawTextBlob(derived, 0, 0, ctx.paint);\n }\n};\n\nexport const drawText = (ctx: DrawingContext, props: TextProps) => {\n \"worklet\";\n const { text, x, y, font } = props;\n if (font != null) {\n ctx.canvas.drawText(text, x, y, ctx.paint, font);\n }\n};\n\nexport const drawPatch = (ctx: DrawingContext, props: PatchProps) => {\n \"worklet\";\n const { texture, blendMode, patch } = props;\n const defaultBlendMode = props.colors ? BlendMode.DstOver : BlendMode.SrcOver;\n const mode = blendMode ? BlendMode[enumKey(blendMode)] : defaultBlendMode;\n // Patch requires a path with the following constraints:\n // M tl\n // C c1 c2 br\n // C c1 c2 bl\n // C c1 c2 tl (the redundant point in the last command is removed)\n\n const points = [\n patch[0].pos,\n patch[0].c2,\n patch[1].c1,\n patch[1].pos,\n patch[1].c2,\n patch[2].c1,\n patch[2].pos,\n patch[2].c2,\n patch[3].c1,\n patch[3].pos,\n patch[3].c2,\n patch[0].c1,\n ];\n const colors = props.colors\n ? props.colors.map((c) => processColor(ctx.Skia, c))\n : undefined;\n ctx.canvas.drawPatch(points, colors, texture, mode, ctx.paint);\n};\n\nexport const drawPath = (ctx: DrawingContext, props: PathProps) => {\n \"worklet\";\n const {\n start: trimStart,\n end: trimEnd,\n fillType,\n stroke,\n ...pathProps\n } = props;\n const start = saturate(trimStart);\n const end = saturate(trimEnd);\n const hasStartOffset = start !== 0;\n const hasEndOffset = end !== 1;\n const hasStrokeOptions = stroke !== undefined;\n const hasFillType = !!fillType;\n const willMutatePath =\n hasStartOffset || hasEndOffset || hasStrokeOptions || hasFillType;\n const pristinePath = processPath(ctx.Skia, pathProps.path);\n const path = willMutatePath ? pristinePath.copy() : pristinePath;\n if (hasFillType) {\n path.setFillType(FillType[enumKey(fillType)]);\n }\n if (hasStrokeOptions) {\n path.stroke(stroke);\n }\n if (hasStartOffset || hasEndOffset) {\n path.trim(start, end, false);\n }\n ctx.canvas.drawPath(path, ctx.paint);\n};\n\nexport const drawRect = (ctx: DrawingContext, props: RectProps) => {\n \"worklet\";\n const derived = processRect(ctx.Skia, props);\n ctx.canvas.drawRect(derived, ctx.paint);\n};\n\nexport const drawRRect = (ctx: DrawingContext, props: RoundedRectProps) => {\n \"worklet\";\n const derived = processRRect(ctx.Skia, props);\n ctx.canvas.drawRRect(derived, ctx.paint);\n};\n\nexport const drawTextBlob = (ctx: DrawingContext, props: TextBlobProps) => {\n \"worklet\";\n const { blob, x, y } = props;\n ctx.canvas.drawTextBlob(blob, x, y, ctx.paint);\n};\n\ninterface ProcessedGlyphs {\n glyphs: number[];\n positions: SkPoint[];\n}\n\nexport const drawGlyphs = (ctx: DrawingContext, props: GlyphsProps) => {\n \"worklet\";\n const derived = props.glyphs.reduce<ProcessedGlyphs>(\n (acc, glyph) => {\n const { id, pos } = glyph;\n acc.glyphs.push(id);\n acc.positions.push(pos);\n return acc;\n },\n { glyphs: [], positions: [] }\n );\n const { glyphs, positions } = derived;\n const { x, y, font } = props;\n if (font) {\n ctx.canvas.drawGlyphs(glyphs, positions, x, y, font, ctx.paint);\n }\n};\n\nexport const drawImageSVG = (ctx: DrawingContext, props: ImageSVGProps) => {\n \"worklet\";\n const { canvas } = ctx;\n const { svg } = props;\n const { x, y, width, height } = props.rect\n ? props.rect\n : { x: props.x, y: props.y, width: props.width, height: props.height };\n if (svg === null) {\n return;\n }\n canvas.save();\n if (x && y) {\n canvas.translate(x, y);\n }\n canvas.drawSvg(svg, width, height);\n canvas.restore();\n};\n\nexport const drawParagraph = (ctx: DrawingContext, props: ParagraphProps) => {\n \"worklet\";\n const { paragraph, x, y, width } = props;\n if (paragraph) {\n paragraph.layout(width);\n paragraph.paint(ctx.canvas, x, y);\n }\n};\n\nexport const drawPicture = (ctx: DrawingContext, props: PictureProps) => {\n \"worklet\";\n const { picture } = props;\n ctx.canvas.drawPicture(picture);\n};\n\nexport const drawAtlas = (ctx: DrawingContext, props: AtlasProps) => {\n \"worklet\";\n const { image, sprites, transforms, colors, blendMode, sampling } = props;\n const blend = blendMode ? BlendMode[enumKey(blendMode)] : undefined;\n if (image) {\n ctx.canvas.drawAtlas(\n image,\n sprites,\n transforms,\n ctx.paint,\n blend,\n colors,\n sampling\n );\n }\n};\n\nexport const drawCircle = (ctx: DrawingContext, props: CircleProps) => {\n \"worklet\";\n const { c } = processCircle(props);\n const { r } = props;\n ctx.canvas.drawCircle(c.x, c.y, r, ctx.paint);\n};\n\nexport const drawSkottie = (ctx: DrawingContext, props: SkottieProps) => {\n \"worklet\";\n const { animation, frame } = props;\n if (animation) {\n props.animation.seekFrame(frame);\n props.animation.render(ctx.canvas);\n }\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["_nodes","require","_processors","_types","drawLine","ctx","props","p1","p2","canvas","x","y","paint","exports","drawOval","rect","processRect","Skia","drawImage","image","sampling","_props$fit","fit","src","dst","fitRects","width","height","isCubicSampling","drawImageRectCubic","B","C","_sampling$filter","_sampling$mipmap","drawImageRectOptions","filter","FilterMode","Linear","mipmap","MipmapMode","None","drawPoints","points","mode","PointMode","enumKey","drawVertices","textures","colors","indices","blendMode","vertexMode","VertexMode","Triangles","vertices","MakeVertices","map","c","processColor","undefined","defaultBlendMode","BlendMode","DstOver","SrcOver","blend","drawDiffRect","outer","inner","drawDRRect","drawTextPath","path","processPath","font","initialOffset","text","ids","getGlyphIDs","widths","getGlyphWidths","rsx","meas","ContourMeasureIter","cont","next","dist","i","length","substring","p","t","getPosTan","adjustedX","adjustedY","push","RSXform","derived","TextBlob","MakeFromRSXform","drawTextBlob","drawText","drawPatch","texture","patch","pos","c2","c1","drawPath","start","trimStart","end","trimEnd","fillType","stroke","pathProps","Math","fround","saturate","hasStartOffset","hasEndOffset","hasStrokeOptions","hasFillType","willMutatePath","pristinePath","copy","setFillType","FillType","trim","drawRect","drawRRect","processRRect","blob","drawGlyphs","glyphs","reduce","acc","glyph","id","positions","drawImageSVG","svg","save","translate","drawSvg","restore","drawParagraph","paragraph","layout","drawPicture","picture","drawAtlas","sprites","transforms","drawCircle","processCircle","r","drawSkottie","animation","frame","seekFrame","render"],"sources":["Drawing.ts"],"sourcesContent":["import {\n enumKey,\n fitRects,\n processCircle,\n processColor,\n processPath,\n processRect,\n processRRect,\n} from \"../../../dom/nodes\";\nimport type {\n AtlasProps,\n CircleProps,\n DiffRectProps,\n GlyphsProps,\n ImageProps,\n ImageSVGProps,\n LineProps,\n OvalProps,\n ParagraphProps,\n PatchProps,\n PathProps,\n PictureProps,\n PointsProps,\n RectProps,\n RoundedRectProps,\n SkottieProps,\n TextBlobProps,\n TextPathProps,\n TextProps,\n VerticesProps,\n} from \"../../../dom/types\";\nimport { saturate } from \"../../../renderer/processors\";\nimport type { SkPoint, SkRSXform } from \"../../../skia/types\";\nimport {\n BlendMode,\n FillType,\n FilterMode,\n isCubicSampling,\n MipmapMode,\n PointMode,\n VertexMode,\n} from \"../../../skia/types\";\nimport type { DrawingContext } from \"../DrawingContext\";\n\nexport const drawLine = (ctx: DrawingContext, props: LineProps) => {\n \"worklet\";\n const { p1, p2 } = props;\n ctx.canvas.drawLine(p1.x, p1.y, p2.x, p2.y, ctx.paint);\n};\n\nexport const drawOval = (ctx: DrawingContext, props: OvalProps) => {\n \"worklet\";\n const rect = processRect(ctx.Skia, props);\n ctx.canvas.drawOval(rect, ctx.paint);\n};\n\nexport const drawImage = (ctx: DrawingContext, props: ImageProps) => {\n \"worklet\";\n const { image, sampling } = props;\n if (image) {\n const fit = props.fit ?? \"contain\";\n const rect = processRect(ctx.Skia, props);\n const { src, dst } = fitRects(\n fit,\n {\n x: 0,\n y: 0,\n width: image.width(),\n height: image.height(),\n },\n rect\n );\n if (sampling && isCubicSampling(sampling)) {\n ctx.canvas.drawImageRectCubic(\n image,\n src,\n dst,\n sampling.B,\n sampling.C,\n ctx.paint\n );\n } else {\n ctx.canvas.drawImageRectOptions(\n image,\n src,\n dst,\n sampling?.filter ?? FilterMode.Linear,\n sampling?.mipmap ?? MipmapMode.None,\n ctx.paint\n );\n }\n }\n};\n\nexport const drawPoints = (ctx: DrawingContext, props: PointsProps) => {\n \"worklet\";\n const { points, mode } = props;\n ctx.canvas.drawPoints(PointMode[enumKey(mode)], points, ctx.paint);\n};\n\nexport const drawVertices = (ctx: DrawingContext, props: VerticesProps) => {\n \"worklet\";\n const { mode, textures, colors, indices, blendMode } = props;\n const vertexMode = mode ? VertexMode[enumKey(mode)] : VertexMode.Triangles;\n const vertices = ctx.Skia.MakeVertices(\n vertexMode,\n props.vertices,\n textures,\n colors ? colors.map((c) => processColor(ctx.Skia, c)) : undefined,\n indices\n );\n const defaultBlendMode = colors ? BlendMode.DstOver : BlendMode.SrcOver;\n const blend = blendMode ? BlendMode[enumKey(blendMode)] : defaultBlendMode;\n\n ctx.canvas.drawVertices(vertices, blend, ctx.paint);\n};\n\nexport const drawDiffRect = (ctx: DrawingContext, props: DiffRectProps) => {\n \"worklet\";\n const { outer, inner } = props;\n ctx.canvas.drawDRRect(outer, inner, ctx.paint);\n};\n\nexport const drawTextPath = (ctx: DrawingContext, props: TextPathProps) => {\n \"worklet\";\n const path = processPath(ctx.Skia, props.path);\n const { font, initialOffset } = props;\n if (font) {\n let { text } = props;\n const ids = font.getGlyphIDs(text);\n const widths = font.getGlyphWidths(ids);\n const rsx: SkRSXform[] = [];\n const meas = ctx.Skia.ContourMeasureIter(path, false, 1);\n let cont = meas.next();\n let dist = initialOffset;\n for (let i = 0; i < text.length && cont; i++) {\n const width = widths[i];\n dist += width / 2;\n if (dist > cont.length()) {\n // jump to next contour\n cont = meas.next();\n if (!cont) {\n // We have come to the end of the path - terminate the string\n // right here.\n text = text.substring(0, i);\n break;\n }\n dist = width / 2;\n }\n // Gives us the (x, y) coordinates as well as the cos/sin of the tangent\n // line at that position.\n const [p, t] = cont.getPosTan(dist);\n const adjustedX = p.x - (width / 2) * t.x;\n const adjustedY = p.y - (width / 2) * t.y;\n rsx.push(ctx.Skia.RSXform(t.x, t.y, adjustedX, adjustedY));\n dist += width / 2;\n }\n const derived = ctx.Skia.TextBlob.MakeFromRSXform(text, rsx, font);\n ctx.canvas.drawTextBlob(derived, 0, 0, ctx.paint);\n }\n};\n\nexport const drawText = (ctx: DrawingContext, props: TextProps) => {\n \"worklet\";\n const { text, x, y, font } = props;\n if (font != null) {\n ctx.canvas.drawText(text, x, y, ctx.paint, font);\n }\n};\n\nexport const drawPatch = (ctx: DrawingContext, props: PatchProps) => {\n \"worklet\";\n const { texture, blendMode, patch } = props;\n const defaultBlendMode = props.colors ? BlendMode.DstOver : BlendMode.SrcOver;\n const mode = blendMode ? BlendMode[enumKey(blendMode)] : defaultBlendMode;\n // Patch requires a path with the following constraints:\n // M tl\n // C c1 c2 br\n // C c1 c2 bl\n // C c1 c2 tl (the redundant point in the last command is removed)\n\n const points = [\n patch[0].pos,\n patch[0].c2,\n patch[1].c1,\n patch[1].pos,\n patch[1].c2,\n patch[2].c1,\n patch[2].pos,\n patch[2].c2,\n patch[3].c1,\n patch[3].pos,\n patch[3].c2,\n patch[0].c1,\n ];\n const colors = props.colors\n ? props.colors.map((c) => processColor(ctx.Skia, c))\n : undefined;\n ctx.canvas.drawPatch(points, colors, texture, mode, ctx.paint);\n};\n\nexport const drawPath = (ctx: DrawingContext, props: PathProps) => {\n \"worklet\";\n const {\n start: trimStart,\n end: trimEnd,\n fillType,\n stroke,\n ...pathProps\n } = props;\n const start = Math.fround(saturate(trimStart));\n const end = Math.fround(saturate(trimEnd));\n const hasStartOffset = start !== 0;\n const hasEndOffset = end !== 1;\n const hasStrokeOptions = stroke !== undefined;\n const hasFillType = !!fillType;\n const willMutatePath =\n hasStartOffset || hasEndOffset || hasStrokeOptions || hasFillType;\n const pristinePath = processPath(ctx.Skia, pathProps.path);\n const path = willMutatePath ? pristinePath.copy() : pristinePath;\n if (hasFillType) {\n path.setFillType(FillType[enumKey(fillType)]);\n }\n if (hasStrokeOptions) {\n path.stroke(stroke);\n }\n if (hasStartOffset || hasEndOffset) {\n path.trim(start, end, false);\n }\n ctx.canvas.drawPath(path, ctx.paint);\n};\n\nexport const drawRect = (ctx: DrawingContext, props: RectProps) => {\n \"worklet\";\n const derived = processRect(ctx.Skia, props);\n ctx.canvas.drawRect(derived, ctx.paint);\n};\n\nexport const drawRRect = (ctx: DrawingContext, props: RoundedRectProps) => {\n \"worklet\";\n const derived = processRRect(ctx.Skia, props);\n ctx.canvas.drawRRect(derived, ctx.paint);\n};\n\nexport const drawTextBlob = (ctx: DrawingContext, props: TextBlobProps) => {\n \"worklet\";\n const { blob, x, y } = props;\n ctx.canvas.drawTextBlob(blob, x, y, ctx.paint);\n};\n\ninterface ProcessedGlyphs {\n glyphs: number[];\n positions: SkPoint[];\n}\n\nexport const drawGlyphs = (ctx: DrawingContext, props: GlyphsProps) => {\n \"worklet\";\n const derived = props.glyphs.reduce<ProcessedGlyphs>(\n (acc, glyph) => {\n const { id, pos } = glyph;\n acc.glyphs.push(id);\n acc.positions.push(pos);\n return acc;\n },\n { glyphs: [], positions: [] }\n );\n const { glyphs, positions } = derived;\n const { x, y, font } = props;\n if (font) {\n ctx.canvas.drawGlyphs(glyphs, positions, x, y, font, ctx.paint);\n }\n};\n\nexport const drawImageSVG = (ctx: DrawingContext, props: ImageSVGProps) => {\n \"worklet\";\n const { canvas } = ctx;\n const { svg } = props;\n const { x, y, width, height } = props.rect\n ? props.rect\n : { x: props.x, y: props.y, width: props.width, height: props.height };\n if (svg === null) {\n return;\n }\n canvas.save();\n if (x && y) {\n canvas.translate(x, y);\n }\n canvas.drawSvg(svg, width, height);\n canvas.restore();\n};\n\nexport const drawParagraph = (ctx: DrawingContext, props: ParagraphProps) => {\n \"worklet\";\n const { paragraph, x, y, width } = props;\n if (paragraph) {\n paragraph.layout(width);\n paragraph.paint(ctx.canvas, x, y);\n }\n};\n\nexport const drawPicture = (ctx: DrawingContext, props: PictureProps) => {\n \"worklet\";\n const { picture } = props;\n ctx.canvas.drawPicture(picture);\n};\n\nexport const drawAtlas = (ctx: DrawingContext, props: AtlasProps) => {\n \"worklet\";\n const { image, sprites, transforms, colors, blendMode, sampling } = props;\n const blend = blendMode ? BlendMode[enumKey(blendMode)] : undefined;\n if (image) {\n ctx.canvas.drawAtlas(\n image,\n sprites,\n transforms,\n ctx.paint,\n blend,\n colors,\n sampling\n );\n }\n};\n\nexport const drawCircle = (ctx: DrawingContext, props: CircleProps) => {\n \"worklet\";\n const { c } = processCircle(props);\n const { r } = props;\n ctx.canvas.drawCircle(c.x, c.y, r, ctx.paint);\n};\n\nexport const drawSkottie = (ctx: DrawingContext, props: SkottieProps) => {\n \"worklet\";\n const { animation, frame } = props;\n if (animation) {\n props.animation.seekFrame(frame);\n props.animation.render(ctx.canvas);\n }\n};\n"],"mappings":"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","ignoreList":[]}
@@ -165,8 +165,8 @@ export const drawPath = (ctx, props) => {
165
165
  stroke,
166
166
  ...pathProps
167
167
  } = props;
168
- const start = saturate(trimStart);
169
- const end = saturate(trimEnd);
168
+ const start = Math.fround(saturate(trimStart));
169
+ const end = Math.fround(saturate(trimEnd));
170
170
  const hasStartOffset = start !== 0;
171
171
  const hasEndOffset = end !== 1;
172
172
  const hasStrokeOptions = stroke !== undefined;
@@ -1 +1 @@
1
- {"version":3,"names":["enumKey","fitRects","processCircle","processColor","processPath","processRect","processRRect","saturate","BlendMode","FillType","FilterMode","isCubicSampling","MipmapMode","PointMode","VertexMode","drawLine","ctx","props","p1","p2","canvas","x","y","paint","drawOval","rect","Skia","drawImage","image","sampling","_props$fit","fit","src","dst","width","height","drawImageRectCubic","B","C","_sampling$filter","_sampling$mipmap","drawImageRectOptions","filter","Linear","mipmap","None","drawPoints","points","mode","drawVertices","textures","colors","indices","blendMode","vertexMode","Triangles","vertices","MakeVertices","map","c","undefined","defaultBlendMode","DstOver","SrcOver","blend","drawDiffRect","outer","inner","drawDRRect","drawTextPath","path","font","initialOffset","text","ids","getGlyphIDs","widths","getGlyphWidths","rsx","meas","ContourMeasureIter","cont","next","dist","i","length","substring","p","t","getPosTan","adjustedX","adjustedY","push","RSXform","derived","TextBlob","MakeFromRSXform","drawTextBlob","drawText","drawPatch","texture","patch","pos","c2","c1","drawPath","start","trimStart","end","trimEnd","fillType","stroke","pathProps","hasStartOffset","hasEndOffset","hasStrokeOptions","hasFillType","willMutatePath","pristinePath","copy","setFillType","trim","drawRect","drawRRect","blob","drawGlyphs","glyphs","reduce","acc","glyph","id","positions","drawImageSVG","svg","save","translate","drawSvg","restore","drawParagraph","paragraph","layout","drawPicture","picture","drawAtlas","sprites","transforms","drawCircle","r","drawSkottie","animation","frame","seekFrame","render"],"sources":["Drawing.ts"],"sourcesContent":["import {\n enumKey,\n fitRects,\n processCircle,\n processColor,\n processPath,\n processRect,\n processRRect,\n} from \"../../../dom/nodes\";\nimport type {\n AtlasProps,\n CircleProps,\n DiffRectProps,\n GlyphsProps,\n ImageProps,\n ImageSVGProps,\n LineProps,\n OvalProps,\n ParagraphProps,\n PatchProps,\n PathProps,\n PictureProps,\n PointsProps,\n RectProps,\n RoundedRectProps,\n SkottieProps,\n TextBlobProps,\n TextPathProps,\n TextProps,\n VerticesProps,\n} from \"../../../dom/types\";\nimport { saturate } from \"../../../renderer/processors\";\nimport type { SkPoint, SkRSXform } from \"../../../skia/types\";\nimport {\n BlendMode,\n FillType,\n FilterMode,\n isCubicSampling,\n MipmapMode,\n PointMode,\n VertexMode,\n} from \"../../../skia/types\";\nimport type { DrawingContext } from \"../DrawingContext\";\n\nexport const drawLine = (ctx: DrawingContext, props: LineProps) => {\n \"worklet\";\n const { p1, p2 } = props;\n ctx.canvas.drawLine(p1.x, p1.y, p2.x, p2.y, ctx.paint);\n};\n\nexport const drawOval = (ctx: DrawingContext, props: OvalProps) => {\n \"worklet\";\n const rect = processRect(ctx.Skia, props);\n ctx.canvas.drawOval(rect, ctx.paint);\n};\n\nexport const drawImage = (ctx: DrawingContext, props: ImageProps) => {\n \"worklet\";\n const { image, sampling } = props;\n if (image) {\n const fit = props.fit ?? \"contain\";\n const rect = processRect(ctx.Skia, props);\n const { src, dst } = fitRects(\n fit,\n {\n x: 0,\n y: 0,\n width: image.width(),\n height: image.height(),\n },\n rect\n );\n if (sampling && isCubicSampling(sampling)) {\n ctx.canvas.drawImageRectCubic(\n image,\n src,\n dst,\n sampling.B,\n sampling.C,\n ctx.paint\n );\n } else {\n ctx.canvas.drawImageRectOptions(\n image,\n src,\n dst,\n sampling?.filter ?? FilterMode.Linear,\n sampling?.mipmap ?? MipmapMode.None,\n ctx.paint\n );\n }\n }\n};\n\nexport const drawPoints = (ctx: DrawingContext, props: PointsProps) => {\n \"worklet\";\n const { points, mode } = props;\n ctx.canvas.drawPoints(PointMode[enumKey(mode)], points, ctx.paint);\n};\n\nexport const drawVertices = (ctx: DrawingContext, props: VerticesProps) => {\n \"worklet\";\n const { mode, textures, colors, indices, blendMode } = props;\n const vertexMode = mode ? VertexMode[enumKey(mode)] : VertexMode.Triangles;\n const vertices = ctx.Skia.MakeVertices(\n vertexMode,\n props.vertices,\n textures,\n colors ? colors.map((c) => processColor(ctx.Skia, c)) : undefined,\n indices\n );\n const defaultBlendMode = colors ? BlendMode.DstOver : BlendMode.SrcOver;\n const blend = blendMode ? BlendMode[enumKey(blendMode)] : defaultBlendMode;\n\n ctx.canvas.drawVertices(vertices, blend, ctx.paint);\n};\n\nexport const drawDiffRect = (ctx: DrawingContext, props: DiffRectProps) => {\n \"worklet\";\n const { outer, inner } = props;\n ctx.canvas.drawDRRect(outer, inner, ctx.paint);\n};\n\nexport const drawTextPath = (ctx: DrawingContext, props: TextPathProps) => {\n \"worklet\";\n const path = processPath(ctx.Skia, props.path);\n const { font, initialOffset } = props;\n if (font) {\n let { text } = props;\n const ids = font.getGlyphIDs(text);\n const widths = font.getGlyphWidths(ids);\n const rsx: SkRSXform[] = [];\n const meas = ctx.Skia.ContourMeasureIter(path, false, 1);\n let cont = meas.next();\n let dist = initialOffset;\n for (let i = 0; i < text.length && cont; i++) {\n const width = widths[i];\n dist += width / 2;\n if (dist > cont.length()) {\n // jump to next contour\n cont = meas.next();\n if (!cont) {\n // We have come to the end of the path - terminate the string\n // right here.\n text = text.substring(0, i);\n break;\n }\n dist = width / 2;\n }\n // Gives us the (x, y) coordinates as well as the cos/sin of the tangent\n // line at that position.\n const [p, t] = cont.getPosTan(dist);\n const adjustedX = p.x - (width / 2) * t.x;\n const adjustedY = p.y - (width / 2) * t.y;\n rsx.push(ctx.Skia.RSXform(t.x, t.y, adjustedX, adjustedY));\n dist += width / 2;\n }\n const derived = ctx.Skia.TextBlob.MakeFromRSXform(text, rsx, font);\n ctx.canvas.drawTextBlob(derived, 0, 0, ctx.paint);\n }\n};\n\nexport const drawText = (ctx: DrawingContext, props: TextProps) => {\n \"worklet\";\n const { text, x, y, font } = props;\n if (font != null) {\n ctx.canvas.drawText(text, x, y, ctx.paint, font);\n }\n};\n\nexport const drawPatch = (ctx: DrawingContext, props: PatchProps) => {\n \"worklet\";\n const { texture, blendMode, patch } = props;\n const defaultBlendMode = props.colors ? BlendMode.DstOver : BlendMode.SrcOver;\n const mode = blendMode ? BlendMode[enumKey(blendMode)] : defaultBlendMode;\n // Patch requires a path with the following constraints:\n // M tl\n // C c1 c2 br\n // C c1 c2 bl\n // C c1 c2 tl (the redundant point in the last command is removed)\n\n const points = [\n patch[0].pos,\n patch[0].c2,\n patch[1].c1,\n patch[1].pos,\n patch[1].c2,\n patch[2].c1,\n patch[2].pos,\n patch[2].c2,\n patch[3].c1,\n patch[3].pos,\n patch[3].c2,\n patch[0].c1,\n ];\n const colors = props.colors\n ? props.colors.map((c) => processColor(ctx.Skia, c))\n : undefined;\n ctx.canvas.drawPatch(points, colors, texture, mode, ctx.paint);\n};\n\nexport const drawPath = (ctx: DrawingContext, props: PathProps) => {\n \"worklet\";\n const {\n start: trimStart,\n end: trimEnd,\n fillType,\n stroke,\n ...pathProps\n } = props;\n const start = saturate(trimStart);\n const end = saturate(trimEnd);\n const hasStartOffset = start !== 0;\n const hasEndOffset = end !== 1;\n const hasStrokeOptions = stroke !== undefined;\n const hasFillType = !!fillType;\n const willMutatePath =\n hasStartOffset || hasEndOffset || hasStrokeOptions || hasFillType;\n const pristinePath = processPath(ctx.Skia, pathProps.path);\n const path = willMutatePath ? pristinePath.copy() : pristinePath;\n if (hasFillType) {\n path.setFillType(FillType[enumKey(fillType)]);\n }\n if (hasStrokeOptions) {\n path.stroke(stroke);\n }\n if (hasStartOffset || hasEndOffset) {\n path.trim(start, end, false);\n }\n ctx.canvas.drawPath(path, ctx.paint);\n};\n\nexport const drawRect = (ctx: DrawingContext, props: RectProps) => {\n \"worklet\";\n const derived = processRect(ctx.Skia, props);\n ctx.canvas.drawRect(derived, ctx.paint);\n};\n\nexport const drawRRect = (ctx: DrawingContext, props: RoundedRectProps) => {\n \"worklet\";\n const derived = processRRect(ctx.Skia, props);\n ctx.canvas.drawRRect(derived, ctx.paint);\n};\n\nexport const drawTextBlob = (ctx: DrawingContext, props: TextBlobProps) => {\n \"worklet\";\n const { blob, x, y } = props;\n ctx.canvas.drawTextBlob(blob, x, y, ctx.paint);\n};\n\ninterface ProcessedGlyphs {\n glyphs: number[];\n positions: SkPoint[];\n}\n\nexport const drawGlyphs = (ctx: DrawingContext, props: GlyphsProps) => {\n \"worklet\";\n const derived = props.glyphs.reduce<ProcessedGlyphs>(\n (acc, glyph) => {\n const { id, pos } = glyph;\n acc.glyphs.push(id);\n acc.positions.push(pos);\n return acc;\n },\n { glyphs: [], positions: [] }\n );\n const { glyphs, positions } = derived;\n const { x, y, font } = props;\n if (font) {\n ctx.canvas.drawGlyphs(glyphs, positions, x, y, font, ctx.paint);\n }\n};\n\nexport const drawImageSVG = (ctx: DrawingContext, props: ImageSVGProps) => {\n \"worklet\";\n const { canvas } = ctx;\n const { svg } = props;\n const { x, y, width, height } = props.rect\n ? props.rect\n : { x: props.x, y: props.y, width: props.width, height: props.height };\n if (svg === null) {\n return;\n }\n canvas.save();\n if (x && y) {\n canvas.translate(x, y);\n }\n canvas.drawSvg(svg, width, height);\n canvas.restore();\n};\n\nexport const drawParagraph = (ctx: DrawingContext, props: ParagraphProps) => {\n \"worklet\";\n const { paragraph, x, y, width } = props;\n if (paragraph) {\n paragraph.layout(width);\n paragraph.paint(ctx.canvas, x, y);\n }\n};\n\nexport const drawPicture = (ctx: DrawingContext, props: PictureProps) => {\n \"worklet\";\n const { picture } = props;\n ctx.canvas.drawPicture(picture);\n};\n\nexport const drawAtlas = (ctx: DrawingContext, props: AtlasProps) => {\n \"worklet\";\n const { image, sprites, transforms, colors, blendMode, sampling } = props;\n const blend = blendMode ? BlendMode[enumKey(blendMode)] : undefined;\n if (image) {\n ctx.canvas.drawAtlas(\n image,\n sprites,\n transforms,\n ctx.paint,\n blend,\n colors,\n sampling\n );\n }\n};\n\nexport const drawCircle = (ctx: DrawingContext, props: CircleProps) => {\n \"worklet\";\n const { c } = processCircle(props);\n const { r } = props;\n ctx.canvas.drawCircle(c.x, c.y, r, ctx.paint);\n};\n\nexport const drawSkottie = (ctx: DrawingContext, props: SkottieProps) => {\n \"worklet\";\n const { animation, frame } = props;\n if (animation) {\n props.animation.seekFrame(frame);\n props.animation.render(ctx.canvas);\n }\n};\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"names":["enumKey","fitRects","processCircle","processColor","processPath","processRect","processRRect","saturate","BlendMode","FillType","FilterMode","isCubicSampling","MipmapMode","PointMode","VertexMode","drawLine","ctx","props","p1","p2","canvas","x","y","paint","drawOval","rect","Skia","drawImage","image","sampling","_props$fit","fit","src","dst","width","height","drawImageRectCubic","B","C","_sampling$filter","_sampling$mipmap","drawImageRectOptions","filter","Linear","mipmap","None","drawPoints","points","mode","drawVertices","textures","colors","indices","blendMode","vertexMode","Triangles","vertices","MakeVertices","map","c","undefined","defaultBlendMode","DstOver","SrcOver","blend","drawDiffRect","outer","inner","drawDRRect","drawTextPath","path","font","initialOffset","text","ids","getGlyphIDs","widths","getGlyphWidths","rsx","meas","ContourMeasureIter","cont","next","dist","i","length","substring","p","t","getPosTan","adjustedX","adjustedY","push","RSXform","derived","TextBlob","MakeFromRSXform","drawTextBlob","drawText","drawPatch","texture","patch","pos","c2","c1","drawPath","start","trimStart","end","trimEnd","fillType","stroke","pathProps","Math","fround","hasStartOffset","hasEndOffset","hasStrokeOptions","hasFillType","willMutatePath","pristinePath","copy","setFillType","trim","drawRect","drawRRect","blob","drawGlyphs","glyphs","reduce","acc","glyph","id","positions","drawImageSVG","svg","save","translate","drawSvg","restore","drawParagraph","paragraph","layout","drawPicture","picture","drawAtlas","sprites","transforms","drawCircle","r","drawSkottie","animation","frame","seekFrame","render"],"sources":["Drawing.ts"],"sourcesContent":["import {\n enumKey,\n fitRects,\n processCircle,\n processColor,\n processPath,\n processRect,\n processRRect,\n} from \"../../../dom/nodes\";\nimport type {\n AtlasProps,\n CircleProps,\n DiffRectProps,\n GlyphsProps,\n ImageProps,\n ImageSVGProps,\n LineProps,\n OvalProps,\n ParagraphProps,\n PatchProps,\n PathProps,\n PictureProps,\n PointsProps,\n RectProps,\n RoundedRectProps,\n SkottieProps,\n TextBlobProps,\n TextPathProps,\n TextProps,\n VerticesProps,\n} from \"../../../dom/types\";\nimport { saturate } from \"../../../renderer/processors\";\nimport type { SkPoint, SkRSXform } from \"../../../skia/types\";\nimport {\n BlendMode,\n FillType,\n FilterMode,\n isCubicSampling,\n MipmapMode,\n PointMode,\n VertexMode,\n} from \"../../../skia/types\";\nimport type { DrawingContext } from \"../DrawingContext\";\n\nexport const drawLine = (ctx: DrawingContext, props: LineProps) => {\n \"worklet\";\n const { p1, p2 } = props;\n ctx.canvas.drawLine(p1.x, p1.y, p2.x, p2.y, ctx.paint);\n};\n\nexport const drawOval = (ctx: DrawingContext, props: OvalProps) => {\n \"worklet\";\n const rect = processRect(ctx.Skia, props);\n ctx.canvas.drawOval(rect, ctx.paint);\n};\n\nexport const drawImage = (ctx: DrawingContext, props: ImageProps) => {\n \"worklet\";\n const { image, sampling } = props;\n if (image) {\n const fit = props.fit ?? \"contain\";\n const rect = processRect(ctx.Skia, props);\n const { src, dst } = fitRects(\n fit,\n {\n x: 0,\n y: 0,\n width: image.width(),\n height: image.height(),\n },\n rect\n );\n if (sampling && isCubicSampling(sampling)) {\n ctx.canvas.drawImageRectCubic(\n image,\n src,\n dst,\n sampling.B,\n sampling.C,\n ctx.paint\n );\n } else {\n ctx.canvas.drawImageRectOptions(\n image,\n src,\n dst,\n sampling?.filter ?? FilterMode.Linear,\n sampling?.mipmap ?? MipmapMode.None,\n ctx.paint\n );\n }\n }\n};\n\nexport const drawPoints = (ctx: DrawingContext, props: PointsProps) => {\n \"worklet\";\n const { points, mode } = props;\n ctx.canvas.drawPoints(PointMode[enumKey(mode)], points, ctx.paint);\n};\n\nexport const drawVertices = (ctx: DrawingContext, props: VerticesProps) => {\n \"worklet\";\n const { mode, textures, colors, indices, blendMode } = props;\n const vertexMode = mode ? VertexMode[enumKey(mode)] : VertexMode.Triangles;\n const vertices = ctx.Skia.MakeVertices(\n vertexMode,\n props.vertices,\n textures,\n colors ? colors.map((c) => processColor(ctx.Skia, c)) : undefined,\n indices\n );\n const defaultBlendMode = colors ? BlendMode.DstOver : BlendMode.SrcOver;\n const blend = blendMode ? BlendMode[enumKey(blendMode)] : defaultBlendMode;\n\n ctx.canvas.drawVertices(vertices, blend, ctx.paint);\n};\n\nexport const drawDiffRect = (ctx: DrawingContext, props: DiffRectProps) => {\n \"worklet\";\n const { outer, inner } = props;\n ctx.canvas.drawDRRect(outer, inner, ctx.paint);\n};\n\nexport const drawTextPath = (ctx: DrawingContext, props: TextPathProps) => {\n \"worklet\";\n const path = processPath(ctx.Skia, props.path);\n const { font, initialOffset } = props;\n if (font) {\n let { text } = props;\n const ids = font.getGlyphIDs(text);\n const widths = font.getGlyphWidths(ids);\n const rsx: SkRSXform[] = [];\n const meas = ctx.Skia.ContourMeasureIter(path, false, 1);\n let cont = meas.next();\n let dist = initialOffset;\n for (let i = 0; i < text.length && cont; i++) {\n const width = widths[i];\n dist += width / 2;\n if (dist > cont.length()) {\n // jump to next contour\n cont = meas.next();\n if (!cont) {\n // We have come to the end of the path - terminate the string\n // right here.\n text = text.substring(0, i);\n break;\n }\n dist = width / 2;\n }\n // Gives us the (x, y) coordinates as well as the cos/sin of the tangent\n // line at that position.\n const [p, t] = cont.getPosTan(dist);\n const adjustedX = p.x - (width / 2) * t.x;\n const adjustedY = p.y - (width / 2) * t.y;\n rsx.push(ctx.Skia.RSXform(t.x, t.y, adjustedX, adjustedY));\n dist += width / 2;\n }\n const derived = ctx.Skia.TextBlob.MakeFromRSXform(text, rsx, font);\n ctx.canvas.drawTextBlob(derived, 0, 0, ctx.paint);\n }\n};\n\nexport const drawText = (ctx: DrawingContext, props: TextProps) => {\n \"worklet\";\n const { text, x, y, font } = props;\n if (font != null) {\n ctx.canvas.drawText(text, x, y, ctx.paint, font);\n }\n};\n\nexport const drawPatch = (ctx: DrawingContext, props: PatchProps) => {\n \"worklet\";\n const { texture, blendMode, patch } = props;\n const defaultBlendMode = props.colors ? BlendMode.DstOver : BlendMode.SrcOver;\n const mode = blendMode ? BlendMode[enumKey(blendMode)] : defaultBlendMode;\n // Patch requires a path with the following constraints:\n // M tl\n // C c1 c2 br\n // C c1 c2 bl\n // C c1 c2 tl (the redundant point in the last command is removed)\n\n const points = [\n patch[0].pos,\n patch[0].c2,\n patch[1].c1,\n patch[1].pos,\n patch[1].c2,\n patch[2].c1,\n patch[2].pos,\n patch[2].c2,\n patch[3].c1,\n patch[3].pos,\n patch[3].c2,\n patch[0].c1,\n ];\n const colors = props.colors\n ? props.colors.map((c) => processColor(ctx.Skia, c))\n : undefined;\n ctx.canvas.drawPatch(points, colors, texture, mode, ctx.paint);\n};\n\nexport const drawPath = (ctx: DrawingContext, props: PathProps) => {\n \"worklet\";\n const {\n start: trimStart,\n end: trimEnd,\n fillType,\n stroke,\n ...pathProps\n } = props;\n const start = Math.fround(saturate(trimStart));\n const end = Math.fround(saturate(trimEnd));\n const hasStartOffset = start !== 0;\n const hasEndOffset = end !== 1;\n const hasStrokeOptions = stroke !== undefined;\n const hasFillType = !!fillType;\n const willMutatePath =\n hasStartOffset || hasEndOffset || hasStrokeOptions || hasFillType;\n const pristinePath = processPath(ctx.Skia, pathProps.path);\n const path = willMutatePath ? pristinePath.copy() : pristinePath;\n if (hasFillType) {\n path.setFillType(FillType[enumKey(fillType)]);\n }\n if (hasStrokeOptions) {\n path.stroke(stroke);\n }\n if (hasStartOffset || hasEndOffset) {\n path.trim(start, end, false);\n }\n ctx.canvas.drawPath(path, ctx.paint);\n};\n\nexport const drawRect = (ctx: DrawingContext, props: RectProps) => {\n \"worklet\";\n const derived = processRect(ctx.Skia, props);\n ctx.canvas.drawRect(derived, ctx.paint);\n};\n\nexport const drawRRect = (ctx: DrawingContext, props: RoundedRectProps) => {\n \"worklet\";\n const derived = processRRect(ctx.Skia, props);\n ctx.canvas.drawRRect(derived, ctx.paint);\n};\n\nexport const drawTextBlob = (ctx: DrawingContext, props: TextBlobProps) => {\n \"worklet\";\n const { blob, x, y } = props;\n ctx.canvas.drawTextBlob(blob, x, y, ctx.paint);\n};\n\ninterface ProcessedGlyphs {\n glyphs: number[];\n positions: SkPoint[];\n}\n\nexport const drawGlyphs = (ctx: DrawingContext, props: GlyphsProps) => {\n \"worklet\";\n const derived = props.glyphs.reduce<ProcessedGlyphs>(\n (acc, glyph) => {\n const { id, pos } = glyph;\n acc.glyphs.push(id);\n acc.positions.push(pos);\n return acc;\n },\n { glyphs: [], positions: [] }\n );\n const { glyphs, positions } = derived;\n const { x, y, font } = props;\n if (font) {\n ctx.canvas.drawGlyphs(glyphs, positions, x, y, font, ctx.paint);\n }\n};\n\nexport const drawImageSVG = (ctx: DrawingContext, props: ImageSVGProps) => {\n \"worklet\";\n const { canvas } = ctx;\n const { svg } = props;\n const { x, y, width, height } = props.rect\n ? props.rect\n : { x: props.x, y: props.y, width: props.width, height: props.height };\n if (svg === null) {\n return;\n }\n canvas.save();\n if (x && y) {\n canvas.translate(x, y);\n }\n canvas.drawSvg(svg, width, height);\n canvas.restore();\n};\n\nexport const drawParagraph = (ctx: DrawingContext, props: ParagraphProps) => {\n \"worklet\";\n const { paragraph, x, y, width } = props;\n if (paragraph) {\n paragraph.layout(width);\n paragraph.paint(ctx.canvas, x, y);\n }\n};\n\nexport const drawPicture = (ctx: DrawingContext, props: PictureProps) => {\n \"worklet\";\n const { picture } = props;\n ctx.canvas.drawPicture(picture);\n};\n\nexport const drawAtlas = (ctx: DrawingContext, props: AtlasProps) => {\n \"worklet\";\n const { image, sprites, transforms, colors, blendMode, sampling } = props;\n const blend = blendMode ? BlendMode[enumKey(blendMode)] : undefined;\n if (image) {\n ctx.canvas.drawAtlas(\n image,\n sprites,\n transforms,\n ctx.paint,\n blend,\n colors,\n sampling\n );\n }\n};\n\nexport const drawCircle = (ctx: DrawingContext, props: CircleProps) => {\n \"worklet\";\n const { c } = processCircle(props);\n const { r } = props;\n ctx.canvas.drawCircle(c.x, c.y, r, ctx.paint);\n};\n\nexport const drawSkottie = (ctx: DrawingContext, props: SkottieProps) => {\n \"worklet\";\n const { animation, frame } = props;\n if (animation) {\n props.animation.seekFrame(frame);\n props.animation.render(ctx.canvas);\n }\n};\n"],"mappings":"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","ignoreList":[]}
package/package.json CHANGED
@@ -8,7 +8,7 @@
8
8
  "setup-skia-web": "scripts/setup-canvaskit.js"
9
9
  },
10
10
  "title": "React Native Skia",
11
- "version": "2.2.3",
11
+ "version": "2.2.5",
12
12
  "description": "High-performance React Native Graphics using Skia",
13
13
  "main": "lib/module/index.js",
14
14
  "react-native": "src/index.ts",
@@ -45,13 +45,13 @@
45
45
  "clean-skia": "yarn rimraf ./libs && yarn rimraf ../../externals/skia/out",
46
46
  "build-skia": "ts-node ./scripts/build-skia.ts",
47
47
  "copy-skia-headers": "ts-node ./scripts/copy-skia-headers.ts",
48
+ "install-skia": "ts-node ./scripts/download-artifacts.ts && yarn copy-skia-headers",
48
49
  "clang-format": "yarn clang-format-ios && yarn clang-format-android && yarn clang-format-common",
49
50
  "clang-format-ios": "find apple/ -iname '*.h' -o -iname '*.mm' -o -iname '*.cpp' | xargs clang-format -i",
50
51
  "clang-format-android": "find android/cpp/ -iname '*.h' -o -iname '*.m' -o -iname '*.cpp' | xargs clang-format -i",
51
52
  "clang-format-common": "find cpp/ \\( -path 'cpp//skia' -prune \\) -o \\( -iname '*.h' -o -iname '*.m' -o -iname '*.cpp' \\) -print | xargs clang-format -i",
52
53
  "workflow-copy-libs": "yarn ts-node ./scripts/workflow-copy-libs.ts",
53
- "cpplint": "cpplint --linelength=230 --filter=-legal/copyright,-whitespace/indent,-whitespace/comments,-whitespace/ending_newline,-build/include_order,-runtime/references,-readability/todo,-whitespace/blank_line,-whitespace/todo,-runtime/int,-build/c++11,-whitespace/parens --exclude=package/cpp/skia --exclude=package/ios --exclude=package/android/build --exclude=package/node_modules --recursive package",
54
- "download-artifacts": "ts-node ./scripts/download-artifacts.ts"
54
+ "cpplint": "cpplint --linelength=230 --filter=-legal/copyright,-whitespace/indent,-whitespace/comments,-whitespace/ending_newline,-build/include_order,-runtime/references,-readability/todo,-whitespace/blank_line,-whitespace/todo,-runtime/int,-build/c++11,-whitespace/parens --exclude=package/cpp/skia --exclude=package/ios --exclude=package/android/build --exclude=package/node_modules --recursive package"
55
55
  },
56
56
  "repository": {
57
57
  "type": "git",
@@ -78,7 +78,7 @@
78
78
  "peerDependencies": {
79
79
  "react": ">=19.0",
80
80
  "react-native": ">=0.78",
81
- "react-native-reanimated": "^3.0"
81
+ "react-native-reanimated": ">=3.19.1"
82
82
  },
83
83
  "peerDependenciesMeta": {
84
84
  "react-native": {
@@ -112,7 +112,7 @@
112
112
  "react": "19.0.0",
113
113
  "react-native": "0.78.0",
114
114
  "react-native-builder-bob": "0.18.2",
115
- "react-native-reanimated": "^3.0",
115
+ "react-native-reanimated": "3.19.1",
116
116
  "rimraf": "3.0.2",
117
117
  "semantic-release": "^24.1.0",
118
118
  "semantic-release-yarn": "^3.0.2",
@@ -77,7 +77,7 @@ Pod::Spec.new do |s|
77
77
  "Christian Falch" => "christian.falch@gmail.com",
78
78
  "William Candillon" => "wcandillon@gmail.com"
79
79
  }
80
- s.platforms = { :ios => "13.0", :tvos => "13.0", :osx => "11" }
80
+ s.platforms = { :ios => "14.0", :tvos => "13.0", :osx => "11" }
81
81
  s.source = { :git => "https://github.com/shopify/react-native-skia/react-native-skia.git", :tag => "#{s.version}" }
82
82
 
83
83
  s.requires_arc = true
@@ -142,7 +142,7 @@ describe("Drawings", () => {
142
142
  checkImage(image, "snapshots/paths/skia-trimmed.png");
143
143
  });
144
144
 
145
- it("Should clamp the trim values automatically", async () => {
145
+ it("Should clamp the trim values automatically (1)", async () => {
146
146
  const { Skia } = importSkia();
147
147
  const { width, height } = surface;
148
148
  const path = Skia.Path.MakeFromSVGString(
@@ -186,6 +186,55 @@ describe("Drawings", () => {
186
186
  checkImage(image, "snapshots/paths/skia.png");
187
187
  });
188
188
 
189
+ it("Should clamp the trim values automatically (2)", async () => {
190
+ const { Skia } = importSkia();
191
+ const { width, height } = surface;
192
+ const path = Skia.Path.MakeFromSVGString(
193
+ // eslint-disable-next-line max-len
194
+ "M512.213 204.005C500.312 185.697 406.758 105.581 332.94 105.581C259.122 105.581 219.088 132 204.638 149.85C157.952 207.52 141.933 264.275 156.579 320.115C175.803 387.854 228.896 449.644 315.859 505.483C415.638 562.238 479.716 626.774 508.093 699.091C518.163 731.13 519.536 762.711 512.213 793.835C504.889 824.959 490.243 853.336 468.273 878.967C449.965 903.683 425.707 921.534 395.499 932.518C365.291 942.588 328.675 950.369 285.651 955.861C182.21 964.1 97.9935 948.538 33 909.176M595.972 733.419C710.397 564.985 795.529 424.47 851.369 311.876C865.1 279.837 875.169 255.579 881.577 239.102C887.985 221.709 894.393 198.824 900.801 170.447C907.208 142.069 909.497 115.98 907.666 92.1797C904.92 68.3793 893.02 51.9021 871.965 40.0019C850.911 28.1016 835.5 31.3101 811.549 44.1212C772.187 65.1754 745.64 101.334 731.909 152.596C723.67 174.566 715.432 200.197 707.193 229.49C699.87 258.783 694.378 281.21 690.716 296.772C687.97 312.334 682.935 340.711 675.612 381.904C668.289 422.182 663.712 445.982 661.881 453.306C643.573 567.731 621.603 733.876 595.972 951.742C624.349 852.878 656.846 774.154 693.462 715.568C706.278 689.937 717.263 669.798 726.417 655.152C735.571 640.505 748.844 624.486 766.237 607.093C784.545 589.701 803.768 576.885 823.907 568.646C892.562 543.015 941.994 545.304 972.202 575.512C990.51 594.735 999.664 618.078 999.664 645.54C1000.58 673.002 990.052 694.514 968.083 710.076C925.059 733.876 859.608 741.657 771.729 733.419C786.375 737.996 797.36 742.115 804.683 745.776C812.922 748.523 822.992 753.1 834.892 759.508C847.707 765.915 857.319 773.696 863.727 782.85C871.05 792.004 875.627 802.531 877.458 814.432C878.373 819.009 879.746 827.705 881.577 840.521C884.323 853.336 886.612 862.948 888.443 869.356C890.273 875.763 892.562 884.002 895.308 894.072C898.97 904.141 903.089 912.837 907.666 920.16C913.159 926.568 919.566 932.976 926.89 939.384C949.775 961.354 987.764 958.607 1040.86 931.145C1056.42 923.822 1070.61 914.668 1083.42 903.683C1097.15 892.698 1109.97 879.425 1121.87 863.863C1134.69 847.386 1144.76 834.113 1152.08 824.043C1159.4 813.058 1169.47 797.039 1182.29 775.985C1195.1 754.931 1204.26 740.742 1209.75 733.419C1239.04 674.833 1268.33 616.247 1297.63 557.661C1252.77 670.256 1223.94 756.304 1211.12 815.805C1205.63 833.197 1203.34 853.336 1204.26 876.221C1205.17 899.106 1212.04 917.414 1224.85 931.145C1234.01 942.13 1245.45 949.453 1259.18 953.115C1273.83 956.777 1287.56 956.319 1300.37 951.742C1356.21 935.265 1401.53 903.226 1436.31 855.625C1456.45 828.163 1483.45 787.427 1517.32 733.419M1360.79 390.143C1347.97 390.143 1340.19 384.193 1337.45 372.293C1335.62 359.477 1336.99 348.492 1341.57 339.338C1345.24 332 1357.13 333.846 1369.03 333.846C1380.93 333.846 1390.5 340.5 1391 348.95M1925.13 697.718C1902.25 633.64 1874.33 593.82 1841.38 578.258C1810.25 559.95 1775.47 551.254 1737.02 552.169C1698.57 552.169 1664.25 562.238 1634.04 582.377C1605.66 598.855 1581.4 620.824 1561.26 648.286C1541.12 674.833 1527.39 704.126 1520.07 736.165C1513.66 767.288 1514.58 798.87 1522.82 830.909C1531.97 862.032 1547.53 888.579 1569.5 910.549C1604.29 939.842 1646.4 954.488 1695.83 954.488C1745.26 954.488 1787.82 939.842 1823.53 910.549C1838.17 895.902 1848.7 885.375 1855.11 878.967C1861.51 872.56 1868.84 863.406 1877.08 851.505C1886.23 839.605 1893.55 827.247 1899.05 814.432M1958.09 556.288C1933.37 657.898 1916.9 746.234 1908.66 821.297C1900.42 878.967 1911.4 918.787 1941.61 940.757C1964.5 959.065 2000.2 956.319 2048.71 932.518C2090.82 912.38 2131.1 873.017 2169.55 814.432"
195
+ )!;
196
+ const PADDING = width / 16;
197
+ const image = await surface.draw(
198
+ <FitBox
199
+ src={Skia.XYWHRect(0, 0, 2139, 928)}
200
+ dst={Skia.XYWHRect(
201
+ PADDING,
202
+ PADDING,
203
+ width - PADDING * 2,
204
+ height - PADDING * 2
205
+ )}
206
+ >
207
+ <Group strokeJoin="round" strokeCap="round" color="black">
208
+ <Path
209
+ path={path}
210
+ style="stroke"
211
+ strokeWidth={116}
212
+ end={0.9999999999999998}
213
+ >
214
+ <LinearGradient
215
+ start={path.getPoint(0)}
216
+ end={path.getLastPt()}
217
+ colors={[
218
+ "#3FCEBC",
219
+ "#3CBCEB",
220
+ "#5F96E7",
221
+ "#816FE3",
222
+ "#9F5EE2",
223
+ "#DE589F",
224
+ "#FF645E",
225
+ "#FDA859",
226
+ "#FAEC54",
227
+ "#9EE671",
228
+ "#41E08D",
229
+ ]}
230
+ />
231
+ </Path>
232
+ </Group>
233
+ </FitBox>
234
+ );
235
+ checkImage(image, "snapshots/paths/skia.png");
236
+ });
237
+
189
238
  it("should use default props (1)", async () => {
190
239
  const image = await surface.draw(
191
240
  <Group strokeJoin="round" strokeCap="round" color="black">
@@ -208,8 +208,8 @@ export const drawPath = (ctx: DrawingContext, props: PathProps) => {
208
208
  stroke,
209
209
  ...pathProps
210
210
  } = props;
211
- const start = saturate(trimStart);
212
- const end = saturate(trimEnd);
211
+ const start = Math.fround(saturate(trimStart));
212
+ const end = Math.fround(saturate(trimEnd));
213
213
  const hasStartOffset = start !== 0;
214
214
  const hasEndOffset = end !== 1;
215
215
  const hasStrokeOptions = stroke !== undefined;