diff options
Diffstat (limited to 'src/libtools')
| -rw-r--r-- | src/libtools/sdl1rwops.c | 41 | ||||
| -rw-r--r-- | src/libtools/sdl2align32.c | 156 | ||||
| -rw-r--r-- | src/libtools/sdl2rwops.c | 70 |
3 files changed, 242 insertions, 25 deletions
diff --git a/src/libtools/sdl1rwops.c b/src/libtools/sdl1rwops.c index edb900ce..baf6897b 100644 --- a/src/libtools/sdl1rwops.c +++ b/src/libtools/sdl1rwops.c @@ -55,6 +55,26 @@ typedef struct SDL1_RWops_s { } hidden; } SDL1_RWops_t; +#ifdef BOX32 +#define SUPER() \ + if (box64_is32bits) { \ + GO(seek, iFpii_32) \ + GO(read, iFppii_32) \ + GO(write, iFppii_32) \ + GO(close, iFp_32) \ + } else { \ + GO(seek, iFpii) \ + GO(read, iFppii) \ + GO(write, iFppii) \ + GO(close, iFp) \ + } +#else +#define SUPER() \ + GO(seek, iFpii) \ + GO(read, iFppii) \ + GO(write, iFppii) \ + GO(close, iFp) +#endif EXPORT int32_t my_native_seek(SDL1_RWops_t *context, int32_t offset, int32_t whence) { @@ -142,21 +162,7 @@ SDL1_RWops_t* AddNativeRW(x64emu_t* emu, SDL1_RWops_t* ops) fnc = AddCheckBridge(system, W, my_native_##A, 0, NULL); \ newrw->A = (sdl1_##A)fnc; - #ifdef BOX32 - if(box64_is32bits) - { - GO(seek, iFpii_32) - GO(read, iFppii_32) - GO(write, iFppii_32) - GO(close, iFp_32) - } else - #endif - { - GO(seek, iFpii) - GO(read, iFppii) - GO(write, iFppii) - GO(close, iFp) - } + SUPER() #undef GO @@ -181,10 +187,7 @@ SDL1_RWops_t* RWNativeStart(x64emu_t* emu, SDL1_RWops_t* ops) #define GO(A, W) \ newrw->A = my_emulated_##A; - GO(seek, iFpii) - GO(read, iFppii) - GO(write, iFppii) - GO(close, iFp) + SUPER() #undef GO diff --git a/src/libtools/sdl2align32.c b/src/libtools/sdl2align32.c index dd0b33da..dbef7722 100644 --- a/src/libtools/sdl2align32.c +++ b/src/libtools/sdl2align32.c @@ -140,4 +140,160 @@ void convert_SDL2_Event_to_32(void* dst_, const void* src_) printf_log(LOG_INFO, "Warning, unsuported SDL2 event %d\n", src->type); memcpy(dst, src, sizeof(my_SDL2_Event_32_t)); } +} + +void inplace_SDL2_Palette_to_32(void* a) +{ + if (!a) return; + my_SDL2_Palette_t* src = a; + my_SDL2_Palette_32_t* dst = a; + dst->ncolors = src->ncolors; + dst->colors = to_ptrv(src->colors); + dst->version = src->version; + dst->refcount = src->refcount; +} + +void inplace_SDL2_PixelFormat_to_32(void* a) +{ + while (a) { + my_SDL2_PixelFormat_t* src = a; + my_SDL2_PixelFormat_32_t* dst = a; + dst->format = src->format; + inplace_SDL2_Palette_to_32(src->palette); + dst->palette = to_ptrv(src->palette); + dst->BitsPerPixel = src->BitsPerPixel; + dst->BytesPerPixel = src->BytesPerPixel; + dst->Rmask = src->Rmask; + dst->Gmask = src->Gmask; + dst->Bmask = src->Bmask; + dst->Amask = src->Amask; + dst->Rloss = src->Rloss; + dst->Gloss = src->Gloss; + dst->Bloss = src->Bloss; + dst->Aloss = src->Aloss; + dst->Rshift = src->Rshift; + dst->Gshift = src->Gshift; + dst->Bshift = src->Bshift; + dst->Ashift = src->Ashift; + dst->refcount = src->refcount; + a = (void*)src->next; + dst->next = to_ptrv(src->next); + } +} + +void inplace_SDL2_Surface_to_32(void* a) +{ + if (!a) return; + my_SDL2_Surface_t* src = a; + my_SDL2_Surface_32_t* dst = a; + dst->flags = src->flags; + inplace_SDL2_PixelFormat_to_32(src->format); + dst->format = to_ptrv(src->format); + dst->w = src->w; + dst->h = src->h; + dst->pitch = src->pitch; + dst->pixels = to_ptrv(src->pixels); + dst->userdata = to_ptrv(src->userdata); + dst->locked = src->locked; + dst->list_blitmap = to_ptrv(src->list_blitmap); + dst->clip_rect.x = src->clip_rect.x; + dst->clip_rect.y = src->clip_rect.y; + dst->clip_rect.w = src->clip_rect.w; + dst->clip_rect.h = src->clip_rect.h; + dst->map = to_ptrv(src->map); + dst->refcount = src->refcount; +} + + +void inplace_SDL2_Palette_to_64(void* a) +{ + if (!a) return; + my_SDL2_Palette_32_t* src = a; + my_SDL2_Palette_t* dst = a; + dst->refcount = src->refcount; + dst->version = src->version; + dst->colors = from_ptrv(src->colors); + dst->ncolors = src->ncolors; +} + +void inplace_SDL2_PixelFormat_to_64(void* a) +{ + while (a) { + my_SDL2_PixelFormat_32_t* src = a; + my_SDL2_PixelFormat_t* dst = a; + uintptr_t p = (uintptr_t)(src->next); + a = (void*)p; + dst->next = from_ptrv(src->next); + dst->refcount = src->refcount; + dst->Ashift = src->Ashift; + dst->Bshift = src->Bshift; + dst->Gshift = src->Gshift; + dst->Rshift = src->Rshift; + dst->Aloss = src->Aloss; + dst->Bloss = src->Bloss; + dst->Gloss = src->Gloss; + dst->Rloss = src->Rloss; + dst->Amask = src->Amask; + dst->Bmask = src->Bmask; + dst->Gmask = src->Gmask; + dst->Rmask = src->Rmask; + dst->BytesPerPixel = src->BytesPerPixel; + dst->BitsPerPixel = src->BitsPerPixel; + p = (uintptr_t)(src->palette); + inplace_SDL2_Palette_to_64((void*)p); + dst->palette = from_ptrv(src->palette); + dst->format = src->format; + } +} + +void inplace_SDL2_Surface_to_64(void* a) +{ + if (!a) return; + my_SDL2_Surface_32_t* src = a; + my_SDL2_Surface_t* dst = a; + dst->refcount = src->refcount; + dst->map = from_ptrv(src->map); + dst->clip_rect.h = src->clip_rect.h; + dst->clip_rect.w = src->clip_rect.w; + dst->clip_rect.y = src->clip_rect.y; + dst->clip_rect.x = src->clip_rect.x; + dst->list_blitmap = from_ptrv(src->list_blitmap); + dst->locked = src->locked; + dst->userdata = from_ptrv(src->userdata); + dst->pixels = from_ptrv(src->pixels); + dst->pitch = src->pitch; + dst->h = src->h; + dst->w = src->w; + uintptr_t p = (uintptr_t)(src->format); + inplace_SDL2_PixelFormat_to_64((void*)p); + dst->format = from_ptrv(src->format); + dst->flags = src->flags; +} + +void inplace_SDL2_RWops_to_32(void* a) +{ + if (!a) return; + my_SDL2_RWops_t* src = a; + my_SDL2_RWops_32_t* dst = a; + dst->size = to_ptrv(src->size); + dst->seek = to_ptrv(src->seek); + dst->read = to_ptrv(src->read); + dst->write = to_ptrv(src->write); + dst->close = to_ptrv(src->close); + dst->type = src->type; + memmove(&dst->hidden, &src->hidden, sizeof(dst->hidden)); +} + +void inplace_SDL2_RWops_to_64(void* a) +{ + if(!a) return; + my_SDL2_RWops_32_t* src = a; + my_SDL2_RWops_t* dst = a; + memmove(&dst->hidden, &src->hidden, sizeof(dst->hidden)); + dst->type = src->type; + dst->close = from_ptrv(src->close); + dst->write = from_ptrv(src->write); + dst->read = from_ptrv(src->read); + dst->seek = from_ptrv(src->seek); + dst->size = from_ptrv(src->size); } \ No newline at end of file diff --git a/src/libtools/sdl2rwops.c b/src/libtools/sdl2rwops.c index 2f11a202..d7d2f34c 100644 --- a/src/libtools/sdl2rwops.c +++ b/src/libtools/sdl2rwops.c @@ -6,6 +6,10 @@ #include "sdl2rwops.h" #include "debug.h" #include "wrapper.h" +#ifdef BOX32 +#include "wrapper32.h" +#include "sdl2align32.h" +#endif #include "box64context.h" #include "x64run.h" #include "x64emu.h" @@ -54,31 +58,85 @@ typedef struct SDL2_RWops_s { } hidden; } SDL2_RWops_t; -#define SUPER() \ - GO(size, IFp) \ - GO(seek, IFpIi) \ - GO(read, iFppii) \ - GO(write, iFppii) \ - GO(close, iFp) +#ifdef BOX32 +#define SUPER() \ + if (box64_is32bits) { \ + GO(size, IFp_32) \ + GO(seek, IFpIi_32) \ + GO(read, iFppii_32) \ + GO(write, iFppii_32) \ + GO(close, iFp_32) \ + } else { \ + GO(size, IFp) \ + GO(seek, IFpIi) \ + GO(read, iFppii) \ + GO(write, iFppii) \ + GO(close, iFp) \ + } +#else +#define SUPER() \ + GO(size, IFp) \ + GO(seek, IFpIi) \ + GO(read, iFppii) \ + GO(write, iFppii) \ + GO(close, iFp) +#endif EXPORT int64_t my2_native_size(SDL2_RWops_t *context) { + #ifdef BOX32 + if(box64_is32bits) { + inplace_SDL2_RWops_to_64(context); + int ret = context->hidden.my.orig->size(context->hidden.my.orig); + inplace_SDL2_RWops_to_32(context); + return ret; + } + #endif return context->hidden.my.orig->size(context->hidden.my.orig); } EXPORT int64_t my2_native_seek(SDL2_RWops_t *context, int64_t offset, int32_t whence) { + #ifdef BOX32 + if(box64_is32bits) { + inplace_SDL2_RWops_to_64(context); + int ret = context->hidden.my.orig->seek(context->hidden.my.orig, offset, whence); + inplace_SDL2_RWops_to_32(context); + return ret; + } + #endif return context->hidden.my.orig->seek(context->hidden.my.orig, offset, whence); } EXPORT size_t my2_native_read(SDL2_RWops_t *context, void *ptr, size_t size, size_t maxnum) { + #ifdef BOX32 + if(box64_is32bits) { + inplace_SDL2_RWops_to_64(context); + int ret = context->hidden.my.orig->read(context->hidden.my.orig, ptr, size, maxnum); + inplace_SDL2_RWops_to_32(context); + return ret; + } + #endif return context->hidden.my.orig->read(context->hidden.my.orig, ptr, size, maxnum); } EXPORT size_t my2_native_write(SDL2_RWops_t *context, const void *ptr, size_t size, size_t num) { + #ifdef BOX32 + if(box64_is32bits) { + inplace_SDL2_RWops_to_64(context); + int ret = context->hidden.my.orig->write(context->hidden.my.orig, ptr, size, num); + inplace_SDL2_RWops_to_32(context); + return ret; + } + #endif return context->hidden.my.orig->write(context->hidden.my.orig, ptr, size, num); } EXPORT int32_t my2_native_close(SDL2_RWops_t *context) { + #ifdef BOX32 + if(box64_is32bits) { + inplace_SDL2_RWops_to_64(context); + } + #endif int32_t ret = context->hidden.my.orig->close(context->hidden.my.orig); context->hidden.my.custom_free(context); return ret; |