summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorbulia byak <buliabyak@gmail.com>2008-08-31 20:04:13 +0000
committerbuliabyak <buliabyak@users.sourceforge.net>2008-08-31 20:04:13 +0000
commite8b17731c1d261396091f2ce1e0a298edeadeb80 (patch)
tree0f348d83648bec526023496327ce00a09e4b62f0 /src
parentremove unused include files and methods (diff)
downloadinkscape-e8b17731c1d261396091f2ce1e0a298edeadeb80.tar.gz
inkscape-e8b17731c1d261396091f2ce1e0a298edeadeb80.zip
properly transform clippath: transform of the item using the clippath must also be applied
(bzr r6739)
Diffstat (limited to 'src')
-rw-r--r--src/extension/internal/cairo-render-context.h1
-rw-r--r--src/extension/internal/cairo-renderer.cpp13
2 files changed, 13 insertions, 1 deletions
diff --git a/src/extension/internal/cairo-render-context.h b/src/extension/internal/cairo-render-context.h
index e92418085..d3d4ddd56 100644
--- a/src/extension/internal/cairo-render-context.h
+++ b/src/extension/internal/cairo-render-context.h
@@ -55,6 +55,7 @@ struct CairoRenderState {
unsigned int parent_has_userspace : 1; // whether the parent's ctm should be applied
float opacity;
bool has_filtereffect;
+ Geom::Matrix item_transform; // this item's item->transform, for correct clipping
SPClipPath *clip_path;
SPMask* mask;
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"));