diff options
| author | Marc Jeanmougin <marc@jeanmougin.fr> | 2019-07-03 23:31:12 +0000 |
|---|---|---|
| committer | Marc Jeanmougin <marc@jeanmougin.fr> | 2019-07-03 23:31:12 +0000 |
| commit | 228e7ba20476cea8f9822d34b0e5b132546a66ee (patch) | |
| tree | 749b4f7f5d3f5073ddd683e41df9cfe87d246914 /src | |
| parent | Implement fixes/suggestions by Maren (diff) | |
| download | inkscape-228e7ba20476cea8f9822d34b0e5b132546a66ee.tar.gz inkscape-228e7ba20476cea8f9822d34b0e5b132546a66ee.zip | |
Export links to pdf. Fixes https://gitlab.com/inkscape/inbox/issues/583
Diffstat (limited to 'src')
| -rw-r--r-- | src/extension/internal/cairo-render-context.cpp | 12 | ||||
| -rw-r--r-- | src/extension/internal/cairo-render-context.h | 3 | ||||
| -rw-r--r-- | 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<SPObject*> l(group->childList(false)); for(std::vector<SPObject*>::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<SPObject*> l(a->childList(false)); + ctx->tagBegin(a->href); + for(std::vector<SPObject*>::const_iterator x = l.begin(); x!= l.end(); ++x){ + SPItem *item = dynamic_cast<SPItem*>(*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<SPGroup *>(item); - if (group) { - TRACE(("group\n")); - sp_group_render(group, ctx); + SPAnchor *anchor = dynamic_cast<SPAnchor *>(item); + if (anchor) { + TRACE(("<a>\n")); + sp_anchor_render(anchor, ctx); } else { SPShape *shape = dynamic_cast<SPShape *>(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<SPGroup *>(item); + if (group) { + TRACE(("<g>\n")); + sp_group_render(group, ctx); + } + } } } } |
