about summary refs log tree commit diff stats
path: root/src/libtools
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-09-24 14:13:33 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-09-24 14:13:45 +0200
commit4299e0a3a3b0eba117ad83c8504cec7d8c0a64ce (patch)
treedef202c91541ad69d2651072dec238341bf0ccd9 /src/libtools
parentc4af15c2e210a91a30c974901468650533918d39 (diff)
downloadbox64-4299e0a3a3b0eba117ad83c8504cec7d8c0a64ce.tar.gz
box64-4299e0a3a3b0eba117ad83c8504cec7d8c0a64ce.zip
[BOX32][WRAPPER] Added more 32bits wrapped functions
Diffstat (limited to 'src/libtools')
-rw-r--r--src/libtools/sdl1align32.c113
-rw-r--r--src/libtools/sdl1rwops.c52
2 files changed, 161 insertions, 4 deletions
diff --git a/src/libtools/sdl1align32.c b/src/libtools/sdl1align32.c
index cb0b8176..c9c68a8a 100644
--- a/src/libtools/sdl1align32.c
+++ b/src/libtools/sdl1align32.c
@@ -170,6 +170,84 @@ void convert_SDL_Event_to_32(void* dst_, const void* src_)
             memcpy(dst, src, sizeof(my_SDL_Event_32_t));
     }
 }
+void convert_SDL_Event_to_64(void* dst_, const void* src_)
+{
+    if(!src_|| !dst_) return;
+    const my_SDL_Event_32_t *src = src_;
+    my_SDL_Event_t* dst = dst_;
+    dst->type = src->type;
+    switch(src->type) {
+        case SDL_ACTIVEEVENT:
+            dst->active.gain = src->active.gain;
+            dst->active.state = src->active.state;
+            break;
+        case SDL_KEYUP:
+        case SDL_KEYDOWN:
+            dst->key.keysym.mod = src->key.keysym.mod;
+            dst->key.keysym.scancode = src->key.keysym.scancode;
+            dst->key.keysym.sym = src->key.keysym.sym;
+            dst->key.keysym.unicode = src->key.keysym.unicode;
+            dst->key.state = src->key.state;
+            dst->key.which = dst->key.which;
+            break;
+        case SDL_MOUSEMOTION:
+            dst->motion.state = src->motion.state;
+            dst->motion.which = src->motion.which;
+            dst->motion.x = src->motion.x;
+            dst->motion.y = src->motion.y;
+            dst->motion.xrel = src->motion.xrel;
+            dst->motion.yrel = src->motion.yrel;
+            break;
+        case SDL_MOUSEBUTTONUP:
+        case SDL_MOUSEBUTTONDOWN:
+            dst->button.button = src->button.button;
+            dst->button.state = src->button.state;
+            dst->button.which = src->button.which;
+            dst->button.x = src->button.x;
+            dst->button.y = src->button.y;
+            break;
+        case SDL_JOYAXISMOTION:
+            dst->jaxis.axis = src->jaxis.axis;
+            dst->jaxis.value = src->jaxis.value;
+            dst->jaxis.which = src->jaxis.which;
+            break;
+        case SDL_JOYBALLMOTION:
+            dst->jball.ball = src->jball.ball;
+            dst->jball.which = src->jball.which;
+            dst->jball.xrel = src->jball.xrel;
+            dst->jball.yrel = src->jball.yrel;
+            break;
+        case SDL_JOYHATMOTION:
+            dst->jhat.hat = src->jhat.hat;
+            dst->jhat.value = src->jhat.value;
+            dst->jhat.which = src->jhat.which;
+            break;
+        case SDL_JOYBUTTONUP:
+        case SDL_JOYBUTTONDOWN:
+            dst->jbutton.button = src->jbutton.button;
+            dst->jbutton.state = src->jbutton.state;
+            dst->jbutton.which = src->jbutton.which;
+            break;
+        case SDL_VIDEORESIZE:
+            dst->resize.h = src->resize.h;
+            dst->resize.w = src->resize.w;
+            break;
+        case SDL_VIDEOEXPOSE:
+        case SDL_QUIT:
+            break;
+        case SDL_USEREVENT:
+            dst->user.code = src->user.code;
+            dst->user.data1 = from_ptrv(src->user.data1);
+            dst->user.data2 = from_ptrv(src->user.data2);
+        case SDL_SYSWMEVENT:
+            printf_log(LOG_NONE, "TODO: Convert SDL_SYSWMEVENT\n");
+            abort();
+            break;
+        default:
+            printf_log(LOG_INFO, "Warning, unsuported SDL1.2 (un)event %d\n", src->type);
+            memcpy(dst, src, sizeof(my_SDL_Event_32_t));
+    }
+}
 
 void inplace_SDL_RWops_to_64(void* a)
 {
@@ -196,3 +274,38 @@ void inplace_SDL_RWops_to_32(void* a)
     dst->type = src->type;
     memmove(&dst->hidden, &src->hidden, sizeof(dst->hidden));
 }
