← Back to team overview

widelands-dev team mailing list archive

[Merge] lp:~widelands-dev/widelands/move_road_texture_out_of_graphics into lp:widelands

 

SirVer has proposed merging lp:~widelands-dev/widelands/move_road_texture_out_of_graphics into lp:widelands with lp:~widelands-dev/widelands/fix_some_resizing_bugs as a prerequisite.

Requested reviews:
  Widelands Developers (widelands-dev)

For more details, see:
https://code.launchpad.net/~widelands-dev/widelands/move_road_texture_out_of_graphics/+merge/242627

A bunch of cleanups and clarifications. This contains https://code.launchpad.net/~widelands-dev/widelands/fix_some_resizing_bugs (the diff should be against this branch) and should not be merged before the other one is.

Suggested commit message:

- Removes a lot of dynamic_casts from Surface to Texture.
- Ownership of dither texture and road textures are now only with the respective OpenGL programs. This cleans up class Graphic.
- Renamed Texture to TerrainTexture - I expect this will go away soon too.
- Renamed GLSurfaceScreen to Screen.
- Renamed GLSurfaceTexture to Texture.
- Renamed SurfaceCache to TextureCache.
- Renamed Composite to BlendMode.
-- 
Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/move_road_texture_out_of_graphics into lp:widelands.
=== modified file 'src/editor/ui_menus/editor_tool_set_terrain_options_menu.cc'
--- src/editor/ui_menus/editor_tool_set_terrain_options_menu.cc	2014-11-02 20:31:40 +0000
+++ src/editor/ui_menus/editor_tool_set_terrain_options_menu.cc	2014-11-24 07:32:35 +0000
@@ -30,7 +30,7 @@
 #include "graphic/graphic.h"
 #include "graphic/in_memory_image.h"
 #include "graphic/rendertarget.h"
-#include "graphic/surface.h"
+#include "graphic/terrain_texture.h"
 #include "graphic/texture.h"
 #include "logic/map.h"
 #include "logic/world/editor_category.h"
@@ -77,50 +77,50 @@
 
 		const Image* tex = g_gr->images().get(
 		   g_gr->get_maptexture_data(terrain_descr.get_texture())->get_texture_image());
-		Surface* surf = Surface::create(tex->width(), tex->height());
-		surf->blit(Point(0, 0), tex->surface(), Rect(0, 0, tex->width(), tex->height()), CM_Copy);
+		Texture* texture = new Texture(tex->width(), tex->height());
+		texture->blit(Point(0, 0), tex->texture(), Rect(0, 0, tex->width(), tex->height()), BlendMode::Copy);
 		Point pt(1, tex->height() - kSmallPicHeight - 1);
 
 		if (ter_is == TerrainDescription::GREEN) {
-			surf->blit(pt, green->surface(), Rect(0, 0, green->width(), green->height()));
+			texture->blit(pt, green->texture(), Rect(0, 0, green->width(), green->height()));
 			pt.x += kSmallPicWidth + 1;
 			/** TRANSLATORS: This is a terrain type tooltip in the editor */
 			tooltips.push_back(_("arable"));
 		} else {
 			if (ter_is & TerrainDescription::WATER) {
-				surf->blit(pt, water->surface(), Rect(0, 0, water->width(), water->height()));
+				texture->blit(pt, water->texture(), Rect(0, 0, water->width(), water->height()));
 				pt.x += kSmallPicWidth + 1;
 				/** TRANSLATORS: This is a terrain type tooltip in the editor */
 				tooltips.push_back(_("aquatic"));
 			}
 			else if (ter_is & TerrainDescription::MOUNTAIN) {
-				surf->blit(pt, mountain->surface(), Rect(0, 0, mountain->width(), mountain->height()));
+				texture->blit(pt, mountain->texture(), Rect(0, 0, mountain->width(), mountain->height()));
 				pt.x += kSmallPicWidth + 1;
 				/** TRANSLATORS: This is a terrain type tooltip in the editor */
 				tooltips.push_back(_("mountainous"));
 			}
 			if (ter_is & TerrainDescription::ACID) {
-				surf->blit(pt, dead->surface(), Rect(0, 0, dead->width(), dead->height()));
+				texture->blit(pt, dead->texture(), Rect(0, 0, dead->width(), dead->height()));
 				pt.x += kSmallPicWidth + 1;
 				/** TRANSLATORS: This is a terrain type tooltip in the editor */
 				tooltips.push_back(_("dead"));
 			}
 			if (ter_is & TerrainDescription::UNPASSABLE) {
-				surf->blit(
-				   pt, unpassable->surface(), Rect(0, 0, unpassable->width(), unpassable->height()));
+				texture->blit(
+				   pt, unpassable->texture(), Rect(0, 0, unpassable->width(), unpassable->height()));
 				pt.x += kSmallPicWidth + 1;
 				/** TRANSLATORS: This is a terrain type tooltip in the editor */
 				tooltips.push_back(_("unpassable"));
 			}
 			if (ter_is & TerrainDescription::DRY) {
-				surf->blit(pt, dry->surface(), Rect(0, 0, dry->width(), dry->height()));
+				texture->blit(pt, dry->texture(), Rect(0, 0, dry->width(), dry->height()));
 				/** TRANSLATORS: This is a terrain type tooltip in the editor */
 				 tooltips.push_back(_("treeless"));
 			}
 		}
 
 		// Make sure we delete this later on.
-		offscreen_images->emplace_back(new_in_memory_image("dummy_hash", surf));
+		offscreen_images->emplace_back(new_in_memory_image("dummy_hash", texture));
 		break;
 	}
 	/** TRANSLATORS: %1% = terrain name, %2% = list of terrain types  */

=== modified file 'src/game_io/CMakeLists.txt'
--- src/game_io/CMakeLists.txt	2014-10-11 16:08:10 +0000
+++ src/game_io/CMakeLists.txt	2014-11-24 07:32:35 +0000
@@ -27,7 +27,6 @@
     base_time_string
     economy
     graphic
-    graphic_surface
     io_fileread
     io_filesystem
     logic

=== modified file 'src/game_io/game_preload_packet.cc'
--- src/game_io/game_preload_packet.cc	2014-11-01 18:24:28 +0000
+++ src/game_io/game_preload_packet.cc	2014-11-24 07:32:35 +0000
@@ -28,7 +28,6 @@
 #include "graphic/graphic.h"
 #include "graphic/in_memory_image.h"
 #include "graphic/minimap_renderer.h"
-#include "graphic/surface.h"
 #include "logic/game.h"
 #include "logic/game_data_error.h"
 #include "logic/map.h"

