about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-10-09 11:48:22 +0200
committerptitSeb <sebastien.chev@gmail.com>2024-10-09 11:48:22 +0200
commit84f3c104b201e433c6f31a82211d8a646ca20c41 (patch)
tree18d8b85b875ff00f97ee18cc0727aab8478bd78f /src
parent761f7e40de1f6ff859b4bbdcd60674f2de9dbf0d (diff)
downloadbox64-84f3c104b201e433c6f31a82211d8a646ca20c41.tar.gz
box64-84f3c104b201e433c6f31a82211d8a646ca20c41.zip
[BOX32] Improved handlong of XImage
Diffstat (limited to 'src')
-rw-r--r--src/libtools/my_x11_conv.c15
-rw-r--r--src/libtools/my_x11_conv.h5
-rw-r--r--src/libtools/my_x11_defs_32.h2
-rw-r--r--src/wrapped32/wrappedlibx11.c6
-rw-r--r--src/wrapped32/wrappedlibxext.c15
5 files changed, 29 insertions, 14 deletions
diff --git a/src/libtools/my_x11_conv.c b/src/libtools/my_x11_conv.c
index d0f961e2..00978504 100644
--- a/src/libtools/my_x11_conv.c
+++ b/src/libtools/my_x11_conv.c
@@ -983,4 +983,17 @@ void convert_XSetWindowAttributes_to_64(my_XSetWindowAttributes_t* dst, my_XSetW
     dst->override_redirect = src->override_redirect;
     dst->colormap = from_ulong(src->colormap);
     dst->cursor = from_ulong(src->cursor);
-}
\ No newline at end of file
+}
+
+void* inplace_XImage_shrink(void* a)
+{
+    if(!a) return NULL;
+    WrapXImage(a, a);
+    return a;
+}
+void* inplace_XImage_enlarge(void* a)
+{
+    if(!a) return NULL;
+    UnwrapXImage(a, a);
+    return a;
+}
diff --git a/src/libtools/my_x11_conv.h b/src/libtools/my_x11_conv.h
index 10b8229b..e17073a1 100644
--- a/src/libtools/my_x11_conv.h
+++ b/src/libtools/my_x11_conv.h
@@ -52,4 +52,9 @@ void inplace_XFontStruct_enlarge(void* a);
 
 void convert_XSetWindowAttributes_to_64(my_XSetWindowAttributes_t* dst, my_XSetWindowAttributes_32_t* src);
 
+void WrapXImage(void* d, void* s);  //define in wrappedx11.c because it contains callbacks
+void UnwrapXImage(void* d, void* s);
+void* inplace_XImage_shrink(void* a);
+void* inplace_XImage_enlarge(void* a);
+
 #endif//MY_X11_CONV
\ No newline at end of file
diff --git a/src/libtools/my_x11_defs_32.h b/src/libtools/my_x11_defs_32.h
index 10e3ce23..00756242 100644
--- a/src/libtools/my_x11_defs_32.h
+++ b/src/libtools/my_x11_defs_32.h
@@ -29,7 +29,7 @@ typedef struct _XImage_32 {
     ulong_t red_mask;
     ulong_t green_mask;
     ulong_t blue_mask;
-    ptr_t    obdata;
+    ptr_t   obdata;
     ximage_32_t f;
 } XImage_32;
 
diff --git a/src/wrapped32/wrappedlibx11.c b/src/wrapped32/wrappedlibx11.c
index 7f333e94..b696a91d 100644
--- a/src/wrapped32/wrappedlibx11.c
+++ b/src/wrapped32/wrappedlibx11.c
@@ -566,6 +566,7 @@ static iFp_t my32_rev_destroy_image_fct_##A = NULL;                 \
 static int my32_rev_destroy_image_##A(void* a)                      \
 {                                                                   \
     UnwrapXImage(a, a);                                             \
+    to_hash_d((uintptr_t)((XImage*)a)->obdata);                     \
     return my32_rev_destroy_image_fct_##A (a);                      \
 }
 SUPER()
@@ -1361,7 +1362,7 @@ void WrapXImage(void* d, void* s)
     dst->red_mask = to_ulong(src->red_mask);
     dst->green_mask = to_ulong(src->green_mask);
     dst->blue_mask = to_ulong(src->blue_mask);
-    dst->obdata = to_ptrv(src->obdata);
+    dst->obdata = to_hash((uintptr_t)src->obdata);
 
     #define GO(A, W) \
     dst->f.A = to_ptrv((W##_t)reverse_##A##_Fct(my_lib, src->f.A));
@@ -1393,7 +1394,7 @@ void UnwrapXImage(void* d, void* s)
     GO(create_image, pFXpuiipuuii)
     #undef GO
 
-    dst->obdata = from_ptrv(src->obdata);
+    dst->obdata = (void*)from_hash(src->obdata);
     dst->blue_mask = from_ulong(src->blue_mask);
     dst->green_mask = from_ulong(src->green_mask);
     dst->red_mask = from_ulong(src->red_mask);
@@ -1481,6 +1482,7 @@ EXPORT void my32_XDestroyImage(x64emu_t* emu, void* image)
 {
 
     UnwrapXImage(image, image);
+    to_hash_d((uintptr_t)((XImage*)image)->obdata);
     my->XDestroyImage(image);
 }
 #if 0
diff --git a/src/wrapped32/wrappedlibxext.c b/src/wrapped32/wrappedlibxext.c
index efd390ba..31d7092b 100644
--- a/src/wrapped32/wrappedlibxext.c
+++ b/src/wrapped32/wrappedlibxext.c
@@ -335,10 +335,7 @@ EXPORT void* my32_XShmCreateImage(x64emu_t* emu, void* disp, void* vis, uint32_t
                     , void* data, void* shminfo, uint32_t w, uint32_t h)
 {
     XImage *img = my->XShmCreateImage(disp, vis, depth, fmt, data, shminfo, w, h);
-    if(!img)
-        return img;
-    // bridge all access functions...
-    BridgeImageFunc(emu, img);
+    inplace_XImage_shrink(img);
     return img;
 }
 
@@ -346,19 +343,17 @@ EXPORT int32_t my32_XShmPutImage(x64emu_t* emu, void* disp, size_t drawable, voi
                     , int32_t src_x, int32_t src_y, int32_t dst_x, int32_t dst_y
                     , uint32_t w, uint32_t h, int32_t sendevt)
 {
-    UnbridgeImageFunc(emu, (XImage*)image);
+    inplace_XImage_enlarge(image);
     int32_t r = my->XShmPutImage(disp, drawable, gc, image, src_x, src_y, dst_x, dst_y, w, h, sendevt);
-    // bridge all access functions...
-    BridgeImageFunc(emu, (XImage*)image);
+    inplace_XImage_shrink(image);
     return r;
 }
 
 EXPORT int32_t my32_XShmGetImage(x64emu_t* emu, void* disp, size_t drawable, void* image, int32_t x, int32_t y, size_t plane)
 {
-    UnbridgeImageFunc(emu, (XImage*)image);
+    inplace_XImage_enlarge(image);
     int32_t r = my->XShmGetImage(disp, drawable, image, x, y, plane);
-    // bridge all access functions...
-    BridgeImageFunc(emu, (XImage*)image);
+    inplace_XImage_shrink(image);
     return r;
 }