about summary refs log tree commit diff stats
path: root/src/libtools
diff options
context:
space:
mode:
Diffstat (limited to 'src/libtools')
-rw-r--r--src/libtools/sdl1rwops.c41
-rw-r--r--src/libtools/sdl2align32.c156
-rw-r--r--src/libtools/sdl2rwops.c70
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;