about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
authorptitSeb <sebastien.chev@gmail.com>2024-12-13 11:16:37 +0100
committerptitSeb <sebastien.chev@gmail.com>2024-12-13 11:16:37 +0100
commitfa76ce1f057f46a6133dfab67b78cdf16fd1f7f0 (patch)
treee8ff26b7f48a32fd06e57e17c53d8440484351de /src
parent59bb9c2083a3c9781bf0e0446f7de67951f0aff8 (diff)
downloadbox64-fa76ce1f057f46a6133dfab67b78cdf16fd1f7f0.tar.gz
box64-fa76ce1f057f46a6133dfab67b78cdf16fd1f7f0.zip
[BOX32][WRAPPER] Added 3 more 32bits wrapped function to libcairo
Diffstat (limited to 'src')
-rw-r--r--src/libtools/my_x11_conv.c45
-rw-r--r--src/libtools/my_x11_conv.h1
-rw-r--r--src/wrapped32/generated/functions_list.txt5
-rw-r--r--src/wrapped32/generated/wrappedcairotypes32.h6
-rw-r--r--src/wrapped32/generated/wrapper32.c2
-rw-r--r--src/wrapped32/generated/wrapper32.h1
-rw-r--r--src/wrapped32/wrappedcairo.c17
-rw-r--r--src/wrapped32/wrappedcairo_private.h8
8 files changed, 80 insertions, 5 deletions
diff --git a/src/libtools/my_x11_conv.c b/src/libtools/my_x11_conv.c
index eb143e94..c9efd6e3 100644
--- a/src/libtools/my_x11_conv.c
+++ b/src/libtools/my_x11_conv.c
@@ -72,6 +72,31 @@ void convert_Screen_to_32(void* d, void* s)
     dst->save_unders = src->save_unders;
     dst->root_input_mask = to_long(src->root_input_mask);
 }
+void convert_Screen_to_64(void* d, void* s)
+{
+    my_Screen_t* dst = d;
+    my_Screen_32_t* src = s;
+    dst->root_input_mask = from_long(src->root_input_mask);
+    dst->save_unders = src->save_unders;
+    dst->backing_store = src->backing_store;
+    dst->min_maps = src->min_maps;
+    dst->max_maps = src->max_maps;
+    dst->black_pixel = from_ulong(src->black_pixel);
+    dst->white_pixel = from_ulong(src->white_pixel);
+    dst->cmap = from_ulong(src->cmap);
+    dst->default_gc = from_ptrv(src->default_gc);
+    dst->root_visual = from_ptrv(src->root_visual);
+    dst->root_depth = src->root_depth;
+    dst->depths = from_ptrv(src->depths);
+    dst->ndepths = src->ndepths;
+    dst->mheight = src->mheight;
+    dst->mwidth = src->mwidth;
+    dst->height = src->height;
+    dst->width = src->width;
+    dst->root = from_ulong(src->root);
+    dst->display = getDisplay(from_ptrv(src->display));
+    dst->ext_data = from_ptrv(src->ext_data);
+}
 
 void internal_convert_Visual_to_32(void* d, void* s)
 {
@@ -137,6 +162,17 @@ my_Visual_t* getVisual64(int N, my_Visual_32_t* a)
     return ret->_64;
 }
 
+void* get_display_screen(int idx, void* a)
+{
+    my_XDisplay_t* dpy = my32_Displays_64[idx];
+    my_XDisplay_32_t* dpy32 = &my32_Displays_32[idx];
+    my_Screen_32_t* screens32 = from_ptrv(dpy32->screens);
+    for(int i=0; i<dpy->nscreens; ++i)
+        if(&screens32[i] == a)
+            return &dpy->screens[i];
+    return a;
+}
+
 void* convert_Visual_to_32(void* dpy, void* a)
 {
     if(!dpy) return a;
@@ -156,6 +192,15 @@ void* convert_Visual_to_64(void* dpy, void* a)
     return a;
 }
 
+void* getScreen64(void* dpy, void* a)
+{
+    if(!dpy) return a;
+    for(int i=0; i<N_DISPLAY; ++i)
+        if(((&my32_Displays_32[i])==dpy) || (my32_Displays_64[i]==dpy)) {
+            return get_display_screen(i, a);
+        }
+    return a;
+}
 
 void* my_dlopen(x64emu_t* emu, void *filename, int flag);
 void* addDisplay(void* d)
