From cfa836720cac3fe1ac58b93ecec66c27755c2a26 Mon Sep 17 00:00:00 2001 From: Piyush Mishra Date: Thu, 13 Jan 2022 20:54:16 +0530 Subject: [PATCH] added: Reading and saving config left: config editor --- Cargo.lock | 63 ++++- Cargo.toml | 3 +- imgs/75e253532946877dea6aaa5a60ffd51a.conf | 2 +- .../75e253532946877dea6aaa5a60ffd51a.jpg | Bin 0 -> 55438 bytes src/config.rs | 51 ++++ src/draw_thread.rs | 12 +- src/globals.rs | 31 +++ src/main.rs | 7 +- src/properties.rs | 22 -- src/utils.rs | 260 ++++++++++++------ 10 files changed, 320 insertions(+), 131 deletions(-) create mode 100644 imgs/export/75e253532946877dea6aaa5a60ffd51a.jpg create mode 100644 src/globals.rs delete mode 100644 src/properties.rs diff --git a/Cargo.lock b/Cargo.lock index e3ce78d..2b26e50 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -208,6 +208,26 @@ dependencies = [ "byteorder", ] +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + [[package]] name = "either" version = "1.6.1" @@ -255,7 +275,18 @@ checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if", "libc", - "wasi", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcd999463524c52659517fe2cea98493cfe485d10565e7b0fb07dbba7ad2753" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.10.2+wasi-snapshot-preview1", ] [[package]] @@ -552,6 +583,7 @@ name = "post_maker" version = "0.1.0" dependencies = [ "clap", + "dirs", "fltk", "fltk-theme", "image", @@ -616,7 +648,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "getrandom", + "getrandom 0.1.16", "libc", "rand_chacha", "rand_core", @@ -639,7 +671,7 @@ version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "getrandom", + "getrandom 0.1.16", ] [[package]] @@ -691,6 +723,25 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "redox_syscall" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +dependencies = [ + "getrandom 0.2.3", + "redox_syscall", +] + [[package]] name = "rulinalg" version = "0.4.2" @@ -827,6 +878,12 @@ version = "0.9.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" +[[package]] +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + [[package]] name = "weezl" version = "0.1.5" diff --git a/Cargo.toml b/Cargo.toml index 858d42c..5ef5469 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -15,5 +15,4 @@ rusttype = "0.9" serde_json = "1.0" serde = { version = "1.0", features = ["derive"] } lazy_static = "1.4" -# rust_decimal = "1.20" -# rust_decimal_macros = "1.20" +dirs = "4.0.0" diff --git a/imgs/75e253532946877dea6aaa5a60ffd51a.conf b/imgs/75e253532946877dea6aaa5a60ffd51a.conf index 3a1739d..5dba742 100644 --- a/imgs/75e253532946877dea6aaa5a60ffd51a.conf +++ b/imgs/75e253532946877dea6aaa5a60ffd51a.conf @@ -1 +1 @@ -{"path":"/home/piyush/Projects/post_maker/75e253532946877dea6aaa5a60ffd51a.jpg","dimension":[400.0,500.0],"original_dimension":[720.0,1280.0],"crop_position":[0.0,190.0],"quote":"wow!","tag":"","quote_position":853.3333333333334,"tag_position":853.3333333333334,"rgba":[25,29,34,190],"is_saved":false} \ No newline at end of file +{"path":"/home/piyush/Projects/post_maker/imgs/75e253532946877dea6aaa5a60ffd51a.jpg","dimension":[400.0,500.0],"original_dimension":[720.0,1280.0],"crop_position":[0.0,190.0],"quote":"wow!","tag":"@juzlilthings","quote_position":853.3333333333334,"tag_position":853.3333333333334,"rgba":[25,29,34,190],"is_saved":false} \ No newline at end of file diff --git a/imgs/export/75e253532946877dea6aaa5a60ffd51a.jpg b/imgs/export/75e253532946877dea6aaa5a60ffd51a.jpg new file mode 100644 index 0000000000000000000000000000000000000000..1b06daa96f3a72de72e1bcc353bb897d8d58ca0b GIT binary patch literal 55438 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'P53xRi{#Gp@=VOp7e|Js+3+$ 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�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 m6%YDizJW3vptr|BAHcr;_mcK^*9QGF1lYg for Themes { } } +#[derive(Debug, Serialize, Deserialize)] +pub struct ConfigFile { + pub quote_font_ttf: String, + pub tag_font_ttf: String, + pub quote_font_ratio: f64, + pub tag_font_ratio: f64, + pub color_layer: [u8; 4], +} + +impl Default for ConfigFile { + fn default() -> Self { + Self { + quote_font_ttf: String::new(), + tag_font_ttf: String::new(), + quote_font_ratio: 259.0, + tag_font_ratio: 96.0, + color_layer: [25, 29, 34, 190], + } + } +} + +impl ConfigFile { + pub(crate) fn load() -> Self { + let conf = match dirs::config_dir() { + Some(path) => path.join("post_maker.config"), + None => std::env::current_exe() + .unwrap() + .parent() + .unwrap() + .join("post_maker.config"), + }; + + if conf.exists() { + if let Ok(text) = std::fs::read_to_string(&conf) { + if let Ok(config) = serde_json::from_str::(&text) { + return config; + } + } + } + + let config = Self::default(); + if let Err(_) = std::fs::write(&conf, serde_json::to_string(&config).unwrap()) { + eprintln!("Can't write config!"); + } + config + } +} + pub(crate) fn config() -> Args { let args = Args::parse(); args diff --git a/src/draw_thread.rs b/src/draw_thread.rs index 3b56eee..79c4279 100644 --- a/src/draw_thread.rs +++ b/src/draw_thread.rs @@ -1,6 +1,7 @@ //! Thread to manage drawing in background use crate::{ + globals, main_window::{MainWindow, Page}, AppMessage, }; @@ -187,12 +188,11 @@ fn load_image( tag_position.set_range(0.0, prop.original_dimension.1); tag_position.set_value(prop.tag_position); - prop.rgba = [ - layer_red.value() as u8, - layer_green.value() as u8, - layer_blue.value() as u8, - layer_alpha.value() as u8, - ]; + layer_red.set_value(globals::CONFIG.color_layer[0] as f64); + layer_green.set_value(globals::CONFIG.color_layer[1] as f64); + layer_blue.set_value(globals::CONFIG.color_layer[2] as f64); + layer_alpha.set_value(globals::CONFIG.color_layer[3] as f64); + prop.rgba = globals::CONFIG.color_layer; match crop { Some((x, y)) => { diff --git a/src/globals.rs b/src/globals.rs new file mode 100644 index 0000000..ce20dcc --- /dev/null +++ b/src/globals.rs @@ -0,0 +1,31 @@ +use crate::config; +use lazy_static::lazy_static; +use rusttype::Font; +use std::io::Read; + +lazy_static! { + pub static ref CONFIG: config::ConfigFile = config::ConfigFile::load(); + pub static ref FONT_QUOTE: Font<'static> = { + let mut buffer = Vec::new(); + if let Ok(mut file) = std::fs::File::open(&CONFIG.quote_font_ttf) { + if let Ok(_) = file.read_to_end(&mut buffer) { + if let Some(out) = rusttype::Font::try_from_vec(buffer) { + return out; + } + } + } + rusttype::Font::try_from_vec(include_bytes!("../ReenieBeanie-Regular.ttf").to_vec()) + .unwrap() + }; + pub static ref FONT_TAG: Font<'static> = { + let mut buffer = Vec::new(); + if let Ok(mut file) = std::fs::File::open(&CONFIG.quote_font_ttf) { + if let Ok(_) = file.read_to_end(&mut buffer) { + if let Some(out) = rusttype::Font::try_from_vec(buffer) { + return out; + } + } + } + rusttype::Font::try_from_vec(include_bytes!("../Kalam-Regular.ttf").to_vec()).unwrap() + }; +} diff --git a/src/main.rs b/src/main.rs index 3a58993..44c1846 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,14 +1,13 @@ mod config; mod crop_window; mod draw_thread; +mod globals; mod main_window; -mod properties; mod utils; // use crop_window::CropWindow; use fltk::{ app::{channel, App}, - enums::Font, prelude::*, }; use fltk_theme::WidgetTheme; @@ -31,10 +30,6 @@ fn main() { .into(), ) .apply(); - let f1 = Font::load_font("ReenieBeanie-Regular.ttf").unwrap(); - let f2 = Font::load_font("Kalam-Regular.ttf").unwrap(); - Font::set_font(Font::Times, &f1); - Font::set_font(Font::TimesItalic, &f2); let draw_buff: Arc>> = Arc::new(RwLock::new(vec![])); let (main_sender, main_receiver) = channel::(); diff --git a/src/properties.rs b/src/properties.rs deleted file mode 100644 index 05cdcf7..0000000 --- a/src/properties.rs +++ /dev/null @@ -1,22 +0,0 @@ -use lazy_static::lazy_static; -use rusttype::Font; -use std::io::Read; - -lazy_static! { - pub static ref FONT_QUOTE: Font<'static> = { - let mut buffer = Vec::new(); - std::fs::File::open("ReenieBeanie-Regular.ttf") - .unwrap() - .read_to_end(&mut buffer) - .unwrap(); - rusttype::Font::try_from_vec(buffer).unwrap() - }; - pub static ref FONT_TAG: Font<'static> = { - let mut buffer = Vec::new(); - std::fs::File::open("Kalam-Regular.ttf") - .unwrap() - .read_to_end(&mut buffer) - .unwrap(); - rusttype::Font::try_from_vec(buffer).unwrap() - }; -} diff --git a/src/utils.rs b/src/utils.rs index e9a5d2e..02f75d9 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -7,7 +7,7 @@ use std::{ use image::{DynamicImage, GenericImageView, ImageBuffer}; use serde::{Deserialize, Serialize}; -use crate::properties; +use crate::globals; pub(crate) struct Coord(pub(crate) f64, pub(crate) f64); @@ -128,55 +128,64 @@ impl ImageContainer { pub(crate) fn recalc(&mut self) { let prop = self.properties.read().unwrap(); let mut tmp = self.image.clone(); - let (width, height): (f64, f64) = Coord::from(tmp.dimensions()).into(); - let layer = - DynamicImage::ImageRgba8(ImageBuffer::from_fn(width as u32, height as u32, |_, _| { - image::Rgba(prop.rgba) - })); - image::imageops::overlay(&mut tmp, &layer, 0, 0); + draw_layer_and_text( + &mut tmp, + &prop.rgba, + &prop.quote, + prop.quote_position, + &prop.tag, + prop.tag_position, + prop.original_dimension.1, + ); - let size = quote_from_height(height); - for (index, line) in prop.quote.lines().enumerate() { - let (text_width, text_height) = measure_line( - &properties::FONT_QUOTE, - line, - rusttype::Scale::uniform(size as f32), - ); + // let layer = + // DynamicImage::ImageRgba8(ImageBuffer::from_fn(width as u32, height as u32, |_, _| { + // image::Rgba(prop.rgba) + // })); + // image::imageops::overlay(&mut tmp, &layer, 0, 0); - imageproc::drawing::draw_text_mut( - &mut tmp, - image::Rgba([255, 255, 255, 255]), - ((width - text_width) / 2.0) as u32, - ((prop.quote_position * height) / prop.original_dimension.1 - + (text_height / 2.0) - + index as f64 * (text_height * 1.2)) as u32, - rusttype::Scale::uniform(size as f32), - &properties::FONT_QUOTE, - line, - ); - } + // let size = quote_from_height(height); + // for (index, line) in prop.quote.lines().enumerate() { + // let (text_width, text_height) = measure_line( + // &globals::FONT_QUOTE, + // line, + // rusttype::Scale::uniform(size as f32), + // ); - let size = tag_from_height(height); - for (index, line) in prop.tag.lines().enumerate() { - let (text_width, text_height) = measure_line( - &properties::FONT_TAG, - line, - rusttype::Scale::uniform(size as f32), - ); + // imageproc::drawing::draw_text_mut( + // &mut tmp, + // image::Rgba([255, 255, 255, 255]), + // ((width - text_width) / 2.0) as u32, + // ((prop.quote_position * height) / prop.original_dimension.1 + // + (text_height / 2.0) + // + index as f64 * (text_height * 1.2)) as u32, + // rusttype::Scale::uniform(size as f32), + // &globals::FONT_QUOTE, + // line, + // ); + // } - imageproc::drawing::draw_text_mut( - &mut tmp, - image::Rgba([255, 255, 255, 255]), - (width * 0.99 - text_width) as u32, - ((prop.tag_position * height) / prop.original_dimension.1 - + (text_height / 2.0) - + index as f64 * (text_height * 1.2)) as u32, - rusttype::Scale::uniform(size as f32), - &properties::FONT_TAG, - line, - ); - } + // let size = tag_from_height(height); + // for (index, line) in prop.tag.lines().enumerate() { + // let (text_width, text_height) = measure_line( + // &globals::FONT_TAG, + // line, + // rusttype::Scale::uniform(size as f32), + // ); + + // imageproc::drawing::draw_text_mut( + // &mut tmp, + // image::Rgba([255, 255, 255, 255]), + // (width * 0.99 - text_width) as u32, + // ((prop.tag_position * height) / prop.original_dimension.1 + // + (text_height / 2.0) + // + index as f64 * (text_height * 1.2)) as u32, + // rusttype::Scale::uniform(size as f32), + // &globals::FONT_TAG, + // line, + // ); + // } self.buffer = tmp; } @@ -208,54 +217,64 @@ impl ImageContainer { crop_height as u32, ); - let layer = DynamicImage::ImageRgba8(ImageBuffer::from_fn( - crop_width as u32, - crop_height as u32, - |_, _| image::Rgba(prop.rgba), - )); - image::imageops::overlay(&mut img, &layer, 0, 0); + draw_layer_and_text( + &mut img, + &prop.rgba, + &prop.quote, + prop.quote_position, + &prop.tag, + prop.tag_position, + prop.original_dimension.1, + ); - let size = quote_from_height(crop_height); - for (index, line) in prop.quote.lines().enumerate() { - let (text_width, text_height) = measure_line( - &properties::FONT_QUOTE, - line, - rusttype::Scale::uniform(size as f32), - ); + // let layer = DynamicImage::ImageRgba8(ImageBuffer::from_fn( + // crop_width as u32, + // crop_height as u32, + // |_, _| image::Rgba(prop.rgba), + // )); + // image::imageops::overlay(&mut img, &layer, 0, 0); - imageproc::drawing::draw_text_mut( - &mut img, - image::Rgba([255, 255, 255, 255]), - ((crop_width - text_width) / 2.0) as u32, - ((prop.quote_position * crop_height) / prop.original_dimension.1 - + (text_height / 2.0) - + index as f64 * (text_height * 1.2)) as u32, - rusttype::Scale::uniform(size as f32), - &properties::FONT_QUOTE, - line, - ); - } + // let size = quote_from_height(crop_height); + // for (index, line) in prop.quote.lines().enumerate() { + // let (text_width, text_height) = measure_line( + // &globals::FONT_QUOTE, + // line, + // rusttype::Scale::uniform(size as f32), + // ); - let size = tag_from_height(crop_height); - for (index, line) in prop.tag.lines().enumerate() { - let (text_width, text_height) = measure_line( - &properties::FONT_TAG, - line, - rusttype::Scale::uniform(size as f32), - ); + // imageproc::drawing::draw_text_mut( + // &mut img, + // image::Rgba([255, 255, 255, 255]), + // ((crop_width - text_width) / 2.0) as u32, + // ((prop.quote_position * crop_height) / prop.original_dimension.1 + // + (text_height / 2.0) + // + index as f64 * (text_height * 1.2)) as u32, + // rusttype::Scale::uniform(size as f32), + // &globals::FONT_QUOTE, + // line, + // ); + // } - imageproc::drawing::draw_text_mut( - &mut img, - image::Rgba([255, 255, 255, 255]), - (crop_width * 0.99 - text_width) as u32, - ((prop.tag_position * crop_height) / prop.original_dimension.1 - + (text_height / 2.0) - + index as f64 * (text_height * 1.2)) as u32, - rusttype::Scale::uniform(size as f32), - &properties::FONT_TAG, - line, - ); - } + // let size = tag_from_height(crop_height); + // for (index, line) in prop.tag.lines().enumerate() { + // let (text_width, text_height) = measure_line( + // &globals::FONT_TAG, + // line, + // rusttype::Scale::uniform(size as f32), + // ); + + // imageproc::drawing::draw_text_mut( + // &mut img, + // image::Rgba([255, 255, 255, 255]), + // (crop_width * 0.99 - text_width) as u32, + // ((prop.tag_position * crop_height) / prop.original_dimension.1 + // + (text_height / 2.0) + // + index as f64 * (text_height * 1.2)) as u32, + // rusttype::Scale::uniform(size as f32), + // &globals::FONT_TAG, + // line, + // ); + // } image::save_buffer( export, @@ -299,6 +318,65 @@ impl ImageProperties { } } +fn draw_layer_and_text( + tmp: &mut DynamicImage, + rgba: &[u8; 4], + quote: &str, + quote_position: f64, + tag: &str, + tag_position: f64, + original_height: f64, +) { + let (width, height): (f64, f64) = Coord::from(tmp.dimensions()).into(); + let layer = + DynamicImage::ImageRgba8(ImageBuffer::from_fn(width as u32, height as u32, |_, _| { + image::Rgba(rgba.to_owned()) + })); + image::imageops::overlay(tmp, &layer, 0, 0); + + let size = quote_from_height(height); + for (index, line) in quote.lines().enumerate() { + let (text_width, text_height) = measure_line( + &globals::FONT_QUOTE, + line, + rusttype::Scale::uniform(size as f32), + ); + + imageproc::drawing::draw_text_mut( + tmp, + image::Rgba([255, 255, 255, 255]), + ((width - text_width) / 2.0) as u32, + ((quote_position * height) / original_height + + (text_height / 2.0) + + index as f64 * (text_height * 1.2)) as u32, + rusttype::Scale::uniform(size as f32), + &globals::FONT_QUOTE, + line, + ); + } + + let size = tag_from_height(height); + for (index, line) in tag.lines().enumerate() { + let (text_width, text_height) = measure_line( + &globals::FONT_TAG, + line, + rusttype::Scale::uniform(size as f32), + ); + + imageproc::drawing::draw_text_mut( + tmp, + image::Rgba([255, 255, 255, 255]), + (width * 0.99 - text_width) as u32, + ((tag_position * height) / original_height + + (text_height / 2.0) + + index as f64 * (text_height * 1.2)) as u32, + rusttype::Scale::uniform(size as f32), + &globals::FONT_TAG, + line, + ); + } +} + pub(crate) fn get_4_5(width: f64, height: f64) -> (f64, f64) { if width > width_from_height(height) { (width_from_height(height), height) @@ -316,11 +394,11 @@ pub(crate) fn height_from_width(width: f64) -> f64 { } pub(crate) fn quote_from_height(height: f64) -> f64 { - (height * 60.0) / 1350.0 + (height * globals::CONFIG.quote_font_ratio) / 5000.0 } pub(crate) fn tag_from_height(height: f64) -> f64 { - (height * 50.0) / 1350.0 + (height * globals::CONFIG.tag_font_ratio) / 5000.0 } pub(crate) fn measure_line(