diff options
Diffstat (limited to 'src/spriteloader')
-rw-r--r-- | src/spriteloader/grf.cpp | 2 | ||||
-rw-r--r-- | src/spriteloader/png.cpp | 10 | ||||
-rw-r--r-- | src/spriteloader/spriteloader.hpp | 20 |
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; }; /** |