fix widget delete bug
authorozantonkal <ozantonkal@gmail.com>
Tue, 9 Jul 2013 09:07:21 +0000 (11:07 +0200)
committerozantonkal <ozantonkal@gmail.com>
Tue, 9 Jul 2013 09:07:21 +0000 (11:07 +0200)
modules/viz/include/opencv2/viz/widgets.hpp
modules/viz/src/widget.cpp

index b22be40..cc53e73 100644 (file)
@@ -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() {}
     };
     
 
index 4fed46d..93dd2a6 100644 (file)
@@ -7,129 +7,55 @@ class temp_viz::Widget::Impl
 {
 public:
     vtkSmartPointer<vtkProp> 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<vtkProp> actor;
-//     int ref_counter;
-// 
-//     Impl() : actor(vtkSmartPointer<vtkLODActor>::New()) {}
-//     
-//     Impl(bool text_widget) 
-//     {
-//         if (text_widget)
-//             actor = vtkSmartPointer<vtkTextActor>::New();
-//         else
-//             actor = vtkSmartPointer<vtkLeaderActor2D>::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<vtkMatrix4x4> matrix = convertToVtkMatrix(pose.matrix);
-//         lod_actor->SetUserMatrix (matrix);
-//         lod_actor->Modified ();
-//     }
-// 
-//     void updatePose(const Affine3f& pose)
-//     {
-//         vtkLODActor *lod_actor = vtkLODActor::SafeDownCast(actor);
-//         vtkSmartPointer<vtkMatrix4x4> 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<vtkMatrix4x4> matrix = lod_actor->GetUserMatrix();
-//         Matx44f matrix_cv = convertToMatx(matrix);
-//         return Affine3f(matrix_cv);
-//     }
-// 
-// protected:
-// 
-//     static vtkSmartPointer<vtkMatrix4x4> convertToVtkMatrix (const cv::Matx44f& m)
-//     {
-//         vtkSmartPointer<vtkMatrix4x4> vtk_matrix = vtkSmartPointer<vtkMatrix4x4>::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<vtkMatrix4x4>& 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<vtkProp> 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()
-{
-
-}