refactor: move kra to crate

in the interest of reusing that code in a gallery app
This commit is contained in:
electria 2026-08-03 23:30:21 -07:00
commit 603678ba34
Signed by: electria
SSH key fingerprint: SHA256:8LlB3ucPbBHqozqkhsNbaV5oG3SlzzqUj8FZDL6IPQs
4 changed files with 14 additions and 43 deletions

13
Cargo.lock generated
View file

@ -1932,6 +1932,7 @@ dependencies = [
"iced",
"image",
"jxl-oxide",
"kra-image-integration",
"rfd",
"size",
"zip",
@ -2267,6 +2268,16 @@ version = "3.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc"
[[package]]
name = "kra-image-integration"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ab1db0e6caced9f4b26057c10ea190c447a8be4fcac03afd7213e35168ad700"
dependencies = [
"image",
"zip",
]
[[package]]
name = "kurbo"
version = "0.10.4"
@ -3100,7 +3111,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7d8fae84b431384b68627d0f9b3b1245fcf9f46f6c0e3dc902e9dce64edd1967"
dependencies = [
"libc",
"windows-sys 0.52.0",
"windows-sys 0.61.2",
]
[[package]]

View file

@ -6,6 +6,7 @@ license = "AGPL-3.0-or-later"
[dependencies]
dirs = "6.0.0"
kra-image-integration = "0.1.0"
rfd = "0.17.2"
size = "0.5.0"
zip = "8.6.0"

View file

@ -1,40 +0,0 @@
use std::{
ffi::OsString,
io::{self, Read},
};
use image::{
ImageDecoder, ImageError, ImageReader, ImageResult,
error::DecodingError,
hooks::{self, GenericReader},
};
use zip::ZipArchive;
pub fn register() -> bool {
hooks::register_decoding_hook(OsString::from("kra"), Box::new(hook))
}
fn hook<'a>(reader: GenericReader<'a>) -> ImageResult<Box<dyn ImageDecoder + 'a>> {
let mut zip = ZipArchive::new(reader).map_err(to_image_error)?;
let mut reader = zip.by_name("mergedimage.png").map_err(to_image_error)?;
// reading it all and wrapping it with a Cursor
// is the only way I know to give it Seek
// (which is required by ImageReader)
let mut buf = Vec::new();
reader.read_to_end(&mut buf)?;
let image_reader = ImageReader::with_format(io::Cursor::new(buf), image::ImageFormat::Png);
Ok(Box::new(image_reader.into_decoder()?))
}
fn to_image_error(
e: impl Into<Box<dyn std::error::Error + std::marker::Send + Sync + 'static>>,
) -> ImageError {
ImageError::Decoding(DecodingError::new(
image::error::ImageFormatHint::PathExtension("kra".into()),
e,
))
}

View file

@ -15,7 +15,6 @@ use iced::{
use image::{EncodableLayout, RgbaImage, imageops};
use size::Size;
mod kra;
mod utils;
#[derive(Clone, Debug)]
@ -302,7 +301,7 @@ impl State {
fn main() -> Result<(), iced::Error> {
jxl_oxide::integration::register_image_decoding_hook();
kra::register();
kra_image_integration::register();
iced::application(State::new, State::update, State::view)
.subscription(State::subscription)