From 9d2a730e40da333e91a342cf171a5bfca331edce Mon Sep 17 00:00:00 2001 From: itsjunetime Date: Wed, 19 Feb 2025 15:24:27 -0700 Subject: [PATCH] Implement inverting colors --- CHANGELOG.md | 1 + Cargo.lock | 30 ++++++++++++++++++++++++++++++ src/main.rs | 1 + src/renderer.rs | 16 +++++++++++++++- src/tui.rs | 4 +++- 5 files changed, 50 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0ce2cb5..58c3425 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,7 @@ - Update ratatui(-image) dependencies - Enable Ctrl+Z/Suspend functionality - Rewrite with mupdf as the backend for much better performance and rendering quality +- Support easy inversion of colors via `i` keypress # v0.2.0 diff --git a/Cargo.lock b/Cargo.lock index fb720d2..50d8266 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -889,6 +889,15 @@ version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + [[package]] name = "filedescriptor" version = "0.8.3" @@ -1344,6 +1353,7 @@ dependencies = [ "bytemuck", "byteorder-lite", "num-traits", + "png", "ravif", "rayon", "zune-core", @@ -1719,6 +1729,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b" dependencies = [ "adler2", + "simd-adler32", ] [[package]] @@ -2181,6 +2192,19 @@ dependencies = [ "plotters-backend", ] +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -2718,6 +2742,12 @@ dependencies = [ "libc", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + [[package]] name = "simd_helpers" version = "0.1.0" diff --git a/src/main.rs b/src/main.rs index f8fb145..805cabd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -191,6 +191,7 @@ async fn main() -> Result<(), Box> { to_converter.send(ConverterMsg::GoToPage(page))?; }, InputAction::Search(term) => tui_tx.send(RenderNotif::Search(term))?, + InputAction::Invert => tui_tx.send(RenderNotif::Invert)? } } }, diff --git a/src/renderer.rs b/src/renderer.rs index 0c6e6cc..df17f65 100644 --- a/src/renderer.rs +++ b/src/renderer.rs @@ -10,7 +10,8 @@ pub enum RenderNotif { Area(Rect), JumpToPage(usize), Search(String), - Reload + Reload, + Invert } #[derive(Debug)] @@ -90,6 +91,7 @@ pub fn start_rendering( let col_h = size.height / size.rows; let mut stored_doc = None; + let mut invert = false; 'reload: loop { let doc = match Document::open(path) { @@ -154,6 +156,13 @@ pub fn start_rendering( ($notif:ident) => { match $notif { RenderNotif::Reload => continue 'reload, + RenderNotif::Invert => { + invert = !invert; + for page in &mut rendered { + page.successful = false; + } + continue 'render_pages; + } RenderNotif::Area(new_area) => { let bigger = new_area.width > area.width || new_area.height > area.height; @@ -252,6 +261,7 @@ pub fn start_rendering( &page, search_term.as_deref(), rendered_with_no_results, + invert, (area_w, area_h) ) { // If we've already rendered it just fine and we don't need to render it again, @@ -319,6 +329,7 @@ fn render_single_page_to_ctx( page: &Page, search_term: Option<&str>, already_rendered_no_results: bool, + invert: bool, (area_w, area_h): (f32, f32) ) -> Result, mupdf::error::Error> { let mut max_hits = 10; @@ -378,6 +389,9 @@ fn render_single_page_to_ctx( let matrix = Matrix::new_scale(scale_factor, scale_factor); let mut pixmap = page.to_pixmap(&matrix, &colorspace, 0.0, false)?; + if invert { + pixmap.invert()?; + } let (x_res, y_res) = pixmap.resolution(); let new_x = (x_res as f32 * scale_factor) as i32; diff --git a/src/tui.rs b/src/tui.rs index 08ad556..8dcfdfb 100644 --- a/src/tui.rs +++ b/src/tui.rs @@ -414,6 +414,7 @@ impl Tui { ))); Some(InputAction::Redraw) } + 'i' => Some(InputAction::Invert), 'n' if self.page < self.rendered.len() - 1 => { // TODO: If we can't find one, then maybe like block until we've verified // all the pages have been checked? @@ -604,7 +605,8 @@ pub enum InputAction { Redraw, JumpingToPage(usize), Search(String), - QuitApp + QuitApp, + Invert } #[derive(Copy, Clone)]