From 27e1cc82fb8678e839f13c000f713b30fc9cb1ca Mon Sep 17 00:00:00 2001 From: LongYinan Date: Sat, 22 Feb 2025 15:44:14 +0800 Subject: [PATCH] fix: don't panic if current ts is not able to invert when transform (#1002) --- __test__/regression.spec.ts | 9 +++++++++ src/ctx.rs | 8 +++----- src/sk.rs | 6 ++++++ 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/__test__/regression.spec.ts b/__test__/regression.spec.ts index 6ddab005..d94a022c 100644 --- a/__test__/regression.spec.ts +++ b/__test__/regression.spec.ts @@ -287,3 +287,12 @@ test('draw-canvas-on-canvas', async (t) => { await snapshotImage(t, { ctx: backCtx, canvas: backCanvas }) }) + +// https://github.com/Brooooooklyn/canvas/issues/1000 +test('transform-with-non-inverted-matrix', (t) => { + const canvas = createCanvas(100, 100) + const ctx = canvas.getContext('2d') + t.notThrows(() => { + ctx.transform(0, 0, 0, 0, 1019, 1165) + }) +}) diff --git a/src/ctx.rs b/src/ctx.rs index 97ecfc39..427804a6 100644 --- a/src/ctx.rs +++ b/src/ctx.rs @@ -256,11 +256,9 @@ impl Context { pub fn transform(&mut self, ts: Matrix) -> result::Result<(), SkError> { let current_state = &mut self.state; - self.path.transform_self( - &ts - .invert() - .ok_or_else(|| SkError::InvalidTransform(ts.clone()))?, - ); + if let Some(inverse) = ts.invert() { + self.path.transform_self(&inverse); + } current_state.transform = ts.multiply(¤t_state.transform); self.surface.set_transform(¤t_state.transform); Ok(()) diff --git a/src/sk.rs b/src/sk.rs index ec2882e4..e96cfc99 100644 --- a/src/sk.rs +++ b/src/sk.rs @@ -3106,6 +3106,12 @@ impl Matrix { } } +impl Default for Matrix { + fn default() -> Self { + Self::identity() + } +} + impl Clone for Matrix { fn clone(&self) -> Self { Matrix(unsafe { ffi::skiac_matrix_clone(self.0) })