$include_dir="/home/hyper-archives/boost-commit/include"; include("$include_dir/msg-header.inc") ?>
Subject: [Boost-commit] svn:boost r84049 - trunk/boost/gil
From: chhenning_at_[hidden]
Date: 2013-04-25 20:46:47
Author: chhenning
Date: 2013-04-25 20:46:46 EDT (Thu, 25 Apr 2013)
New Revision: 84049
URL: http://svn.boost.org/trac/boost/changeset/84049
Log:
Fix for reusing memory in image class.
Text files modified: 
   trunk/boost/gil/image.hpp |    30 ++++++++++++++++++++----------          
   1 files changed, 20 insertions(+), 10 deletions(-)
Modified: trunk/boost/gil/image.hpp
==============================================================================
--- trunk/boost/gil/image.hpp	(original)
+++ trunk/boost/gil/image.hpp	2013-04-25 20:46:46 EDT (Thu, 25 Apr 2013)
@@ -70,36 +70,40 @@
 
     explicit image(std::size_t alignment=0,
                    const Alloc alloc_in = Alloc()) :
-        _memory(0), _align_in_bytes(alignment), _alloc(alloc_in) {}
+        _memory(0), _align_in_bytes(alignment), _alloc(alloc_in), _original_dims(0,0) {}
 
     // Create with dimensions and optional initial value and alignment
     image(const point_t& dimensions,
           std::size_t alignment=0,
-          const Alloc alloc_in = Alloc()) : _memory(0), _align_in_bytes(alignment), _alloc(alloc_in) {
+          const Alloc alloc_in = Alloc()) : _memory(0), _align_in_bytes(alignment), _alloc(alloc_in)
+                                          , _original_dims( dimensions ) {
         allocate_and_default_construct(dimensions);
     }
+
     image(x_coord_t width, y_coord_t height,
           std::size_t alignment=0,
-          const Alloc alloc_in = Alloc()) : _memory(0), _align_in_bytes(alignment), _alloc(alloc_in) {
+          const Alloc alloc_in = Alloc()) : _memory(0), _align_in_bytes(alignment), _alloc(alloc_in)
+                                          , _original_dims( width, height ) {
         allocate_and_default_construct(point_t(width,height));
     }
+
     image(const point_t& dimensions,
           const Pixel& p_in,
           std::size_t alignment,
-          const Alloc alloc_in = Alloc())  :
-        _memory(0), _align_in_bytes(alignment), _alloc(alloc_in) {
+          const Alloc alloc_in = Alloc())  : _memory(0), _align_in_bytes(alignment), _alloc(alloc_in) 
+                                           , _original_dims( dimensions ) {
         allocate_and_fill(dimensions, p_in);
     }
     image(x_coord_t width, y_coord_t height,
           const Pixel& p_in,
           std::size_t alignment,
-          const Alloc alloc_in = Alloc())  :
-        _memory(0), _align_in_bytes(alignment), _alloc(alloc_in) {
+          const Alloc alloc_in = Alloc())  : _memory(0), _align_in_bytes(alignment), _alloc(alloc_in)
+                                           , _original_dims( width, height )  {
         allocate_and_fill(point_t(width,height),p_in);
     }
 
-    image(const image& img) :
-        _memory(0), _align_in_bytes(img._align_in_bytes), _alloc(img._alloc) {
+    image(const image& img) : _memory(0), _align_in_bytes(img._align_in_bytes), _alloc(img._alloc)
+                            , _original_dims( img._original_dims ) {
         allocate_and_copy(img.dimensions(),img._view);
     }
 
@@ -107,7 +111,9 @@
     image(const image<P2,IP2,Alloc2>& img) :
         _memory(0), _align_in_bytes(img._align_in_bytes), _alloc(img._alloc) {
        allocate_and_copy(img.dimensions(),img._view);
+       _original_dims = img.dimensions();
     }
+
     image& operator=(const image& img) {
         if (dimensions() == img.dimensions())
             copy_pixels(img._view,_view);
@@ -131,7 +137,7 @@
 
     ~image() {
         destruct_pixels(_view);
-        deallocate(_view.dimensions());
+        deallocate(_original_dims);
     }
 
     Alloc&       allocator() { return _alloc; }
@@ -143,6 +149,7 @@
         swap(_memory,         img._memory);
         swap(_view,           img._view);
         swap(_alloc,          img._alloc);
+        swap( _original_dims, img._original_dims );
     }
 
     void recreate(const point_t& dims, std::size_t alignment=0, const Alloc alloc_in = Alloc()) {
@@ -172,6 +179,9 @@
     std::size_t    _align_in_bytes;
     allocator_type _alloc;
 
+    point_t _original_dims;
+
+
     void allocate_and_default_construct(const point_t& dimensions) {
         try {
             allocate_(dimensions,mpl::bool_<IsPlanar>());