Nikolay Sivov : dwrite: Implement Wow64 entry points for unixlib.

Alexandre Julliard julliard at winehq.org
Wed Dec 8 15:46:30 CST 2021


Module: wine
Branch: master
Commit: a005d43b986280f13fb0dcce05a8626cc982dce2
URL:    https://source.winehq.org/git/wine.git/?a=commit;h=a005d43b986280f13fb0dcce05a8626cc982dce2

Author: Nikolay Sivov <nsivov at codeweavers.com>
Date:   Wed Dec  8 14:10:43 2021 +0300

dwrite: Implement Wow64 entry points for unixlib.

Signed-off-by: Nikolay Sivov <nsivov at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>

---

 dlls/dwrite/freetype.c | 228 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 228 insertions(+)

diff --git a/dlls/dwrite/freetype.c b/dlls/dwrite/freetype.c
index 02f496f181b..0caf2b03696 100644
--- a/dlls/dwrite/freetype.c
+++ b/dlls/dwrite/freetype.c
@@ -814,3 +814,231 @@ const unixlib_entry_t __wine_unix_call_funcs[] =
     get_glyph_bitmap,
     get_design_glyph_metrics,
 };
+
+#ifdef _WIN64
+
+typedef ULONG PTR32;
+
+static NTSTATUS wow64_create_font_object(void *args)
+{
+    struct
+    {
+        PTR32 data;
+        UINT64 size;
+        ULONG index;
+        PTR32 object;
+    } const *params32 = args;
+    struct create_font_object_params params =
+    {
+        ULongToPtr(params32->data),
+        params32->size,
+        params32->index,
+        ULongToPtr(params32->object),
+    };
+
+    return create_font_object(&params);
+}
+
+static NTSTATUS wow64_release_font_object(void *args)
+{
+    struct
+    {
+        UINT64 object;
+    } const *params32 = args;
+    struct release_font_object_params params =
+    {
+        params32->object
+    };
+
+    return release_font_object(&params);
+}
+
+struct dwrite_outline32
+{
+    struct
+    {
+        PTR32 values;
+        ULONG count;
+        ULONG size;
+    } tags;
+
+    struct
+    {
+        PTR32 values;
+        ULONG count;
+        ULONG size;
+    } points;
+};
+
+static NTSTATUS wow64_get_glyph_outline(void *args)
+{
+    struct
+    {
+        UINT64 object;
+        ULONG simulations;
+        ULONG glyph;
+        float emsize;
+        PTR32 outline;
+    } const *params32 = args;
+    struct dwrite_outline32 *outline32 = ULongToPtr(params32->outline);
+    struct dwrite_outline outline =
+    {
+        .tags.values = ULongToPtr(outline32->tags.values),
+        .tags.count = outline32->tags.count,
+        .tags.size = outline32->tags.size,
+        .points.values = ULongToPtr(outline32->points.values),
+        .points.count = outline32->points.count,
+        .points.size = outline32->points.size,
+    };
+
+    struct get_glyph_outline_params params =
+    {
+        params32->object,
+        params32->simulations,
+        params32->glyph,
+        params32->emsize,
+        &outline,
+    };
+    NTSTATUS status;
+
+    status = get_glyph_outline(&params);
+    outline32->points.count = outline.points.count;
+    outline32->tags.count = outline.tags.count;
+    return status;
+}
+
+static NTSTATUS wow64_get_glyph_count(void *args)
+{
+    struct
+    {
+        UINT64 object;
+        PTR32 count;
+    } const *params32 = args;
+    struct get_glyph_count_params params =
+    {
+        params32->object,
+        ULongToPtr(params32->count),
+    };
+
+    return get_glyph_count(&params);
+}
+
+static NTSTATUS wow64_get_glyph_advance(void *args)
+{
+    struct
+    {
+        UINT64 object;
+        ULONG glyph;
+        ULONG mode;
+        float emsize;
+        PTR32 advance;
+        PTR32 has_contours;
+    } const *params32 = args;
+    struct get_glyph_advance_params params =
+    {
+        params32->object,
+        params32->glyph,
+        params32->mode,
+        params32->emsize,
+        ULongToPtr(params32->advance),
+        ULongToPtr(params32->has_contours),
+    };
+
+    return get_glyph_advance(&params);
+}
+
+static NTSTATUS wow64_get_glyph_bbox(void *args)
+{
+    struct
+    {
+        UINT64 object;
+        ULONG simulations;
+        ULONG glyph;
+        float emsize;
+        DWRITE_MATRIX m;
+        PTR32 bbox;
+    } const *params32 = args;
+    struct get_glyph_bbox_params params =
+    {
+        params32->object,
+        params32->simulations,
+        params32->glyph,
+        params32->emsize,
+        params32->m,
+        ULongToPtr(params32->bbox),
+    };
+
+    return get_glyph_bbox(&params);
+}
+
+static NTSTATUS wow64_get_glyph_bitmap(void *args)
+{
+    struct
+    {
+        UINT64 object;
+        ULONG simulations;
+        ULONG glyph;
+        ULONG mode;
+        float emsize;
+        DWRITE_MATRIX m;
+        RECT bbox;
+        int pitch;
+        PTR32 bitmap;
+        PTR32 is_1bpp;
+    } const *params32 = args;
+    struct get_glyph_bitmap_params params =
+    {
+        params32->object,
+        params32->simulations,
+        params32->glyph,
+        params32->mode,
+        params32->emsize,
+        params32->m,
+        params32->bbox,
+        params32->pitch,
+        ULongToPtr(params32->bitmap),
+        ULongToPtr(params32->is_1bpp),
+    };
+
+    return get_glyph_bitmap(&params);
+}
+
+static NTSTATUS wow64_get_design_glyph_metrics(void *args)
+{
+    struct
+    {
+        UINT64 object;
+        ULONG simulations;
+        ULONG glyph;
+        ULONG upem;
+        ULONG ascent;
+        PTR32 metrics;
+    } const *params32 = args;
+    struct get_design_glyph_metrics_params params =
+    {
+        params32->object,
+        params32->simulations,
+        params32->glyph,
+        params32->upem,
+        params32->ascent,
+        ULongToPtr(params32->metrics),
+    };
+
+    return get_design_glyph_metrics(&params);
+};
+
+const unixlib_entry_t __wine_unix_call_wow64_funcs[] =
+{
+    process_attach,
+    process_detach,
+    wow64_create_font_object,
+    wow64_release_font_object,
+    wow64_get_glyph_outline,
+    wow64_get_glyph_count,
+    wow64_get_glyph_advance,
+    wow64_get_glyph_bbox,
+    wow64_get_glyph_bitmap,
+    wow64_get_design_glyph_metrics,
+};
+
+#endif  /* _WIN64 */




More information about the wine-cvs mailing list