Index: /trunk/nv/core/position.hh
===================================================================
--- /trunk/nv/core/position.hh	(revision 327)
+++ /trunk/nv/core/position.hh	(revision 328)
@@ -197,5 +197,7 @@
 		 */
 		rectangle shrinked( int value ) { position p(value,value); return rectangle(ul+p, lr-p); }
-		
+
+		rectangle shrinked( dimension value ) { return rectangle(ul+value, lr-value); }
+
 		/**
 		 * Shifts the rectangle by a given amount.
Index: /trunk/nv/gui/gui_renderer.hh
===================================================================
--- /trunk/nv/gui/gui_renderer.hh	(revision 327)
+++ /trunk/nv/gui/gui_renderer.hh	(revision 328)
@@ -40,4 +40,15 @@
 		};
 
+		struct image_info
+		{
+			vec2 t1;
+			vec2 t2;
+			ivec2 size;
+
+			image_info() {}
+			image_info( const nv::vec2 tex1, const nv::vec2 tex2, const nv::ivec2 s )
+				: t1( tex1 ), t2( tex2 ), size( s ) {}
+		};
+
 		class renderer
 		{
@@ -45,5 +56,5 @@
 			renderer( window* w );
 			texture_font* get_font( size_t name ) const;
-			vec4 get_image( size_t name ) const;
+			const image_info* get_image( size_t name ) const;
 			void load_style( const std::string& filename );
 			size_t load_font( const std::string& filename, size_t size );
@@ -56,5 +67,5 @@
 			typedef std::unordered_map< std::string, size_t > names;
 			typedef std::vector< texture_font* >              font_vector;
-			typedef std::vector< vec4 >                       image_vector;
+			typedef std::vector< image_info >                 image_vector;
 
 			context*      m_context;
Index: /trunk/src/gui/gui_renderer.cc
===================================================================
--- /trunk/src/gui/gui_renderer.cc	(revision 327)
+++ /trunk/src/gui/gui_renderer.cc	(revision 328)
@@ -38,6 +38,9 @@
 	"}\n";
 
+
 using namespace nv;
 using namespace nv::gui;
+
+const ivec2 atlas_size = ivec2( 1024, 1024 );
 
 struct gui_quad
@@ -121,5 +124,5 @@
 	: m_window(w)
 	, m_style()
-	, m_atlas( glm::ivec2( 1024, 1024 ), 4 )
+	, m_atlas( atlas_size, 4 )
 	, m_reupload( true )
 {
@@ -164,8 +167,8 @@
 }
 
-nv::vec4 renderer::get_image( size_t name ) const
-{
-	if ( name >= m_images.size() ) return nv::vec4();
-	return m_images[ name ];
+const image_info* renderer::get_image( size_t name ) const
+{
+	if ( name >= m_images.size() ) return nullptr;
+	return &m_images[ name ];
 }
 
@@ -201,4 +204,5 @@
 	region r = m_atlas.get_region( data->get_size() );
 	m_atlas.set_region( r, data->get_data() );
+	m_images.emplace_back( vec2( r.pos ) / vec2( atlas_size ), vec2( r.size + r.pos ) / vec2( atlas_size ), r.size );
 	delete data;
 	m_reupload = true;
@@ -228,21 +232,69 @@
 	if ( e->m_absolute != m_area )
 	{
-		int border;
+		int border = 0;
 		vec4 color;
 		std::string path;
 		std::string text;
-		if ( m_style.get( e, "border", border ) && m_style.get( e, "border_color", color ) )
+
+		if ( m_style.get( e, "skin", path ) )
 		{
-			rectangle inner = abs.shrinked( border );
-			qvec.emplace_back( abs.ul, inner.ul, inner.ur(), abs.ur(), color );
-			qvec.emplace_back( abs.ul, abs.ll(), inner.ll(), inner.ul, color );
-			qvec.emplace_back( inner.ur(), inner.lr, abs.lr, abs.ur(), color );
-			qvec.emplace_back( inner.ll(), abs.ll(), abs.lr, inner.lr, color );
-			abs = inner;
+			size_t image_id = load_image( path );
+			const image_info* image  = get_image( image_id );
+			if ( image )
+			{
+				color = vec4( 2, 2, 2, 1 );
+				ivec2 isize3  = image->size / 3;
+				ivec2 isize3x = ivec2( isize3.x, 0 );
+				ivec2 isize3y = ivec2( 0, isize3.y );
+				vec2 tsize    = ( image->t2 - image->t1 );
+				vec2 tsize3   = ( image->t2 - image->t1 ) / 3.0f;
+				vec2 tsize32  = ( image->t2 - image->t1 ) * ( 2.0f / 3.0f );
+				vec2 tsizex   = vec2( tsize.x, 0.0f );
+				vec2 tsizey   = vec2( 0.0f, tsize.y );
+				vec2 tsize3x  = vec2( tsize3.x, 0.0f );
+				vec2 tsize3y  = vec2( 0.0f, tsize3.y );
+				vec2 tsize3x2 = vec2( tsize32.x, 0.0f );
+				vec2 tsize3y2 = vec2( 0.0f, tsize32.y );
+
+				rectangle inner = abs.shrinked( isize3 );
+				qvec.emplace_back( abs.ul, inner.ul, color, image->t1, image->t1+tsize3 );
+				qvec.emplace_back( abs.ul+isize3x, inner.ur(), color, image->t1+tsize3x, image->t1+tsize3x2+tsize3y);
+				qvec.emplace_back( abs.ur()-isize3x, inner.ur()+isize3x, color, image->t1+tsize3x2, image->t1+tsizex+tsize3y );
+
+				qvec.emplace_back( abs.ul+isize3y, inner.ll(), color, image->t1+tsize3y, image->t1+tsize3y2+tsize3x );
+				qvec.emplace_back( inner.ul, inner.lr, color, image->t1+tsize3, image->t1+tsize32 );
+				qvec.emplace_back( inner.ur(), inner.lr+isize3x, color, image->t1+tsize3+tsize3x, image->t1+tsize32+tsize3x );
+
+
+				qvec.emplace_back( abs.ll()-isize3y, inner.ll()+isize3y, color, image->t1+tsize3y2, image->t1+tsize3y2+tsize3 );
+				qvec.emplace_back( inner.ll(), abs.lr-isize3x, color, image->t1+tsize3y2+tsize3x, image->t1+tsize32+tsize3y );
+				qvec.emplace_back( inner.lr, abs.lr, color, image->t1+tsize32, image->t1+tsize );
+
+	
+// 				qvec.emplace_back( abs.ul, abs.ll(), inner.ll(), inner.ul, color );
+// 				qvec.emplace_back( inner.ur(), inner.lr, abs.lr, abs.ur(), color );
+// 				qvec.emplace_back( inner.ll(), abs.ll(), abs.lr, inner.lr, color );
+				abs = inner;
+
+			}
+
 		}
-
-		if ( m_style.get( e, "background_color", color ) )
+		else
 		{
-			qvec.emplace_back( abs.ul, abs.lr, color );
+
+			if ( m_style.get( e, "border", border ) && m_style.get( e, "border_color", color ) )
+			{
+				rectangle inner = abs.shrinked( border );
+				qvec.emplace_back( abs.ul, inner.ul, inner.ur(), abs.ur(), color );
+				qvec.emplace_back( abs.ul, abs.ll(), inner.ll(), inner.ul, color );
+				qvec.emplace_back( inner.ur(), inner.lr, abs.lr, abs.ur(), color );
+				qvec.emplace_back( inner.ll(), abs.ll(), abs.lr, inner.lr, color );
+				abs = inner;
+			}
+
+			if ( m_style.get( e, "background_color", color ) )
+			{
+				qvec.emplace_back( abs.ul, abs.lr, color );
+			}
 		}
 
Index: /trunk/tests/gui_test/gui_test.lua
===================================================================
--- /trunk/tests/gui_test/gui_test.lua	(revision 327)
+++ /trunk/tests/gui_test/gui_test.lua	(revision 328)
@@ -4,5 +4,5 @@
 	includedirs { "../../" }
 	targetname "nv_gui_test"
-	links { "nv-core", "nv-gl", "nv-gui" }
+	links { "nv-core", "nv-gl", "nv-gui", "nv-sdl" }
 	targetdir "../../bin"	
  
Index: /trunk/tests/gui_test/nv_gui_test.cc
===================================================================
--- /trunk/tests/gui_test/nv_gui_test.cc	(revision 327)
+++ /trunk/tests/gui_test/nv_gui_test.cc	(revision 328)
@@ -1,5 +1,7 @@
 #include <nv/gl/gl_device.hh>
 #include <nv/gui/gui_environment.hh>
+#include <nv/sdl/sdl_window_manager.hh>
 #include <nv/interface/context.hh>
+#include <nv/interface/window_manager.hh>
 #include <nv/core/logging.hh>
 #include <nv/core/logger.hh>
@@ -18,4 +20,5 @@
 	~application();
 protected:
+	nv::window_manager* m_wm;
 	nv::device* m_device;
 	nv::window* m_window;
@@ -28,5 +31,6 @@
 {
 	m_device = new nv::gl_device();
-	m_window = m_device->create_window( 800, 600, false );
+	m_wm     = new nv::sdl::window_manager;
+	m_window = m_wm->create_window( m_device, 800, 600, false );
 	m_clear_state.buffers = nv::clear_state::COLOR_AND_DEPTH_BUFFER;
 	m_guienv = new nv::gui::environment( m_window );
Index: /trunk/tests/gui_test/test.style.lua
===================================================================
--- /trunk/tests/gui_test/test.style.lua	(revision 327)
+++ /trunk/tests/gui_test/test.style.lua	(revision 328)
@@ -6,6 +6,7 @@
 
 	window = {
-		border = 2,
-		border_color = { 0.2, 0.2, 0.4, 1.0 },
+		--border = 2,
+		--border_color = { 0.2, 0.2, 0.4, 1.0 },
+		skin = "button.png",
 	}
 }
