summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMarkus Engel <markus.engel@tum.de>2013-04-02 18:45:20 +0000
committerMarkus Engel <markus.engel@tum.de>2013-04-02 18:45:20 +0000
commit0a7e23844c3a43203de3f5207aecb278e84ee739 (patch)
tree73368a7dd8367c23599f0027d63c1c0a06638865 /src
parentRegistered classes with new factory. Hkern, Vkern and FeFuncX have to be rewr... (diff)
downloadinkscape-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.h3
-rw-r--r--src/filters/pointlight.cpp2
-rw-r--r--src/sp-ellipse.h13
-rw-r--r--src/sp-factory.cpp51
-rw-r--r--src/sp-factory.h8
-rw-r--r--src/sp-item.h3
-rw-r--r--src/sp-line.h3
-rw-r--r--src/sp-lpe-item.h3
-rw-r--r--src/sp-namedview.cpp11
-rw-r--r--src/sp-object-repr.cpp169
-rw-r--r--src/sp-object.cpp42
-rw-r--r--src/sp-object.h7
-rw-r--r--src/sp-offset.h3
-rw-r--r--src/sp-path.h3
-rw-r--r--src/sp-polygon.h3
-rw-r--r--src/sp-polyline.h3
-rw-r--r--src/sp-rect.h3
-rw-r--r--src/sp-shape.cpp2
-rw-r--r--src/sp-shape.h3
-rw-r--r--src/sp-spiral.h4
-rw-r--r--src/sp-star.h3
-rw-r--r--src/sp-string.cpp9
-rw-r--r--src/sp-use.cpp34
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));
}