← Back to team overview

widelands-dev team mailing list archive

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

 

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

Requested reviews:
  Widelands Developers (widelands-dev)

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

Suggested commit message:

- Removes all uses of ImageTransformation::change_luminosity and ::gray_out. This needed some refactoring in the how blits are done.
-- 
Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/remove_gray into lp:widelands.
=== modified file 'src/editor/ui_menus/categorized_item_selection_menu.h'
--- src/editor/ui_menus/categorized_item_selection_menu.h	2014-12-04 09:21:33 +0000
+++ src/editor/ui_menus/categorized_item_selection_menu.h	2014-12-04 09:21:33 +0000
@@ -25,7 +25,6 @@
 
 #include "base/i18n.h"
 #include "graphic/image.h"
-#include "graphic/image_transformations.h"
 #include "logic/description_maintainer.h"
 #include "logic/world/editor_category.h"
 #include "ui_basic/box.h"

=== 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-12-04 09:21:33 +0000
+++ src/editor/ui_menus/editor_tool_set_terrain_options_menu.cc	2014-12-04 09:21:33 +0000
@@ -78,13 +78,17 @@
 		Texture* texture = new Texture(terrain_texture.width(), terrain_texture.height());
 		texture->blit(Rect(0, 0, terrain_texture.width(), terrain_texture.height()),
 		              &terrain_texture,
-		              Rect(0, 0, terrain_texture.width(), terrain_texture.height()));
+		              Rect(0, 0, terrain_texture.width(), terrain_texture.height()),
+		              1.,
+		              BlendMode::UseAlpha);
 		Point pt(1, terrain_texture.height() - kSmallPicHeight - 1);
 
 		if (ter_is == TerrainDescription::GREEN) {
 			texture->blit(Rect(pt.x, pt.y, green->width(), green->height()),
 			              green->texture(),
-			              Rect(0, 0, green->width(), green->height()));
+			              Rect(0, 0, green->width(), green->height()),
+			              1.,
+			              BlendMode::UseAlpha);
 			pt.x += kSmallPicWidth + 1;
 			/** TRANSLATORS: This is a terrain type tooltip in the editor */
 			tooltips.push_back(_("arable"));
@@ -92,7 +96,9 @@
 			if (ter_is & TerrainDescription::WATER) {
 				texture->blit(Rect(pt.x, pt.y, water->width(), water->height()),
 				              water->texture(),
-				              Rect(0, 0, water->width(), water->height()));
+				              Rect(0, 0, water->width(), water->height()),
+				              1.,
+				              BlendMode::UseAlpha);
 				pt.x += kSmallPicWidth + 1;
 				/** TRANSLATORS: This is a terrain type tooltip in the editor */
 				tooltips.push_back(_("aquatic"));
@@ -100,7 +106,9 @@
 			else if (ter_is & TerrainDescription::MOUNTAIN) {
 				texture->blit(Rect(pt.x, pt.y, mountain->width(), mountain->height()),
 				              mountain->texture(),
-				              Rect(0, 0, mountain->width(), mountain->height()));
+				              Rect(0, 0, mountain->width(), mountain->height()),
+				              1.,
+				              BlendMode::UseAlpha);
 				pt.x += kSmallPicWidth + 1;
 				/** TRANSLATORS: This is a terrain type tooltip in the editor */
 				tooltips.push_back(_("mountainous"));
@@ -108,7 +116,9 @@
 			if (ter_is & TerrainDescription::ACID) {
 				texture->blit(Rect(pt.x, pt.y, dead->width(), dead->height()),
 				              dead->texture(),
-				              Rect(0, 0, dead->width(), dead->height()));
+				              Rect(0, 0, dead->width(), dead->height()),
+				              1.,
+				              BlendMode::UseAlpha);
 				pt.x += kSmallPicWidth + 1;
 				/** TRANSLATORS: This is a terrain type tooltip in the editor */
 				tooltips.push_back(_("dead"));
@@ -116,7 +126,9 @@
 			if (ter_is & TerrainDescription::UNPASSABLE) {
 				texture->blit(Rect(pt.x, pt.y, unpassable->width(), unpassable->height()),
 				              unpassable->texture(),
-				              Rect(0, 0, unpassable->width(), unpassable->height()));
+				              Rect(0, 0, unpassable->width(), unpassable->height()),
+				              1.,
+				              BlendMode::UseAlpha);
 				pt.x += kSmallPicWidth + 1;
 				/** TRANSLATORS: This is a terrain type tooltip in the editor */
 				tooltips.push_back(_("unpassable"));
@@ -124,7 +136,9 @@
 			if (ter_is & TerrainDescription::DRY) {
 				texture->blit(Rect(pt.x, pt.y, dry->width(), dry->height()),
 				              dry->texture(),
-				              Rect(0, 0, dry->width(), dry->height()));
+				              Rect(0, 0, dry->width(), dry->height()),
+				              1.,
+				              BlendMode::UseAlpha);
 				/** TRANSLATORS: This is a terrain type tooltip in the editor */
 				 tooltips.push_back(_("treeless"));
 			}

=== modified file 'src/graphic/animation.cc'
--- src/graphic/animation.cc	2014-12-04 09:21:33 +0000
+++ src/graphic/animation.cc	2014-12-04 09:21:33 +0000
@@ -323,7 +323,8 @@
 	assert(target);
 
 	const Image& frame = get_frame(time, clr);
-	target->blit(Rect(dst.x, dst.y, srcrc.w, srcrc.h), frame.texture(), srcrc);
+	target->blit(
+	   Rect(dst.x, dst.y, srcrc.w, srcrc.h), frame.texture(), srcrc, 1., BlendMode::UseAlpha);
 }
 
 const Image& NonPackedAnimation::get_frame(uint32_t time, const RGBColor* playercolor) const {

=== modified file 'src/graphic/blend_mode.h'
--- src/graphic/blend_mode.h	2014-11-24 07:25:21 +0000
+++ src/graphic/blend_mode.h	2014-12-04 09:21:33 +0000
@@ -21,7 +21,7 @@
 #define WL_GRAPHIC_BLEND_MODE_H
 
 // Defines blending during blitting.
-enum BlendMode {
+enum class BlendMode {
 	// Perform a normal blitting operation that respects the alpha channel if
 	// present.
 	UseAlpha = 0,

=== modified file 'src/graphic/gl/blit_program.cc'
--- src/graphic/gl/blit_program.cc	2014-11-24 07:25:21 +0000
+++ src/graphic/gl/blit_program.cc	2014-12-04 09:21:33 +0000
@@ -22,6 +22,7 @@
 #include <vector>
 
 #include "base/log.h"
+#include "graphic/gl/utils.h"
 
 namespace  {
 
@@ -43,32 +44,87 @@
 }
 )";
 
-const char kBlitFragmentShader[] = R"(
-#version 120
-
-uniform sampler2D u_texture;
-
-varying vec2 out_texture_coordinate;
-
-void main() {
-	gl_FragColor = texture2D(u_texture, out_texture_coordinate);
+const char kVanillaBlitFragmentShader[] = R"(
+#version 120
+
+uniform float u_opacity;
+uniform sampler2D u_texture;
+
+varying vec2 out_texture_coordinate;
+
+void main() {
+	vec4 color = texture2D(u_texture, out_texture_coordinate);
+	gl_FragColor = vec4(color.rgb, u_opacity * color.a);
+}
+)";
+
+const char kGrayBlitFragmentShader[] = R"(
+#version 120
+
+uniform float u_luminosity_factor;
+uniform float u_opacity;
+uniform sampler2D u_texture;
+
+varying vec2 out_texture_coordinate;
+
+void main() {
+	vec4 texture_color = texture2D(u_texture, out_texture_coordinate);
+	// See http://en.wikipedia.org/wiki/YUV.
+	float luminance = dot(vec3(0.299, 0.587, 0.114), texture_color.rgb) * u_luminosity_factor;
+
+	gl_FragColor = vec4(vec3(luminance), u_opacity * texture_color.a);
 }
 )";
 
 }  // namespace
 
-// static
-BlitProgram& BlitProgram::instance() {
-	static BlitProgram blit_program;
-	return blit_program;
-}
-
-BlitProgram::BlitProgram() {
-	gl_program_.build(kBlitVertexShader, kBlitFragmentShader);
+class BlitProgram {
+public:
+	BlitProgram(const std::string& fragment_shader);
+
+	void activate(const FloatRect& gl_dest_rect,
+	              const FloatRect& gl_src_rect,
+	              const GLuint gl_texture,
+					  const float opacity,
+	              const BlendMode blend_mode);
+
+	void draw();
+	void draw_and_deactivate(BlendMode blend_mode);
+
+	GLuint program_object() const {
+		return gl_program_.object();
+	}
+
+private:
+	struct PerVertexData {
+		float gl_x, gl_y;
+	};
+	static_assert(sizeof(PerVertexData) == 8, "Wrong padding.");
+
+	// The buffer that will contain the quad for rendering.
+	Gl::Buffer gl_array_buffer_;
+
+	// The program.
+	Gl::Program gl_program_;
+
+	// Attributes.
+	GLint attr_position_;
+
+	// Uniforms.
+	GLint u_dst_rect_;
+	GLint u_opacity_;
+	GLint u_src_rect_;
+	GLint u_texture_;
+	DISALLOW_COPY_AND_ASSIGN(BlitProgram);
+};
+
+BlitProgram::BlitProgram(const std::string& fragment_shader) {
+	gl_program_.build(kBlitVertexShader, fragment_shader.c_str());
 
 	attr_position_ = glGetAttribLocation(gl_program_.object(), "attr_position");
 
 	u_texture_ = glGetUniformLocation(gl_program_.object(), "u_texture");
+	u_opacity_ = glGetUniformLocation(gl_program_.object(), "u_opacity");
 	u_dst_rect_ = glGetUniformLocation(gl_program_.object(), "u_dst_rect");
 	u_src_rect_ = glGetUniformLocation(gl_program_.object(), "u_src_rect");
 
@@ -94,9 +150,10 @@
 	glBindBuffer(GL_ARRAY_BUFFER, 0);
 }
 
-void BlitProgram::draw(const FloatRect& gl_dest_rect,
+void BlitProgram::activate(const FloatRect& gl_dest_rect,
                        const FloatRect& gl_src_rect,
                        const GLuint gl_texture,
+							  const float opacity,
                        const BlendMode blend_mode) {
 	glUseProgram(gl_program_.object());
 	glEnableVertexAttribArray(attr_position_);
@@ -111,6 +168,7 @@
 
 
 	glUniform1i(u_texture_, 0);
+	glUniform1f(u_opacity_, opacity);
 	glUniform4f(u_dst_rect_, gl_dest_rect.x, gl_dest_rect.y, gl_dest_rect.w, gl_dest_rect.h);
 	glUniform4f(u_src_rect_, gl_src_rect.x, gl_src_rect.y, gl_src_rect.w, gl_src_rect.h);
 
@@ -120,7 +178,9 @@
 	if (blend_mode == BlendMode::Copy) {
 		glBlendFunc(GL_ONE, GL_ZERO);
 	}
+}
 
+void BlitProgram::draw_and_deactivate(BlendMode blend_mode) {
 	glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
 
 	if (blend_mode == BlendMode::Copy) {
@@ -130,3 +190,53 @@
 	glDisableVertexAttribArray(attr_position_);
 	glBindBuffer(GL_ARRAY_BUFFER, 0);
 }
+
+// static
+VanillaBlitProgram& VanillaBlitProgram::instance() {
+	static VanillaBlitProgram blit_program;
+	return blit_program;
+}
+
+VanillaBlitProgram::~VanillaBlitProgram() {
+}
+
+VanillaBlitProgram::VanillaBlitProgram() {
+	blit_program_.reset(new BlitProgram(kVanillaBlitFragmentShader));
+}
+
+
+void VanillaBlitProgram::draw(const FloatRect& gl_dest_rect,
+                       const FloatRect& gl_src_rect,
+                       const GLuint gl_texture,
+							  const float opacity,
+                       const BlendMode blend_mode) {
+	blit_program_->activate(gl_dest_rect, gl_src_rect, gl_texture, opacity, blend_mode);
+	blit_program_->draw_and_deactivate(blend_mode);
+}
+
+// static
+GrayBlitProgram& GrayBlitProgram::instance() {
+	static GrayBlitProgram blit_program;
+	return blit_program;
+}
+
+GrayBlitProgram::~GrayBlitProgram() {
+}
+
+GrayBlitProgram::GrayBlitProgram() {
+	blit_program_.reset(new BlitProgram(kGrayBlitFragmentShader));
+
+	u_luminosity_factor_ = glGetUniformLocation(blit_program_->program_object(), "u_luminosity_factor");
+}
+
+void GrayBlitProgram::draw(const FloatRect& gl_dest_rect,
+                       const FloatRect& gl_src_rect,
+                       const GLuint gl_texture,
+							  const float opacity,
+                       const float luminosity_factor) {
+	blit_program_->activate(gl_dest_rect, gl_src_rect, gl_texture, opacity, BlendMode::UseAlpha);
+
+	glUniform1f(u_luminosity_factor_, luminosity_factor);
+
+	blit_program_->draw_and_deactivate(BlendMode::UseAlpha);
+}

=== modified file 'src/graphic/gl/blit_program.h'
--- src/graphic/gl/blit_program.h	2014-11-24 07:25:21 +0000
+++ src/graphic/gl/blit_program.h	2014-12-04 09:21:33 +0000
@@ -20,49 +20,67 @@
 #ifndef WL_GRAPHIC_GL_BLIT_PROGRAM_H
 #define WL_GRAPHIC_GL_BLIT_PROGRAM_H
 
+#include <memory>
+
+#include "base/macros.h"
 #include "base/rect.h"
 #include "graphic/blend_mode.h"
 #include "graphic/color.h"
-#include "graphic/gl/utils.h"
-
-class BlitProgram {
-public:
-	// Returns the (singleton) instance of this class.
-	static BlitProgram& instance();
+#include "graphic/gl/system_headers.h"
+
+class BlitProgram;
+
+class VanillaBlitProgram {
+public:
+	// Returns the (singleton) instance of this class.
+	static VanillaBlitProgram& instance();
+	~VanillaBlitProgram();
+
+	// Draws the rectangle 'gl_src_rect' from the texture with the name
+	// 'gl_texture' to 'gl_dest_rect' in the currently bound framebuffer. All alpha
+	// values are multiplied by 'opacity' during the blit.
+	// All 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,
+				 float opacity,
+	          const BlendMode blend_mode);
+
+private:
+	VanillaBlitProgram();
+
+	std::unique_ptr<BlitProgram> blit_program_;
+
+	DISALLOW_COPY_AND_ASSIGN(VanillaBlitProgram);
+};
+
+class GrayBlitProgram {
+public:
+	// Returns the (singleton) instance of this class.
+	static GrayBlitProgram& instance();
+	~GrayBlitProgram();
 
 	// 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 'blend_mode' defines if the
 	// values are copied or if alpha values are used.
+	// The image is converted to grayscale during blit.
 	void draw(const FloatRect& gl_dest_rect,
 	          const FloatRect& gl_src_rect,
 	          const GLuint gl_texture,
-	          const BlendMode blend_mode);
+				 float opacity,
+	          float luminosity_factor);
 
 private:
-	BlitProgram();
-
-	struct PerVertexData {
-		float gl_x, gl_y;
-	};
-	static_assert(sizeof(PerVertexData) == 8, "Wrong padding.");
-
-	// The buffer that will contain the quad for rendering.
-	Gl::Buffer gl_array_buffer_;
-
-	// The program.
-	Gl::Program gl_program_;
-
-	// Attributes.
-	GLint attr_position_;
+	GrayBlitProgram();
+
+	std::unique_ptr<BlitProgram> blit_program_;
 
 	// Uniforms.
-	GLint u_texture_;
-	GLint u_dst_rect_;
-	GLint u_src_rect_;
+	GLint u_luminosity_factor_;
 
-	DISALLOW_COPY_AND_ASSIGN(BlitProgram);
+	DISALLOW_COPY_AND_ASSIGN(GrayBlitProgram);
 };
 
-
 #endif  // end of include guard: WL_GRAPHIC_GL_DRAW_RECT_PROGRAM_H

=== modified file 'src/graphic/image_transformations.cc'
--- src/graphic/image_transformations.cc	2014-12-04 09:21:33 +0000
+++ src/graphic/image_transformations.cc	2014-12-04 09:21:33 +0000
@@ -39,120 +39,6 @@
 uint32_t luminance_table_g[0x100];
 uint32_t luminance_table_b[0x100];
 
-/**
- * Create and return an \ref SDL_Surface that contains the given sub-rectangle
- * of the given pixel region.
- */
-SDL_Surface* extract_sdl_surface(Texture & texture, Rect srcrect)
-{
-	assert(srcrect.x >= 0);
-	assert(srcrect.y >= 0);
-	assert(srcrect.x + srcrect.w <= texture.width());
-	assert(srcrect.y + srcrect.h <= texture.height());
-
-	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);
-
-	texture.lock(Surface::Lock_Normal);
-	SDL_LockSurface(dest);
-
-	uint32_t srcpitch = texture.get_pitch();
-	uint32_t rowsize = srcrect.w * fmt.BytesPerPixel;
-	uint8_t * srcpix = texture.get_pixels() + srcpitch * srcrect.y + fmt.BytesPerPixel * srcrect.x;
-	uint8_t * dstpix = static_cast<uint8_t *>(dest->pixels);
-
-	for (int y = 0; y < srcrect.h; ++y) {
-		memcpy(dstpix, srcpix, rowsize);
-		srcpix += srcpitch;
-		dstpix += dest->pitch;
-	}
-
-	SDL_UnlockSurface(dest);
-	texture.unlock(Surface::Unlock_NoChange);
-
-	return dest;
-}
-
-/**
- * Create a grayed version of the given texture.
- */
-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();
-
-	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, texture->get_pixel(x, y));
-
-			//  Halve the opacity to give some difference for image that are
-			//  grayscale to begin with.
-			color.a >>= 1;
-
-			color.r = color.g = color.b =
-				(luminance_table_r[color.r] +
-				 luminance_table_g[color.g] +
-				 luminance_table_b[color.b] +
-				 8388608U) //  compensate for truncation:  .5 * 2^24
-				>> 24;
-
-			dest->set_pixel(x, y, color.map(destfmt));
-		}
-	}
-	texture->unlock(Surface::Unlock_NoChange);
-	dest->unlock(Surface::Unlock_Update);
-
-	return dest;
-}
-
-/**
- * Creates an image with changed luminosity from the given texture.
- */
-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();
-
-	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, texture->get_pixel(x, y));
-
-			if (halve_alpha)
-				color.a >>= 1;
-
-			color.r = color.r * factor > 255 ? 255 : color.r * factor;
-			color.g = color.g * factor > 255 ? 255 : color.g * factor;
-			color.b = color.b * factor > 255 ? 255 : color.b * factor;
-
-			dest->set_pixel(x, y, color.map(destfmt));
-		}
-	}
-	texture->unlock(Surface::Unlock_NoChange);
-	dest->unlock(Surface::Unlock_Update);
-
-	return dest;
-}
-
 // Encodes the given Image into the corresponding image for player color.
 // Takes the neutral set of images and the player color mask.
 Texture* make_playerclr_texture(Texture& original_texture,
@@ -246,42 +132,6 @@
 	TextureCache* const texture_cache_;  // not owned
 };
 
-// A grayed out copy of an Image.
-class GrayedOutImage : public TransformedImage {
-public:
-	GrayedOutImage(const string& ghash, const Image& original, TextureCache* texture_cache) :
-		TransformedImage(ghash, original, texture_cache)
-	{}
-	virtual ~GrayedOutImage() {}
-
-	// Implements TransformedImage.
-	Texture* recalculate_texture() const override {
-		return gray_out_texture(original_.texture());
-	}
-};
-
-// A copy with another luminosity and maybe half the opacity.
-class ChangeLuminosityImage : public TransformedImage {
-public:
-	ChangeLuminosityImage
-		(const string& ghash, const Image& original,
-		 TextureCache* texture_cache, float factor, bool halve_alpha)
-		: TransformedImage(ghash, original, texture_cache),
-		  factor_(factor),
-		  halve_alpha_(halve_alpha)
-	{}
-	virtual ~ChangeLuminosityImage() {}
-
-	// Implements TransformedImage.
-	Texture* recalculate_texture() const override {
-		return change_luminosity_of_texture(original_.texture(), factor_, halve_alpha_);
-	}
-
-private:
-	float factor_;
-	bool halve_alpha_;
-};
-
 // A copy with applied player colors. Also needs a mask - ownership is not
 // taken.
 class PlayerColoredImage : public TransformedImage {
@@ -320,24 +170,6 @@
 		}
 }
 
-const Image* gray_out(const Image* original) {
-	const string new_hash = original->hash() + ":greyed_out";
-	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->textures()));
-}
-
-const Image* change_luminosity(const Image* original, float factor, bool halve_alpha) {
-	const string new_hash =
-		(boost::format("%s:%i:%i") % original->hash() % static_cast<int>(factor * 1000) % halve_alpha).str();
-	if (g_gr->images().has(new_hash))
-		return g_gr->images().get(new_hash);
-	return
-		g_gr->images().insert
-			(new ChangeLuminosityImage(new_hash, *original, &g_gr->textures(), factor, halve_alpha));
-}
-
 const Image* player_colored(const RGBColor& clr, const Image* original, const Image* mask) {
 	const string new_hash =
 		(boost::format("%s:%02x%02x%02x") % original->hash() % static_cast<int>(clr.r) %

=== modified file 'src/graphic/image_transformations.h'
--- src/graphic/image_transformations.h	2014-12-04 09:21:33 +0000
+++ src/graphic/image_transformations.h	2014-12-04 09:21:33 +0000
@@ -37,14 +37,6 @@
 // safe to call the methods with the same arguments multiple times without
 // construction cost.
 
-// Returns a grayed out image of the original.
-const Image* gray_out(const Image* original);
-
-// Returns an image with a modified luminosity by 'factor' and alpha value than
-// the original. If 'halve_alpha' is true, the opacity will be halfed,
-// otherwise it will not be touched.
-const Image* change_luminosity(const Image* original, float factor, bool halve_alpha);
-
 // Encodes the given Image into the corresponding image with a player color.
 // Takes the image and the player color mask and the new color the image should
 // be tainted in.

=== modified file 'src/graphic/rendertarget.cc'
--- src/graphic/rendertarget.cc	2014-12-04 09:21:33 +0000
+++ src/graphic/rendertarget.cc	2014-12-04 09:21:33 +0000
@@ -23,7 +23,6 @@
 #include "base/macros.h"
 #include "graphic/animation.h"
 #include "graphic/graphic.h"
-#include "graphic/image_transformations.h"
 #include "graphic/surface.h"
 #include "logic/player.h"
 #include "logic/tribe.h"
@@ -173,11 +172,11 @@
 	Rect srcrc(Point(0, 0), image->width(), image->height());
 
 	if (to_surface_geometry(&destination_point, &srcrc)) {
-		m_surface->blit(
-		   Rect(destination_point.x, destination_point.y, srcrc.w, srcrc.h),
-		   image->texture(),
-		   srcrc,
-		   blend_mode);
+		m_surface->blit(Rect(destination_point.x, destination_point.y, srcrc.w, srcrc.h),
+		                image->texture(),
+		                srcrc,
+		                1.,
+		                blend_mode);
 	}
 }
 
@@ -199,28 +198,47 @@
 
 	Point destination_point(dst);
 	if (to_surface_geometry(&destination_point, &srcrc))
-		m_surface->blit(
-		   Rect(destination_point.x, destination_point.y, srcrc.w, srcrc.h),
-		   image->texture(),
-		   srcrc,
-		   blend_mode);
+		m_surface->blit(Rect(destination_point.x, destination_point.y, srcrc.w, srcrc.h),
+		                image->texture(),
+		                srcrc,
+		                1.,
+		                blend_mode);
 }
 
 void RenderTarget::blitrect_scale(const Rect& dst,
                                   const Image* image,
-                                  const Rect& src,
+                                  const Rect& source_rect,
+											 const float opacity,
                                   const BlendMode blend_mode) {
 
 	Point destination_point(dst.x, dst.y);
-	Rect srcrect(src);
+	Rect srcrect(source_rect);
 	if (to_surface_geometry(&destination_point, &srcrect)) {
 		m_surface->blit(Rect(destination_point.x, destination_point.y, dst.w, dst.h),
 		                image->texture(),
-		                src,
+		                source_rect,
+							 opacity,
 		                blend_mode);
 	}
 }
 
+void RenderTarget::blitrect_scale_gray(const Rect& destination_rect,
+                                       const Image* image,
+                                       const Rect& source_rect,
+                                       float opacity,
+                                       float luminosity_factor) {
+	Point destination_point(destination_rect.x, destination_rect.y);
+	Rect srcrect(source_rect);
+	if (to_surface_geometry(&destination_point, &srcrect)) {
+		m_surface->blit_gray(
+		   Rect(destination_point.x, destination_point.y, destination_rect.w, destination_rect.h),
+		   image->texture(),
+		   source_rect,
+		   opacity,
+		   luminosity_factor);
+	}
+}
+
 /**
  * Fill the given rectangle with the given image.
  *
@@ -274,7 +292,7 @@
 					srcrc.w = r.w - tx;
 
 				const Rect dst_rect(r.x + tx, r.y + ty, srcrc.w, srcrc.h);
-				m_surface->blit(dst_rect, image->texture(), srcrc, blend_mode);
+				m_surface->blit(dst_rect, image->texture(), srcrc, 1., blend_mode);
 
 				tx += srcrc.w;
 

=== modified file 'src/graphic/rendertarget.h'
--- src/graphic/rendertarget.h	2014-12-04 09:21:33 +0000
+++ src/graphic/rendertarget.h	2014-12-04 09:21:33 +0000
@@ -76,11 +76,26 @@
 	              const Rect& src,
 	              BlendMode blend_mode = BlendMode::UseAlpha);
 
-	void blitrect_scale(
-			const Rect& dst,
-			const Image* image,
-			const Rect& src,
-			BlendMode blend_mode = BlendMode::UseAlpha);
+	// Blits the 'source_rect' from 'image' into the
+	// 'destination_rect' in this rendertarget. All alpha values are
+	// multiplied with 'opacity' before blitting. The 'blend_mode'
+	// defines if values are blended with whats already there or just
+	// copied over.
+	void blitrect_scale(const Rect& destination_rect,
+	                    const Image* image,
+	                    const Rect& source_rect,
+	                    float opacity,
+	                    BlendMode blend_mode);
+
+	// Like blitrect_scale, but the image is converted to grayscale
+	// and all grayscale values are multiplied with
+	// 'luminosity_factor' to make the image brighter or darker. Alpha
+	// is always used on blending.
+	void blitrect_scale_gray(const Rect& destination_rect,
+	                    const Image* image,
+	                    const Rect& source_rect,
+	                    float opacity,
+							  float luminosity_factor);
 
 	void tile(const Rect&,
 	          const Image* image,

=== modified file 'src/graphic/surface.cc'
--- src/graphic/surface.cc	2014-12-04 09:21:33 +0000
+++ src/graphic/surface.cc	2014-12-04 09:21:33 +0000
@@ -157,39 +157,59 @@
 	*y = (*y / height);
 }
 
-void Surface::blit
-	(const Rect& dst, const Texture* texture, const Rect& srcrc, BlendMode blend_mode)
-{
-	glViewport(0, 0, width(), height());
-
+void Surface::src_and_dst_rect_to_gl(const Texture* texture,
+               const Rect& dst_rect,
+               const Rect& src_rect,
+               FloatRect* gl_dst_rect,
+               FloatRect* gl_src_rect) {
 	// Source Rectangle. We have to take into account that the texture might be
 	// a subtexture in another bigger texture. So we first figure out the pixel
 	// coordinates given it is a full texture (values between 0 and 1) and then
 	// adjust these for the texture coordinates in the parent texture.
-	FloatRect gl_src_rect;
-	{
-		const FloatRect& texture_coordinates = texture->texture_coordinates();
-
-		float x1 = srcrc.x;
-		float y1 = srcrc.y;
-		pixel_to_gl_texture(texture->width(), texture->height(), &x1, &y1);
-		x1 = texture_coordinates.x + x1 * texture_coordinates.w;
-		y1 = texture_coordinates.y + y1 * texture_coordinates.h;
-
-		float x2 = srcrc.x + srcrc.w;
-		float y2 = srcrc.y + srcrc.h;
-		pixel_to_gl_texture(texture->width(), texture->height(), &x2, &y2);
-		x2 = texture_coordinates.x + x2 * texture_coordinates.w;
-		y2 = texture_coordinates.y + y2 * texture_coordinates.h;
-
-		gl_src_rect.x = x1;
-		gl_src_rect.y = y1;
-		gl_src_rect.w = x2 - x1;
-		gl_src_rect.h = y2 - y1;
-	}
-
-	const FloatRect gl_dst_rect =
-	   to_opengl(Rect(dst.x, dst.y, dst.w, dst.h), ConversionMode::kExact);
-
-	BlitProgram::instance().draw(gl_dst_rect, gl_src_rect, texture->get_gl_texture(), blend_mode);
+	const FloatRect& texture_coordinates = texture->texture_coordinates();
+
+	float x1 = src_rect.x;
+	float y1 = src_rect.y;
+	pixel_to_gl_texture(texture->width(), texture->height(), &x1, &y1);
+	x1 = texture_coordinates.x + x1 * texture_coordinates.w;
+	y1 = texture_coordinates.y + y1 * texture_coordinates.h;
+
+	float x2 = src_rect.x + src_rect.w;
+	float y2 = src_rect.y + src_rect.h;
+	pixel_to_gl_texture(texture->width(), texture->height(), &x2, &y2);
+	x2 = texture_coordinates.x + x2 * texture_coordinates.w;
+	y2 = texture_coordinates.y + y2 * texture_coordinates.h;
+
+	gl_src_rect->x = x1;
+	gl_src_rect->y = y1;
+	gl_src_rect->w = x2 - x1;
+	gl_src_rect->h = y2 - y1;
+
+	*gl_dst_rect = to_opengl(dst_rect, ConversionMode::kExact);
+}
+
+void Surface::blit
+	(const Rect& dst_rect, const Texture* texture, const Rect& src_rect, float opacity, BlendMode blend_mode)
+{
+	glViewport(0, 0, width(), height());
+
+	FloatRect gl_dst_rect, gl_src_rect;
+	src_and_dst_rect_to_gl(texture, dst_rect, src_rect, &gl_dst_rect, &gl_src_rect);
+
+	VanillaBlitProgram::instance().draw(
+	   gl_dst_rect, gl_src_rect, texture->get_gl_texture(), opacity, blend_mode);
+}
+
+void Surface::blit_gray(const Rect& dst_rect,
+	                  const Texture* texture,
+	                  const Rect& src_rect,
+							const float opacity,
+	                  float opacity_factor) {
+	glViewport(0, 0, width(), height());
+
+	FloatRect gl_dst_rect, gl_src_rect;
+	src_and_dst_rect_to_gl(texture, dst_rect, src_rect, &gl_dst_rect, &gl_src_rect);
+
+	GrayBlitProgram::instance().draw(
+	   gl_dst_rect, gl_src_rect, texture->get_gl_texture(), opacity, opacity_factor);
 }

=== modified file 'src/graphic/surface.h'
--- src/graphic/surface.h	2014-12-04 09:21:33 +0000
+++ src/graphic/surface.h	2014-12-04 09:21:33 +0000
@@ -46,7 +46,15 @@
 	virtual void blit(const Rect& dst,
 	                  const Texture*,
 	                  const Rect& srcrc,
-	                  BlendMode blend_mode = BlendMode::UseAlpha);
+							const float opacity,
+	                  BlendMode blend_mode);
+
+	/// This draws a grayed out version.
+	virtual void blit_gray(const Rect& dst,
+	                  const Texture*,
+	                  const Rect& srcrc,
+							const float opacity,
+	                  float opacity_factor);
 
 	/// Draws a filled rect to the surface. No blending takes place, the values
 	// in the target are just replaced (i.e. / BlendMode would be BlendMode::Copy).
@@ -60,7 +68,6 @@
 		(int32_t x1, int32_t y1, int32_t x2, int32_t y2, const RGBColor& color, uint8_t width = 1);
 
 	/// makes a rectangle on the surface brighter (or darker).
-	/// @note this is slow in SDL mode. Use with care
 	virtual void brighten_rect(const Rect&, int32_t factor);
 
 	/// The functions below are for direct pixel access. This should be used
@@ -143,6 +150,14 @@
 	};
 	FloatRect to_opengl(const Rect& rect, ConversionMode mode);
 
+	// Convert 'dst' and 'srcrc' from pixel space into opengl space, taking into
+	// account that we might be a subtexture in a bigger texture.
+	void src_and_dst_rect_to_gl(const Texture* texture,
+	                            const Rect& dst,
+	                            const Rect& srcrc,
+	                            FloatRect* gl_dst_rect,
+	                            FloatRect* gl_src_rect);
+
 	/// Logical width and height of the surface
 	uint16_t m_w, m_h;
 

=== modified file 'src/graphic/text/rt_render.cc'
--- src/graphic/text/rt_render.cc	2014-12-04 09:21:33 +0000
+++ src/graphic/text/rt_render.cc	2014-12-04 09:21:33 +0000
@@ -336,6 +336,7 @@
 	rv->blit(Rect(0, 0, img.width(), img.height()),
 	         &img,
 	         Rect(0, 0, img.width(), img.height()),
+	         1.,
 	         BlendMode::Copy);
 	return rv;
 }
@@ -364,7 +365,7 @@
 	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(Rect(curx, 0, srcrect.w, srcrect.h), &t, srcrect, BlendMode::Copy);
+		rv->blit(Rect(curx, 0, srcrect.w, srcrect.h), &t, srcrect, 1., BlendMode::Copy);
 	}
 	return rv;
 }
@@ -433,7 +434,7 @@
 				dst.y = 0;
 				srcrect.w = dst.w = min<int>(m_bg->width(), m_w - curx);
 				srcrect.h = dst.h = m_h;
-				rv->blit(dst, m_bg->texture(), srcrect, BlendMode::Copy);
+				rv->blit(dst, m_bg->texture(), srcrect, 1., BlendMode::Copy);
 			}
 		} else {
 			rv->fill_rect(Rect(0, 0, m_w, m_h), RGBAColor(255, 255, 255, 0));
@@ -494,7 +495,7 @@
 					dst.y = cury;
 					src.w = dst.w = min<int>(m_bg_img->width(), m_w + m_margin.left - curx);
 					src.h = dst.h = min<int>(m_bg_img->height(), m_h + m_margin.top - cury);
-					rv->blit(dst, m_bg_img->texture(), src, BlendMode::Copy);
+					rv->blit(dst, m_bg_img->texture(), src, 1., BlendMode::Copy);
 				}
 			}
 			set_alpha = false;
@@ -509,7 +510,7 @@
 				                node_texture->height());
 				Rect src = Rect(0, 0, node_texture->width(), node_texture->height());
 
-				rv->blit(dst, node_texture, src, set_alpha ? BlendMode::Copy : BlendMode::UseAlpha);
+				rv->blit(dst, node_texture, src, 1., set_alpha ? BlendMode::Copy : BlendMode::UseAlpha);
 				delete node_texture;
 			}
 			delete n;
@@ -563,6 +564,7 @@
 	rv->blit(Rect(0, 0, m_image.width(), m_image.height()),
 	         m_image.texture(),
 	         Rect(0, 0, m_image.width(), m_image.height()),
+				1.,
 	         BlendMode::Copy);
 	return rv;
 }

=== modified file 'src/graphic/texture.cc'
--- src/graphic/texture.cc	2014-12-04 09:21:33 +0000
+++ src/graphic/texture.cc	2014-12-04 09:21:33 +0000
@@ -265,13 +265,27 @@
 }
 
 void Texture::blit
-	(const Rect& dst, const Texture* src, const Rect& srcrc, BlendMode blend_mode)
+	(const Rect& dst, const Texture* src, const Rect& srcrc, float opacity, BlendMode blend_mode)
 {
 	if (m_w <= 0 || m_h <= 0) {
 		return;
 	}
 
 	setup_gl(m_texture);
-	Surface::blit(dst, src, srcrc, blend_mode);
+	Surface::blit(dst, src, srcrc, opacity, blend_mode);
+	reset_gl();
+}
+
+void Texture::blit_gray(const Rect& dst,
+                        const Texture* src,
+                        const Rect& srcrc,
+                        float opacity,
+                        const float opacity_factor) {
+	if (m_w <= 0 || m_h <= 0) {
+		return;
+	}
+
+	setup_gl(m_texture);
+	Surface::blit_gray(dst, src, srcrc, opacity, opacity_factor);
 	reset_gl();
 }

=== modified file 'src/graphic/texture.h'
--- src/graphic/texture.h	2014-12-04 09:21:33 +0000
+++ src/graphic/texture.h	2014-12-04 09:21:33 +0000
@@ -61,7 +61,13 @@
 	void blit(const Rect& dstretc,
 	          const Texture*,
 	          const Rect& srcrc,
-	          BlendMode blend_mode = BlendMode::UseAlpha) override;
+				 float opacity,
+	          BlendMode blend_mode) override;
+	void blit_gray(const Rect& dst,
+	               const Texture*,
+	               const Rect& srcrc,
+	               const float opacity,
+	               float opacity_factor) override;
 
 	GLuint get_gl_texture() const {return m_texture;}
 

=== modified file 'src/graphic/texture_atlas.cc'
--- src/graphic/texture_atlas.cc	2014-12-04 09:21:33 +0000
+++ src/graphic/texture_atlas.cc	2014-12-04 09:21:33 +0000
@@ -144,7 +144,10 @@
 		packed_texture->blit(
 		   Rect(block.node->r.x, block.node->r.y, block.texture->width(), block.texture->height()),
 		   block.texture,
-		   Rect(0, 0, block.texture->width(), block.texture->height()));
+		   Rect(0, 0, block.texture->width(), block.texture->height()),
+		   1.,
+		   BlendMode::UseAlpha);
+
 		textures->emplace_back(new Texture(
 		   packed_texture->get_gl_texture(),
 		   Rect(block.node->r.top_left(), block.texture->width(), block.texture->height()),

=== modified file 'src/logic/warehouse.cc'
--- src/logic/warehouse.cc	2014-11-30 18:49:38 +0000
+++ src/logic/warehouse.cc	2014-12-04 09:21:33 +0000
@@ -376,7 +376,6 @@
 			(owner().is_worker_type_allowed(worker_index) &&
 			 m_next_worker_without_cost_spawn[i] == static_cast<uint32_t>(never()))
 		{
-			upcast(Game, game, &egbase);
 			if (next_spawn == static_cast<uint32_t>(never())) {
 				next_spawn = schedule_act(dynamic_cast<Game&>(egbase), WORKER_WITHOUT_COST_SPAWN_INTERVAL);
 			}

=== modified file 'src/ui_basic/button.cc'
--- src/ui_basic/button.cc	2014-12-04 09:21:33 +0000
+++ src/ui_basic/button.cc	2014-12-04 09:21:33 +0000
@@ -23,7 +23,6 @@
 #include "graphic/font.h"
 #include "graphic/font_handler.h"
 #include "graphic/image.h"
-#include "graphic/image_transformations.h"
 #include "graphic/rendertarget.h"
 #include "ui_basic/mouse_constants.h"
 #include "wlapplication.h"
@@ -56,7 +55,6 @@
 	m_title         (title_text),
 	m_pic_background(bg_pic),
 	m_pic_custom    (nullptr),
-	m_pic_custom_disabled(nullptr),
 	m_font(UI::Font::ui_small()),
 	m_clr_down      (229, 161, 2),
 	m_draw_caret    (false)
@@ -84,7 +82,6 @@
 	m_time_nextact  (0),
 	m_pic_background(bg_pic),
 	m_pic_custom    (fg_pic),
-	m_pic_custom_disabled(fg_pic ? ImageTransformations::gray_out(fg_pic) : nullptr),
 	m_font(UI::Font::ui_small()),
 	m_clr_down      (229, 161, 2),
 	m_draw_caret    (false)
@@ -109,7 +106,6 @@
 		return;
 
 	m_pic_custom = pic;
-	m_pic_custom_disabled = ImageTransformations::gray_out(pic);
 
 	update();
 }
@@ -181,10 +177,21 @@
 		int blit_width = image_scale * m_pic_custom->width();
 		int blit_height = image_scale * m_pic_custom->height();
 
+		if (m_enabled) {
 		dst.blitrect_scale(
 		   Rect((get_w() - blit_width) / 2, (get_h() - blit_height) / 2, blit_width, blit_height),
-		   m_enabled ? m_pic_custom : m_pic_custom_disabled,
-		   Rect(0, 0, m_pic_custom->width(), m_pic_custom->height()));
+		   m_pic_custom,
+		   Rect(0, 0, m_pic_custom->width(), m_pic_custom->height()),
+		   1.,
+		   BlendMode::UseAlpha);
+		} else {
+			dst.blitrect_scale_gray(
+			   Rect((get_w() - blit_width) / 2, (get_h() - blit_height) / 2, blit_width, blit_height),
+			   m_pic_custom,
+			   Rect(0, 0, m_pic_custom->width(), m_pic_custom->height()),
+			   0.5 /* opacity */,
+			   1. /* luminosity_factor */);
+		}
 
 	} else if (m_title.length()) {
 		//  otherwise draw title string centered

=== modified file 'src/ui_basic/button.h'
--- src/ui_basic/button.h	2014-07-14 10:45:44 +0000
+++ src/ui_basic/button.h	2014-12-04 09:21:33 +0000
@@ -105,7 +105,6 @@
 
 	const Image* m_pic_background; //  background texture (picture ID)
 	const Image* m_pic_custom;     //  custom icon on the button
-	const Image* m_pic_custom_disabled;
 	Font * m_font;
 
 	RGBColor    m_clr_down; //  color of border while a flat button is "down"

=== modified file 'src/ui_basic/icon.cc'
--- src/ui_basic/icon.cc	2014-12-04 09:21:33 +0000
+++ src/ui_basic/icon.cc	2014-12-04 09:21:33 +0000
@@ -64,8 +64,11 @@
 		int height = scale * get_h();
 		int x = (get_w() - width) / 2;
 		int y = (get_h() - height) / 2;
-		dst.blitrect_scale(
-		   Rect(x, y, width, height), m_pic, Rect(0, 0, m_pic->width(), m_pic->height()));
+		dst.blitrect_scale(Rect(x, y, width, height),
+		                   m_pic,
+		                   Rect(0, 0, m_pic->width(), m_pic->height()),
+		                   1.,
+		                   BlendMode::UseAlpha);
 	}
 	if (m_draw_frame) {
 		dst.draw_rect(Rect(0, 0, get_w(), get_h()), m_framecolor);

=== modified file 'src/ui_basic/progresswindow.cc'
--- src/ui_basic/progresswindow.cc	2014-12-04 09:21:33 +0000
+++ src/ui_basic/progresswindow.cc	2014-12-04 09:21:33 +0000
@@ -67,7 +67,8 @@
 	m_label_rectangle.h = h + 2 * PROGRESS_STATUS_RECT_PADDING;
 
 	const Image* bg = g_gr->images().get(m_background);
-	rt.blitrect_scale(Rect(0, 0, xres, yres), bg, Rect(0, 0, bg->width(), bg->height()));
+	rt.blitrect_scale(
+	   Rect(0, 0, xres, yres), bg, Rect(0, 0, bg->width(), bg->height()), 1., BlendMode::UseAlpha);
 
 	Rect border_rect = m_label_rectangle;
 	border_rect.x -= PROGRESS_STATUS_BORDER_X;

=== modified file 'src/ui_basic/tabpanel.cc'
--- src/ui_basic/tabpanel.cc	2014-12-04 09:21:33 +0000
+++ src/ui_basic/tabpanel.cc	2014-12-04 09:21:33 +0000
@@ -246,7 +246,9 @@
 		                        picture_width,
 		                        picture_height),
 		                   m_tabs[idx]->pic,
-		                   Rect(0, 0, m_tabs[idx]->pic->width(), m_tabs[idx]->pic->height()));
+		                   Rect(0, 0, m_tabs[idx]->pic->width(), m_tabs[idx]->pic->height()),
+		                   1.,
+		                   BlendMode::UseAlpha);
 
 		// Draw top part of border
 		RGBColor black(0, 0, 0);

=== modified file 'src/ui_fsmenu/base.cc'
--- src/ui_fsmenu/base.cc	2014-12-04 09:21:33 +0000
+++ src/ui_fsmenu/base.cc	2014-12-04 09:21:33 +0000
@@ -66,7 +66,11 @@
 */
 void FullscreenMenuBase::draw(RenderTarget & dst) {
 	const Image* bg = g_gr->images().get(background_image_);
-	dst.blitrect_scale(Rect(0, 0, get_w(), get_h()), bg, Rect(0, 0, bg->width(), bg->height()));
+	dst.blitrect_scale(Rect(0, 0, get_w(), get_h()),
+	                   bg,
+	                   Rect(0, 0, bg->width(), bg->height()),
+	                   1.,
+	                   BlendMode::UseAlpha);
 }
 
 uint32_t FullscreenMenuBase::fs_small() {

=== modified file 'src/ui_fsmenu/editor.h'
--- src/ui_fsmenu/editor.h	2014-12-04 06:35:12 +0000
+++ src/ui_fsmenu/editor.h	2014-12-04 09:21:33 +0000
@@ -33,7 +33,9 @@
 public:
 	FullscreenMenuEditor();
 
-	enum class MenuTarget { kBack = UI::Panel::dying_code, kNewMap, kLoadMap };
+	enum class MenuTarget {
+		kBack = UI::Panel::dying_code, kNewMap, kLoadMap
+	};
 
 private:
 	UI::Textarea title;

=== modified file 'src/ui_fsmenu/loadgame.cc'
--- src/ui_fsmenu/loadgame.cc	2014-12-04 09:21:33 +0000
+++ src/ui_fsmenu/loadgame.cc	2014-12-04 09:21:33 +0000
@@ -34,7 +34,6 @@
 #include "game_io/game_preload_packet.h"
 #include "graphic/graphic.h"
 #include "graphic/image_io.h"
-#include "graphic/image_transformations.h"
 #include "graphic/in_memory_image.h"
 #include "graphic/texture.h"
 #include "helper.h"

=== modified file 'src/wui/buildingwindow.cc'
--- src/wui/buildingwindow.cc	2014-11-30 18:49:38 +0000
+++ src/wui/buildingwindow.cc	2014-12-04 09:21:33 +0000
@@ -24,7 +24,6 @@
 #include "base/macros.h"
 #include "graphic/graphic.h"
 #include "graphic/image.h"
-#include "graphic/image_transformations.h"
 #include "graphic/rendertarget.h"
 #include "logic/constructionsite.h"
 #include "logic/dismantlesite.h"
@@ -117,9 +116,17 @@
 
 	const Animation& anim = g_gr->animations().get_animation(building().get_ui_anim());
 
-	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, BlendMode::UseAlpha, UI::Align_Center);
+	const Image* image =
+	   &anim.representative_image(building().owner().get_playercolor());
+
+	dst.blitrect_scale(Rect((get_inner_w() - image->width()) / 2,
+	                        (get_inner_h() - image->height()) / 2,
+	                        image->width(),
+	                        image->height()),
+	                   image,
+	                   Rect(0, 0, image->width(), image->height()),
+	                   0.5,
+	                   BlendMode::UseAlpha);
 }
 
 /*

=== modified file 'src/wui/fieldaction.cc'
--- src/wui/fieldaction.cc	2014-12-04 09:21:33 +0000
+++ src/wui/fieldaction.cc	2014-12-04 09:21:33 +0000
@@ -25,7 +25,6 @@
 #include "economy/flag.h"
 #include "economy/road.h"
 #include "graphic/graphic.h"
-#include "graphic/image_transformations.h"
 #include "logic/attackable.h"
 #include "logic/cmd_queue.h"
 #include "logic/maphollowregion.h"

=== modified file 'src/wui/waresqueuedisplay.cc'
--- src/wui/waresqueuedisplay.cc	2014-11-22 10:18:20 +0000
+++ src/wui/waresqueuedisplay.cc	2014-12-04 09:21:33 +0000
@@ -24,7 +24,6 @@
 #include "economy/request.h"
 #include "economy/wares_queue.h"
 #include "graphic/graphic.h"
-#include "graphic/image_transformations.h"
 #include "graphic/rendertarget.h"
 #include "logic/player.h"
 #include "wui/interactive_gamebase.h"
@@ -63,7 +62,6 @@
 	set_tooltip(ware.descname().c_str());
 
 	m_icon = ware.icon();
-	m_icon_grey = ImageTransformations::change_luminosity(ImageTransformations::gray_out(m_icon), 0.65, false);
 
 	uint16_t ph = m_max_fill_indicator->height();
 
@@ -143,10 +141,22 @@
 	point.x = Border + (m_show_only ? 0 : CellWidth + CellSpacing);
 	point.y = Border + (m_total_height - 2 * Border - WARE_MENU_PIC_HEIGHT) / 2;
 
-	for (; nr_wares_to_draw; --nr_wares_to_draw, point.x += CellWidth + CellSpacing)
-		dst.blit(point, m_icon);
-	for (; nr_empty_to_draw; --nr_empty_to_draw, point.x += CellWidth + CellSpacing)
-		dst.blit(point, m_icon_grey);
+	for (; nr_wares_to_draw; --nr_wares_to_draw, point.x += CellWidth + CellSpacing) {
+		dst.blitrect_scale(
+				Rect(point.x, point.y, m_icon->width(), m_icon->height()),
+				m_icon,
+				Rect(0, 0, m_icon->width(), m_icon->height()),
+				1.0,
+				BlendMode::UseAlpha);
+	}
+	for (; nr_empty_to_draw; --nr_empty_to_draw, point.x += CellWidth + CellSpacing) {
+		dst.blitrect_scale_gray(
+				Rect(point.x, point.y, m_icon->width(), m_icon->height()),
+				m_icon,
+				Rect(0, 0, m_icon->width(), m_icon->height()),
+				0.5,
+				0.65);
+	}
 
 	if (!m_show_only) {
 		uint16_t pw = m_max_fill_indicator->width();

=== modified file 'src/wui/waresqueuedisplay.h'
--- src/wui/waresqueuedisplay.h	2014-11-22 10:18:20 +0000
+++ src/wui/waresqueuedisplay.h	2014-12-04 09:21:33 +0000
@@ -78,7 +78,6 @@
 	Widelands::WareIndex   m_ware_index;
 	Widelands::WareWorker m_ware_type;
 	const Image* m_icon;            //< Index to ware's picture
-	const Image* m_icon_grey;
 	const Image* m_max_fill_indicator;
 
 


Follow ups