← Back to team overview

widelands-dev team mailing list archive

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

 

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

Requested reviews:
  Widelands Developers (widelands-dev)

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

InMemoryImage and FromDiskImage are now the same thing, only richtext images are
special in any kind of way.


-- 
This is only a tiny cleanup, but I think it is useful and should go in. I need to experiment with the future direction I want to go, so I push this now for review. 
-- 
Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/remove_in_memory_image 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-12-04 09:00:20 +0000
+++ src/editor/ui_menus/editor_tool_set_terrain_options_menu.cc	2014-12-07 16:02:24 +0000
@@ -145,7 +145,7 @@
 		}
 
 		// Make sure we delete this later on.
-		offscreen_images->emplace_back(new_in_memory_image("dummy_hash", texture));
+		offscreen_images->emplace_back(new_in_memory_image(texture));
 		break;
 	}
 	/** TRANSLATORS: %1% = terrain name, %2% = list of terrain types  */

=== modified file 'src/graphic/animation.cc'
--- src/graphic/animation.cc	2014-12-07 16:02:23 +0000
+++ src/graphic/animation.cc	2014-12-07 16:02:24 +0000
@@ -127,6 +127,7 @@
 	uint32_t frametime() const override;
 	const Point& hotspot() const override;
 	const Image& representative_image_from_disk() const override;
+	const std::string& representative_image_from_disk_filename() const override;
 	virtual void blit(uint32_t time, const Point&, const Rect& srcrc, const RGBColor* clr, Surface*)
 	   const override;
 	void trigger_soundfx(uint32_t framenumber, uint32_t stereo_position) const override;
@@ -302,6 +303,10 @@
 	return *frames_[0];
 }
 
+const std::string& NonPackedAnimation::representative_image_from_disk_filename() const {
+	return image_files_[0];
+}
+
 void NonPackedAnimation::trigger_soundfx(uint32_t time, uint32_t stereo_position) const {
 	if (sound_effect_.empty()) {
 		return;

=== modified file 'src/graphic/animation.h'
--- src/graphic/animation.h	2014-12-07 16:02:23 +0000
+++ src/graphic/animation.h	2014-12-07 16:02:24 +0000
@@ -72,6 +72,7 @@
 	// a clutch needed to make sure that messages can always be displayed, even
 	// no image processing has taken place before.
 	virtual const Image& representative_image_from_disk() const = 0;
+	virtual const std::string& representative_image_from_disk_filename() const = 0;
 
 	/// Blit the animation frame that should be displayed at the given time index
 	/// so that the given point is at the top left of the frame. Srcrc defines

=== modified file 'src/graphic/font_handler.cc'
--- src/graphic/font_handler.cc	2014-11-24 07:10:03 +0000
+++ src/graphic/font_handler.cc	2014-12-07 16:02:24 +0000
@@ -22,6 +22,7 @@
 #include "graphic/font_handler.h"
 
 #include <list>
+#include <memory>
 
 #include <SDL_ttf.h>
 #include <boost/algorithm/string.hpp>
@@ -73,7 +74,7 @@
 	/*@}*/
 
 	/*@{*/
-	const Image* image;
+	std::unique_ptr<const Image> image;
 	uint32_t width;
 	uint32_t height;
 	/*@}*/
@@ -93,7 +94,6 @@
 
 	~Data() {
 		while (!linecache.empty()) {
-			delete linecache.back().image;
 			linecache.pop_back();
 		}
 	}
@@ -161,7 +161,6 @@
 	render_line(*it);
 
 	while (linecache.size() > MaxLineCacheSize) {
-		delete linecache.back().image;
 		linecache.pop_back();
 	}
 
@@ -197,7 +196,7 @@
 		return;
 	}
 
-	lce.image = new_in_memory_image("dummy_hash", new Texture(text_surface));
+	lce.image = new_in_memory_image(new Texture(text_surface));
 	lce.width = lce.image->width();
 	lce.height = lce.image->height();
 }
@@ -221,7 +220,7 @@
 	UI::correct_for_align(align, lce.width + 2 * LINE_MARGIN, lce.height, &dstpoint);
 
 	if (lce.image)
-		dst.blit(Point(dstpoint.x + LINE_MARGIN, dstpoint.y), lce.image);
+		dst.blit(Point(dstpoint.x + LINE_MARGIN, dstpoint.y), lce.image.get());
 
 	if (caret <= copytext.size())
 		draw_caret(dst, style, dstpoint, copytext, caret);
@@ -239,7 +238,7 @@
 	const LineCacheEntry & lce = d->get_line(style, text);
 
 	if (lce.image)
-		dst.blit(dstpoint, lce.image);
+		dst.blit(dstpoint, lce.image.get());
 
 	return lce.width;
 }

