From e8b17731c1d261396091f2ce1e0a298edeadeb80 Mon Sep 17 00:00:00 2001 From: bulia byak Date: Sun, 31 Aug 2008 20:04:13 +0000 Subject: properly transform clippath: transform of the item using the clippath must also be applied (bzr r6739) --- src/extension/internal/cairo-renderer.cpp | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) (limited to 'src/extension/internal/cairo-renderer.cpp') diff --git a/src/extension/internal/cairo-renderer.cpp b/src/extension/internal/cairo-renderer.cpp index 8d4b95f85..be9953ae1 100644 --- a/src/extension/internal/cairo-renderer.cpp +++ b/src/extension/internal/cairo-renderer.cpp @@ -586,6 +586,7 @@ CairoRenderer::setStateForItem(CairoRenderContext *ctx, SPItem const *item) CairoRenderState *state = ctx->getCurrentState(); state->clip_path = item->clip_ref->getObject(); state->mask = item->mask_ref->getObject(); + state->item_transform = Geom::Matrix (item->transform); // If parent_has_userspace is true the parent state's transform // has to be used for the mask's/clippath's context. @@ -696,7 +697,17 @@ CairoRenderer::applyClipPath(CairoRenderContext *ctx, SPClipPath const *cp) for (SPObject *child = sp_object_first_child(co) ; child != NULL; child = SP_OBJECT_NEXT(child) ) { if (SP_IS_ITEM(child)) { SPItem *item = SP_ITEM(child); - renderItem(ctx, item); + + // combine transform of the item in clippath and the item using clippath: + Geom::Matrix tempmat (item->transform); + tempmat = tempmat * (ctx->getCurrentState()->item_transform); + + // render this item in clippath + ctx->pushState(); + ctx->transform(&tempmat); + setStateForItem(ctx, item); + sp_item_invoke_render(item, ctx); + ctx->popState(); } } TRACE(("END clip\n")); -- cgit v1.2.3