summaryrefslogtreecommitdiff
path: root/src/spriteloader
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2009-02-23 10:50:25 +0000
committerrubidium <rubidium@openttd.org>2009-02-23 10:50:25 +0000
commit0c1b8ea602de72a96573b7e3301589e8e3249ca1 (patch)
treeb1be264cf851bf2b8888a29947b37d3f5539933a /src/spriteloader
parent2433ba042b2e39b0306a04056136a18ca1323136 (diff)
downloadopenttd-0c1b8ea602de72a96573b7e3301589e8e3249ca1.tar.xz
(svn r15555) -Codechange: remove the mallocs + frees for temporary data from loading sprites.
Diffstat (limited to 'src/spriteloader')
-rw-r--r--src/spriteloader/grf.cpp2
-rw-r--r--src/spriteloader/png.cpp10
-rw-r--r--src/spriteloader/spriteloader.hpp20
3 files changed, 23 insertions, 9 deletions
diff --git a/src/spriteloader/grf.cpp b/src/spriteloader/grf.cpp
index b4f51eda9..cd034ee73 100644
--- a/src/spriteloader/grf.cpp
+++ b/src/spriteloader/grf.cpp
@@ -86,7 +86,7 @@ bool SpriteLoaderGrf::LoadSprite(SpriteLoader::Sprite *sprite, uint8 file_slot,
if (num != 0) return WarnCorruptSprite(file_slot, file_pos, __LINE__);
- sprite->data = CallocT<SpriteLoader::CommonPixel>(sprite->width * sprite->height);
+ sprite->AllocateData(sprite->width * sprite->height);
/* When there are transparency pixels, this format has an other trick.. decode it */
if (type & 0x08) {
diff --git a/src/spriteloader/png.cpp b/src/spriteloader/png.cpp
index d6648b6be..f99237d92 100644
--- a/src/spriteloader/png.cpp
+++ b/src/spriteloader/png.cpp
@@ -51,7 +51,6 @@ static bool LoadPNG(SpriteLoader::Sprite *sprite, const char *filename, uint32 i
png_infop info_ptr, end_info;
uint bit_depth, colour_type;
uint i, pixelsize;
- png_bytep row_pointer;
SpriteLoader::CommonPixel *dst;
if (!OpenPNGFile(filename, id, mask)) return mask; // If mask is true, and file not found, continue true anyway, as it isn't a show-stopper
@@ -102,7 +101,7 @@ static bool LoadPNG(SpriteLoader::Sprite *sprite, const char *filename, uint32 i
sprite->height = info_ptr->height;
sprite->width = info_ptr->width;
- sprite->data = CallocT<SpriteLoader::CommonPixel>(sprite->width * sprite->height);
+ sprite->AllocateData(sprite->width * sprite->height);
}
bit_depth = png_get_bit_depth(png_ptr, info_ptr);
@@ -134,11 +133,7 @@ static bool LoadPNG(SpriteLoader::Sprite *sprite, const char *filename, uint32 i
pixelsize = sizeof(uint8);
}
- row_pointer = (png_byte *)MallocT<byte>(info_ptr->width * pixelsize);
- if (row_pointer == NULL) {
- png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
- return false;
- }
+ png_bytep row_pointer = AllocaM(png_byte, info_ptr->width * pixelsize);
for (i = 0; i < info_ptr->height; i++) {
png_read_row(png_ptr, row_pointer, NULL);
@@ -164,7 +159,6 @@ static bool LoadPNG(SpriteLoader::Sprite *sprite, const char *filename, uint32 i
}
}
- free(row_pointer);
png_destroy_read_struct(&png_ptr, &info_ptr, &end_info);
return true;
diff --git a/src/spriteloader/spriteloader.hpp b/src/spriteloader/spriteloader.hpp
index 34e668e22..9b431fb4f 100644
--- a/src/spriteloader/spriteloader.hpp
+++ b/src/spriteloader/spriteloader.hpp
@@ -15,12 +15,32 @@ public:
uint8 m; ///< Remap-channel
};
+ /**
+ * Structure for passing information from the sprite loader to the blitter.
+ * You can only use this struct once at a time when using AllocateData to
+ * allocate the memory as that will always return the same memory address.
+ * This to prevent thousands of malloc + frees just to load a sprite.
+ */
struct Sprite {
+ Sprite() : data(NULL) {}
+ ~Sprite() { assert(this->data == NULL || this->data == Sprite::mem); }
+
uint16 height; ///< Height of the sprite
uint16 width; ///< Width of the sprite
int16 x_offs; ///< The x-offset of where the sprite will be drawn
int16 y_offs; ///< The y-offset of where the sprite will be drawn
SpriteLoader::CommonPixel *data; ///< The sprite itself
+
+ /**
+ * Allocate the sprite data of this sprite.
+ * @param size the minimum size of the data field.
+ */
+ void AllocateData(size_t size);
+ private:
+ /** Allocated memory to pass sprite data around */
+ static SpriteLoader::CommonPixel *mem;
+ /** Size (in items) of the above memory. */
+ static size_t size;
};
/**