From a51c38a6ce4dbbb054c526a89f12b91e382b8791 Mon Sep 17 00:00:00 2001 From: Laurenz Stampfl <47084093+LaurenzV@users.noreply.github.com> Date: Sun, 15 Dec 2024 15:44:01 +0100 Subject: [PATCH] Fix missing rotation --- crates/typst-library/src/visualize/image/raster.rs | 10 +++++++++- crates/typst-pdf/src/image.rs | 7 ++++++- crates/typst-pdf/src/paint.rs | 1 - 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/crates/typst-library/src/visualize/image/raster.rs b/crates/typst-library/src/visualize/image/raster.rs index b790f949c..677127e00 100644 --- a/crates/typst-library/src/visualize/image/raster.rs +++ b/crates/typst-library/src/visualize/image/raster.rs @@ -21,6 +21,7 @@ struct Repr { data: Bytes, format: RasterFormat, dynamic: Arc, + is_rotated: bool, icc: Option>, dpi: Option, } @@ -51,15 +52,17 @@ impl RasterImage { .read_from_container(&mut std::io::Cursor::new(&data)) .ok(); + let mut is_rotated = false; // Apply rotation from EXIF metadata. if let Some(rotation) = exif.as_ref().and_then(exif_rotation) { apply_rotation(&mut dynamic, rotation); + is_rotated = true; } // Extract pixel density. let dpi = determine_dpi(&data, exif.as_ref()); - Ok(Self(Arc::new(Repr { data, format, dynamic: Arc::new(dynamic), icc, dpi }))) + Ok(Self(Arc::new(Repr { data, format, is_rotated, dynamic: Arc::new(dynamic), icc, dpi }))) } /// The raw image data. @@ -77,6 +80,11 @@ impl RasterImage { self.dynamic().width() } + /// Whether the image has been rotated due to EXIF metadata. + pub fn is_rotated(&self) -> bool { + self.0.is_rotated + } + /// The image's pixel height. pub fn height(&self) -> u32 { self.dynamic().height() diff --git a/crates/typst-pdf/src/image.rs b/crates/typst-pdf/src/image.rs index bc3023d4c..0484920b0 100644 --- a/crates/typst-pdf/src/image.rs +++ b/crates/typst-pdf/src/image.rs @@ -109,7 +109,12 @@ impl CustomImage for PdfImage { pub(crate) fn raster(raster: RasterImage) -> Option { match raster.format() { RasterFormat::Jpg => { - krilla::image::Image::from_jpeg(Arc::new(raster.data().clone())) + if !raster.is_rotated() { + krilla::image::Image::from_jpeg(Arc::new(raster.data().clone())) + } else { + // Can't embed original JPEG data if it needed to be rotated. + krilla::image::Image::from_custom(PdfImage::new(raster)) + } } _ => krilla::image::Image::from_custom(PdfImage::new(raster)), } diff --git a/crates/typst-pdf/src/paint.rs b/crates/typst-pdf/src/paint.rs index 0a45678f4..334214e6c 100644 --- a/crates/typst-pdf/src/paint.rs +++ b/crates/typst-pdf/src/paint.rs @@ -208,7 +208,6 @@ fn convert_gradient( }; let angle = rotation; - println!("angle: {:?}", angle); let mut stops: Vec> = vec![];