mirror of
https://github.com/typst/typst
synced 2025-05-14 17:15:28 +08:00
Don't crash on image with zero DPI (#5835)
This commit is contained in:
parent
e4f8e57c53
commit
3fba256405
@ -95,6 +95,8 @@ pub fn layout_image(
|
|||||||
} else {
|
} else {
|
||||||
// If neither is forced, take the natural image size at the image's
|
// If neither is forced, take the natural image size at the image's
|
||||||
// DPI bounded by the available space.
|
// DPI bounded by the available space.
|
||||||
|
//
|
||||||
|
// Division by DPI is fine since it's guaranteed to be positive.
|
||||||
let dpi = image.dpi().unwrap_or(Image::DEFAULT_DPI);
|
let dpi = image.dpi().unwrap_or(Image::DEFAULT_DPI);
|
||||||
let natural = Axes::new(pxw, pxh).map(|v| Abs::inches(v / dpi));
|
let natural = Axes::new(pxw, pxh).map(|v| Abs::inches(v / dpi));
|
||||||
Size::new(
|
Size::new(
|
||||||
|
@ -160,6 +160,8 @@ impl RasterImage {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// The image's pixel density in pixels per inch, if known.
|
/// The image's pixel density in pixels per inch, if known.
|
||||||
|
///
|
||||||
|
/// This is guaranteed to be positive.
|
||||||
pub fn dpi(&self) -> Option<f64> {
|
pub fn dpi(&self) -> Option<f64> {
|
||||||
self.0.dpi
|
self.0.dpi
|
||||||
}
|
}
|
||||||
@ -334,6 +336,9 @@ fn apply_rotation(image: &mut DynamicImage, rotation: u32) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Try to determine the DPI (dots per inch) of the image.
|
/// Try to determine the DPI (dots per inch) of the image.
|
||||||
|
///
|
||||||
|
/// This is guaranteed to be a positive value, or `None` if invalid or
|
||||||
|
/// unspecified.
|
||||||
fn determine_dpi(data: &[u8], exif: Option<&exif::Exif>) -> Option<f64> {
|
fn determine_dpi(data: &[u8], exif: Option<&exif::Exif>) -> Option<f64> {
|
||||||
// Try to extract the DPI from the EXIF metadata. If that doesn't yield
|
// Try to extract the DPI from the EXIF metadata. If that doesn't yield
|
||||||
// anything, fall back to specialized procedures for extracting JPEG or PNG
|
// anything, fall back to specialized procedures for extracting JPEG or PNG
|
||||||
@ -341,6 +346,7 @@ fn determine_dpi(data: &[u8], exif: Option<&exif::Exif>) -> Option<f64> {
|
|||||||
exif.and_then(exif_dpi)
|
exif.and_then(exif_dpi)
|
||||||
.or_else(|| jpeg_dpi(data))
|
.or_else(|| jpeg_dpi(data))
|
||||||
.or_else(|| png_dpi(data))
|
.or_else(|| png_dpi(data))
|
||||||
|
.filter(|&dpi| dpi > 0.0)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Try to get the DPI from the EXIF metadata.
|
/// Try to get the DPI from the EXIF metadata.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user