diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 10125c2..b60434d 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -14,6 +14,7 @@ edition = "2021" name = "pdf_forge_lib" crate-type = ["staticlib", "cdylib", "rlib"] +[render] [build-dependencies] tauri-build = { version = "2", features = [] } diff --git a/src-tauri/examples/render.rs b/src-tauri/examples/render.rs new file mode 100644 index 0000000..5bb521a --- /dev/null +++ b/src-tauri/examples/render.rs @@ -0,0 +1,43 @@ +use pdf::file::FileOptions; +use pdf_forge_render::render::Renderer; +use show_image::{create_window, event}; +use std::thread::sleep; +use std::time::Duration; + +macro_rules! timed { + ($func_call:expr, $label:expr) => {{ + let start = std::time::Instant::now(); + let result = $func_call; + let duration = std::time::Instant::now().duration_since(start); + println!("{} took {:?}", $label, duration); + result + }}; +} + +#[show_image::main] +fn main() -> Result<(), Box> { + println!("{:?}", std::env::args()); + let pdf_path = std::env::args() + .nth(1) + .expect("Please provide a path to a PDF file as an argument"); + + let page_num = std::env::args() + .nth(2) + .map(|arg| { + arg.parse::() + .expect("provide a valid page number as an argument") + }) + .expect("Please provide a "); + + let file = FileOptions::cached().open(pdf_path.as_str())?; + let mut renderer = Renderer::new(&file, 75); + let window = create_window(format!("page-{}", page_num), Default::default())?; + let img = renderer.render(page_num)?; + let _ = window.set_image(format!("im-{}", page_num), img)?; + for event in window.event_channel()? { + if let event::WindowEvent::CloseRequested(event) = event { + break; + } + } + Ok(()) +} diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index d39b920..7a3a4d6 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1,10 +1,11 @@ -extern crate pdf; -pub mod render; +mod render; mod retrieval; #[cfg(test)] mod tests; +extern crate pdf; + use crate::pdf::object::Resolve; use crate::render::Renderer; use image::DynamicImage; @@ -717,11 +718,11 @@ fn get_xref_table_model_with_file(file: &CosFile) -> Result>>, } -pub struct SessionFile { +struct SessionFile { pdf_file: PdfFile, cos_file: CosFile, } diff --git a/src-tauri/src/render.rs b/src-tauri/src/render.rs index 25037ba..ff5c21d 100644 --- a/src-tauri/src/render.rs +++ b/src-tauri/src/render.rs @@ -6,7 +6,6 @@ use image::{DynamicImage, RgbaImage}; use pathfinder_geometry::transform2d::Transform2F; use pathfinder_rasterize::Rasterizer; use pdf_render::{render_page, Cache, SceneBackend}; -use show_image::{create_window, run_context}; pub struct Renderer<'a> { file: &'a CosFile, diff --git a/src-tauri/src/tests.rs b/src-tauri/src/tests.rs index 4acf7e2..f07739e 100644 --- a/src-tauri/src/tests.rs +++ b/src-tauri/src/tests.rs @@ -252,5 +252,28 @@ mod tests { ); } + use crate::render::{render, render_with_dpi, Renderer}; + #[test] + fn test_render() { + let file = timed!( + FileOptions::cached().open(PDF_SPEC_PATH).unwrap(), + "Loading file" + ); + let mut renderer = Renderer::new(&file, 150); + let mut rendered_pages: Vec = vec![]; + timed!( + for i in 0..1 { + let img = timed!(renderer.render(i), format!("render page {}", i)); + rendered_pages.push(img.unwrap()) + }, + "rendering some pages" + ); + timed!( + for (num, image) in rendered_pages.iter().enumerate() { + image.to_rgb8().save(format!("page_{}.jpg", num)).unwrap() + }, + "saving images" + ); + } }