=== modified file 'src/graphic/CMakeLists.txt'
--- src/graphic/CMakeLists.txt	2014-11-23 10:13:14 +0000
+++ src/graphic/CMakeLists.txt	2014-11-24 07:32:35 +0000
@@ -45,17 +45,17 @@
 
 wl_library(graphic_surface
   SRCS
-    compositemode.h
-    gl/surface_screen.cc
-    gl/surface_screen.h
-    gl/surface_texture.cc
-    gl/surface_texture.h
+    blend_mode.h
     gl/utils.cc
     gl/utils.h
+    screen.cc
+    screen.h
     surface.cc
     surface.h
-    surface_cache.cc
-    surface_cache.h
+    texture.cc
+    texture.h
+    texture_cache.cc
+    texture_cache.h
   USES_OPENGL
   USES_SDL2
   DEPENDS
@@ -90,20 +90,20 @@
     gl/blit_program.h
     gl/dither_program.cc
     gl/dither_program.h
+    gl/draw_line_program.cc
+    gl/draw_line_program.h
     gl/draw_rect_program.cc
     gl/draw_rect_program.h
-    gl/draw_line_program.cc
-    gl/draw_line_program.h
+    gl/fields_to_draw.h
     gl/fill_rect_program.cc
     gl/fill_rect_program.h
-    gl/fields_to_draw.h
     gl/game_renderer.cc
     gl/game_renderer.h
     gl/road_program.cc
     gl/road_program.h
+    gl/system_headers.h
     gl/terrain_program.cc
     gl/terrain_program.h
-    gl/system_headers.h
     graphic.cc
     graphic.h
     image_transformations.cc
@@ -116,10 +116,10 @@
     rendertarget.h
     richtext.cc
     richtext.h
+    terrain_texture.cc
+    terrain_texture.h
     text_parser.cc
     text_parser.h
-    texture.cc
-    texture.h
     wordwrap.cc
     wordwrap.h
   USES_OPENGL
@@ -146,6 +146,7 @@
     io_filesystem
     io_stream
     logic
+    notifications
     profile
     scripting
     sound

=== modified file 'src/graphic/animation.cc'
--- src/graphic/animation.cc	2014-09-20 09:37:47 +0000
+++ src/graphic/animation.cc	2014-11-24 07:32:35 +0000
@@ -41,7 +41,7 @@
 #include "graphic/image_cache.h"
 #include "graphic/image_transformations.h"
 #include "graphic/surface.h"
-#include "graphic/surface_cache.h"
+#include "graphic/texture_cache.h"
 #include "io/filesystem/layered_filesystem.h"
 #include "logic/bob.h"
 #include "logic/instances.h"
@@ -324,7 +324,7 @@
 	assert(target);
 
 	const Image& frame = get_frame(time, clr);
-	target->blit(dst, frame.surface(), srcrc);
+	target->blit(dst, frame.texture(), srcrc);
 }
 
 const Image& NonPackedAnimation::get_frame(uint32_t time, const RGBColor* playercolor) const {

=== renamed file 'src/graphic/compositemode.h' => 'src/graphic/blend_mode.h'
--- src/graphic/compositemode.h	2014-11-02 14:11:52 +0000
+++ src/graphic/blend_mode.h	2014-11-24 07:32:35 +0000
@@ -17,23 +17,17 @@
  *
  */
 
-#ifndef WL_GRAPHIC_COMPOSITEMODE_H
-#define WL_GRAPHIC_COMPOSITEMODE_H
-
-/**
- * Defines composition operations performed while blitting.
- */
-enum Composite {
-	/**
-	 * Perform a normal blitting operation that respects the alpha
-	 * channel if present.
-	 */
-	CM_UseAlpha = 0,
-
-	/**
-	 * Copy all pixel information, including alpha channel information.
-	 */
-	CM_Copy
+#ifndef WL_GRAPHIC_BLEND_MODE_H
+#define WL_GRAPHIC_BLEND_MODE_H
+
+// Defines blending during blitting.
+enum BlendMode {
+	// Perform a normal blitting operation that respects the alpha channel if
+	// present.
+	UseAlpha = 0,
+
+	// Copy all pixel information, including alpha channel information.
+	Copy
 };
 
-#endif  // end of include guard: WL_GRAPHIC_COMPOSITEMODE_H
+#endif  // end of include guard: WL_GRAPHIC_BLEND_MODE_H

=== modified file 'src/graphic/font_handler.cc'
--- src/graphic/font_handler.cc	2014-10-14 06:30:20 +0000
+++ src/graphic/font_handler.cc	2014-11-24 07:32:35 +0000
@@ -31,7 +31,7 @@
 #include "graphic/graphic.h"
 #include "graphic/in_memory_image.h"
 #include "graphic/rendertarget.h"
-#include "graphic/surface.h"
+#include "graphic/texture.h"
 #include "graphic/wordwrap.h"
 
 namespace UI {
@@ -197,7 +197,7 @@
 		return;
 	}
 
-	lce.image = new_in_memory_image("dummy_hash", Surface::create(text_surface));
+	lce.image = new_in_memory_image("dummy_hash", new Texture(text_surface));
 	lce.width = lce.image->width();
 	lce.height = lce.image->height();
 }

=== modified file 'src/graphic/font_handler1.cc'
--- src/graphic/font_handler1.cc	2014-09-10 14:48:40 +0000
+++ src/graphic/font_handler1.cc	2014-11-24 07:32:35 +0000
@@ -29,11 +29,11 @@
 #include "graphic/image.h"
 #include "graphic/image_cache.h"
 #include "graphic/rendertarget.h"
-#include "graphic/surface.h"
-#include "graphic/surface_cache.h"
 #include "graphic/text/rt_errors.h"
 #include "graphic/text/rt_render.h"
 #include "graphic/text/sdl_ttf_font.h"
+#include "graphic/texture.h"
+#include "graphic/texture_cache.h"
 #include "io/filesystem/filesystem.h"
 
 
@@ -42,29 +42,29 @@
 
 namespace {
 
-// An Image implementation that recreates a rich text surface when needed on
+// An Image implementation that recreates a rich text texture when needed on
 // the fly. It is meant to be saved into the ImageCache.
 class RTImage : public Image {
 public:
 	RTImage
-		(const string& ghash, SurfaceCache* surface_cache, RT::Renderer*
+		(const string& ghash, TextureCache* texture_cache, RT::Renderer*
 		 rt_renderer, const string& text, uint16_t gwidth)
-		: hash_(ghash), text_(text), width_(gwidth), surface_cache_(surface_cache),
+		: hash_(ghash), text_(text), width_(gwidth), texture_cache_(texture_cache),
 		  rt_renderer_(rt_renderer)
 	{}
 	virtual ~RTImage() {}
 
 	// Implements Image.
-	uint16_t width() const override {return surface()->width();}
-	uint16_t height() const override {return surface()->height();}
+	uint16_t width() const override {return texture()->width();}
+	uint16_t height() const override {return texture()->height();}
 	const string& hash() const override {return hash_;}
-	Surface* surface() const override {
-		Surface* surf = surface_cache_->get(hash_);
+	Texture* texture() const override {
+		Texture* surf = texture_cache_->get(hash_);
 		if (surf)
 			return surf;
 
 		surf = rt_renderer_->render(text_, width_);
-		surface_cache_->insert(hash_, surf, true);
+		texture_cache_->insert(hash_, surf, true);
 		return surf;
 	}
 
@@ -74,7 +74,7 @@
 	uint16_t width_;
 
 	// Nothing owned.
-	SurfaceCache* const surface_cache_;
+	TextureCache* const texture_cache_;
 	RT::Renderer* const rt_renderer_;
 };
 
@@ -87,8 +87,8 @@
 // be a problem.
 class FontHandler1 : public IFontHandler1 {
 public:
-	FontHandler1(ImageCache* image_cache, SurfaceCache* surface_cache, RT::Renderer* renderer) :
-		surface_cache_(surface_cache), image_cache_(image_cache), renderer_(renderer) {}
+	FontHandler1(ImageCache* image_cache, TextureCache* texture_cache, RT::Renderer* renderer) :
+		texture_cache_(texture_cache), image_cache_(image_cache), renderer_(renderer) {}
 	virtual ~FontHandler1() {}
 
 	const Image* render(const string& text, uint16_t w = 0) override {
@@ -97,21 +97,21 @@
 		if (image_cache_->has(hash))
 			return image_cache_->get(hash);
 
-		std::unique_ptr<RTImage> image(new RTImage(hash, surface_cache_, renderer_.get(), text, w));
-		image->surface(); // force the rich text to get rendered in case there is an exception thrown.
+		std::unique_ptr<RTImage> image(new RTImage(hash, texture_cache_, renderer_.get(), text, w));
+		image->texture(); // force the rich text to get rendered in case there is an exception thrown.
 
 		return image_cache_->insert(image.release());
 	}
 
 private:
-	SurfaceCache* const surface_cache_;  // not owned
+	TextureCache* const texture_cache_;  // not owned
 	ImageCache* const image_cache_;  // not owned
 	std::unique_ptr<RT::Renderer> renderer_;
 };
 
 IFontHandler1 * create_fonthandler(Graphic* gr) {
 	return new FontHandler1(
-	   &gr->images(), &gr->surfaces(), new RT::Renderer(&gr->images(), &gr->surfaces()));
+	   &gr->images(), &gr->textures(), new RT::Renderer(&gr->images(), &gr->textures()));
 }
 
 IFontHandler1 * g_fh1 = nullptr;

=== modified file 'src/graphic/gl/blit_program.cc'
--- src/graphic/gl/blit_program.cc	2014-11-02 16:55:53 +0000
+++ src/graphic/gl/blit_program.cc	2014-11-24 07:32:35 +0000
@@ -97,7 +97,7 @@
 void BlitProgram::draw(const FloatRect& gl_dest_rect,
                        const FloatRect& gl_src_rect,
                        const GLuint gl_texture,
-                       const Composite composite) {
+                       const BlendMode blend_mode) {
 	glUseProgram(gl_program_.object());
 	glEnableVertexAttribArray(attr_position_);
 	glBindBuffer(GL_ARRAY_BUFFER, gl_array_buffer_.object());
@@ -117,13 +117,13 @@
 	glActiveTexture(GL_TEXTURE0);
 	glBindTexture(GL_TEXTURE_2D, gl_texture);
 
-	if (composite == CM_Copy) {
+	if (blend_mode == BlendMode::Copy) {
 		glBlendFunc(GL_ONE, GL_ZERO);
 	}
 
 	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
 
-	if (composite == CM_Copy) {
+	if (blend_mode == BlendMode::Copy) {
 		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 	}
 

=== modified file 'src/graphic/gl/blit_program.h'
--- src/graphic/gl/blit_program.h	2014-11-08 18:06:17 +0000
+++ src/graphic/gl/blit_program.h	2014-11-24 07:32:35 +0000
@@ -21,8 +21,8 @@
 #define WL_GRAPHIC_GL_BLIT_PROGRAM_H
 
 #include "base/rect.h"
+#include "graphic/blend_mode.h"
 #include "graphic/color.h"
-#include "graphic/gl/surface_texture.h"
 #include "graphic/gl/utils.h"
 
 class BlitProgram {
@@ -32,12 +32,12 @@
 
 	// Draws the rectangle 'gl_src_rect' from the texture with the name
 	// 'gl_texture' to 'gl_dest_rect' in the currently bound framebuffer. All
-	// coordinates are in the OpenGL frame. The 'composite' defines if the
+	// coordinates are in the OpenGL frame. The 'blend_mode' defines if the
 	// values are copied or if alpha values are used.
 	void draw(const FloatRect& gl_dest_rect,
 	          const FloatRect& gl_src_rect,
 	          const GLuint gl_texture,
-	          const Composite composite);
+	          const BlendMode blend_mode);
 
 private:
 	BlitProgram();

=== modified file 'src/graphic/gl/dither_program.cc'
--- src/graphic/gl/dither_program.cc	2014-11-08 18:06:17 +0000
+++ src/graphic/gl/dither_program.cc	2014-11-24 07:32:35 +0000
@@ -21,10 +21,9 @@
 
 #include "base/wexception.h"
 #include "graphic/gl/fields_to_draw.h"
-#include "graphic/gl/surface_texture.h"
 #include "graphic/graphic.h"
 #include "graphic/image_io.h"
-#include "graphic/surface_cache.h"
+#include "graphic/terrain_texture.h"
 #include "graphic/texture.h"
 #include "io/fileread.h"
 #include "io/filesystem/layered_filesystem.h"
@@ -73,19 +72,6 @@
 }
 )";
 
-// Returns the texture mask for the dithering step.
-const GLSurfaceTexture* get_dither_edge_texture() {
-	constexpr char kFilename[] = "world/pics/edge.png";
-	constexpr char kCacheName[] =  "gltex#world/pics/edge.png";
-
-	if (Surface* surface = g_gr->surfaces().get(kCacheName))
-		return dynamic_cast<GLSurfaceTexture*>(surface);
-
-	SDL_Surface* sdlsurf = load_image_as_sdl_surface(kFilename, g_fs);
-	GLSurfaceTexture* edgetexture = new GLSurfaceTexture(sdlsurf, true);
-	g_gr->surfaces().insert(kCacheName, edgetexture, false);
-	return edgetexture;
-}
 
 }  // namespace
 
@@ -101,8 +87,13 @@
 
 	u_dither_texture_ = glGetUniformLocation(gl_program_.object(), "u_dither_texture");
 	u_terrain_texture_ = glGetUniformLocation(gl_program_.object(), "u_terrain_texture");
+
+	SDL_Surface* sdlsurf = load_image_as_sdl_surface("world/pics/edge.png", g_fs);
+	dither_mask_.reset(new Texture(sdlsurf, true));
 }
 
+DitherProgram::~DitherProgram() {}
+
 void DitherProgram::add_vertex(const FieldsToDraw::Field& field,
                                const int order_index,
                                const int terrain) {
@@ -220,7 +211,7 @@
 	// Set the sampler texture unit to 0
 	glActiveTexture(GL_TEXTURE0);
 	glUniform1i(u_dither_texture_, 0);
-	glBindTexture(GL_TEXTURE_2D, get_dither_edge_texture()->get_gl_texture());
+	glBindTexture(GL_TEXTURE_2D, dither_mask_->get_gl_texture());
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
 
@@ -234,9 +225,10 @@
 		if (current_data.empty()) {
 			continue;
 		}
-		glBindTexture(
-		   GL_TEXTURE_2D,
-		   g_gr->get_maptexture_data(terrains.get_unmutable(i).get_texture())->get_texture());
+		glBindTexture(GL_TEXTURE_2D,
+		              g_gr->get_maptexture_data(terrains.get_unmutable(i).get_texture())
+		                 ->texture()
+		                 .get_gl_texture());
 
 		glBufferData(GL_ARRAY_BUFFER,
 		             sizeof(PerVertexData) * current_data.size(),

=== modified file 'src/graphic/gl/dither_program.h'
--- src/graphic/gl/dither_program.h	2014-11-08 18:06:17 +0000
+++ src/graphic/gl/dither_program.h	2014-11-24 07:32:35 +0000
@@ -20,14 +20,19 @@
 #ifndef WL_GRAPHIC_GL_DITHER_PROGRAM_H
 #define WL_GRAPHIC_GL_DITHER_PROGRAM_H
 
+#include <memory>
+
 #include "graphic/gl/fields_to_draw.h"
 #include "graphic/gl/utils.h"
 #include "logic/description_maintainer.h"
 #include "logic/world/terrain_description.h"
 
+class Texture;
+
 class DitherProgram {
 public:
 	DitherProgram();
+	~DitherProgram();
 
 	// Draws the terrain.
 	void draw(const DescriptionMaintainer<Widelands::TerrainDescription>& terrains,
@@ -77,6 +82,9 @@
 	GLint u_terrain_texture_;
 	GLint u_dither_texture_;
 
+	// The texture mask for the dithering step.
+	std::unique_ptr<Texture> dither_mask_;
+
 	// Objects below are here to avoid memory allocations on each frame, they
 	// could theoretically also always be recreated. Index as follows:
 	// vertices_[terrain_index][vertex_index]

=== modified file 'src/graphic/gl/game_renderer.cc'
--- src/graphic/gl/game_renderer.cc	2014-11-22 21:31:21 +0000
+++ src/graphic/gl/game_renderer.cc	2014-11-24 07:32:35 +0000
@@ -28,7 +28,7 @@
 #include "graphic/graphic.h"
 #include "graphic/rendertarget.h"
 #include "graphic/surface.h"
-#include "graphic/texture.h"
+#include "graphic/terrain_texture.h"
 #include "logic/editor_game_base.h"
 #include "logic/player.h"
 #include "logic/world/world.h"
@@ -165,8 +165,8 @@
 			map.normalize_coords(coords);
 			const FCoords& fcoords = map.get_fcoords(coords);
 
-			f.texture_x = float(x) / TEXTURE_WIDTH;
-			f.texture_y = float(y) / TEXTURE_HEIGHT;
+			f.texture_x = float(x) / kTextureWidth;
+			f.texture_y = float(y) / kTextureHeight;
 
 			f.gl_x = f.pixel_x = x + surface_offset.x;
 			f.gl_y = f.pixel_y = y + surface_offset.y - fcoords.field->get_height() * HEIGHT_FACTOR;

=== modified file 'src/graphic/gl/road_program.cc'
--- src/graphic/gl/road_program.cc	2014-11-22 21:31:21 +0000
+++ src/graphic/gl/road_program.cc	2014-11-24 07:32:35 +0000
@@ -24,6 +24,7 @@
 #include "base/log.h"
 #include "graphic/gl/fields_to_draw.h"
 #include "graphic/graphic.h"
+#include "graphic/image_io.h"
 #include "graphic/texture.h"
 #include "logic/roadtype.h"
 
@@ -85,6 +86,12 @@
 
 	u_normal_road_texture_ = glGetUniformLocation(gl_program_.object(), "u_normal_road_texture");
 	u_busy_road_texture_ = glGetUniformLocation(gl_program_.object(), "u_busy_road_texture");
+
+	normal_road_texture_.reset(load_image("world/pics/roadt_normal.png"));
+	busy_road_texture_.reset(load_image("world/pics/roadt_busy.png"));
+}
+
+RoadProgram::~RoadProgram() {
 }
 
 void RoadProgram::add_road(const Surface& surface,
@@ -211,17 +218,12 @@
 	glBindBuffer(GL_ARRAY_BUFFER, 0);
 
 	// Bind the textures.
-	const GLuint rt_normal = dynamic_cast<const GLSurfaceTexture&>(
-	                      g_gr->get_road_texture(Widelands::Road_Normal)).get_gl_texture();
-	const GLuint rt_busy = dynamic_cast<const GLSurfaceTexture&>(
-	                    g_gr->get_road_texture(Widelands::Road_Busy)).get_gl_texture();
-
 	glActiveTexture(GL_TEXTURE0);
-	glBindTexture(GL_TEXTURE_2D, rt_normal);
+	glBindTexture(GL_TEXTURE_2D, normal_road_texture_->get_gl_texture());
 	glUniform1i(u_normal_road_texture_, 0);
 
 	glActiveTexture(GL_TEXTURE1);
-	glBindTexture(GL_TEXTURE_2D, rt_busy);
+	glBindTexture(GL_TEXTURE_2D, busy_road_texture_->get_gl_texture());
 	glUniform1i(u_busy_road_texture_, 1);
 
 	glDrawArrays(GL_TRIANGLES, 0, vertices_.size());

=== modified file 'src/graphic/gl/road_program.h'
--- src/graphic/gl/road_program.h	2014-11-22 21:31:21 +0000
+++ src/graphic/gl/road_program.h	2014-11-24 07:32:35 +0000
@@ -20,18 +20,22 @@
 #ifndef WL_GRAPHIC_GL_ROAD_PROGRAM_H
 #define WL_GRAPHIC_GL_ROAD_PROGRAM_H
 
+#include <memory>
 #include <vector>
 
 #include "base/macros.h"
 #include "graphic/gl/fields_to_draw.h"
 #include "graphic/gl/utils.h"
-#include "graphic/surface.h"
 #include "logic/roadtype.h"
 
+class Texture;
+class Surface;
+
 class RoadProgram {
 public:
 	// Compiles the program. Throws on error.
 	RoadProgram();
+	~RoadProgram();
 
 	// Draws the roads. The 'surface' is needed to convert from pixel space to
 	// GL space.
@@ -79,6 +83,10 @@
 	// All vertices that get rendered this frame.
 	std::vector<PerVertexData> vertices_;
 
+	// The road textures.
+	std::unique_ptr<Texture> normal_road_texture_;
+	std::unique_ptr<Texture> busy_road_texture_;
+
 	DISALLOW_COPY_AND_ASSIGN(RoadProgram);
 };
 

=== modified file 'src/graphic/gl/terrain_program.cc'
--- src/graphic/gl/terrain_program.cc	2014-11-08 18:06:17 +0000
+++ src/graphic/gl/terrain_program.cc	2014-11-24 07:32:35 +0000
@@ -21,6 +21,7 @@
 
 #include "graphic/gl/fields_to_draw.h"
 #include "graphic/graphic.h"
+#include "graphic/terrain_texture.h"
 #include "graphic/texture.h"
 
 namespace  {
@@ -117,9 +118,10 @@
 		if (indices.empty()) {
 			continue;
 		}
-		glBindTexture(
-		   GL_TEXTURE_2D,
-		   g_gr->get_maptexture_data(terrains.get_unmutable(i).get_texture())->get_texture());
+		glBindTexture(GL_TEXTURE_2D,
+		              g_gr->get_maptexture_data(terrains.get_unmutable(i).get_texture())
+		                 ->texture()
+		                 .get_gl_texture());
 		glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_SHORT, indices.data());
 	}
 

=== modified file 'src/graphic/graphic.cc'
--- src/graphic/graphic.cc	2014-11-24 07:32:34 +0000
+++ src/graphic/graphic.cc	2014-11-24 07:32:35 +0000
@@ -35,13 +35,15 @@
 #include "graphic/animation.h"
 #include "graphic/diranimations.h"
 #include "graphic/font_handler.h"
-#include "graphic/gl/surface_screen.h"
+#include "graphic/gl/system_headers.h"
 #include "graphic/image.h"
 #include "graphic/image_io.h"
 #include "graphic/image_transformations.h"
 #include "graphic/rendertarget.h"
-#include "graphic/surface_cache.h"
+#include "graphic/screen.h"
+#include "graphic/terrain_texture.h"
 #include "graphic/texture.h"
+#include "graphic/texture_cache.h"
 #include "io/fileread.h"
 #include "io/filesystem/layered_filesystem.h"
 #include "io/streamwrite.h"
@@ -57,7 +59,7 @@
 
 /// The size of the transient (i.e. temporary) surfaces in the cache in bytes.
 /// These are all surfaces that are not loaded from disk.
-const uint32_t TRANSIENT_SURFACE_CACHE_SIZE = 160 << 20;   // shifting converts to MB
+const uint32_t TRANSIENT_TEXTURE_CACHE_SIZE = 160 << 20;   // shifting converts to MB
 
 // Sets the icon for the application.
 void set_icon(SDL_Window* sdl_window) {
@@ -80,8 +82,8 @@
    : m_window_mode_width(window_mode_w),
      m_window_mode_height(window_mode_h),
      m_update(true),
-     surface_cache_(create_surface_cache(TRANSIENT_SURFACE_CACHE_SIZE)),
-     image_cache_(new ImageCache(surface_cache_.get())),
+     texture_cache_(create_texture_cache(TRANSIENT_TEXTURE_CACHE_SIZE)),
+     image_cache_(new ImageCache(texture_cache_.get())),
      animation_manager_(new AnimationManager())
 {
 	ImageTransformations::initialize();
@@ -156,15 +158,12 @@
 		    disp_mode.h);
 		assert(SDL_BYTESPERPIXEL(disp_mode.format) == 4);
 	}
-
-	pic_road_normal_.reset(load_image("world/pics/roadt_normal.png"));
-	pic_road_busy_.reset(load_image("world/pics/roadt_busy.png"));
 }
 
 Graphic::~Graphic()
 {
 	m_maptextures.clear();
-	surface_cache_->flush();
+	texture_cache_->flush();
 	// TODO(unknown): this should really not be needed, but currently is :(
 	if (UI::g_fh)
 		UI::g_fh->flush();
@@ -209,7 +208,7 @@
 	int new_w, new_h;
 	SDL_GetWindowSize(m_sdl_window, &new_w, &new_h);
 
-	screen_.reset(new GLSurfaceScreen(new_w, new_h));
+	screen_.reset(new Screen(new_w, new_h));
 	m_rendertarget.reset(new RenderTarget(screen_.get()));
 
 	Notifications::publish(GraphicResolutionChanged{new_w, new_h});
@@ -301,12 +300,12 @@
  * @param sw a StreamWrite where the png is written to
  */
 void Graphic::save_png(const Image* image, StreamWrite * sw) const {
-	save_surface_to_png(image->surface(), sw);
+	save_surface_to_png(image->texture(), sw);
 }
 
 uint32_t Graphic::new_maptexture(const std::vector<std::string>& texture_files, const uint32_t frametime)
 {
-	m_maptextures.emplace_back(new Texture(texture_files, frametime));
+	m_maptextures.emplace_back(new TerrainTexture(texture_files, frametime));
 	return m_maptextures.size(); // ID 1 is at m_maptextures[0]
 }
 
@@ -335,20 +334,10 @@
  * Retrieve the map texture with the given number
  * \return the actual texture data associated with the given ID.
  */
-Texture * Graphic::get_maptexture_data(uint32_t id)
+TerrainTexture * Graphic::get_maptexture_data(uint32_t id)
 {
 	--id; // ID 1 is at m_maptextures[0]
 
 	assert(id < m_maptextures.size());
 	return m_maptextures[id].get();
 }
-
-/**
- * Retrives the texture of the road type.
- * \return The road texture
- */
-Surface& Graphic::get_road_texture(int32_t roadtex)
-{
-	return
-		roadtex == Widelands::Road_Normal ? *pic_road_normal_.get() : *pic_road_busy_.get();
-}

=== modified file 'src/graphic/graphic.h'
--- src/graphic/graphic.h	2014-11-24 07:32:34 +0000
+++ src/graphic/graphic.h	2014-11-24 07:32:35 +0000
@@ -36,9 +36,9 @@
 class AnimationManager;
 class RenderTarget;
 class Surface;
-class SurfaceCache;
+class TextureCache;
 class StreamWrite;
-struct Texture;
+struct TerrainTexture;
 
 // Will be send whenever the resolution changes.
 struct GraphicResolutionChanged {
@@ -50,10 +50,10 @@
 };
 
 /**
- * This class is a kind of Swiss Army knife for your graphics need. It
- * initializes the graphic system and provides access to resolutions. It has an
- * Animation, Image and Surface cache and owns the road textures. It also
- * offers functionality to save a screenshot.
+ * This class is a kind of Swiss Army knife for your graphics need.
+ * It initializes the graphic system and provides access to
+ * resolutions. It owns an Animation, Image and Surface cache. It
+ * also offers functionality to save a screenshot.
  */
 class Graphic {
 public:
@@ -77,21 +77,19 @@
 	void refresh();
 	SDL_Window* get_sdlwindow() {return m_sdl_window;}
 
-	SurfaceCache& surfaces() const {return *surface_cache_.get();}
+	TextureCache& textures() const {return *texture_cache_.get();}
 	ImageCache& images() const {return *image_cache_.get();}
 	AnimationManager& animations() const {return *animation_manager_.get();}
 
 	void save_png(const Image*, StreamWrite*) const;
 
-	// Creates a new Texture() with the given 'frametime' and using the given
+	// Creates a new TerrainTexture() with the given 'frametime' and using the given
 	// 'texture_files' as the images for it and returns it id.
 	uint32_t new_maptexture(const std::vector<std::string>& texture_files, uint32_t frametime);
 	void animate_maptextures(uint32_t time);
 
 	void screenshot(const std::string& fname) const;
-	Texture * get_maptexture_data(uint32_t id);
-
-	Surface& get_road_texture(int32_t roadtex);
+	TerrainTexture * get_maptexture_data(uint32_t id);
 
 private:
 	// Called when the resolution (might) have changed.
@@ -114,19 +112,15 @@
 	/// This marks the complete screen for updating.
 	bool m_update;
 
-	/// Volatile cache of Hardware dependant surfaces.
-	std::unique_ptr<SurfaceCache> surface_cache_;
+	/// Volatile cache of Hardware dependant textures.
+	std::unique_ptr<TextureCache> texture_cache_;
 	/// Non-volatile cache of hardware independent images. The use the
-	/// surface_cache_ to cache their pixel data.
+	/// texture_cache_ to cache their pixel data.
 	std::unique_ptr<ImageCache> image_cache_;
 	/// This holds all animations.
 	std::unique_ptr<AnimationManager> animation_manager_;
 
-	// The texture needed to draw roads.
-	std::unique_ptr<Surface> pic_road_normal_;
-	std::unique_ptr<Surface> pic_road_busy_;
-
-	std::vector<std::unique_ptr<Texture>> m_maptextures;
+	std::vector<std::unique_ptr<TerrainTexture>> m_maptextures;
 };
 
 extern Graphic * g_gr;

=== modified file 'src/graphic/image.h'
--- src/graphic/image.h	2014-07-14 19:48:07 +0000
+++ src/graphic/image.h	2014-11-24 07:32:35 +0000
@@ -26,12 +26,12 @@
 
 #include "base/macros.h"
 
+class Texture;
+
 /**
  * Interface to a bitmap that can act as the source of a rendering
  * operation.
  */
-class Surface;
-
 class Image {
 public:
 	Image() = default;
@@ -41,7 +41,7 @@
 	virtual uint16_t height() const = 0;
 
 	// Internal functions needed for caching.
-	virtual Surface* surface() const = 0;
+	virtual Texture* texture() const = 0;
 	virtual const std::string& hash() const = 0;
 
 	DISALLOW_COPY_AND_ASSIGN(Image);

=== modified file 'src/graphic/image_cache.cc'
--- src/graphic/image_cache.cc	2014-07-26 10:43:23 +0000
+++ src/graphic/image_cache.cc	2014-11-24 07:32:35 +0000
@@ -25,21 +25,21 @@
 #include "base/log.h"
 #include "graphic/image.h"
 #include "graphic/image_io.h"
-#include "graphic/surface.h"
-#include "graphic/surface_cache.h"
+#include "graphic/texture.h"
+#include "graphic/texture_cache.h"
 
 namespace  {
 
 // Image Implementation that loads images from disc when they should be drawn.
-// Uses SurfaceCache. These images are meant to be cached in ImageCache.
+// Uses TextureCache. These images are meant to be cached in ImageCache.
 class FromDiskImage : public Image {
 public:
-	FromDiskImage(const std::string& filename, SurfaceCache* surface_cache) :
+	FromDiskImage(const std::string& filename, TextureCache* texture_cache) :
 		filename_(filename),
-		surface_cache_(surface_cache) {
-			Surface* surf = reload_image_();
-			w_ = surf->width();
-			h_ = surf->height();
+		texture_cache_(texture_cache) {
+			Texture* texture = reload_image_();
+			w_ = texture->width();
+			h_ = texture->height();
 		}
 	virtual ~FromDiskImage() {}
 
@@ -47,27 +47,27 @@
 	uint16_t width() const override {return w_; }
 	uint16_t height() const override {return h_;}
 	const std::string& hash() const override {return filename_;}
-	Surface* surface() const override {
-		Surface* surf = surface_cache_->get(filename_);
-		if (surf)
-			return surf;
+	Texture* texture() const override {
+		Texture* texture = texture_cache_->get(filename_);
+		if (texture)
+			return texture;
 		return reload_image_();
 	}
 
 private:
-	Surface* reload_image_() const {
-		Surface* surf = surface_cache_->insert(filename_, load_image(filename_), false);
-		return surf;
+	Texture* reload_image_() const {
+		Texture* texture = texture_cache_->insert(filename_, load_image(filename_), false);
+		return texture;
 	}
 	uint16_t w_, h_;
 	const std::string filename_;
 
-	SurfaceCache* const surface_cache_;  // Not owned.
+	TextureCache* const texture_cache_;  // Not owned.
 };
 
 }  // namespace
 
-ImageCache::ImageCache(SurfaceCache* const surface_cache) : surface_cache_(surface_cache) {
+ImageCache::ImageCache(TextureCache* const texture_cache) : texture_cache_(texture_cache) {
 }
 
 ImageCache::~ImageCache() {
@@ -90,7 +90,7 @@
 const Image* ImageCache::get(const std::string& hash) {
 	ImageMap::const_iterator it = images_.find(hash);
 	if (it == images_.end()) {
-		images_.insert(make_pair(hash, new FromDiskImage(hash, surface_cache_)));
+		images_.insert(make_pair(hash, new FromDiskImage(hash, texture_cache_)));
 		return get(hash);
 	}
 	return it->second;

=== modified file 'src/graphic/image_cache.h'
--- src/graphic/image_cache.h	2014-09-14 11:31:58 +0000
+++ src/graphic/image_cache.h	2014-11-24 07:32:35 +0000
@@ -28,7 +28,7 @@
 #include "base/macros.h"
 #include "graphic/image.h"
 
-class SurfaceCache;
+class TextureCache;
 
 // For historic reasons, most part of the Widelands code base expect that an
 // Image stays valid for the whole duration of the program run. This class is
@@ -40,7 +40,7 @@
 class ImageCache {
 public:
 	// Does not take ownership.
-	ImageCache(SurfaceCache* surface_cache);
+	ImageCache(TextureCache* texture_cache);
 	~ImageCache();
 
 	// Insert the given Image into the cache. The hash is defined by Image's hash()
@@ -60,7 +60,7 @@
 	using ImageMap = std::map<std::string, const Image*>;
 
 	ImageMap images_;  /// hash of cached filename/image pairs
-	SurfaceCache* const surface_cache_;  // Not owned.
+	TextureCache* const texture_cache_;  // Not owned.
 
 	DISALLOW_COPY_AND_ASSIGN(ImageCache);
 };

=== modified file 'src/graphic/image_io.cc'
--- src/graphic/image_io.cc	2014-09-20 09:37:47 +0000
+++ src/graphic/image_io.cc	2014-11-24 07:32:35 +0000
@@ -26,7 +26,7 @@
 #include <png.h>
 
 #include "base/wexception.h"
-#include "graphic/surface.h"
+#include "graphic/texture.h"
 #include "io/fileread.h"
 #include "io/filesystem/layered_filesystem.h"
 #include "io/streamwrite.h"
@@ -47,8 +47,8 @@
 
 }  // namespace
 
-Surface* load_image(const std::string& fname, FileSystem* fs) {
-	return Surface::create(load_image_as_sdl_surface(fname, fs));
+Texture* load_image(const std::string& fname, FileSystem* fs) {
+	return new Texture(load_image_as_sdl_surface(fname, fs));
 }
 
 SDL_Surface* load_image_as_sdl_surface(const std::string& fname, FileSystem* fs) {

=== modified file 'src/graphic/image_io.h'
--- src/graphic/image_io.h	2014-09-09 17:15:20 +0000
+++ src/graphic/image_io.h	2014-11-24 07:32:35 +0000
@@ -25,6 +25,7 @@
 #include "base/wexception.h"
 
 class FileSystem;
+class Texture;
 class StreamWrite;
 class Surface;
 struct SDL_Surface;
@@ -43,12 +44,11 @@
 };
 
 /// Loads the image 'fn' from 'fs'.
-Surface* load_image(const std::string& fn, FileSystem* fs = nullptr);
+Texture* load_image(const std::string& fn, FileSystem* fs = nullptr);
 
 /// Loads the image 'fn' from 'fs' into an SDL_Surface. Caller must SDL_FreeSurface() the returned value.
 SDL_Surface* load_image_as_sdl_surface(const std::string& fn, FileSystem* fs = nullptr);
 
-
 /// Saves the 'surface' to 'sw' as a PNG.
 bool save_surface_to_png(Surface* surface, StreamWrite* sw);
 

=== modified file 'src/graphic/image_transformations.cc'
--- src/graphic/image_transformations.cc	2014-11-22 21:31:21 +0000
+++ src/graphic/image_transformations.cc	2014-11-24 07:32:35 +0000
@@ -28,8 +28,8 @@
 #include "base/macros.h"
 #include "graphic/color.h"
 #include "graphic/graphic.h"
-#include "graphic/surface.h"
-#include "graphic/surface_cache.h"
+#include "graphic/texture.h"
+#include "graphic/texture_cache.h"
 
 using namespace std;
 
@@ -44,24 +44,24 @@
  * Create and return an \ref SDL_Surface that contains the given sub-rectangle
  * of the given pixel region.
  */
-SDL_Surface* extract_sdl_surface(Surface & surf, Rect srcrect)
+SDL_Surface* extract_sdl_surface(Texture & texture, Rect srcrect)
 {
 	assert(srcrect.x >= 0);
 	assert(srcrect.y >= 0);
-	assert(srcrect.x + srcrect.w <= surf.width());
-	assert(srcrect.y + srcrect.h <= surf.height());
+	assert(srcrect.x + srcrect.w <= texture.width());
+	assert(srcrect.y + srcrect.h <= texture.height());
 
-	const SDL_PixelFormat & fmt = surf.format();
+	const SDL_PixelFormat & fmt = texture.format();
 	SDL_Surface * dest = SDL_CreateRGBSurface
 		(SDL_SWSURFACE, srcrect.w, srcrect.h,
 		 fmt.BitsPerPixel, fmt.Rmask, fmt.Gmask, fmt.Bmask, fmt.Amask);
 
-	surf.lock(Surface::Lock_Normal);
+	texture.lock(Surface::Lock_Normal);
 	SDL_LockSurface(dest);
 
-	uint32_t srcpitch = surf.get_pitch();
+	uint32_t srcpitch = texture.get_pitch();
 	uint32_t rowsize = srcrect.w * fmt.BytesPerPixel;
-	uint8_t * srcpix = surf.get_pixels() + srcpitch * srcrect.y + fmt.BytesPerPixel * srcrect.x;
+	uint8_t * srcpix = texture.get_pixels() + srcpitch * srcrect.y + fmt.BytesPerPixel * srcrect.x;
 	uint8_t * dstpix = static_cast<uint8_t *>(dest->pixels);
 
 	for (uint32_t y = 0; y < srcrect.h; ++y) {
@@ -71,7 +71,7 @@
 	}
 
 	SDL_UnlockSurface(dest);
-	surf.unlock(Surface::Unlock_NoChange);
+	texture.unlock(Surface::Unlock_NoChange);
 
 	return dest;
 }
@@ -79,7 +79,7 @@
 /**
  * Produces a resized version of the specified image
  */
-Surface* resize_surface(Surface* src, uint32_t w, uint32_t h) {
+Texture* resize_surface(Texture* src, uint32_t w, uint32_t h) {
 	assert(w != src->width() || h != src->height());
 
 	// First step: compute scaling factors
@@ -89,7 +89,7 @@
 	SDL_Surface * srcsdl = extract_sdl_surface(*src, srcrect);
 	bool free_source = true;
 
-	// If we actually shrink a surface, ballpark the zoom so that the shrinking
+	// If we actually shrink a texture, ballpark the zoom so that the shrinking
 	// effect is weakened.
 	int factor = 1;
 	while ((static_cast<double>(w) * factor / srcsdl->w) < 1. ||
@@ -146,29 +146,29 @@
 		zoomed = placed;
 	}
 
-	return Surface::create(zoomed);
+	return new Texture(zoomed);
 }
 
 /**
- * Create a grayed version of the given surface.
+ * Create a grayed version of the given texture.
  */
-Surface* gray_out_surface(Surface* surf) {
-	assert(surf);
-
-	uint16_t w = surf->width();
-	uint16_t h = surf->height();
-	const SDL_PixelFormat & origfmt = surf->format();
-
-	Surface* dest = Surface::create(w, h);
+Texture* gray_out_texture(Texture* texture) {
+	assert(texture);
+
+	uint16_t w = texture->width();
+	uint16_t h = texture->height();
+	const SDL_PixelFormat & origfmt = texture->format();
+
+	Texture* dest = new Texture(w, h);
 	const SDL_PixelFormat & destfmt = dest->format();
 
-	surf->lock(Surface::Lock_Normal);
+	texture->lock(Surface::Lock_Normal);
 	dest->lock(Surface::Lock_Discard);
 	for (uint32_t y = 0; y < h; ++y) {
 		for (uint32_t x = 0; x < w; ++x) {
 			RGBAColor color;
 
-			color.set(origfmt, surf->get_pixel(x, y));
+			color.set(origfmt, texture->get_pixel(x, y));
 
 			//  Halve the opacity to give some difference for image that are
 			//  grayscale to begin with.
@@ -184,32 +184,32 @@
 			dest->set_pixel(x, y, color.map(destfmt));
 		}
 	}
-	surf->unlock(Surface::Unlock_NoChange);
+	texture->unlock(Surface::Unlock_NoChange);
 	dest->unlock(Surface::Unlock_Update);
 
 	return dest;
 }
 
 /**
- * Creates an image with changed luminosity from the given surface.
+ * Creates an image with changed luminosity from the given texture.
  */
-Surface* change_luminosity_of_surface(Surface* surf, float factor, bool halve_alpha) {
-	assert(surf);
-
-	uint16_t w = surf->width();
-	uint16_t h = surf->height();
-	const SDL_PixelFormat & origfmt = surf->format();
-
-	Surface* dest = Surface::create(w, h);
+Texture* change_luminosity_of_texture(Texture* texture, float factor, bool halve_alpha) {
+	assert(texture);
+
+	uint16_t w = texture->width();
+	uint16_t h = texture->height();
+	const SDL_PixelFormat & origfmt = texture->format();
+
+	Texture* dest = new Texture(w, h);
 	const SDL_PixelFormat & destfmt = dest->format();
 
-	surf->lock(Surface::Lock_Normal);
+	texture->lock(Surface::Lock_Normal);
 	dest->lock(Surface::Lock_Discard);
 	for (uint32_t y = 0; y < h; ++y) {
 		for (uint32_t x = 0; x < w; ++x) {
 			RGBAColor color;
 
-			color.set(origfmt, surf->get_pixel(x, y));
+			color.set(origfmt, texture->get_pixel(x, y));
 
 			if (halve_alpha)
 				color.a >>= 1;
@@ -221,7 +221,7 @@
 			dest->set_pixel(x, y, color.map(destfmt));
 		}
 	}
-	surf->unlock(Surface::Unlock_NoChange);
+	texture->unlock(Surface::Unlock_NoChange);
 	dest->unlock(Surface::Unlock_Update);
 
 	return dest;
@@ -229,26 +229,28 @@
 
 // Encodes the given Image into the corresponding image for player color.
 // Takes the neutral set of images and the player color mask.
-Surface* make_playerclr_surface(Surface& orig_surface, Surface& pcmask_surface, const RGBColor& color) {
-	Surface* new_surface = Surface::create(orig_surface.width(), orig_surface.height());
-
-	const SDL_PixelFormat & fmt = orig_surface.format();
-	const SDL_PixelFormat & fmt_pc = pcmask_surface.format();
-	const SDL_PixelFormat & destfmt = new_surface->format();
-
-	orig_surface.lock(Surface::Lock_Normal);
-	pcmask_surface.lock(Surface::Lock_Normal);
-	new_surface->lock(Surface::Lock_Discard);
+Texture* make_playerclr_texture(Texture& original_texture,
+                                         Texture& pcmask_texture,
+                                         const RGBColor& color) {
+	Texture* new_texture = new Texture(original_texture.width(), original_texture.height());
+
+	const SDL_PixelFormat & fmt = original_texture.format();
+	const SDL_PixelFormat & fmt_pc = pcmask_texture.format();
+	const SDL_PixelFormat & destfmt = new_texture->format();
+
+	original_texture.lock(Surface::Lock_Normal);
+	pcmask_texture.lock(Surface::Lock_Normal);
+	new_texture->lock(Surface::Lock_Discard);
 	// This could be done significantly faster, but since we
 	// cache the result, let's keep it simple for now.
-	for (uint32_t y = 0; y < orig_surface.height(); ++y) {
-		for (uint32_t x = 0; x < orig_surface.width(); ++x) {
+	for (uint32_t y = 0; y < original_texture.height(); ++y) {
+		for (uint32_t x = 0; x < original_texture.width(); ++x) {
 			RGBAColor source;
 			RGBAColor mask;
 			RGBAColor product;
 
-			source.set(fmt, orig_surface.get_pixel(x, y));
-			mask.set(fmt_pc, pcmask_surface.get_pixel(x, y));
+			source.set(fmt, original_texture.get_pixel(x, y));
+			mask.set(fmt_pc, pcmask_texture.get_pixel(x, y));
 
 			if
 				(uint32_t const influence =
@@ -277,45 +279,45 @@
 					product = source;
 				}
 
-			new_surface->set_pixel(x, y, product.map(destfmt));
+			new_texture->set_pixel(x, y, product.map(destfmt));
 		}
 	}
-	orig_surface.unlock(Surface::Unlock_NoChange);
-	pcmask_surface.unlock(Surface::Unlock_NoChange);
-	new_surface->unlock(Surface::Unlock_Update);
+	original_texture.unlock(Surface::Unlock_NoChange);
+	pcmask_texture.unlock(Surface::Unlock_NoChange);
+	new_texture->unlock(Surface::Unlock_Update);
 
-	return new_surface;
+	return new_texture;
 }
 
 // An Image implementation that is the transformation of another Image. Uses
-// the SurfaceCache to avoid recalculating the transformation too often. No
+// the TextureCache to avoid recalculating the transformation too often. No
 // ownerships are taken.
 class TransformedImage : public Image {
 public:
-	TransformedImage(const string& ghash, const Image& original, SurfaceCache* surface_cache) :
-		hash_(ghash), original_(original), surface_cache_(surface_cache) {}
+	TransformedImage(const string& ghash, const Image& original, TextureCache* texture_cache) :
+		hash_(ghash), original_(original), texture_cache_(texture_cache) {}
 	virtual ~TransformedImage() {}
 
 	// Implements Image.
 	uint16_t width() const override {return original_.width();}
 	uint16_t height() const override {return original_.height();}
 	const string& hash() const override {return hash_;}
-	Surface* surface() const override {
-		Surface* surf = surface_cache_->get(hash_);
-		if (surf)
-			return surf;
+	Texture* texture() const override {
+		Texture* texture = texture_cache_->get(hash_);
+		if (texture)
+			return texture;
 
-		surf = recalculate_surface();
-		surface_cache_->insert(hash_, surf, true);
-		return surf;
+		texture = recalculate_texture();
+		texture_cache_->insert(hash_, texture, true);
+		return texture;
 	}
 
-	virtual Surface* recalculate_surface() const = 0;
+	virtual Texture* recalculate_texture() const = 0;
 
 protected:
 	const string hash_;
 	const Image& original_;
-	SurfaceCache* const surface_cache_;  // not owned
+	TextureCache* const texture_cache_;  // not owned
 };
 
 // A resized copy of an Image.
@@ -323,8 +325,8 @@
 public:
 	ResizedImage
 		(const string& ghash, const Image& original,
-		 SurfaceCache* surface_cache, uint16_t w, uint16_t h)
-		: TransformedImage(ghash, original, surface_cache), w_(w), h_(h) {
+		 TextureCache* texture_cache, uint16_t w, uint16_t h)
+		: TransformedImage(ghash, original, texture_cache), w_(w), h_(h) {
 			assert(w != original.width() || h != original.height());
 	}
 	virtual ~ResizedImage() {}
@@ -334,8 +336,8 @@
 	uint16_t height() const override {return h_;}
 
 	// Implements TransformedImage.
-	Surface* recalculate_surface() const override {
-		Surface* rv = resize_surface(original_.surface(), w_, h_);
+	Texture* recalculate_texture() const override {
+		Texture* rv = resize_surface(original_.texture(), w_, h_);
 		return rv;
 	}
 
@@ -346,14 +348,14 @@
 // A grayed out copy of an Image.
 class GrayedOutImage : public TransformedImage {
 public:
-	GrayedOutImage(const string& ghash, const Image& original, SurfaceCache* surface_cache) :
-		TransformedImage(ghash, original, surface_cache)
+	GrayedOutImage(const string& ghash, const Image& original, TextureCache* texture_cache) :
+		TransformedImage(ghash, original, texture_cache)
 	{}
 	virtual ~GrayedOutImage() {}
 
 	// Implements TransformedImage.
-	Surface* recalculate_surface() const override {
-		return gray_out_surface(original_.surface());
+	Texture* recalculate_texture() const override {
+		return gray_out_texture(original_.texture());
 	}
 };
 
@@ -362,16 +364,16 @@
 public:
 	ChangeLuminosityImage
 		(const string& ghash, const Image& original,
-		 SurfaceCache* surface_cache, float factor, bool halve_alpha)
-		: TransformedImage(ghash, original, surface_cache),
+		 TextureCache* texture_cache, float factor, bool halve_alpha)
+		: TransformedImage(ghash, original, texture_cache),
 		  factor_(factor),
 		  halve_alpha_(halve_alpha)
 	{}
 	virtual ~ChangeLuminosityImage() {}
 
 	// Implements TransformedImage.
-	Surface* recalculate_surface() const override {
-		return change_luminosity_of_surface(original_.surface(), factor_, halve_alpha_);
+	Texture* recalculate_texture() const override {
+		return change_luminosity_of_texture(original_.texture(), factor_, halve_alpha_);
 	}
 
 private:
@@ -385,14 +387,14 @@
 public:
 	PlayerColoredImage
 		(const string& ghash, const Image& original,
-		 SurfaceCache* surface_cache, const RGBColor& color, const Image& mask)
-		: TransformedImage(ghash, original, surface_cache), color_(color), mask_(mask)
+		 TextureCache* texture_cache, const RGBColor& color, const Image& mask)
+		: TransformedImage(ghash, original, texture_cache), color_(color), mask_(mask)
 		{}
 	virtual ~PlayerColoredImage() {}
 
 	// Implements TransformedImage.
-	Surface* recalculate_surface() const override {
-		return make_playerclr_surface(*original_.surface(), *mask_.surface(), color_);
+	Texture* recalculate_texture() const override {
+		return make_playerclr_texture(*original_.texture(), *mask_.texture(), color_);
 	}
 
 private:
@@ -425,7 +427,7 @@
 	if (g_gr->images().has(new_hash))
 		return g_gr->images().get(new_hash);
 	return
-		g_gr->images().insert(new ResizedImage(new_hash, *original, &g_gr->surfaces(), w, h));
+		g_gr->images().insert(new ResizedImage(new_hash, *original, &g_gr->textures(), w, h));
 }
 
 const Image* gray_out(const Image* original) {
@@ -433,7 +435,7 @@
 	if (g_gr->images().has(new_hash))
 		return g_gr->images().get(new_hash);
 	return
-		g_gr->images().insert(new GrayedOutImage(new_hash, *original, &g_gr->surfaces()));
+		g_gr->images().insert(new GrayedOutImage(new_hash, *original, &g_gr->textures()));
 }
 
 const Image* change_luminosity(const Image* original, float factor, bool halve_alpha) {
@@ -443,7 +445,7 @@
 		return g_gr->images().get(new_hash);
 	return
 		g_gr->images().insert
-			(new ChangeLuminosityImage(new_hash, *original, &g_gr->surfaces(), factor, halve_alpha));
+			(new ChangeLuminosityImage(new_hash, *original, &g_gr->textures(), factor, halve_alpha));
 }
 
 const Image* player_colored(const RGBColor& clr, const Image* original, const Image* mask) {
@@ -455,7 +457,7 @@
 		return g_gr->images().get(new_hash);
 	return
 		g_gr->images().insert
-			(new PlayerColoredImage(new_hash, *original, &g_gr->surfaces(), clr, *mask));
+			(new PlayerColoredImage(new_hash, *original, &g_gr->textures(), clr, *mask));
 }
 
 }  // namespace ImageTransformations

=== modified file 'src/graphic/in_memory_image.cc'
--- src/graphic/in_memory_image.cc	2014-07-26 10:43:23 +0000
+++ src/graphic/in_memory_image.cc	2014-11-24 07:32:35 +0000
@@ -22,15 +22,15 @@
 #include <memory>
 
 #include "graphic/image.h"
-#include "graphic/surface.h"
+#include "graphic/texture.h"
 
 using namespace std;
 
 // An Image implementation the does !not! cache its Surface in the
-// SurfaceCache. Avoid using this whenever possible and also do not store it in
+// TextureCache. Avoid using this whenever possible and also do not store it in
 // the ImageCache.
 //
-// This is only used when the surface can not be easily recalculated on the fly
+// This is only used when the texture can not be easily recalculated on the fly
 // or if ownership of the image is managed by the caller itself. Note that this
 // is always tricky because Widelands assumes in many places that Images can be
 // relied to exist forever. So when you pass out a pointer to your
@@ -38,24 +38,24 @@
 // or prepare for core dumps.
 class InMemoryImage : public Image {
 public:
-	InMemoryImage(const string& ghash, Surface* surf) :
-		hash_(ghash), surf_(surf) {}
+	InMemoryImage(const string& ghash, Texture* texture) :
+		hash_(ghash), texture_(texture) {}
 	virtual ~InMemoryImage() {
 	}
 
 	// Implements Image.
-	uint16_t width() const override {return surf_->width();}
-	uint16_t height() const override {return surf_->height();}
+	uint16_t width() const override {return texture_->width();}
+	uint16_t height() const override {return texture_->height();}
 	// Note: hash will mostly be dummy values for this implementation. It should
 	// not wind up in ImageCache, otherwise the ownership question is not clear.
 	const string& hash() const override {return hash_;}
-	Surface* surface() const override {return surf_.get();}
+	Texture* texture() const override {return texture_.get();}
 
 private:
 	const string hash_;
-	std::unique_ptr<Surface> surf_;
+	std::unique_ptr<Texture> texture_;
 };
 
-const Image* new_in_memory_image(const string& hash, Surface* surf) {
-	return new InMemoryImage(hash, surf);
+const Image* new_in_memory_image(const string& hash, Texture* texture) {
+	return new InMemoryImage(hash, texture);
 }

=== modified file 'src/graphic/in_memory_image.h'
--- src/graphic/in_memory_image.h	2014-07-05 16:41:51 +0000
+++ src/graphic/in_memory_image.h	2014-11-24 07:32:35 +0000
@@ -22,9 +22,9 @@
 
 #include <string>
 
+class Texture;
 class Image;
-class Surface;
 
-const Image* new_in_memory_image(const std::string& hash, Surface* surf);
+const Image* new_in_memory_image(const std::string& hash, Texture* texture);
 
 #endif  // end of include guard: WL_GRAPHIC_IN_MEMORY_IMAGE_H

=== modified file 'src/graphic/minimap_renderer.cc'
--- src/graphic/minimap_renderer.cc	2014-09-27 18:53:55 +0000
+++ src/graphic/minimap_renderer.cc	2014-11-24 07:32:35 +0000
@@ -27,7 +27,7 @@
 #include "graphic/graphic.h"
 #include "graphic/image.h"
 #include "graphic/in_memory_image.h"
-#include "graphic/surface.h"
+#include "graphic/terrain_texture.h"
 #include "graphic/texture.h"
 #include "logic/field.h"
 #include "logic/map.h"
@@ -154,16 +154,16 @@
 
 // Does the actual work of drawing the minimap.
 void draw_minimap_int
-	(Surface* surface, const Widelands::EditorGameBase& egbase,
+	(Texture* texture, const Widelands::EditorGameBase& egbase,
 	 const Widelands::Player* player, const Point& viewpoint, MiniMapLayer layers)
 {
 	const Widelands::Map & map = egbase.map();
 
-	uint8_t* const pixels = surface->get_pixels();
-	const SDL_PixelFormat& format = surface->format();
-	const uint16_t pitch = surface->get_pitch();
-	const uint16_t surface_h = surface->height();
-	const uint16_t surface_w = surface->width();
+	uint8_t* const pixels = texture->get_pixels();
+	const SDL_PixelFormat& format = texture->format();
+	const uint16_t pitch = texture->get_pitch();
+	const uint16_t surface_h = texture->height();
+	const uint16_t surface_w = texture->width();
 
 	// size of the display frame
 	int32_t xsize = g_gr->get_xres() / TRIANGLE_WIDTH / 2;
@@ -258,29 +258,29 @@
 
 }  // namespace
 
-std::unique_ptr<Surface> draw_minimap(const EditorGameBase& egbase,
+std::unique_ptr<Texture> draw_minimap(const EditorGameBase& egbase,
                                       const Player* player,
                                       const Point& viewpoint,
                                       MiniMapLayer layers) {
 	// First create a temporary SDL Surface to draw the minimap.
 	// TODO(unknown): Currently the minimap is redrawn every frame. That is not really
-	//       necesary. The created surface could be cached and only redrawn two
+	//       necesary. The created texture could be cached and only redrawn two
 	//       or three times per second
 	const Map& map = egbase.map();
 	const int16_t map_w = (layers & MiniMapLayer::Zoom2) ? map.get_width() * 2 : map.get_width();
 	const int16_t map_h = (layers & MiniMapLayer::Zoom2) ? map.get_height() * 2 : map.get_height();
 
-	Surface* surface = Surface::create(map_w, map_h);
-	assert(surface->format().BytesPerPixel == sizeof(uint32_t));
-
-	surface->fill_rect(Rect(0, 0, surface->width(), surface->height()), RGBAColor(0, 0, 0, 255));
-	surface->lock(Surface::Lock_Normal);
-
-	draw_minimap_int(surface, egbase, player, viewpoint, layers);
-
-	surface->unlock(Surface::Unlock_Update);
-
-	return std::unique_ptr<Surface>(surface);
+	Texture* texture = new Texture(map_w, map_h);
+	assert(texture->format().BytesPerPixel == sizeof(uint32_t));
+
+	texture->fill_rect(Rect(0, 0, texture->width(), texture->height()), RGBAColor(0, 0, 0, 255));
+	texture->lock(Surface::Lock_Normal);
+
+	draw_minimap_int(texture, egbase, player, viewpoint, layers);
+
+	texture->unlock(Surface::Unlock_Update);
+
+	return std::unique_ptr<Texture>(texture);
 }
 
 void write_minimap_image
@@ -309,8 +309,8 @@
 	viewpoint.y -= map_h / 2;
 
 	// Render minimap
-	std::unique_ptr<Surface> surface(draw_minimap(egbase, player, viewpoint, layers));
-	std::unique_ptr<const Image> image(new_in_memory_image("minimap", surface.release()));
+	std::unique_ptr<Texture> texture(draw_minimap(egbase, player, viewpoint, layers));
+	std::unique_ptr<const Image> image(new_in_memory_image("minimap", texture.release()));
 	g_gr->save_png(image.get(), streamwrite);
 	image.reset();
 }

=== modified file 'src/graphic/minimap_renderer.h'
--- src/graphic/minimap_renderer.h	2014-09-27 18:53:55 +0000
+++ src/graphic/minimap_renderer.h	2014-11-24 07:32:35 +0000
@@ -22,9 +22,9 @@
 
 #include <memory>
 
-#include "graphic/rendertarget.h"
-
 class StreamWrite;
+class Texture;
+struct Point;
 
 namespace Widelands {
 	class Player;
@@ -56,7 +56,7 @@
 /// Render the minimap. If player is not nullptr, it renders from that player's
 /// point of view.
 /// \param viewpoint: top left corner in map coordinates
-std::unique_ptr<Surface> draw_minimap
+std::unique_ptr<Texture> draw_minimap
 	(const Widelands::EditorGameBase& egbase, const Widelands::Player* player,
 	 const Point& viewpoint, MiniMapLayer layers);
 

=== modified file 'src/graphic/rendertarget.cc'
--- src/graphic/rendertarget.cc	2014-09-10 13:03:40 +0000
+++ src/graphic/rendertarget.cc	2014-11-24 07:32:35 +0000
@@ -166,7 +166,7 @@
  * If the source surface contains a alpha channel this is used during
  * the blit.
  */
-void RenderTarget::blit(const Point& dst, const Image* image, Composite cm, UI::Align align)
+void RenderTarget::blit(const Point& dst, const Image* image, BlendMode blend_mode, UI::Align align)
 {
 	Point dstpoint(dst);
 
@@ -175,14 +175,14 @@
 	Rect srcrc(Point(0, 0), image->width(), image->height());
 
 	if (to_surface_geometry(&dstpoint, &srcrc))
-		m_surface->blit(dstpoint, image->surface(), srcrc, cm);
+		m_surface->blit(dstpoint, image->texture(), srcrc, blend_mode);
 }
 
 /**
  * Like \ref blit, but use only a sub-rectangle of the source image.
  */
 void RenderTarget::blitrect
-	(const Point& dst, const Image* image, const Rect& gsrcrc, Composite cm)
+	(const Point& dst, const Image* image, const Rect& gsrcrc, BlendMode blend_mode)
 {
 	assert(0 <= gsrcrc.x);
 	assert(0 <= gsrcrc.y);
@@ -196,7 +196,7 @@
 
 	Point dstpt(dst);
 	if (to_surface_geometry(&dstpt, &srcrc))
-		m_surface->blit(dstpt, image->surface(), srcrc, cm);
+		m_surface->blit(dstpt, image->texture(), srcrc, blend_mode);
 }
 
 /**
@@ -205,7 +205,7 @@
  * The pixel from ofs inside image is placed at the top-left corner of
  * the filled rectangle.
  */
-void RenderTarget::tile(const Rect& rect, const Image* image, const Point& gofs, Composite cm)
+void RenderTarget::tile(const Rect& rect, const Image* image, const Point& gofs, BlendMode blend_mode)
 {
 	int32_t srcw = image->width();
 	int32_t srch = image->height();
@@ -251,7 +251,7 @@
 				if (tx + srcrc.w > r.w)
 					srcrc.w = r.w - tx;
 
-				m_surface->blit(r.top_left() + Point(tx, ty), image->surface(), srcrc, cm);
+				m_surface->blit(r.top_left() + Point(tx, ty), image->texture(), srcrc, blend_mode);
 
 				tx += srcrc.w;
 

=== modified file 'src/graphic/rendertarget.h'
--- src/graphic/rendertarget.h	2014-11-02 14:11:52 +0000
+++ src/graphic/rendertarget.h	2014-11-24 07:32:35 +0000
@@ -24,8 +24,8 @@
 
 #include "base/rect.h"
 #include "graphic/align.h"
+#include "graphic/blend_mode.h"
 #include "graphic/color.h"
-#include "graphic/compositemode.h"
 #include "graphic/image.h"
 
 class Surface;
@@ -64,9 +64,20 @@
 	void fill_rect(const Rect&, const RGBAColor&);
 	void brighten_rect(const Rect&, int32_t factor);
 
-	void blit(const Point& dst, const Image* image, Composite cm = CM_UseAlpha, UI::Align = UI::Align_TopLeft);
-	void blitrect(const Point& dst, const Image* image, const Rect& src, Composite cm = CM_UseAlpha);
-	void tile(const Rect&, const Image* image, const Point& ofs, Composite cm = CM_UseAlpha);
+	void blit(const Point& dst,
+	          const Image* image,
+	          BlendMode blend_mode = BlendMode::UseAlpha,
+	          UI::Align = UI::Align_TopLeft);
+
+	void blitrect(const Point& dst,
+	              const Image* image,
+	              const Rect& src,
+	              BlendMode blend_mode = BlendMode::UseAlpha);
+
+	void tile(const Rect&,
+	          const Image* image,
+	          const Point& ofs,
+	          BlendMode blend_mode = BlendMode::UseAlpha);
 
 	void drawanim(const Point& dst, uint32_t animation, uint32_t time, const Widelands::Player* = 0);
 	void drawanimrect

=== renamed file 'src/graphic/gl/surface_screen.cc' => 'src/graphic/screen.cc'
--- src/graphic/gl/surface_screen.cc	2014-11-22 21:31:21 +0000
+++ src/graphic/screen.cc	2014-11-24 07:32:35 +0000
@@ -16,20 +16,20 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 
-#include "graphic/gl/surface_screen.h"
+#include "graphic/screen.h"
 
 #include <algorithm>
 #include <cassert>
 
 #include "graphic/gl/utils.h"
 
-GLSurfaceScreen::GLSurfaceScreen(uint16_t w, uint16_t h)
+Screen::Screen(uint16_t w, uint16_t h)
 {
 	m_w = w;
 	m_h = h;
 }
 
-void GLSurfaceScreen::pixel_to_gl(float* x, float* y) const {
+void Screen::pixel_to_gl(float* x, float* y) const {
 	*x = (*x / m_w) * 2. - 1.;
 	*y = 1. - (*y / m_h) * 2.;
 }
@@ -38,7 +38,7 @@
  * Swap order of rows in m_pixels, to compensate for the upside-down nature of the
  * OpenGL coordinate system.
  */
-void GLSurfaceScreen::swap_rows()
+void Screen::swap_rows()
 {
 	uint8_t * begin_row = m_pixels.get();
 	uint8_t * end_row = m_pixels.get() + (m_w * (m_h - 1) * 4);
@@ -52,7 +52,7 @@
 	}
 }
 
-void GLSurfaceScreen::lock(Surface::LockMode mode)
+void Screen::lock(Surface::LockMode mode)
 {
 	assert(!m_pixels);
 
@@ -70,7 +70,7 @@
 	}
 }
 
-void GLSurfaceScreen::unlock(Surface::UnlockMode mode)
+void Screen::unlock(Surface::UnlockMode mode)
 {
 	assert(m_pixels);
 

=== renamed file 'src/graphic/gl/surface_screen.h' => 'src/graphic/screen.h'
--- src/graphic/gl/surface_screen.h	2014-11-22 21:31:21 +0000
+++ src/graphic/screen.h	2014-11-24 07:32:35 +0000
@@ -16,18 +16,18 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 
-#ifndef WL_GRAPHIC_GL_SURFACE_SCREEN_H
-#define WL_GRAPHIC_GL_SURFACE_SCREEN_H
+#ifndef WL_GRAPHIC_SCREEN_H
+#define WL_GRAPHIC_SCREEN_H
 
 #include "graphic/surface.h"
 
 /**
  * This surface represents the screen in OpenGL mode.
  */
-class GLSurfaceScreen : public Surface {
+class Screen : public Surface {
 public:
-	GLSurfaceScreen(uint16_t w, uint16_t h);
-	virtual ~GLSurfaceScreen() {}
+	Screen(uint16_t w, uint16_t h);
+	virtual ~Screen() {}
 
 	/// Interface implementations
 	void lock(LockMode) override;
@@ -39,4 +39,4 @@
 	void swap_rows();
 };
 
-#endif  // end of include guard:
+#endif  // end of include guard: WL_GRAPHIC_SCREEN_H

=== modified file 'src/graphic/surface.cc'
--- src/graphic/surface.cc	2014-11-22 21:31:21 +0000
+++ src/graphic/surface.cc	2014-11-24 07:32:35 +0000
@@ -30,18 +30,9 @@
 #include "graphic/gl/draw_line_program.h"
 #include "graphic/gl/draw_rect_program.h"
 #include "graphic/gl/fill_rect_program.h"
-#include "graphic/gl/surface_texture.h"
 #include "graphic/gl/utils.h"
 #include "graphic/graphic.h"
-
-
-Surface* Surface::create(SDL_Surface* surf) {
-	return new GLSurfaceTexture(surf);
-}
-
-Surface* Surface::create(uint16_t w, uint16_t h) {
-	return new GLSurfaceTexture(w, h);
-}
+#include "graphic/texture.h"
 
 
 uint16_t Surface::width() const {
@@ -167,12 +158,11 @@
 }
 
 void Surface::blit
-	(const Point& dst, const Surface* image, const Rect& srcrc, Composite cm)
+	(const Point& dst, const Texture* texture, const Rect& srcrc, BlendMode blend_mode)
 {
 	glViewport(0, 0, width(), height());
 
 	// Source Rectangle.
-	const GLSurfaceTexture* const texture = static_cast<const GLSurfaceTexture*>(image);
 	FloatRect gl_src_rect;
 	{
 		float x1 = srcrc.x;
@@ -189,5 +179,5 @@
 
 	const FloatRect gl_dst_rect = to_opengl(Rect(dst.x, dst.y, srcrc.w, srcrc.h), ConversionMode::kExact);
 
-	BlitProgram::instance().draw(gl_dst_rect, gl_src_rect, texture->get_gl_texture(), cm);
+	BlitProgram::instance().draw(gl_dst_rect, gl_src_rect, texture->get_gl_texture(), blend_mode);
 }

=== modified file 'src/graphic/surface.h'
--- src/graphic/surface.h	2014-11-22 21:31:21 +0000
+++ src/graphic/surface.h	2014-11-24 07:32:35 +0000
@@ -24,8 +24,10 @@
 
 #include "base/macros.h"
 #include "base/rect.h"
+#include "graphic/blend_mode.h"
 #include "graphic/color.h"
-#include "graphic/compositemode.h"
+
+class Texture;
 
 /**
  * Interface to a basic surfaces that can be used as destination for blitting and drawing.
@@ -33,13 +35,6 @@
  */
 class Surface  {
 public:
-	// Create a new surface from an SDL_Surface. Ownership is taken.
-	static Surface* create(SDL_Surface*);
-
-	// Create a new empty (that is randomly filled) Surface with the given
-	// dimensions.
-	static Surface* create(uint16_t w, uint16_t h);
-
 	Surface() = default;
 	virtual ~Surface() {}
 
@@ -48,10 +43,13 @@
 	uint16_t height() const;
 
 	/// This draws a part of another surface to this surface
-	virtual void blit(const Point&, const Surface*, const Rect& srcrc, Composite cm = CM_UseAlpha);
+	virtual void blit(const Point&,
+	                  const Texture*,
+	                  const Rect& srcrc,
+	                  BlendMode blend_mode = BlendMode::UseAlpha);
 
 	/// Draws a filled rect to the surface. No blending takes place, the values
-	//in the target are just replaced (i.e. / Composite would be CM_Copy).
+	// in the target are just replaced (i.e. / BlendMode would be BlendMode::Copy).
 	virtual void fill_rect(const Rect&, const RGBAColor&);
 
 	/// Draws a rect (frame only) to the surface.

=== renamed file 'src/graphic/texture.cc' => 'src/graphic/terrain_texture.cc'
--- src/graphic/texture.cc	2014-11-23 12:01:59 +0000
+++ src/graphic/terrain_texture.cc	2014-11-24 07:32:35 +0000
@@ -17,7 +17,7 @@
  *
  */
 
-#include "graphic/texture.h"
+#include "graphic/terrain_texture.h"
 
 #include <SDL_image.h>
 
@@ -25,6 +25,7 @@
 #include "base/log.h"
 #include "base/wexception.h"
 #include "graphic/image_io.h"
+#include "graphic/texture.h"
 #include "io/fileread.h"
 #include "io/filesystem/layered_filesystem.h"
 
@@ -35,7 +36,7 @@
  * Currently it converts a 16 bit image to a 8 bit texture. This should
  * be changed to load a 8 bit file directly, however.
  */
-Texture::Texture(const std::vector<std::string>& texture_files, const uint32_t frametime)
+TerrainTexture::TerrainTexture(const std::vector<std::string>& texture_files, const uint32_t frametime)
    : m_frame_num(0), m_frametime(frametime) {
 	if (texture_files.empty()) {
 		throw wexception("No images for texture.");
@@ -47,23 +48,23 @@
 		}
 
 		m_texture_image = fname;
-		SDL_Surface* surf = load_image_as_sdl_surface(fname, g_fs);
-		if (!surf) {
+		SDL_Surface* sdl_surface = load_image_as_sdl_surface(fname, g_fs);
+		if (!sdl_surface) {
 			throw wexception(
 			   "WARNING: Failed to load texture frame %s: %s\n", fname.c_str(), IMG_GetError());
 		}
-		if (surf->w != TEXTURE_WIDTH || surf->h != TEXTURE_HEIGHT) {
-			SDL_FreeSurface(surf);
+		if (sdl_surface->w != kTextureWidth || sdl_surface->h != kTextureHeight) {
+			SDL_FreeSurface(sdl_surface);
 			throw wexception("WARNING: %s: texture must be %ix%i pixels big\n",
 			                 fname.c_str(),
-			                 TEXTURE_WIDTH,
-			                 TEXTURE_HEIGHT);
+			                 kTextureWidth,
+			                 kTextureHeight);
 		}
 
 		// calculate shades on the first frame
-		if (m_gl_textures.empty()) {
-			uint8_t top_left_pixel = static_cast<uint8_t*>(surf->pixels)[0];
-			SDL_Color top_left_pixel_color = surf->format->palette->colors[top_left_pixel];
+		if (m_textures.empty()) {
+			uint8_t top_left_pixel = static_cast<uint8_t*>(sdl_surface->pixels)[0];
+			SDL_Color top_left_pixel_color = sdl_surface->format->palette->colors[top_left_pixel];
 			for (int i = -128; i < 128; i++) {
 				const int shade = 128 + i;
 				int32_t r = std::min<int32_t>((top_left_pixel_color.r * shade) >> 7, 255);
@@ -72,24 +73,26 @@
 				m_minimap_colors[shade] = RGBColor(r, g, b);
 			}
 		}
-		m_gl_textures.emplace_back(new GLSurfaceTexture(surf));
+		m_textures.emplace_back(new Texture(sdl_surface));
 	}
 
-	if (m_gl_textures.empty())
-		throw wexception("Texture has no frames");
+	if (m_textures.empty())
+		throw wexception("TerrainTexture has no frames");
 }
 
-/**
- * Return the basic terrain colour to be used in the minimap.
-*/
-RGBColor Texture::get_minimap_color(int8_t shade) {
+RGBColor TerrainTexture::get_minimap_color(int8_t shade) {
 	return m_minimap_colors[128 + shade];
 }
 
-/**
- * Set the current frame according to the game time.
- */
-void Texture::animate(uint32_t time)
+void TerrainTexture::animate(uint32_t time)
 {
-	m_frame_num = (time / m_frametime) % m_gl_textures.size();
+	m_frame_num = (time / m_frametime) % m_textures.size();
+}
+
+const std::string& TerrainTexture::get_texture_image() const {
+	return m_texture_image;
+}
+
+const Texture& TerrainTexture::texture() const {
+	return *m_textures.at(m_frame_num);
 }

=== renamed file 'src/graphic/texture.h' => 'src/graphic/terrain_texture.h'
--- src/graphic/texture.h	2014-11-22 21:31:21 +0000
+++ src/graphic/terrain_texture.h	2014-11-24 07:32:35 +0000
@@ -17,8 +17,8 @@
  *
  */
 
-#ifndef WL_GRAPHIC_TEXTURE_H
-#define WL_GRAPHIC_TEXTURE_H
+#ifndef WL_GRAPHIC_TERRAIN_TEXTURE_H
+#define WL_GRAPHIC_TERRAIN_TEXTURE_H
 
 #include <memory>
 #include <string>
@@ -27,35 +27,28 @@
 #include <stdint.h>
 
 #include "graphic/colormap.h"
-#include "graphic/gl/surface_texture.h"
-
-/// Textures have a fixed size and are squares.
-/// TEXTURE_HEIGHT is just defined for easier understanding of the code.
-#define TEXTURE_WIDTH 64
-#define TEXTURE_HEIGHT TEXTURE_WIDTH
-
-/** struct Texture
-*
-* Texture represents are terrain texture, which is strictly
-* TEXTURE_WIDTH by TEXTURE_HEIGHT pixels in size. It uses 8 bit color, and
-* a pointer to the corresponding palette and color lookup table is
-* provided.
-*
-* Currently, this is initialized from a 16 bit bitmap. This should be
-* changed to load 8 bit bitmaps directly.
-*/
-struct Texture {
-	Texture(const std::vector<std::string>& texture_files, uint32_t frametime);
-
-	const std::string& get_texture_image() const {
-		return m_texture_image;
-	}
-	uint32_t get_texture() const {
-		return m_gl_textures.at(m_frame_num)->get_gl_texture();
-	}
-
+
+class Texture;
+
+/// TerrainTextures have a fixed size and are squares.
+constexpr int kTextureWidth = 64;
+constexpr int kTextureHeight = kTextureWidth;
+
+// TerrainTexture represents are terrain texture, which is strictly kTextureWidth by
+// kTextureHeight pixels in size.
+struct TerrainTexture {
+	TerrainTexture(const std::vector<std::string>& texture_files, uint32_t frametime);
+
+	// Returns the path to a representative image for this texture.
+	const std::string& get_texture_image() const;
+
+	// Returns the texture for the current animation phase.
+	const Texture& texture() const;
+
+	// Return the basic terrain colour to be used in the minimap.
 	RGBColor get_minimap_color(int8_t shade);
 
+	// Set the current frame according to the game time.
 	void animate(uint32_t time);
 
 private:
@@ -63,7 +56,7 @@
 	int32_t     m_frame_num;
 	std::string m_texture_image;
 	uint32_t    m_frametime;
-	std::vector<std::unique_ptr<GLSurfaceTexture>> m_gl_textures;
+	std::vector<std::unique_ptr<Texture>> m_textures;
 };
 
-#endif  // end of include guard: WL_GRAPHIC_TEXTURE_H
+#endif  // end of include guard: WL_GRAPHIC_TERRAIN_TEXTURE_H

=== modified file 'src/graphic/text/rt_render.cc'
--- src/graphic/text/rt_render.cc	2014-11-02 14:11:52 +0000
+++ src/graphic/text/rt_render.cc	2014-11-24 07:32:35 +0000
@@ -32,10 +32,10 @@
 #include "base/rect.h"
 #include "graphic/image_cache.h"
 #include "graphic/image_io.h"
-#include "graphic/surface.h"
 #include "graphic/text/font_io.h"
 #include "graphic/text/rt_parse.h"
 #include "graphic/text/textstream.h"
+#include "graphic/texture.h"
 
 
 using namespace std;
@@ -108,7 +108,7 @@
 	virtual uint16_t width() = 0;
 	virtual uint16_t height() = 0;
 	virtual uint16_t hotspot_y() = 0;
-	virtual Surface* render(SurfaceCache* surface_cache) = 0;
+	virtual Texture* render(TextureCache* texture_cache) = 0;
 
 	virtual bool is_non_mandatory_space() {return false;}
 	virtual bool is_expanding() {return false;}
@@ -313,7 +313,7 @@
 		return rv;
 	}
 
-	Surface* render(SurfaceCache* surface_cache) override;
+	Texture* render(TextureCache* texture_cache) override;
 
 protected:
 	uint16_t m_w, m_h;
@@ -330,10 +330,10 @@
 uint16_t TextNode::hotspot_y() {
 	return m_font.ascent(m_s.font_style);
 }
-Surface* TextNode::render(SurfaceCache* surface_cache) {
-	const Surface& img = m_font.render(m_txt, m_s.font_color, m_s.font_style, surface_cache);
-	Surface* rv = Surface::create(img.width(), img.height());
-	rv->blit(Point(0, 0), &img, Rect(0, 0, img.width(), img.height()), CM_Copy);
+Texture* TextNode::render(TextureCache* texture_cache) {
+	const Texture& img = m_font.render(m_txt, m_s.font_color, m_s.font_style, texture_cache);
+	Texture* rv = new Texture(img.width(), img.height());
+	rv->blit(Point(0, 0), &img, Rect(0, 0, img.width(), img.height()), BlendMode::Copy);
 	return rv;
 }
 
@@ -348,7 +348,7 @@
 			m_w = w;
 		}
 	virtual ~FillingTextNode() {}
-	Surface* render(SurfaceCache*) override;
+	Texture* render(TextureCache*) override;
 
 	bool is_expanding() override {return m_expanding;}
 	void set_w(uint16_t w) override {m_w = w;}
@@ -356,12 +356,12 @@
 private:
 	bool m_expanding;
 };
-Surface* FillingTextNode::render(SurfaceCache* surface_cache) {
-	const Surface& t = m_font.render(m_txt, m_s.font_color, m_s.font_style, surface_cache);
-	Surface* rv = Surface::create(m_w, m_h);
+Texture* FillingTextNode::render(TextureCache* texture_cache) {
+	const Texture& t = m_font.render(m_txt, m_s.font_color, m_s.font_style, texture_cache);
+	Texture* rv = new Texture(m_w, m_h);
 	for (uint16_t curx = 0; curx < m_w; curx += t.width()) {
 		Rect srcrect(Point(0, 0), min<int>(t.width(), m_w - curx), m_h);
-		rv->blit(Point(curx, 0), &t, srcrect, CM_Copy);
+		rv->blit(Point(curx, 0), &t, srcrect, BlendMode::Copy);
 	}
 	return rv;
 }
@@ -375,13 +375,13 @@
 	WordSpacerNode(IFont& font, NodeStyle& ns) : TextNode(font, ns, " ") {}
 	static void show_spaces(bool t) {m_show_spaces = t;}
 
-	Surface* render(SurfaceCache* surface_cache) override {
+	Texture* render(TextureCache* texture_cache) override {
 		if (m_show_spaces) {
-			Surface* rv = Surface::create(m_w, m_h);
+			Texture* rv = new Texture(m_w, m_h);
 			rv->fill_rect(Rect(0, 0, m_w, m_h), RGBAColor(0xff, 0, 0, 0xff));
 			return rv;
 		}
-		return TextNode::render(surface_cache);
+		return TextNode::render(texture_cache);
 	}
 	bool is_non_mandatory_space() override {return true;}
 
@@ -400,7 +400,7 @@
 	uint16_t height() override {return 0;}
 	uint16_t width() override {return INFINITE_WIDTH; }
 	uint16_t hotspot_y() override {return 0;}
-	Surface* render(SurfaceCache* /* surface_cache */) override {
+	Texture* render(TextureCache* /* texture_cache */) override {
 		assert(false);
 		throw RenderError("This should never be called. This is a bug, please submit a report.");
 	}
@@ -418,8 +418,8 @@
 	uint16_t height() override {return m_h;}
 	uint16_t width() override {return m_w;}
 	uint16_t hotspot_y() override {return m_h;}
-	Surface* render(SurfaceCache* /* surface_cache */) override {
-		Surface* rv = Surface::create(m_w, m_h);
+	Texture* render(TextureCache* /* texture_cache */) override {
+		Texture* rv = new Texture(m_w, m_h);
 
 		// Draw background image (tiling)
 		if (m_bg) {
@@ -430,7 +430,7 @@
 				dst.y = 0;
 				srcrect.w = min<int>(m_bg->width(), m_w - curx);
 				srcrect.h = m_h;
-				rv->blit(dst, m_bg->surface(), srcrect, CM_Copy);
+				rv->blit(dst, m_bg->texture(), srcrect, BlendMode::Copy);
 			}
 		} else {
 			rv->fill_rect(Rect(0, 0, m_w, m_h), RGBAColor(255, 255, 255, 0));
@@ -468,8 +468,8 @@
 	uint16_t width() override {return m_w + m_margin.left + m_margin.right;}
 	uint16_t height() override {return m_h + m_margin.top + m_margin.bottom;}
 	uint16_t hotspot_y() override {return height();}
-	Surface* render(SurfaceCache* surface_cache) override {
-		Surface* rv = Surface::create(width(), height());
+	Texture* render(TextureCache* texture_cache) override {
+		Texture* rv = new Texture(width(), height());
 		rv->fill_rect(Rect(0, 0, rv->width(), rv->height()), RGBAColor(255, 255, 255, 0));
 
 		// Draw Solid background Color
@@ -490,20 +490,20 @@
 					dst.x = curx; dst.y = cury;
 					src.w = min<int>(m_bg_img->width(), m_w + m_margin.left - curx);
 					src.h = min<int>(m_bg_img->height(), m_h + m_margin.top - cury);
-					rv->blit(dst, m_bg_img->surface(), src, CM_Copy);
+					rv->blit(dst, m_bg_img->texture(), src, BlendMode::Copy);
 				}
 			}
 			set_alpha = false;
 		}
 
 		for (RenderNode* n : m_nodes_to_render) {
-			Surface* nsur = n->render(surface_cache);
-			if (nsur) {
+			Texture* node_texture = n->render(texture_cache);
+			if (node_texture) {
 				Point dst = Point(n->x() + m_margin.left, n->y() + m_margin.top);
-				Rect src = Rect(0, 0, nsur->width(), nsur->height());
+				Rect src = Rect(0, 0, node_texture->width(), node_texture->height());
 
-				rv->blit(dst, nsur, src, set_alpha ? CM_Copy : CM_UseAlpha);
-				delete nsur;
+				rv->blit(dst, node_texture, src, set_alpha ? BlendMode::Copy : BlendMode::UseAlpha);
+				delete node_texture;
 			}
 			delete n;
 		}
@@ -545,15 +545,15 @@
 	uint16_t width() override {return m_image.width();}
 	uint16_t height() override {return m_image.height();}
 	uint16_t hotspot_y() override {return m_image.height();}
-	Surface* render(SurfaceCache* surface_cache) override;
+	Texture* render(TextureCache* texture_cache) override;
 
 private:
 	const Image& m_image;
 };
 
-Surface* ImgRenderNode::render(SurfaceCache* /* surface_cache */) {
-	Surface* rv = Surface::create(m_image.width(), m_image.height());
-	rv->blit(Point(0, 0), m_image.surface(), Rect(0, 0, m_image.width(), m_image.height()), CM_Copy);
+Texture* ImgRenderNode::render(TextureCache* /* texture_cache */) {
+	Texture* rv = new Texture(m_image.width(), m_image.height());
+	rv->blit(Point(0, 0), m_image.texture(), Rect(0, 0, m_image.width(), m_image.height()), BlendMode::Copy);
 	return rv;
 }
 // End: Helper Stuff
@@ -946,9 +946,9 @@
 	return i->second(tag, fc, ns, image_cache);
 }
 
-Renderer::Renderer(ImageCache* image_cache, SurfaceCache* surface_cache) :
+Renderer::Renderer(ImageCache* image_cache, TextureCache* texture_cache) :
 	font_cache_(new FontCache()), parser_(new Parser()),
-	image_cache_(image_cache), surface_cache_(surface_cache) {
+	image_cache_(image_cache), texture_cache_(texture_cache) {
 }
 
 Renderer::~Renderer() {
@@ -976,10 +976,10 @@
 	return nodes[0];
 }
 
-Surface* Renderer::render(const string& text, uint16_t width, const TagSet& allowed_tags) {
+Texture* Renderer::render(const string& text, uint16_t width, const TagSet& allowed_tags) {
 	std::unique_ptr<RenderNode> node(layout_(text, width, allowed_tags));
 
-	return node->render(surface_cache_);
+	return node->render(texture_cache_);
 }
 
 IRefMap* Renderer::make_reference_map(const string& text, uint16_t width, const TagSet& allowed_tags) {

=== modified file 'src/graphic/text/rt_render.h'
--- src/graphic/text/rt_render.h	2014-09-14 11:31:58 +0000
+++ src/graphic/text/rt_render.h	2014-11-24 07:32:35 +0000
@@ -29,8 +29,9 @@
 #include "graphic/color.h"
 #include "graphic/image.h"
 
-class SurfaceCache;
+class Texture;
 class ImageCache;
+class TextureCache;
 
 namespace RT {
 
@@ -58,7 +59,7 @@
 	virtual ~IFont() {}
 
 	virtual void dimensions(const std::string&, int, uint16_t *, uint16_t *) = 0;
-	virtual const Surface& render(const std::string&, const RGBColor& clr, int, SurfaceCache*) = 0;
+	virtual const Texture& render(const std::string&, const RGBColor& clr, int, TextureCache*) = 0;
 
 	virtual uint16_t ascent(int) const = 0;
 };
@@ -81,13 +82,13 @@
 class Renderer {
 public:
 	// Ownership is not taken.
-	Renderer(ImageCache* image_cache, SurfaceCache* surface_cache);
+	Renderer(ImageCache* image_cache, TextureCache* texture_cache);
 	~Renderer();
 
 	// Render the given string in the given width. Restricts the allowed tags to
-	// the ones in TagSet. The renderer does not do caching in the SurfaceCache
+	// the ones in TagSet. The renderer does not do caching in the TextureCache
 	// for its individual nodes, but the font render does.
-	Surface* render(const std::string&, uint16_t width, const TagSet& tagset = TagSet());
+	Texture* render(const std::string&, uint16_t width, const TagSet& tagset = TagSet());
 
 	// Returns a reference map of the clickable hyperlinks in the image. This
 	// will do no caching and needs to do all layouting, so do not call this too
@@ -100,7 +101,7 @@
 	std::unique_ptr<FontCache> font_cache_;
 	std::unique_ptr<Parser> parser_;
 	ImageCache* const image_cache_;  // Not owned.
-	SurfaceCache* const surface_cache_;  // Not owned.
+	TextureCache* const texture_cache_;  // Not owned.
 };
 
 }

=== modified file 'src/graphic/text/sdl_ttf_font.cc'
--- src/graphic/text/sdl_ttf_font.cc	2014-11-23 10:13:14 +0000
+++ src/graphic/text/sdl_ttf_font.cc	2014-11-24 07:32:35 +0000
@@ -24,9 +24,9 @@
 #include <boost/format.hpp>
 
 #include "graphic/sdl_utils.h"
-#include "graphic/surface.h"
-#include "graphic/surface_cache.h"
 #include "graphic/text/rt_errors.h"
+#include "graphic/texture.h"
+#include "graphic/texture_cache.h"
 
 using namespace std;
 using namespace boost;
@@ -58,13 +58,13 @@
 	*gw = w; *gh = h;
 }
 
-const Surface& SdlTtfFont::render
-	(const string& txt, const RGBColor& clr, int style, SurfaceCache* surface_cache) {
+const Texture& SdlTtfFont::render
+	(const string& txt, const RGBColor& clr, int style, TextureCache* texture_cache) {
 	const string hash =
 		(boost::format("%s:%s:%i:%02x%02x%02x:%i") % font_name_ % ptsize_ % txt %
 		 static_cast<int>(clr.r) % static_cast<int>(clr.g) % static_cast<int>(clr.b) % style)
 			.str();
-	const Surface* rv = surface_cache->get(hash);
+	const Texture* rv = texture_cache->get(hash);
 	if (rv) return *rv;
 
 	m_set_style(style);
@@ -120,7 +120,7 @@
 	if (!text_surface)
 		throw RenderError((format("Rendering '%s' gave the error: %s") % txt % TTF_GetError()).str());
 
-	return *surface_cache->insert(hash, Surface::create(text_surface), true);
+	return *texture_cache->insert(hash, new Texture(text_surface), true);
 }
 
 uint16_t SdlTtfFont::ascent(int style) const {

=== modified file 'src/graphic/text/sdl_ttf_font.h'
--- src/graphic/text/sdl_ttf_font.h	2014-09-10 16:57:31 +0000
+++ src/graphic/text/sdl_ttf_font.h	2014-11-24 07:32:35 +0000
@@ -37,7 +37,7 @@
 	virtual ~SdlTtfFont();
 
 	void dimensions(const std::string&, int, uint16_t * w, uint16_t * h) override;
-	const Surface& render(const std::string&, const RGBColor& clr, int, SurfaceCache*) override;
+	const Texture& render(const std::string&, const RGBColor& clr, int, TextureCache*) override;
 	uint16_t ascent(int) const override;
 
 private:

=== modified file 'src/graphic/text/test/render.cc'
--- src/graphic/text/test/render.cc	2014-09-20 09:37:47 +0000
+++ src/graphic/text/test/render.cc	2014-11-24 07:32:35 +0000
@@ -25,9 +25,9 @@
 #include <string>
 
 #include "graphic/image_cache.h"
-#include "graphic/surface_cache.h"
 #include "graphic/text/rt_render.h"
 #include "graphic/text/test/paths.h"
+#include "graphic/texture_cache.h"
 #include "io/filesystem/layered_filesystem.h"
 
 StandaloneRenderer::StandaloneRenderer() {
@@ -35,9 +35,9 @@
 	g_fs->add_file_system(&FileSystem::create(WIDELANDS_DATA_DIR));
 	g_fs->add_file_system(&FileSystem::create(RICHTEXT_DATA_DIR));
 
-	surface_cache_.reset(create_surface_cache(500 << 20));  // 500 MB
-	image_cache_.reset(new ImageCache(surface_cache_.get()));
-	renderer_.reset(new RT::Renderer(image_cache_.get(), surface_cache_.get()));
+	texture_cache_.reset(create_texture_cache(500 << 20));  // 500 MB
+	image_cache_.reset(new ImageCache(texture_cache_.get()));
+	renderer_.reset(new RT::Renderer(image_cache_.get(), texture_cache_.get()));
 }
 
 StandaloneRenderer::~StandaloneRenderer() {

=== modified file 'src/graphic/text/test/render.h'
--- src/graphic/text/test/render.h	2014-07-14 10:45:44 +0000
+++ src/graphic/text/test/render.h	2014-11-24 07:32:35 +0000
@@ -36,7 +36,7 @@
 		RT::Renderer* renderer();
 
 	private:
-		std::unique_ptr<SurfaceCache> surface_cache_;
+		std::unique_ptr<TextureCache> texture_cache_;
 		std::unique_ptr<ImageCache> image_cache_;
 		std::unique_ptr<RT::Renderer> renderer_;
 };

=== modified file 'src/graphic/text/test/render_richtext.cc'
--- src/graphic/text/test/render_richtext.cc	2014-11-24 07:32:34 +0000
+++ src/graphic/text/test/render_richtext.cc	2014-11-24 07:32:35 +0000
@@ -33,9 +33,9 @@
 #include "config.h"
 #include "graphic/graphic.h"
 #include "graphic/image_io.h"
-#include "graphic/surface.h"
 #include "graphic/text/rt_errors.h"
 #include "graphic/text/test/render.h"
+#include "graphic/texture.h"
 #include "io/filesystem/filesystem.h"
 #include "io/filesystem/layered_filesystem.h"
 #include "io/streamwrite.h"
@@ -135,11 +135,12 @@
 	StandaloneRenderer standalone_renderer;
 
 	try {
-		std::unique_ptr<Surface> surf(standalone_renderer.renderer()->render(txt, w, allowed_tags));
+		std::unique_ptr<Texture> texture(
+		   standalone_renderer.renderer()->render(txt, w, allowed_tags));
 
 		std::unique_ptr<FileSystem> fs(&FileSystem::create("."));
 		std::unique_ptr<StreamWrite> sw(fs->open_stream_write(outname));
-		if (!save_surface_to_png(surf.get(), sw.get())) {
+		if (!save_surface_to_png(texture.get(), sw.get())) {
 			std::cout << "Could not encode PNG." << std::endl;
 		}
 	} catch (RT::Exception& e) {

=== renamed file 'src/graphic/gl/surface_texture.cc' => 'src/graphic/texture.cc'
--- src/graphic/gl/surface_texture.cc	2014-11-23 10:13:14 +0000
+++ src/graphic/texture.cc	2014-11-24 07:32:35 +0000
@@ -16,7 +16,7 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 
-#include "graphic/gl/surface_texture.h"
+#include "graphic/texture.h"
 
 #include <cassert>
 
@@ -77,7 +77,7 @@
  *
  * The initial data of the texture is undefined.
  */
-GLSurfaceTexture::GLSurfaceTexture(int w, int h)
+Texture::Texture(int w, int h)
 {
 	init(w, h);
 
@@ -94,7 +94,7 @@
  *
  * \note Takes ownership of the given surface.
  */
-GLSurfaceTexture::GLSurfaceTexture(SDL_Surface * surface, bool intensity)
+Texture::Texture(SDL_Surface * surface, bool intensity)
 {
 	init(surface->w, surface->h);
 
@@ -132,17 +132,17 @@
 	SDL_FreeSurface(surface);
 }
 
-GLSurfaceTexture::~GLSurfaceTexture()
+Texture::~Texture()
 {
 	glDeleteTextures(1, &m_texture);
 }
 
-void GLSurfaceTexture::pixel_to_gl(float* x, float* y) const {
+void Texture::pixel_to_gl(float* x, float* y) const {
 	*x = (*x / m_w) * 2. - 1.;
 	*y = (*y / m_h) * 2. - 1.;
 }
 
-void GLSurfaceTexture::init(uint16_t w, uint16_t h)
+void Texture::init(uint16_t w, uint16_t h)
 {
 	m_w = w;
 	m_h = h;
@@ -160,7 +160,7 @@
 	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 }
 
-void GLSurfaceTexture::lock(LockMode mode) {
+void Texture::lock(LockMode mode) {
 	if (m_w <= 0 || m_h <= 0) {
 		return;
 	}
@@ -174,7 +174,7 @@
 	}
 }
 
-void GLSurfaceTexture::unlock(UnlockMode mode) {
+void Texture::unlock(UnlockMode mode) {
 	if (m_w <= 0 || m_h <= 0) {
 		return;
 	}
@@ -190,7 +190,7 @@
 	m_pixels.reset(nullptr);
 }
 
-void GLSurfaceTexture::draw_rect(const Rect& rectangle, const RGBColor& clr)
+void Texture::draw_rect(const Rect& rectangle, const RGBColor& clr)
 {
 	if (m_w <= 0 || m_h <= 0) {
 		return;
@@ -204,7 +204,7 @@
 /**
  * Draws a filled rectangle
  */
-void GLSurfaceTexture::fill_rect(const Rect& rectangle, const RGBAColor& clr)
+void Texture::fill_rect(const Rect& rectangle, const RGBAColor& clr)
 {
 	if (m_w <= 0 || m_h <= 0) {
 		return;
@@ -218,7 +218,7 @@
 /**
  * Change the brightness of the given rectangle
  */
-void GLSurfaceTexture::brighten_rect(const Rect& rectangle, const int32_t factor)
+void Texture::brighten_rect(const Rect& rectangle, const int32_t factor)
 {
 	if (m_w <= 0 || m_h <= 0) {
 		return;
@@ -229,7 +229,7 @@
 	reset_gl();
 }
 
-void GLSurfaceTexture::draw_line
+void Texture::draw_line
 	(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const RGBColor& color, uint8_t gwidth)
 {
 	if (m_w <= 0 || m_h <= 0) {
@@ -241,14 +241,14 @@
 	reset_gl();
 }
 
-void GLSurfaceTexture::blit
-	(const Point& dst, const Surface* src, const Rect& srcrc, Composite cm)
+void Texture::blit
+	(const Point& dst, const Texture* src, const Rect& srcrc, BlendMode blend_mode)
 {
 	if (m_w <= 0 || m_h <= 0) {
 		return;
 	}
 
 	setup_gl(m_texture);
-	Surface::blit(dst, src, srcrc, cm);
+	Surface::blit(dst, src, srcrc, blend_mode);
 	reset_gl();
 }

=== renamed file 'src/graphic/gl/surface_texture.h' => 'src/graphic/texture.h'
--- src/graphic/gl/surface_texture.h	2014-11-22 21:31:21 +0000
+++ src/graphic/texture.h	2014-11-24 07:32:35 +0000
@@ -16,20 +16,25 @@
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
  */
 
-#ifndef WL_GRAPHIC_GL_SURFACE_TEXTURE_H
-#define WL_GRAPHIC_GL_SURFACE_TEXTURE_H
+#ifndef WL_GRAPHIC_TEXTURE_H
+#define WL_GRAPHIC_TEXTURE_H
 
 #include "graphic/gl/system_headers.h"
 #include "graphic/surface.h"
 
 struct SDL_Surface;
 
-class GLSurfaceTexture : public Surface {
+class Texture : public Surface {
 public:
-	GLSurfaceTexture(SDL_Surface * surface, bool intensity = false);
-	GLSurfaceTexture(int w, int h);
-
-	virtual ~GLSurfaceTexture();
+	// Create a new surface from an SDL_Surface. If intensity is true, an GL_INTENSITY texture
+	// is created. Ownership is taken.
+	Texture(SDL_Surface * surface, bool intensity = false);
+
+	// Create a new empty (that is randomly filled) Surface with the given
+	// dimensions.
+	Texture(int w, int h);
+
+	virtual ~Texture();
 
 	/// Interface implementation
 	//@{
@@ -48,7 +53,10 @@
 	void brighten_rect(const Rect&, int32_t factor) override;
 	virtual void draw_line
 		(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const RGBColor&, uint8_t width) override;
-	void blit(const Point&, const Surface*, const Rect& srcrc, Composite cm) override;
+	void blit(const Point&,
+	          const Texture*,
+	          const Rect& srcrc,
+	          BlendMode blend_mode = BlendMode::UseAlpha) override;
 
 	GLuint get_gl_texture() const {return m_texture;}
 
@@ -59,4 +67,4 @@
 	GLuint m_texture;
 };
 
-#endif  // end of include guard: WL_GRAPHIC_GL_SURFACE_TEXTURE_H
+#endif  // end of include guard: WL_GRAPHIC_TEXTURE_H

=== renamed file 'src/graphic/surface_cache.cc' => 'src/graphic/texture_cache.cc'
--- src/graphic/surface_cache.cc	2014-09-14 11:31:58 +0000
+++ src/graphic/texture_cache.cc	2014-11-24 07:32:35 +0000
@@ -17,7 +17,7 @@
  *
  */
 
-#include "graphic/surface_cache.h"
+#include "graphic/texture_cache.h"
 
 #include <cassert>
 #include <list>
@@ -26,33 +26,33 @@
 
 #include <SDL.h>
 
-#include "graphic/surface.h"
+#include "graphic/texture.h"
 
 using namespace std;
 
 // I took inspiration from http://timday.bitbucket.org/lru.html, but our use
 // case here is a little different.
 namespace  {
-class SurfaceCacheImpl : public SurfaceCache {
+class TextureCacheImpl : public TextureCache {
 public:
-	SurfaceCacheImpl(uint32_t max_transient_memory) :
+	TextureCacheImpl(uint32_t max_transient_memory) :
 		max_transient_memory_(max_transient_memory), used_transient_memory_(0) {}
-	virtual ~SurfaceCacheImpl();
+	virtual ~TextureCacheImpl();
 
-	// Implements SurfaceCache.
+	// Implements TextureCache.
 	void flush() override;
-	Surface* get(const string& hash) override;
-	Surface* insert(const string& hash, Surface*, bool) override;
+	Texture* get(const string& hash) override;
+	Texture* insert(const string& hash, Texture*, bool) override;
 
 private:
 	void drop();
 
 	using AccessHistory = list<string>;
 	struct Entry {
-		Entry(Surface* gs, const AccessHistory::iterator& it, bool transient) :
-			surface(gs), is_transient(transient), last_access(SDL_GetTicks()), list_iterator(it) {}
+		Entry(Texture* gs, const AccessHistory::iterator& it, bool transient) :
+			texture(gs), is_transient(transient), last_access(SDL_GetTicks()), list_iterator(it) {}
 
-		std::unique_ptr<Surface> surface;
+		std::unique_ptr<Texture> texture;
 		bool is_transient;
 		uint32_t last_access;  // Mainly for debugging and analysis.
 		const AccessHistory::iterator list_iterator;  // Only valid if is_transient is true.
@@ -65,11 +65,11 @@
 	AccessHistory access_history_;
 };
 
-SurfaceCacheImpl::~SurfaceCacheImpl() {
+TextureCacheImpl::~TextureCacheImpl() {
 	flush();
 }
 
-void SurfaceCacheImpl::flush() {
+void TextureCacheImpl::flush() {
 	for (Container::iterator it = entries_.begin(); it != entries_.end(); ++it) {
 		delete it->second;
 	}
@@ -78,7 +78,7 @@
 	used_transient_memory_ = 0;
 }
 
-Surface* SurfaceCacheImpl::get(const string& hash) {
+Texture* TextureCacheImpl::get(const string& hash) {
 	const Container::iterator it = entries_.find(hash);
 	if (it == entries_.end())
 		return nullptr;
@@ -89,30 +89,29 @@
 		access_history_.splice(access_history_.end(), access_history_, it->second->list_iterator);
 		it->second->last_access = SDL_GetTicks();
 	}
-	return it->second->surface.get();
+	return it->second->texture.get();
 }
 
-Surface* SurfaceCacheImpl::insert(const string& hash, Surface* surf, bool transient) {
+Texture* TextureCacheImpl::insert(const string& hash, Texture* texture, bool transient) {
 	assert(entries_.find(hash) == entries_.end());
 
 	if (transient) {
-		const uint32_t surface_size = surf->width() * surf->height() * 4;
-		while (used_transient_memory_ + surface_size > max_transient_memory_) {
+		const uint32_t texture_size = texture->width() * texture->height() * 4;
+		while (used_transient_memory_ + texture_size > max_transient_memory_) {
 			drop();
 		}
 
 		// Record hash as most-recently-used.
 		AccessHistory::iterator it = access_history_.insert(access_history_.end(), hash);
-		used_transient_memory_ += surface_size;
-		entries_.insert(make_pair(hash, new Entry(surf, it, true)));
+		used_transient_memory_ += texture_size;
+		entries_.insert(make_pair(hash, new Entry(texture, it, true)));
 	} else {
-		entries_.insert(make_pair(hash, new Entry(surf, access_history_.end(), false)));
+		entries_.insert(make_pair(hash, new Entry(texture, access_history_.end(), false)));
 	}
-
-	return surf;
+	return texture;
 }
 
-void SurfaceCacheImpl::drop() {
+void TextureCacheImpl::drop() {
 	assert(!access_history_.empty());
 
 	// Identify least recently used key
@@ -120,8 +119,8 @@
 	assert(it != entries_.end());
 	assert(it->second->is_transient);
 
-	const uint32_t surface_size = it->second->surface->width() * it->second->surface->height() * 4;
-	used_transient_memory_ -= surface_size;
+	const uint32_t texture_size = it->second->texture->width() * it->second->texture->height() * 4;
+	used_transient_memory_ -= texture_size;
 
 	// Erase both elements to completely purge record
 	delete it->second;
@@ -131,6 +130,6 @@
 
 }  // namespace
 
-SurfaceCache* create_surface_cache(uint32_t transient_memory_in_bytes) {
-	return new SurfaceCacheImpl(transient_memory_in_bytes);
+TextureCache* create_texture_cache(uint32_t transient_memory_in_bytes) {
+	return new TextureCacheImpl(transient_memory_in_bytes);
 }

=== renamed file 'src/graphic/surface_cache.h' => 'src/graphic/texture_cache.h'
--- src/graphic/surface_cache.h	2014-07-14 19:48:07 +0000
+++ src/graphic/texture_cache.h	2014-11-24 07:32:35 +0000
@@ -17,8 +17,8 @@
  *
  */
 
-#ifndef WL_GRAPHIC_SURFACE_CACHE_H
-#define WL_GRAPHIC_SURFACE_CACHE_H
+#ifndef WL_GRAPHIC_TEXTURE_CACHE_H
+#define WL_GRAPHIC_TEXTURE_CACHE_H
 
 #include <string>
 
@@ -26,7 +26,7 @@
 
 #include "base/macros.h"
 
-class Surface;
+class Texture;
 
 // Caches Surfaces. It contains surfaces which must not be deleted and
 // transient surfaces that are always free to be deleted - somebody else must
@@ -35,32 +35,32 @@
 // Nobody in Widelands should hold onto a Surface they get from this class,
 // instead, they should use it only temporarily and rerequest it whenever they
 // need it.
-class SurfaceCache {
+class TextureCache {
 public:
-	SurfaceCache() {}
-	virtual ~SurfaceCache() {}
+	TextureCache() {}
+	virtual ~TextureCache() {}
 
 	/// Deletes all surfaces in the cache leaving it as if it were just created.
 	virtual void flush() = 0;
 
 	/// Returns an entry if it is cached, nullptr otherwise.
-	virtual Surface* get(const std::string& hash) = 0;
+	virtual Texture* get(const std::string& hash) = 0;
 
-	// Inserts this entry into the SurfaceCache. asserts() that there is no
+	// Inserts this entry into the TextureCache. asserts() that there is no
 	// entry with this hash already cached. Returns the given Surface for
 	// convenience. If 'transient' is false, this surface will not be deleted
 	// automatically - use this if surfaces are around for a long time and
 	// recreation is expensive (i.e. images loaded from disk).
-	virtual Surface* insert(const std::string& hash, Surface*, bool transient) = 0;
+	virtual Texture* insert(const std::string& hash, Texture*, bool transient) = 0;
 
 private:
-	DISALLOW_COPY_AND_ASSIGN(SurfaceCache);
+	DISALLOW_COPY_AND_ASSIGN(TextureCache);
 };
 
 // Create a new Cache whichs combined pixels in all transient surfaces are
 // always below the given limit (Note: there is overhead for class members
 // which is not counted as the pixels make up the bulk of the size of a
 // surface).
-SurfaceCache* create_surface_cache(uint32_t transient_memory_in_bytes);
+TextureCache* create_texture_cache(uint32_t transient_memory_in_bytes);
 
-#endif  // end of include guard: WL_GRAPHIC_SURFACE_CACHE_H
+#endif  // end of include guard: WL_GRAPHIC_TEXTURE_CACHE_H

=== modified file 'src/logic/building.cc'
--- src/logic/building.cc	2014-11-02 14:11:52 +0000
+++ src/logic/building.cc	2014-11-24 07:32:35 +0000
@@ -732,7 +732,7 @@
 	if (dpyflags & InteractiveBase::dfShowCensus) {
 		const std::string info = info_string(igbase.building_census_format());
 		if (!info.empty()) {
-			dst.blit(pos - Point(0, 48), UI::g_fh1->render(info), CM_UseAlpha, UI::Align_Center);
+			dst.blit(pos - Point(0, 48), UI::g_fh1->render(info), BlendMode::UseAlpha, UI::Align_Center);
 		}
 	}
 
@@ -744,7 +744,7 @@
 				return;
 		const std::string info = info_string(igbase.building_statistics_format());
 		if (!info.empty()) {
-			dst.blit(pos - Point(0, 35), UI::g_fh1->render(info), CM_UseAlpha, UI::Align_Center);
+			dst.blit(pos - Point(0, 35), UI::g_fh1->render(info), BlendMode::UseAlpha, UI::Align_Center);
 		}
 	}
 }

=== modified file 'src/logic/immovable.cc'
--- src/logic/immovable.cc	2014-11-02 14:11:52 +0000
+++ src/logic/immovable.cc	2014-11-24 07:32:35 +0000
@@ -562,7 +562,7 @@
 	dst.drawanimrect
 		(pos, m_anim, current_frame * frametime, get_owner(), Rect(Point(0, curh - lines), curw, lines));
 
-	// Additionnaly, if statistics are enabled, draw a progression string
+	// Additionally, if statistics are enabled, draw a progression string
 	if (game.get_ibase()->get_display_flags() & InteractiveBase::dfShowStatistics) {
 		unsigned int percent = (100 * done / total);
 		m_construct_string =
@@ -570,7 +570,10 @@
 			 % UI_FONT_CLR_DARK_HEX % (boost::format(_("%i%% built")) % percent).str())
 			 .str();
 		m_construct_string = as_uifont(m_construct_string);
-		dst.blit(pos - Point(0, 48), UI::g_fh1->render(m_construct_string), CM_UseAlpha, UI::Align_Center);
+		dst.blit(pos - Point(0, 48),
+		         UI::g_fh1->render(m_construct_string),
+		         BlendMode::UseAlpha,
+		         UI::Align_Center);
 	}
 }
 

=== modified file 'src/logic/map_info.cc'
--- src/logic/map_info.cc	2014-11-24 07:32:34 +0000
+++ src/logic/map_info.cc	2014-11-24 07:32:35 +0000
@@ -29,7 +29,7 @@
 #include "graphic/graphic.h"
 #include "graphic/image_io.h"
 #include "graphic/minimap_renderer.h"
-#include "graphic/surface.h"
+#include "graphic/texture.h"
 #include "io/filesystem/filesystem.h"
 #include "io/filesystem/layered_filesystem.h"
 #include "io/filewrite.h"
@@ -87,7 +87,8 @@
 		ml->preload_map(true);
 		ml->load_map_complete(egbase, true);
 
-		std::unique_ptr<Surface> minimap(draw_minimap(egbase, nullptr, Point(0, 0), MiniMapLayer::Terrain));
+		std::unique_ptr<Texture> minimap(
+		   draw_minimap(egbase, nullptr, Point(0, 0), MiniMapLayer::Terrain));
 
 		// Write minimap
 		{

=== modified file 'src/map_io/map_extradata_packet.cc'
--- src/map_io/map_extradata_packet.cc	2014-09-20 09:37:47 +0000
+++ src/map_io/map_extradata_packet.cc	2014-11-24 07:32:35 +0000
@@ -23,7 +23,7 @@
 
 #include "graphic/graphic.h"
 #include "graphic/in_memory_image.h"
-#include "graphic/surface.h"
+#include "graphic/texture.h"
 #include "io/fileread.h"
 #include "io/filewrite.h"
 #include "logic/editor_game_base.h"
@@ -67,7 +67,7 @@
 							IMG_Load_RW(SDL_RWFromMem(fr.data(0), fr.get_size()), 1);
 						if (!surf)
 							continue; //  Illegal pic. Skip it.
-						image = g_gr->images().insert(new_in_memory_image(hash, Surface::create(surf)));
+						image = g_gr->images().insert(new_in_memory_image(hash, new Texture(surf)));
 					} else {
 						image = g_gr->images().get(hash);
 					}

=== modified file 'src/map_io/map_saver.cc'
--- src/map_io/map_saver.cc	2014-11-22 15:27:45 +0000
+++ src/map_io/map_saver.cc	2014-11-24 07:32:35 +0000
@@ -26,7 +26,7 @@
 #include "base/wexception.h"
 #include "graphic/image_io.h"
 #include "graphic/minimap_renderer.h"
-#include "graphic/surface.h"
+#include "graphic/texture.h"
 #include "io/filesystem/filesystem.h"
 #include "io/filewrite.h"
 #include "logic/editor_game_base.h"
@@ -217,7 +217,7 @@
 
 	// Write minimap
 	{
-		std::unique_ptr<Surface> minimap(
+		std::unique_ptr<Texture> minimap(
 		   draw_minimap(m_egbase, nullptr, Point(0, 0), MiniMapLayer::Terrain));
 		FileWrite fw;
 		save_surface_to_png(minimap.get(), &fw);

=== modified file 'src/ui_basic/progressbar.cc'
--- src/ui_basic/progressbar.cc	2014-11-02 14:11:52 +0000
+++ src/ui_basic/progressbar.cc	2014-11-24 07:32:35 +0000
@@ -109,6 +109,6 @@
 	const std::string progress_text =
 		(boost::format("<font color=%1$s>%2$i%%</font>") % "ffffff" % percent).str();
 	const Point pos(get_w() / 2, get_h() / 2);
-	dst.blit(pos, UI::g_fh1->render(as_uifont(progress_text)), CM_UseAlpha, Align_Center);
+	dst.blit(pos, UI::g_fh1->render(as_uifont(progress_text)), BlendMode::UseAlpha, Align_Center);
 }
 }

=== modified file 'src/ui_basic/window.cc'
--- src/ui_basic/window.cc	2014-11-22 11:51:38 +0000
+++ src/ui_basic/window.cc	2014-11-24 07:32:35 +0000
@@ -320,7 +320,7 @@
 		dst.blit
 			(Point(get_lborder() + get_inner_w() / 2, TP_B_PIXMAP_THICKNESS / 2),
 				UI::g_fh1->render(m_title),
-				CM_UseAlpha,
+				BlendMode::UseAlpha,
 				Align_Center);
 	}
 

=== modified file 'src/ui_fsmenu/loadgame.cc'
--- src/ui_fsmenu/loadgame.cc	2014-11-22 10:18:20 +0000
+++ src/ui_fsmenu/loadgame.cc	2014-11-24 07:32:35 +0000
@@ -36,7 +36,7 @@
 #include "graphic/image_io.h"
 #include "graphic/image_transformations.h"
 #include "graphic/in_memory_image.h"
-#include "graphic/surface.h"
+#include "graphic/texture.h"
 #include "helper.h"
 #include "io/filesystem/layered_filesystem.h"
 #include "logic/game.h"
@@ -317,13 +317,13 @@
 			if (!minimap_path.empty()) {
 				try {
 					// Load the image
-					std::unique_ptr<Surface> surface(
+					std::unique_ptr<Texture> texture(
 								load_image(
 									minimap_path,
 									std::unique_ptr<FileSystem>(g_fs->make_sub_file_system(gamedata.filename)).get()));
 
 					m_minimap_image.reset(new_in_memory_image(std::string(gamedata.filename + minimap_path),
-																			surface.release()));
+																			texture.release()));
 
 					// Scale it
 					double scale = double(m_minimap_w) / m_minimap_image->width();
@@ -337,7 +337,7 @@
 					const Image* resized = ImageTransformations::resize(m_minimap_image.get(), w, h);
 					// keeps our in_memory_image around and give to icon the one
 					// from resize that is handled by the cache. It is still linked to our
-					// surface
+					// texture.
 					m_minimap_icon.set_size(w, h);
 
 					// Center the minimap in the available space

=== modified file 'src/wui/buildingwindow.cc'
--- src/wui/buildingwindow.cc	2014-11-22 10:18:20 +0000
+++ src/wui/buildingwindow.cc	2014-11-24 07:32:35 +0000
@@ -119,7 +119,7 @@
 
 	const Image* dark_frame = ImageTransformations::change_luminosity
 		(&anim.representative_image(building().owner().get_playercolor()), 1.22, true);
-	dst.blit(Point(get_inner_w() / 2, get_inner_h() / 2), dark_frame, CM_UseAlpha, UI::Align_Center);
+	dst.blit(Point(get_inner_w() / 2, get_inner_h() / 2), dark_frame, BlendMode::UseAlpha, UI::Align_Center);
 }
 
 /*

=== modified file 'src/wui/interactive_base.cc'
--- src/wui/interactive_base.cc	2014-11-24 07:32:34 +0000
+++ src/wui/interactive_base.cc	2014-11-24 07:32:35 +0000
@@ -410,7 +410,7 @@
 	if (get_display_flag(dfDebug) || !dynamic_cast<const Game*>(&egbase())) {
 		const std::string gametime(gametimestring(egbase().get_gametime()));
 		const std::string gametime_text = as_uifont(gametime, UI_FONT_SIZE_SMALL);
-		dst.blit(Point(5, 5), UI::g_fh1->render(gametime_text), CM_UseAlpha, UI::Align_TopLeft);
+		dst.blit(Point(5, 5), UI::g_fh1->render(gametime_text), BlendMode::UseAlpha, UI::Align_TopLeft);
 		static boost::format node_format("(%i, %i)");
 
 		const std::string node_text = as_uifont
@@ -418,7 +418,7 @@
 		dst.blit(
 			Point(get_w() - 5, get_h() - 5),
 			UI::g_fh1->render(node_text),
-			CM_UseAlpha,
+			BlendMode::UseAlpha,
 			UI::Align_BottomRight
 		);
 	}
@@ -430,7 +430,7 @@
 			((fps_format %
 			  (1000.0 / m_frametime) % (1000.0 / (m_avg_usframetime / 1000)))
 			 .str(), UI_FONT_SIZE_SMALL);
-		dst.blit(Point(5, 25), UI::g_fh1->render(fps_text), CM_UseAlpha, UI::Align_Left);
+		dst.blit(Point(5, 25), UI::g_fh1->render(fps_text), BlendMode::UseAlpha, UI::Align_Left);
 	}
 }
 

=== modified file 'src/wui/minimap.cc'
--- src/wui/minimap.cc	2014-11-22 11:32:06 +0000
+++ src/wui/minimap.cc	2014-11-24 07:32:35 +0000
@@ -26,7 +26,7 @@
 #include "graphic/in_memory_image.h"
 #include "graphic/minimap_renderer.h"
 #include "graphic/rendertarget.h"
-#include "graphic/surface.h"
+#include "graphic/texture.h"
 #include "logic/map.h"
 #include "wui/interactive_player.h"
 #include "wui/mapviewpixelconstants.h"
@@ -63,15 +63,15 @@
 
 void MiniMap::View::draw(RenderTarget & dst)
 {
-	std::unique_ptr<Surface> surface(
+	std::unique_ptr<Texture> texture(
 	   draw_minimap(m_ibase.egbase(),
 	                m_ibase.get_player(),
 	                (*m_flags) & (MiniMapLayer::Zoom2) ?
 	                   Point((m_viewx - get_w() / 4), (m_viewy - get_h() / 4)) :
 	                   Point((m_viewx - get_w() / 2), (m_viewy - get_h() / 2)),
 	                *m_flags | MiniMapLayer::ViewWindow));
-	// Give ownership of the surface to the new image
-	std::unique_ptr<const Image> im(new_in_memory_image("minimap", surface.release()));
+	// Give ownership of the texture to the new image
+	std::unique_ptr<const Image> im(new_in_memory_image("minimap", texture.release()));
 	dst.blit(Point(), im.get());
 	im.reset();
 }

=== modified file 'src/wui/plot_area.cc'
--- src/wui/plot_area.cc	2014-11-08 14:59:03 +0000
+++ src/wui/plot_area.cc	2014-11-24 07:32:35 +0000
@@ -142,7 +142,7 @@
  */
 void draw_value(const string& value, const RGBColor& color, const Point& pos, RenderTarget & dst) {
 	const Image* pic = UI::g_fh1->render(ytick_text_style(value, color));
-	dst.blit(pos, pic, CM_UseAlpha, UI::Align_CenterRight);
+	dst.blit(pos, pic, BlendMode::UseAlpha, UI::Align_CenterRight);
 }
 
 /**
@@ -223,7 +223,7 @@
 			(xtick_text_style((boost::format("-%u ") % (max_x / how_many_ticks * i)).str()));
 		dst.blit
 			(Point(static_cast<int32_t>(posx), inner_h - space_at_bottom + 10),
-			 xtick, CM_UseAlpha, UI::Align_Center);
+			 xtick, BlendMode::UseAlpha, UI::Align_Center);
 
 		posx -= sub;
 	}
@@ -242,7 +242,7 @@
 
 	//  print the used unit
 	const Image* xtick = UI::g_fh1->render(xtick_text_style(get_unit_name(unit)));
-	dst.blit(Point(2, spacing + 2), xtick, CM_UseAlpha, UI::Align_CenterLeft);
+	dst.blit(Point(2, spacing + 2), xtick, BlendMode::UseAlpha, UI::Align_CenterLeft);
 }
 
 }  // namespace


Follow ups