Index: trunk/src/gfx/image.cc
===================================================================
--- trunk/src/gfx/image.cc	(revision 227)
+++ trunk/src/gfx/image.cc	(revision 228)
@@ -48,4 +48,19 @@
 }
 
+void image::fill( region r, uint8 value, int stride )
+{
+	if ( stride == 0 ) stride = r.size.x * static_cast<sint32>( m_depth );
+
+	sint32 bpos  = (r.pos.y*m_size.x + r.pos.x ) * static_cast<sint32>( m_depth );
+	sint32 bline = m_size.x*static_cast<sint32>( m_depth );
+
+	for( int i = 0; i < r.size.y; ++i )
+	{
+		// TODO: test 
+		std::fill( m_data + bpos + bline * i, m_data + bpos + bline * i + stride, value );
+	}
+}
+
+
 void image::set_region( region r, const uint8 * data, int stride )
 {
@@ -64,4 +79,36 @@
 }
 
+void image::set_region( region r, const image_data* idata )
+{
+	if ( idata->get_depth() == m_depth )
+	{
+		set_region( r, idata->get_data() );
+		return;
+	}
+
+	fill( r, 255 );
+
+	sint32 bpos       = (r.pos.y*m_size.x + r.pos.x ) * static_cast<sint32>( m_depth );
+	sint32 bline      = m_size.x*static_cast<sint32>( m_depth );
+
+	const uint8* data = idata->get_data();
+	sint32 depth      = idata->get_depth();
+	sint32 dstride    = r.size.x * static_cast<sint32>( depth );
+
+	for( int y = 0; y < r.size.y; ++y )
+	{
+		sint32 pos = bpos + bline * y;
+		for( int x = 0; x < r.size.x; ++x )
+		{
+			sint32 xy = pos + x * m_depth;
+			for( int e = 0; e < depth; ++e )
+			{
+				m_data[ xy + e ] = data[ y*dstride + x * depth + e ];
+			}
+		}
+	}
+}
+
+
 image::~image()
 {
