From b5189695dff2e0556af179e58aaeda64a8eb1037 Mon Sep 17 00:00:00 2001 From: lifegpc Date: Thu, 14 Aug 2025 16:50:03 +0800 Subject: [PATCH] Add TLG encode support --- Cargo.lock | 4 +- Cargo.toml | 2 +- README.md | 2 +- src/scripts/kirikiri/image/tlg.rs | 72 +++++++++++++++++++++++++++++++ 4 files changed, 76 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index ec86304..3058906 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -673,9 +673,9 @@ checksum = "6a82ae493e598baaea5209805c49bbf2ea7de956d50d7da0da1164f9c6d28543" [[package]] name = "libtlg-rs" -version = "0.1.4" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f65cb31779c2b9adeb55fccc033f911f117a459bb75808b907cd535c68c99602" +checksum = "59d57b48167296edc5ea37791e19c63031ae4341b44ddc7c8580a93e2d098164" dependencies = [ "lazy_static", "overf", diff --git a/Cargo.toml b/Cargo.toml index fe4281a..19fdbd4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,7 +21,7 @@ flate2 = { version = "1.1", optional = true } int-enum = { version = "1.2", optional = true } json = { version = "0.12", optional = true } lazy_static = "1.5.0" -libtlg-rs = { version = "0.1", optional = true } +libtlg-rs = { version = "0.2", optional = true, features = ["encode"] } markup5ever = { version = "0.35", optional = true } markup5ever_rcdom = { version = "0.35", optional = true } memchr = { version = "2.7", optional = true } diff --git a/README.md b/README.md index 57dbcdb..b447328 100644 --- a/README.md +++ b/README.md @@ -155,7 +155,7 @@ msg-tool create -t | Image Type | Feature Name | Name | Export | Import | Export Multiple | Import Multiple | Create | Remarks | |---|---|---|---|---|---|---|---|---| -| `kirikiri-tlg`/`kr-tlg` | `kirikiri-img` | Kirikiri TLG Image File (.tlg) | ✔️ | ❌ | ❌ | ❌ | ❌ | | +| `kirikiri-tlg`/`kr-tlg` | `kirikiri-img` | Kirikiri TLG Image File (.tlg) | ✔️ | ✔️ | ❌ | ❌ | ✔️ | tlg6 is not supported when importing/creating image | | `kirikiri-pimg`/`kr-pimg` | `kirikiri-img` | Kirikiri Multiple Image File (.pimg) | ❌ | ❌ | ✔️ | ❌ | ❌ | | | `kirikiri-dref`/`kr-dref` | `kirikiri-img` | Kirikiri DPAK-referenced Image File (.dref) | ✔️ | ❌ | ❌ | ❌ | ❌ | | ### WillPlus / AdvHD diff --git a/src/scripts/kirikiri/image/tlg.rs b/src/scripts/kirikiri/image/tlg.rs index 11dc8d8..73dc478 100644 --- a/src/scripts/kirikiri/image/tlg.rs +++ b/src/scripts/kirikiri/image/tlg.rs @@ -2,6 +2,7 @@ use crate::ext::io::*; use crate::scripts::base::*; use crate::types::*; +use crate::utils::img::*; use anyhow::Result; use libtlg_rs::*; use std::io::{Read, Seek}; @@ -54,6 +55,44 @@ impl ScriptBuilder for TlgImageBuilder { } None } + + fn can_create_image_file(&self) -> bool { + true + } + + fn create_image_file<'a>( + &'a self, + mut data: ImageData, + writer: Box, + _options: &ExtraConfig, + ) -> Result<()> { + if data.depth != 8 { + return Err(anyhow::anyhow!("Unsupported image depth: {}", data.depth)); + } + let color_type = match data.color_type { + ImageColorType::Bgr => TlgColorType::Bgr24, + ImageColorType::Bgra => TlgColorType::Bgra32, + ImageColorType::Grayscale => TlgColorType::Grayscale8, + ImageColorType::Rgb => { + convert_rgb_to_bgr(&mut data)?; + TlgColorType::Bgr24 + } + ImageColorType::Rgba => { + convert_rgba_to_bgra(&mut data)?; + TlgColorType::Bgra32 + } + }; + let tlg = Tlg { + width: data.width, + height: data.height, + color: color_type, + data: data.data, + tags: Default::default(), + version: 5, // Currently only version 5 is supported + }; + save_tlg(&tlg, writer)?; + Ok(()) + } } #[derive(Debug)] @@ -99,4 +138,37 @@ impl Script for TlgImage { data: self.data.data.clone(), }) } + + fn import_image<'a>( + &'a self, + mut data: ImageData, + file: Box, + ) -> Result<()> { + if data.depth != 8 { + return Err(anyhow::anyhow!("Unsupported image depth: {}", data.depth)); + } + let color_type = match data.color_type { + ImageColorType::Bgr => TlgColorType::Bgr24, + ImageColorType::Bgra => TlgColorType::Bgra32, + ImageColorType::Grayscale => TlgColorType::Grayscale8, + ImageColorType::Rgb => { + convert_rgb_to_bgr(&mut data)?; + TlgColorType::Bgr24 + } + ImageColorType::Rgba => { + convert_rgba_to_bgra(&mut data)?; + TlgColorType::Bgra32 + } + }; + let tlg = Tlg { + width: data.width, + height: data.height, + color: color_type, + data: data.data, + tags: self.data.tags.clone(), + version: 5, // Currently only version 5 is supported + }; + save_tlg(&tlg, file)?; + Ok(()) + } }