From 05b3214cc4af88977e09163ce8e3b6cc7256cebe Mon Sep 17 00:00:00 2001 From: pixel Date: Wed, 25 Dec 2002 02:36:16 +0000 Subject: Added SDL_RWops things --- lib/engine.cc | 70 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 69 insertions(+), 1 deletion(-) (limited to 'lib/engine.cc') 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 #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; +} -- cgit v1.2.3