@shopify/react-native-skia 1.5.7 → 1.5.9

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 (112) hide show
  1. package/android/CMakeLists.txt +1 -2
  2. package/android/cpp/jni/JniPlatformContext.cpp +0 -49
  3. package/android/cpp/jni/include/JniPlatformContext.h +1 -17
  4. package/android/cpp/jni/include/JniSkiaBaseView.h +0 -2
  5. package/android/cpp/jni/include/JniSkiaDomView.h +0 -3
  6. package/android/cpp/jni/include/JniSkiaManager.h +0 -2
  7. package/android/cpp/jni/include/JniSkiaPictureView.h +0 -3
  8. package/android/cpp/rnskia-android/MainThreadDispatcher.h +69 -0
  9. package/android/cpp/rnskia-android/OpenGLContext.h +3 -1
  10. package/android/cpp/rnskia-android/OpenGLWindowContext.cpp +1 -1
  11. package/android/cpp/rnskia-android/OpenGLWindowContext.h +4 -5
  12. package/android/cpp/rnskia-android/RNSkAndroidPlatformContext.h +10 -11
  13. package/android/cpp/rnskia-android/RNSkAndroidView.h +3 -13
  14. package/android/cpp/rnskia-android/RNSkOpenGLCanvasProvider.cpp +0 -1
  15. package/android/src/main/java/com/shopify/reactnative/skia/PlatformContext.java +0 -85
  16. package/android/src/main/java/com/shopify/reactnative/skia/RNSkiaModule.java +1 -21
  17. package/android/src/main/java/com/shopify/reactnative/skia/SkiaManager.java +0 -4
  18. package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaDomViewManagerDelegate.java +1 -4
  19. package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaDomViewManagerInterface.java +0 -1
  20. package/cpp/api/JsiSkImage.h +20 -4
  21. package/cpp/rnskia/RNSkManager.cpp +2 -3
  22. package/cpp/rnskia/RNSkPlatformContext.h +6 -114
  23. package/cpp/rnskia/RNSkView.h +21 -77
  24. package/ios/RNSkia-iOS/MetalContext.h +2 -0
  25. package/ios/RNSkia-iOS/RNSkiOSPlatformContext.h +4 -10
  26. package/ios/RNSkia-iOS/RNSkiOSPlatformContext.mm +6 -16
  27. package/ios/RNSkia-iOS/SkiaDomView.mm +0 -1
  28. package/ios/RNSkia-iOS/SkiaDomViewManager.mm +0 -6
  29. package/ios/RNSkia-iOS/SkiaPictureView.mm +0 -1
  30. package/ios/RNSkia-iOS/SkiaPictureViewManager.mm +0 -6
  31. package/ios/RNSkia-iOS/SkiaUIView.h +0 -1
  32. package/ios/RNSkia-iOS/SkiaUIView.mm +1 -14
  33. package/lib/commonjs/renderer/Canvas.d.ts +1 -0
  34. package/lib/commonjs/renderer/Canvas.js +5 -5
  35. package/lib/commonjs/renderer/Canvas.js.map +1 -1
  36. package/lib/commonjs/specs/SkiaPictureViewNativeComponent.d.ts +0 -1
  37. package/lib/commonjs/specs/SkiaPictureViewNativeComponent.js.map +1 -1
  38. package/lib/commonjs/views/SkiaBaseWebView.d.ts +1 -12
  39. package/lib/commonjs/views/SkiaBaseWebView.js +1 -19
  40. package/lib/commonjs/views/SkiaBaseWebView.js.map +1 -1
  41. package/lib/commonjs/views/SkiaDomView.d.ts +8 -1
  42. package/lib/commonjs/views/SkiaDomView.js +14 -2
  43. package/lib/commonjs/views/SkiaDomView.js.map +1 -1
  44. package/lib/commonjs/views/SkiaDomView.web.d.ts +3 -3
  45. package/lib/commonjs/views/SkiaDomView.web.js.map +1 -1
  46. package/lib/commonjs/views/SkiaJSDomView.d.ts +12 -6
  47. package/lib/commonjs/views/SkiaJSDomView.js +12 -3
  48. package/lib/commonjs/views/SkiaJSDomView.js.map +1 -1
  49. package/lib/commonjs/views/SkiaPictureView.d.ts +8 -1
  50. package/lib/commonjs/views/SkiaPictureView.js +14 -1
  51. package/lib/commonjs/views/SkiaPictureView.js.map +1 -1
  52. package/lib/commonjs/views/SkiaPictureView.web.d.ts +3 -3
  53. package/lib/commonjs/views/SkiaPictureView.web.js.map +1 -1
  54. package/lib/commonjs/views/types.d.ts +2 -12
  55. package/lib/commonjs/views/types.js.map +1 -1
  56. package/lib/module/renderer/Canvas.d.ts +1 -0
  57. package/lib/module/renderer/Canvas.js +5 -5
  58. package/lib/module/renderer/Canvas.js.map +1 -1
  59. package/lib/module/specs/SkiaPictureViewNativeComponent.d.ts +0 -1
  60. package/lib/module/specs/SkiaPictureViewNativeComponent.js.map +1 -1
  61. package/lib/module/views/SkiaBaseWebView.d.ts +1 -12
  62. package/lib/module/views/SkiaBaseWebView.js +1 -19
  63. package/lib/module/views/SkiaBaseWebView.js.map +1 -1
  64. package/lib/module/views/SkiaDomView.d.ts +8 -1
  65. package/lib/module/views/SkiaDomView.js +14 -2
  66. package/lib/module/views/SkiaDomView.js.map +1 -1
  67. package/lib/module/views/SkiaDomView.web.d.ts +3 -3
  68. package/lib/module/views/SkiaDomView.web.js.map +1 -1
  69. package/lib/module/views/SkiaJSDomView.d.ts +12 -6
  70. package/lib/module/views/SkiaJSDomView.js +12 -3
  71. package/lib/module/views/SkiaJSDomView.js.map +1 -1
  72. package/lib/module/views/SkiaPictureView.d.ts +8 -1
  73. package/lib/module/views/SkiaPictureView.js +14 -1
  74. package/lib/module/views/SkiaPictureView.js.map +1 -1
  75. package/lib/module/views/SkiaPictureView.web.d.ts +3 -3
  76. package/lib/module/views/SkiaPictureView.web.js.map +1 -1
  77. package/lib/module/views/types.d.ts +2 -12
  78. package/lib/module/views/types.js.map +1 -1
  79. package/lib/typescript/lib/commonjs/views/SkiaBaseWebView.d.ts +0 -11
  80. package/lib/typescript/lib/commonjs/views/SkiaDomView.d.ts +3 -0
  81. package/lib/typescript/lib/commonjs/views/SkiaJSDomView.d.ts +2 -0
  82. package/lib/typescript/lib/commonjs/views/SkiaPictureView.d.ts +3 -0
  83. package/lib/typescript/lib/module/views/SkiaBaseWebView.d.ts +0 -11
  84. package/lib/typescript/lib/module/views/SkiaDomView.d.ts +3 -0
  85. package/lib/typescript/lib/module/views/SkiaJSDomView.d.ts +2 -0
  86. package/lib/typescript/lib/module/views/SkiaPictureView.d.ts +3 -0
  87. package/lib/typescript/src/renderer/Canvas.d.ts +1 -0
  88. package/lib/typescript/src/specs/SkiaPictureViewNativeComponent.d.ts +0 -1
  89. package/lib/typescript/src/views/SkiaBaseWebView.d.ts +1 -12
  90. package/lib/typescript/src/views/SkiaDomView.d.ts +8 -1
  91. package/lib/typescript/src/views/SkiaDomView.web.d.ts +3 -3
  92. package/lib/typescript/src/views/SkiaJSDomView.d.ts +12 -6
  93. package/lib/typescript/src/views/SkiaPictureView.d.ts +8 -1
  94. package/lib/typescript/src/views/SkiaPictureView.web.d.ts +3 -3
  95. package/lib/typescript/src/views/types.d.ts +2 -12
  96. package/package.json +1 -1
  97. package/react-native-skia.podspec +2 -2
  98. package/src/renderer/Canvas.tsx +4 -3
  99. package/src/renderer/__tests__/e2e/Image.spec.tsx +2 -64
  100. package/src/skia/__tests__/assets/oslo-mini.jpg +0 -0
  101. package/src/specs/SkiaPictureViewNativeComponent.ts +0 -1
  102. package/src/views/SkiaBaseWebView.tsx +3 -19
  103. package/src/views/SkiaDomView.tsx +23 -4
  104. package/src/views/SkiaDomView.web.tsx +3 -3
  105. package/src/views/SkiaJSDomView.tsx +30 -9
  106. package/src/views/SkiaPictureView.tsx +22 -2
  107. package/src/views/SkiaPictureView.web.tsx +3 -3
  108. package/src/views/types.ts +2 -13
  109. package/cpp/rnskia/RNSkDispatchQueue.cpp +0 -73
  110. package/cpp/rnskia/RNSkDispatchQueue.h +0 -49
  111. package/ios/RNSkia-iOS/DisplayLink.h +0 -17
  112. package/ios/RNSkia-iOS/DisplayLink.mm +0 -41
