summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/object/sp-object.cpp32
-rw-r--r--src/object/sp-object.h46
-rw-r--r--src/object/sp-shape.cpp12
-rw-r--r--src/object/uri-references.cpp4
-rw-r--r--src/object/uri-references.h2
5 files changed, 43 insertions, 53 deletions
diff --git a/src/object/sp-object.cpp b/src/object/sp-object.cpp
index dabf5219a..e82329d1b 100644
--- a/src/object/sp-object.cpp
+++ b/src/object/sp-object.cpp
@@ -242,8 +242,9 @@ 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));
+
object->refCount++;
+
return object;
}
@@ -254,7 +255,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));
+
object->refCount--;
if (object->refCount <= 0) {
@@ -264,33 +265,24 @@ SPObject *sp_object_unref(SPObject *object, SPObject *owner)
return nullptr;
}
-SPObject *sp_object_href(SPObject *object, SPObject* owner)
+void SPObject::hrefObject(SPObject* owner)
{
- g_return_val_if_fail(object != nullptr, NULL);
- g_return_val_if_fail(SP_IS_OBJECT(object), NULL);
-
- object->hrefcount++;
- object->_updateTotalHRefCount(1);
+ hrefcount++;
+ _updateTotalHRefCount(1);
if(owner)
- object->hrefList.push_front(owner);
-
- return object;
+ hrefList.push_front(owner);
}
-SPObject *sp_object_hunref(SPObject *object, SPObject* owner)
+void SPObject::unhrefObject(SPObject* owner)
{
- g_return_val_if_fail(object != nullptr, NULL);
- g_return_val_if_fail(SP_IS_OBJECT(object), NULL);
- g_return_val_if_fail(object->hrefcount > 0, NULL);
+ g_return_if_fail(hrefcount > 0);
- object->hrefcount--;
- object->_updateTotalHRefCount(-1);
+ hrefcount--;
+ _updateTotalHRefCount(-1);
if(owner)
- object->hrefList.remove(owner);
-
- return nullptr;
+ hrefList.remove(owner);
}
void SPObject::_updateTotalHRefCount(int increment) {
diff --git a/src/object/sp-object.h b/src/object/sp-object.h
index 190f24253..77e5947ad 100644
--- a/src/object/sp-object.h
+++ b/src/object/sp-object.h
@@ -154,31 +154,6 @@ SPObject *sp_object_ref(SPObject *object, SPObject *owner=nullptr);
SPObject *sp_object_unref(SPObject *object, SPObject *owner=nullptr);
/**
- * Increase weak refcount.
- *
- * Hrefcount is used for weak references, for example, to
- * determine whether any graphical element references a certain gradient
- * node.
- * @param owner Ignored.
- * @return object, NULL is error
- * \pre object points to real object
- * @todo need to move this to be a member of SPObject.
- */
-SPObject *sp_object_href(SPObject *object, SPObject* owner);
-
-/**
- * Decrease weak refcount.
- *
- * Hrefcount is used for weak references, for example, to determine whether
- * any graphical element references a certain gradient node.
- * @param owner Ignored.
- * @return always NULL
- * \pre object points to real object and hrefcount>0
- * @todo need to move this to be a member of SPObject.
- */
-SPObject *sp_object_hunref(SPObject *object, SPObject* owner);
-
-/**
* SPObject is an abstract base class of all of the document nodes at the
* SVG document level. Each SPObject subclass implements a certain SVG
* element node type, or is an abstract base class for different node
@@ -447,6 +422,27 @@ public:
}
/**
+ * Increase weak refcount.
+ *
+ * Hrefcount is used for weak references, for example, to
+ * determine whether any graphical element references a certain gradient
+ * node.
+ * It keeps a list of "owners".
+ * @param owner Used to track who uses this object.
+ */
+ void hrefObject(SPObject* owner = nullptr);
+
+ /**
+ * Decrease weak refcount.
+ *
+ * Hrefcount is used for weak references, for example, to determine whether
+ * any graphical element references a certain gradient node.
+ * @param owner Used to track who uses this object.
+ * \pre hrefcount>0
+ */
+ void unhrefObject(SPObject* owner = nullptr);
+
+ /**
* Check if object is referenced by any other object.
*/
bool isReferenced() { return ( _total_hrefcount > 0 ); }
diff --git a/src/object/sp-shape.cpp b/src/object/sp-shape.cpp
index 30e841dc0..c186b176c 100644
--- a/src/object/sp-shape.cpp
+++ b/src/object/sp-shape.cpp
@@ -92,7 +92,8 @@ void SPShape::release() {
this->_release_connect[i].disconnect();
this->_modified_connect[i].disconnect();
- _marker[i] = static_cast<SPMarker *>(sp_object_hunref(_marker[i], this));
+ _marker[i]->unhrefObject(this);
+ _marker[i] = nullptr;
}
}
@@ -1002,7 +1003,8 @@ sp_shape_marker_release (SPObject *marker, SPShape *shape)
/* Detach marker */
shape->_release_connect[i].disconnect();
shape->_modified_connect[i].disconnect();
- shape->_marker[i] = static_cast<SPMarker *>(sp_object_hunref(shape->_marker[i], item));
+ shape->_marker[i]->unhrefObject(item);
+ shape->_marker[i] = nullptr;
}
}
}
@@ -1051,10 +1053,12 @@ sp_shape_set_marker (SPObject *object, unsigned int key, const gchar *value)
}
/* Unref marker */
- shape->_marker[key] = static_cast<SPMarker *>(sp_object_hunref(shape->_marker[key], object));
+ shape->_marker[key]->unhrefObject(object);
+ shape->_marker[key] = nullptr;
}
if (marker) {
- shape->_marker[key] = static_cast<SPMarker *>(sp_object_href(marker, object));
+ shape->_marker[key] = marker;
+ shape->_marker[key]->hrefObject(object);
shape->_release_connect[key] = marker->connectRelease(sigc::bind<1>(sigc::ptr_fun(&sp_shape_marker_release), shape));
shape->_modified_connect[key] = marker->connectModified(sigc::bind<2>(sigc::ptr_fun(&sp_shape_marker_modified), shape));
}
diff --git a/src/object/uri-references.cpp b/src/object/uri-references.cpp
index d3550d940..35c1d7e17 100644
--- a/src/object/uri-references.cpp
+++ b/src/object/uri-references.cpp
@@ -214,13 +214,13 @@ void URIReference::_setObject(SPObject *obj)
_release_connection.disconnect();
if (_obj) {
- sp_object_href(_obj, _owner);
+ _obj->hrefObject(_owner);
_release_connection = _obj->connectRelease(sigc::mem_fun(*this, &URIReference::_release));
}
_changed_signal.emit(old_obj, _obj);
if (old_obj) {
/* release the old object _after_ the signal emission */
- sp_object_hunref(old_obj, _owner);
+ old_obj->unhrefObject(_owner);
}
}
diff --git a/src/object/uri-references.h b/src/object/uri-references.h
index 730f2534a..fe12ddc50 100644
--- a/src/object/uri-references.h
+++ b/src/object/uri-references.h
@@ -36,8 +36,6 @@ class URI;
* automatically.
*
* @see SPObject
- * @see sp_object_href
- * @see sp_object_hunref
*/
class URIReference : public sigc::trackable {
public: