@shopify/react-native-skia 1.5.7 → 1.5.9

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