about summary refs log tree commit diff stats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/emu/x64printer.c2
-rw-r--r--src/wrapped/generated/functions_list.txt5
-rw-r--r--src/wrapped/generated/wrappedcairotypes.h4
-rw-r--r--src/wrapped/generated/wrapper.c2
-rw-r--r--src/wrapped/generated/wrapper.h1
-rw-r--r--src/wrapped/wrappedcairo.c34
-rw-r--r--src/wrapped/wrappedcairo_private.h4
7 files changed, 50 insertions, 2 deletions
diff --git a/src/emu/x64printer.c b/src/emu/x64printer.c
index 09f2f31f..eff11ad4 100644
--- a/src/emu/x64printer.c
+++ b/src/emu/x64printer.c
@@ -3523,6 +3523,8 @@ void x64Print(x64emu_t* emu, char* buff, size_t buffsz, const char* func, int ti
         snprintf(buff, buffsz, "%04d|%p: Calling %s(%" PRIp ", %" PRIp ", %" PRIi32 ", %" PRIi32 ")", tid, *(void**)(R_RSP), func, (void*)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX);
     } else if (w == pFEppip) {
         snprintf(buff, buffsz, "%04d|%p: Calling %s(%" PRIp ", %" PRIp ", %" PRIi32 ", %" PRIp ")", tid, *(void**)(R_RSP), func, (void*)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (void*)R_RCX);
+    } else if (w == pFEppdd) {
+        snprintf(buff, buffsz, "%04d|%p: Calling %s(%" PRIp ", %" PRIp ", %" PRIf ", %" PRIf ")", tid, *(void**)(R_RSP), func, (void*)R_RDI, (void*)R_RSI, emu->xmm[0].d[0], emu->xmm[1].d[0]);
     } else if (w == pFEppLp) {
         snprintf(buff, buffsz, "%04d|%p: Calling %s(%" PRIp ", %" PRIp ", %" PRIu64 ", %" PRIp ")", tid, *(void**)(R_RSP), func, (void*)R_RDI, (void*)R_RSI, (uintptr_t)R_RDX, (void*)R_RCX);
     } else if (w == pFEpppi) {
diff --git a/src/wrapped/generated/functions_list.txt b/src/wrapped/generated/functions_list.txt
index 508a6944..e5eb8496 100644
--- a/src/wrapped/generated/functions_list.txt
+++ b/src/wrapped/generated/functions_list.txt
@@ -1947,6 +1947,7 @@
 #() pFEpLpp
 #() pFEppii
 #() pFEppip
+#() pFEppdd
 #() pFEppLp
 #() pFEpppi
 #() pFEpppu
@@ -3541,9 +3542,13 @@ wrappedbz2:
 wrappedcairo:
 - pFp:
   - cairo_xcb_device_get_connection
+- uFppp:
+  - cairo_surface_write_to_png_stream
 - iFpppp:
   - cairo_set_user_data
   - cairo_surface_set_user_data
+- pFppdd:
+  - cairo_pdf_surface_create_for_stream
 - iFpppLpp:
   - cairo_surface_set_mime_data
 wrappedcairogobject:
diff --git a/src/wrapped/generated/wrappedcairotypes.h b/src/wrapped/generated/wrappedcairotypes.h
index 867960bc..11151dee 100644
--- a/src/wrapped/generated/wrappedcairotypes.h
+++ b/src/wrapped/generated/wrappedcairotypes.h
@@ -12,13 +12,17 @@
 #endif
 
 typedef void* (*pFp_t)(void*);
+typedef uint32_t (*uFppp_t)(void*, void*, void*);
 typedef int32_t (*iFpppp_t)(void*, void*, void*, void*);
+typedef void* (*pFppdd_t)(void*, void*, double, double);
 typedef int32_t (*iFpppLpp_t)(void*, void*, void*, uintptr_t, void*, void*);
 
 #define SUPER() ADDED_FUNCTIONS() \
 	GO(cairo_xcb_device_get_connection, pFp_t) \
+	GO(cairo_surface_write_to_png_stream, uFppp_t) \
 	GO(cairo_set_user_data, iFpppp_t) \
 	GO(cairo_surface_set_user_data, iFpppp_t) \
+	GO(cairo_pdf_surface_create_for_stream, pFppdd_t) \
 	GO(cairo_surface_set_mime_data, iFpppLpp_t)
 
 #endif // __wrappedcairoTYPES_H_
diff --git a/src/wrapped/generated/wrapper.c b/src/wrapped/generated/wrapper.c
index 520cf020..72731388 100644
--- a/src/wrapped/generated/wrapper.c
+++ b/src/wrapped/generated/wrapper.c
@@ -1975,6 +1975,7 @@ typedef void* (*pFEpUpp_t)(x64emu_t*, void*, uint64_t, void*, void*);
 typedef void* (*pFEpLpp_t)(x64emu_t*, void*, uintptr_t, void*, void*);
 typedef void* (*pFEppii_t)(x64emu_t*, void*, void*, int32_t, int32_t);
 typedef void* (*pFEppip_t)(x64emu_t*, void*, void*, int32_t, void*);
+typedef void* (*pFEppdd_t)(x64emu_t*, void*, void*, double, double);
 typedef void* (*pFEppLp_t)(x64emu_t*, void*, void*, uintptr_t, void*);
 typedef void* (*pFEpppi_t)(x64emu_t*, void*, void*, void*, int32_t);
 typedef void* (*pFEpppu_t)(x64emu_t*, void*, void*, void*, uint32_t);
@@ -5512,6 +5513,7 @@ void pFEpUpp(x64emu_t *emu, uintptr_t fcn) { pFEpUpp_t fn = (pFEpUpp_t)fcn; R_RA
 void pFEpLpp(x64emu_t *emu, uintptr_t fcn) { pFEpLpp_t fn = (pFEpLpp_t)fcn; R_RAX=(uintptr_t)fn(emu, (void*)R_RDI, (uintptr_t)R_RSI, (void*)R_RDX, (void*)R_RCX); }
 void pFEppii(x64emu_t *emu, uintptr_t fcn) { pFEppii_t fn = (pFEppii_t)fcn; R_RAX=(uintptr_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (int32_t)R_RCX); }
 void pFEppip(x64emu_t *emu, uintptr_t fcn) { pFEppip_t fn = (pFEppip_t)fcn; R_RAX=(uintptr_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (int32_t)R_RDX, (void*)R_RCX); }
+void pFEppdd(x64emu_t *emu, uintptr_t fcn) { pFEppdd_t fn = (pFEppdd_t)fcn; R_RAX=(uintptr_t)fn(emu, (void*)R_RDI, (void*)R_RSI, emu->xmm[0].d[0], emu->xmm[1].d[0]); }
 void pFEppLp(x64emu_t *emu, uintptr_t fcn) { pFEppLp_t fn = (pFEppLp_t)fcn; R_RAX=(uintptr_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (uintptr_t)R_RDX, (void*)R_RCX); }
 void pFEpppi(x64emu_t *emu, uintptr_t fcn) { pFEpppi_t fn = (pFEpppi_t)fcn; R_RAX=(uintptr_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (int32_t)R_RCX); }
 void pFEpppu(x64emu_t *emu, uintptr_t fcn) { pFEpppu_t fn = (pFEpppu_t)fcn; R_RAX=(uintptr_t)fn(emu, (void*)R_RDI, (void*)R_RSI, (void*)R_RDX, (uint32_t)R_RCX); }
diff --git a/src/wrapped/generated/wrapper.h b/src/wrapped/generated/wrapper.h
index f1591123..aa147cfb 100644
--- a/src/wrapped/generated/wrapper.h
+++ b/src/wrapped/generated/wrapper.h
@@ -1984,6 +1984,7 @@ void pFEpUpp(x64emu_t *emu, uintptr_t fnc);
 void pFEpLpp(x64emu_t *emu, uintptr_t fnc);
 void pFEppii(x64emu_t *emu, uintptr_t fnc);
 void pFEppip(x64emu_t *emu, uintptr_t fnc);
+void pFEppdd(x64emu_t *emu, uintptr_t fnc);
 void pFEppLp(x64emu_t *emu, uintptr_t fnc);
 void pFEpppi(x64emu_t *emu, uintptr_t fnc);
 void pFEpppu(x64emu_t *emu, uintptr_t fnc);
diff --git a/src/wrapped/wrappedcairo.c b/src/wrapped/wrappedcairo.c
index e1a15b49..13c6ddec 100644
--- a/src/wrapped/wrappedcairo.c
+++ b/src/wrapped/wrappedcairo.c
@@ -64,6 +64,30 @@ static void* reverse_destroy_Fct(void* fct)
     #undef GO
     return (void*)AddBridge(my_lib->w.bridge, pFpii, fct, 0, NULL);
 }
+// cairo_write ...
+#define GO(A)   \
+static uintptr_t my_cairo_write_fct_##A = 0;                                    \
+static uint32_t my_cairo_write_##A(void* a, void* b, uint32_t c)                \
+{                                                                               \
+    return (uint32_t)RunFunctionFmt(my_cairo_write_fct_##A, "ppu", a, b, c);    \
+}
+SUPER()
+#undef GO
+static void* find_cairo_write_Fct(void* fct)
+{
+    if(!fct) return fct;
+    if(GetNativeFnc((uintptr_t)fct))  return GetNativeFnc((uintptr_t)fct);
+    #define GO(A) if(my_cairo_write_fct_##A == (uintptr_t)fct) return my_cairo_write_##A;
+    SUPER()
+    #undef GO
+    #define GO(A) if(my_cairo_write_fct_##A == 0) {my_cairo_write_fct_##A = (uintptr_t)fct; return my_cairo_write_##A; }
+    SUPER()
+    #undef GO
+    printf_log(LOG_NONE, "Warning, no more slot for cairo cairo_write callback\n");
+    return NULL;
+}
+
+#undef SUPER
 
 EXPORT void* my_cairo_xcb_device_get_connection(x64emu_t* emu, void* a)
 {
@@ -85,4 +109,14 @@ EXPORT int my_cairo_surface_set_mime_data(x64emu_t* emu, void* surf, void* mime_
     return my->cairo_surface_set_mime_data(surf, mime_type, data, len, find_destroy_Fct(destroy), closure);
 }
 
+EXPORT void* my_cairo_pdf_surface_create_for_stream(x64emu_t* emu, void* f, void* c, double w, double h)
+{
+    return my->cairo_pdf_surface_create_for_stream(find_cairo_write_Fct(f), c, w, h);
+}
+
+EXPORT uint32_t my_cairo_surface_write_to_png_stream(x64emu_t* emu, void* surf, void* f, void* c)
+{
+    return my->cairo_surface_write_to_png_stream(surf, find_cairo_write_Fct(f), c);
+}
+
 #include "wrappedlib_init.h"
\ No newline at end of file
diff --git a/src/wrapped/wrappedcairo_private.h b/src/wrapped/wrappedcairo_private.h
index 15cb0a10..99121561 100644
--- a/src/wrapped/wrappedcairo_private.h
+++ b/src/wrapped/wrappedcairo_private.h
@@ -175,7 +175,7 @@ GO(cairo_pattern_set_matrix, vFpp)
 GO(cairo_pattern_status, uFp)
 GO(cairo_pdf_get_versions, vFpp)
 GO(cairo_pdf_surface_create, pFpdd)
-//GO(cairo_pdf_surface_create_for_stream, 
+GOM(cairo_pdf_surface_create_for_stream, pFEppdd)
 GO(cairo_pdf_surface_restrict_to_version, vFpu)
 GO(cairo_pdf_surface_set_size, vFpdd)
 GO(cairo_pdf_version_to_string, pFu)
@@ -338,7 +338,7 @@ GO(cairo_surface_status, uFp)
 GO(cairo_surface_supports_mime_type, iFpp)
 GO(cairo_surface_unmap_image, vFpp)
 GO(cairo_surface_write_to_png, uFpp)
-//GO(cairo_surface_write_to_png_stream, 
+GOM(cairo_surface_write_to_png_stream, uFEppp)
 GO(cairo_svg_get_versions, vFpp)
 GO(cairo_svg_surface_create, pFpdd)
 //GO(cairo_svg_surface_create_for_stream,