summaryrefslogtreecommitdiff
path: root/crates/typst-library/src/visualize
diff options
context:
space:
mode:
authorLaurenz Stampfl <47084093+LaurenzV@users.noreply.github.com>2025-04-01 16:42:52 +0200
committerGitHub <noreply@github.com>2025-04-01 14:42:52 +0000
commit96dd67e011bb317cf78683bcf1edfdfca5e7b6b3 (patch)
tree900a0c4e7723af4289685af35d788041055ad4a2 /crates/typst-library/src/visualize
parent012e14d40cb44997630cf6469a446f217f2e9057 (diff)
Switch PDF backend to `krilla` (#5420)
Co-authored-by: Laurenz <laurmaedje@gmail.com>
Diffstat (limited to 'crates/typst-library/src/visualize')
-rw-r--r--crates/typst-library/src/visualize/image/raster.rs27
1 files changed, 21 insertions, 6 deletions
diff --git a/crates/typst-library/src/visualize/image/raster.rs b/crates/typst-library/src/visualize/image/raster.rs
index 453b9406..21d5b18f 100644
--- a/crates/typst-library/src/visualize/image/raster.rs
+++ b/crates/typst-library/src/visualize/image/raster.rs
@@ -3,6 +3,8 @@ use std::hash::{Hash, Hasher};
use std::io;
use std::sync::Arc;
+use crate::diag::{bail, StrResult};
+use crate::foundations::{cast, dict, Bytes, Cast, Dict, Smart, Value};
use ecow::{eco_format, EcoString};
use image::codecs::gif::GifDecoder;
use image::codecs::jpeg::JpegDecoder;
@@ -11,9 +13,6 @@ use image::{
guess_format, DynamicImage, ImageBuffer, ImageDecoder, ImageResult, Limits, Pixel,
};
-use crate::diag::{bail, StrResult};
-use crate::foundations::{cast, dict, Bytes, Cast, Dict, Smart, Value};
-
/// A decoded raster image.
#[derive(Clone, Hash)]
pub struct RasterImage(Arc<Repr>);
@@ -22,7 +21,8 @@ pub struct RasterImage(Arc<Repr>);
struct Repr {
data: Bytes,
format: RasterFormat,
- dynamic: image::DynamicImage,
+ dynamic: Arc<DynamicImage>,
+ exif_rotation: Option<u32>,
icc: Option<Bytes>,
dpi: Option<f64>,
}
@@ -50,6 +50,8 @@ impl RasterImage {
format: RasterFormat,
icc: Smart<Bytes>,
) -> StrResult<RasterImage> {
+ let mut exif_rot = None;
+
let (dynamic, icc, dpi) = match format {
RasterFormat::Exchange(format) => {
fn decode<T: ImageDecoder>(
@@ -85,6 +87,7 @@ impl RasterImage {
// Apply rotation from EXIF metadata.
if let Some(rotation) = exif.as_ref().and_then(exif_rotation) {
apply_rotation(&mut dynamic, rotation);
+ exif_rot = Some(rotation);
}
// Extract pixel density.
@@ -136,7 +139,14 @@ impl RasterImage {
}
};
- Ok(Self(Arc::new(Repr { data, format, dynamic, icc, dpi })))
+ Ok(Self(Arc::new(Repr {
+ data,
+ format,
+ exif_rotation: exif_rot,
+ dynamic: Arc::new(dynamic),
+ icc,
+ dpi,
+ })))
}
/// The raw image data.
@@ -159,6 +169,11 @@ impl RasterImage {
self.dynamic().height()
}
+ /// TODO.
+ pub fn exif_rotation(&self) -> Option<u32> {
+ self.0.exif_rotation
+ }
+
/// The image's pixel density in pixels per inch, if known.
///
/// This is guaranteed to be positive.
@@ -167,7 +182,7 @@ impl RasterImage {
}
/// Access the underlying dynamic image.
- pub fn dynamic(&self) -> &image::DynamicImage {
+ pub fn dynamic(&self) -> &Arc<DynamicImage> {
&self.0.dynamic
}