From ad1d8e26f2312389b8bc774dee38c246b0b2e755 Mon Sep 17 00:00:00 2001 From: Jaby Date: Thu, 22 Sep 2022 20:09:19 +0200 Subject: [PATCH] Introduce PSXImageConverter --- .../src/images/reduced_tim/full16_encoder.rs | 53 +++++++++++++++++++ .../src/images/reduced_tim/mod.rs | 13 +++-- .../src/images/reduced_tim/types.rs | 5 ++ 3 files changed, 68 insertions(+), 3 deletions(-) create mode 100644 src/Tools/jaby_engine_fconv/src/images/reduced_tim/full16_encoder.rs diff --git a/src/Tools/jaby_engine_fconv/src/images/reduced_tim/full16_encoder.rs b/src/Tools/jaby_engine_fconv/src/images/reduced_tim/full16_encoder.rs new file mode 100644 index 00000000..0bc013e1 --- /dev/null +++ b/src/Tools/jaby_engine_fconv/src/images/reduced_tim/full16_encoder.rs @@ -0,0 +1,53 @@ +use super::types::{Header, PSXImageConverter}; +use tool_helper::{Error, Output}; + +pub struct RgbImage { + image: image::RgbImage +} + +impl RgbImage { + pub fn new(image: image::RgbImage) -> RgbImage { + RgbImage{image} + } +} + +impl PSXImageConverter for RgbImage { + fn width(&self) -> u32 { + image::RgbImage::width(&self.image) + } + + fn height(&self) -> u32 { + image::RgbImage::height(&self.image) + } +} + +pub struct RgbaImage { + image: image::RgbaImage +} + +impl RgbaImage { + pub fn new(image: image::RgbaImage) -> RgbaImage { + RgbaImage{image} + } +} + +impl PSXImageConverter for RgbaImage { + fn width(&self) -> u32 { + image::RgbaImage::width(&self.image) + } + + fn height(&self) -> u32 { + image::RgbaImage::height(&self.image) + } +} + +pub fn encode(image: T, _: Output) -> Result<(), Error> { + let width = image.width(); + let height = image.height(); + + if !Header::can_encode(width, height) { + return Err(Error::from_text(format!("Image size {}, {} needs to be even", width, height))); + } + + Ok(()) +} \ No newline at end of file diff --git a/src/Tools/jaby_engine_fconv/src/images/reduced_tim/mod.rs b/src/Tools/jaby_engine_fconv/src/images/reduced_tim/mod.rs index 565e25a8..5b37cf8f 100644 --- a/src/Tools/jaby_engine_fconv/src/images/reduced_tim/mod.rs +++ b/src/Tools/jaby_engine_fconv/src/images/reduced_tim/mod.rs @@ -1,9 +1,11 @@ use clap::{Args, ValueEnum}; -use image::io::Reader as ImageReader; +use image::{DynamicImage, io::Reader as ImageReader}; +use full16_encoder::{RgbaImage, RgbImage}; use std::io::Cursor; use tool_helper::{Error, Input, Output}; mod types; +mod full16_encoder; #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum)] pub enum ColorDepth { @@ -18,11 +20,16 @@ pub struct Arguments { color_depth: ColorDepth } + fn convert_full16(input: Input, output: Output) -> Result<(), Error> { match ImageReader::new(Cursor::new(tool_helper::input_to_vec(input)?)).with_guessed_format()?.decode() { Ok(image) => { - println!("Blubb!!"); - Ok(()) + match image { + DynamicImage::ImageRgb8(image) => full16_encoder::encode(RgbImage::new(image), output), + DynamicImage::ImageRgba8(image) => full16_encoder::encode(RgbaImage::new(image), output), + + _ => Err(Error::from_text("Only RGB and RGBA images are supported for 16bit encoding".to_owned())) + } }, Err(error) => Err(Error::from_error(error)) } diff --git a/src/Tools/jaby_engine_fconv/src/images/reduced_tim/types.rs b/src/Tools/jaby_engine_fconv/src/images/reduced_tim/types.rs index b7b6e726..8ea7c5bd 100644 --- a/src/Tools/jaby_engine_fconv/src/images/reduced_tim/types.rs +++ b/src/Tools/jaby_engine_fconv/src/images/reduced_tim/types.rs @@ -94,4 +94,9 @@ impl Header { pub fn can_encode(width: u32, height: u32) -> bool { width & 1 == 0 && height & 1 == 0 } +} + +pub trait PSXImageConverter { + fn width(&self) -> u32; + fn height(&self) -> u32; } \ No newline at end of file