diff --git a/Cargo.toml b/Cargo.toml index 42fbb5a..e40b574 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,46 @@ name = "photo-frame" version = "0.1.0" edition = "2021" +[lints.rust] +unsafe_code = "forbid" + +[lints.clippy] +all = "deny" +nursery = "deny" +pedantic = "deny" +complexity = "deny" +perf = "deny" +style = "deny" +suspicious = "deny" +unwrap_in_result = { level = "deny", priority = 1} +unwrap_used = { level = "deny", priority = 1} +expect_used = { level = "deny", priority = 1} +verbose_file_reads = { level = "deny", priority = 1} +unneeded_field_pattern = { level = "deny", priority = 1} +tests_outside_test_module = { level = "deny", priority = 1} +shadow_same = { level = "deny", priority = 1} +same_name_method = { level = "deny", priority = 1} +rest_pat_in_fully_bound_structs = { level = "deny", priority = 1} +redundant_type_annotations = { level = "deny", priority = 1} +panic = { level = "deny", priority = 1} +# Allow some annoying lints +module_name_repetitions = {level = "allow", priority = 1} +missing_errors_doc = {level = "allow", priority = 1} +needless_pass_by_value = {level = "allow", priority = 1} +or_fun_call = {level = "allow", priority = 1} +implicit_hasher = {level = "allow", priority = 1} +significant_drop_tightening = {level = "allow", priority = 1} +cast_possible_truncation = {level = "allow", priority = 1} +cast_sign_loss = {level = "allow", priority = 1} +cast_precision_loss = {level = "allow", priority = 1} +future_not_send = {level = "allow", priority = 1} + +[profile.release] +strip = true +lto = "thin" + [dependencies] +anyhow = "1.0.93" image = "0.25.4" macroquad = { version = "0.4.13" } +walkdir = "2.5.0" diff --git a/src/dimensions.rs b/src/dimensions.rs index 332ae78..8c31b8b 100644 --- a/src/dimensions.rs +++ b/src/dimensions.rs @@ -5,11 +5,11 @@ pub struct Dimensions { } impl Dimensions { - pub fn new(width: u32, height: u32) -> Self { + pub const fn new(width: u32, height: u32) -> Self { Self { width, height } } - pub fn aspect_ratio(&self) -> f32 { + pub const fn aspect_ratio(self) -> f32 { self.width as f32 / self.height as f32 } } diff --git a/src/main.rs b/src/main.rs index bdc686b..3863e13 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,8 +1,13 @@ -use dimensions::{calculate_resize_dimensions, Dimensions}; -use image::ImageReader; +use dimensions::Dimensions; +use image_provider::ImageProvider; use macroquad::prelude::*; +use std::{ + thread, + time::{Duration, Instant}, +}; mod dimensions; +mod image_provider; fn window_conf() -> Conf { Conf { @@ -14,11 +19,11 @@ fn window_conf() -> Conf { } } -fn display_image(texture: &Texture2D) { +fn display_image_centered(texture: &Texture2D) { let screen_width = screen_width(); let screen_height = screen_height(); draw_texture( - &texture, + texture, clamp(screen_width - texture.width(), 0.0f32, screen_width) / 2.0f32, clamp(screen_height - texture.height(), 0.0f32, screen_height) / 2.0f32, WHITE, @@ -26,36 +31,35 @@ fn display_image(texture: &Texture2D) { } #[macroquad::main(window_conf)] -async fn main() { +async fn main() -> anyhow::Result<()> { show_mouse(false); - let image = ImageReader::open("examples/test.jpg") - .unwrap() - .decode() - .unwrap(); - let screen_dim = Dimensions::new(screen_width() as u32, screen_height() as u32); - let image_dim = Dimensions::new(image.width(), image.height()); - - let new_dim = calculate_resize_dimensions(screen_dim, image_dim); - let image = image.resize( - new_dim.width, - new_dim.height, - image::imageops::FilterType::Lanczos3, - ); - - let texture = Texture2D::from_rgba8( - image.width().try_into().unwrap(), - image.height().try_into().unwrap(), - &image.into_rgba8().to_vec(), - ); + let mut provider = ImageProvider::new(screen_dim, "/mnt/c/Users/beaus/Downloads".into()); + provider.load_next_image()?; + let mut time = Instant::now(); loop { - clear_background(BLACK); if is_quit_requested() || is_key_released(KeyCode::Escape) { break; } - display_image(&texture); - next_frame().await + display_frame(&provider)?; + + if time.elapsed().as_secs() > 5 { + provider.load_next_image()?; + time = Instant::now(); + } + thread::sleep(Duration::from_millis(250)); + next_frame().await; } + + Ok(()) +} + +fn display_frame(provider: &ImageProvider) -> anyhow::Result<()> { + let image = provider.get_current_texture()?; + clear_background(BLACK); + display_image_centered(image); + + Ok(()) }