mirror of
https://github.com/itsjunetime/tdf.git
synced 2026-06-01 23:51:46 -04:00
Implement inverting colors
This commit is contained in:
@@ -3,6 +3,7 @@
|
|||||||
- Update ratatui(-image) dependencies
|
- Update ratatui(-image) dependencies
|
||||||
- Enable Ctrl+Z/Suspend functionality
|
- Enable Ctrl+Z/Suspend functionality
|
||||||
- Rewrite with mupdf as the backend for much better performance and rendering quality
|
- Rewrite with mupdf as the backend for much better performance and rendering quality
|
||||||
|
- Support easy inversion of colors via `i` keypress
|
||||||
|
|
||||||
# v0.2.0
|
# v0.2.0
|
||||||
|
|
||||||
|
|||||||
Generated
+30
@@ -889,6 +889,15 @@ version = "2.3.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be"
|
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]]
|
[[package]]
|
||||||
name = "filedescriptor"
|
name = "filedescriptor"
|
||||||
version = "0.8.3"
|
version = "0.8.3"
|
||||||
@@ -1344,6 +1353,7 @@ dependencies = [
|
|||||||
"bytemuck",
|
"bytemuck",
|
||||||
"byteorder-lite",
|
"byteorder-lite",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
|
"png",
|
||||||
"ravif",
|
"ravif",
|
||||||
"rayon",
|
"rayon",
|
||||||
"zune-core",
|
"zune-core",
|
||||||
@@ -1719,6 +1729,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||||||
checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b"
|
checksum = "b3b1c9bd4fe1f0f8b387f6eb9eb3b4a1aa26185e5750efb9140301703f62cd1b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"adler2",
|
"adler2",
|
||||||
|
"simd-adler32",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -2181,6 +2192,19 @@ dependencies = [
|
|||||||
"plotters-backend",
|
"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]]
|
[[package]]
|
||||||
name = "powerfmt"
|
name = "powerfmt"
|
||||||
version = "0.2.0"
|
version = "0.2.0"
|
||||||
@@ -2718,6 +2742,12 @@ dependencies = [
|
|||||||
"libc",
|
"libc",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "simd-adler32"
|
||||||
|
version = "0.3.7"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "simd_helpers"
|
name = "simd_helpers"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
|
|||||||
@@ -191,6 +191,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
to_converter.send(ConverterMsg::GoToPage(page))?;
|
to_converter.send(ConverterMsg::GoToPage(page))?;
|
||||||
},
|
},
|
||||||
InputAction::Search(term) => tui_tx.send(RenderNotif::Search(term))?,
|
InputAction::Search(term) => tui_tx.send(RenderNotif::Search(term))?,
|
||||||
|
InputAction::Invert => tui_tx.send(RenderNotif::Invert)?
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|||||||
+15
-1
@@ -10,7 +10,8 @@ pub enum RenderNotif {
|
|||||||
Area(Rect),
|
Area(Rect),
|
||||||
JumpToPage(usize),
|
JumpToPage(usize),
|
||||||
Search(String),
|
Search(String),
|
||||||
Reload
|
Reload,
|
||||||
|
Invert
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@@ -90,6 +91,7 @@ pub fn start_rendering(
|
|||||||
let col_h = size.height / size.rows;
|
let col_h = size.height / size.rows;
|
||||||
|
|
||||||
let mut stored_doc = None;
|
let mut stored_doc = None;
|
||||||
|
let mut invert = false;
|
||||||
|
|
||||||
'reload: loop {
|
'reload: loop {
|
||||||
let doc = match Document::open(path) {
|
let doc = match Document::open(path) {
|
||||||
@@ -154,6 +156,13 @@ pub fn start_rendering(
|
|||||||
($notif:ident) => {
|
($notif:ident) => {
|
||||||
match $notif {
|
match $notif {
|
||||||
RenderNotif::Reload => continue 'reload,
|
RenderNotif::Reload => continue 'reload,
|
||||||
|
RenderNotif::Invert => {
|
||||||
|
invert = !invert;
|
||||||
|
for page in &mut rendered {
|
||||||
|
page.successful = false;
|
||||||
|
}
|
||||||
|
continue 'render_pages;
|
||||||
|
}
|
||||||
RenderNotif::Area(new_area) => {
|
RenderNotif::Area(new_area) => {
|
||||||
let bigger =
|
let bigger =
|
||||||
new_area.width > area.width || new_area.height > area.height;
|
new_area.width > area.width || new_area.height > area.height;
|
||||||
@@ -252,6 +261,7 @@ pub fn start_rendering(
|
|||||||
&page,
|
&page,
|
||||||
search_term.as_deref(),
|
search_term.as_deref(),
|
||||||
rendered_with_no_results,
|
rendered_with_no_results,
|
||||||
|
invert,
|
||||||
(area_w, area_h)
|
(area_w, area_h)
|
||||||
) {
|
) {
|
||||||
// If we've already rendered it just fine and we don't need to render it again,
|
// 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,
|
page: &Page,
|
||||||
search_term: Option<&str>,
|
search_term: Option<&str>,
|
||||||
already_rendered_no_results: bool,
|
already_rendered_no_results: bool,
|
||||||
|
invert: bool,
|
||||||
(area_w, area_h): (f32, f32)
|
(area_w, area_h): (f32, f32)
|
||||||
) -> Result<Option<RenderedContext>, mupdf::error::Error> {
|
) -> Result<Option<RenderedContext>, mupdf::error::Error> {
|
||||||
let mut max_hits = 10;
|
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 matrix = Matrix::new_scale(scale_factor, scale_factor);
|
||||||
|
|
||||||
let mut pixmap = page.to_pixmap(&matrix, &colorspace, 0.0, false)?;
|
let mut pixmap = page.to_pixmap(&matrix, &colorspace, 0.0, false)?;
|
||||||
|
if invert {
|
||||||
|
pixmap.invert()?;
|
||||||
|
}
|
||||||
|
|
||||||
let (x_res, y_res) = pixmap.resolution();
|
let (x_res, y_res) = pixmap.resolution();
|
||||||
let new_x = (x_res as f32 * scale_factor) as i32;
|
let new_x = (x_res as f32 * scale_factor) as i32;
|
||||||
|
|||||||
+3
-1
@@ -414,6 +414,7 @@ impl Tui {
|
|||||||
)));
|
)));
|
||||||
Some(InputAction::Redraw)
|
Some(InputAction::Redraw)
|
||||||
}
|
}
|
||||||
|
'i' => Some(InputAction::Invert),
|
||||||
'n' if self.page < self.rendered.len() - 1 => {
|
'n' if self.page < self.rendered.len() - 1 => {
|
||||||
// TODO: If we can't find one, then maybe like block until we've verified
|
// TODO: If we can't find one, then maybe like block until we've verified
|
||||||
// all the pages have been checked?
|
// all the pages have been checked?
|
||||||
@@ -604,7 +605,8 @@ pub enum InputAction {
|
|||||||
Redraw,
|
Redraw,
|
||||||
JumpingToPage(usize),
|
JumpingToPage(usize),
|
||||||
Search(String),
|
Search(String),
|
||||||
QuitApp
|
QuitApp,
|
||||||
|
Invert
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Copy, Clone)]
|
#[derive(Copy, Clone)]
|
||||||
|
|||||||
Reference in New Issue
Block a user