From 2db891d2d796ab4646b0e66e7d3014abdfbd5450 Mon Sep 17 00:00:00 2001 From: Laurenz Stampfl <47084093+LaurenzV@users.noreply.github.com> Date: Fri, 29 Nov 2024 22:47:42 +0100 Subject: [PATCH] Add basic error handling for images --- crates/krilla/src/chunk_container.rs | 4 ++-- crates/krilla/src/error.rs | 3 +++ crates/krilla/src/object/image.rs | 16 +++++++++++++--- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/crates/krilla/src/chunk_container.rs b/crates/krilla/src/chunk_container.rs index f9f14461..32e50ba8 100644 --- a/crates/krilla/src/chunk_container.rs +++ b/crates/krilla/src/chunk_container.rs @@ -57,7 +57,7 @@ pub struct ChunkContainer { pub(crate) shading_functions: Vec, pub(crate) patterns: Vec, pub(crate) pages: Vec>, - pub(crate) images: Vec>, + pub(crate) images: Vec>>, pub(crate) metadata: Option, } @@ -149,7 +149,7 @@ impl ChunkContainer { ($remapper:expr, $pdf:expr; $($field:expr),+) => { $( for chunk in $field { - let chunk = chunk.wait(); + let chunk = chunk.wait().res()?; chunk.renumber_into($pdf, |old| *$remapper.get(&old).unwrap()); } )+ diff --git a/crates/krilla/src/error.rs b/crates/krilla/src/error.rs index e04de03e..37c9d0ef 100644 --- a/crates/krilla/src/error.rs +++ b/crates/krilla/src/error.rs @@ -4,6 +4,7 @@ //! invalid fonts are provided. This module provides the basic error types krilla uses. use crate::font::Font; +use crate::image::Image; use crate::validation::ValidationError; /// A wrapper type for krilla errors. @@ -22,4 +23,6 @@ pub enum KrillaError { /// /// [`SerializeSettings`]: crate::SerializeSettings ValidationError(Vec), + /// An image couldn't be processed properly. + ImageError(Image), } diff --git a/crates/krilla/src/object/image.rs b/crates/krilla/src/object/image.rs index c382a4ae..2e505943 100644 --- a/crates/krilla/src/object/image.rs +++ b/crates/krilla/src/object/image.rs @@ -10,6 +10,7 @@ // TODO: CLean up and update docs use crate::color::{ICCBasedColorSpace, ICCProfile, ICCProfileWrapper, DEVICE_CMYK, DEVICE_RGB}; +use crate::error::{KrillaError, KrillaResult}; use crate::object::color::DEVICE_GRAY; use crate::resource::RegisterableResource; use crate::serialize::SerializerContext; @@ -233,7 +234,11 @@ impl Image { self.0.color_space() } - pub(crate) fn serialize(self, sc: &mut SerializerContext, root_ref: Ref) -> Deferred { + pub(crate) fn serialize( + self, + sc: &mut SerializerContext, + root_ref: Ref, + ) -> Deferred> { let soft_mask_id = sc.new_ref(); let icc_ref = self.icc().and_then(|ic| { if sc @@ -260,7 +265,12 @@ impl Image { Deferred::new(move || { let mut chunk = Chunk::new(); - let repr = self.0.inner.wait().as_ref().unwrap(); + let repr = self + .0 + .inner + .wait() + .as_ref() + .ok_or(KrillaError::ImageError(self.clone()))?; let alpha_mask = match repr { Repr::Sampled(sampled) => sampled.mask_data.as_ref().map(|mask_data| { @@ -323,7 +333,7 @@ impl Image { } image_x_object.finish(); - chunk + Ok(chunk) }) } }