summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRosyid Haryadi <rosyid_haryadi@protonmail.com>2025-02-26 09:59:01 +0700
committerRosyid Haryadi <rosyid_haryadi@protonmail.com>2025-02-26 09:59:01 +0700
commit8249bdbd13571afcd47015a41458a55acd3bc27f (patch)
tree48cc997c30e6b5c1b4f0660d51dc0359914af69c
parent50acfdefe298b55db30f06f9ecd91428af192daf (diff)
refactor: switchable renderer
-rw-r--r--src/main.rs59
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();
}