From 59c40b451e4e3485f3274a797c1225e1f5663b23 Mon Sep 17 00:00:00 2001 From: lifegpc Date: Fri, 30 Jan 2026 00:16:16 +0800 Subject: [PATCH] Fix dpng may contains zero size image Use better message for scn --- src/scripts/kirikiri/scn.rs | 3 ++- src/scripts/qlie/image/dpng.rs | 18 ++++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/scripts/kirikiri/scn.rs b/src/scripts/kirikiri/scn.rs index cc6ba69..2e7409f 100644 --- a/src/scripts/kirikiri/scn.rs +++ b/src/scripts/kirikiri/scn.rs @@ -601,7 +601,8 @@ impl Script for ScnScript { text[1][self.language_index][0].set_string(name); } else { return Err(anyhow::anyhow!( - "Name is missing for message. (text {j} at scene {i})" + "Name is missing for message. (text {j} at scene {i}, message: {})", + m.message )); } } diff --git a/src/scripts/qlie/image/dpng.rs b/src/scripts/qlie/image/dpng.rs index 4b90246..bb521fc 100644 --- a/src/scripts/qlie/image/dpng.rs +++ b/src/scripts/qlie/image/dpng.rs @@ -120,16 +120,26 @@ impl Script for DpngImage { } fn export_image(&self) -> Result { - let mut base = load_png(MemReaderRef::new(&self.img.tiles[0].png_data))?; + let (idx, tile) = self + .img + .tiles + .iter() + .enumerate() + .find(|(_, t)| t.size != 0) + .ok_or_else(|| anyhow::anyhow!("DPNG image has no valid tiles with PNG data"))?; + let mut base = load_png(MemReaderRef::new(&tile.png_data))?; convert_to_rgba(&mut base)?; let mut base = draw_on_canvas( base, self.img.header.image_width, self.img.header.image_height, - self.img.tiles[0].x, - self.img.tiles[0].y, + tile.x, + tile.y, )?; - for tile in &self.img.tiles[1..] { + for tile in &self.img.tiles[idx + 1..] { + if tile.size == 0 { + continue; + } let mut diff = load_png(MemReaderRef::new(&tile.png_data))?; convert_to_rgba(&mut diff)?; draw_on_image(&mut base, &diff, tile.x, tile.y)?;