diff options
author | Rosyid Haryadi <rosyid_haryadi@protonmail.com> | 2025-02-26 09:59:01 +0700 |
---|---|---|
committer | Rosyid Haryadi <rosyid_haryadi@protonmail.com> | 2025-02-26 09:59:01 +0700 |
commit | 8249bdbd13571afcd47015a41458a55acd3bc27f (patch) | |
tree | 48cc997c30e6b5c1b4f0660d51dc0359914af69c | |
parent | 50acfdefe298b55db30f06f9ecd91428af192daf (diff) |
refactor: switchable renderer
-rw-r--r-- | src/main.rs | 59 |
1 files changed, 48 insertions, 11 deletions
diff --git a/src/main.rs b/src/main.rs index 06f041c..31d11ae 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,15 +4,56 @@ use std::io::Write; const IMG_WIDTH: usize = 256; const IMG_HEIGHT: usize = 256; +#[derive(Debug, Copy, Clone)] struct Pixel { r: u8, g: u8, b: u8, } -fn main() { +impl Default for Pixel { + fn default() -> Self { + Pixel { r:0, g:0, b:0 } + } +} + +struct View<'a> { + data: &'a[[Pixel; IMG_WIDTH]; IMG_HEIGHT], + renderer: fn(&[[Pixel; IMG_WIDTH]; IMG_HEIGHT]) -> Result<String, std::io::Error>, +} + +impl<'a> View<'a> { + fn render(&self) { + let result = (self.renderer)(self.data); + match result { + Ok(success_msg) => { + println!("{}", success_msg); + }, + Err(error_msg) => { + eprintln!("{}", error_msg); + } + } + } +} + +fn ppm_renderer(data: &[[Pixel; IMG_WIDTH]; IMG_HEIGHT]) -> Result<String, std::io::Error> { + let file_name = "output.ppm"; + let mut file = File::create(file_name)?; + // header let mut txt_data = String::from("P3\n"); txt_data.push_str(format!("{} {}\n255\n", IMG_WIDTH, IMG_HEIGHT).as_str()); + // data point + data.iter().for_each(|row| { + row.iter().for_each(|&pixel| { + txt_data.push_str(&format!("{} {} {}\n", pixel.r, pixel.g, pixel.b)); + }) + }); + file.write_all(txt_data.as_bytes())?; + Ok(format!("Output rendered to file {}", file_name)) +} + +fn main() { + let mut data = [[Pixel::default(); IMG_WIDTH]; IMG_HEIGHT]; (0..IMG_HEIGHT).for_each(|j| { (0..IMG_WIDTH).for_each(|i| { @@ -24,17 +65,13 @@ fn main() { let ig = (255.999 * g) as u8; let ib = (255.999 * b) as u8; - txt_data.push_str(&format!("{} {} {}\n", ir, ig, ib)); + data[i][j] = Pixel { r: ir, g: ig, b: ib}; }) }); - match write_file("output.ppm", txt_data.as_str()) { - Ok(_) => {println!("PPM file writen")}, - Err(e) => {println!("Error writing file {}", e)} - } -} - -fn write_file(file_path: &str, txt_data: &str) -> Result<(), std::io::Error> { - let mut file = File::create(file_path)?; - file.write_all(txt_data.as_bytes()) + let view = View { + data: &data, + renderer: ppm_renderer, + }; + view.render(); } |