diff options
| author | Markus Engel <markus.engel@tum.de> | 2013-04-02 18:45:20 +0000 |
|---|---|---|
| committer | Markus Engel <markus.engel@tum.de> | 2013-04-02 18:45:20 +0000 |
| commit | 0a7e23844c3a43203de3f5207aecb278e84ee739 (patch) | |
| tree | 73368a7dd8367c23599f0027d63c1c0a06638865 /src | |
| parent | Registered classes with new factory. Hkern, Vkern and FeFuncX have to be rewr... (diff) | |
| download | inkscape-0a7e23844c3a43203de3f5207aecb278e84ee739.tar.gz inkscape-0a7e23844c3a43203de3f5207aecb278e84ee739.zip | |
Added virtual destructor to SPObject. Switched to new factory. Replaced some casts. Inkscape seems stable, car.svgz renders correctly to png.
(bzr r11608.1.70)
Diffstat (limited to 'src')
| -rw-r--r-- | src/box3d-side.h | 3 | ||||
| -rw-r--r-- | src/filters/pointlight.cpp | 2 | ||||
| -rw-r--r-- | src/sp-ellipse.h | 13 | ||||
| -rw-r--r-- | src/sp-factory.cpp | 51 | ||||
| -rw-r--r-- | src/sp-factory.h | 8 | ||||
| -rw-r--r-- | src/sp-item.h | 3 | ||||
| -rw-r--r-- | src/sp-line.h | 3 | ||||
| -rw-r--r-- | src/sp-lpe-item.h | 3 | ||||
| -rw-r--r-- | src/sp-namedview.cpp | 11 | ||||
| -rw-r--r-- | src/sp-object-repr.cpp | 169 | ||||
| -rw-r--r-- | src/sp-object.cpp | 42 | ||||
| -rw-r--r-- | src/sp-object.h | 7 | ||||
| -rw-r--r-- | src/sp-offset.h | 3 | ||||
| -rw-r--r-- | src/sp-path.h | 3 | ||||
| -rw-r--r-- | src/sp-polygon.h | 3 | ||||
| -rw-r--r-- | src/sp-polyline.h | 3 | ||||
| -rw-r--r-- | src/sp-rect.h | 3 | ||||
| -rw-r--r-- | src/sp-shape.cpp | 2 | ||||
| -rw-r--r-- | src/sp-shape.h | 3 | ||||
| -rw-r--r-- | src/sp-spiral.h | 4 | ||||
| -rw-r--r-- | src/sp-star.h | 3 | ||||
| -rw-r--r-- | src/sp-string.cpp | 9 | ||||
| -rw-r--r-- | src/sp-use.cpp | 34 |
23 files changed, 257 insertions, 128 deletions
diff --git a/src/box3d-side.h b/src/box3d-side.h index c674e19db..641bfd78a 100644 --- a/src/box3d-side.h +++ b/src/box3d-side.h @@ -18,7 +18,8 @@ #define SP_TYPE_BOX3D_SIDE (box3d_side_get_type ()) #define SP_BOX3D_SIDE(obj) ((Box3DSide*)obj) -#define SP_IS_BOX3D_SIDE(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(Box3DSide))) +//#define SP_IS_BOX3D_SIDE(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(Box3DSide))) +#define SP_IS_BOX3D_SIDE(obj) (dynamic_cast<const Box3DSide*>((SPObject*)obj)) class SPBox3D; struct Persp3D; diff --git a/src/filters/pointlight.cpp b/src/filters/pointlight.cpp index 371166880..659727d5f 100644 --- a/src/filters/pointlight.cpp +++ b/src/filters/pointlight.cpp @@ -32,7 +32,7 @@ #include "sp-factory.h" namespace { - SPObject* createpPointLight() { + SPObject* createPointLight() { return new SPFePointLight(); } diff --git a/src/sp-ellipse.h b/src/sp-ellipse.h index fda6d564c..3b0c0f4c3 100644 --- a/src/sp-ellipse.h +++ b/src/sp-ellipse.h @@ -23,7 +23,9 @@ G_BEGIN_DECLS #define SP_TYPE_GENERICELLIPSE (sp_genericellipse_get_type ()) #define SP_GENERICELLIPSE(obj) ((SPGenericEllipse*)obj) -#define SP_IS_GENERICELLIPSE(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPGenericEllipse))) +//#define SP_IS_GENERICELLIPSE(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPGenericEllipse))) + +#define SP_IS_GENERICELLIPSE(obj) (dynamic_cast<const SPGenericEllipse*>((SPObject*)obj)) class CGenericEllipse; @@ -73,7 +75,8 @@ void sp_genericellipse_normalize (SPGenericEllipse *ellipse); #define SP_TYPE_ELLIPSE (sp_ellipse_get_type ()) #define SP_ELLIPSE(obj) ((SPEllipse*)obj) -#define SP_IS_ELLIPSE(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPEllipse))) +//#define SP_IS_ELLIPSE(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPEllipse))) +#define SP_IS_ELLIPSE(obj) (dynamic_cast<const SPEllipse*>((SPObject*)obj)) class CEllipse; @@ -111,7 +114,8 @@ void sp_ellipse_position_set (SPEllipse * ellipse, gdouble x, gdouble y, gdouble #define SP_TYPE_CIRCLE (sp_circle_get_type ()) #define SP_CIRCLE(obj) ((SPCircle*)obj) -#define SP_IS_CIRCLE(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPCircle))) +//#define SP_IS_CIRCLE(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPCircle))) +#define SP_IS_CIRCLE(obj) (dynamic_cast<const SPCircle*>((SPObject*)obj)) class CCircle; @@ -147,7 +151,8 @@ GType sp_circle_get_type (void); #define SP_TYPE_ARC (sp_arc_get_type ()) #define SP_ARC(obj) ((SPArc*)obj) -#define SP_IS_ARC(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPArc))) +//#define SP_IS_ARC(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPArc))) +#define SP_IS_ARC(obj) (dynamic_cast<const SPArc*>((SPObject*)obj)) class CArc; diff --git a/src/sp-factory.cpp b/src/sp-factory.cpp index 192f092ed..a8d9d9f5f 100644 --- a/src/sp-factory.cpp +++ b/src/sp-factory.cpp @@ -3,6 +3,7 @@ #include <stdexcept> #include "sp-object.h" +#include "xml/node.h" SPFactory& SPFactory::instance() { static SPFactory factory; @@ -13,16 +14,52 @@ bool SPFactory::registerObject(std::string id, CreateObjectMethod* createFunctio return this->objectMap.insert(std::make_pair(id, createFunction)).second; } -SPObject* SPFactory::createObject(std::string id) const { - std::map<std::string, CreateObjectMethod*>::const_iterator entry = this->objectMap.find(id); +SPObject* SPFactory::createObject(const Inkscape::XML::Node& id) const { + std::map<std::string, CreateObjectMethod*>::const_iterator entry; + + if (id.type() == Inkscape::XML::TEXT_NODE) { + entry = this->objectMap.find("string"); + } else if (id.type() == Inkscape::XML::ELEMENT_NODE) { + gchar const* const type_name = id.attribute("sodipodi:type"); + + if (type_name) { + entry = this->objectMap.find(type_name); + } else { + entry = this->objectMap.find(id.name()); + } + } else { + entry = this->objectMap.end(); + } + + if (entry == this->objectMap.end()) { + g_warning("Factory: Type \"%s\" not registered!", id.name()); - if (entry == objectMap.end()) { - //g_warning("Factory: Type \"%s\" not registered!", id.c_str()); -// SPObject* o = new SPObject(); -// -// return o; return 0; } return (entry->second)(); + +// std::map<std::string, CreateObjectMethod*>::const_iterator entry = this->objectMap.find(id); +// +// if (entry == objectMap.end()) { +// g_warning("Factory: Type \"%s\" not registered!", id.c_str()); +// +// SPObject* o = new SPObject(); +// return o; +// } +// +// return (entry->second)(); } + +/* + * if ( repr->type() == Inkscape::XML::TEXT_NODE ) { + return SP_TYPE_STRING; + } else if ( repr->type() == Inkscape::XML::ELEMENT_NODE ) { + gchar const * const type_name = repr->attribute("sodipodi:type"); + return ( type_name + ? name_to_gtype(SODIPODI_TYPE, type_name) + : name_to_gtype(REPR_NAME, repr->name()) ); + } else { + return 0; + } + */ diff --git a/src/sp-factory.h b/src/sp-factory.h index d4639836f..24e3c412a 100644 --- a/src/sp-factory.h +++ b/src/sp-factory.h @@ -5,6 +5,12 @@ class SPObject; +namespace Inkscape { + namespace XML { + class Node; + } +} + /** * Factory for creating objects from the SPObject tree. */ @@ -15,7 +21,7 @@ public: typedef SPObject* CreateObjectMethod(); bool registerObject(std::string id, CreateObjectMethod* createFunction); - SPObject* createObject(std::string id) const; + SPObject* createObject(const Inkscape::XML::Node& id) const; private: std::map<std::string, CreateObjectMethod*> objectMap; diff --git a/src/sp-item.h b/src/sp-item.h index 40914dd11..02bd10a8b 100644 --- a/src/sp-item.h +++ b/src/sp-item.h @@ -105,7 +105,8 @@ class CItem; #define SP_TYPE_ITEM (sp_item_get_type ()) #define SP_ITEM(obj) ((SPItem*)obj) -#define SP_IS_ITEM(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPItem))) +//#define SP_IS_ITEM(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPItem))) +#define SP_IS_ITEM(obj) (dynamic_cast<const SPItem*>((SPObject*)obj)) GType sp_item_get_type() G_GNUC_CONST; diff --git a/src/sp-line.h b/src/sp-line.h index e06ba886d..305f67cd5 100644 --- a/src/sp-line.h +++ b/src/sp-line.h @@ -21,7 +21,8 @@ #define SP_TYPE_LINE (sp_line_get_type()) #define SP_LINE(obj) ((SPLine*)obj) -#define SP_IS_LINE(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPLine))) +//#define SP_IS_LINE(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPLine))) +#define SP_IS_LINE(obj) (dynamic_cast<const SPLine*>((SPObject*)obj)) class SPLine; class SPLineClass; diff --git a/src/sp-lpe-item.h b/src/sp-lpe-item.h index c10dff0c5..322f767b5 100644 --- a/src/sp-lpe-item.h +++ b/src/sp-lpe-item.h @@ -20,7 +20,8 @@ #define SP_TYPE_LPE_ITEM (sp_lpe_item_get_type()) #define SP_LPE_ITEM(obj) ((SPLPEItem*)obj) -#define SP_IS_LPE_ITEM(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPLPEItem))) +//#define SP_IS_LPE_ITEM(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPLPEItem))) +#define SP_IS_LPE_ITEM(obj) (dynamic_cast<const SPLPEItem*>((SPObject*)obj)) class CLPEItem; class LivePathEffectObject; diff --git a/src/sp-namedview.cpp b/src/sp-namedview.cpp index 0387e45bf..762f56257 100644 --- a/src/sp-namedview.cpp +++ b/src/sp-namedview.cpp @@ -55,6 +55,17 @@ static void sp_namedview_show_single_guide(SPGuide* guide, bool show); static gboolean sp_str_to_bool(const gchar *str); static gboolean sp_nv_read_opacity(const gchar *str, guint32 *color); +#include "sp-factory.h" + +namespace { + SPObject* createNamedView() { + return new SPNamedView(); + } + + bool namedViewRegistered = SPFactory::instance().registerObject("sodipodi:namedview", createNamedView); +} + + G_DEFINE_TYPE(SPNamedView, sp_namedview, G_TYPE_OBJECT); static void sp_namedview_class_init(SPNamedViewClass * klass) diff --git a/src/sp-object-repr.cpp b/src/sp-object-repr.cpp index 02114aabc..c3d60c5e8 100644 --- a/src/sp-object-repr.cpp +++ b/src/sp-object-repr.cpp @@ -84,6 +84,7 @@ #include "sp-title.h" #include "sp-desc.h" +#include "sp-factory.h" enum NameType { REPR_NAME, SODIPODI_TYPE }; static unsigned const N_NAME_TYPES = SODIPODI_TYPE + 1; @@ -97,12 +98,16 @@ SPRoot *sp_object_repr_build_tree(SPDocument *document, Inkscape::XML::Node *rep gchar const * const name = repr->name(); g_assert(name != NULL); - GType const type = name_to_gtype(REPR_NAME, name); - g_assert(g_type_is_a(type, SP_TYPE_ROOT)); - gpointer newobj = g_object_new(type, 0); - g_assert(newobj != NULL); - SPObject *const object = SP_OBJECT(newobj); - g_assert(object != NULL); + +// GType const type = name_to_gtype(REPR_NAME, name); +// g_assert(g_type_is_a(type, SP_TYPE_ROOT)); +// gpointer newobj = g_object_new(type, 0); +// g_assert(newobj != NULL); +// SPObject *const object = SP_OBJECT(newobj); +// g_assert(object != NULL); + + SPObject* object = SPFactory::instance().createObject(*repr); + object->invoke_build(document, repr, FALSE); return SP_ROOT(object); @@ -130,93 +135,93 @@ populate_dtables() { struct NameTypeEntry { char const *const name; GType const type_id; }; NameTypeEntry const repr_name_entries[] = { - //{ "svg:a", SP_TYPE_ANCHOR }, + { "svg:a", SP_TYPE_ANCHOR }, //{ "svg:animate", SP_TYPE_ANIMATE }, - //{ "svg:circle", SP_TYPE_CIRCLE }, - //{ "svg:color-profile", COLORPROFILE_TYPE }, - //{ "svg:clipPath", SP_TYPE_CLIPPATH }, - //{ "svg:defs", SP_TYPE_DEFS }, - //{ "svg:desc", SP_TYPE_DESC }, - //{ "svg:ellipse", SP_TYPE_ELLIPSE }, - //{ "svg:filter", SP_TYPE_FILTER }, + { "svg:circle", SP_TYPE_CIRCLE }, + { "svg:color-profile", COLORPROFILE_TYPE }, + { "svg:clipPath", SP_TYPE_CLIPPATH }, + { "svg:defs", SP_TYPE_DEFS }, + { "svg:desc", SP_TYPE_DESC }, + { "svg:ellipse", SP_TYPE_ELLIPSE }, + { "svg:filter", SP_TYPE_FILTER }, /* Note: flow* elements are proposed additions for SVG 1.2, they aren't in SVG 1.1. */ - //{ "svg:flowDiv", SP_TYPE_FLOWDIV }, - //{ "svg:flowLine", SP_TYPE_FLOWLINE }, - //{ "svg:flowPara", SP_TYPE_FLOWPARA }, - //{ "svg:flowRegion", SP_TYPE_FLOWREGION }, - //{ "svg:flowRegionBreak", SP_TYPE_FLOWREGIONBREAK }, - //{ "svg:flowRegionExclude", SP_TYPE_FLOWREGIONEXCLUDE }, - //{ "svg:flowRoot", SP_TYPE_FLOWTEXT }, - //{ "svg:flowSpan", SP_TYPE_FLOWTSPAN }, - //{ "svg:font", SP_TYPE_FONT }, - //{ "svg:font-face", SP_TYPE_FONTFACE }, - //{ "svg:glyph", SP_TYPE_GLYPH }, - //{ "svg:missing-glyph", SP_TYPE_MISSING_GLYPH }, + { "svg:flowDiv", SP_TYPE_FLOWDIV }, + { "svg:flowLine", SP_TYPE_FLOWLINE }, + { "svg:flowPara", SP_TYPE_FLOWPARA }, + { "svg:flowRegion", SP_TYPE_FLOWREGION }, + { "svg:flowRegionBreak", SP_TYPE_FLOWREGIONBREAK }, + { "svg:flowRegionExclude", SP_TYPE_FLOWREGIONEXCLUDE }, + { "svg:flowRoot", SP_TYPE_FLOWTEXT }, + { "svg:flowSpan", SP_TYPE_FLOWTSPAN }, + { "svg:font", SP_TYPE_FONT }, + { "svg:font-face", SP_TYPE_FONTFACE }, + { "svg:glyph", SP_TYPE_GLYPH }, + { "svg:missing-glyph", SP_TYPE_MISSING_GLYPH }, { "svg:hkern", SP_TYPE_HKERN }, { "svg:vkern", SP_TYPE_VKERN }, - //{ "svg:g", SP_TYPE_GROUP }, - //{ "svg:feBlend", SP_TYPE_FEBLEND }, - //{ "svg:feColorMatrix", SP_TYPE_FECOLORMATRIX }, - //{ "svg:feComponentTransfer", SP_TYPE_FECOMPONENTTRANSFER }, - //{ "svg:feComposite", SP_TYPE_FECOMPOSITE }, - //{ "svg:feConvolveMatrix", SP_TYPE_FECONVOLVEMATRIX }, - //{ "svg:feDiffuseLighting", SP_TYPE_FEDIFFUSELIGHTING }, - //{ "svg:feDistantLight", SP_TYPE_FEDISTANTLIGHT }, - //{ "svg:feDisplacementMap", SP_TYPE_FEDISPLACEMENTMAP }, - //{ "svg:feFlood", SP_TYPE_FEFLOOD }, + { "svg:g", SP_TYPE_GROUP }, + { "svg:feBlend", SP_TYPE_FEBLEND }, + { "svg:feColorMatrix", SP_TYPE_FECOLORMATRIX }, + { "svg:feComponentTransfer", SP_TYPE_FECOMPONENTTRANSFER }, + { "svg:feComposite", SP_TYPE_FECOMPOSITE }, + { "svg:feConvolveMatrix", SP_TYPE_FECONVOLVEMATRIX }, + { "svg:feDiffuseLighting", SP_TYPE_FEDIFFUSELIGHTING }, + { "svg:feDistantLight", SP_TYPE_FEDISTANTLIGHT }, + { "svg:feDisplacementMap", SP_TYPE_FEDISPLACEMENTMAP }, + { "svg:feFlood", SP_TYPE_FEFLOOD }, { "svg:feFuncR", SP_TYPE_FEFUNCR }, { "svg:feFuncG", SP_TYPE_FEFUNCG }, { "svg:feFuncB", SP_TYPE_FEFUNCB }, { "svg:feFuncA", SP_TYPE_FEFUNCA }, - //{ "svg:feGaussianBlur", SP_TYPE_GAUSSIANBLUR }, - //{ "svg:feImage", SP_TYPE_FEIMAGE }, - //{ "svg:feMerge", SP_TYPE_FEMERGE }, - //{ "svg:feMorphology", SP_TYPE_FEMORPHOLOGY }, - //{ "svg:feOffset", SP_TYPE_FEOFFSET }, - //{ "svg:fePointLight", SP_TYPE_FEPOINTLIGHT }, - //{ "svg:feSpecularLighting", SP_TYPE_FESPECULARLIGHTING }, - //{ "svg:feSpotLight", SP_TYPE_FESPOTLIGHT }, - //{ "svg:feTile", SP_TYPE_FETILE }, - //{ "svg:feTurbulence", SP_TYPE_FETURBULENCE }, - //{ "svg:feMergeNode", SP_TYPE_FEMERGENODE }, - //{ "svg:image", SP_TYPE_IMAGE }, - //{ "svg:line", SP_TYPE_LINE }, - //{ "svg:linearGradient", SP_TYPE_LINEARGRADIENT }, - //{ "svg:marker", SP_TYPE_MARKER }, - //{ "svg:mask", SP_TYPE_MASK }, - //{ "svg:meshGradient", SP_TYPE_MESHGRADIENT }, - //{ "svg:meshRow", SP_TYPE_MESHROW }, - //{ "svg:meshPatch", SP_TYPE_MESHPATCH }, - //{ "svg:metadata", SP_TYPE_METADATA }, - //{ "svg:path", SP_TYPE_PATH }, - //{ "svg:pattern", SP_TYPE_PATTERN }, - //{ "svg:polygon", SP_TYPE_POLYGON }, - //{ "svg:polyline", SP_TYPE_POLYLINE }, - //{ "svg:radialGradient", SP_TYPE_RADIALGRADIENT }, - //{ "svg:rect", SP_TYPE_RECT }, - //{ "svg:stop", SP_TYPE_STOP }, - //{ "svg:script", SP_TYPE_SCRIPT }, - //{ "svg:svg", SP_TYPE_ROOT }, - //{ "svg:style", SP_TYPE_STYLE_ELEM }, - //{ "svg:switch", SP_TYPE_SWITCH }, - //{ "svg:symbol", SP_TYPE_SYMBOL }, - //{ "svg:text", SP_TYPE_TEXT }, - //{ "svg:textPath", SP_TYPE_TEXTPATH }, - //{ "svg:title", SP_TYPE_TITLE }, - //{ "svg:tref", SP_TYPE_TREF }, - //{ "svg:tspan", SP_TYPE_TSPAN }, - //{ "svg:use", SP_TYPE_USE }, - //{ "inkscape:path-effect", TYPE_LIVEPATHEFFECT } + { "svg:feGaussianBlur", SP_TYPE_GAUSSIANBLUR }, + { "svg:feImage", SP_TYPE_FEIMAGE }, + { "svg:feMerge", SP_TYPE_FEMERGE }, + { "svg:feMorphology", SP_TYPE_FEMORPHOLOGY }, + { "svg:feOffset", SP_TYPE_FEOFFSET }, + { "svg:fePointLight", SP_TYPE_FEPOINTLIGHT }, + { "svg:feSpecularLighting", SP_TYPE_FESPECULARLIGHTING }, + { "svg:feSpotLight", SP_TYPE_FESPOTLIGHT }, + { "svg:feTile", SP_TYPE_FETILE }, + { "svg:feTurbulence", SP_TYPE_FETURBULENCE }, + { "svg:feMergeNode", SP_TYPE_FEMERGENODE }, + { "svg:image", SP_TYPE_IMAGE }, + { "svg:line", SP_TYPE_LINE }, + { "svg:linearGradient", SP_TYPE_LINEARGRADIENT }, + { "svg:marker", SP_TYPE_MARKER }, + { "svg:mask", SP_TYPE_MASK }, + { "svg:meshGradient", SP_TYPE_MESHGRADIENT }, + { "svg:meshRow", SP_TYPE_MESHROW }, + { "svg:meshPatch", SP_TYPE_MESHPATCH }, + { "svg:metadata", SP_TYPE_METADATA }, + { "svg:path", SP_TYPE_PATH }, + { "svg:pattern", SP_TYPE_PATTERN }, + { "svg:polygon", SP_TYPE_POLYGON }, + { "svg:polyline", SP_TYPE_POLYLINE }, + { "svg:radialGradient", SP_TYPE_RADIALGRADIENT }, + { "svg:rect", SP_TYPE_RECT }, + { "svg:stop", SP_TYPE_STOP }, + { "svg:script", SP_TYPE_SCRIPT }, + { "svg:svg", SP_TYPE_ROOT }, + { "svg:style", SP_TYPE_STYLE_ELEM }, + { "svg:switch", SP_TYPE_SWITCH }, + { "svg:symbol", SP_TYPE_SYMBOL }, + { "svg:text", SP_TYPE_TEXT }, + { "svg:textPath", SP_TYPE_TEXTPATH }, + { "svg:title", SP_TYPE_TITLE }, + { "svg:tref", SP_TYPE_TREF }, + { "svg:tspan", SP_TYPE_TSPAN }, + { "svg:use", SP_TYPE_USE }, + { "inkscape:path-effect", TYPE_LIVEPATHEFFECT } }; NameTypeEntry const sodipodi_name_entries[] = { - //{ "arc", SP_TYPE_ARC }, - //{ "inkscape:offset", SP_TYPE_OFFSET }, - //{ "spiral", SP_TYPE_SPIRAL }, - //{ "star", SP_TYPE_STAR }, - //{ "inkscape:box3d", SP_TYPE_BOX3D }, - //{ "inkscape:box3dside", SP_TYPE_BOX3D_SIDE }, - //{ "inkscape:persp3d", SP_TYPE_PERSP3D } + { "arc", SP_TYPE_ARC }, + { "inkscape:offset", SP_TYPE_OFFSET }, + { "spiral", SP_TYPE_SPIRAL }, + { "star", SP_TYPE_STAR }, + { "inkscape:box3d", SP_TYPE_BOX3D }, + { "inkscape:box3dside", SP_TYPE_BOX3D_SIDE }, + { "inkscape:persp3d", SP_TYPE_PERSP3D } }; NameTypeEntry const *const t2entries[] = { diff --git a/src/sp-object.cpp b/src/sp-object.cpp index 66f9b5ab8..510b53177 100644 --- a/src/sp-object.cpp +++ b/src/sp-object.cpp @@ -41,6 +41,8 @@ #include "util/format.h" #include "util/longest-common-suffix.h" +#include "sp-factory.h" + using std::memcpy; using std::strchr; using std::strcmp; @@ -163,6 +165,10 @@ SPObject::SPObject() { object->_default_label = NULL; } +SPObject::~SPObject() { + +} + /** * Callback to initialize the SPObject object. */ @@ -281,7 +287,7 @@ SPObject *sp_object_ref(SPObject *object, SPObject *owner) g_return_val_if_fail(!owner || SP_IS_OBJECT(owner), NULL); Inkscape::Debug::EventTracker<RefEvent> tracker(object); - g_object_ref(G_OBJECT(object)); + //g_object_ref(G_OBJECT(object)); return object; } @@ -292,7 +298,7 @@ SPObject *sp_object_unref(SPObject *object, SPObject *owner) g_return_val_if_fail(!owner || SP_IS_OBJECT(owner), NULL); Inkscape::Debug::EventTracker<UnrefEvent> tracker(object); - g_object_unref(G_OBJECT(object)); + //g_object_unref(G_OBJECT(object)); return NULL; } @@ -644,11 +650,17 @@ SPObject *SPObject::get_child_by_repr(Inkscape::XML::Node *repr) void CObject::child_added(Inkscape::XML::Node *child, Inkscape::XML::Node *ref) { SPObject* object = this->spobject; - GType type = sp_repr_type_lookup(child); - if (!type) { - return; - } - SPObject *ochild = SP_OBJECT(g_object_new(type, 0)); +// GType type = sp_repr_type_lookup(child); +// if (!type) { +// return; +// } +// SPObject *ochild = SP_OBJECT(g_object_new(type, 0)); + + SPObject* ochild = SPFactory::instance().createObject(*child); + if (!ochild) { + return; + } + SPObject *prev = ref ? object->get_child_by_repr(ref) : NULL; object->attach(ochild, prev); sp_object_unref(ochild, NULL); @@ -697,11 +709,17 @@ void CObject::build(SPDocument *document, Inkscape::XML::Node *repr) { object->readAttr("inkscape:collect"); for (Inkscape::XML::Node *rchild = repr->firstChild() ; rchild != NULL; rchild = rchild->next()) { - GType type = sp_repr_type_lookup(rchild); - if (!type) { - continue; - } - SPObject *child = SP_OBJECT(g_object_new(type, 0)); +// GType type = sp_repr_type_lookup(rchild); +// if (!type) { +// continue; +// } +// SPObject *child = SP_OBJECT(g_object_new(type, 0)); + + SPObject* child = SPFactory::instance().createObject(*rchild); + if (!child) { + continue; + } + object->attach(child, object->lastChild()); sp_object_unref(child, NULL); child->invoke_build(document, rchild, object->cloned); diff --git a/src/sp-object.h b/src/sp-object.h index d513e878a..2d3b412c9 100644 --- a/src/sp-object.h +++ b/src/sp-object.h @@ -20,7 +20,8 @@ class SPObjectClass; #define SP_TYPE_OBJECT (sp_object_get_type()) #define SP_OBJECT(obj) ((SPObject*)obj) -#define SP_IS_OBJECT(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPObject))) +//#define SP_IS_OBJECT(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPObject))) +#define SP_IS_OBJECT(obj) (dynamic_cast<const SPObject*>((SPObject*)obj)) /* Async modification flags */ #define SP_OBJECT_MODIFIED_FLAG (1 << 0) @@ -190,7 +191,7 @@ class CObject; * provides document level functionality such as the undo stack, * dictionary and so on. Source: doc/architecture.txt */ -class SPObject : public GObject { +class SPObject { // : public GObject { public: enum CollectionPolicy { COLLECT_WITH_PARENT, @@ -198,6 +199,8 @@ public: }; SPObject(); + virtual ~SPObject(); + CObject* cobject; std::set<TypeInfo> typeHierarchy; diff --git a/src/sp-offset.h b/src/sp-offset.h index 35030cfeb..75d42e443 100644 --- a/src/sp-offset.h +++ b/src/sp-offset.h @@ -18,7 +18,8 @@ #define SP_TYPE_OFFSET (sp_offset_get_type ()) #define SP_OFFSET(obj) ((SPOffset*)obj) -#define SP_IS_OFFSET(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPOffset))) +//#define SP_IS_OFFSET(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPOffset))) +#define SP_IS_OFFSET(obj) (dynamic_cast<const SPOffset*>((SPObject*)obj)) class COffset; class SPUseReference; diff --git a/src/sp-path.h b/src/sp-path.h index a9a8a217d..a442c49dd 100644 --- a/src/sp-path.h +++ b/src/sp-path.h @@ -24,7 +24,8 @@ class CPath; #define SP_TYPE_PATH (sp_path_get_type ()) #define SP_PATH(obj) ((SPPath*)obj) -#define SP_IS_PATH(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPPath))) +//#define SP_IS_PATH(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPPath))) +#define SP_IS_PATH(obj) (dynamic_cast<const SPPath*>((SPObject*)obj)) /** * SVG <path> implementation diff --git a/src/sp-polygon.h b/src/sp-polygon.h index 9486f61f3..1489f78ae 100644 --- a/src/sp-polygon.h +++ b/src/sp-polygon.h @@ -17,7 +17,8 @@ #define SP_TYPE_POLYGON (sp_polygon_get_type ()) #define SP_POLYGON(obj) ((SPPolygon*)obj) -#define SP_IS_POLYGON(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPPolygon))) +//#define SP_IS_POLYGON(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPPolygon))) +#define SP_IS_POLYGON(obj) (dynamic_cast<const SPPolygon*>((SPObject*)obj)) class CPolygon; diff --git a/src/sp-polyline.h b/src/sp-polyline.h index 565edbfe6..c6f9340f8 100644 --- a/src/sp-polyline.h +++ b/src/sp-polyline.h @@ -7,7 +7,8 @@ #define SP_TYPE_POLYLINE (sp_polyline_get_type ()) #define SP_POLYLINE(obj) ((SPPolyLine*)obj) -#define SP_IS_POLYLINE(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPPolyLine))) +//#define SP_IS_POLYLINE(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPPolyLine))) +#define SP_IS_POLYLINE(obj) (dynamic_cast<const SPPolyLine*>((SPObject*)obj)) class SPPolyLine; class SPPolyLineClass; diff --git a/src/sp-rect.h b/src/sp-rect.h index 98d4d1924..aaf090388 100644 --- a/src/sp-rect.h +++ b/src/sp-rect.h @@ -22,7 +22,8 @@ G_BEGIN_DECLS #define SP_TYPE_RECT (sp_rect_get_type ()) #define SP_RECT(obj) ((SPRect*)obj) -#define SP_IS_RECT(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPRect))) +//#define SP_IS_RECT(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPRect))) +#define SP_IS_RECT(obj) (dynamic_cast<const SPRect*>((SPObject*)obj)) class CRect; diff --git a/src/sp-shape.cpp b/src/sp-shape.cpp index e3c0301de..babb4f029 100644 --- a/src/sp-shape.cpp +++ b/src/sp-shape.cpp @@ -951,7 +951,7 @@ sp_shape_set_marker (SPObject *object, unsigned int key, const gchar *value) // CPPIFY: make pure virtual void CShape::set_shape() { - throw; + //throw; } /* Shape section */ diff --git a/src/sp-shape.h b/src/sp-shape.h index 1a7af4e5e..5a9d49622 100644 --- a/src/sp-shape.h +++ b/src/sp-shape.h @@ -24,7 +24,8 @@ #define SP_TYPE_SHAPE (sp_shape_get_type ()) #define SP_SHAPE(obj) ((SPShape*)obj) -#define SP_IS_SHAPE(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPShape))) +//#define SP_IS_SHAPE(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPShape))) +#define SP_IS_SHAPE(obj) (dynamic_cast<const SPShape*>((SPObject*)obj)) #define SP_SHAPE_WRITE_PATH (1 << 2) diff --git a/src/sp-spiral.h b/src/sp-spiral.h index 9613a631b..aaca363c2 100644 --- a/src/sp-spiral.h +++ b/src/sp-spiral.h @@ -25,7 +25,9 @@ #define SP_TYPE_SPIRAL (sp_spiral_get_type ()) #define SP_SPIRAL(obj) ((SPSpiral*)obj) -#define SP_IS_SPIRAL(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPSpiral))) +//#define SP_IS_SPIRAL(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPSpiral))) + +#define SP_IS_SPIRAL(obj) (dynamic_cast<const SPSpiral*>((SPObject*)obj)) class CSpiral; /** diff --git a/src/sp-star.h b/src/sp-star.h index 34a3b8989..19b586dc0 100644 --- a/src/sp-star.h +++ b/src/sp-star.h @@ -18,7 +18,8 @@ #define SP_TYPE_STAR (sp_star_get_type ()) #define SP_STAR(obj) ((SPStar*)obj) -#define SP_IS_STAR(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPStar))) +//#define SP_IS_STAR(obj) (obj != NULL && static_cast<const SPObject*>(obj)->typeHierarchy.count(typeid(SPStar))) +#define SP_IS_STAR(obj) (dynamic_cast<const SPStar*>((SPObject*)obj)) class CStar; typedef enum { diff --git a/src/sp-string.cpp b/src/sp-string.cpp index 332ccaf31..29679b93a 100644 --- a/src/sp-string.cpp +++ b/src/sp-string.cpp @@ -32,6 +32,15 @@ #include "sp-string.h" #include "xml/repr.h" +#include "sp-factory.h" + +namespace { + SPObject* createString() { + return new SPString(); + } + + bool stringRegistered = SPFactory::instance().registerObject("string", createString); +} /*##################################################### # SPSTRING diff --git a/src/sp-use.cpp b/src/sp-use.cpp index 5b1a1e880..65c8602df 100644 --- a/src/sp-use.cpp +++ b/src/sp-use.cpp @@ -36,6 +36,8 @@ #include "sp-use.h" #include "sp-use-reference.h" +#include "sp-factory.h" + /* fixme: */ static void sp_use_finalize(GObject *obj); @@ -489,11 +491,29 @@ sp_use_href_changed(SPObject */*old_ref*/, SPObject */*ref*/, SPUse *use) SPItem *refobj = use->ref->getObject(); if (refobj) { Inkscape::XML::Node *childrepr = refobj->getRepr(); - GType type = sp_repr_type_lookup(childrepr); - g_return_if_fail(type > G_TYPE_NONE); - if (g_type_is_a(type, SP_TYPE_ITEM)) { - use->child = (SPObject*) g_object_new(type, 0); - use->attach(use->child, use->lastChild()); + +// GType type = sp_repr_type_lookup(childrepr); +// g_return_if_fail(type > G_TYPE_NONE); +// if (g_type_is_a(type, SP_TYPE_ITEM)) { +// use->child = (SPObject*) g_object_new(type, 0); +// use->attach(use->child, use->lastChild()); +// sp_object_unref(use->child, use); +// (use->child)->invoke_build(use->document, childrepr, TRUE); +// +// for (SPItemView *v = item->display; v != NULL; v = v->next) { +// Inkscape::DrawingItem *ai; +// ai = SP_ITEM(use->child)->invoke_show(v->arenaitem->drawing(), v->key, v->flags); +// if (ai) { +// v->arenaitem->prependChild(ai); +// } +// } +// } + + SPObject* obj = SPFactory::instance().createObject(*childrepr); + if (SP_IS_ITEM(obj)) { + use->child = obj; + + use->attach(use->child, use->lastChild()); sp_object_unref(use->child, use); (use->child)->invoke_build(use->document, childrepr, TRUE); @@ -504,8 +524,10 @@ sp_use_href_changed(SPObject */*old_ref*/, SPObject */*ref*/, SPUse *use) v->arenaitem->prependChild(ai); } } - + } else { + delete obj; } + use->_delete_connection = refobj->connectDelete(sigc::bind(sigc::ptr_fun(&sp_use_delete_self), use)); use->_transformed_connection = SP_ITEM(refobj)->connectTransformed(sigc::bind(sigc::ptr_fun(&sp_use_move_compensate), use)); } |
