summaryrefslogtreecommitdiffstats
path: root/src/marker.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/marker.cpp')
-rw-r--r--src/marker.cpp35
1 files changed, 35 insertions, 0 deletions
diff --git a/src/marker.cpp b/src/marker.cpp
index 1fb758462..5cc63d9d7 100644
--- a/src/marker.cpp
+++ b/src/marker.cpp
@@ -26,6 +26,7 @@
#include "attributes.h"
#include "marker.h"
#include "document.h"
+#include "document-private.h"
struct SPMarkerView {
SPMarkerView *next;
@@ -713,3 +714,37 @@ sp_marker_view_remove (SPMarker *marker, SPMarkerView *view, unsigned int destro
}
g_free (view);
}
+
+const gchar *
+generate_marker (GSList *reprs, NR::Rect bounds, SPDocument *document, NR::Matrix transform, NR::Matrix move)
+{
+ Inkscape::XML::Document *xml_doc = sp_document_repr_doc(document);
+ Inkscape::XML::Node *defsrepr = SP_OBJECT_REPR (SP_DOCUMENT_DEFS (document));
+
+ Inkscape::XML::Node *repr = xml_doc->createElement("svg:marker");
+ repr->setAttribute("markerUnits", "userSpaceOnUse");
+ sp_repr_set_svg_double(repr, "markerWidth", bounds.extent(NR::X));
+ sp_repr_set_svg_double(repr, "markerHeight", bounds.extent(NR::Y));
+
+ repr->setAttribute("orient", "auto");
+
+
+ defsrepr->appendChild(repr);
+ const gchar *mark_id = repr->attribute("id");
+ SPObject *mark_object = document->getObjectById(mark_id);
+
+ for (GSList *i = reprs; i != NULL; i = i->next) {
+ Inkscape::XML::Node *node = (Inkscape::XML::Node *)(i->data);
+ SPItem *copy = SP_ITEM(mark_object->appendChildRepr(node));
+
+ NR::Matrix dup_transform;
+ if (!sp_svg_transform_read (node->attribute("transform"), &dup_transform))
+ dup_transform = NR::identity();
+ dup_transform *= move;
+
+ sp_item_write_transform(copy, SP_OBJECT_REPR(copy), dup_transform);
+ }
+
+ Inkscape::GC::release(repr);
+ return mark_id;
+}