@@ -7,19 +7,29 @@ import SkiaPictureViewNativeComponent from "../specs/SkiaPictureViewNativeCompon
7
7
  import { JsiDrawingContext } from "../dom/types";
8
8
 
9
9
  import { SkiaViewApi } from "./api";
10
- import type { SkiaPictureViewProps, SkiaDomViewProps } from "./types";
10
+ import type {
11
+ SkiaPictureViewNativeProps,
12
+ SkiaDomViewNativeProps,
13
+ } from "./types";
11
14
  import { SkiaViewNativeId } from "./SkiaViewNativeId";
12
15
 
13
- const NativeSkiaPictureView: HostComponent<SkiaPictureViewProps> =
16
+ const NativeSkiaPictureView: HostComponent<SkiaPictureViewNativeProps> =
14
17
  Platform.OS !== "web"
15
18
  ? SkiaPictureViewNativeComponent
16
19
  : // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
20
  (null as any);
18
21
 
19
- export class SkiaJSDomView extends React.Component<
20
- SkiaDomViewProps & { Skia: Skia }
21
- > {
22
- constructor(props: SkiaDomViewProps & { Skia: Skia }) {
22
+ interface SkiaDomViewProps extends SkiaDomViewNativeProps {
23
+ mode?: "default" | "continuous";
24
+ }
25
+
26
+ type SkiaJSDomViewProps = SkiaDomViewProps & {
27
+ Skia: Skia;
28
+ mode?: "default" | "continuous";
29
+ };
30
+
31
+ export class SkiaJSDomView extends React.Component<SkiaJSDomViewProps> {
32
+ constructor(props: SkiaJSDomViewProps) {
23
33
  super(props);
24
34
  this._nativeId = SkiaViewNativeId.current++;
25
35
  const { root, onSize } = props;
@@ -31,9 +41,18 @@ export class SkiaJSDomView extends React.Component<
31
41
  assertSkiaViewApi();
32
42
  SkiaViewApi.setJsiProperty(this._nativeId, "onSize", onSize);
33
43
  }
44
+ this.tick();
34
45
  }
35
46
 
36
47
  private _nativeId: number;
48
+ private requestId = 0;
49
+
50
+ private tick() {
51
+ this.redraw();
52
+ if (this.props.mode === "continuous") {
53
+ this.requestId = requestAnimationFrame(this.tick.bind(this));
54
+ }
55
+ }
37
56
 
38
57
  public get nativeId() {
39
58
  return this._nativeId;
@@ -49,6 +68,7 @@ export class SkiaJSDomView extends React.Component<
49
68
  assertSkiaViewApi();
50
69
  SkiaViewApi.setJsiProperty(this._nativeId, "onSize", onSize);
51
70
  }
71
+ this.tick();
52
72
  }
53
73
 
54
74
  /**
@@ -67,7 +87,6 @@ export class SkiaJSDomView extends React.Component<
67
87
  public redraw() {
68
88
  assertSkiaViewApi();
69
89
  this.draw();
70
- //SkiaViewApi.requestRedraw(this._nativeId);
71
90
  }
72
91
 
73
92
  private draw() {
@@ -89,15 +108,17 @@ export class SkiaJSDomView extends React.Component<
89
108
  componentWillUnmount(): void {
90
109
  assertSkiaViewApi();
91
110
  SkiaViewApi.setJsiProperty(this._nativeId, "picture", null);
111
+ if (this.requestId) {
112
+ cancelAnimationFrame(this.requestId);
113
+ }
92
114
  }
93
115
 
94
116
  render() {
95
- const { mode, debug = false, ...viewProps } = this.props;
117
+ const { debug = false, ...viewProps } = this.props;
96
118
  return (
97
119
  <NativeSkiaPictureView
98
120
  collapsable={false}
99
121
  nativeID={`${this._nativeId}`}
100
- mode={mode}
101
122
  debug={debug}
102
123
  {...viewProps}
103
124
  />
@@ -4,12 +4,18 @@ import type { SkRect } from "../skia/types";
4
4
  import SkiaPictureViewNativeComponent from "../specs/SkiaPictureViewNativeComponent";
5
5
 
6
6
  import { SkiaViewApi } from "./api";
7
- import type { SkiaPictureViewProps } from "./types";
7
+ import type { SkiaPictureViewNativeProps } from "./types";
8
8
  import { SkiaViewNativeId } from "./SkiaViewNativeId";
9
9
 
10
10
  const NativeSkiaPictureView = SkiaPictureViewNativeComponent;
11
11
 
12
+ interface SkiaPictureViewProps extends SkiaPictureViewNativeProps {
13
+ mode?: "default" | "continuous";
14
+ }
15
+
12
16
  export class SkiaPictureView extends React.Component<SkiaPictureViewProps> {
17
+ private requestId = 0;
18
+
13
19
  constructor(props: SkiaPictureViewProps) {
14
20
  super(props);
15
21
  this._nativeId = SkiaViewNativeId.current++;
@@ -22,6 +28,7 @@ export class SkiaPictureView extends React.Component<SkiaPictureViewProps> {
22
28
  assertSkiaViewApi();
23
29
  SkiaViewApi.setJsiProperty(this._nativeId, "onSize", onSize);
24
30
  }
31
+ this.tick();
25
32
  }
26
33
 
27
34
  private _nativeId: number;
@@ -40,6 +47,20 @@ export class SkiaPictureView extends React.Component<SkiaPictureViewProps> {
40
47
  assertSkiaViewApi();
41
48
  SkiaViewApi.setJsiProperty(this._nativeId, "onSize", onSize);
42
49
  }
50
+ this.tick();
51
+ }
52
+
53
+ componentWillUnmount() {
54
+ if (this.requestId) {
55
+ cancelAnimationFrame(this.requestId);
56
+ }
57
+ }
58
+
59
+ private tick() {
60
+ this.redraw();
61
+ if (this.props.mode === "continuous") {
62
+ this.requestId = requestAnimationFrame(this.tick.bind(this));
63
+ }
43
64
  }
44
65
 
45
66
  /**
@@ -66,7 +87,6 @@ export class SkiaPictureView extends React.Component<SkiaPictureViewProps> {
66
87
  <NativeSkiaPictureView
67
88
  collapsable={false}
68
89
  nativeID={`${this._nativeId}`}
69
- mode={mode ?? "default"}
70
90
  debug={debug}
71
91
  {...viewProps}
72
92
  />
@@ -1,10 +1,10 @@
1
1
  import type { SkCanvas } from "../skia/types";
2
2
 
3
- import type { SkiaPictureViewProps } from "./types";
3
+ import type { SkiaPictureViewNativeProps } from "./types";
4
4
  import { SkiaBaseWebView } from "./SkiaBaseWebView";
5
5
 
6
- export class SkiaPictureView extends SkiaBaseWebView<SkiaPictureViewProps> {
7
- constructor(props: SkiaPictureViewProps) {
6
+ export class SkiaPictureView extends SkiaBaseWebView<SkiaPictureViewNativeProps> {
7
+ constructor(props: SkiaPictureViewNativeProps) {
8
8
  super(props);
9
9
  }
10
10
 
@@ -4,10 +4,7 @@ import type { GroupProps, RenderNode } from "../dom/types";
4
4
  import type { SkImage, SkPicture, SkRect, SkSize } from "../skia/types";
5
5
  import type { SharedValueType } from "../renderer/processors/Animations/Animations";
6
6
 
7
- export type DrawMode = "continuous" | "default";
8
-
9
7
  export type NativeSkiaViewProps = ViewProps & {
10
- mode?: DrawMode;
11
8
  debug?: boolean;
12
9
  };
13
10
 
@@ -25,14 +22,6 @@ export interface ISkiaViewApi {
25
22
  }
26
23
 
27
24
  export interface SkiaBaseViewProps extends ViewProps {
28
- /**
29
- * Sets the drawing mode for the skia view. There are two drawing
30
- * modes, "continuous" and "default", where the continuous mode will
31
- * continuously redraw the view, and the default mode will only
32
- * redraw when any of the regular react properties are changed like
33
- * sizes and margins.
34
- */
35
- mode?: DrawMode;
36
25
  /**
37
26
  * When set to true the view will display information about the
38
27
  * average time it takes to render.
@@ -45,10 +34,10 @@ export interface SkiaBaseViewProps extends ViewProps {
45
34
  onSize?: SharedValueType<SkSize>;
46
35
  }
47
36
 
48
- export interface SkiaPictureViewProps extends SkiaBaseViewProps {
37
+ export interface SkiaPictureViewNativeProps extends SkiaBaseViewProps {
49
38
  picture?: SkPicture;
50
39
  }
51
40
 
52
- export interface SkiaDomViewProps extends SkiaBaseViewProps {
41
+ export interface SkiaDomViewNativeProps extends SkiaBaseViewProps {
53
42
  root?: RenderNode<GroupProps>;
54
43
  }
@@ -1,73 +0,0 @@
1
- #include "RNSkDispatchQueue.h"
2
-
3
- #include <memory>
4
- #include <mutex>
5
- #include <utility>
6
-
7
- namespace RNSkia {
8
-
9
- RNSkDispatchQueue::~RNSkDispatchQueue() {
10
- // Signal to dispatch threads that it's time to wrap up
11
- std::unique_lock<std::mutex> lock(lock_);
12
- quit_ = true;
13
- lock.unlock();
14
- cv_.notify_all();
15
-
16
- // Wait for threads to finish before we exit
17
- for (size_t i = 0; i < threads_.size(); i++) {
18
- if (threads_[i].joinable()) {
19
- threads_[i].join();
20
- }
21
- }
22
- }
23
-
24
- RNSkDispatchQueue::RNSkDispatchQueue(std::string name, size_t thread_cnt)
25
- : name_{std::move(name)}, threads_(thread_cnt) {
26
- for (size_t i = 0; i < threads_.size(); i++) {
27
- threads_[i] =
28
- std::thread(&RNSkDispatchQueue::dispatch_thread_handler, this);
29
- }
30
- }
31
-
32
- void RNSkDispatchQueue::dispatch(const fp_t &op) {
33
- std::unique_lock<std::mutex> lock(lock_);
34
- q_.push(op);
35
-
36
- // Manual unlocking is done before notifying, to avoid waking up
37
- // the waiting thread only to block again (see notify_one for details)
38
- lock.unlock();
39
- cv_.notify_one();
40
- }
41
-
42
- void RNSkDispatchQueue::dispatch(fp_t &&op) {
43
- std::unique_lock<std::mutex> lock(lock_);
44
- q_.push(std::move(op));
45
-
46
- // Manual unlocking is done before notifying, to avoid waking up
47
- // the waiting thread only to block again (see notify_one for details)
48
- lock.unlock();
49
- cv_.notify_one();
50
- }
51
-
52
- void RNSkDispatchQueue::dispatch_thread_handler(void) {
53
- std::unique_lock<std::mutex> lock(lock_);
54
-
55
- do {
56
- // Wait until we have data or a quit signal
57
- cv_.wait(lock, [this] { return (q_.size() || quit_); });
58
-
59
- // after wait, we own the lock
60
- if (!quit_ && q_.size()) {
61
- auto op = std::move(q_.front());
62
- q_.pop();
63
-
64
- // unlock now that we're done messing with the queue
65
- lock.unlock();
66
-
67
- op();
68
-
69
- lock.lock();
70
- }
71
- } while (!quit_);
72
- }
73
- } // namespace RNSkia
@@ -1,49 +0,0 @@
1
- #pragma once
2
-
3
- #include <condition_variable>
4
- #include <cstdint>
5
- #include <cstdio>
6
- #include <functional>
7
- #include <mutex>
8
- #include <queue>
9
- #include <string>
10
- #include <thread>
11
- #include <vector>
12
-
13
- // https://github.com/embeddedartistry/embedded-resources/blob/master/examples/cpp/dispatch.cpp
14
- namespace RNSkia {
15
-
16
- class RNSkDispatchQueue {
17
- typedef std::function<void(void)> fp_t;
18
-
19
- public:
20
- explicit RNSkDispatchQueue(std::string name, size_t thread_cnt = 1);
21
-
22
- ~RNSkDispatchQueue();
23
-
24
- // dispatch and copy
25
- void dispatch(const fp_t &op);
26
-
27
- // dispatch and move
28
- void dispatch(fp_t &&op);
29
-
30
- // Deleted operations
31
- RNSkDispatchQueue(const RNSkDispatchQueue &rhs) = delete;
32
-
33
- RNSkDispatchQueue &operator=(const RNSkDispatchQueue &rhs) = delete;
34
-
35
- RNSkDispatchQueue(RNSkDispatchQueue &&rhs) = delete;
36
-
37
- RNSkDispatchQueue &operator=(RNSkDispatchQueue &&rhs) = delete;
38
-
39
- private:
40
- std::string name_;
41
- std::mutex lock_;
42
- std::vector<std::thread> threads_;
43
- std::queue<fp_t> q_;
44
- std::condition_variable cv_;
45
- bool quit_ = false;
46
-
47
- void dispatch_thread_handler(void);
48
- };
49
- } // namespace RNSkia
@@ -1,17 +0,0 @@
1
- #pragma once
2
-
3
- #import <CoreFoundation/CoreFoundation.h>
4
- #import <UIKit/UIKit.h>
5
-
6
- typedef void (^block_t)(double);
7
- @interface DisplayLink : NSObject {
8
- CADisplayLink *_displayLink;
9
- }
10
-
11
- @property(nonatomic, copy) block_t updateBlock;
12
-
13
- - (void)start:(block_t)block;
14
-
15
- - (void)stop;
16
-
17
- @end
@@ -1,41 +0,0 @@
1
- #import "DisplayLink.h"
2
-
3
- @implementation DisplayLink
4
-
5
- - (void)start:(block_t)block {
6
- self.updateBlock = block;
7
- // check whether the loop is already running
8
- if (_displayLink == nil) {
9
- // specify update method
10
- _displayLink = [CADisplayLink displayLinkWithTarget:self
11
- selector:@selector(update:)];
12
-
13
- if (@available(iOS 15.0, *)) {
14
- CAFrameRateRange rate = CAFrameRateRangeMake(60, 120, 120);
15
- _displayLink.preferredFrameRateRange = rate;
16
- } else {
17
- _displayLink.preferredFramesPerSecond = 60;
18
- }
19
-
20
- // add the display link to the main run loop
21
- [_displayLink addToRunLoop:[NSRunLoop mainRunLoop]
22
- forMode:NSRunLoopCommonModes];
23
- }
24
- }
25
-
26
- - (void)stop {
27
- // check whether the loop is already stopped
28
- if (_displayLink != nil) {
29
- // if the display link is present, it gets invalidated (loop stops)
30
-
31
- [_displayLink invalidate];
32
- _displayLink = nil;
33
- }
34
- }
35
-
36
- - (void)update:(CADisplayLink *)sender {
37
- double time = [sender timestamp];
38
- _updateBlock(time);
39
- }
40
-
41
- @end