=== modified file 'src/graphic/font_handler1.cc'
--- src/graphic/font_handler1.cc	2014-11-24 07:12:35 +0000
+++ src/graphic/font_handler1.cc	2014-12-07 16:02:24 +0000
@@ -57,7 +57,6 @@
 	// Implements Image.
 	uint16_t width() const override {return texture()->width();}
 	uint16_t height() const override {return texture()->height();}
-	const string& hash() const override {return hash_;}
 	Texture* texture() const override {
 		Texture* surf = texture_cache_->get(hash_);
 		if (surf)
@@ -100,7 +99,7 @@
 		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());
+		return image_cache_->insert(hash, std::move(image));
 	}
 
 private:

=== modified file 'src/graphic/gl/road_program.cc'
--- src/graphic/gl/road_program.cc	2014-11-24 07:10:03 +0000
+++ src/graphic/gl/road_program.cc	2014-12-07 16:02:24 +0000
@@ -87,8 +87,8 @@
 	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"));
+	normal_road_texture_ = load_image("world/pics/roadt_normal.png");
+	busy_road_texture_ = load_image("world/pics/roadt_busy.png");
 }
 
 RoadProgram::~RoadProgram() {

=== modified file 'src/graphic/graphic.cc'
--- src/graphic/graphic.cc	2014-12-07 16:02:23 +0000
+++ src/graphic/graphic.cc	2014-12-07 16:02:24 +0000
@@ -67,7 +67,7 @@
      m_window_mode_height(window_mode_h),
      m_update(true),
      texture_cache_(create_texture_cache(TRANSIENT_TEXTURE_CACHE_SIZE)),
-     image_cache_(new ImageCache(texture_cache_.get())),
+     image_cache_(new ImageCache()),
      animation_manager_(new AnimationManager())
 {
 	// Request an OpenGL 2 context with double buffering.

=== modified file 'src/graphic/image.h'
--- src/graphic/image.h	2014-11-24 07:10:03 +0000
+++ src/graphic/image.h	2014-12-07 16:02:24 +0000
@@ -39,11 +39,9 @@
 
 	virtual uint16_t width() const = 0;
 	virtual uint16_t height() const = 0;
-
-	// Internal functions needed for caching.
 	virtual Texture* texture() const = 0;
-	virtual const std::string& hash() const = 0;
 
+private:
 	DISALLOW_COPY_AND_ASSIGN(Image);
 };
 

=== modified file 'src/graphic/image_cache.cc'
--- src/graphic/image_cache.cc	2014-11-24 07:10:03 +0000
+++ src/graphic/image_cache.cc	2014-12-07 16:02:24 +0000
@@ -20,78 +20,37 @@
 #include "graphic/image_cache.h"
 
 #include <cassert>
+#include <memory>
 #include <string>
 
 #include "base/log.h"
 #include "graphic/image.h"
 #include "graphic/image_io.h"
+#include "graphic/in_memory_image.h"
 #include "graphic/texture.h"
-#include "graphic/texture_cache.h"
-
-namespace  {
-
-// Image Implementation that loads images from disc when they should be drawn.
-// Uses TextureCache. These images are meant to be cached in ImageCache.
-class FromDiskImage : public Image {
-public:
-	FromDiskImage(const std::string& filename, TextureCache* texture_cache) :
-		filename_(filename),
-		texture_cache_(texture_cache) {
-			Texture* texture = reload_image_();
-			w_ = texture->width();
-			h_ = texture->height();
-		}
-	virtual ~FromDiskImage() {}
-
-	// Implements Image.
-	uint16_t width() const override {return w_; }
-	uint16_t height() const override {return h_;}
-	const std::string& hash() const override {return filename_;}
-	Texture* texture() const override {
-		Texture* texture = texture_cache_->get(filename_);
-		if (texture)
-			return texture;
-		return reload_image_();
-	}
-
-private:
-	Texture* reload_image_() const {
-		Texture* texture = texture_cache_->insert(filename_, load_image(filename_), false);
-		return texture;
-	}
-	uint16_t w_, h_;
-	const std::string filename_;
-
-	TextureCache* const texture_cache_;  // Not owned.
-};
-
-}  // namespace
-
-ImageCache::ImageCache(TextureCache* const texture_cache) : texture_cache_(texture_cache) {
+
+ImageCache::ImageCache() {
 }
 
 ImageCache::~ImageCache() {
-	for (ImageMap::value_type& p : images_) {
-		delete p.second;
-	}
-	images_.clear();
 }
 
 bool ImageCache::has(const std::string& hash) const {
 	return images_.count(hash);
 }
 
-const Image* ImageCache::insert(const Image* image) {
-	assert(!has(image->hash()));
-	images_.insert(make_pair(image->hash(), image));
-	return image;
+const Image* ImageCache::insert(const std::string& hash, std::unique_ptr<const Image> image) {
+	assert(!has(hash));
+	const Image* return_value = image.get();
+	images_.insert(make_pair(hash, std::move(image)));
+	return return_value;
 }
 
 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, texture_cache_)));
