mirror of
https://github.com/spacedriveapp/spacedrive.git
synced 2025-12-11 20:15:30 +01:00
Fix some possible pdf thumb rendering concurrency bugs (#1809)
This commit is contained in:
parent
b27686860d
commit
26a31ce15e
@ -27,8 +27,6 @@ pub enum Error {
|
||||
RgbImageConversion,
|
||||
#[error("error with pdfium: {0}")]
|
||||
Pdfium(#[from] pdfium_render::prelude::PdfiumError),
|
||||
#[error("failed to load pdfium library")]
|
||||
PdfiumBinding,
|
||||
#[error("error with usvg: {0}")]
|
||||
USvg(#[from] resvg::usvg::Error),
|
||||
#[error("failed to allocate `Pixbuf` while converting an SVG")]
|
||||
|
||||
@ -4,7 +4,7 @@ use std::{
|
||||
path::{Path, PathBuf},
|
||||
};
|
||||
|
||||
use crate::{consts::PDF_RENDER_WIDTH, Error::PdfiumBinding, ImageHandler, Result};
|
||||
use crate::{consts::PDF_RENDER_WIDTH, ImageHandler, Result};
|
||||
use image::DynamicImage;
|
||||
use once_cell::sync::Lazy;
|
||||
use pdfium_render::prelude::{PdfPageRenderRotation, PdfRenderConfig, Pdfium};
|
||||
@ -20,9 +20,9 @@ const BINDING_LOCATION: &str = if cfg!(target_os = "macos") {
|
||||
"../lib/spacedrive"
|
||||
};
|
||||
|
||||
static PDFIUM: Lazy<Option<Pdfium>> = Lazy::new(|| {
|
||||
static PDFIUM_LIB: Lazy<String> = Lazy::new(|| {
|
||||
let lib_name = Pdfium::pdfium_platform_library_name();
|
||||
let lib_path = current_exe()
|
||||
current_exe()
|
||||
.ok()
|
||||
.and_then(|exe_path| {
|
||||
exe_path.parent().and_then(|parent_path| {
|
||||
@ -46,33 +46,32 @@ static PDFIUM: Lazy<Option<Pdfium>> = Lazy::new(|| {
|
||||
.to_str()
|
||||
.expect("We are converting valid strs to PathBuf then back, it should not fail")
|
||||
.to_owned()
|
||||
});
|
||||
|
||||
Pdfium::bind_to_library(lib_path)
|
||||
.or_else(|err| {
|
||||
error!("{err:#?}");
|
||||
Pdfium::bind_to_system_library()
|
||||
})
|
||||
.map(Pdfium::new)
|
||||
.map_err(|err| error!("{err:#?}"))
|
||||
.ok()
|
||||
});
|
||||
|
||||
static PDFIUM_RENDER_CONFIG: Lazy<PdfRenderConfig> = Lazy::new(|| {
|
||||
PdfRenderConfig::new()
|
||||
.set_target_width(PDF_RENDER_WIDTH)
|
||||
.rotate_if_landscape(PdfPageRenderRotation::Degrees90, true)
|
||||
.render_form_data(false)
|
||||
.render_annotations(false)
|
||||
});
|
||||
|
||||
pub struct PdfHandler {}
|
||||
|
||||
impl ImageHandler for PdfHandler {
|
||||
fn handle_image(&self, path: &Path) -> Result<DynamicImage> {
|
||||
let pdfium = PDFIUM.as_ref().ok_or(PdfiumBinding)?;
|
||||
let pdfium = Pdfium::new(Pdfium::bind_to_library(PDFIUM_LIB.as_str()).or_else(|err| {
|
||||
error!("{err:#?}");
|
||||
Pdfium::bind_to_system_library()
|
||||
})?);
|
||||
|
||||
let render_config = PdfRenderConfig::new()
|
||||
.set_target_width(PDF_RENDER_WIDTH)
|
||||
.rotate_if_landscape(PdfPageRenderRotation::Degrees90, true);
|
||||
let pdf = pdfium.load_pdf_from_file(path, None)?;
|
||||
let first_page = pdf.pages().first()?;
|
||||
let image = first_page
|
||||
.render_with_config(&PDFIUM_RENDER_CONFIG)?
|
||||
.as_image();
|
||||
|
||||
Ok(pdfium
|
||||
.load_pdf_from_file(path, None)?
|
||||
.pages()
|
||||
.first()?
|
||||
.render_with_config(&render_config)?
|
||||
.as_image())
|
||||
Ok(image)
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user