Index: trunk/src/gfx/image.cc
===================================================================
--- trunk/src/gfx/image.cc	(revision 89)
+++ trunk/src/gfx/image.cc	(revision 90)
@@ -5,5 +5,5 @@
 #include "nv/gfx/image.hh"
 
-#include <cstring>
+#include <algorithm>
 
 using namespace nv;
@@ -15,14 +15,23 @@
 }
 
+image::image( image_data* data )
+	: m_size( data->get_size() ), m_depth( data->get_depth() ), m_data( data->release_data() )
+{
+	NV_ASSERT( m_data, "image created from empty image_data!" );
+}
+
+
 image::image( glm::ivec2 size, size_t depth, const uint8 * data, bool reversed )
 	: m_size( size ), m_depth( depth ), m_data( nullptr )
 {
+	std::size_t bsize = m_size.x * m_size.y * m_depth;
 	m_data = new uint8[ m_size.x * m_size.y * m_depth ];
 
 	if ( reversed )
 	{
-		for( int i = 0; i < size.y; ++i )
+		std::size_t bline = m_size.x * m_depth;
+		for( int i = 0; i < m_size.y; ++i )
 		{
-			memcpy( m_data + size.x * ( size.y - i - 1) * m_depth, data + i * size.x * m_depth, m_size.x * m_depth );
+			std::copy( data + i * bline, data + (i + 1) * bline, m_data + bsize - ( i + 1 ) * bline );
 		}
 
@@ -30,5 +39,5 @@
 	else 
 	{
-		memcpy( m_data, data, m_size.x * m_size.y * m_depth );
+		std::copy( data, data + bsize, m_data );
 	}
 }
@@ -36,15 +45,20 @@
 void image::fill( uint8 value )
 {
-	memset( m_data, value, m_size.x * m_size.y * m_depth );
+	std::fill( m_data, m_data + m_size.x * m_size.y * m_depth, value );
 }
 
 void image::set_region( region r, const uint8 * data, size_t stride )
 {
-	if ( stride == 0 ) stride = r.size.x;
+	if ( stride == 0 ) stride = r.size.x * m_depth;
+	
+	std::size_t bpos  = (r.pos.y*m_size.x + r.pos.x ) * m_depth;
+	std::size_t bline = m_size.x*m_depth;
 
 	for( int i = 0; i < r.size.y; ++i )
  	{
-		memcpy( m_data+((r.pos.y+i)*m_size.x + r.pos.x ) * m_depth, 
-			data + (i*stride), r.size.x * m_depth );
+// TODO: test if same as old:
+//		memcpy( m_data+((r.pos.y+i)*m_size.x + r.pos.x ) * m_depth, 
+//			data + (i*stride), r.size.x * m_depth );
+		std::copy( data + i*stride, data + (i+1)*stride, m_data + bpos + bline * i );
 	}
 }