diff --git a/src/libtools/my_x11_conv.h b/src/libtools/my_x11_conv.h
index 709f7cfe..01b37d5d 100644
--- a/src/libtools/my_x11_conv.h
+++ b/src/libtools/my_x11_conv.h
@@ -24,6 +24,7 @@ void delDisplay(void* d);
 void refreshDisplay(void* dpy);
 
 void convert_Screen_to_32(void* d, void* s);
+void* getScreen64(void* dpy, void* a);
 
 void* convert_Visual_to_32(void* dpy, void* a);
 void* convert_Visual_to_64(void* dpy, void* a);
diff --git a/src/wrapped32/generated/functions_list.txt b/src/wrapped32/generated/functions_list.txt
index 4865a6b3..d1996f7b 100644
--- a/src/wrapped32/generated/functions_list.txt
+++ b/src/wrapped32/generated/functions_list.txt
@@ -1378,6 +1378,7 @@
 #() pFEpiiuu -> pFEpiiuu
 #() pEEpLLiN -> pEEpLLiN
 #() pEEppLLp -> pEEppLLp
+#() pFEXLpii -> pFEXLpii
 #() pFEXpppp -> pFEXpppp
 #() pFWCiWCi -> pFWCiWCi
 #() pFdddddd -> pFdddddd
@@ -1701,10 +1702,14 @@ wrappedcairo:
   - cairo_ft_scaled_font_lock_face
   - cairo_xcb_device_get_connection
 - uFpppp:
+  - cairo_pattern_set_user_data
   - cairo_set_user_data
   - cairo_surface_set_user_data
 - pFppdd:
   - cairo_pdf_surface_create_for_stream
+- pFXLpii:
+  - cairo_xlib_surface_create
+  - cairo_xlib_surface_create_for_bitmap
 wrappedcrashhandler:
 wrappedexpat:
 - vFpp:
diff --git a/src/wrapped32/generated/wrappedcairotypes32.h b/src/wrapped32/generated/wrappedcairotypes32.h
index 3a2f9d9b..47999c16 100644
--- a/src/wrapped32/generated/wrappedcairotypes32.h
+++ b/src/wrapped32/generated/wrappedcairotypes32.h
@@ -14,12 +14,16 @@
 typedef void* (*pFp_t)(void*);
 typedef uint32_t (*uFpppp_t)(void*, void*, void*, void*);
 typedef void* (*pFppdd_t)(void*, void*, double, double);
+typedef void* (*pFXLpii_t)(void*, uintptr_t, void*, int32_t, int32_t);
 
 #define SUPER() ADDED_FUNCTIONS() \
 	GO(cairo_ft_scaled_font_lock_face, pFp_t) \
 	GO(cairo_xcb_device_get_connection, pFp_t) \
+	GO(cairo_pattern_set_user_data, uFpppp_t) \
 	GO(cairo_set_user_data, uFpppp_t) \
 	GO(cairo_surface_set_user_data, uFpppp_t) \
-	GO(cairo_pdf_surface_create_for_stream, pFppdd_t)
+	GO(cairo_pdf_surface_create_for_stream, pFppdd_t) \
+	GO(cairo_xlib_surface_create, pFXLpii_t) \
+	GO(cairo_xlib_surface_create_for_bitmap, pFXLpii_t)
 
 #endif // __wrappedcairoTYPES32_H_
diff --git a/src/wrapped32/generated/wrapper32.c b/src/wrapped32/generated/wrapper32.c
index a0722de4..4c353ff4 100644
--- a/src/wrapped32/generated/wrapper32.c
+++ b/src/wrapped32/generated/wrapper32.c
@@ -1469,6 +1469,7 @@ typedef intptr_t (*lEipLipp_t)(int32_t, void*, uintptr_t, int32_t, void*, void*)
 typedef void* (*pFEpiiuu_t)(x64emu_t*, void*, int32_t, int32_t, uint32_t, uint32_t);
 typedef void* (*pEEpLLiN_t)(x64emu_t*, void*, uintptr_t, uintptr_t, int32_t, ...);
 typedef void* (*pEEppLLp_t)(x64emu_t*, void*, void*, uintptr_t, uintptr_t, void*);
