diff --git a/src/extension/internal/cairo-render-context.cpp b/src/extension/internal/cairo-render-context.cpp index db4b3a20c1eb73acc912898d473865d14570eb8d..306423f983d0fd636633361d67841abaacb614f9 100644 --- a/src/extension/internal/cairo-render-context.cpp +++ b/src/extension/internal/cairo-render-context.cpp @@ -625,8 +625,14 @@ CairoRenderContext::popLayer(cairo_operator_t composite) // If a mask won't be applied set opacity too. (The clip is represented by a solid Cairo mask.) cairo_set_source_rgba(clip_ctx->_cr, 1.0, 1.0, 1.0, mask ? 1.0 : opacity); - // It must be copied before pushState and stored after. - auto item_transform = getItemTransform(); + // copy over the correct CTM + // It must be stored in item_transform of current state after pushState. + Geom::Affine item_transform; + if (_state->parent_has_userspace) + item_transform = getParentState()->transform * _state->item_transform; + else + item_transform = _state->item_transform; + // apply the clip path clip_ctx->pushState(); clip_ctx->getCurrentState()->item_transform = item_transform; @@ -669,7 +675,6 @@ CairoRenderContext::popLayer(cairo_operator_t composite) // copy the correct CTM to mask context mask_ctx->setTransform(_state->parent_has_userspace ? _state->item_transform * getParentState()->transform : _state->transform); - // render mask contents to mask_ctx _renderer->applyMask(mask_ctx, mask); @@ -1072,13 +1077,6 @@ Geom::Affine CairoRenderContext::getTransform() const return ret; } -Geom::Affine CairoRenderContext::getItemTransform() const -{ - if (_state->parent_has_userspace) - return getParentTransform() * _state->item_transform; - return _state->item_transform; -} - Geom::Affine CairoRenderContext::getParentTransform() const { g_assert( _is_valid ); diff --git a/src/extension/internal/cairo-render-context.h b/src/extension/internal/cairo-render-context.h index dd63316de00a62d3fb387a102ff175e621581e8f..eedebc4e5258a85a09e7459209fe7d285d3564e0 100644 --- a/src/extension/internal/cairo-render-context.h +++ b/src/extension/internal/cairo-render-context.h @@ -157,7 +157,6 @@ public: void transform(Geom::Affine const &transform); void setTransform(Geom::Affine const &transform); Geom::Affine getTransform() const; - Geom::Affine getItemTransform() const; Geom::Affine getParentTransform() const; /* Clipping methods */ diff --git a/src/extension/internal/cairo-renderer.cpp b/src/extension/internal/cairo-renderer.cpp index fd401b1cfce4f9e69c544f1815694f6a7d8c1b80..6e3e49288adc7af74448c5a2a1cf4239cfc99f3d 100644 --- a/src/extension/internal/cairo-renderer.cpp +++ b/src/extension/internal/cairo-renderer.cpp @@ -477,9 +477,8 @@ static void sp_anchor_render(SPAnchor const *a, CairoRenderContext *ctx, SPItem } // Write a box for this hyperlink so it's contained and positioned correctly. if (auto vbox = a->visualBounds()) { - // Convert from 92dpi (svg) to 72dpi (pdf) and apply item transforms as we are writing out the box directly. - auto static doc_scale = Geom::Scale(72.0 / 96.0); - auto bbox = *vbox * ctx->getItemTransform() * doc_scale; + // Apply transforms as we are writing out the box directly. + auto bbox = *vbox * ctx->getTransform(); link += Glib::ustring::compose(" rect=[%1 %2 %3 %4]", bbox.left(), bbox.top(), bbox.width(), bbox.height()); } ctx->tagBegin(link.c_str());