#include "engine.h" #define _(x) x int mogltk::engine::inited = 0; int mogltk::engine::setup() throw(GeneralException) { if (inited) { printm(M_WARNING, "mogltk::engine::startup() called twice, ignoring second call.\n"); return -1; } if (SDL_Init(0) < 0) { throw GeneralException(_("Unable to start SDL base system")); } atexit(SDL_Quit); inited = 1; return 0; } int mogltk::engine::GetInited() { return inited; } class embedRWops : public Base { public: embedRWops(Handle *); int seek(int, int); int read(void *, int, int); int write(const void *, int, int); private: Handle * h; }; embedRWops::embedRWops(Handle * ah) : h(ah) {} 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)); context->hidden.unknown.data1 = 0; 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; }