sp-defs.cpp revision 0de73848362e95b081e5fa85f910d6481094b2b9
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen/*
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen * SVG <defs> implementation
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen *
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen * Authors:
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen * Lauris Kaplinski <lauris@kaplinski.com>
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen * Jon A. Cruz <jon@joncruz.org>
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould * Abhishek Sharma
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen *
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen * Copyright (C) 2000-2002 authors
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen *
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen * Released under GNU GPL, read the file 'COPYING' for more information
c0537dcfe264414d52ad86579d57cb0cb2183dcbAlex Valavanis */
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen/*
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen * fixme: We should really check childrens validity - currently everything
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen * flips in
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould */
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen#include "sp-defs.h"
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen#include "xml/repr.h"
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen#include "document.h"
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould#include "sp-factory.h"
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelennamespace {
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen SPObject* createDefs() {
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen return new SPDefs();
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen }
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen bool defsRegistered = SPFactory::instance().registerObject("svg:defs", createDefs);
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould}
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed GouldSPDefs::SPDefs() : SPObject() {
5cf332777b4c27336d64c273ac63bce3ee27a53dAlex Valavanis}
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed GouldSPDefs::~SPDefs() {
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould}
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gouldvoid SPDefs::release() {
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould SPObject::release();
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould}
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gouldvoid SPDefs::update(SPCtx *ctx, guint flags) {
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould if (flags & SP_OBJECT_MODIFIED_FLAG) {
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould flags |= SP_OBJECT_PARENT_MODIFIED_FLAG;
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould }
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould flags &= SP_OBJECT_MODIFIED_CASCADE;
d37634d73670180f99a3e0ea583621373d90ec4fJohan Engelen SelContainer l(this->childList(true));
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould l.reverse();
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould for(SelContainer::const_iterator i=l.begin();i!=l.end();i++){
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould SPObject *child = SP_OBJECT(*i);
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould if (flags || (child->uflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) {
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould child->updateDisplay(ctx, flags);
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould }
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen sp_object_unref(child);
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen }
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen}
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelenvoid SPDefs::modified(unsigned int flags) {
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould if (flags & SP_OBJECT_MODIFIED_FLAG) {
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen flags |= SP_OBJECT_PARENT_MODIFIED_FLAG;
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould }
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen flags &= SP_OBJECT_MODIFIED_CASCADE;
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould GSList *l = NULL;
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould for ( SPObject *child = this->firstChild() ; child; child = child->getNext() ) {
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould sp_object_ref(child);
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould l = g_slist_prepend(l, child);
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould }
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould l = g_slist_reverse(l);
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould
6c3e745a94ef6b25a4ef9f018d350a7535aa45afTed Gould while (l) {
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen SPObject *child = SP_OBJECT(l->data);
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen l = g_slist_remove(l, child);
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen if (flags || (child->mflags & (SP_OBJECT_MODIFIED_FLAG | SP_OBJECT_CHILD_MODIFIED_FLAG))) {
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen child->emitModified(flags);
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen }
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen sp_object_unref(child);
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen }
4b6d620057c6cbaf072607eda6d18a7934fc19c8johanengelen}
Inkscape::XML::Node* SPDefs::write(Inkscape::XML::Document *xml_doc, Inkscape::XML::Node *repr, guint flags) {
if (flags & SP_OBJECT_WRITE_BUILD) {
if (!repr) {
repr = xml_doc->createElement("svg:defs");
}
GSList *l = NULL;
for ( SPObject *child = this->firstChild() ; child; child = child->getNext() ) {
Inkscape::XML::Node *crepr = child->updateRepr(xml_doc, NULL, flags);
if (crepr) {
l = g_slist_prepend(l, crepr);
}
}
while (l) {
repr->addChild((Inkscape::XML::Node *) l->data, NULL);
Inkscape::GC::release((Inkscape::XML::Node *) l->data);
l = g_slist_remove(l, l->data);
}
} else {
for ( SPObject *child = this->firstChild() ; child; child = child->getNext() ) {
child->updateRepr(flags);
}
}
SPObject::write(xml_doc, repr, flags);
return repr;
}
/*
Local Variables:
mode:c++
c-file-style:"stroustrup"
c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
indent-tabs-mode:nil
fill-column:99
End:
*/
// vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4 :