diff options
-rw-r--r-- | include/engine.h | 3 | ||||
-rw-r--r-- | lib/engine.cc | 70 |
2 files changed, 72 insertions, 1 deletions
diff --git a/include/engine.h b/include/engine.h index 7df7e9f..6925b5f 100644 --- a/include/engine.h +++ b/include/engine.h @@ -1,6 +1,8 @@ #ifndef __ENGINE_H__ #define __ENGINE_H__ +#include <SDL.h> +#include <Handle.h> #include <Exceptions.h> namespace mogltk { @@ -8,6 +10,7 @@ namespace mogltk { public: static int setup() throw(GeneralException); static int GetInited(); + static SDL_RWops * RWFromHandle(Handle *) throw (GeneralException); private: static int inited; }; diff --git a/lib/engine.cc b/lib/engine.cc index 6e3f303..bcf5dc0 100644 --- a/lib/engine.cc +++ b/lib/engine.cc @@ -1,4 +1,3 @@ -#include <SDL/SDL.h> #include "engine.h" #define _(x) x @@ -23,3 +22,72 @@ int mogltk::engine::setup() throw(GeneralException) { int mogltk::engine::GetInited() { return inited; } + +class embedRWops : public Base { + public: + embedRWops(Handle *); + ~embedRWops(); + int seek(int, int); + int read(void *, int, int); + int write(const void *, int, int); + private: + Handle * h; +}; + +embedRWops::embedRWops(Handle * ah) : h(new Handle(*ah)) {} + +embedRWops::~embedRWops() { + delete h; +} + +int embedRWops::seek(int offset, int whence) { + return h->seek(offset, whence); +} + +int embedRWops::read(void * ptr, int size, int num) { + return h->read(ptr, size * num); +} + +int embedRWops::write(const void * ptr, int size, int num) { + return h->write(ptr, size * num); +} + +static int embedRWseek(SDL_RWops * context, int offset, int whence) { + if (context->hidden.unknown.data1) + return ((embedRWops *)(context->hidden.unknown.data1))->seek(offset, whence); + return -1; +} + +static int embedRWread(SDL_RWops * context, void * ptr, int size, int num) { + if (context->hidden.unknown.data1) + return ((embedRWops *)(context->hidden.unknown.data1))->read(ptr, size, num); + return -1; +} + +static int embedRWwrite(SDL_RWops * context, const void * ptr, int size, int num) { + if (context->hidden.unknown.data1) + return ((embedRWops *)(context->hidden.unknown.data1))->write(ptr, size, num); + return -1; +} + +static int embedRWclose(SDL_RWops * context) { + if (context->hidden.unknown.data1) { + delete ((embedRWops *)(context->hidden.unknown.data1)); + return 0; + } + return -1; +} + +SDL_RWops * mogltk::engine::RWFromHandle(Handle * h) throw (GeneralException) { + SDL_RWops * r = 0; + if (h) { + if (!(r = SDL_AllocRW())) + throw GeneralException(_("Couldn't allocate memory for SDL_RWops")); + r->hidden.unknown.data1 = (void *) new embedRWops(h); + r->seek = embedRWseek; + r->read = embedRWread; + r->write = embedRWwrite; + r->close = embedRWclose; + } + return r; +} |