From 195d60f4f886df758bcd608401d346d0a107af00 Mon Sep 17 00:00:00 2001 From: ozantonkal Date: Tue, 9 Jul 2013 11:07:21 +0200 Subject: [PATCH] fix widget delete bug --- modules/viz/include/opencv2/viz/widgets.hpp | 6 +- modules/viz/src/widget.cpp | 127 +++----------------- 2 files changed, 24 insertions(+), 109 deletions(-) diff --git a/modules/viz/include/opencv2/viz/widgets.hpp b/modules/viz/include/opencv2/viz/widgets.hpp index b22be40405..cc53e734f0 100644 --- a/modules/viz/include/opencv2/viz/widgets.hpp +++ b/modules/viz/include/opencv2/viz/widgets.hpp @@ -21,6 +21,8 @@ namespace temp_viz Impl *impl_; friend struct WidgetAccessor; + void create(); + void release(); }; ///////////////////////////////////////////////////////////////////////////// @@ -28,7 +30,7 @@ namespace temp_viz class CV_EXPORTS Widget3D : public Widget { public: - Widget3D(); + Widget3D() {} void setPose(const Affine3f &pose); void updatePose(const Affine3f &pose); @@ -46,7 +48,7 @@ namespace temp_viz class CV_EXPORTS Widget2D : public Widget { public: - Widget2D(); + Widget2D() {} }; diff --git a/modules/viz/src/widget.cpp b/modules/viz/src/widget.cpp index 4fed46d1cd..93dd2a68e7 100644 --- a/modules/viz/src/widget.cpp +++ b/modules/viz/src/widget.cpp @@ -7,129 +7,55 @@ class temp_viz::Widget::Impl { public: vtkSmartPointer actor; + int ref_counter; Impl() : actor(0) {} }; temp_viz::Widget::Widget() : impl_(0) { - impl_ = new Impl(); + create(); } -temp_viz::Widget::Widget(const Widget &other) : impl_(other.impl_) +temp_viz::Widget::Widget(const Widget &other) : impl_(other.impl_) { - + if (impl_) CV_XADD(&impl_->ref_counter, 1); } temp_viz::Widget& temp_viz::Widget::operator =(const Widget &other) { if (this != &other) { - delete impl_; + release(); impl_ = other.impl_; + if (impl_) CV_XADD(&impl_->ref_counter, 1); } return *this; } temp_viz::Widget::~Widget() { - if (impl_) + release(); +} + +void temp_viz::Widget::create() +{ + if (impl_) release(); + impl_ = new Impl(); + impl_->ref_counter = 1; +} + +void temp_viz::Widget::release() +{ + if (impl_ && CV_XADD(&impl_->ref_counter, -1) == 1) { delete impl_; impl_ = 0; } } - - -// class temp_viz::Widget::Impl -// { -// public: -// vtkSmartPointer actor; -// int ref_counter; -// -// Impl() : actor(vtkSmartPointer::New()) {} -// -// Impl(bool text_widget) -// { -// if (text_widget) -// actor = vtkSmartPointer::New(); -// else -// actor = vtkSmartPointer::New(); -// } -// -// void setColor(const Color& color) -// { -// vtkLODActor *lod_actor = vtkLODActor::SafeDownCast(actor); -// Color c = vtkcolor(color); -// lod_actor->GetMapper ()->ScalarVisibilityOff (); -// lod_actor->GetProperty ()->SetColor (c.val); -// lod_actor->GetProperty ()->SetEdgeColor (c.val); -// lod_actor->GetProperty ()->SetAmbient (0.8); -// lod_actor->GetProperty ()->SetDiffuse (0.8); -// lod_actor->GetProperty ()->SetSpecular (0.8); -// lod_actor->GetProperty ()->SetLighting (0); -// lod_actor->Modified (); -// } -// -// void setPose(const Affine3f& pose) -// { -// vtkLODActor *lod_actor = vtkLODActor::SafeDownCast(actor); -// vtkSmartPointer matrix = convertToVtkMatrix(pose.matrix); -// lod_actor->SetUserMatrix (matrix); -// lod_actor->Modified (); -// } -// -// void updatePose(const Affine3f& pose) -// { -// vtkLODActor *lod_actor = vtkLODActor::SafeDownCast(actor); -// vtkSmartPointer matrix = lod_actor->GetUserMatrix(); -// if (!matrix) -// { -// setPose(pose); -// return ; -// } -// Matx44f matrix_cv = convertToMatx(matrix); -// -// Affine3f updated_pose = pose * Affine3f(matrix_cv); -// matrix = convertToVtkMatrix(updated_pose.matrix); -// -// lod_actor->SetUserMatrix (matrix); -// lod_actor->Modified (); -// } -// -// Affine3f getPose() const -// { -// vtkLODActor *lod_actor = vtkLODActor::SafeDownCast(actor); -// vtkSmartPointer matrix = lod_actor->GetUserMatrix(); -// Matx44f matrix_cv = convertToMatx(matrix); -// return Affine3f(matrix_cv); -// } -// -// protected: -// -// static vtkSmartPointer convertToVtkMatrix (const cv::Matx44f& m) -// { -// vtkSmartPointer vtk_matrix = vtkSmartPointer::New (); -// for (int i = 0; i < 4; i++) -// for (int k = 0; k < 4; k++) -// vtk_matrix->SetElement(i, k, m(i, k)); -// return vtk_matrix; -// } -// -// static cv::Matx44f convertToMatx(const vtkSmartPointer& vtk_matrix) -// { -// cv::Matx44f m; -// for (int i = 0; i < 4; i++) -// for (int k = 0; k < 4; k++) -// m(i, k) = vtk_matrix->GetElement (i, k); -// return m; -// } -// }; - - /////////////////////////////////////////////////////////////////////////////////////////////// -/// stream accessor implementaion +/// widget accessor implementaion vtkSmartPointer temp_viz::WidgetAccessor::getActor(const Widget& widget) { @@ -165,11 +91,6 @@ struct temp_viz::Widget3D::MatrixConverter } }; -temp_viz::Widget3D::Widget3D() -{ - -} - void temp_viz::Widget3D::setPose(const Affine3f &pose) { vtkProp3D *actor = vtkProp3D::SafeDownCast(WidgetAccessor::getActor(*this)); @@ -226,11 +147,3 @@ void temp_viz::Widget3D::setColor(const Color &color) actor->GetProperty ()->SetLighting (0); actor->Modified (); } - -/////////////////////////////////////////////////////////////////////////////////////////////// -/// widget2D implementation - -temp_viz::Widget2D::Widget2D() -{ - -}