+
+void convert_AudioCVT_to_32(void* d, void* s)
+{
+    my_SDL_AudioCVT_32_t* dst = d;
+    my_SDL_AudioCVT_t* src = s;
+    dst->needed = src->needed;
+    dst->src_format = src->src_format;
+    dst->dest_format = src->dest_format;
+    dst->rate_incr = src->rate_incr;
+    dst->buf = to_ptrv(src->buf);
+    dst->len = src->len;
+    dst->len_cvt = src->len_cvt;
+    dst->len_mult = src->len_mult;
+    dst->len_ratio = src->len_ratio;
+    for(int i=0; i<10; ++i)
+        dst->filters[i] = to_ptrv(src->filters[i]);
+    dst->filter_index = src->filter_index;
+}
+void convert_AudioCVT_to_64(void* d, void* s)
+{
+    my_SDL_AudioCVT_t* dst = d;
+    my_SDL_AudioCVT_32_t* src = s;
+    dst->needed = src->needed;
+    dst->src_format = src->src_format;
+    dst->dest_format = src->dest_format;
+    dst->rate_incr = src->rate_incr;
+    dst->buf = from_ptrv(src->buf);
+    dst->len = src->len;
+    dst->len_cvt = src->len_cvt;
+    dst->len_mult = src->len_mult;
+    dst->len_ratio = src->len_ratio;
+    for(int i=0; i<10; ++i)
+        dst->filters[i] = from_ptrv(src->filters[i]);
+    dst->filter_index = src->filter_index;
+}
diff --git a/src/libtools/sdl1rwops.c b/src/libtools/sdl1rwops.c
index ec3f8abd..edb900ce 100644
--- a/src/libtools/sdl1rwops.c
+++ b/src/libtools/sdl1rwops.c
@@ -6,6 +6,10 @@
 #include "sdl1rwops.h"
 #include "debug.h"
 #include "wrapper.h"
+#ifdef BOX32
+#include "wrapper32.h"
+#include "sdl1align32.h"
+#endif
 #include "box64context.h"
 #include "x64run.h"
 #include "x64emu.h"
@@ -54,18 +58,47 @@ typedef struct SDL1_RWops_s {
 
 EXPORT int32_t my_native_seek(SDL1_RWops_t *context, int32_t offset, int32_t whence)
 {
+    #ifdef BOX32
+    if(box64_is32bits) {
+        inplace_SDL_RWops_to_64(context);
+        int ret = context->hidden.my.orig->seek(context->hidden.my.orig, offset, whence);
+        inplace_SDL_RWops_to_32(context);
+        return ret;
+    }
+    #endif
     return context->hidden.my.orig->seek(context->hidden.my.orig, offset, whence);
 }
 EXPORT int32_t my_native_read(SDL1_RWops_t *context, void *ptr, int32_t size, int32_t maxnum)
 {
+    #ifdef BOX32
+    if(box64_is32bits) {
+        inplace_SDL_RWops_to_64(context);
+        int ret = context->hidden.my.orig->read(context->hidden.my.orig, ptr, size, maxnum);
+        inplace_SDL_RWops_to_32(context);
+        return ret;
+    }
+    #endif
     return context->hidden.my.orig->read(context->hidden.my.orig, ptr, size, maxnum);
 }
 EXPORT int32_t my_native_write(SDL1_RWops_t *context, const void *ptr, int32_t size, int32_t num)
 {
+    #ifdef BOX32
+    if(box64_is32bits) {
+        inplace_SDL_RWops_to_64(context);
+        int ret = context->hidden.my.orig->write(context->hidden.my.orig, ptr, size, num);
+        inplace_SDL_RWops_to_32(context);
+        return ret;
+    }
+    #endif
     return context->hidden.my.orig->write(context->hidden.my.orig, ptr, size, num);
 }
 EXPORT int32_t my_native_close(SDL1_RWops_t *context)
 {
+    #ifdef BOX32
+    if(box64_is32bits) {
+        inplace_SDL_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;
@@ -109,10 +142,21 @@ 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;
 
-    GO(seek, iFpii)
-    GO(read, iFppii)
-    GO(write, iFppii)
-    GO(close, iFp)
+    #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)
+    }
 
     #undef GO