Code

remove many unnecessary to_2geom and from_2geom calls
[inkscape.git] / src / marker.cpp
index 15b85659560a1522868a59c3fcd02eb3d0f6563f..d77aa87d6430d58d01e21c052932fbbba23814ab 100644 (file)
@@ -9,17 +9,24 @@
  *
  * Copyright (C) 1999-2003 Lauris Kaplinski
  *               2004-2006 Bryce Harrington
+ *               2008      Johan Engelen
  *
  * Released under GNU GPL, read the file 'COPYING' for more information
  */
 
+#include <cstring>
+#include <string>
 #include "config.h"
 
 
 #include "libnr/nr-matrix-fns.h"
 #include "libnr/nr-matrix-ops.h"
+#include "libnr/nr-matrix-translate-ops.h"
 #include "libnr/nr-scale-matrix-ops.h"
+#include "libnr/nr-translate-matrix-ops.h"
 #include "libnr/nr-rotate-fns.h"
+#include "libnr/nr-convert2geom.h"
+#include <2geom/matrix.h>
 #include "svg/svg.h"
 #include "display/nr-arena-group.h"
 #include "xml/repr.h"
@@ -42,7 +49,7 @@ static void sp_marker_build (SPObject *object, SPDocument *document, Inkscape::X
 static void sp_marker_release (SPObject *object);
 static void sp_marker_set (SPObject *object, unsigned int key, const gchar *value);
 static void sp_marker_update (SPObject *object, SPCtx *ctx, guint flags);
-static Inkscape::XML::Node *sp_marker_write (SPObject *object, Inkscape::XML::Node *repr, guint flags);
+static Inkscape::XML::Node *sp_marker_write (SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags);
 
 static NRArenaItem *sp_marker_private_show (SPItem *item, NRArena *arena, unsigned int key, unsigned int flags);
 static void sp_marker_private_hide (SPItem *item, unsigned int key);
@@ -114,7 +121,7 @@ sp_marker_init (SPMarker *marker)
 {
        marker->viewBox_set = FALSE;
 
-       nr_matrix_set_identity (&marker->c2p);
+       marker->c2p.set_identity();
 }
 
 /**
@@ -351,7 +358,6 @@ sp_marker_update (SPObject *object, SPCtx *ctx, guint flags)
        SPItemCtx rctx;
        NRRect *vb;
        double x, y, width, height;
-       NRMatrix q;
        SPMarkerView *v;
 
        item = SP_ITEM (object);
@@ -371,7 +377,7 @@ sp_marker_update (SPObject *object, SPCtx *ctx, guint flags)
        rctx.vp.y1 = marker->markerHeight.computed;
 
        /* Start with identity transform */
-       nr_matrix_set_identity (&marker->c2p);
+       marker->c2p.set_identity();
 
        /* Viewbox is always present, either implicitly or explicitly */
        if (marker->viewBox_set) {
@@ -438,21 +444,23 @@ sp_marker_update (SPObject *object, SPCtx *ctx, guint flags)
                        break;
                }
        }
-       /* Compose additional transformation from scale and position */
-       q.c[0] = width / (vb->x1 - vb->x0);
-       q.c[1] = 0.0;
-       q.c[2] = 0.0;
-       q.c[3] = height / (vb->y1 - vb->y0);
-       q.c[4] = -vb->x0 * q.c[0] + x;
-       q.c[5] = -vb->y0 * q.c[3] + y;
-       /* Append viewbox transformation */
-       nr_matrix_multiply (&marker->c2p, &q, &marker->c2p);
 
+    {
+        NR::Matrix q;
+           /* Compose additional transformation from scale and position */
+           q[0] = width / (vb->x1 - vb->x0);
+           q[1] = 0.0;
+           q[2] = 0.0;
+           q[3] = height / (vb->y1 - vb->y0);
+           q[4] = -vb->x0 * q[0] + x;
+           q[5] = -vb->y0 * q[3] + y;
+           /* Append viewbox transformation */
+           marker->c2p = q * marker->c2p;
+    }
 
        /* Append reference translation */
        /* fixme: lala (Lauris) */
-       nr_matrix_set_translate (&q, -marker->refX.computed, -marker->refY.computed);
-       nr_matrix_multiply (&marker->c2p, &q, &marker->c2p);
+    marker->c2p = NR::translate(-marker->refX.computed, -marker->refY.computed) * marker->c2p;
 
        rctx.i2doc = marker->c2p * rctx.i2doc;
 
@@ -484,14 +492,13 @@ sp_marker_update (SPObject *object, SPCtx *ctx, guint flags)
  * Writes the object's properties into its repr object.
  */
 static Inkscape::XML::Node *
-sp_marker_write (SPObject *object, Inkscape::XML::Node *repr, guint flags)
+sp_marker_write (SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags)
 {
        SPMarker *marker;
 
        marker = SP_MARKER (object);
 
        if ((flags & SP_OBJECT_WRITE_BUILD) && !repr) {
-               Inkscape::XML::Document *xml_doc = sp_document_repr_doc(SP_OBJECT_DOCUMENT(object));
                repr = xml_doc->createElement("svg:marker");
        }
 
@@ -538,7 +545,7 @@ sp_marker_write (SPObject *object, Inkscape::XML::Node *repr, guint flags)
        repr->setAttribute("preserveAspectRatio", object->repr->attribute("preserveAspectRatio"));
 
        if (((SPObjectClass *) (parent_class))->write)
-               ((SPObjectClass *) (parent_class))->write (object, repr, flags);
+               ((SPObjectClass *) (parent_class))->write (object, xml_doc, repr, flags);
 
        return repr;
 }
@@ -624,9 +631,9 @@ sp_marker_show_dimension (SPMarker *marker, unsigned int key, unsigned int size)
  * show and transform a child item in the arena for all views with the given key.
  */
 NRArenaItem *
-sp_marker_show_instance (SPMarker *marker, NRArenaItem *parent,
-                        unsigned int key, unsigned int pos,
-                        NR::Matrix const &base, float linewidth)
+sp_marker_show_instance ( SPMarker *marker, NRArenaItem *parent,
+                          unsigned int key, unsigned int pos,
+                          Geom::Matrix const &base, float linewidth)
 {
        for (SPMarkerView *v = marker->views; v != NULL; v = v->next) {
                if (v->key == key) {
@@ -652,7 +659,7 @@ sp_marker_show_instance (SPMarker *marker, NRArenaItem *parent,
                                } else {
                                        /* fixme: Orient units (Lauris) */
                                        m = NR::Matrix(rotate_degrees(marker->orient));
-                                       m *= get_translation(base);
+                                       m *= NR::get_translation(base);
                                }
                                if (marker->markerUnits == SP_MARKER_UNITS_STROKEWIDTH) {
                                        m = NR::scale(linewidth) * m;
@@ -722,13 +729,17 @@ generate_marker (GSList *reprs, NR::Rect bounds, SPDocument *document, NR::Matri
     Inkscape::XML::Node *defsrepr = SP_OBJECT_REPR (SP_DOCUMENT_DEFS (document));
 
     Inkscape::XML::Node *repr = xml_doc->createElement("svg:marker");
-    repr->setAttribute("markerUnits", "userSpaceOnUse");
+
+    // Uncommenting this will make the marker fixed-size independent of stroke width.
+    // Commented out for consistency with standard markers which scale when you change
+    // stroke width:
+    //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);