diff options
author | Thorbjørn Lindeijer <thorbjorn@lindeijer.nl> | 2012-01-22 18:31:25 +0100 |
---|---|---|
committer | Thorbjørn Lindeijer <thorbjorn@lindeijer.nl> | 2012-01-24 19:05:14 +0100 |
commit | dd1386684b6430337d3b270bec1ca53fa69f9593 (patch) | |
tree | 68ec0caa9e81af7ebd38f45e4a9fcbf8ed35625c /src/resources | |
parent | 8a4b82e3ed75e426d44b69640f009e1e731c75c4 (diff) | |
download | mana-dd1386684b6430337d3b270bec1ca53fa69f9593.tar.gz mana-dd1386684b6430337d3b270bec1ca53fa69f9593.tar.bz2 mana-dd1386684b6430337d3b270bec1ca53fa69f9593.tar.xz mana-dd1386684b6430337d3b270bec1ca53fa69f9593.zip |
Use SDL_RWops directly on top of PhysFS
This avoids the creation of a temporary buffer containing a complete
file for the sole purpose of wrapping it up in an SDL_RWops.
The necessary wrapper is by Ryan C. Gordon and is included in the
PhysFS repository under 'extras'.
Reviewed-by: Yohann Ferreira
Diffstat (limited to 'src/resources')
-rw-r--r-- | src/resources/image.cpp | 7 | ||||
-rw-r--r-- | src/resources/image.h | 15 | ||||
-rw-r--r-- | src/resources/music.cpp | 5 | ||||
-rw-r--r-- | src/resources/music.h | 5 | ||||
-rw-r--r-- | src/resources/resourcemanager.cpp | 37 | ||||
-rw-r--r-- | src/resources/resourcemanager.h | 4 | ||||
-rw-r--r-- | src/resources/soundeffect.cpp | 5 | ||||
-rw-r--r-- | src/resources/soundeffect.h | 5 |
8 files changed, 31 insertions, 52 deletions
diff --git a/src/resources/image.cpp b/src/resources/image.cpp index 63f1bd2c..7f14a73e 100644 --- a/src/resources/image.cpp +++ b/src/resources/image.cpp @@ -105,10 +105,8 @@ Image::~Image() unload(); } -Resource *Image::load(void *buffer, unsigned bufferSize) +Resource *Image::load(SDL_RWops *rw) { - // Load the raw file data from the buffer in an RWops structure - SDL_RWops *rw = SDL_RWFromMem(buffer, bufferSize); SDL_Surface *tmpImage = IMG_Load_RW(rw, 1); if (!tmpImage) @@ -123,9 +121,8 @@ Resource *Image::load(void *buffer, unsigned bufferSize) return image; } -Resource *Image::load(void *buffer, unsigned bufferSize, Dye const &dye) +Resource *Image::load(SDL_RWops *rw, Dye const &dye) { - SDL_RWops *rw = SDL_RWFromMem(buffer, bufferSize); SDL_Surface *tmpImage = IMG_Load_RW(rw, 1); if (!tmpImage) diff --git a/src/resources/image.h b/src/resources/image.h index 5b361e1a..85db0c17 100644 --- a/src/resources/image.h +++ b/src/resources/image.h @@ -56,28 +56,25 @@ class Image : public Resource virtual ~Image(); /** - * Loads an image from a buffer in memory. + * Loads an image from an SDL_RWops structure. * - * @param buffer The memory buffer containing the image data. - * @param bufferSize The size of the memory buffer in bytes. + * @param rw The SDL_RWops to load the image from. * * @return <code>NULL</code> if an error occurred, a valid pointer * otherwise. */ - static Resource *load(void *buffer, unsigned bufferSize); + static Resource *load(SDL_RWops *rw); /** - * Loads an image from a buffer in memory and recolors it. + * Loads an image from an SDL_RWops structure and recolors it. * - * @param buffer The memory buffer containing the image data. - * @param bufferSize The size of the memory buffer in bytes. + * @param rw The SDL_RWops to load the image from. * @param dye The dye used to recolor the image. * * @return <code>NULL</code> if an error occurred, a valid pointer * otherwise. */ - static Resource *load(void *buffer, unsigned bufferSize, - Dye const &dye); + static Resource *load(SDL_RWops *rw, Dye const &dye); /** * Loads an image from an SDL surface. diff --git a/src/resources/music.cpp b/src/resources/music.cpp index c55bddfe..2154fb5f 100644 --- a/src/resources/music.cpp +++ b/src/resources/music.cpp @@ -35,11 +35,8 @@ Music::~Music() Mix_FreeChunk(mChunk); } -Resource *Music::load(void *buffer, unsigned bufferSize) +Resource *Music::load(SDL_RWops *rw) { - // Load the raw file data from the buffer in an RWops structure - SDL_RWops *rw = SDL_RWFromMem(buffer, bufferSize); - // Use Mix_LoadMUS to load the raw music data //Mix_Music* music = Mix_LoadMUS_RW(rw); Need to be implemeted Mix_Chunk *tmpMusic = Mix_LoadWAV_RW(rw, 1); diff --git a/src/resources/music.h b/src/resources/music.h index 1d040706..6a4cabd5 100644 --- a/src/resources/music.h +++ b/src/resources/music.h @@ -41,13 +41,12 @@ class Music : public Resource /** * Loads a music from a buffer in memory. * - * @param buffer The memory buffer containing the music data. - * @param bufferSize The size of the memory buffer in bytes. + * @param rw The SDL_RWops to load the music data from. * * @return <code>NULL</code> if the an error occurred, a valid pointer * otherwise. */ - static Resource *load(void *buffer, unsigned bufferSize); + static Resource *load(SDL_RWops *rw); /** * Plays the music. diff --git a/src/resources/resourcemanager.cpp b/src/resources/resourcemanager.cpp index 00e4726e..c7e20111 100644 --- a/src/resources/resourcemanager.cpp +++ b/src/resources/resourcemanager.cpp @@ -32,6 +32,7 @@ #include "resources/spritedef.h" #include "utils/zlib.h" +#include "utils/physfsrwops.h" #include <physfs.h> @@ -273,14 +274,14 @@ struct ResourceLoader ResourceManager *manager; std::string path; ResourceManager::loader fun; + static Resource *load(void *v) { ResourceLoader *l = static_cast< ResourceLoader * >(v); - int fileSize; - void *buffer = l->manager->loadFile(l->path, fileSize); - if (!buffer) return NULL; - Resource *res = l->fun(buffer, fileSize); - free(buffer); + SDL_RWops *rw = PHYSFSRWOPS_openRead(l->path.c_str()); + if (!rw) + return NULL; + Resource *res = l->fun(rw); return res; } }; @@ -316,16 +317,14 @@ struct DyedImageLoader d = new Dye(path.substr(p + 1)); path = path.substr(0, p); } - int fileSize; - void *buffer = l->manager->loadFile(path, fileSize); - if (!buffer) + SDL_RWops *rw = PHYSFSRWOPS_openRead(path.c_str()); + if (!rw) { delete d; return NULL; } - Resource *res = d ? Image::load(buffer, fileSize, *d) - : Image::load(buffer, fileSize); - free(buffer); + Resource *res = d ? Image::load(rw, *d) + : Image::load(rw); delete d; return res; } @@ -520,18 +519,10 @@ std::vector<std::string> ResourceManager::loadTextFile( SDL_Surface *ResourceManager::loadSDLSurface(const std::string &filename) { - int fileSize; - void *buffer = loadFile(filename, fileSize); - SDL_Surface *tmp = NULL; - - if (buffer) - { - SDL_RWops *rw = SDL_RWFromMem(buffer, fileSize); - tmp = IMG_Load_RW(rw, 1); - ::free(buffer); - } - - return tmp; + SDL_Surface *surface = 0; + if (SDL_RWops *rw = PHYSFSRWOPS_openRead(filename.c_str())) + surface = IMG_Load_RW(rw, 1); + return surface; } void ResourceManager::scheduleDelete(SDL_Surface* surface) diff --git a/src/resources/resourcemanager.h b/src/resources/resourcemanager.h index 9b40814f..d2b4261e 100644 --- a/src/resources/resourcemanager.h +++ b/src/resources/resourcemanager.h @@ -34,7 +34,9 @@ class Music; class Resource; class SoundEffect; class SpriteDef; + struct SDL_Surface; +struct SDL_RWops; /** * A class for loading and managing resources. @@ -45,7 +47,7 @@ class ResourceManager public: - typedef Resource *(*loader)(void *, unsigned); + typedef Resource *(*loader)(SDL_RWops *); typedef Resource *(*generator)(void *); ResourceManager(); diff --git a/src/resources/soundeffect.cpp b/src/resources/soundeffect.cpp index 1a8f9671..31bb75bf 100644 --- a/src/resources/soundeffect.cpp +++ b/src/resources/soundeffect.cpp @@ -28,11 +28,8 @@ SoundEffect::~SoundEffect() Mix_FreeChunk(mChunk); } -Resource *SoundEffect::load(void *buffer, unsigned bufferSize) +Resource *SoundEffect::load(SDL_RWops *rw) { - // Load the raw file data from the buffer in an RWops structure - SDL_RWops *rw = SDL_RWFromMem(buffer, bufferSize); - // Load the music data and free the RWops structure Mix_Chunk *tmpSoundEffect = Mix_LoadWAV_RW(rw, 1); diff --git a/src/resources/soundeffect.h b/src/resources/soundeffect.h index 5c493678..85265ef5 100644 --- a/src/resources/soundeffect.h +++ b/src/resources/soundeffect.h @@ -41,13 +41,12 @@ class SoundEffect : public Resource /** * Loads a sample from a buffer in memory. * - * @param buffer The memory buffer containing the sample data. - * @param bufferSize The size of the memory buffer in bytes. + * @param rw The SDL_RWops to load the sample data from. * * @return <code>NULL</code> if the an error occurred, a valid pointer * otherwise. */ - static Resource *load(void *buffer, unsigned bufferSize); + static Resource *load(SDL_RWops *rw); /** * Plays the sample. |