summaryrefslogtreecommitdiff
path: root/racer-tracer/src/image_action/png.rs
diff options
context:
space:
mode:
authorSakarias Johansson <sakarias.johansson@goodbyekansas.com>2023-03-14 15:39:45 +0100
committerSakarias Johansson <sakariasjohansson@hotmail.com>2023-03-14 20:32:13 +0100
commit7d32f05f6123dc12ab099cf337f9abe137750e43 (patch)
treee30ad8933ae3e71f2beec104abf1ce3bcd1aa329 /racer-tracer/src/image_action/png.rs
parentf19c8cc40c5caf8abb4f04aaf9f91ec3a8c1ccbc (diff)
downloadracer-tracer-7d32f05f6123dc12ab099cf337f9abe137750e43.tar.gz
racer-tracer-7d32f05f6123dc12ab099cf337f9abe137750e43.tar.xz
racer-tracer-7d32f05f6123dc12ab099cf337f9abe137750e43.zip
🧹 Misc cleanup
- Was pointless to have one event for render and one for cancel. Reduced it to one while fixing a minor bug. - Remove useless dereference and borrow. Not sure how it ended up like that. - Moved around some code.
Diffstat (limited to 'racer-tracer/src/image_action/png.rs')
-rw-r--r--racer-tracer/src/image_action/png.rs64
1 files changed, 64 insertions, 0 deletions
diff --git a/racer-tracer/src/image_action/png.rs b/racer-tracer/src/image_action/png.rs
new file mode 100644
index 0000000..c43e863
--- /dev/null
+++ b/racer-tracer/src/image_action/png.rs
@@ -0,0 +1,64 @@
+use std::{path::PathBuf, sync::RwLock};
+
+use sha2::{Digest, Sha256};
+use synchronoise::SignalEvent;
+
+use crate::{config::Config, error::TracerError};
+
+use super::ImageAction;
+
+pub struct SavePng {}
+
+impl ImageAction for SavePng {
+ fn action(
+ &self,
+ screen_buffer: &RwLock<Vec<u32>>,
+ _event: &SignalEvent,
+ config: &Config,
+ ) -> Result<(), TracerError> {
+ screen_buffer
+ .read()
+ .map_err(|e| TracerError::FailedToAcquireLock(e.to_string()))
+ .map(|buf| {
+ // Convert ARGB8 to RGBA8
+ buf.iter()
+ .map(|v| {
+ let a: u32 = (v >> 24) & 0xff;
+ let r: u32 = (v >> 16) & 0xff;
+ let g: u32 = (v >> 8) & 0xff;
+ let b: u32 = v & 0xff;
+
+ (r << 24) | (g << 16) | (b << 8) | a
+ })
+ .flat_map(|val| val.to_be_bytes())
+ .collect::<Vec<u8>>()
+ })
+ .and_then(|buf| match &config.image_output_dir {
+ Some(image_dir) => {
+ println!("Saving image...");
+ let mut sha = Sha256::new();
+
+ sha.update(buf.as_slice());
+
+ let mut file_path = PathBuf::from(image_dir);
+ file_path.push(format!("{:X}.png", sha.finalize()));
+
+ img::save_buffer(
+ file_path.as_path(),
+ buf.as_slice(),
+ config.screen.width as u32,
+ config.screen.height as u32,
+ img::ColorType::Rgba8,
+ )
+ .map_err(|e| {
+ let error = e.to_string();
+ TracerError::ImageSave(error)
+ })
+ .map(|_| {
+ println!("Saved image to: {}", file_path.to_string_lossy());
+ })
+ }
+ None => Ok(()),
+ })
+ }
+}