+typedef void* (*pFEXLpii_t)(x64emu_t*, void*, uintptr_t, void*, int32_t, int32_t);
 typedef void* (*pFEXpppp_t)(x64emu_t*, void*, void*, void*, void*, void*);
 typedef void* (*pFWCiWCi_t)(uint16_t, uint8_t, int32_t, uint16_t, uint8_t, int32_t);
 typedef void* (*pFdddddd_t)(double, double, double, double, double, double);
@@ -3173,6 +3174,7 @@ void lEipLipp_32(x64emu_t *emu, uintptr_t fcn) { lEipLipp_t fn = (lEipLipp_t)fcn
 void pFEpiiuu_32(x64emu_t *emu, uintptr_t fcn) { pFEpiiuu_t fn = (pFEpiiuu_t)fcn; R_EAX = to_ptrv(fn(emu, from_ptriv(R_ESP + 4), from_ptri(int32_t, R_ESP + 8), from_ptri(int32_t, R_ESP + 12), from_ptri(uint32_t, R_ESP + 16), from_ptri(uint32_t, R_ESP + 20))); }
 void pEEpLLiN_32(x64emu_t *emu, uintptr_t fcn) { pEEpLLiN_t fn = (pEEpLLiN_t)fcn; errno = emu->libc_err; R_EAX = to_ptrv(fn(emu, from_ptriv(R_ESP + 4), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ulong(from_ptri(ulong_t, R_ESP + 12)), from_ptri(int32_t, R_ESP + 16), from_ptriv(R_ESP + 20))); emu->libc_err = errno; }
 void pEEppLLp_32(x64emu_t *emu, uintptr_t fcn) { pEEppLLp_t fn = (pEEppLLp_t)fcn; errno = emu->libc_err; R_EAX = to_ptrv(fn(emu, from_ptriv(R_ESP + 4), from_ptriv(R_ESP + 8), from_ulong(from_ptri(ulong_t, R_ESP + 12)), from_ulong(from_ptri(ulong_t, R_ESP + 16)), from_ptriv(R_ESP + 20))); emu->libc_err = errno; }
+void pFEXLpii_32(x64emu_t *emu, uintptr_t fcn) { pFEXLpii_t fn = (pFEXLpii_t)fcn; R_EAX = to_ptrv(fn(emu, getDisplay(from_ptriv(R_ESP + 4)), from_ulong(from_ptri(ulong_t, R_ESP + 8)), from_ptriv(R_ESP + 12), from_ptri(int32_t, R_ESP + 16), from_ptri(int32_t, R_ESP + 20))); }
 void pFEXpppp_32(x64emu_t *emu, uintptr_t fcn) { pFEXpppp_t fn = (pFEXpppp_t)fcn; R_EAX = to_ptrv(fn(emu, getDisplay(from_ptriv(R_ESP + 4)), from_ptriv(R_ESP + 8), from_ptriv(R_ESP + 12), from_ptriv(R_ESP + 16), from_ptriv(R_ESP + 20))); }
 void pFWCiWCi_32(x64emu_t *emu, uintptr_t fcn) { pFWCiWCi_t fn = (pFWCiWCi_t)fcn; R_EAX = to_ptrv(fn(from_ptri(uint16_t, R_ESP + 4), from_ptri(uint8_t, R_ESP + 8), from_ptri(int32_t, R_ESP + 12), from_ptri(uint16_t, R_ESP + 16), from_ptri(uint8_t, R_ESP + 20), from_ptri(int32_t, R_ESP + 24))); }
 void pFdddddd_32(x64emu_t *emu, uintptr_t fcn) { pFdddddd_t fn = (pFdddddd_t)fcn; R_EAX = to_ptrv(fn(from_ptri(double, R_ESP + 4), from_ptri(double, R_ESP + 12), from_ptri(double, R_ESP + 20), from_ptri(double, R_ESP + 28), from_ptri(double, R_ESP + 36), from_ptri(double, R_ESP + 44))); }
diff --git a/src/wrapped32/generated/wrapper32.h b/src/wrapped32/generated/wrapper32.h
index 6d60b9a3..e39652ab 100644
--- a/src/wrapped32/generated/wrapper32.h
+++ b/src/wrapped32/generated/wrapper32.h
@@ -1419,6 +1419,7 @@ void lEipLipp_32(x64emu_t *emu, uintptr_t fnc);
 void pFEpiiuu_32(x64emu_t *emu, uintptr_t fnc);
 void pEEpLLiN_32(x64emu_t *emu, uintptr_t fnc);
 void pEEppLLp_32(x64emu_t *emu, uintptr_t fnc);
+void pFEXLpii_32(x64emu_t *emu, uintptr_t fnc);
 void pFEXpppp_32(x64emu_t *emu, uintptr_t fnc);
 void pFWCiWCi_32(x64emu_t *emu, uintptr_t fnc);
 void pFdddddd_32(x64emu_t *emu, uintptr_t fnc);
diff --git a/src/wrapped32/wrappedcairo.c b/src/wrapped32/wrappedcairo.c
index da155f07..65bab438 100644
--- a/src/wrapped32/wrappedcairo.c
+++ b/src/wrapped32/wrappedcairo.c
@@ -18,6 +18,7 @@
 #include "emu/x64emu_private.h"
 #include "myalign32.h"
 #include "converter32.h"
+#include "libtools/my_x11_conv.h"
 
 static const char* cairoName = "libcairo.so.2";
 #define LIBNAME cairo
@@ -117,4 +118,20 @@ EXPORT void* my32_cairo_pdf_surface_create_for_stream(x64emu_t* emu, void* f, vo
     return my->cairo_pdf_surface_create_for_stream(find_cairo_write_func_Fct(f), closure, width, height);
 }
 
+EXPORT uint32_t my32_cairo_pattern_set_user_data(x64emu_t* emu, void* pat, void* key, void* data, void* d)
+{
+    return my->cairo_pattern_set_user_data(pat, key, data, find_destroy_Fct(d));
+}
+
+EXPORT void* my32_cairo_xlib_surface_create(x64emu_t* emu, void* dpy, XID d, void* vis, int w, int h)
+{
+    return my->cairo_xlib_surface_create(dpy, d, convert_Visual_to_64(dpy, vis), w, h);
+}
+
+EXPORT void* my32_cairo_xlib_surface_create_for_bitmap(x64emu_t* emu, void* dpy, XID d, void* screen, int w, int h)
+{
+
+    return my->cairo_xlib_surface_create_for_bitmap(dpy, d, getScreen64(dpy, screen), w, h);
+}
+
 #include "wrappedlib_init32.h"
\ No newline at end of file
diff --git a/src/wrapped32/wrappedcairo_private.h b/src/wrapped32/wrappedcairo_private.h
index 1e2dfdc7..6dd05e85 100644
--- a/src/wrapped32/wrappedcairo_private.h
+++ b/src/wrapped32/wrappedcairo_private.h
@@ -171,7 +171,7 @@ GO(cairo_pattern_reference, pFp)
 GO(cairo_pattern_set_extend, vFpu)
 GO(cairo_pattern_set_filter, vFpu)
 GO(cairo_pattern_set_matrix, vFpp)
-//GOM(cairo_pattern_set_user_data, uFEpppp)
+GOM(cairo_pattern_set_user_data, uFEpppp)
 GO(cairo_pattern_status, uFp)
 //GO(cairo_pdf_get_versions, vFpp)
 GO(cairo_pdf_surface_create, pFpdd)
@@ -380,8 +380,8 @@ GOM(cairo_xcb_device_get_connection, pFEp)
 //GO(cairo_xlib_device_debug_cap_xrender_version, vFpii)
 //GO(cairo_xlib_device_debug_get_precision, iFp)
 //GO(cairo_xlib_device_debug_set_precision, vFpi)
-//GO(cairo_xlib_surface_create, pFpppii)
-//GO(cairo_xlib_surface_create_for_bitmap, pFpLpii)
+GOM(cairo_xlib_surface_create, pFEXLpii)
+GOM(cairo_xlib_surface_create_for_bitmap, pFEXLpii)
 //GO(cairo_xlib_surface_create_with_xrender_format, pFpLppii)
 //GO(cairo_xlib_surface_get_depth, 
 //GO(cairo_xlib_surface_get_display, pFp)
@@ -392,7 +392,7 @@ GOM(cairo_xcb_device_get_connection, pFEp)
 //GO(cairo_xlib_surface_get_width, 
 //GO(cairo_xlib_surface_get_xrender_format, pFp)
 //GO(cairo_xlib_surface_set_drawable, vFpLii)
-//GO(cairo_xlib_surface_set_size, vFpii)
+GO(cairo_xlib_surface_set_size, vFpii)
 //GO(cairo_xml_create, 
 //GO(cairo_xml_create_for_stream, 
 //GO(cairo_xml_for_recording_surface,