+		images_.insert(make_pair(hash, new_in_memory_image(load_image(hash).release())));
 		return get(hash);
 	}
-	return it->second;
+	return it->second.get();
 }

=== modified file 'src/graphic/image_cache.h'
--- src/graphic/image_cache.h	2014-11-24 07:10:03 +0000
+++ src/graphic/image_cache.h	2014-12-07 16:02:24 +0000
@@ -20,16 +20,15 @@
 #ifndef WL_GRAPHIC_IMAGE_CACHE_H
 #define WL_GRAPHIC_IMAGE_CACHE_H
 
+#include <map>
+#include <memory>
 #include <string>
-#include <map>
 
 #include <boost/utility.hpp>
 
 #include "base/macros.h"
 #include "graphic/image.h"
 
-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
 // the one that keeps ownership of all Images to ensure that this is true. Also
@@ -39,14 +38,12 @@
 // releasing their ownership.
 class ImageCache {
 public:
-	// Does not take ownership.
-	ImageCache(TextureCache* texture_cache);
+	ImageCache();
 	~ImageCache();
 
-	// Insert the given Image into the cache. The hash is defined by Image's hash()
-	// function. Ownership of the Image is taken. Will return a pointer to the freshly inserted
-	// image for convenience.
-	const Image* insert(const Image*);
+	// Insert the given Image into the cache.
+	// Will return a pointer to the freshly inserted image for convenience.
+	const Image* insert(const std::string& hash, std::unique_ptr<const Image> image);
 
 	// Returns the image associated with the given hash. If no image by this
 	// hash is known, it will try to load one from disk with the filename =
@@ -57,10 +54,9 @@
 	bool has(const std::string& hash) const;
 
 private:
-	using ImageMap = std::map<std::string, const Image*>;
+	using ImageMap = std::map<std::string, std::unique_ptr<const Image>>;
 
 	ImageMap images_;  /// hash of cached filename/image pairs
-	TextureCache* const texture_cache_;  // Not owned.
 
 	DISALLOW_COPY_AND_ASSIGN(ImageCache);
 };

=== modified file 'src/graphic/image_io.cc'
--- src/graphic/image_io.cc	2014-12-03 07:39:19 +0000
+++ src/graphic/image_io.cc	2014-12-07 16:02:24 +0000
@@ -56,8 +56,8 @@
 
 }  // namespace
 
-Texture* load_image(const std::string& fname, FileSystem* fs) {
-	return new Texture(load_image_as_sdl_surface(fname, fs));
+std::unique_ptr<Texture> load_image(const std::string& fname, FileSystem* fs) {
+	return std::unique_ptr<Texture>(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-11-30 09:17:50 +0000
+++ src/graphic/image_io.h	2014-12-07 16:02:24 +0000
@@ -20,6 +20,7 @@
 #ifndef WL_GRAPHIC_IMAGE_IO_H
 #define WL_GRAPHIC_IMAGE_IO_H
 
+#include <memory>
 #include <string>
 
 #include "base/wexception.h"
@@ -45,7 +46,7 @@
 };
 
 /// Loads the image 'fn' from 'fs'.
-Texture* load_image(const std::string& fn, FileSystem* fs = nullptr);
+std::unique_ptr<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);

=== modified file 'src/graphic/in_memory_image.cc'
--- src/graphic/in_memory_image.cc	2014-12-07 10:31:12 +0000
+++ src/graphic/in_memory_image.cc	2014-12-07 16:02:24 +0000
@@ -38,24 +38,25 @@
 // or prepare for core dumps.
 class InMemoryImage : public Image {
 public:
+<<<<<<< TREE
 	InMemoryImage(const string& ghash, Texture* init_texture) :
 		hash_(ghash), texture_(init_texture) {}
+=======
+	InMemoryImage(Texture* texture) :
+		texture_(texture) {}
+>>>>>>> MERGE-SOURCE
 	virtual ~InMemoryImage() {
 	}
 
 	// Implements Image.
 	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_;}
 	Texture* texture() const override {return texture_.get();}
 
 private:
-	const string hash_;
 	std::unique_ptr<Texture> texture_;
 };
 
