summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMarc Jeanmougin <marc@jeanmougin.fr>2019-07-03 23:31:12 +0000
committerMarc Jeanmougin <marc@jeanmougin.fr>2019-07-03 23:31:12 +0000
commit228e7ba20476cea8f9822d34b0e5b132546a66ee (patch)
tree749b4f7f5d3f5073ddd683e41df9cfe87d246914 /src
parentImplement fixes/suggestions by Maren (diff)
downloadinkscape-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.cpp12
-rw-r--r--src/extension/internal/cairo-render-context.h3
-rw-r--r--src/extension/internal/cairo-renderer.cpp36
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);
+ }
+ }
}
}
}