@shopify/react-native-skia 0.1.134 → 0.1.136

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 (54) hide show
  1. package/cpp/api/JsiSkFont.h +25 -1
  2. package/jestSetup.js +5 -0
  3. package/lib/commonjs/animation/functions/interpolate.js +3 -2
  4. package/lib/commonjs/animation/functions/interpolate.js.map +1 -1
  5. package/lib/commonjs/animation/functions/interpolateColors.js +2 -2
  6. package/lib/commonjs/animation/functions/interpolateColors.js.map +1 -1
  7. package/lib/commonjs/animation/functions/interpolatePaths.js +45 -11
  8. package/lib/commonjs/animation/functions/interpolatePaths.js.map +1 -1
  9. package/lib/commonjs/mock/index.js +121 -177
  10. package/lib/commonjs/mock/index.js.map +1 -1
  11. package/lib/commonjs/skia/types/Font/Font.js.map +1 -1
  12. package/lib/commonjs/skia/web/JsiSkFont.js +6 -0
  13. package/lib/commonjs/skia/web/JsiSkFont.js.map +1 -1
  14. package/lib/commonjs/values/api.js +1 -7
  15. package/lib/commonjs/values/api.js.map +1 -1
  16. package/lib/commonjs/values/hooks/useComputedValue.js +2 -2
  17. package/lib/commonjs/values/hooks/useComputedValue.js.map +1 -1
  18. package/lib/commonjs/views/SkiaView.web.js +11 -11
  19. package/lib/commonjs/views/SkiaView.web.js.map +1 -1
  20. package/lib/module/animation/functions/interpolate.js +2 -2
  21. package/lib/module/animation/functions/interpolate.js.map +1 -1
  22. package/lib/module/animation/functions/interpolateColors.js +1 -1
  23. package/lib/module/animation/functions/interpolateColors.js.map +1 -1
  24. package/lib/module/animation/functions/interpolatePaths.js +44 -11
  25. package/lib/module/animation/functions/interpolatePaths.js.map +1 -1
  26. package/lib/module/mock/index.js +103 -147
  27. package/lib/module/mock/index.js.map +1 -1
  28. package/lib/module/skia/types/Font/Font.js.map +1 -1
  29. package/lib/module/skia/web/JsiSkFont.js +6 -0
  30. package/lib/module/skia/web/JsiSkFont.js.map +1 -1
  31. package/lib/module/values/api.js +0 -4
  32. package/lib/module/values/api.js.map +1 -1
  33. package/lib/module/values/hooks/useComputedValue.js +1 -1
  34. package/lib/module/values/hooks/useComputedValue.js.map +1 -1
  35. package/lib/module/views/SkiaView.web.js +11 -11
  36. package/lib/module/views/SkiaView.web.js.map +1 -1
  37. package/lib/typescript/jestSetup.d.ts +1 -0
  38. package/lib/typescript/src/animation/functions/interpolate.d.ts +6 -0
  39. package/lib/typescript/src/animation/functions/interpolatePaths.d.ts +3 -1
  40. package/lib/typescript/src/mock/index.d.ts +11 -42
  41. package/lib/typescript/src/renderer/Canvas.d.ts +1 -1
  42. package/lib/typescript/src/skia/types/Font/Font.d.ts +6 -0
  43. package/lib/typescript/src/skia/web/JsiSkFont.d.ts +1 -0
  44. package/lib/typescript/src/values/api.d.ts +0 -1
  45. package/package.json +3 -3
  46. package/src/animation/functions/interpolate.ts +4 -2
  47. package/src/animation/functions/interpolateColors.ts +1 -1
  48. package/src/animation/functions/interpolatePaths.ts +59 -10
  49. package/src/mock/index.ts +103 -149
  50. package/src/skia/types/Font/Font.ts +7 -0
  51. package/src/skia/web/JsiSkFont.ts +6 -0
  52. package/src/values/api.ts +0 -2
  53. package/src/values/hooks/useComputedValue.ts +1 -1
  54. package/src/views/SkiaView.web.tsx +20 -17
