From ad2000eeb205f054b7ab14ce2bace386260b4dae Mon Sep 17 00:00:00 2001 From: Abdelrahman Ashraf Date: Fri, 26 Jan 2024 14:50:02 +0700 Subject: [PATCH] =?UTF-8?q?fix:=20=F0=9F=90=9B=20resize=20method=20to=20va?= =?UTF-8?q?lidate=20and=20update=20the=20width,height=20(#57)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- dotlottie-rs/src/lottie_renderer/mod.rs | 12 ++++ web-example.html | 73 ++++++++++++++++--------- 2 files changed, 59 insertions(+), 26 deletions(-) diff --git a/dotlottie-rs/src/lottie_renderer/mod.rs b/dotlottie-rs/src/lottie_renderer/mod.rs index ebd13195..b94d4b52 100644 --- a/dotlottie-rs/src/lottie_renderer/mod.rs +++ b/dotlottie-rs/src/lottie_renderer/mod.rs @@ -14,6 +14,9 @@ pub enum LottieRendererError { #[error("Invalid color: {0}")] InvalidColor(String), + + #[error("Invalid argument: {0}")] + InvalidArgument(String), } pub struct LottieRenderer { @@ -244,6 +247,15 @@ impl LottieRenderer { return Ok(()); } + if width <= 0 || height <= 0 { + return Err(LottieRendererError::InvalidArgument( + "Width and height must be greater than 0".to_string(), + )); + } + + self.width = width; + self.height = height; + let mut buffer = vec![0; (width * height * 4) as usize]; thorvg_canvas .set_target( diff --git a/web-example.html b/web-example.html index 9bc10cf3..fa6e2000 100644 --- a/web-example.html +++ b/web-example.html @@ -10,6 +10,7 @@ + { + resize(); + }); + progressBar.addEventListener("mousedown", () => { cancelAnimationFrame(animationFrameId); }); @@ -163,17 +159,34 @@ const newFrame = (event.target.value / 100) * dotLottiePlayer.totalFrames(); - const updated = dotLottiePlayer.setFrame(newFrame); - if (updated) { - const rendered = dotLottiePlayer.render(); - if (rendered) { - const frameBuffer = dotLottiePlayer.buffer(); - imageData.data.set(frameBuffer); - ctx.putImageData(imageData, 0, 0); - } + if (dotLottiePlayer.setFrame(newFrame)) { + render(); } }); + function resize() { + const { width: clientWidth, height: clientHeight } = + canvas.getBoundingClientRect(); + + const width = clientWidth * (window.devicePixelRatio || 1); + const height = clientHeight * (window.devicePixelRatio || 1); + + canvas.width = width; + canvas.height = height; + + dotLottiePlayer.resize(width, height); + } + + function render() { + const rendered = dotLottiePlayer.render(); + if (rendered) { + const frameBuffer = dotLottiePlayer.buffer(); + const imageData = ctx.createImageData(canvas.width, canvas.height); + imageData.data.set(frameBuffer); + ctx.putImageData(imageData, 0, 0); + } + } + modeSelect.addEventListener("change", (event) => { const mode = Module.Mode.values[event.target.value]; dotLottiePlayer.setConfig({ @@ -210,3 +223,11 @@ + +