mirror of
https://github.com/itsjunetime/tdf.git
synced 2026-06-01 23:51:46 -04:00
adding a rotate feature for pdfs (#133)
* adding a rotate feature for pdfs that have rotated graphs and such (WIP) * Scales to window width * combined match arms * added help menu text
This commit is contained in:
+1
-1
@@ -42,7 +42,7 @@ pub fn scale_img_for_area(
|
||||
|
||||
// and get the ratio that this page would have to be scaled by to fit perfectly within the
|
||||
// area provided to us.
|
||||
// we do this first by comparing the aspec ratio of the page with the aspect ratio of the
|
||||
// we do this first by comparing the aspect ratio of the page with the aspect ratio of the
|
||||
// area to fit it within. If the aspect ratio of the page is larger, then we need to scale
|
||||
// the width of the page to fill perfectly within the height of the area. Otherwise, we
|
||||
// scale the height to fit perfectly. The dimension that _is not_ scaled to fit perfectly
|
||||
|
||||
@@ -401,6 +401,7 @@ async fn enter_redraw_loop(
|
||||
},
|
||||
InputAction::Search(term) => to_renderer.send(RenderNotif::Search(term))?,
|
||||
InputAction::Invert => to_renderer.send(RenderNotif::Invert)?,
|
||||
InputAction::Rotate => to_renderer.send(RenderNotif::Rotate)?,
|
||||
InputAction::Fullscreen => fullscreen = !fullscreen,
|
||||
InputAction::SwitchRenderZoom(f_or_f) => {
|
||||
to_renderer.send(RenderNotif::SwitchFitOrFill(f_or_f)).unwrap();
|
||||
|
||||
+39
-3
@@ -20,7 +20,8 @@ pub enum RenderNotif {
|
||||
Search(String),
|
||||
SwitchFitOrFill(FitOrFill),
|
||||
Reload,
|
||||
Invert
|
||||
Invert,
|
||||
Rotate
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
@@ -37,6 +38,14 @@ pub enum RenderInfo {
|
||||
Reloaded
|
||||
}
|
||||
|
||||
#[derive(Debug, Copy, Clone)]
|
||||
pub enum RotateDirection {
|
||||
Deg0,
|
||||
Deg90,
|
||||
Deg180,
|
||||
Deg270
|
||||
}
|
||||
|
||||
#[derive(Clone)]
|
||||
pub struct PageInfo {
|
||||
pub img_data: ImageData,
|
||||
@@ -98,6 +107,7 @@ pub fn start_rendering(
|
||||
|
||||
let mut stored_doc = None;
|
||||
let mut invert = false;
|
||||
let mut rotate = RotateDirection::Deg0;
|
||||
let mut preserved_area = None;
|
||||
let mut fit_or_fill = FitOrFill::Fit;
|
||||
|
||||
@@ -238,6 +248,18 @@ pub fn start_rendering(
|
||||
}
|
||||
continue 'render_pages;
|
||||
}
|
||||
RenderNotif::Rotate => {
|
||||
rotate = match rotate {
|
||||
RotateDirection::Deg0 => RotateDirection::Deg90,
|
||||
RotateDirection::Deg90 => RotateDirection::Deg180,
|
||||
RotateDirection::Deg180 => RotateDirection::Deg270,
|
||||
RotateDirection::Deg270 => RotateDirection::Deg0
|
||||
};
|
||||
for page in &mut rendered {
|
||||
page.successful = false;
|
||||
}
|
||||
continue 'render_pages;
|
||||
}
|
||||
}
|
||||
}};
|
||||
}
|
||||
@@ -301,6 +323,7 @@ pub fn start_rendering(
|
||||
black,
|
||||
white,
|
||||
fit_or_fill,
|
||||
rotate,
|
||||
(area_w, area_h)
|
||||
) {
|
||||
// If that fn returned Some, that means it needed to be re-rendered for some
|
||||
@@ -455,6 +478,7 @@ fn render_single_page_to_ctx(
|
||||
black: i32,
|
||||
white: i32,
|
||||
fit_or_fill: FitOrFill,
|
||||
rotate: RotateDirection,
|
||||
(area_w, area_h): (f32, f32)
|
||||
) -> Result<RenderedContext, mupdf::error::Error> {
|
||||
let result_rects = match prev_render.num_search_found {
|
||||
@@ -465,7 +489,12 @@ fn render_single_page_to_ctx(
|
||||
|
||||
// then, get the size of the page
|
||||
let bounds = page.bounds()?;
|
||||
let page_dim = (bounds.x1 - bounds.x0, bounds.y1 - bounds.y0);
|
||||
let page_dim = match rotate {
|
||||
RotateDirection::Deg0 | RotateDirection::Deg180 =>
|
||||
(bounds.x1 - bounds.x0, bounds.y1 - bounds.y0),
|
||||
RotateDirection::Deg90 | RotateDirection::Deg270 =>
|
||||
(bounds.y1 - bounds.y0, bounds.x1 - bounds.x0),
|
||||
};
|
||||
|
||||
let scaled = scale_img_for_area(page_dim, (area_w, area_h), fit_or_fill);
|
||||
let ScaledResult {
|
||||
@@ -482,7 +511,13 @@ fn render_single_page_to_ctx(
|
||||
}
|
||||
|
||||
let colorspace = Colorspace::device_rgb();
|
||||
let matrix = Matrix::new_scale(scale_factor, scale_factor);
|
||||
let mut matrix = Matrix::new_scale(scale_factor, scale_factor);
|
||||
match rotate {
|
||||
RotateDirection::Deg0 => matrix.rotate(0.0),
|
||||
RotateDirection::Deg90 => matrix.rotate(90.0),
|
||||
RotateDirection::Deg180 => matrix.rotate(180.0),
|
||||
RotateDirection::Deg270 => matrix.rotate(270.0)
|
||||
};
|
||||
|
||||
let mut pixmap = page.to_pixmap(&matrix, &colorspace, false, false)?;
|
||||
if invert {
|
||||
@@ -494,6 +529,7 @@ fn render_single_page_to_ctx(
|
||||
let (x_res, y_res) = pixmap.resolution();
|
||||
let new_x = (x_res as f32 * scale_factor) as i32;
|
||||
let new_y = (y_res as f32 * scale_factor) as i32;
|
||||
|
||||
pixmap.set_resolution(new_x, new_y);
|
||||
|
||||
let result_rects = result_rects
|
||||
|
||||
@@ -836,6 +836,7 @@ impl Tui {
|
||||
'G' if can_zoom => self.update_zoom(Zoom::pan_top),
|
||||
'0' if can_zoom => self.update_zoom(Zoom::pan_left),
|
||||
'$' if can_zoom => self.update_zoom(Zoom::pan_right),
|
||||
'r' => Some(InputAction::Rotate),
|
||||
_ => None
|
||||
}
|
||||
}
|
||||
@@ -1107,6 +1108,8 @@ H, J, K, L (when zoomed in):
|
||||
Pan direction around page
|
||||
0/$ (when on fill-screen):
|
||||
Scroll to left/right side of page
|
||||
r:
|
||||
Rotate by 90 degrees
|
||||
";
|
||||
|
||||
pub enum InputAction {
|
||||
@@ -1115,6 +1118,7 @@ pub enum InputAction {
|
||||
Search(String),
|
||||
QuitApp,
|
||||
Invert,
|
||||
Rotate,
|
||||
Fullscreen,
|
||||
SwitchRenderZoom(crate::FitOrFill)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user