@@ -1,47 +1,16 @@
1
- /**
2
- * Mock implementation for test runners.
3
- *
4
- * Example:
5
- *
6
- * ```js
7
- * jest.mock('@shopify/react-native-skia', () => require('@shopify/react-native-skia/lib/commonjs/mock'));
8
- * ```
9
- */
10
- import type { Skia as SkiaApi, SkRect } from "../skia/types";
1
+ import type { Skia as SkiaApi } from "../skia/types";
2
+ import type * as SkiaExports from "../skia";
3
+ import type * as ExternalExports from "../external";
4
+ import type * as ValueExports from "../values";
5
+ import type * as AnimationExports from "../animation";
6
+ import { ShaderLib } from "../renderer/components/shaders/ShaderLib";
11
7
  export declare const Skia: SkiaApi;
12
- export declare const vec: (x: number, y: number) => {
8
+ export declare const vec: (x?: number | undefined, y?: number | undefined) => {
13
9
  x: number;
14
10
  y: number;
15
11
  };
16
- export declare const rect: (x: number, y: number, width: number, height: number) => {
17
- x: number;
18
- y: number;
19
- width: number;
20
- height: number;
21
- };
22
- export declare const rrect: (r: SkRect, rx: number, ry: number) => {
23
- rect: SkRect;
24
- rx: number;
25
- ry: number;
12
+ export declare const Mock: typeof SkiaExports & typeof ExternalExports & typeof ValueExports & typeof AnimationExports & {
13
+ createDrawing: () => any;
14
+ createDeclaration: () => any;
15
+ ShaderLib: typeof ShaderLib;
26
16
  };
27
- export declare const useTouchHandler: () => any;
28
- export declare const useComputedValue: () => any;
29
- export declare const useValue: () => any;
30
- export declare const useClockValue: () => any;
31
- export declare const useValueEffect: () => any;
32
- export declare const useTiming: () => any;
33
- export declare const runTiming: () => any;
34
- export declare const timing: () => any;
35
- export declare const useSpring: () => any;
36
- export declare const runSpring: () => any;
37
- export declare const spring: () => any;
38
- export declare const runDecay: () => any;
39
- export declare const decay: () => any;
40
- export declare const useSharedValueEffect: () => any;
41
- export declare const useData: () => any;
42
- export declare const useDataCollection: () => any;
43
- export declare const useFont: () => any;
44
- export declare const useImage: () => any;
45
- export declare const usePicture: () => any;
46
- export declare const useSVG: () => any;
47
- export declare const useTypeface: () => any;
@@ -13,4 +13,4 @@ export interface CanvasProps extends ComponentProps<typeof SkiaView> {
13
13
  onTouch?: TouchHandler;
14
14
  fontMgr?: SkFontMgr;
15
15
  }
16
- export declare const Canvas: React.ForwardRefExoticComponent<Pick<CanvasProps, "mode" | "debug" | "onDraw" | "children" | "hitSlop" | "onLayout" | "pointerEvents" | "removeClippedSubviews" | "style" | "testID" | "nativeID" | "collapsable" | "needsOffscreenAlphaCompositing" | "renderToHardwareTextureAndroid" | "focusable" | "shouldRasterizeIOS" | "isTVSelectable" | "hasTVPreferredFocus" | "tvParallaxProperties" | "tvParallaxShiftDistanceX" | "tvParallaxShiftDistanceY" | "tvParallaxTiltAngle" | "tvParallaxMagnification" | "onStartShouldSetResponder" | "onMoveShouldSetResponder" | "onResponderEnd" | "onResponderGrant" | "onResponderReject" | "onResponderMove" | "onResponderRelease" | "onResponderStart" | "onResponderTerminationRequest" | "onResponderTerminate" | "onStartShouldSetResponderCapture" | "onMoveShouldSetResponderCapture" | "onTouchStart" | "onTouchMove" | "onTouchEnd" | "onTouchCancel" | "onTouchEndCapture" | "accessible" | "accessibilityActions" | "accessibilityLabel" | "accessibilityRole" | "accessibilityState" | "accessibilityHint" | "accessibilityValue" | "onAccessibilityAction" | "accessibilityLiveRegion" | "importantForAccessibility" | "accessibilityElementsHidden" | "accessibilityViewIsModal" | "onAccessibilityEscape" | "onAccessibilityTap" | "onMagicTap" | "accessibilityIgnoresInvertColors" | "fontMgr" | "onTouch"> & React.RefAttributes<SkiaView>>;
16
+ export declare const Canvas: React.ForwardRefExoticComponent<Pick<CanvasProps, "children" | "mode" | "debug" | "onDraw" | "hitSlop" | "onLayout" | "pointerEvents" | "removeClippedSubviews" | "style" | "testID" | "nativeID" | "collapsable" | "needsOffscreenAlphaCompositing" | "renderToHardwareTextureAndroid" | "focusable" | "shouldRasterizeIOS" | "isTVSelectable" | "hasTVPreferredFocus" | "tvParallaxProperties" | "tvParallaxShiftDistanceX" | "tvParallaxShiftDistanceY" | "tvParallaxTiltAngle" | "tvParallaxMagnification" | "onStartShouldSetResponder" | "onMoveShouldSetResponder" | "onResponderEnd" | "onResponderGrant" | "onResponderReject" | "onResponderMove" | "onResponderRelease" | "onResponderStart" | "onResponderTerminationRequest" | "onResponderTerminate" | "onStartShouldSetResponderCapture" | "onMoveShouldSetResponderCapture" | "onTouchStart" | "onTouchMove" | "onTouchEnd" | "onTouchCancel" | "onTouchEndCapture" | "accessible" | "accessibilityActions" | "accessibilityLabel" | "accessibilityRole" | "accessibilityState" | "accessibilityHint" | "accessibilityValue" | "onAccessibilityAction" | "accessibilityLiveRegion" | "importantForAccessibility" | "accessibilityElementsHidden" | "accessibilityViewIsModal" | "onAccessibilityEscape" | "onAccessibilityTap" | "onMagicTap" | "accessibilityIgnoresInvertColors" | "fontMgr" | "onTouch"> & React.RefAttributes<SkiaView>>;
@@ -10,6 +10,12 @@ export interface FontMetrics {
10
10
  bounds?: SkRect;
11
11
  }
12
12
  export interface SkFont extends SkJSIInstance<"Font"> {
13
+ /**
14
+ * Retrieves the total width of the provided text
15
+ * @param text
16
+ * @param paint
17
+ */
18
+ getTextWidth(text: string, paint?: SkPaint): number;
13
19
  /**
14
20
  * Retrieves the advanceX measurements for each glyph.
15
21
  * If paint is not null, its stroking, PathEffect, and MaskFilter fields are respected.
@@ -6,6 +6,7 @@ import { JsiSkTypeface } from "./JsiSkTypeface";
6
6
  export declare class JsiSkFont extends HostObject<Font, "Font"> implements SkFont {
7
7
  constructor(CanvasKit: CanvasKit, ref: Font);
8
8
  measureText(_text: string, _paint?: SkPaint): SkRect;
9
+ getTextWidth(text: string, paint?: SkPaint | undefined): number;
9
10
  getMetrics(): {
10
11
  ascent: number;
11
12
  descent: number;
@@ -3,4 +3,3 @@ declare global {
3
3
  var SkiaValueApi: ISkiaValueApi;
4
4
  }
5
5
  export declare const ValueApi: ISkiaValueApi;
6
- export declare const createValue: <T>(initialValue: T) => import("./types").SkiaMutableValue<T>, createComputedValue: <R>(cb: () => R, values: import("./types").SkiaValue<unknown>[]) => import("./types").SkiaValue<R>;
package/package.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "access": "public"
5
5
  },
6
6
  "title": "React Native Skia",
7
- "version": "0.1.134",
7
+ "version": "0.1.136",
8
8
  "description": "High-performance React Native Graphics using Skia",
9
9
  "main": "lib/module/index.js",
10
10
  "files": [
@@ -21,6 +21,7 @@
21
21
  "android/src/**",
22
22
  "libs/android/**",
23
23
  "index.js",
24
+ "jestSetup.js",
24
25
  "cpp/**/*.{h,cpp}",
25
26
  "ios",
26
27
  "libs/ios/libskia.xcframework",
@@ -72,7 +73,6 @@
72
73
  "eslint-config-react-native-wcandillon": "^3.7.2",
73
74
  "eslint-plugin-reanimated": "^1.2.6",
74
75
  "jest": "^27.4.3",
75
- "patch-package": "^6.4.7",
76
76
  "react": "17.0.2",
77
77
  "react-native": "0.66.2",
78
78
  "react-native-builder-bob": "^0.18.2",
@@ -80,7 +80,7 @@
80
80
  "typescript": "^4.6.4"
81
81
  },
82
82
  "dependencies": {
83
- "canvaskit-wasm": "^0.34.0",
83
+ "canvaskit-wasm": "^0.35.0",
84
84
  "react-reconciler": "^0.26.2"
85
85
  },
86
86
  "eslintIgnore": [
@@ -60,7 +60,9 @@ function isExtrapolate(value: string): value is Extrapolate {
60
60
 
61
61
  // validates extrapolations type
62
62
  // if type is correct, converts it to ExtrapolationConfig
63
- function validateType(type: ExtrapolationType): RequiredExtrapolationConfig {
63
+ export function validateInterpolationOptions(
64
+ type: ExtrapolationType
65
+ ): RequiredExtrapolationConfig {
64
66
  // initialize extrapolationConfig with default extrapolation
65
67
  const extrapolationConfig: RequiredExtrapolationConfig = {
66
68
  extrapolateLeft: Extrapolate.EXTEND,
@@ -151,7 +153,7 @@ export function interpolate(
151
153
  );
152
154
  }
153
155
 
154
- const extrapolationConfig = validateType(type);
156
+ const extrapolationConfig = validateInterpolationOptions(type);
155
157
  const { length } = input;
156
158
  const narrowedInput: InterpolationNarrowedInput = {
157
159
  leftEdgeInput: input[0],
@@ -1,4 +1,4 @@
1
- import { mix } from "../../renderer";
1
+ import { mix } from "../../renderer/processors/math";
2
2
  import type { Color, SkColor } from "../../skia";
3
3
  import { Skia } from "../../skia";
4
4
 
@@ -1,10 +1,26 @@
1
1
  import type { SkPath } from "../../skia/types";
2
+ import { exhaustiveCheck } from "../../renderer/typeddash";
3
+
4
+ import type { ExtrapolationType } from "./interpolate";
5
+ import { validateInterpolationOptions, Extrapolate } from "./interpolate";
6
+
7
+ const lerp = (
8
+ value: number,
9
+ from: number,
10
+ to: number,
11
+ p1: SkPath,
12
+ p2: SkPath
13
+ ) => {
14
+ const t = (value - from) / (to - from);
15
+ return p2.interpolate(p1, t)!;
16
+ };
2
17
 
3
18
  /**
4
19
  * Maps an input value within a range to an output path within a path range.
5
20
  * @param value - The input value.
6
21
  * @param inputRange - The range of the input value.
7
22
  * @param outputRange - The range of the output path.
23
+ * @param options - Extrapolation options
8
24
  * @returns The output path.
9
25
  * @example <caption>Map a value between 0 and 1 to a path between two paths.</caption>
10
26
  * const path1 = new Path();
@@ -18,21 +34,54 @@ import type { SkPath } from "../../skia/types";
18
34
  export const interpolatePaths = (
19
35
  value: number,
20
36
  input: number[],
21
- outputRange: SkPath[]
37
+ outputRange: SkPath[],
38
+ options?: ExtrapolationType
22
39
  ) => {
40
+ const extrapolation = validateInterpolationOptions(options);
41
+ if (value < input[0]) {
42
+ switch (extrapolation.extrapolateLeft) {
43
+ case Extrapolate.CLAMP:
44
+ return outputRange[0];
45
+ case Extrapolate.EXTEND:
46
+ return lerp(value, input[0], input[1], outputRange[0], outputRange[1]);
47
+ case Extrapolate.IDENTITY:
48
+ throw new Error(
49
+ "Identity is not a supported extrapolation type for interpolatePaths()"
50
+ );
51
+ default:
52
+ exhaustiveCheck(extrapolation.extrapolateLeft);
53
+ }
54
+ } else if (value > input[input.length - 1]) {
55
+ switch (extrapolation.extrapolateRight) {
56
+ case Extrapolate.CLAMP:
57
+ return outputRange[outputRange.length - 1];
58
+ case Extrapolate.EXTEND:
59
+ return lerp(
60
+ value,
61
+ input[input.length - 2],
62
+ input[input.length - 1],
63
+ outputRange[input.length - 2],
64
+ outputRange[input.length - 1]
65
+ );
66
+ case Extrapolate.IDENTITY:
67
+ throw new Error(
68
+ "Identity is not a supported extrapolation type for interpolatePaths()"
69
+ );
70
+ default:
71
+ exhaustiveCheck(extrapolation.extrapolateRight);
72
+ }
73
+ }
23
74
  let i = 0;
24
75
  for (; i <= input.length - 1; i++) {
25
76
  if (value >= input[i] && value <= input[i + 1]) {
26
77
  break;
27
78
  }
28
- if (i === input.length - 1) {
29
- if (value < input[0]) {
30
- return outputRange[0];
31
- } else {
32
- return outputRange[i];
33
- }
34
- }
35
79
  }
36
- const t = (value - input[i]) / (input[i + 1] - input[i]);
37
- return outputRange[i + 1].interpolate(outputRange[i], t)!;
80
+ return lerp(
81
+ value,
82
+ input[i],
83
+ input[i + 1],
84
+ outputRange[i],
85
+ outputRange[i + 1]
86
+ );
38
87
  };
package/src/mock/index.ts CHANGED
@@ -1,156 +1,110 @@
1
- /**
2
- * Mock implementation for test runners.
3
- *
4
- * Example:
5
- *
6
- * ```js
7
- * jest.mock('@shopify/react-native-skia', () => require('@shopify/react-native-skia/lib/commonjs/mock'));
8
- * ```
9
- */
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
10
2
 
11
- import type { Skia as SkiaApi, SkRect } from "../skia/types";
3
+ import type { Color, Skia as SkiaApi, SkRect, Vector } from "../skia/types";
4
+ import * as Values from "../values/web";
5
+ import * as ValuesHooks from "../values/hooks";
6
+ import * as BaseSkia from "../skia/types";
7
+ import type * as SkiaExports from "../skia";
8
+ import type * as ExternalExports from "../external";
9
+ import type * as ValueExports from "../values";
10
+ import type * as AnimationExports from "../animation";
11
+ import { useSharedValueEffect } from "../external/reanimated/useSharedValueEffect";
12
+ import * as timingFunctions from "../animation/timing";
13
+ import * as springFunctions from "../animation/spring";
14
+ import * as decayFunctions from "../animation/decay";
15
+ import * as interpolateFn from "../animation/functions/interpolate";
16
+ import * as interpolatePathFn from "../animation/functions/interpolatePaths";
17
+ import * as interpolateVectorFn from "../animation/functions/interpolateVector";
18
+ import { ShaderLib } from "../renderer/components/shaders/ShaderLib";
12
19
 
13
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
14
- const MockJSIInstance: any = {};
15
- const Noop = () => MockJSIInstance;
20
+ class Stub {
21
+ constructor() {
22
+ return new Proxy(() => {}, {
23
+ get: () => new Stub(),
24
+ apply: () => new Stub(),
25
+ set: () => true,
26
+ });
27
+ }
28
+ }
16
29
 
17
- export const Skia: SkiaApi = {
18
- Point: Noop,
19
- XYWHRect: Noop,
20
- RuntimeShaderBuilder: Noop,
21
- RRectXY: Noop,
22
- RSXform: Noop,
23
- Color: Noop,
24
- ContourMeasureIter: Noop,
25
- Paint: Noop,
26
- PictureRecorder: Noop,
27
- Picture: {
28
- MakePicture: Noop,
29
- },
30
- Path: {
31
- Make: Noop,
32
- MakeFromSVGString: Noop,
33
- MakeFromOp: Noop,
34
- MakeFromCmds: Noop,
35
- MakeFromText: Noop,
36
- },
37
- Matrix: Noop,
38
- ColorFilter: {
39
- MakeMatrix: Noop,
40
- MakeBlend: Noop,
41
- MakeCompose: Noop,
42
- MakeLerp: Noop,
43
- MakeLinearToSRGBGamma: Noop,
44
- MakeSRGBToLinearGamma: Noop,
45
- MakeLumaColorFilter: Noop,
46
- },
47
- Font: Noop,
48
- Typeface: {
49
- MakeFreeTypeFaceFromData: Noop,
50
- },
51
- MaskFilter: {
52
- MakeBlur: Noop,
53
- },
54
- RuntimeEffect: {
55
- Make: Noop,
56
- },
57
- ImageFilter: {
58
- MakeOffset: Noop,
59
- MakeDisplacementMap: Noop,
60
- MakeShader: Noop,
61
- MakeBlur: Noop,
62
- MakeColorFilter: Noop,
63
- MakeCompose: Noop,
64
- MakeDropShadow: Noop,
65
- MakeDropShadowOnly: Noop,
66
- MakeErode: Noop,
67
- MakeDilate: Noop,
68
- MakeBlend: Noop,
69
- MakeRuntimeShader: Noop,
70
- },
71
- Shader: {
72
- MakeLinearGradient: Noop,
73
- MakeRadialGradient: Noop,
74
- MakeTwoPointConicalGradient: Noop,
75
- MakeSweepGradient: Noop,
76
- MakeTurbulence: Noop,
77
- MakeFractalNoise: Noop,
78
- MakeBlend: Noop,
79
- MakeColor: Noop,
80
- },
81
- PathEffect: {
82
- MakeCorner: Noop,
83
- MakeDash: Noop,
84
- MakeDiscrete: Noop,
85
- MakeCompose: Noop,
86
- MakeSum: Noop,
87
- MakeLine2D: Noop,
88
- MakePath1D: Noop,
89
- MakePath2D: Noop,
90
- },
91
- MakeVertices: Noop,
92
- Data: {
93
- fromURI: Noop,
94
- fromBytes: Noop,
95
- fromBase64: Noop,
96
- },
97
- Image: {
98
- MakeImageFromEncoded: Noop,
99
- MakeImage: Noop,
100
- },
101
- SVG: {
102
- MakeFromData: Noop,
103
- MakeFromString: Noop,
104
- },
105
- FontMgr: {
106
- RefDefault: Noop,
107
- },
108
- TextBlob: {
109
- MakeFromText: Noop,
110
- MakeFromGlyphs: Noop,
111
- MakeFromRSXform: Noop,
112
- MakeFromRSXformGlyphs: Noop,
113
- },
114
- Surface: {
115
- Make: Noop,
116
- },
117
- };
118
-
119
- export const vec = (x: number, y: number) => ({ x, y });
30
+ const Noop: () => any = () => {};
120
31
 
121
- export const rect = (x: number, y: number, width: number, height: number) => ({
122
- x,
123
- y,
124
- width,
125
- height,
126
- });
32
+ export const Skia: SkiaApi = new Stub() as any;
127
33
 
128
- export const rrect = (r: SkRect, rx: number, ry: number) => ({
129
- rect: r,
130
- rx,
131
- ry,
132
- });
34
+ export const vec = (x?: number, y?: number) => ({ x: x ?? 0, y: y ?? x ?? 0 });
133
35
 
134
- export const useTouchHandler = Noop;
135
- export const useComputedValue = Noop;
136
- export const useValue = Noop;
137
- export const useClockValue = Noop;
138
- export const useValueEffect = Noop;
139
- export const useTiming = Noop;
140
- export const runTiming = Noop;
141
- export const timing = Noop;
142
- export const useSpring = Noop;
143
- export const runSpring = Noop;
144
- export const spring = Noop;
145
- export const runDecay = Noop;
146
- export const decay = Noop;
36
+ export const Mock: typeof SkiaExports &
37
+ typeof ExternalExports &
38
+ typeof ValueExports &
39
+ typeof AnimationExports & {
40
+ createDrawing: () => any;
41
+ createDeclaration: () => any;
42
+ ShaderLib: typeof ShaderLib;
43
+ } = {
44
+ // SkiaExports
45
+ // 1. Skia API. BaseSkia contains the enums, and functions like isPaint etc
46
+ Skia,
47
+ ...BaseSkia,
48
+ // 2. Hooks
49
+ useDataCollection: Noop,
50
+ useRawData: Noop,
51
+ useData: Noop,
52
+ useFont: Noop,
53
+ useTypeface: Noop,
54
+ useImage: Noop,
55
+ usePath: Noop,
56
+ useSVG: Noop,
57
+ useTextPath: Noop,
58
+ usePaint: Noop,
59
+ usePicture: Noop,
60
+ useSvgPath: Noop,
61
+ // 3. Point/Rect/Transform utilities
62
+ vec,
63
+ rect: (x: number, y: number, width: number, height: number) => ({
64
+ x,
65
+ y,
66
+ width,
67
+ height,
68
+ }),
69
+ rrect: (r: SkRect, rx: number, ry: number) => ({
70
+ rect: r,
71
+ rx,
72
+ ry,
73
+ }),
74
+ point: vec,
75
+ add: (a: Vector, b: Vector) => vec(a.x + b.x, a.y + b.y),
76
+ sub: (a: Vector, b: Vector) => vec(a.x - b.x, a.y - b.y),
77
+ neg: (a: Vector) => vec(-a.x, -a.y),
78
+ dist: (a: Vector, b: Vector) => Math.hypot(a.x - b.x, a.y - b.y),
79
+ translate: ({ x, y }: Vector) =>
80
+ [{ translateX: x }, { translateY: y }] as const,
147
81
 
148
- export const useSharedValueEffect = Noop;
149
-
150
- export const useData = Noop;
151
- export const useDataCollection = Noop;
152
- export const useFont = Noop;
153
- export const useImage = Noop;
154
- export const usePicture = Noop;
155
- export const useSVG = Noop;
156
- export const useTypeface = Noop;
82
+ bounds: Noop,
83
+ topLeft: Noop,
84
+ topRight: Noop,
85
+ bottomLeft: Noop,
86
+ bottomRight: Noop,
87
+ center: Noop,
88
+ processTransform2d: Noop,
89
+ // ExternalExports
90
+ useSharedValueEffect,
91
+ // ValueExports
92
+ ...Values,
93
+ ...ValuesHooks,
94
+ // Animations
95
+ ...timingFunctions,
96
+ ...springFunctions,
97
+ ...decayFunctions,
98
+ ...interpolateFn,
99
+ ...interpolatePathFn,
100
+ ...interpolateVectorFn,
101
+ interpolateColors: (
102
+ _value: number,
103
+ _inputRange: number[],
104
+ _outputRange: Color[]
105
+ ) => Float32Array.of(0, 0, 0, 0),
106
+ mixColors: (_v: number, _x: Color, _y: Color) => Float32Array.of(0, 0, 0, 0),
107
+ ShaderLib,
108
+ createDrawing: Noop,
109
+ createDeclaration: Noop,
110
+ };
@@ -12,6 +12,13 @@ export interface FontMetrics {
12
12
  }
13
13
 
14
14
  export interface SkFont extends SkJSIInstance<"Font"> {
15
+ /**
16
+ * Retrieves the total width of the provided text
17
+ * @param text
18
+ * @param paint
19
+ */
20
+ getTextWidth(text: string, paint?: SkPaint): number;
21
+
15
22
  /**
16
23
  * Retrieves the advanceX measurements for each glyph.
17
24
  * If paint is not null, its stroking, PathEffect, and MaskFilter fields are respected.
@@ -27,6 +27,12 @@ Clients should use "Font.getGlyphWidths" instead (the latter does no shaping)`
27
27
  return new JsiSkRect(this.CanvasKit, this.CanvasKit.XYWHRect(0, 0, 0, 0));
28
28
  }
29
29
 
30
+ getTextWidth(text: string, paint?: SkPaint | undefined) {
31
+ const ids = this.getGlyphIDs(text);
32
+ const widths = this.getGlyphWidths(ids, paint);
33
+ return widths.reduce((a, b) => a + b, 0);
34
+ }
35
+
30
36
  getMetrics() {
31
37
  const result = this.ref.getMetrics();
32
38
  return {
package/src/values/api.ts CHANGED
@@ -6,5 +6,3 @@ declare global {
6
6
 
7
7
  const { SkiaValueApi } = global;
8
8
  export const ValueApi = SkiaValueApi;
9
-
10
- export const { createValue, createComputedValue } = ValueApi;
@@ -1,7 +1,7 @@
1
1
  import { useMemo } from "react";
2
2
 
3
3
  import { ValueApi } from "../api";
4
- import { isValue } from "../../renderer/processors";
4
+ import { isValue } from "../../renderer/processors/Animations";
5
5
 
6
6
  /**
7
7
  * Creates a new computed value - a value that will calculate its value depending
@@ -36,24 +36,27 @@ export class SkiaView extends React.Component<
36
36
  }
37
37
 
38
38
  private onLayout(evt: LayoutChangeEvent) {
39
- this.setState({
40
- width: evt.nativeEvent.layout.width,
41
- height: evt.nativeEvent.layout.height,
42
- });
43
- // Reset canvas / surface on layout change
44
- if (this._canvasRef.current) {
45
- // Create surface
46
- this._surface = new JsiSkSurface(
47
- global.CanvasKit,
48
- global.CanvasKit.MakeCanvasSurface(this._canvasRef.current)!
49
- );
50
- // Get canvas and repaint
51
- if (this._surface) {
52
- this._canvas = this._surface.getCanvas();
53
- this.requestRedraw();
54
- this.redraw();
39
+ this.setState(
40
+ {
41
+ width: evt.nativeEvent.layout.width,
42
+ height: evt.nativeEvent.layout.height,
43
+ },
44
+ () => {
45
+ // Reset canvas / surface on layout change
46
+ if (this._canvasRef.current) {
47
+ // Create surface
48
+ this._surface = new JsiSkSurface(
49
+ global.CanvasKit,
50
+ global.CanvasKit.MakeWebGLCanvasSurface(this._canvasRef.current)!
51
+ );
52
+ // Get canvas and repaint
53
+ if (this._surface) {
54
+ this._canvas = this._surface.getCanvas();
55
+ this.requestRedraw();
56
+ }
57
+ }
55
58
  }
56
- }
59
+ );
57
60
  }
58
61
 
59
62
  componentDidMount() {