@shopify/react-native-skia 1.2.1 → 1.2.3
Sign up to get free protection for your applications and to get access to all the features.
- package/android/cpp/rnskia-android/SkiaOpenGLSurfaceFactory.cpp +34 -14
- package/android/cpp/rnskia-android/SkiaOpenGLSurfaceFactory.h +2 -1
- package/android/src/main/java/com/shopify/reactnative/skia/ViewScreenshotService.java +13 -8
- package/cpp/api/JsiSkImageFactory.h +3 -3
- package/cpp/rnskia/RNSkPlatformContext.h +3 -3
- package/ios/RNSkia-iOS/RNSkiOSPlatformContext.mm +2 -6
- package/ios/RNSkia-iOS/SkiaCVPixelBufferUtils.h +42 -7
- package/ios/RNSkia-iOS/SkiaCVPixelBufferUtils.mm +178 -5
- package/ios/RNSkia-iOS/SkiaMetalSurfaceFactory.mm +10 -13
- package/lib/commonjs/external/ModuleProxy.d.ts +10 -0
- package/lib/commonjs/external/ModuleProxy.js +36 -0
- package/lib/commonjs/external/ModuleProxy.js.map +1 -0
- package/lib/commonjs/external/reanimated/ReanimatedProxy.d.ts +3 -0
- package/lib/commonjs/external/reanimated/ReanimatedProxy.js +18 -0
- package/lib/commonjs/external/reanimated/ReanimatedProxy.js.map +1 -0
- package/lib/commonjs/external/reanimated/buffers.js +9 -6
- package/lib/commonjs/external/reanimated/buffers.js.map +1 -1
- package/lib/commonjs/external/reanimated/interpolators.js +8 -7
- package/lib/commonjs/external/reanimated/interpolators.js.map +1 -1
- package/lib/commonjs/external/reanimated/renderHelpers.js +27 -11
- package/lib/commonjs/external/reanimated/renderHelpers.js.map +1 -1
- package/lib/commonjs/external/reanimated/textures.js +4 -3
- package/lib/commonjs/external/reanimated/textures.js.map +1 -1
- package/lib/commonjs/external/reanimated/useAnimatedImageValue.js +6 -6
- package/lib/commonjs/external/reanimated/useAnimatedImageValue.js.map +1 -1
- package/lib/commonjs/external/reanimated/useDerivedValueOnJS.js +6 -5
- package/lib/commonjs/external/reanimated/useDerivedValueOnJS.js.map +1 -1
- package/lib/commonjs/renderer/Offscreen.js +1 -5
- package/lib/commonjs/renderer/Offscreen.js.map +1 -1
- package/lib/commonjs/skia/types/Image/ImageFactory.d.ts +3 -3
- package/lib/commonjs/skia/types/Image/ImageFactory.js.map +1 -1
- package/lib/commonjs/skia/types/NativeBuffer/NativeBufferFactory.d.ts +3 -3
- package/lib/commonjs/skia/types/NativeBuffer/NativeBufferFactory.js.map +1 -1
- package/lib/commonjs/skia/web/JsiSkNativeBufferFactory.d.ts +1 -1
- package/lib/commonjs/skia/web/JsiSkNativeBufferFactory.js +1 -1
- package/lib/commonjs/skia/web/JsiSkNativeBufferFactory.js.map +1 -1
- package/lib/commonjs/specs/NativeSkiaModule.web.d.ts +0 -2
- package/lib/commonjs/specs/NativeSkiaModule.web.js +0 -8
- package/lib/commonjs/specs/NativeSkiaModule.web.js.map +1 -1
- package/lib/module/external/ModuleProxy.d.ts +10 -0
- package/lib/module/external/ModuleProxy.js +28 -0
- package/lib/module/external/ModuleProxy.js.map +1 -0
- package/lib/module/external/reanimated/ReanimatedProxy.d.ts +3 -0
- package/lib/module/external/reanimated/ReanimatedProxy.js +12 -0
- package/lib/module/external/reanimated/ReanimatedProxy.js.map +1 -0
- package/lib/module/external/reanimated/buffers.js +8 -6
- package/lib/module/external/reanimated/buffers.js.map +1 -1
- package/lib/module/external/reanimated/interpolators.js +7 -7
- package/lib/module/external/reanimated/interpolators.js.map +1 -1
- package/lib/module/external/reanimated/renderHelpers.js +26 -11
- package/lib/module/external/reanimated/renderHelpers.js.map +1 -1
- package/lib/module/external/reanimated/textures.js +3 -3
- package/lib/module/external/reanimated/textures.js.map +1 -1
- package/lib/module/external/reanimated/useAnimatedImageValue.js +5 -6
- package/lib/module/external/reanimated/useAnimatedImageValue.js.map +1 -1
- package/lib/module/external/reanimated/useDerivedValueOnJS.js +5 -5
- package/lib/module/external/reanimated/useDerivedValueOnJS.js.map +1 -1
- package/lib/module/renderer/Offscreen.js +1 -5
- package/lib/module/renderer/Offscreen.js.map +1 -1
- package/lib/module/skia/types/Image/ImageFactory.d.ts +3 -3
- package/lib/module/skia/types/Image/ImageFactory.js.map +1 -1
- package/lib/module/skia/types/NativeBuffer/NativeBufferFactory.d.ts +3 -3
- package/lib/module/skia/types/NativeBuffer/NativeBufferFactory.js.map +1 -1
- package/lib/module/skia/web/JsiSkNativeBufferFactory.d.ts +1 -1
- package/lib/module/skia/web/JsiSkNativeBufferFactory.js +1 -1
- package/lib/module/skia/web/JsiSkNativeBufferFactory.js.map +1 -1
- package/lib/module/specs/NativeSkiaModule.web.d.ts +0 -2
- package/lib/module/specs/NativeSkiaModule.web.js +0 -3
- package/lib/module/specs/NativeSkiaModule.web.js.map +1 -1
- package/lib/typescript/src/external/ModuleProxy.d.ts +10 -0
- package/lib/typescript/src/external/reanimated/ReanimatedProxy.d.ts +3 -0
- package/lib/typescript/src/skia/types/Image/ImageFactory.d.ts +3 -3
- package/lib/typescript/src/skia/types/NativeBuffer/NativeBufferFactory.d.ts +3 -3
- package/lib/typescript/src/skia/web/JsiSkNativeBufferFactory.d.ts +1 -1
- package/lib/typescript/src/specs/NativeSkiaModule.web.d.ts +0 -2
- package/libs/ios/libskia.xcframework/Info.plist +5 -5
- package/libs/ios/libskia.xcframework/ios-arm64_arm64e/libskia.a +0 -0
- package/libs/ios/libskia.xcframework/ios-arm64_arm64e_x86_64-simulator/libskia.a +0 -0
- package/libs/ios/libskottie.xcframework/Info.plist +5 -5
- package/libs/ios/libskottie.xcframework/ios-arm64_arm64e/libskottie.a +0 -0
- package/libs/ios/libskottie.xcframework/ios-arm64_arm64e_x86_64-simulator/libskottie.a +0 -0
- package/libs/ios/libskparagraph.xcframework/ios-arm64_arm64e/libskparagraph.a +0 -0
- package/libs/ios/libskparagraph.xcframework/ios-arm64_arm64e_x86_64-simulator/libskparagraph.a +0 -0
- package/libs/ios/libsksg.xcframework/ios-arm64_arm64e/libsksg.a +0 -0
- package/libs/ios/libsksg.xcframework/ios-arm64_arm64e_x86_64-simulator/libsksg.a +0 -0
- package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e/libskshaper.a +0 -0
- package/libs/ios/libskshaper.xcframework/ios-arm64_arm64e_x86_64-simulator/libskshaper.a +0 -0
- package/libs/ios/libskunicode.xcframework/ios-arm64_arm64e/libskunicode.a +0 -0
- package/libs/ios/libskunicode.xcframework/ios-arm64_arm64e_x86_64-simulator/libskunicode.a +0 -0
- package/libs/ios/libsvg.xcframework/ios-arm64_arm64e/libsvg.a +0 -0
- package/libs/ios/libsvg.xcframework/ios-arm64_arm64e_x86_64-simulator/libsvg.a +0 -0
- package/package.json +1 -1
- package/src/external/ModuleProxy.ts +30 -0
- package/src/external/reanimated/ReanimatedProxy.ts +18 -0
- package/src/external/reanimated/buffers.ts +7 -6
- package/src/external/reanimated/interpolators.ts +7 -12
- package/src/external/reanimated/renderHelpers.ts +31 -18
- package/src/external/reanimated/textures.tsx +3 -3
- package/src/external/reanimated/useAnimatedImageValue.ts +5 -10
- package/src/external/reanimated/useDerivedValueOnJS.ts +5 -10
- package/src/renderer/Offscreen.tsx +1 -7
- package/src/skia/types/Image/ImageFactory.ts +3 -3
- package/src/skia/types/NativeBuffer/NativeBufferFactory.ts +3 -3
- package/src/skia/web/JsiSkNativeBufferFactory.ts +1 -1
- package/src/specs/NativeSkiaModule.web.ts +0 -4
- package/android/src/paper/java/com/facebook/react/viewmanagers/SkiaDrawViewManagerDelegate.java +0 -34
- package/cpp/skia/include/gpu/GrBackendDrawableInfo.h +0 -9
- package/lib/commonjs/external/reanimated/moduleWrapper.d.ts +0 -15
- package/lib/commonjs/external/reanimated/moduleWrapper.js +0 -46
- package/lib/commonjs/external/reanimated/moduleWrapper.js.map +0 -1
- package/lib/module/external/reanimated/moduleWrapper.d.ts +0 -15
- package/lib/module/external/reanimated/moduleWrapper.js +0 -37
- package/lib/module/external/reanimated/moduleWrapper.js.map +0 -1
- package/lib/typescript/src/external/reanimated/moduleWrapper.d.ts +0 -15
- package/src/external/reanimated/moduleWrapper.ts +0 -83
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":["Host","JsiSkNativeBufferFactory","constructor","CanvasKit","MakeFromImage","image","info","getImageInfo","uint8ClampedArray","Uint8ClampedArray","readPixels","imageData","ImageData","width","height","canvas","OffscreenCanvas","ctx","getContext","Error","putImageData","Release","
|
1
|
+
{"version":3,"names":["Host","JsiSkNativeBufferFactory","constructor","CanvasKit","MakeFromImage","image","info","getImageInfo","uint8ClampedArray","Uint8ClampedArray","readPixels","imageData","ImageData","width","height","canvas","OffscreenCanvas","ctx","getContext","Error","putImageData","Release","_nativeBuffer"],"sources":["JsiSkNativeBufferFactory.ts"],"sourcesContent":["import type { CanvasKit } from \"canvaskit-wasm\";\n\nimport {\n type NativeBuffer,\n type NativeBufferFactory,\n type SkImage,\n} from \"../types\";\n\nimport { Host } from \"./Host\";\n\nexport class JsiSkNativeBufferFactory\n extends Host\n implements NativeBufferFactory\n{\n constructor(CanvasKit: CanvasKit) {\n super(CanvasKit);\n }\n\n MakeFromImage(image: SkImage): NativeBuffer {\n const info = image.getImageInfo();\n const uint8ClampedArray = new Uint8ClampedArray(image.readPixels()!);\n const imageData = new ImageData(uint8ClampedArray, info.width, info.height);\n const canvas = new OffscreenCanvas(info.width, info.height);\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) {\n throw new Error(\"Failed to get 2d context from canvas\");\n }\n ctx.putImageData(imageData, 0, 0);\n return canvas;\n }\n\n Release(_nativeBuffer: NativeBuffer) {\n // it's a noop on Web\n }\n}\n"],"mappings":"AAQA,SAASA,IAAI,QAAQ,QAAQ;AAE7B,OAAO,MAAMC,wBAAwB,SAC3BD,IAAI,CAEd;EACEE,WAAWA,CAACC,SAAoB,EAAE;IAChC,KAAK,CAACA,SAAS,CAAC;EAClB;EAEAC,aAAaA,CAACC,KAAc,EAAgB;IAC1C,MAAMC,IAAI,GAAGD,KAAK,CAACE,YAAY,CAAC,CAAC;IACjC,MAAMC,iBAAiB,GAAG,IAAIC,iBAAiB,CAACJ,KAAK,CAACK,UAAU,CAAC,CAAE,CAAC;IACpE,MAAMC,SAAS,GAAG,IAAIC,SAAS,CAACJ,iBAAiB,EAAEF,IAAI,CAACO,KAAK,EAAEP,IAAI,CAACQ,MAAM,CAAC;IAC3E,MAAMC,MAAM,GAAG,IAAIC,eAAe,CAACV,IAAI,CAACO,KAAK,EAAEP,IAAI,CAACQ,MAAM,CAAC;IAC3D,MAAMG,GAAG,GAAGF,MAAM,CAACG,UAAU,CAAC,IAAI,CAAC;IACnC,IAAI,CAACD,GAAG,EAAE;MACR,MAAM,IAAIE,KAAK,CAAC,sCAAsC,CAAC;IACzD;IACAF,GAAG,CAACG,YAAY,CAACT,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;IACjC,OAAOI,MAAM;EACf;EAEAM,OAAOA,CAACC,aAA2B,EAAE;IACnC;EAAA;AAEJ"}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"names":[
|
1
|
+
{"version":3,"names":[],"sources":["NativeSkiaModule.web.ts"],"sourcesContent":[""],"mappings":""}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
type ImportType = ReturnType<typeof require>;
|
2
|
+
/**
|
3
|
+
* Create a lazily-imported module proxy.
|
4
|
+
* This is useful for lazily requiring optional dependencies.
|
5
|
+
*/
|
6
|
+
export declare const createModuleProxy: <TModule>(getModule: () => ImportType) => TModule;
|
7
|
+
export declare class OptionalDependencyNotInstalledError extends Error {
|
8
|
+
constructor(name: string);
|
9
|
+
}
|
10
|
+
export {};
|
@@ -46,7 +46,7 @@ export interface ImageFactory {
|
|
46
46
|
MakeImageFromEncoded: (encoded: SkData) => SkImage | null;
|
47
47
|
/**
|
48
48
|
* Return an Image backed by a given native buffer.
|
49
|
-
* The
|
49
|
+
* The native buffer must be a valid owning reference.
|
50
50
|
*
|
51
51
|
* For instance, this API is used by
|
52
52
|
* [react-native-vision-camera](https://github.com/mrousavy/react-native-vision-camera)
|
@@ -54,9 +54,9 @@ export interface ImageFactory {
|
|
54
54
|
*
|
55
55
|
* - On Android; This is an `AHardwareBuffer*`
|
56
56
|
* - On iOS, this is a `CVPixelBufferRef`
|
57
|
-
* @param nativeBuffer A strong `uintptr_t` pointer to the native
|
57
|
+
* @param nativeBuffer A strong `uintptr_t` pointer to the native buffer
|
58
58
|
* @throws Throws an error if the Image could not be created, for example when the given
|
59
|
-
*
|
59
|
+
* native buffer is invalid.
|
60
60
|
*/
|
61
61
|
MakeImageFromNativeBuffer: (nativeBuffer: NativeBuffer) => SkImage;
|
62
62
|
/**
|
@@ -8,11 +8,11 @@ export declare const isNativeBufferWeb: (buffer: NativeBuffer) => buffer is Canv
|
|
8
8
|
export declare const isNativeBufferNode: (buffer: NativeBuffer) => buffer is ArrayBuffer;
|
9
9
|
export interface NativeBufferFactory {
|
10
10
|
/**
|
11
|
-
* Copy pixels to a
|
11
|
+
* Copy pixels to a native buffer.
|
12
12
|
*/
|
13
13
|
MakeFromImage: (image: SkImage) => NativeBuffer;
|
14
14
|
/**
|
15
|
-
* Release a
|
15
|
+
* Release a native buffer that was created with `MakeFromImage`.
|
16
16
|
*/
|
17
|
-
Release: (
|
17
|
+
Release: (nativeBuffer: NativeBuffer) => void;
|
18
18
|
}
|
@@ -4,5 +4,5 @@ import { Host } from "./Host";
|
|
4
4
|
export declare class JsiSkNativeBufferFactory extends Host implements NativeBufferFactory {
|
5
5
|
constructor(CanvasKit: CanvasKit);
|
6
6
|
MakeFromImage(image: SkImage): NativeBuffer;
|
7
|
-
Release(
|
7
|
+
Release(_nativeBuffer: NativeBuffer): void;
|
8
8
|
}
|
@@ -6,32 +6,32 @@
|
|
6
6
|
<array>
|
7
7
|
<dict>
|
8
8
|
<key>LibraryIdentifier</key>
|
9
|
-
<string>ios-
|
9
|
+
<string>ios-arm64_arm64e_x86_64-simulator</string>
|
10
10
|
<key>LibraryPath</key>
|
11
11
|
<string>libskia.a</string>
|
12
12
|
<key>SupportedArchitectures</key>
|
13
13
|
<array>
|
14
14
|
<string>arm64</string>
|
15
15
|
<string>arm64e</string>
|
16
|
+
<string>x86_64</string>
|
16
17
|
</array>
|
17
18
|
<key>SupportedPlatform</key>
|
18
19
|
<string>ios</string>
|
20
|
+
<key>SupportedPlatformVariant</key>
|
21
|
+
<string>simulator</string>
|
19
22
|
</dict>
|
20
23
|
<dict>
|
21
24
|
<key>LibraryIdentifier</key>
|
22
|
-
<string>ios-
|
25
|
+
<string>ios-arm64_arm64e</string>
|
23
26
|
<key>LibraryPath</key>
|
24
27
|
<string>libskia.a</string>
|
25
28
|
<key>SupportedArchitectures</key>
|
26
29
|
<array>
|
27
30
|
<string>arm64</string>
|
28
31
|
<string>arm64e</string>
|
29
|
-
<string>x86_64</string>
|
30
32
|
</array>
|
31
33
|
<key>SupportedPlatform</key>
|
32
34
|
<string>ios</string>
|
33
|
-
<key>SupportedPlatformVariant</key>
|
34
|
-
<string>simulator</string>
|
35
35
|
</dict>
|
36
36
|
</array>
|
37
37
|
<key>CFBundlePackageType</key>
|
Binary file
|
Binary file
|
@@ -6,32 +6,32 @@
|
|
6
6
|
<array>
|
7
7
|
<dict>
|
8
8
|
<key>LibraryIdentifier</key>
|
9
|
-
<string>ios-
|
9
|
+
<string>ios-arm64_arm64e</string>
|
10
10
|
<key>LibraryPath</key>
|
11
11
|
<string>libskottie.a</string>
|
12
12
|
<key>SupportedArchitectures</key>
|
13
13
|
<array>
|
14
14
|
<string>arm64</string>
|
15
15
|
<string>arm64e</string>
|
16
|
-
<string>x86_64</string>
|
17
16
|
</array>
|
18
17
|
<key>SupportedPlatform</key>
|
19
18
|
<string>ios</string>
|
20
|
-
<key>SupportedPlatformVariant</key>
|
21
|
-
<string>simulator</string>
|
22
19
|
</dict>
|
23
20
|
<dict>
|
24
21
|
<key>LibraryIdentifier</key>
|
25
|
-
<string>ios-
|
22
|
+
<string>ios-arm64_arm64e_x86_64-simulator</string>
|
26
23
|
<key>LibraryPath</key>
|
27
24
|
<string>libskottie.a</string>
|
28
25
|
<key>SupportedArchitectures</key>
|
29
26
|
<array>
|
30
27
|
<string>arm64</string>
|
31
28
|
<string>arm64e</string>
|
29
|
+
<string>x86_64</string>
|
32
30
|
</array>
|
33
31
|
<key>SupportedPlatform</key>
|
34
32
|
<string>ios</string>
|
33
|
+
<key>SupportedPlatformVariant</key>
|
34
|
+
<string>simulator</string>
|
35
35
|
</dict>
|
36
36
|
</array>
|
37
37
|
<key>CFBundlePackageType</key>
|
Binary file
|
Binary file
|
Binary file
|
package/libs/ios/libskparagraph.xcframework/ios-arm64_arm64e_x86_64-simulator/libskparagraph.a
CHANGED
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
package/package.json
CHANGED
@@ -7,7 +7,7 @@
|
|
7
7
|
"setup-skia-web": "./scripts/setup-canvaskit.js"
|
8
8
|
},
|
9
9
|
"title": "React Native Skia",
|
10
|
-
"version": "1.2.
|
10
|
+
"version": "1.2.3",
|
11
11
|
"description": "High-performance React Native Graphics using Skia",
|
12
12
|
"main": "lib/module/index.js",
|
13
13
|
"react-native": "src/index.ts",
|
@@ -0,0 +1,30 @@
|
|
1
|
+
// https://github.com/mrousavy/react-native-vision-camera/blob/main/package/src/dependencies/ModuleProxy.ts
|
2
|
+
type ImportType = ReturnType<typeof require>;
|
3
|
+
|
4
|
+
/**
|
5
|
+
* Create a lazily-imported module proxy.
|
6
|
+
* This is useful for lazily requiring optional dependencies.
|
7
|
+
*/
|
8
|
+
export const createModuleProxy = <TModule>(
|
9
|
+
getModule: () => ImportType
|
10
|
+
): TModule => {
|
11
|
+
const holder: { module: TModule | undefined } = { module: undefined };
|
12
|
+
|
13
|
+
const proxy = new Proxy(holder, {
|
14
|
+
get: (target, property) => {
|
15
|
+
if (target.module == null) {
|
16
|
+
// lazy initialize module via require()
|
17
|
+
// caller needs to make sure the require() call is wrapped in a try/catch
|
18
|
+
target.module = getModule() as TModule;
|
19
|
+
}
|
20
|
+
return target.module[property as keyof typeof holder.module];
|
21
|
+
},
|
22
|
+
});
|
23
|
+
return proxy as unknown as TModule;
|
24
|
+
};
|
25
|
+
|
26
|
+
export class OptionalDependencyNotInstalledError extends Error {
|
27
|
+
constructor(name: string) {
|
28
|
+
super(`${name} is not installed!`);
|
29
|
+
}
|
30
|
+
}
|
@@ -0,0 +1,18 @@
|
|
1
|
+
import type * as ReanimatedT from "react-native-reanimated";
|
2
|
+
|
3
|
+
import {
|
4
|
+
OptionalDependencyNotInstalledError,
|
5
|
+
createModuleProxy,
|
6
|
+
} from "../ModuleProxy";
|
7
|
+
type TReanimated = typeof ReanimatedT;
|
8
|
+
|
9
|
+
const Reanimated = createModuleProxy<TReanimated>(() => {
|
10
|
+
try {
|
11
|
+
return require("react-native-reanimated");
|
12
|
+
} catch (e) {
|
13
|
+
throw new OptionalDependencyNotInstalledError("react-native-reanimated");
|
14
|
+
}
|
15
|
+
});
|
16
|
+
|
17
|
+
// eslint-disable-next-line import/no-default-export
|
18
|
+
export default Reanimated;
|
@@ -4,17 +4,18 @@ import type { WorkletFunction } from "react-native-reanimated/lib/typescript/rea
|
|
4
4
|
import type { SkColor, SkHostRect, SkPoint, SkRSXform } from "../../skia/types";
|
5
5
|
import { Skia } from "../../skia";
|
6
6
|
|
7
|
-
import { startMapper, stopMapper, makeMutable } from "./moduleWrapper";
|
8
7
|
import { notifyChange } from "./interpolators";
|
8
|
+
import Rea from "./ReanimatedProxy";
|
9
9
|
|
10
10
|
type Modifier<T> = (input: T, index: number) => void;
|
11
11
|
|
12
|
-
const useBufferValue = <T>(size: number, bufferInitializer: () => T) =>
|
13
|
-
useMemo(
|
14
|
-
() => makeMutable(new Array(size).fill(0).map(bufferInitializer)),
|
12
|
+
const useBufferValue = <T>(size: number, bufferInitializer: () => T) => {
|
13
|
+
return useMemo(
|
14
|
+
() => Rea.makeMutable(new Array(size).fill(0).map(bufferInitializer)),
|
15
15
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
16
16
|
[size]
|
17
17
|
);
|
18
|
+
};
|
18
19
|
|
19
20
|
const useBuffer = <T>(
|
20
21
|
size: number,
|
@@ -24,7 +25,7 @@ const useBuffer = <T>(
|
|
24
25
|
const values = useBufferValue(size, bufferInitializer);
|
25
26
|
const mod = modifier as WorkletFunction;
|
26
27
|
const deps = [size, ...Object.values(mod.__closure ?? {})];
|
27
|
-
const mapperId = startMapper(() => {
|
28
|
+
const mapperId = Rea.startMapper(() => {
|
28
29
|
"worklet";
|
29
30
|
values.value.forEach((val, index) => {
|
30
31
|
modifier(val, index);
|
@@ -34,7 +35,7 @@ const useBuffer = <T>(
|
|
34
35
|
|
35
36
|
useEffect(() => {
|
36
37
|
return () => {
|
37
|
-
stopMapper(mapperId);
|
38
|
+
Rea.stopMapper(mapperId);
|
38
39
|
};
|
39
40
|
}, [mapperId]);
|
40
41
|
|
@@ -10,12 +10,7 @@ import { interpolatePaths, interpolateVector } from "../../animation";
|
|
10
10
|
import { Skia } from "../../skia";
|
11
11
|
import { isOnMainThread } from "../../renderer/Offscreen";
|
12
12
|
|
13
|
-
import
|
14
|
-
useAnimatedReaction,
|
15
|
-
useFrameCallback,
|
16
|
-
useSharedValue,
|
17
|
-
useDerivedValue,
|
18
|
-
} from "./moduleWrapper";
|
13
|
+
import Rea from "./ReanimatedProxy";
|
19
14
|
|
20
15
|
export const notifyChange = (value: SharedValue<unknown>) => {
|
21
16
|
"worklet";
|
@@ -27,8 +22,8 @@ export const notifyChange = (value: SharedValue<unknown>) => {
|
|
27
22
|
|
28
23
|
export const usePathValue = (cb: (path: SkPath) => void, init?: SkPath) => {
|
29
24
|
const pathInit = useMemo(() => Skia.Path.Make(), []);
|
30
|
-
const path = useSharedValue(pathInit);
|
31
|
-
useDerivedValue(() => {
|
25
|
+
const path = Rea.useSharedValue(pathInit);
|
26
|
+
Rea.useDerivedValue(() => {
|
32
27
|
path.value.reset();
|
33
28
|
if (init !== undefined) {
|
34
29
|
path.value.addPath(init);
|
@@ -40,7 +35,7 @@ export const usePathValue = (cb: (path: SkPath) => void, init?: SkPath) => {
|
|
40
35
|
};
|
41
36
|
|
42
37
|
export const useClock = () => {
|
43
|
-
const clock = useSharedValue(0);
|
38
|
+
const clock = Rea.useSharedValue(0);
|
44
39
|
const callback = useCallback(
|
45
40
|
(info: FrameInfo) => {
|
46
41
|
"worklet";
|
@@ -48,7 +43,7 @@ export const useClock = () => {
|
|
48
43
|
},
|
49
44
|
[clock]
|
50
45
|
);
|
51
|
-
useFrameCallback(callback);
|
46
|
+
Rea.useFrameCallback(callback);
|
52
47
|
return clock;
|
53
48
|
};
|
54
49
|
|
@@ -73,8 +68,8 @@ const useInterpolator = <T>(
|
|
73
68
|
) => {
|
74
69
|
// eslint-disable-next-line react-hooks/exhaustive-deps
|
75
70
|
const init = useMemo(() => factory(), []);
|
76
|
-
const result = useSharedValue(init);
|
77
|
-
useAnimatedReaction(
|
71
|
+
const result = Rea.useSharedValue(init);
|
72
|
+
Rea.useAnimatedReaction(
|
78
73
|
() => value.value,
|
79
74
|
(val) => {
|
80
75
|
result.value = interpolator(val, input, output, options, result.value);
|
@@ -4,26 +4,39 @@ import type { Container } from "../../renderer/Container";
|
|
4
4
|
import type { AnimatedProps } from "../../renderer/processors";
|
5
5
|
import type { Node } from "../../dom/types";
|
6
6
|
|
7
|
-
import
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
7
|
+
import Rea from "./ReanimatedProxy";
|
8
|
+
|
9
|
+
let HAS_REANIMATED = false;
|
10
|
+
let HAS_REANIMATED_3 = false;
|
11
|
+
try {
|
12
|
+
require("react-native-reanimated");
|
13
|
+
HAS_REANIMATED = true;
|
14
|
+
const reanimatedVersion =
|
15
|
+
require("react-native-reanimated/package.json").version;
|
16
|
+
if (
|
17
|
+
reanimatedVersion &&
|
18
|
+
(reanimatedVersion >= "3.0.0" || reanimatedVersion.includes("3.0.0-"))
|
19
|
+
) {
|
20
|
+
HAS_REANIMATED_3 = true;
|
21
|
+
}
|
22
|
+
} catch (e) {
|
23
|
+
HAS_REANIMATED = false;
|
24
|
+
}
|
15
25
|
|
16
26
|
const _bindings = new WeakMap<Node<unknown>, unknown>();
|
17
27
|
|
18
28
|
export const unbindReanimatedNode = (node: Node<unknown>) => {
|
29
|
+
if (!HAS_REANIMATED) {
|
30
|
+
return;
|
31
|
+
}
|
19
32
|
const previousMapperId = _bindings.get(node);
|
20
33
|
if (previousMapperId !== undefined) {
|
21
|
-
stopMapper(previousMapperId as number);
|
34
|
+
Rea.stopMapper(previousMapperId as number);
|
22
35
|
}
|
23
36
|
};
|
24
37
|
|
25
38
|
export function extractReanimatedProps(props: AnimatedProps<any>) {
|
26
|
-
if (!
|
39
|
+
if (!HAS_REANIMATED) {
|
27
40
|
return [props, {}];
|
28
41
|
}
|
29
42
|
const reanimatedProps = {} as AnimatedProps<any>;
|
@@ -33,7 +46,7 @@ export function extractReanimatedProps(props: AnimatedProps<any>) {
|
|
33
46
|
continue;
|
34
47
|
}
|
35
48
|
const propValue = props[propName];
|
36
|
-
if (isSharedValue(propValue)) {
|
49
|
+
if (Rea.isSharedValue(propValue)) {
|
37
50
|
reanimatedProps[propName] = propValue;
|
38
51
|
otherProps[propName] = propValue.value;
|
39
52
|
} else {
|
@@ -51,7 +64,7 @@ function bindReanimatedProps2(
|
|
51
64
|
const sharedValues = Object.values(reanimatedProps);
|
52
65
|
const previousMapperId = _bindings.get(node);
|
53
66
|
if (previousMapperId !== undefined) {
|
54
|
-
stopMapper(previousMapperId as number);
|
67
|
+
Rea.stopMapper(previousMapperId as number);
|
55
68
|
}
|
56
69
|
if (sharedValues.length > 0) {
|
57
70
|
const viewId = container.getNativeId();
|
@@ -70,9 +83,9 @@ function bindReanimatedProps2(
|
|
70
83
|
container.redraw();
|
71
84
|
}
|
72
85
|
};
|
73
|
-
const mapperId = startMapper(() => {
|
86
|
+
const mapperId = Rea.startMapper(() => {
|
74
87
|
"worklet";
|
75
|
-
runOnJS(updateProps)();
|
88
|
+
Rea.runOnJS(updateProps)();
|
76
89
|
}, sharedValues);
|
77
90
|
_bindings.set(node, mapperId);
|
78
91
|
}
|
@@ -83,21 +96,21 @@ export function bindReanimatedProps(
|
|
83
96
|
node: Node<any>,
|
84
97
|
reanimatedProps: AnimatedProps<any>
|
85
98
|
) {
|
86
|
-
if (
|
99
|
+
if (HAS_REANIMATED && !HAS_REANIMATED_3) {
|
87
100
|
return bindReanimatedProps2(container, node, reanimatedProps);
|
88
101
|
}
|
89
|
-
if (!
|
102
|
+
if (!HAS_REANIMATED) {
|
90
103
|
return;
|
91
104
|
}
|
92
105
|
const sharedValues = Object.values(reanimatedProps);
|
93
106
|
const previousMapperId = _bindings.get(node);
|
94
107
|
if (previousMapperId !== undefined) {
|
95
|
-
stopMapper(previousMapperId as number);
|
108
|
+
Rea.stopMapper(previousMapperId as number);
|
96
109
|
}
|
97
110
|
if (sharedValues.length > 0) {
|
98
111
|
const viewId = container.getNativeId();
|
99
112
|
const { SkiaViewApi } = global;
|
100
|
-
const mapperId = startMapper(() => {
|
113
|
+
const mapperId = Rea.startMapper(() => {
|
101
114
|
"worklet";
|
102
115
|
if (node) {
|
103
116
|
for (const propName in reanimatedProps) {
|
@@ -14,7 +14,7 @@ import {
|
|
14
14
|
} from "../../renderer/Offscreen";
|
15
15
|
import { Skia, useImage } from "../../skia";
|
16
16
|
|
17
|
-
import
|
17
|
+
import Rea from "./ReanimatedProxy";
|
18
18
|
|
19
19
|
const createTexture = (
|
20
20
|
texture: SharedValue<SkImage | null>,
|
@@ -57,10 +57,10 @@ export const usePictureAsTexture = (
|
|
57
57
|
picture: SkPicture | null,
|
58
58
|
size: SkSize
|
59
59
|
) => {
|
60
|
-
const texture = useSharedValue<SkImage | null>(null);
|
60
|
+
const texture = Rea.useSharedValue<SkImage | null>(null);
|
61
61
|
useEffect(() => {
|
62
62
|
if (picture !== null) {
|
63
|
-
runOnUI(createTexture)(texture, picture, size);
|
63
|
+
Rea.runOnUI(createTexture)(texture, picture, size);
|
64
64
|
}
|
65
65
|
}, [texture, picture, size]);
|
66
66
|
return texture;
|
@@ -4,11 +4,7 @@ import { type FrameInfo, type SharedValue } from "react-native-reanimated";
|
|
4
4
|
import { useAnimatedImage } from "../../skia/core/AnimatedImage";
|
5
5
|
import type { DataSourceParam, SkImage } from "../../skia/types";
|
6
6
|
|
7
|
-
import
|
8
|
-
throwOnMissingReanimated,
|
9
|
-
useFrameCallback,
|
10
|
-
useSharedValue,
|
11
|
-
} from "./moduleWrapper";
|
7
|
+
import Rea from "./ReanimatedProxy";
|
12
8
|
|
13
9
|
const DEFAULT_FRAME_DURATION = 60;
|
14
10
|
|
@@ -16,11 +12,10 @@ export const useAnimatedImageValue = (
|
|
16
12
|
source: DataSourceParam,
|
17
13
|
paused?: SharedValue<boolean>
|
18
14
|
) => {
|
19
|
-
|
20
|
-
const defaultPaused = useSharedValue(false);
|
15
|
+
const defaultPaused = Rea.useSharedValue(false);
|
21
16
|
const isPaused = paused ?? defaultPaused;
|
22
|
-
const currentFrame = useSharedValue<null | SkImage>(null);
|
23
|
-
const lastTimestamp = useSharedValue(-1);
|
17
|
+
const currentFrame = Rea.useSharedValue<null | SkImage>(null);
|
18
|
+
const lastTimestamp = Rea.useSharedValue(-1);
|
24
19
|
const animatedImage = useAnimatedImage(
|
25
20
|
source,
|
26
21
|
(err) => {
|
@@ -32,7 +27,7 @@ export const useAnimatedImageValue = (
|
|
32
27
|
const frameDuration =
|
33
28
|
animatedImage?.currentFrameDuration() || DEFAULT_FRAME_DURATION;
|
34
29
|
|
35
|
-
useFrameCallback((frameInfo: FrameInfo) => {
|
30
|
+
Rea.useFrameCallback((frameInfo: FrameInfo) => {
|
36
31
|
if (!animatedImage) {
|
37
32
|
currentFrame.value = null;
|
38
33
|
return;
|
@@ -1,11 +1,6 @@
|
|
1
1
|
import { useEffect, useMemo } from "react";
|
2
2
|
|
3
|
-
import
|
4
|
-
useSharedValue,
|
5
|
-
runOnJS,
|
6
|
-
startMapper,
|
7
|
-
stopMapper,
|
8
|
-
} from "./moduleWrapper";
|
3
|
+
import Rea from "./ReanimatedProxy";
|
9
4
|
|
10
5
|
export const useDerivedValueOnJS = (
|
11
6
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
@@ -13,13 +8,13 @@ export const useDerivedValueOnJS = (
|
|
13
8
|
deps: unknown[]
|
14
9
|
) => {
|
15
10
|
const init = useMemo(() => fn(), [fn]);
|
16
|
-
const value = useSharedValue(init);
|
11
|
+
const value = Rea.useSharedValue(init);
|
17
12
|
useEffect(() => {
|
18
|
-
const mapperId = startMapper(() => {
|
13
|
+
const mapperId = Rea.startMapper(() => {
|
19
14
|
"worklet";
|
20
|
-
runOnJS(fn)();
|
15
|
+
Rea.runOnJS(fn)();
|
21
16
|
}, deps);
|
22
|
-
return () => stopMapper(mapperId);
|
17
|
+
return () => Rea.stopMapper(mapperId);
|
23
18
|
}, [deps, fn]);
|
24
19
|
return value;
|
25
20
|
};
|
@@ -32,16 +32,10 @@ export const drawAsImage = (element: ReactElement, size: SkSize) => {
|
|
32
32
|
return drawAsImageFromPicture(drawAsPicture(element), size);
|
33
33
|
};
|
34
34
|
|
35
|
-
// TODO: We're not sure yet why PixelRatio is not needed here.
|
36
|
-
const pd = 1;
|
37
35
|
export const drawAsImageFromPicture = (picture: SkPicture, size: SkSize) => {
|
38
36
|
"worklet";
|
39
|
-
const surface = Skia.Surface.MakeOffscreen(
|
40
|
-
size.width * pd,
|
41
|
-
size.height * pd
|
42
|
-
)!;
|
37
|
+
const surface = Skia.Surface.MakeOffscreen(size.width, size.height)!;
|
43
38
|
const canvas = surface.getCanvas();
|
44
|
-
canvas.scale(pd, pd);
|
45
39
|
canvas.drawPicture(picture);
|
46
40
|
surface.flush();
|
47
41
|
const image = surface.makeImageSnapshot();
|
@@ -54,7 +54,7 @@ export interface ImageFactory {
|
|
54
54
|
|
55
55
|
/**
|
56
56
|
* Return an Image backed by a given native buffer.
|
57
|
-
* The
|
57
|
+
* The native buffer must be a valid owning reference.
|
58
58
|
*
|
59
59
|
* For instance, this API is used by
|
60
60
|
* [react-native-vision-camera](https://github.com/mrousavy/react-native-vision-camera)
|
@@ -62,9 +62,9 @@ export interface ImageFactory {
|
|
62
62
|
*
|
63
63
|
* - On Android; This is an `AHardwareBuffer*`
|
64
64
|
* - On iOS, this is a `CVPixelBufferRef`
|
65
|
-
* @param nativeBuffer A strong `uintptr_t` pointer to the native
|
65
|
+
* @param nativeBuffer A strong `uintptr_t` pointer to the native buffer
|
66
66
|
* @throws Throws an error if the Image could not be created, for example when the given
|
67
|
-
*
|
67
|
+
* native buffer is invalid.
|
68
68
|
*/
|
69
69
|
MakeImageFromNativeBuffer: (nativeBuffer: NativeBuffer) => SkImage;
|
70
70
|
|
@@ -28,11 +28,11 @@ export const isNativeBufferNode = (
|
|
28
28
|
|
29
29
|
export interface NativeBufferFactory {
|
30
30
|
/**
|
31
|
-
* Copy pixels to a
|
31
|
+
* Copy pixels to a native buffer.
|
32
32
|
*/
|
33
33
|
MakeFromImage: (image: SkImage) => NativeBuffer;
|
34
34
|
/**
|
35
|
-
* Release a
|
35
|
+
* Release a native buffer that was created with `MakeFromImage`.
|
36
36
|
*/
|
37
|
-
Release: (
|
37
|
+
Release: (nativeBuffer: NativeBuffer) => void;
|
38
38
|
}
|