Implement inverting colors

This commit is contained in:
itsjunetime
2025-02-19 15:24:27 -07:00
parent 8c10a3c4bc
commit 9d2a730e40
5 changed files with 50 additions and 2 deletions
+1
View File
@@ -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
Generated
+30
View File
@@ -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"
+1
View File
@@ -191,6 +191,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
to_converter.send(ConverterMsg::GoToPage(page))?;
},
InputAction::Search(term) => tui_tx.send(RenderNotif::Search(term))?,
InputAction::Invert => tui_tx.send(RenderNotif::Invert)?
}
}
},
+15 -1
View File
@@ -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<Option<RenderedContext>, 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;
+3 -1
View File
@@ -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)]