X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=src%2Fsp-root.cpp;h=81d71044d9a8830afb05dbee053826e275069ace;hb=e0c38bd294fd720cebbabeda1a0d87259f68bf7f;hp=d6e423edcabf53582627a1fdbc18fdaa5bae5552;hpb=3caca4f8381f7ae35678d16074c2414c02a0c0ff;p=inkscape.git diff --git a/src/sp-root.cpp b/src/sp-root.cpp index d6e423edc..81d71044d 100644 --- a/src/sp-root.cpp +++ b/src/sp-root.cpp @@ -13,7 +13,12 @@ * Released under GNU GPL, read the file 'COPYING' for more information */ -#include "config.h" +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include #include "svg/svg.h" #include "display/nr-arena-group.h" @@ -43,10 +48,9 @@ static void sp_root_child_added(SPObject *object, Inkscape::XML::Node *child, In static void sp_root_remove_child(SPObject *object, Inkscape::XML::Node *child); static void sp_root_update(SPObject *object, SPCtx *ctx, guint flags); static void sp_root_modified(SPObject *object, guint flags); -static Inkscape::XML::Node *sp_root_write(SPObject *object, Inkscape::XML::Node *repr, guint flags); +static Inkscape::XML::Node *sp_root_write(SPObject *object, Inkscape::XML::Document *doc, Inkscape::XML::Node *repr, guint flags); static NRArenaItem *sp_root_show(SPItem *item, NRArena *arena, unsigned int key, unsigned int flags); -static void sp_root_bbox(SPItem const *item, NRRect *bbox, NR::Matrix const &transform, unsigned const flags); static void sp_root_print(SPItem *item, SPPrintContext *ctx); static SPGroupClass *parent_class; @@ -101,7 +105,6 @@ sp_root_class_init(SPRootClass *klass) sp_object_class->write = sp_root_write; sp_item_class->show = sp_root_show; - sp_item_class->bbox = sp_root_bbox; sp_item_class->print = sp_root_print; } @@ -123,10 +126,10 @@ sp_root_init(SPRoot *root) root->width.unset(SVGLength::PERCENT, 1.0, 1.0); root->height.unset(SVGLength::PERCENT, 1.0, 1.0); - /* nr_matrix_set_identity(&root->viewbox); */ + /* root->viewbox.set_identity(); */ root->viewBox_set = FALSE; - root->c2p.set_identity(); + root->c2p.setIdentity(); root->defs = NULL; } @@ -157,6 +160,7 @@ sp_root_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) sp_object_read_attr(object, "height"); sp_object_read_attr(object, "viewBox"); sp_object_read_attr(object, "preserveAspectRatio"); + sp_object_read_attr(object, "onload"); if (((SPObjectClass *) parent_class)->build) (* ((SPObjectClass *) parent_class)->build) (object, document, repr); @@ -170,7 +174,7 @@ sp_root_build(SPObject *object, SPDocument *document, Inkscape::XML::Node *repr) } // clear transform, if any was read in - SVG does not allow transform= on - SP_ITEM(object)->transform = NR::identity(); + SP_ITEM(object)->transform = Geom::identity(); } /** @@ -303,7 +307,7 @@ sp_root_set(SPObject *object, unsigned int key, gchar const *value) align = SP_ASPECT_XMIN_YMID; } else if (!strcmp(c, "xMidYMid")) { align = SP_ASPECT_XMID_YMID; - } else if (!strcmp(c, "xMaxYMin")) { + } else if (!strcmp(c, "xMaxYMid")) { align = SP_ASPECT_XMAX_YMID; } else if (!strcmp(c, "xMinYMax")) { align = SP_ASPECT_XMIN_YMAX; @@ -316,7 +320,7 @@ sp_root_set(SPObject *object, unsigned int key, gchar const *value) } clip = SP_ASPECT_MEET; while (*e && *e == 32) e += 1; - if (e) { + if (*e) { if (!strcmp(e, "meet")) { clip = SP_ASPECT_MEET; } else if (!strcmp(e, "slice")) { @@ -330,6 +334,9 @@ sp_root_set(SPObject *object, unsigned int key, gchar const *value) root->aspect_clip = clip; } break; + case SP_ATTR_ONLOAD: + root->onload = (char *) value; + break; default: /* Pass the set event to the parent */ if (((SPObjectClass *) parent_class)->set) { @@ -353,9 +360,9 @@ sp_root_child_added(SPObject *object, Inkscape::XML::Node *child, Inkscape::XML: (* ((SPObjectClass *) (parent_class))->child_added)(object, child, ref); SPObject *co = object->document->getObjectByRepr(child); - g_assert(co != NULL); + g_assert (co != NULL || !strcmp("comment", child->name())); // comment repr node has no object - if (SP_IS_DEFS(co)) { + if (co && SP_IS_DEFS(co)) { SPObject *c; /* We search for first node - it is not beautiful, but works */ for (c = sp_object_first_child(SP_OBJECT(group)) ; c != NULL; c = SP_OBJECT_NEXT(c) ) { @@ -425,7 +432,7 @@ sp_root_update(SPObject *object, SPCtx *ctx, guint flags) SPItemCtx rctx = *ictx; /* Calculate child to parent transformation */ - root->c2p.set_identity(); + root->c2p.setIdentity(); if (object->parent) { /* @@ -435,8 +442,8 @@ sp_root_update(SPObject *object, SPCtx *ctx, guint flags) * fixme: height seems natural, as this makes the inner svg element * fixme: self-contained. The spec is vague here. */ - root->c2p = NR::Matrix(NR::translate(root->x.computed, - root->y.computed)); + root->c2p = Geom::Matrix(Geom::Translate(root->x.computed, + root->y.computed)); } if (root->viewBox_set) { @@ -503,17 +510,17 @@ sp_root_update(SPObject *object, SPCtx *ctx, guint flags) } /* Compose additional transformation from scale and position */ - NR::Point const viewBox_min(root->viewBox.x0, + Geom::Point const viewBox_min(root->viewBox.x0, root->viewBox.y0); - NR::Point const viewBox_max(root->viewBox.x1, + Geom::Point const viewBox_max(root->viewBox.x1, root->viewBox.y1); - NR::scale const viewBox_length( viewBox_max - viewBox_min ); - NR::scale const new_length(width, height); + Geom::Scale const viewBox_length( viewBox_max - viewBox_min ); + Geom::Scale const new_length(width, height); /* Append viewbox transformation */ /* TODO: The below looks suspicious to me (pjrm): I wonder whether the RHS expression should have c2p at the beginning rather than at the end. Test it. */ - root->c2p = NR::translate(-viewBox_min) * ( new_length / viewBox_length ) * NR::translate(x, y) * root->c2p; + root->c2p = Geom::Translate(-viewBox_min) * ( new_length * viewBox_length.inverse() ) * Geom::Translate(x, y) * root->c2p; } rctx.i2doc = root->c2p * rctx.i2doc; @@ -537,7 +544,7 @@ sp_root_update(SPObject *object, SPCtx *ctx, guint flags) rctx.vp.y1 = root->height.computed; } - rctx.i2vp = NR::identity(); + rctx.i2vp = Geom::identity(); /* And invoke parent method */ if (((SPObjectClass *) (parent_class))->update) @@ -572,12 +579,11 @@ sp_root_modified(SPObject *object, guint flags) * Writes the object into the repr object, then calls the parent's write routine. */ static Inkscape::XML::Node * -sp_root_write(SPObject *object, Inkscape::XML::Node *repr, guint flags) +sp_root_write(SPObject *object, Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) { SPRoot *root = SP_ROOT(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:svg"); } @@ -606,7 +612,7 @@ sp_root_write(SPObject *object, Inkscape::XML::Node *repr, guint flags) } if (((SPObjectClass *) (parent_class))->write) - ((SPObjectClass *) (parent_class))->write(object, repr, flags); + ((SPObjectClass *) (parent_class))->write(object, xml_doc, repr, flags); return repr; } @@ -632,22 +638,6 @@ sp_root_show(SPItem *item, NRArena *arena, unsigned int key, unsigned int flags) return ai; } -/** - * Virtual bbox callback. - */ -static void -sp_root_bbox(SPItem const *item, NRRect *bbox, NR::Matrix const &transform, unsigned const flags) -{ - SPRoot const *root = SP_ROOT(item); - - if (((SPItemClass *) (parent_class))->bbox) { - NR::Matrix const product( root->c2p * transform ); - ((SPItemClass *) (parent_class))->bbox(item, bbox, - product, - flags); - } -} - /** * Virtual print callback. */