Index: trunk/src/gl/image.cc
===================================================================
--- trunk/src/gl/image.cc	(revision 13)
+++ trunk/src/gl/image.cc	(revision 13)
@@ -0,0 +1,37 @@
+// Copyright (C) 2011 Kornel Kisielewicz
+// This file is part of NV Libraries.
+// For conditions of distribution and use, see copyright notice in nv.hh
+
+#include "nv/gl/image.hh"
+
+#include <cstring>
+
+using namespace nv;
+
+image::image( glm::ivec2 size, size_t depth )
+	: m_size( size ), m_depth( depth ), m_data( nullptr )
+{
+	m_data = new uint8[ m_size.x * m_size.y * m_depth ];
+}
+
+void image::fill( uint8 value )
+{
+	memset( m_data, value, m_size.x * m_size.y * m_depth );
+}
+
+void image::set_region( region r, const uint8 * data, size_t stride )
+{
+	if ( stride == 0 ) stride = r.size.x;
+
+    for( size_t 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 );
+    }
+}
+
+image::~image()
+{
+	delete[] m_data;
+}
+
Index: trunk/src/gl/texture_atlas.cc
===================================================================
--- trunk/src/gl/texture_atlas.cc	(revision 11)
+++ trunk/src/gl/texture_atlas.cc	(revision 13)
@@ -7,17 +7,18 @@
 #include "nv/gl/texture_atlas.hh"
 
+#include "nv/logging.hh"
+
 using namespace nv;
 
 texture_atlas::texture_atlas( glm::ivec2 size, size_t depth )
-	: m_size( size ), m_depth( depth ), m_used( 0 ), m_data( nullptr )
+	: image( size, depth ), m_used( 0 )
 {
 	m_nodes.push_back( glm::ivec3( 1, 1, m_size.x - 2 ) );
-	m_data = new uint8[ m_size.x * m_size.y * m_depth ];
 	fill( 0 );
 }
 
-glm::ivec4 texture_atlas::get_region( glm::ivec2 size )
+region texture_atlas::get_region( glm::ivec2 size )
 {
-	glm::ivec4 region (0,0,size.x,size.y);
+	region r ( glm::ivec2(0,0), size );
     size_t i;
 
@@ -37,6 +38,6 @@
 				best_index = i;
 				best_width = node.z;
-				region.x = node.x;
-				region.y = y;
+				r.pos.x = node.x;
+				r.pos.y = y;
 			}
         }
@@ -45,8 +46,8 @@
 	if( best_index == -1 )
     {
-        return glm::ivec4( -1, -1, 0, 0 );
+        return region( glm::ivec2( -1, -1 ), glm::ivec2( 0, 0 ) );
     }
 
-    m_nodes.insert( m_nodes.begin() + best_index, glm::ivec3( region.x, region.y + size.y, size.x ) );
+    m_nodes.insert( m_nodes.begin() + best_index, glm::ivec3( r.pos.x, r.pos.y + size.y, size.x ) );
 
     for( size_t i = best_index+1; i < m_nodes.size(); ++i )
@@ -78,14 +79,5 @@
     merge();
     m_used += size.x * size.y;
-    return region;
-}
-
-void texture_atlas::set_region( glm::ivec4 region, const uint8 * data, size_t stride )
-{
-    for( size_t i = 0; i < region[3]; ++i )
-    {
-        memcpy( m_data+((region.y+i)*m_size.x + region.x ) * m_depth, 
-                data + (i*stride), m_size.x * m_depth );
-    }
+    return r;
 }
 
@@ -140,13 +132,2 @@
 	fill( 0 );
 }
-
-void texture_atlas::fill( uint8 value )
-{
-	memset( m_data, value, m_size.x * m_size.y * m_depth );
-}
-
-texture_atlas::~texture_atlas()
-{
-	delete[] m_data;
-}
-
