about summary refs log tree commit diff stats
path: root/src/libtools/sdl2rwops.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/libtools/sdl2rwops.c')
-rw-r--r--src/libtools/sdl2rwops.c70
1 files changed, 64 insertions, 6 deletions
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;