From d6a8b8b3f0c21eac8a247273cbb5ce61ef13de80 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Tue, 16 Jan 2024 21:33:28 +0100 Subject: [PATCH 1/5] Fix minor regressions --- .../src/external/reanimated/interpolators.ts | 3 ++- package/src/renderer/Canvas.tsx | 7 +++-- .../renderer/__tests__/e2e/Matrix4.spec.tsx | 24 +++++++++++++++++ package/src/skia/web/JsiSkPath.ts | 26 ++++++++++++++++--- .../{SkiaDomView2.tsx => SkiaJSDomView.tsx} | 2 +- package/src/views/SkiaJSDomView.web.tsx | 1 + 6 files changed, 54 insertions(+), 9 deletions(-) rename package/src/views/{SkiaDomView2.tsx => SkiaJSDomView.tsx} (98%) create mode 100644 package/src/views/SkiaJSDomView.web.tsx diff --git a/package/src/external/reanimated/interpolators.ts b/package/src/external/reanimated/interpolators.ts index 2b73be7389..13d6cdb3b2 100644 --- a/package/src/external/reanimated/interpolators.ts +++ b/package/src/external/reanimated/interpolators.ts @@ -15,10 +15,11 @@ import { useSharedValue, useDerivedValue, } from "./moduleWrapper"; +import { Platform } from "../../Platform"; export const notifyChange = (value: SharedValue) => { "worklet"; - if (_WORKLET) { + if (_WORKLET || Platform.OS === "web") { // eslint-disable-next-line @typescript-eslint/no-explicit-any (value as any)._value = value.value; } diff --git a/package/src/renderer/Canvas.tsx b/package/src/renderer/Canvas.tsx index 87fc3ed201..ceb335ed4f 100644 --- a/package/src/renderer/Canvas.tsx +++ b/package/src/renderer/Canvas.tsx @@ -17,8 +17,7 @@ import type { LayoutChangeEvent } from "react-native"; import { SkiaDomView } from "../views"; import { Skia } from "../skia/Skia"; import type { TouchHandler, SkiaBaseViewProps } from "../views"; -import { SkiaDomView2 } from "../views/SkiaDomView2"; -import { Platform } from "../Platform"; +import { SkiaJSDomView } from "../views/SkiaJSDomView"; import { SkiaRoot } from "./Reconciler"; import { NATIVE_DOM } from "./HostComponents"; @@ -91,7 +90,7 @@ export const Canvas = forwardRef( }; }, [root]); - if (NATIVE_DOM || Platform.OS === "web") { + if (NATIVE_DOM) { return ( ( ); } else { return ( - { 0.1 ); }); + + it("Path.transform() should accept 4x4 (1)", async () => { + let result = await surface.eval((Skia) => { + const path = Skia.Path.MakeFromSVGString("M150 0L75 200L225 200L150 0Z")!; + path.transform([1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1]); + return path.toSVGString(); + }); + expect(result).toEqual("M150 0L75 200L225 200L150 0Z"); + + result = await surface.eval((Skia) => { + const path = Skia.Path.MakeFromSVGString("M150 0L75 200L225 200L150 0Z")!; + path.transform([1, 0, 0, 0, 0, 1, 0, 0, 0]); + return path.toSVGString(); + }); + expect(result).not.toEqual("M150 0L75 200L225 200L150 0Z"); + }); + it("Path.transform() should accept 4x4 (2)", async () => { + const result = await surface.eval((Skia) => { + const path = Skia.Path.MakeFromSVGString("M150 0L75 200L225 200L150 0Z")!; + path.transform([1, 0, 0, 100, 0, 1, 0, 100, 0, 0, 1, 0, 0, 0, 0, 1]); + return path.toSVGString(); + }); + expect(result).toEqual("M250 100L175 300L325 300L250 100Z"); + }); it("should correctly transform a point with an identity matrix", () => { const identityMatrix = Matrix4(); const point = [100, -100, 200] as const; // Define some test point diff --git a/package/src/skia/web/JsiSkPath.ts b/package/src/skia/web/JsiSkPath.ts index a8bc6886c3..5fdaf01ecb 100644 --- a/package/src/skia/web/JsiSkPath.ts +++ b/package/src/skia/web/JsiSkPath.ts @@ -1,4 +1,4 @@ -import type { CanvasKit, Path } from "canvaskit-wasm"; +import type { CanvasKit, Matrix3x3, Path } from "canvaskit-wasm"; import { PathVerb } from "../types"; import type { @@ -11,6 +11,7 @@ import type { SkRect, InputRRect, StrokeOpts, + InputMatrix, } from "../types"; import { getEnum, HostObject, optEnum } from "./Host"; @@ -339,8 +340,27 @@ export class JsiSkPath extends HostObject implements SkPath { return result === null ? result : this; } - transform(m3: SkMatrix) { - this.ref.transform(Array.isArray(m3) ? m3 : JsiSkMatrix.fromValue(m3)); + transform(m: InputMatrix) { + let matrix = + m instanceof JsiSkMatrix + ? Array.from(JsiSkMatrix.fromValue(m)) + : (m as Exclude); + if (matrix.length === 16) { + matrix = [ + matrix[0], + matrix[1], + matrix[3], + matrix[4], + matrix[5], + matrix[7], + matrix[12], + matrix[13], + matrix[15], + ]; + } else if (matrix.length !== 9) { + throw new Error(`Invalid matrix length: ${matrix.length}`); + } + this.ref.transform(matrix); return this; } diff --git a/package/src/views/SkiaDomView2.tsx b/package/src/views/SkiaJSDomView.tsx similarity index 98% rename from package/src/views/SkiaDomView2.tsx rename to package/src/views/SkiaJSDomView.tsx index b915ba3fee..be668e140f 100644 --- a/package/src/views/SkiaDomView2.tsx +++ b/package/src/views/SkiaJSDomView.tsx @@ -16,7 +16,7 @@ const NativeSkiaPictureView: HostComponent = : // eslint-disable-next-line @typescript-eslint/no-explicit-any (null as any); -export class SkiaDomView2 extends React.Component< +export class SkiaJSDomView extends React.Component< SkiaDomViewProps & { Skia: Skia } > { constructor(props: SkiaDomViewProps & { Skia: Skia }) { diff --git a/package/src/views/SkiaJSDomView.web.tsx b/package/src/views/SkiaJSDomView.web.tsx new file mode 100644 index 0000000000..57f77fd88b --- /dev/null +++ b/package/src/views/SkiaJSDomView.web.tsx @@ -0,0 +1 @@ +export { SkiaDomView as SkiaJSDomView } from "./SkiaDomView"; From 76ac95b60fef66ce0680f0267afd95cf2ee1344e Mon Sep 17 00:00:00 2001 From: William Candillon Date: Tue, 16 Jan 2024 21:46:46 +0100 Subject: [PATCH 2/5] :green_heart: --- package/src/external/reanimated/interpolators.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/src/external/reanimated/interpolators.ts b/package/src/external/reanimated/interpolators.ts index 13d6cdb3b2..151679073c 100644 --- a/package/src/external/reanimated/interpolators.ts +++ b/package/src/external/reanimated/interpolators.ts @@ -8,6 +8,7 @@ import { useCallback, useMemo } from "react"; import type { SkPath, SkPoint } from "../../skia/types"; import { interpolatePaths, interpolateVector } from "../../animation"; import { Skia } from "../../skia"; +import { Platform } from "../../Platform"; import { useAnimatedReaction, @@ -15,7 +16,6 @@ import { useSharedValue, useDerivedValue, } from "./moduleWrapper"; -import { Platform } from "../../Platform"; export const notifyChange = (value: SharedValue) => { "worklet"; From ccd119cf3d2923a472a3fd56095e66b68ad98130 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Tue, 16 Jan 2024 21:50:35 +0100 Subject: [PATCH 3/5] :green_heart: --- docs/static/img/blurred-paragraph-ios.png | Bin 17732 -> 19316 bytes docs/static/img/opacity-paragraph-ios.png | Bin 11894 -> 11396 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/static/img/blurred-paragraph-ios.png b/docs/static/img/blurred-paragraph-ios.png index 3ccd2e606d0b4ae1b1e6b58ce027401303c23f6e..1c034f337459d75dbf9a86244757967e3e4b1036 100644 GIT binary patch literal 19316 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 literal 17732 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�SHcNuZ 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 MPa9+(zjWij07QA28~^|S literal 11894 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 From b0d3726cba82be5a71ba0e8f658df145e58d8b4e Mon Sep 17 00:00:00 2001 From: William Candillon Date: Tue, 16 Jan 2024 21:52:43 +0100 Subject: [PATCH 4/5] Add a matrix test --- package/src/renderer/__tests__/e2e/Matrix4.spec.tsx | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/package/src/renderer/__tests__/e2e/Matrix4.spec.tsx b/package/src/renderer/__tests__/e2e/Matrix4.spec.tsx index c3c847126f..b78cc3bb54 100644 --- a/package/src/renderer/__tests__/e2e/Matrix4.spec.tsx +++ b/package/src/renderer/__tests__/e2e/Matrix4.spec.tsx @@ -244,7 +244,15 @@ describe("Matrix4", () => { expect(result).not.toEqual("M150 0L75 200L225 200L150 0Z"); }); it("Path.transform() should accept 4x4 (2)", async () => { - const result = await surface.eval((Skia) => { + let result = await surface.eval((Skia) => { + const path = Skia.Path.MakeFromSVGString("M150 0L75 200L225 200L150 0Z")!; + const m = [1, 0, 0, 100, 0, 1, 0, 100, 0, 0, 1, 0, 0, 0, 0, 1]; + path.transform([m[0], m[1], m[3], m[4], m[5], m[7], m[12], m[13], m[15]]); + return path.toSVGString(); + }); + expect(result).toEqual("M250 100L175 300L325 300L250 100Z"); + + result = await surface.eval((Skia) => { const path = Skia.Path.MakeFromSVGString("M150 0L75 200L225 200L150 0Z")!; path.transform([1, 0, 0, 100, 0, 1, 0, 100, 0, 0, 1, 0, 0, 0, 0, 1]); return path.toSVGString(); From 394f3c42409e2ed792e17ca8402f66df08735403 Mon Sep 17 00:00:00 2001 From: William Candillon Date: Tue, 16 Jan 2024 21:53:50 +0100 Subject: [PATCH 5/5] Increase timeout interval to be more stable in CI --- package/src/renderer/__tests__/Data.spec.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package/src/renderer/__tests__/Data.spec.tsx b/package/src/renderer/__tests__/Data.spec.tsx index a1238f4038..bbf5522a8b 100644 --- a/package/src/renderer/__tests__/Data.spec.tsx +++ b/package/src/renderer/__tests__/Data.spec.tsx @@ -45,7 +45,7 @@ const CheckTogglingImage = ({}: EmptyProps) => { if (oslo && zurich) { h.current = setTimeout(() => { setIdx(1); - }, 20); + }, 200); } return () => { clearTimeout(h.current);