diff options
-rw-r--r-- | src/drawing_ctx.rs | 22 | ||||
-rw-r--r-- | src/text.rs | 8 |
2 files changed, 22 insertions, 8 deletions
diff --git a/src/drawing_ctx.rs b/src/drawing_ctx.rs index c9cc9232..d6632888 100644 --- a/src/drawing_ctx.rs +++ b/src/drawing_ctx.rs @@ -358,8 +358,26 @@ impl DrawingCtx { *self.initial_viewport.vbox } - pub fn toplevel_transform(&self) -> Transform { - self.initial_viewport.transform.clone() + /// Gets the transform that will be used on the target surface, + /// whether using an isolated stacking context or not. + /// + /// This is only used in the text code, and we should probably try + /// to remove it. + pub fn get_transform_for_stacking_ctx( + &self, + stacking_ctx: &StackingContext, + ) -> Result<ValidTransform, RenderingError> { + if stacking_ctx.should_isolate() { + let affines = CompositingAffines::new( + *self.get_transform(), + self.initial_viewport.transform, + self.cr_stack.borrow().len(), + ); + + Ok(ValidTransform::try_from(affines.for_temporary_surface)?) + } else { + Ok(self.get_transform()) + } } pub fn is_measuring(&self) -> bool { diff --git a/src/text.rs b/src/text.rs index ca3598cf..77e3fb60 100644 --- a/src/text.rs +++ b/src/text.rs @@ -784,11 +784,7 @@ impl ElementTrait for Text { ); let layout_text = { - let transform = if stacking_ctx.should_isolate() { - draw_ctx.toplevel_transform() - } else { - draw_ctx.get_transform().into::<Transform>() - }; + let transform = draw_ctx.get_transform_for_stacking_ctx(&stacking_ctx)?; let layout_context = LayoutContext { writing_mode: values.writing_mode(), @@ -829,7 +825,7 @@ impl ElementTrait for Text { } } - let empty_bbox = BoundingBox::new().with_transform(transform); + let empty_bbox = BoundingBox::new().with_transform(*transform); let text_bbox = layout_spans.iter().fold(empty_bbox, |mut bbox, span| { if let Some(ref span_bbox) = span.bbox { |