changeset 20552:84a13b4b32ea draft

-Codechange: Introduce an interface for all classes that can do sprite encoding.
author Michael Lutz <michi@icosahedron.de>
date Mon, 24 Jun 2013 21:29:15 +0200
parents f45702e39367
children 18a8867370e9
files src/blitter/base.hpp src/spritecache.cpp src/spriteloader/spriteloader.hpp
diffstat 3 files changed, 17 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/blitter/base.hpp
+++ b/src/blitter/base.hpp
@@ -25,7 +25,7 @@
 /**
  * How all blitters should look like. Extend this class to make your own.
  */
-class Blitter {
+class Blitter : public SpriteEncoder {
 public:
 	/** Parameters related to blitting. */
 	struct BlitterParams {
--- a/src/spritecache.cpp
+++ b/src/spritecache.cpp
@@ -19,6 +19,7 @@
 #include "blitter/factory.hpp"
 #include "core/math_func.hpp"
 #include "core/mem_func.hpp"
+#include "video/video_driver.hpp"
 
 #include "table/sprites.h"
 #include "table/strings.h"
@@ -375,9 +376,10 @@
  * @param id          Sprite number.
  * @param sprite_type Type of sprite.
  * @param allocator   Allocator function to use.
+ * @param encoder     Sprite encoder to use.
  * @return Read sprite data.
  */
-static void *ReadSprite(const SpriteCache *sc, SpriteID id, SpriteType sprite_type, AllocatorProc *allocator)
+static void *ReadSprite(const SpriteCache *sc, SpriteID id, SpriteType sprite_type, AllocatorProc *allocator, SpriteEncoder *encoder)
 {
 	uint8 file_slot = sc->file_slot;
 	size_t file_pos = sc->file_pos;
@@ -441,7 +443,7 @@
 			return (void*)GetRawSprite(SPR_IMG_QUERY, ST_NORMAL, allocator);
 		}
 	}
-	return BlitterFactoryBase::GetCurrentBlitter()->Encode(sprite, allocator);
+	return encoder->Encode(sprite, allocator);
 }
 
 
@@ -836,12 +838,12 @@
 		sc->lru = ++_sprite_lru_counter;
 
 		/* Load the sprite, if it is not loaded, yet */
-		if (sc->ptr == NULL) sc->ptr = ReadSprite(sc, sprite, type, AllocSprite);
+		if (sc->ptr == NULL) sc->ptr = ReadSprite(sc, sprite, type, AllocSprite, BlitterFactoryBase::GetCurrentBlitter());
 
 		return sc->ptr;
 	} else {
 		/* Do not use the spritecache, but a different allocator. */
-		return ReadSprite(sc, sprite, type, allocator);
+		return ReadSprite(sc, sprite, type, allocator, BlitterFactoryBase::GetCurrentBlitter());
 	}
 }
 
--- a/src/spriteloader/spriteloader.hpp
+++ b/src/spriteloader/spriteloader.hpp
@@ -14,6 +14,7 @@
 
 #include "../core/alloc_type.hpp"
 #include "../gfx_type.h"
+#include "../spritecache.h"
 
 /** Interface for the loader of our sprites. */
 class SpriteLoader {
@@ -66,4 +67,13 @@
 	virtual ~SpriteLoader() { }
 };
 
+/** Interface for any class that can encode a raw sprite. */
+class SpriteEncoder {
+public:
+	/**
+	 * Convert a sprite from the loader to our own format.
+	 */
+	virtual Sprite *Encode(SpriteLoader::Sprite *sprite, AllocatorProc *allocator) = 0;
+};
+
 #endif /* SPRITELOADER_HPP */