From 1000addea273296cff5c5eca1afc9713be45c016 Mon Sep 17 00:00:00 2001 From: James Turk Date: Wed, 24 Sep 2003 02:03:18 +0000 Subject: [PATCH] Movement of loading code, and addition of OpenFromZip, removal of PhysFS in light of new zlib based code. --- src/ZE_Utility.cpp | 44 +++++++++++++++- src/ZE_ZEngine.cpp | 123 +++------------------------------------------ src/ZE_ZFont.cpp | 34 +++++++++++-- src/ZE_ZImage.cpp | 40 +++++++++++++-- src/ZE_ZMusic.cpp | 10 ++-- src/ZE_ZSound.cpp | 27 ++++++++-- src/ZE_main.cpp | 5 +- 7 files changed, 152 insertions(+), 131 deletions(-) diff --git a/src/ZE_Utility.cpp b/src/ZE_Utility.cpp index 5ca6b46..9b82d38 100755 --- a/src/ZE_Utility.cpp +++ b/src/ZE_Utility.cpp @@ -13,7 +13,7 @@ \brief Source file for ZEngine utility functions. Source file containing open utilities for use inside and alongside ZEngine. -
$Id: ZE_Utility.cpp,v 1.10 2003/07/12 01:25:42 cozman Exp $
+
$Id: ZE_Utility.cpp,v 1.11 2003/09/24 02:03:18 cozman Exp $
\author James Turk **/ @@ -33,6 +33,48 @@ std::string FormatStr(const char *fmtstr, ...) return buf; } +SDL_RWops* RWFromZip(std::string zipname, std::string filename) +{ + unzFile zip = unzOpen(zipname.c_str()); + unz_file_info info; + void *buffer; + + if(!zip) //failed to open zip + { + //log error + return NULL; + } + + //locate the file and open it (last param means case sensitive comparison) + unzLocateFile(zip,filename.c_str(),0); + if(unzOpenCurrentFile(zip) != UNZ_OK) //failed to open file within zip + { + return NULL; + } + + //find current file info (we are looking for uncompressed file size) + unzGetCurrentFileInfo(zip,&info,NULL,0,NULL,0,NULL,0); + + //create a buffer big enough to hold uncompressed file in memory + buffer = (void*)new char[info.uncompressed_size]; + if(!buffer) + { + unzCloseCurrentFile(zip); + unzClose(zip); + //log error (failed to allocate memory?!) + return NULL; + } + + //load into memory + unzReadCurrentFile(zip, buffer, info.uncompressed_size); + + //close archive + unzCloseCurrentFile(zip); + unzClose(zip); + + return SDL_RWFromMem(buffer, info.uncompressed_size); //return buffer in RW form +} + //Each of the Free*s safely frees & NULLs the pointer void FreeImage(SDL_Surface *&image) { diff --git a/src/ZE_ZEngine.cpp b/src/ZE_ZEngine.cpp index e6ca2ac..38c5af9 100644 --- a/src/ZE_ZEngine.cpp +++ b/src/ZE_ZEngine.cpp @@ -13,7 +13,7 @@ \brief Central source file for ZEngine. Actual implementation of ZEngine singleton class, the core of ZEngine. -
$Id: ZE_ZEngine.cpp,v 1.58 2003/09/21 03:28:53 cozman Exp $
+
$Id: ZE_ZEngine.cpp,v 1.59 2003/09/24 02:03:18 cozman Exp $
\author James Turk **/ @@ -184,7 +184,12 @@ bool ZEngine::CreateDisplay(std::string title, std::string icon) else { SDL_WM_SetCaption(title.c_str(),title.c_str()); - iconImg = LoadImage(icon); + +#ifdef USE_SDL_IMAGE + iconImg = IMG_Load(icon.c_str()); +#else + iconImg = SDL_LoadBMP(icon.c_str()); +#endif SDL_WM_SetIcon(iconImg,NULL); FreeImage(iconImg); } @@ -677,120 +682,6 @@ double ZEngine::RandDouble() return mRandGen.RandDouble(); } -SDL_Surface* ZEngine::LoadImage(std::string filename) -{ - SDL_Surface *image; -//using physfs// -#ifdef USE_PHYSFS - SDL_RWops *rw; - rw = PHYSFSRWOPS_openRead(filename.c_str()); - if(!rw) - { - ReportError(ZERR_LOAD_IMAGE,FormatStr("%s [PhysFS RWops failed: %s]",filename.c_str(),SDL_GetError())); - return NULL; - } -#ifdef USE_SDL_IMAGE - image = IMG_Load_RW(rw,0); -#else - image = SDL_LoadBMP_RW(rw,0); -#endif //USE_SDL_IMAGE - SDL_FreeRW(rw); -//end using physfs// - -//Just SDL// -#else -#ifdef USE_SDL_IMAGE - image = IMG_Load(filename.c_str()); -#else - image = SDL_LoadBMP(filename.c_str()); -#endif //USE_SDL_IMAGE -#endif //USE_PHYSFS - - if(!image) - { - ReportError(ZERR_LOAD_IMAGE,filename); - return NULL; - } - else - return image; -} - -#ifdef USE_SDL_MIXER - -Mix_Chunk* ZEngine::LoadSound(std::string filename) -{ - Mix_Chunk *sound; - -#ifdef USE_PHYSFS - SDL_RWops *rw; - rw = PHYSFSRWOPS_openRead(filename.c_str()); - sound = Mix_LoadWAV_RW(rw,0); - SDL_FreeRW(rw); -#else - sound = Mix_LoadWAV(filename.c_str()); -#endif //USE_PHYSFS - - if(!sound) - { - ReportError(ZERR_LOAD_SOUND,filename); - return NULL; - } - else - return sound; -} - -Mix_Music* ZEngine::LoadMusic(std::string filename) -{ - Mix_Music *music; - -//Currently SDL_Mixer doesn't support Music from a RW -//#ifdef USE_PHYSFS -// SDL_RWops *rw; -// rw = PHYSFSRWOPS_openRead(filename.c_str()); -// mus.music = Mix_LoadMUS_RW(filename.c_str(),0); -// SDL_FreeRW(rw); -//#else - music = Mix_LoadMUS(filename.c_str()); -//#endif //USE_PHYSFS - - if(!music) - { - ReportError(ZERR_LOAD_MUSIC,filename); - return NULL; - } - else - return music; -} - -#endif - -#ifdef USE_SDL_TTF - -TTF_Font* ZEngine::LoadFont(std::string filename, int size) -{ - TTF_Font *font; - -#ifdef USE_PHYSFS - SDL_RWops *rw; - rw = PHYSFSRWOPS_openRead(filename.c_str()); - font = TTF_OpenFontRW(rw,0,size); - SDL_FreeRW(rw); -#else - font = TTF_OpenFont(filename.c_str(),size); -#endif //USE_PHYSFS - - if(!font) - { - ReportError(ZERR_LOAD_FONT,filename); - return NULL; - } - else - return font; -} - - -#endif - int ZEngine::DisplayWidth() { return mWidth; diff --git a/src/ZE_ZFont.cpp b/src/ZE_ZFont.cpp index 49f3a0a..b6eac3f 100644 --- a/src/ZE_ZFont.cpp +++ b/src/ZE_ZFont.cpp @@ -13,7 +13,7 @@ \brief Source file for ZFont. Implementation of ZFont, the basic Font class for ZEngine. -
$Id: ZE_ZFont.cpp,v 1.12 2003/06/11 05:51:16 cozman Exp $
+
$Id: ZE_ZFont.cpp,v 1.13 2003/09/24 02:03:18 cozman Exp $
\author James Turk **/ @@ -49,8 +49,33 @@ ZFont::~ZFont() void ZFont::Open(std::string filename, int size) { Release(); + rFilename = filename; + + rFont = TTF_OpenFont(filename.c_str(),size); + + if(!rFont) + rEngine->ReportError(ZERR_LOAD_FONT,filename); +} + +void ZFont::OpenFromZip(std::string zipname, std::string filename, int size) +{ + SDL_RWops *rw; + + Release(); + rZipname = zipname; rFilename = filename; - rFont = rEngine->LoadFont(filename,size); + + rw = RWFromZip(zipname,filename); + + if(rw) + { + rFont = TTF_OpenFontRW(rw,0,size); + //delete []rw->hidden.mem.base; //must free buffer + //SDL_FreeRW(rw); + } + + if(!rFont) + rEngine->ReportError(ZERR_LOAD_FONT,FormatStr("%s in %s archive",filename.c_str(),zipname.c_str())); } void ZFont::Release() @@ -106,7 +131,10 @@ void ZFont::SetStyle(bool bold, bool italic, bool underline) void ZFont::Resize(int size) { - Open(rFilename,size); + if(rZipname.length()) + OpenFromZip(rZipname,rFilename,size); + else + Open(rFilename,size); } bool ZFont::IsLoaded() const diff --git a/src/ZE_ZImage.cpp b/src/ZE_ZImage.cpp index c7f3fdd..b725d25 100644 --- a/src/ZE_ZImage.cpp +++ b/src/ZE_ZImage.cpp @@ -13,7 +13,7 @@ \brief Source file for ZImage. Implementation of ZImage, the Image class for ZEngine. -
$Id: ZE_ZImage.cpp,v 1.46 2003/09/07 20:59:20 cozman Exp $
+
$Id: ZE_ZImage.cpp,v 1.47 2003/09/24 02:03:18 cozman Exp $
\author James Turk **/ @@ -77,10 +77,42 @@ ZImage::~ZImage() void ZImage::Open(std::string filename) { - SDL_Surface *image; + SDL_Surface *image; + +#ifdef USE_SDL_IMAGE + image = IMG_Load(filename.c_str()); +#else + image = SDL_LoadBMP(filename.c_str()); +#endif //USE_SDL_IMAGE + + if(!image) + rEngine->ReportError(ZERR_LOAD_IMAGE,filename); + else + Attach(image); +} - image = rEngine->LoadImage(filename.c_str()); - Attach(image); +void ZImage::OpenFromZip(std::string zipname, std::string filename) +{ + SDL_Surface *image=NULL; + SDL_RWops *rw; + + rw = RWFromZip(zipname,filename); + + if(rw) + { +#ifdef USE_SDL_IMAGE + image = IMG_Load_RW(rw,0); +#else + image = SDL_LoadBMP_RW(rw,0); +#endif //USE_SDL_IMAGE + delete []rw->hidden.mem.base; //must free buffer + SDL_FreeRW(rw); + } + + if(!image) + rEngine->ReportError(ZERR_LOAD_IMAGE,FormatStr("%s in %s archive",filename.c_str(),zipname.c_str())); + else + Attach(image); } void ZImage::OpenFromImage(SDL_Surface *image, Sint16 x, Sint16 y, Sint16 w, Sint16 h) diff --git a/src/ZE_ZMusic.cpp b/src/ZE_ZMusic.cpp index 5bd4062..c7fbb6a 100644 --- a/src/ZE_ZMusic.cpp +++ b/src/ZE_ZMusic.cpp @@ -13,7 +13,7 @@ \brief Source file for ZMusic. Implementation of ZMusic, the basic Music class for ZEngine. -
$Id: ZE_ZMusic.cpp,v 1.10 2003/06/11 05:51:16 cozman Exp $
+
$Id: ZE_ZMusic.cpp,v 1.11 2003/09/24 02:03:18 cozman Exp $
\author James Turk **/ @@ -47,8 +47,12 @@ ZMusic::~ZMusic() void ZMusic::Open(std::string filename) { - Release(); - rMusic = rEngine->LoadMusic(filename); + Release(); + + rMusic = Mix_LoadMUS(filename.c_str()); + + if(!rMusic) + rEngine->ReportError(ZERR_LOAD_MUSIC,filename); } void ZMusic::Release() diff --git a/src/ZE_ZSound.cpp b/src/ZE_ZSound.cpp index 7f27320..61291c7 100644 --- a/src/ZE_ZSound.cpp +++ b/src/ZE_ZSound.cpp @@ -13,7 +13,7 @@ \brief Source file for ZSound. Implementation of ZSound, the basic Sound class for ZEngine. -
$Id: ZE_ZSound.cpp,v 1.10 2003/06/11 05:51:16 cozman Exp $
+
$Id: ZE_ZSound.cpp,v 1.11 2003/09/24 02:03:18 cozman Exp $
\author James Turk **/ @@ -50,8 +50,29 @@ ZSound::~ZSound() void ZSound::Open(std::string filename) { - Release(); - rSound = rEngine->LoadSound(filename); + Release(); + + rSound = Mix_LoadWAV(filename.c_str()); + + if(!rSound) + rEngine->ReportError(ZERR_LOAD_SOUND,filename); +} + +void ZSound::OpenFromZip(std::string zipname, std::string filename) +{ + SDL_RWops *rw; + + rw = RWFromZip(zipname,filename); + + if(rw) + { + rSound = Mix_LoadWAV_RW(rw,0); + delete []rw->hidden.mem.base; //must free buffer + SDL_FreeRW(rw); + } + + if(!rSound) + rEngine->ReportError(ZERR_LOAD_SOUND,FormatStr("%s in %s archive",filename.c_str(),zipname.c_str())); } void ZSound::Release() diff --git a/src/ZE_main.cpp b/src/ZE_main.cpp index b52f751..90652ec 100755 --- a/src/ZE_main.cpp +++ b/src/ZE_main.cpp @@ -15,10 +15,12 @@ The entry point 'main' defined in this file simply does the initial creation and freeing of ZEngine. An application that defines main overrides this main, so backwards compatibility is not broken, however as of 0.8.5 ZE_main is the expected entry point of ZEngine applications. -
$Id: ZE_main.cpp,v 1.2 2003/09/22 23:49:22 cozman Exp $
+
$Id: ZE_main.cpp,v 1.3 2003/09/24 02:03:18 cozman Exp $
\author James Turk **/ +#ifdef USE_PHYSFS + #include "ZEngine.h" /*! @@ -51,3 +53,4 @@ int main(int argc, char *argv[]) return ret; } +#endif //USE_PHYSFS \ No newline at end of file