-const Image* new_in_memory_image(const string& hash, Texture* texture) {
-	return new InMemoryImage(hash, texture);
+std::unique_ptr<const Image> new_in_memory_image(Texture* texture) {
+	return std::unique_ptr<const Image>(new InMemoryImage(texture));
 }

=== modified file 'src/graphic/in_memory_image.h'
--- src/graphic/in_memory_image.h	2014-11-24 07:10:03 +0000
+++ src/graphic/in_memory_image.h	2014-12-07 16:02:24 +0000
@@ -20,11 +20,11 @@
 #ifndef WL_GRAPHIC_IN_MEMORY_IMAGE_H
 #define WL_GRAPHIC_IN_MEMORY_IMAGE_H
 
-#include <string>
+#include <memory>
 
 class Texture;
 class Image;
 
-const Image* new_in_memory_image(const std::string& hash, Texture* texture);
+std::unique_ptr<const Image> new_in_memory_image(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-11-27 21:29:21 +0000
+++ src/graphic/minimap_renderer.cc	2014-12-07 16:02:24 +0000
@@ -308,7 +308,7 @@
 
 	// Render minimap
 	std::unique_ptr<Texture> texture(draw_minimap(egbase, player, viewpoint, layers));
-	std::unique_ptr<const Image> image(new_in_memory_image("minimap", texture.release()));
+	std::unique_ptr<const Image> image(new_in_memory_image(texture.release()));
 	g_gr->save_png(image.get(), streamwrite);
 	image.reset();
 }

=== modified file 'src/graphic/surface.h'
--- src/graphic/surface.h	2014-12-07 16:02:23 +0000
+++ src/graphic/surface.h	2014-12-07 16:02:24 +0000
@@ -33,7 +33,7 @@
  * Interface to a basic surfaces that can be used as destination for blitting and drawing.
  * It also allows low level pixel access.
  */
-class Surface  {
+class Surface {
 public:
 	Surface() = default;
 	virtual ~Surface() {}

=== modified file 'src/logic/building.cc'
--- src/logic/building.cc	2014-11-30 18:49:38 +0000
+++ src/logic/building.cc	2014-12-07 16:02:24 +0000
@@ -889,7 +889,7 @@
 	// animations of buildings so that the messages can still be displayed, even
 	// after reload.
 	const std::string& img = g_gr->animations().get_animation
-		(get_ui_anim()).representative_image_from_disk().hash();
+		(get_ui_anim()).representative_image_from_disk_filename();
 	std::string rt_description;
 	rt_description.reserve
 		(strlen("<rt image=") + img.size() + 1 +

=== modified file 'src/map_io/map_extradata_packet.cc'
--- src/map_io/map_extradata_packet.cc	2014-12-01 06:19:03 +0000
+++ src/map_io/map_extradata_packet.cc	2014-12-07 16:02:24 +0000
@@ -59,7 +59,8 @@
 					const std::string hash = std::string("map:") + FileSystem::fs_filename(pname->c_str());
 					const Image* image = nullptr;
 					if (!g_gr->images().has(hash)) {
-						image = g_gr->images().insert(new_in_memory_image(hash, load_image(*pname, &fs)));
+						image = g_gr->images().insert(
+						   hash, new_in_memory_image(load_image(*pname, &fs).release()));
 					} else {
 						image = g_gr->images().get(hash);
 					}

=== modified file 'src/scripting/lua_map.cc'
--- src/scripting/lua_map.cc	2014-12-03 20:13:44 +0000
+++ src/scripting/lua_map.cc	2014-12-07 16:02:24 +0000
@@ -1097,8 +1097,7 @@
 */
 int LuaMapObjectDescription::get_representative_image(lua_State * L) {
 	const std::string& filepath = g_gr->animations().get_animation
-		(get()->get_animation("idle")).representative_image_from_disk().hash();
-
+		(get()->get_animation("idle")).representative_image_from_disk_filename();
 	lua_pushstring(L, filepath);
 	return 1;
 }

=== modified file 'src/ui_fsmenu/loadgame.cc'
--- src/ui_fsmenu/loadgame.cc	2014-12-04 09:18:03 +0000
+++ src/ui_fsmenu/loadgame.cc	2014-12-07 16:02:24 +0000
@@ -321,8 +321,7 @@
 									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),
-																			texture.release()));
+					m_minimap_image = new_in_memory_image(texture.release());
 
 					// Scale it
 					double scale = double(m_minimap_w) / m_minimap_image->width();

=== modified file 'src/wui/minimap.cc'
--- src/wui/minimap.cc	2014-11-30 18:49:38 +0000
+++ src/wui/minimap.cc	2014-12-07 16:02:24 +0000
@@ -71,7 +71,7 @@
 	                   Point((m_viewx - get_w() / 2), (m_viewy - get_h() / 2)),
 	                *m_flags | MiniMapLayer::ViewWindow));
 	// Give ownership of the texture to the new image
-	std::unique_ptr<const Image> im(new_in_memory_image("minimap", texture.release()));
+	std::unique_ptr<const Image> im(new_in_memory_image(texture.release()));
 	dst.blit(Point(), im.get());
 	im.reset();
 }


Follow ups