From 228e7ba20476cea8f9822d34b0e5b132546a66ee Mon Sep 17 00:00:00 2001 From: Marc Jeanmougin Date: Thu, 4 Jul 2019 01:31:12 +0200 Subject: Export links to pdf. Fixes https://gitlab.com/inkscape/inbox/issues/583 --- src/extension/internal/cairo-render-context.cpp | 12 +++++++++ src/extension/internal/cairo-render-context.h | 3 +++ src/extension/internal/cairo-renderer.cpp | 36 ++++++++++++++++++++----- 3 files changed, 45 insertions(+), 6 deletions(-) diff --git a/src/extension/internal/cairo-render-context.cpp b/src/extension/internal/cairo-render-context.cpp index db0a6867e..99f667813 100644 --- a/src/extension/internal/cairo-render-context.cpp +++ b/src/extension/internal/cairo-render-context.cpp @@ -752,6 +752,18 @@ CairoRenderContext::popLayer() cairo_paint_with_alpha(_cr, opacity); } } +void CairoRenderContext::tagBegin(const char* l){ + char link[1000] = "uri='"; + if(strlen(l)<990) + strcat(link, l); + strcat(link, "'"); + cairo_tag_begin(_cr, CAIRO_TAG_LINK, link); +} + +void CairoRenderContext::tagEnd(){ + cairo_tag_end(_cr, CAIRO_TAG_LINK); +} + void CairoRenderContext::addClipPath(Geom::PathVector const &pv, SPIEnum const *fill_rule) diff --git a/src/extension/internal/cairo-render-context.h b/src/extension/internal/cairo-render-context.h index 57b4926a3..12cdb522d 100644 --- a/src/extension/internal/cairo-render-context.h +++ b/src/extension/internal/cairo-render-context.h @@ -128,6 +128,9 @@ public: void pushLayer(); void popLayer(); + void tagBegin(const char* link); + void tagEnd(); + /* Graphics state manipulation */ void pushState(); void popState(); diff --git a/src/extension/internal/cairo-renderer.cpp b/src/extension/internal/cairo-renderer.cpp index 3f045f42b..6dc3ca4be 100644 --- a/src/extension/internal/cairo-renderer.cpp +++ b/src/extension/internal/cairo-renderer.cpp @@ -39,6 +39,7 @@ #include "display/curve.h" #include "display/canvas-bpath.h" #include "display/cairo-utils.h" +#include "object/sp-anchor.h" #include "object/sp-item.h" #include "object/sp-item-group.h" #include "object/sp-marker.h" @@ -131,6 +132,7 @@ Here comes the rendering part which could be put into the 'render' methods of SP /* The below functions are copy&pasted plus slightly modified from *_invoke_print functions. */ static void sp_item_invoke_render(SPItem *item, CairoRenderContext *ctx); static void sp_group_render(SPGroup *group, CairoRenderContext *ctx); +static void sp_anchor_render(SPAnchor *a, CairoRenderContext *ctx); static void sp_use_render(SPUse *use, CairoRenderContext *ctx); static void sp_shape_render(SPShape *shape, CairoRenderContext *ctx); static void sp_text_render(SPText *text, CairoRenderContext *ctx); @@ -303,7 +305,7 @@ static void sp_shape_render(SPShape *shape, CairoRenderContext *ctx) static void sp_group_render(SPGroup *group, CairoRenderContext *ctx) { CairoRenderer *renderer = ctx->getRenderer(); - TRACE(("sp_group_render opacity: %f\n", SP_SCALE24_TO_FLOAT(item->style->opacity.value))); + //TRACE(("sp_group_render opacity: %f\n", SP_SCALE24_TO_FLOAT(item->style->opacity.value))); std::vector l(group->childList(false)); for(std::vector::const_iterator x = l.begin(); x!= l.end(); ++x){ @@ -378,6 +380,22 @@ static void sp_image_render(SPImage *image, CairoRenderContext *ctx) ctx->renderImage(image->pixbuf, t, image->style); } +static void sp_anchor_render(SPAnchor *a, CairoRenderContext *ctx) +{ + CairoRenderer *renderer = ctx->getRenderer(); + //TRACE(("sp_group_render opacity: %f\n", SP_SCALE24_TO_FLOAT(item->style->opacity.value))); + + std::vector l(a->childList(false)); + ctx->tagBegin(a->href); + for(std::vector::const_iterator x = l.begin(); x!= l.end(); ++x){ + SPItem *item = dynamic_cast(*x); + if (item) { + renderer->renderItem(ctx, item); + } + } + ctx->tagEnd(); +} + static void sp_symbol_render(SPSymbol *symbol, CairoRenderContext *ctx) { if (!symbol->cloned) { @@ -534,10 +552,10 @@ static void sp_item_invoke_render(SPItem *item, CairoRenderContext *ctx) TRACE(("symbol\n")); sp_symbol_render(symbol, ctx); } else { - SPGroup *group = dynamic_cast(item); - if (group) { - TRACE(("group\n")); - sp_group_render(group, ctx); + SPAnchor *anchor = dynamic_cast(item); + if (anchor) { + TRACE(("\n")); + sp_anchor_render(anchor, ctx); } else { SPShape *shape = dynamic_cast(item); if (shape) { @@ -564,7 +582,13 @@ static void sp_item_invoke_render(SPItem *item, CairoRenderContext *ctx) if (image) { TRACE(("image\n")); sp_image_render(image, ctx); - } + } else { + SPGroup *group = dynamic_cast(item); + if (group) { + TRACE(("\n")); + sp_group_render(group, ctx); + } + } } } } -- cgit v1.2.3