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/sdl1align32.c165
-rwxr-xr-xsrc/libtools/threads32.c12
2 files changed, 177 insertions, 0 deletions
diff --git a/src/libtools/sdl1align32.c b/src/libtools/sdl1align32.c
new file mode 100644
index 00000000..d1d28e28
--- /dev/null
+++ b/src/libtools/sdl1align32.c
@@ -0,0 +1,165 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdint.h>
+#include <stddef.h>
+#include <wchar.h>
+#include <sys/epoll.h>
+#include <fts.h>
+#include <sys/socket.h>
+
+#include "x64emu.h"
+#include "emu/x64emu_private.h"
+#include "myalign32.h"
+#include "debug.h"
+#include "box32.h"
+#include "sdl1align32.h"
+
+
+void inplace_SDL_Palette_to_64(void* a) {
+    if(!a) return;
+    my_SDL_Palette_32_t* src = a;
+    my_SDL_Palette_t* dst = a;
+    dst->colors = from_ptrv(src->colors);
+}
+void inplace_SDL_Palette_to_32(void* a) {
+    if(!a) return;
+    my_SDL_Palette_t* src = a;
+    my_SDL_Palette_32_t* dst = a;
+    dst->colors = to_ptrv(src->colors);
+}
+void inplace_SDL_PixelFormat_to_64(void* a) {
+    if(!a) return;
+    my_SDL_PixelFormat_32_t* src = a;
+    my_SDL_PixelFormat_t* dst = a;
+    memmove(&dst->BitsPerPixel, &src->BitsPerPixel, sizeof(my_SDL_PixelFormat_t)-offsetof(my_SDL_PixelFormat_t, BitsPerPixel));
+    dst->palette = from_ptrv(src->palette);
+    inplace_SDL_Palette_to_64(dst->palette);
+}
+void inplace_SDL_PixelFormat_to_32(void* a) {
+    if(!a) return;
+    my_SDL_PixelFormat_t* src = a;
+    my_SDL_PixelFormat_32_t* dst = a;
+    inplace_SDL_Palette_to_32(src->palette);
+    dst->palette = to_ptrv(src->palette);
+    memmove(&dst->BitsPerPixel, &src->BitsPerPixel, sizeof(my_SDL_PixelFormat_32_t)-offsetof(my_SDL_PixelFormat_32_t, BitsPerPixel));
+}
+
+void inplace_SDL_Surface_to_64(void* a) {
+    if(!a) return;
+    my_SDL_Surface_32_t* src = a;
+    my_SDL_Surface_t* dst = a;
+    dst->refcount = src->refcount;
+    dst->format_version = src->format_version;
+    dst->map = from_ptrv(src->map);
+    dst->locked = src->locked;
+    dst->unused1 = src->unused1;
+    memmove(&dst->clip_rect, &src->clip_rect, sizeof(dst->clip_rect));
+    dst->hwdata = from_ptrv(src->hwdata);
+    dst->offset = src->offset;
+    dst->pixels = from_ptrv(src->pixels);
+    dst->pitch = src->pitch;
+    dst->h = src->h;
+    dst->w = src->w;
+    dst->format = from_ptrv(src->format);
+    inplace_SDL_PixelFormat_to_64(dst->format);
+}
+void inplace_SDL_Surface_to_32(void* a) {
+    if(!a) return;
+    my_SDL_Surface_t* src = a;
+    my_SDL_Surface_32_t* dst = a;
+    inplace_SDL_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->offset = src->offset;
+    dst->hwdata = to_ptrv(src->hwdata);
+    memmove(&dst->clip_rect, &src->clip_rect, sizeof(dst->clip_rect));
+    dst->unused1 = src->unused1;
+    dst->locked = src->locked;
+    dst->map = to_ptrv(src->map);
+    dst->format_version = src->format_version;
+    dst->refcount = src->refcount;
+}
+
+
+void convert_SDL_Event_to_32(void* dst_, const void* src_)
+{
+    if(!src_|| !dst_) return;
+    const my_SDL_Event_t *src = src_;
+    my_SDL_Event_32_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 = to_ptrv(src->user.data1);
+            dst->user.data2 = to_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 event %d\n", src->type);
+            memcpy(dst, src, sizeof(my_SDL_Event_32_t));
+    }
+}
\ No newline at end of file
diff --git a/src/libtools/threads32.c b/src/libtools/threads32.c
index e161ff45..5cc808a0 100755
--- a/src/libtools/threads32.c
+++ b/src/libtools/threads32.c
@@ -311,6 +311,18 @@ EXPORT int my32_pthread_rwlock_init(void* rdlock, void* attr)
 }
 EXPORT int my32___pthread_rwlock_init(void*, void*) __attribute__((alias("my32_pthread_rwlock_init")));
 
+EXPORT int my32_pthread_rwlock_destroy(void* rdlock)
+{
+	// the structure is bigger, but the "active" part should be the same size, so just save/restoore the padding at init
+	uint8_t buff[sizeof(pthread_rwlock_t)];
+	if(rdlock && sizeof(pthread_rwlock_t)>X86_RWLOCK_SIZE) {
+		memcpy(buff, rdlock+32, sizeof(pthread_rwlock_t)-X86_RWLOCK_SIZE);
+	}
+	int ret = pthread_rwlock_destroy(rdlock);
+	memcpy(rdlock+32, buff, sizeof(pthread_rwlock_t)-X86_RWLOCK_SIZE);
+	return ret;
+}
+
 EXPORT void my32___pthread_unwind_next(x64emu_t* emu, void* p)
 {
 	emu->quit = 1;