Compare commits

..

6 Commits
v9.19 ... v9.20

Author SHA1 Message Date
Alistair Leslie-Hughes
5a1b9d5093 Release v9.20 2024-10-19 08:10:39 +11:00
Alistair Leslie-Hughes
c1f62cba4d Rebase against 3a6e9365336304b4d7eb4d66aef959f67361cc1f. 2024-10-19 08:03:42 +11:00
Alistair Leslie-Hughes
02792d0328 Added win32u-NtGdiExtTextOutW-rotation patchset 2024-10-18 07:34:05 +11:00
Alistair Leslie-Hughes
44f9ec9761 Updated vkd3d-latest patchset 2024-10-18 07:32:33 +11:00
Alistair Leslie-Hughes
81492f7156 Updated vkd3d-latest patchset 2024-10-15 09:23:52 +11:00
Alistair Leslie-Hughes
683813d151 Drop gdi32-rotation patchset
This was "fixed" upstream. Though the current implementation is causing
multiple regressions with Rounded Rects.
2024-10-15 09:22:31 +11:00
21 changed files with 14869 additions and 6319 deletions

View File

@@ -1,4 +1,4 @@
From e222dd363cf419eecb0d5c97390b60de15f37951 Mon Sep 17 00:00:00 2001
From 0c97689e30108869e0ffc5fb7a13edcb42de7450 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <z.figura12@gmail.com>
Date: Fri, 8 Jun 2018 18:51:40 -0500
Subject: [PATCH] server: Add an object operation to grab the esync file
@@ -25,6 +25,7 @@ Split off to decrease patch size.
server/mapping.c | 3 +++
server/mutex.c | 1 +
server/named_pipe.c | 5 +++++
server/object.c | 2 ++
server/object.h | 2 ++
server/process.c | 3 +++
server/queue.c | 2 ++
@@ -40,13 +41,13 @@ Split off to decrease patch size.
server/token.c | 1 +
server/window.c | 1 +
server/winstation.c | 2 ++
34 files changed, 68 insertions(+)
35 files changed, 70 insertions(+)
diff --git a/server/async.c b/server/async.c
index 9cb251df5ce..337bba8631b 100644
index 749c547af4f..2377c737e98 100644
--- a/server/async.c
+++ b/server/async.c
@@ -77,6 +77,7 @@ static const struct object_ops async_ops =
@@ -78,6 +78,7 @@ static const struct object_ops async_ops =
add_queue, /* add_queue */
remove_queue, /* remove_queue */
async_signaled, /* signaled */
@@ -54,7 +55,7 @@ index 9cb251df5ce..337bba8631b 100644
async_satisfied, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
@@ -676,6 +677,7 @@ static const struct object_ops iosb_ops =
@@ -698,6 +699,7 @@ static const struct object_ops iosb_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -75,7 +76,7 @@ index ff0799f5880..d9824de8eac 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/change.c b/server/change.c
index 7a806abc017..e080511bb23 100644
index f42ce066340..d0a90a99261 100644
--- a/server/change.c
+++ b/server/change.c
@@ -112,6 +112,7 @@ static const struct object_ops dir_ops =
@@ -87,7 +88,7 @@ index 7a806abc017..e080511bb23 100644
no_signal, /* signal */
dir_get_fd, /* get_fd */
diff --git a/server/clipboard.c b/server/clipboard.c
index 8118a467dd8..8b265f2dcea 100644
index 91f159bc7c9..0df7fd2f18e 100644
--- a/server/clipboard.c
+++ b/server/clipboard.c
@@ -76,6 +76,7 @@ static const struct object_ops clipboard_ops =
@@ -171,7 +172,7 @@ index b64283baf4a..1cc9eea6a50 100644
no_signal, /* signal */
console_connection_get_fd, /* get_fd */
diff --git a/server/debugger.c b/server/debugger.c
index 48adb244b09..d85a2000684 100644
index c59a0abea77..ca04d4c71ce 100644
--- a/server/debugger.c
+++ b/server/debugger.c
@@ -86,6 +86,7 @@ static const struct object_ops debug_event_ops =
@@ -227,7 +228,7 @@ index 436dac6bfe9..f730fa81afa 100644
no_signal, /* signal */
device_file_get_fd, /* get_fd */
diff --git a/server/directory.c b/server/directory.c
index 23d7eb0a2b7..bc161b9ab7e 100644
index b37ec969a9e..a6c0e292071 100644
--- a/server/directory.c
+++ b/server/directory.c
@@ -69,6 +69,7 @@ static const struct object_ops object_type_ops =
@@ -279,7 +280,7 @@ index f1b79b1b35e..c727bfdd1ba 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/fd.c b/server/fd.c
index 74ad95fd4d1..4ce498ec0ef 100644
index 16328063df6..4ce78db5b33 100644
--- a/server/fd.c
+++ b/server/fd.c
@@ -172,6 +172,7 @@ static const struct object_ops fd_ops =
@@ -315,7 +316,7 @@ index 74ad95fd4d1..4ce498ec0ef 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/file.c b/server/file.c
index b4f99ddc93b..1b4efb04bc5 100644
index 2a839968c25..cbef0c63383 100644
--- a/server/file.c
+++ b/server/file.c
@@ -94,6 +94,7 @@ static const struct object_ops file_ops =
@@ -327,7 +328,7 @@ index b4f99ddc93b..1b4efb04bc5 100644
no_signal, /* signal */
file_get_fd, /* get_fd */
diff --git a/server/handle.c b/server/handle.c
index 0595fdb403b..d41c7e86454 100644
index e65831b3b22..e6c5707556f 100644
--- a/server/handle.c
+++ b/server/handle.c
@@ -126,6 +126,7 @@ static const struct object_ops handle_table_ops =
@@ -339,10 +340,10 @@ index 0595fdb403b..d41c7e86454 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/hook.c b/server/hook.c
index 5abdf39ad37..da351d6791f 100644
index c2d2823cd61..ab4d0e9dd31 100644
--- a/server/hook.c
+++ b/server/hook.c
@@ -80,6 +80,7 @@ static const struct object_ops hook_table_ops =
@@ -81,6 +81,7 @@ static const struct object_ops hook_table_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -351,10 +352,10 @@ index 5abdf39ad37..da351d6791f 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/mailslot.c b/server/mailslot.c
index 2d8697ec9bd..4cf9b73f784 100644
index 61eceec94e2..92fe938d3b9 100644
--- a/server/mailslot.c
+++ b/server/mailslot.c
@@ -74,6 +74,7 @@ static const struct object_ops mailslot_ops =
@@ -81,6 +81,7 @@ static const struct object_ops mailslot_ops =
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
@@ -362,7 +363,7 @@ index 2d8697ec9bd..4cf9b73f784 100644
no_satisfied, /* satisfied */
no_signal, /* signal */
mailslot_get_fd, /* get_fd */
@@ -133,6 +134,7 @@ static const struct object_ops mail_writer_ops =
@@ -142,6 +143,7 @@ static const struct object_ops mail_writer_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -370,7 +371,7 @@ index 2d8697ec9bd..4cf9b73f784 100644
NULL, /* satisfied */
no_signal, /* signal */
mail_writer_get_fd, /* get_fd */
@@ -196,6 +198,7 @@ static const struct object_ops mailslot_device_ops =
@@ -207,6 +209,7 @@ static const struct object_ops mailslot_device_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -378,7 +379,7 @@ index 2d8697ec9bd..4cf9b73f784 100644
no_satisfied, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
@@ -226,6 +229,7 @@ static const struct object_ops mailslot_device_file_ops =
@@ -237,6 +240,7 @@ static const struct object_ops mailslot_device_file_ops =
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
@@ -387,7 +388,7 @@ index 2d8697ec9bd..4cf9b73f784 100644
no_signal, /* signal */
mailslot_device_file_get_fd, /* get_fd */
diff --git a/server/mapping.c b/server/mapping.c
index 2d0a0b783e2..1acfb032bfd 100644
index 2bf45780375..b84bb08a77b 100644
--- a/server/mapping.c
+++ b/server/mapping.c
@@ -67,6 +67,7 @@ static const struct object_ops ranges_ops =
@@ -427,7 +428,7 @@ index af0efe72132..4785a830e92 100644
mutex_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/named_pipe.c b/server/named_pipe.c
index f3404a33c3b..f28cb14cb45 100644
index dd8c14b30a9..5880b601d3a 100644
--- a/server/named_pipe.c
+++ b/server/named_pipe.c
@@ -119,6 +119,7 @@ static const struct object_ops named_pipe_ops =
@@ -470,8 +471,28 @@ index f3404a33c3b..f28cb14cb45 100644
no_satisfied, /* satisfied */
no_signal, /* signal */
named_pipe_device_file_get_fd, /* get_fd */
diff --git a/server/object.c b/server/object.c
index b1665fb5372..0a4d1bede06 100644
--- a/server/object.c
+++ b/server/object.c
@@ -108,6 +108,7 @@ static const struct object_ops apc_reserve_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
+ NULL, /* get_esync_fd */
no_satisfied, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
@@ -132,6 +133,7 @@ static const struct object_ops completion_reserve_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
+ NULL, /* get_esync_fd */
no_satisfied, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/object.h b/server/object.h
index dfdd691601f..711af54b579 100644
index 6222e3352ed..0a65d0e3892 100644
--- a/server/object.h
+++ b/server/object.h
@@ -78,6 +78,8 @@ struct object_ops
@@ -484,7 +505,7 @@ index dfdd691601f..711af54b579 100644
void (*satisfied)(struct object *,struct wait_queue_entry *);
/* signal an object */
diff --git a/server/process.c b/server/process.c
index a0d5ea64d97..777bf7c2fe2 100644
index 49f5c75005f..dc83a089655 100644
--- a/server/process.c
+++ b/server/process.c
@@ -105,6 +105,7 @@ static const struct object_ops process_ops =
@@ -512,10 +533,10 @@ index a0d5ea64d97..777bf7c2fe2 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/queue.c b/server/queue.c
index 348fdac3214..2cd8949a252 100644
index 984d466b66e..8a95055db40 100644
--- a/server/queue.c
+++ b/server/queue.c
@@ -174,6 +174,7 @@ static const struct object_ops msg_queue_ops =
@@ -165,6 +165,7 @@ static const struct object_ops msg_queue_ops =
msg_queue_add_queue, /* add_queue */
msg_queue_remove_queue, /* remove_queue */
msg_queue_signaled, /* signaled */
@@ -523,7 +544,7 @@ index 348fdac3214..2cd8949a252 100644
msg_queue_satisfied, /* satisfied */
no_signal, /* signal */
no_get_fd, /* get_fd */
@@ -211,6 +212,7 @@ static const struct object_ops thread_input_ops =
@@ -202,6 +203,7 @@ static const struct object_ops thread_input_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -532,7 +553,7 @@ index 348fdac3214..2cd8949a252 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/registry.c b/server/registry.c
index 629d67c832f..d6b39b99b22 100644
index cc9a33fff1d..c19e92c9750 100644
--- a/server/registry.c
+++ b/server/registry.c
@@ -180,6 +180,7 @@ static const struct object_ops key_ops =
@@ -544,7 +565,7 @@ index 629d67c832f..d6b39b99b22 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/request.c b/server/request.c
index 7021741c765..ca83fdbd2af 100644
index dabcea68309..832a33917b4 100644
--- a/server/request.c
+++ b/server/request.c
@@ -90,6 +90,7 @@ static const struct object_ops master_socket_ops =
@@ -568,10 +589,10 @@ index 53b42a886df..e3889f24601 100644
semaphore_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/serial.c b/server/serial.c
index d665eb7fa35..11e204e4419 100644
index 209f2e9174e..0d49a996c2a 100644
--- a/server/serial.c
+++ b/server/serial.c
@@ -85,6 +85,7 @@ static const struct object_ops serial_ops =
@@ -91,6 +91,7 @@ static const struct object_ops serial_ops =
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
@@ -592,10 +613,10 @@ index 19b76d44c16..55cd6aa037e 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/sock.c b/server/sock.c
index 52175b08987..77b41716cd1 100644
index d2ec882554f..44a4e3b7b15 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -451,6 +451,7 @@ static const struct object_ops sock_ops =
@@ -471,6 +471,7 @@ static const struct object_ops sock_ops =
add_queue, /* add_queue */
remove_queue, /* remove_queue */
default_fd_signaled, /* signaled */
@@ -603,7 +624,7 @@ index 52175b08987..77b41716cd1 100644
no_satisfied, /* satisfied */
no_signal, /* signal */
sock_get_fd, /* get_fd */
@@ -3481,6 +3482,7 @@ static const struct object_ops ifchange_ops =
@@ -3599,6 +3600,7 @@ static const struct object_ops ifchange_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -611,7 +632,7 @@ index 52175b08987..77b41716cd1 100644
no_satisfied, /* satisfied */
no_signal, /* signal */
ifchange_get_fd, /* get_fd */
@@ -3702,6 +3704,7 @@ static const struct object_ops socket_device_ops =
@@ -3820,6 +3822,7 @@ static const struct object_ops socket_device_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -620,7 +641,7 @@ index 52175b08987..77b41716cd1 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/symlink.c b/server/symlink.c
index 27d48e2f994..8cb24b4ff6e 100644
index dd28efd3a75..c7f34412317 100644
--- a/server/symlink.c
+++ b/server/symlink.c
@@ -71,6 +71,7 @@ static const struct object_ops symlink_ops =
@@ -632,7 +653,7 @@ index 27d48e2f994..8cb24b4ff6e 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/thread.c b/server/thread.c
index 0d5bdcf21d9..9dc38d4cce9 100644
index cf69b3b53c3..4b537586e31 100644
--- a/server/thread.c
+++ b/server/thread.c
@@ -96,6 +96,7 @@ static const struct object_ops thread_apc_ops =
@@ -672,10 +693,10 @@ index 96dc9d00ca1..f59902d5607 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/token.c b/server/token.c
index 4df8d2e0c6e..8b4d2f0c1b1 100644
index 48ee1eca8fe..479596bdbfa 100644
--- a/server/token.c
+++ b/server/token.c
@@ -143,6 +143,7 @@ static const struct object_ops token_ops =
@@ -145,6 +145,7 @@ static const struct object_ops token_ops =
no_add_queue, /* add_queue */
NULL, /* remove_queue */
NULL, /* signaled */
@@ -684,7 +705,7 @@ index 4df8d2e0c6e..8b4d2f0c1b1 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/window.c b/server/window.c
index 242e93f303a..3aa7ad4ad79 100644
index 412592fbc71..94a70ce890f 100644
--- a/server/window.c
+++ b/server/window.c
@@ -107,6 +107,7 @@ static const struct object_ops window_ops =
@@ -696,7 +717,7 @@ index 242e93f303a..3aa7ad4ad79 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
diff --git a/server/winstation.c b/server/winstation.c
index 5903497d61e..7692fbe3ed2 100644
index e5f4bfec357..50fe34aa9ce 100644
--- a/server/winstation.c
+++ b/server/winstation.c
@@ -76,6 +76,7 @@ static const struct object_ops winstation_ops =
@@ -716,5 +737,5 @@ index 5903497d61e..7692fbe3ed2 100644
no_signal, /* signal */
no_get_fd, /* get_fd */
--
2.42.0
2.45.2

View File

@@ -1,119 +0,0 @@
From dc2aaa6a25ebccc30c7903fa68235d5971f8d6b8 Mon Sep 17 00:00:00 2001
From: Daniel Wendt <daniel.wendt@linux.com>
Date: Fri, 15 Nov 2013 12:52:37 +0100
Subject: [PATCH] gdi32: fix for rotated Arc, ArcTo, Chord and Pie drawing
problem
Wine-Bug: http://bugs.winehq.org/show_bug.cgi?id=34579
---
dlls/win32u/dibdrv/graphics.c | 80 +++++++++++++++++++++++++++++++++++
1 file changed, 80 insertions(+)
diff --git a/dlls/win32u/dibdrv/graphics.c b/dlls/win32u/dibdrv/graphics.c
index 410f29e8f19..3a6f8184009 100644
--- a/dlls/win32u/dibdrv/graphics.c
+++ b/dlls/win32u/dibdrv/graphics.c
@@ -310,6 +310,60 @@ static int get_arc_points( int arc_dir, const RECT *rect, POINT start, POINT end
return pos - count;
}
+/*
+ Check if matrix has uniform scale and shear and contains a rotation.
+*/
+static BOOL xform_has_rotate_and_uniform_scale_and_shear( const XFORM *xform )
+{
+ return xform->eM21 != 0 && xform->eM11 == xform->eM22 && -xform->eM21 == xform->eM12;
+}
+
+/*
+ Decompose rotation and translation from matrix xform.
+
+ If parameter rotation_and_translation is != NULL, save rotation and translation into it.
+
+ Note: The current implementation only works on matrixes with uniform scale and shear,
+ which has to be checked by a call to xform_has_rotate_and_uniform_scale_and_shear().
+ Hints how to get unique values for non-uniform matrixes are welcome.
+*/
+static BOOL xform_decompose_rotation_and_translation( XFORM *xform, XFORM *rotation_and_translation )
+{
+ XFORM inverse_matrix_scale;
+ XFORM origin_matrix = *xform;
+ double determinant = 0;
+
+ /* xform = xfrom-transposed * xform */
+ xform->eM11 = sqrt( xform->eM11 * xform->eM11 + xform->eM21 * xform->eM21 );
+ xform->eM22 = sqrt( xform->eM12 * xform->eM12 + xform->eM22 * xform->eM22 );
+ xform->eM12 = 0;
+ xform->eM21 = 0;
+ xform->eDx = 0;
+ xform->eDy = 0;
+
+ if ( rotation_and_translation == NULL )
+ return TRUE;
+
+ if ( xform->eM11 == 0 || xform->eM22 == 0 )
+ return FALSE;
+
+ determinant = xform->eM11 * xform->eM22;
+
+ inverse_matrix_scale.eM11 = xform->eM22 / determinant;
+ inverse_matrix_scale.eM12 = 0;
+ inverse_matrix_scale.eM21 = 0;
+ inverse_matrix_scale.eM22 = xform->eM11 / determinant;
+
+ /* calculate the rotation matrix */
+ rotation_and_translation->eM11 = inverse_matrix_scale.eM11 * origin_matrix.eM11;
+ rotation_and_translation->eM12 = inverse_matrix_scale.eM11 * origin_matrix.eM12;
+ rotation_and_translation->eM21 = inverse_matrix_scale.eM22 * origin_matrix.eM12 * -1;
+ rotation_and_translation->eM22 = inverse_matrix_scale.eM22 * origin_matrix.eM22;
+ rotation_and_translation->eDx = origin_matrix.eDx;
+ rotation_and_translation->eDy = origin_matrix.eDy;
+ return TRUE;
+}
+
/* backend for arc functions; extra_lines is -1 for ArcTo, 0 for Arc, 1 for Chord, 2 for Pie */
static BOOL draw_arc( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
INT start_x, INT start_y, INT end_x, INT end_y, INT extra_lines )
@@ -322,6 +376,22 @@ static BOOL draw_arc( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
BOOL ret = TRUE;
HRGN outline = 0, interior = 0;
+ BOOL exclude_rotation = FALSE;
+ XFORM old;
+ XFORM rotation_and_translation;
+ if (dc->attr->graphics_mode == GM_ADVANCED)
+ {
+ XFORM xf;
+ NtGdiGetTransform( pdev->dev.hdc, 0x203, &old );
+ xf = old;
+ if (xform_has_rotate_and_uniform_scale_and_shear( &xf ) &&
+ xform_decompose_rotation_and_translation( &xf, &rotation_and_translation ))
+ {
+ NtGdiModifyWorldTransform( pdev->dev.hdc, &xf, MWT_SET );
+ exclude_rotation = TRUE;
+ }
+ }
+
if (!get_pen_device_rect( dc, pdev, &rect, left, top, right, bottom )) return TRUE;
width = rect.right - rect.left;
@@ -355,6 +425,16 @@ static BOOL draw_arc( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
points[count].y = rect.top + height / 2;
count++;
}
+
+ if (exclude_rotation == TRUE)
+ {
+ NtGdiModifyWorldTransform( pdev->dev.hdc, &rotation_and_translation, MWT_SET );
+ /* apply rotation and translation to calculated points */
+ NtGdiTransformPoints( dev->hdc, points, points, count, NtGdiLPtoDP );
+ /* restore origin matrix */
+ NtGdiModifyWorldTransform( pdev->dev.hdc, &old, MWT_SET );
+ }
+
if (count < 2)
{
free( points );
--
2.33.0

View File

@@ -1,110 +0,0 @@
From fdc9d34400af31765d20ca7b070e53d7eec710e4 Mon Sep 17 00:00:00 2001
From: Daniel Wendt <daniel.wendt@linux.com>
Date: Tue, 10 Dec 2013 14:55:32 +0100
Subject: [PATCH] gdi32: fix for rotated ellipse
Bug: http://bugs.winehq.org/show_bug.cgi?id=35331
---
dlls/win32u/dibdrv/graphics.c | 63 ++++++++++++++++++++++++-----------
1 file changed, 44 insertions(+), 19 deletions(-)
diff --git a/dlls/win32u/dibdrv/graphics.c b/dlls/win32u/dibdrv/graphics.c
index 21d2eabbc9e..1eeea1d68ea 100644
--- a/dlls/win32u/dibdrv/graphics.c
+++ b/dlls/win32u/dibdrv/graphics.c
@@ -1531,10 +1531,28 @@ BOOL dibdrv_RoundRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
DC *dc = get_physdev_dc( dev );
RECT rect;
POINT pt[2], *points;
- int i, end, count;
+ int i, end;
+ ULONG count;
BOOL ret = TRUE;
HRGN outline = 0, interior = 0;
+ BOOL exclude_rotation_translation = FALSE;
+ XFORM old;
+ XFORM rotation_and_translation;
+
+ if (dc->attr->graphics_mode == GM_ADVANCED)
+ {
+ XFORM xf;
+ NtGdiGetTransform( pdev->dev.hdc, 0x203, &old );
+ xf = old;
+ if (xform_has_rotate_and_uniform_scale_and_shear( &xf ) &&
+ xform_decompose_rotation_and_translation( &xf, &rotation_and_translation ))
+ {
+ NtGdiModifyWorldTransform( pdev->dev.hdc, &xf, MWT_SET );
+ exclude_rotation_translation = TRUE;
+ }
+ }
+
if (!get_pen_device_rect( dc, pdev, &rect, left, top, right, bottom )) return TRUE;
pt[0].x = pt[0].y = 0;
@@ -1555,23 +1573,6 @@ BOOL dibdrv_RoundRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
return FALSE;
}
- if (pdev->brush.style != BS_NULL &&
- !(interior = NtGdiCreateRoundRectRgn( rect.left, rect.top, rect.right + 1, rect.bottom + 1,
- ellipse_width, ellipse_height )))
- {
- free( points );
- if (outline) NtGdiDeleteObjectApp( outline );
- return FALSE;
- }
-
- /* if not using a region, paint the interior first so the outline can overlap it */
- if (interior && !outline)
- {
- ret = brush_region( pdev, interior );
- NtGdiDeleteObjectApp( interior );
- interior = 0;
- }
-
count = ellipse_first_quadrant( ellipse_width, ellipse_height, points );
if (dc->attr->arc_direction == AD_CLOCKWISE)
@@ -1615,13 +1616,37 @@ BOOL dibdrv_RoundRect( PHYSDEV dev, INT left, INT top, INT right, INT bottom,
}
count = end + 1;
+ if (exclude_rotation_translation == TRUE)
+ {
+ NtGdiModifyWorldTransform( pdev->dev.hdc, &rotation_and_translation, MWT_SET );
+ /* apply rotation and translation to calculated points */
+ NtGdiTransformPoints( dev->hdc, points, points, count, NtGdiLPtoDP );
+ /* restore origin matrix */
+ NtGdiModifyWorldTransform( pdev->dev.hdc, &old, MWT_SET );
+ }
+
+ if (pdev->brush.style != BS_NULL &&
+ !(interior = ULongToHandle(NtGdiPolyPolyDraw( ULongToHandle(ALTERNATE), points, &count, 1, NtGdiPolyPolygonRgn ))))
+ {
+ free( points );
+ if (outline) NtGdiDeleteObjectApp( outline );
+ return FALSE;
+ }
+
+ /* if not using a region, paint the interior first so the outline can overlap it */
+ if (interior && !outline)
+ {
+ ret = brush_region( pdev, interior );
+ NtGdiDeleteObjectApp( interior );
+ interior = 0;
+ }
+
reset_dash_origin( pdev );
pdev->pen_lines( pdev, count, points, TRUE, outline );
add_pen_lines_bounds( pdev, count, points, outline );
if (interior)
{
- NtGdiCombineRgn( interior, interior, outline, RGN_DIFF );
ret = brush_region( pdev, interior );
NtGdiDeleteObjectApp( interior );
}
--
2.43.0

View File

@@ -1,3 +0,0 @@
Fixes: [34579] gdi32: fix for rotated Arc, ArcTo, Chord and Pie drawing problem
Fixes: [35331] gdi32: fix for rotated ellipse
Disabled: True

View File

@@ -0,0 +1,386 @@
From 4b1bc5d293eca9de7f1f00f3afac32e329364515 Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Thu, 10 Oct 2024 07:16:15 +1100
Subject: [PATCH] Updated vkd3d to 9cb4207c92ec3ee05fce15580c89f2e5146354db.
---
libs/vkd3d/libs/vkd3d-shader/dxil.c | 15 +++
libs/vkd3d/libs/vkd3d-shader/glsl.c | 101 ++++++++++++++++--
libs/vkd3d/libs/vkd3d-shader/ir.c | 40 +++++++
libs/vkd3d/libs/vkd3d-shader/spirv.c | 24 ++---
libs/vkd3d/libs/vkd3d-shader/tpf.c | 15 +++
.../libs/vkd3d-shader/vkd3d_shader_main.c | 2 +
.../libs/vkd3d-shader/vkd3d_shader_private.h | 1 +
7 files changed, 173 insertions(+), 25 deletions(-)
diff --git a/libs/vkd3d/libs/vkd3d-shader/dxil.c b/libs/vkd3d/libs/vkd3d-shader/dxil.c
index c66b059325a..5db9d6da063 100644
--- a/libs/vkd3d/libs/vkd3d-shader/dxil.c
+++ b/libs/vkd3d/libs/vkd3d-shader/dxil.c
@@ -10315,6 +10315,21 @@ static enum vkd3d_result sm6_parser_init(struct sm6_parser *sm6, struct vsir_pro
sm6->ptr = &sm6->start[1];
sm6->bitpos = 2;
+ switch (program->shader_version.type)
+ {
+ case VKD3D_SHADER_TYPE_HULL:
+ case VKD3D_SHADER_TYPE_DOMAIN:
+ break;
+
+ default:
+ if (program->patch_constant_signature.element_count != 0)
+ {
+ WARN("The patch constant signature only makes sense for Hull and Domain Shaders, ignoring it.\n");
+ shader_signature_cleanup(&program->patch_constant_signature);
+ }
+ break;
+ }
+
input_signature = &program->input_signature;
output_signature = &program->output_signature;
patch_constant_signature = &program->patch_constant_signature;
diff --git a/libs/vkd3d/libs/vkd3d-shader/glsl.c b/libs/vkd3d/libs/vkd3d-shader/glsl.c
index 4dc95899a11..91ee355ed39 100644
--- a/libs/vkd3d/libs/vkd3d-shader/glsl.c
+++ b/libs/vkd3d/libs/vkd3d-shader/glsl.c
@@ -651,6 +651,20 @@ static void shader_glsl_cast(struct vkd3d_glsl_generator *gen, const struct vkd3
glsl_dst_cleanup(&dst, &gen->string_buffers);
}
+static void shader_glsl_end_block(struct vkd3d_glsl_generator *gen)
+{
+ --gen->indent;
+ shader_glsl_print_indent(gen->buffer, gen->indent);
+ vkd3d_string_buffer_printf(gen->buffer, "}\n");
+}
+
+static void shader_glsl_begin_block(struct vkd3d_glsl_generator *gen)
+{
+ shader_glsl_print_indent(gen->buffer, gen->indent);
+ vkd3d_string_buffer_printf(gen->buffer, "{\n");
+ ++gen->indent;
+}
+
static void shader_glsl_if(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
{
const char *condition;
@@ -664,23 +678,65 @@ static void shader_glsl_if(struct vkd3d_glsl_generator *gen, const struct vkd3d_
glsl_src_cleanup(&src, &gen->string_buffers);
- shader_glsl_print_indent(gen->buffer, gen->indent);
- vkd3d_string_buffer_printf(gen->buffer, "{\n");
- ++gen->indent;
+ shader_glsl_begin_block(gen);
}
static void shader_glsl_else(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
{
- unsigned int i = 4 * (gen->indent - 1);
+ shader_glsl_end_block(gen);
+ shader_glsl_print_indent(gen->buffer, gen->indent);
+ vkd3d_string_buffer_printf(gen->buffer, "else\n");
+ shader_glsl_begin_block(gen);
+}
- vkd3d_string_buffer_printf(gen->buffer, "%*s}\n%*selse\n%*s{\n", i, "", i, "", i, "");
+static void shader_glsl_loop(struct vkd3d_glsl_generator *gen)
+{
+ shader_glsl_print_indent(gen->buffer, gen->indent);
+ vkd3d_string_buffer_printf(gen->buffer, "for (;;)\n");
+ shader_glsl_begin_block(gen);
}
-static void shader_glsl_endif(struct vkd3d_glsl_generator *gen)
+static void shader_glsl_break(struct vkd3d_glsl_generator *gen)
{
- --gen->indent;
shader_glsl_print_indent(gen->buffer, gen->indent);
- vkd3d_string_buffer_printf(gen->buffer, "}\n");
+ vkd3d_string_buffer_printf(gen->buffer, "break;\n");
+}
+
+static void shader_glsl_continue(struct vkd3d_glsl_generator *gen)
+{
+ shader_glsl_print_indent(gen->buffer, gen->indent);
+ vkd3d_string_buffer_printf(gen->buffer, "continue;\n");
+}
+
+static void shader_glsl_switch(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
+{
+ struct glsl_src src;
+
+ glsl_src_init(&src, gen, &ins->src[0], VKD3DSP_WRITEMASK_0);
+
+ shader_glsl_print_indent(gen->buffer, gen->indent);
+ vkd3d_string_buffer_printf(gen->buffer, "switch (%s)\n", src.str->buffer);
+ shader_glsl_begin_block(gen);
+
+ glsl_src_cleanup(&src, &gen->string_buffers);
+}
+
+static void shader_glsl_case(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
+{
+ struct glsl_src src;
+
+ glsl_src_init(&src, gen, &ins->src[0], VKD3DSP_WRITEMASK_0);
+
+ shader_glsl_print_indent(gen->buffer, gen->indent);
+ vkd3d_string_buffer_printf(gen->buffer, "case %s:\n", src.str->buffer);
+
+ glsl_src_cleanup(&src, &gen->string_buffers);
+}
+
+static void shader_glsl_default(struct vkd3d_glsl_generator *gen)
+{
+ shader_glsl_print_indent(gen->buffer, gen->indent);
+ vkd3d_string_buffer_printf(gen->buffer, "default:\n");
}
static void shader_glsl_ld(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
@@ -1013,6 +1069,9 @@ static void shader_glsl_shader_prologue(struct vkd3d_glsl_generator *gen)
case VKD3D_SHADER_COMPONENT_UINT:
vkd3d_string_buffer_printf(buffer, " = uintBitsToFloat(shader_in_%u)", i);
break;
+ case VKD3D_SHADER_COMPONENT_INT:
+ vkd3d_string_buffer_printf(buffer, " = intBitsToFloat(shader_in_%u)", i);
+ break;
default:
vkd3d_glsl_compiler_error(gen, VKD3D_SHADER_ERROR_GLSL_INTERNAL,
"Internal compiler error: Unhandled input component type %#x.", e->component_type);
@@ -1127,6 +1186,15 @@ static void vkd3d_glsl_handle_instruction(struct vkd3d_glsl_generator *gen,
case VKD3DSIH_AND:
shader_glsl_binop(gen, ins, "&");
break;
+ case VKD3DSIH_BREAK:
+ shader_glsl_break(gen);
+ break;
+ case VKD3DSIH_CASE:
+ shader_glsl_case(gen, ins);
+ break;
+ case VKD3DSIH_CONTINUE:
+ shader_glsl_continue(gen);
+ break;
case VKD3DSIH_DCL_INDEXABLE_TEMP:
shader_glsl_dcl_indexable_temp(gen, ins);
break;
@@ -1138,6 +1206,9 @@ static void vkd3d_glsl_handle_instruction(struct vkd3d_glsl_generator *gen,
case VKD3DSIH_DCL_OUTPUT_SIV:
case VKD3DSIH_NOP:
break;
+ case VKD3DSIH_DEFAULT:
+ shader_glsl_default(gen);
+ break;
case VKD3DSIH_DIV:
shader_glsl_binop(gen, ins, "/");
break;
@@ -1154,7 +1225,9 @@ static void vkd3d_glsl_handle_instruction(struct vkd3d_glsl_generator *gen,
shader_glsl_else(gen, ins);
break;
case VKD3DSIH_ENDIF:
- shader_glsl_endif(gen);
+ case VKD3DSIH_ENDLOOP:
+ case VKD3DSIH_ENDSWITCH:
+ shader_glsl_end_block(gen);
break;
case VKD3DSIH_EQO:
case VKD3DSIH_IEQ:
@@ -1184,6 +1257,7 @@ static void vkd3d_glsl_handle_instruction(struct vkd3d_glsl_generator *gen,
break;
case VKD3DSIH_ILT:
case VKD3DSIH_LTO:
+ case VKD3DSIH_ULT:
shader_glsl_relop(gen, ins, "<", "lessThan");
break;
case VKD3DSIH_IMAX:
@@ -1220,6 +1294,9 @@ static void vkd3d_glsl_handle_instruction(struct vkd3d_glsl_generator *gen,
case VKD3DSIH_LOG:
shader_glsl_intrinsic(gen, ins, "log2");
break;
+ case VKD3DSIH_LOOP:
+ shader_glsl_loop(gen);
+ break;
case VKD3DSIH_MOV:
shader_glsl_mov(gen, ins);
break;
@@ -1259,6 +1336,9 @@ static void vkd3d_glsl_handle_instruction(struct vkd3d_glsl_generator *gen,
case VKD3DSIH_SQRT:
shader_glsl_intrinsic(gen, ins, "sqrt");
break;
+ case VKD3DSIH_SWITCH:
+ shader_glsl_switch(gen, ins);
+ break;
default:
shader_glsl_unhandled(gen, ins);
break;
@@ -1663,6 +1743,9 @@ static void shader_glsl_generate_input_declarations(struct vkd3d_glsl_generator
case VKD3D_SHADER_COMPONENT_UINT:
vkd3d_string_buffer_printf(buffer, "uvec4");
break;
+ case VKD3D_SHADER_COMPONENT_INT:
+ vkd3d_string_buffer_printf(buffer, "ivec4");
+ break;
case VKD3D_SHADER_COMPONENT_FLOAT:
vkd3d_string_buffer_printf(buffer, "vec4");
break;
diff --git a/libs/vkd3d/libs/vkd3d-shader/ir.c b/libs/vkd3d/libs/vkd3d-shader/ir.c
index 14cf23e8d1a..affbae3ea4e 100644
--- a/libs/vkd3d/libs/vkd3d-shader/ir.c
+++ b/libs/vkd3d/libs/vkd3d-shader/ir.c
@@ -6505,6 +6505,30 @@ static bool vsir_validate_src_max_count(struct validation_context *ctx,
return true;
}
+static void vsir_validate_signature_element(struct validation_context *ctx,
+ const struct shader_signature *signature, const char *signature_type,
+ unsigned int idx)
+{
+ const struct signature_element *element = &signature->elements[idx];
+
+ if (element->register_count == 0)
+ validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_SIGNATURE,
+ "element %u of %s signature: Invalid zero register count.", idx, signature_type);
+
+ if (element->mask == 0 || (element->mask & ~0xf))
+ validator_error(ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_SIGNATURE,
+ "element %u of %s signature: Invalid mask %#x.", idx, signature_type, element->mask);
+}
+
+static void vsir_validate_signature(struct validation_context *ctx,
+ const struct shader_signature *signature, const char *signature_type)
+{
+ unsigned int i;
+
+ for (i = 0; i < signature->element_count; ++i)
+ vsir_validate_signature_element(ctx, signature, signature_type, i);
+}
+
static const char *name_from_cf_type(enum vsir_control_flow_type type)
{
switch (type)
@@ -7042,6 +7066,22 @@ enum vkd3d_result vsir_program_validate(struct vsir_program *program, uint64_t c
if (!(config_flags & VKD3D_SHADER_CONFIG_FLAG_FORCE_VALIDATION))
return VKD3D_OK;
+ switch (program->shader_version.type)
+ {
+ case VKD3D_SHADER_TYPE_HULL:
+ case VKD3D_SHADER_TYPE_DOMAIN:
+ break;
+
+ default:
+ if (program->patch_constant_signature.element_count != 0)
+ validator_error(&ctx, VKD3D_SHADER_ERROR_VSIR_INVALID_SIGNATURE,
+ "Patch constant signature is only valid for hull and domain shaders.");
+ }
+
+ vsir_validate_signature(&ctx, &program->input_signature, "input");
+ vsir_validate_signature(&ctx, &program->output_signature, "output");
+ vsir_validate_signature(&ctx, &program->patch_constant_signature, "patch constant");
+
if (!(ctx.temps = vkd3d_calloc(ctx.program->temp_count, sizeof(*ctx.temps))))
goto fail;
diff --git a/libs/vkd3d/libs/vkd3d-shader/spirv.c b/libs/vkd3d/libs/vkd3d-shader/spirv.c
index cb610c929b6..692432d5513 100644
--- a/libs/vkd3d/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d/libs/vkd3d-shader/spirv.c
@@ -3267,18 +3267,6 @@ static void spirv_compiler_emit_register_debug_name(struct vkd3d_spirv_builder *
vkd3d_spirv_build_op_name(builder, id, "%s", debug_name);
}
-static uint32_t spirv_compiler_emit_variable(struct spirv_compiler *compiler,
- struct vkd3d_spirv_stream *stream, SpvStorageClass storage_class,
- enum vkd3d_shader_component_type component_type, unsigned int component_count)
-{
- struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
- uint32_t type_id, ptr_type_id;
-
- type_id = vkd3d_spirv_get_type_id(builder, component_type, component_count);
- ptr_type_id = vkd3d_spirv_get_op_type_pointer(builder, storage_class, type_id);
- return vkd3d_spirv_build_op_variable(builder, stream, ptr_type_id, storage_class, 0);
-}
-
static uint32_t spirv_compiler_emit_array_variable(struct spirv_compiler *compiler,
struct vkd3d_spirv_stream *stream, SpvStorageClass storage_class,
enum vkd3d_shader_component_type component_type, unsigned int component_count,
@@ -3288,10 +3276,6 @@ static uint32_t spirv_compiler_emit_array_variable(struct spirv_compiler *compil
uint32_t type_id, length_id, ptr_type_id;
unsigned int i;
- if (!length_count)
- return spirv_compiler_emit_variable(compiler,
- stream, storage_class, component_type, component_count);
-
type_id = vkd3d_spirv_get_type_id(builder, component_type, component_count);
for (i = 0; i < length_count; ++i)
{
@@ -3305,6 +3289,14 @@ static uint32_t spirv_compiler_emit_array_variable(struct spirv_compiler *compil
return vkd3d_spirv_build_op_variable(builder, stream, ptr_type_id, storage_class, 0);
}
+static uint32_t spirv_compiler_emit_variable(struct spirv_compiler *compiler,
+ struct vkd3d_spirv_stream *stream, SpvStorageClass storage_class,
+ enum vkd3d_shader_component_type component_type, unsigned int component_count)
+{
+ return spirv_compiler_emit_array_variable(compiler, stream, storage_class,
+ component_type, component_count, NULL, 0);
+}
+
static const struct vkd3d_spec_constant_info
{
enum vkd3d_shader_parameter_name name;
diff --git a/libs/vkd3d/libs/vkd3d-shader/tpf.c b/libs/vkd3d/libs/vkd3d-shader/tpf.c
index 75bdb06fe0e..f79e97e92d4 100644
--- a/libs/vkd3d/libs/vkd3d-shader/tpf.c
+++ b/libs/vkd3d/libs/vkd3d-shader/tpf.c
@@ -2914,6 +2914,21 @@ int tpf_parse(const struct vkd3d_shader_compile_info *compile_info, uint64_t con
if (program->shader_version.type == VKD3D_SHADER_TYPE_HULL)
uninvert_used_masks(&program->patch_constant_signature);
+ switch (program->shader_version.type)
+ {
+ case VKD3D_SHADER_TYPE_HULL:
+ case VKD3D_SHADER_TYPE_DOMAIN:
+ break;
+
+ default:
+ if (program->patch_constant_signature.element_count != 0)
+ {
+ WARN("The patch constant signature only makes sense for Hull and Domain Shaders, ignoring it.\n");
+ shader_signature_cleanup(&program->patch_constant_signature);
+ }
+ break;
+ }
+
if (!shader_sm4_parser_validate_signature(&sm4, &program->input_signature,
sm4.input_register_masks, "Input")
|| !shader_sm4_parser_validate_signature(&sm4, &program->output_signature,
diff --git a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_main.c
index 9b320106340..f84ac551272 100644
--- a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_main.c
+++ b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_main.c
@@ -1846,6 +1846,8 @@ void shader_signature_cleanup(struct shader_signature *signature)
}
vkd3d_free(signature->elements);
signature->elements = NULL;
+ signature->elements_capacity = 0;
+ signature->element_count = 0;
}
int vkd3d_shader_parse_input_signature(const struct vkd3d_shader_code *dxbc,
diff --git a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h
index 1a42f385fc0..41b879af4b4 100644
--- a/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h
+++ b/libs/vkd3d/libs/vkd3d-shader/vkd3d_shader_private.h
@@ -245,6 +245,7 @@ enum vkd3d_shader_error
VKD3D_SHADER_ERROR_VSIR_INVALID_GS = 9019,
VKD3D_SHADER_ERROR_VSIR_INVALID_PARAMETER = 9020,
VKD3D_SHADER_ERROR_VSIR_MISSING_SEMANTIC = 9021,
+ VKD3D_SHADER_ERROR_VSIR_INVALID_SIGNATURE = 9022,
VKD3D_SHADER_WARNING_VSIR_DYNAMIC_DESCRIPTOR_ARRAY = 9300,
--
2.45.2

View File

@@ -1,303 +0,0 @@
From 3bca6a7e645ca8f48f2ec73a13b63a412cb7f2be Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Wed, 25 Sep 2024 07:29:36 +1000
Subject: [PATCH] Updated vkd3d to e8b14d765dbebae32d83aa5d2a7521932d9943f9.
---
libs/vkd3d/libs/vkd3d-shader/glsl.c | 38 ++++++++++++++++++++
libs/vkd3d/libs/vkd3d-shader/ir.c | 5 +--
libs/vkd3d/libs/vkd3d-shader/msl.c | 50 ++++++++++++++++++++++++--
libs/vkd3d/libs/vkd3d-shader/preproc.l | 2 +-
libs/vkd3d/libs/vkd3d-shader/spirv.c | 25 ++++---------
libs/vkd3d/libs/vkd3d/vkd3d_main.c | 1 +
6 files changed, 96 insertions(+), 25 deletions(-)
diff --git a/libs/vkd3d/libs/vkd3d-shader/glsl.c b/libs/vkd3d/libs/vkd3d-shader/glsl.c
index b29f13f2b19..a8cc6d87c40 100644
--- a/libs/vkd3d/libs/vkd3d-shader/glsl.c
+++ b/libs/vkd3d/libs/vkd3d-shader/glsl.c
@@ -379,6 +379,9 @@ static void VKD3D_PRINTF_FUNC(3, 4) shader_glsl_print_assignment(
case VKD3D_DATA_FLOAT:
close = false;
break;
+ case VKD3D_DATA_INT:
+ vkd3d_string_buffer_printf(buffer, "intBitsToFloat(");
+ break;
case VKD3D_DATA_UINT:
vkd3d_string_buffer_printf(buffer, "uintBitsToFloat(");
break;
@@ -457,6 +460,28 @@ static void shader_glsl_relop(struct vkd3d_glsl_generator *gen,
glsl_dst_cleanup(&dst, &gen->string_buffers);
}
+static void shader_glsl_cast(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins,
+ const char *scalar_constructor, const char *vector_constructor)
+{
+ unsigned int component_count;
+ struct glsl_src src;
+ struct glsl_dst dst;
+ uint32_t mask;
+
+ mask = glsl_dst_init(&dst, gen, ins, &ins->dst[0]);
+ glsl_src_init(&src, gen, &ins->src[0], mask);
+
+ if ((component_count = vsir_write_mask_component_count(mask)) > 1)
+ shader_glsl_print_assignment(gen, &dst, "%s%u(%s)",
+ vector_constructor, component_count, src.str->buffer);
+ else
+ shader_glsl_print_assignment(gen, &dst, "%s(%s)",
+ scalar_constructor, src.str->buffer);
+
+ glsl_src_cleanup(&src, &gen->string_buffers);
+ glsl_dst_cleanup(&dst, &gen->string_buffers);
+}
+
static void shader_glsl_mov(struct vkd3d_glsl_generator *gen, const struct vkd3d_shader_instruction *ins)
{
struct glsl_src src;
@@ -658,6 +683,12 @@ static void vkd3d_glsl_handle_instruction(struct vkd3d_glsl_generator *gen,
case VKD3DSIH_FRC:
shader_glsl_intrinsic(gen, ins, "fract");
break;
+ case VKD3DSIH_FTOI:
+ shader_glsl_cast(gen, ins, "int", "ivec");
+ break;
+ case VKD3DSIH_FTOU:
+ shader_glsl_cast(gen, ins, "uint", "uvec");
+ break;
case VKD3DSIH_GEO:
shader_glsl_relop(gen, ins, ">=", "greaterThanEqual");
break;
@@ -665,6 +696,10 @@ static void vkd3d_glsl_handle_instruction(struct vkd3d_glsl_generator *gen,
case VKD3DSIH_NEU:
shader_glsl_relop(gen, ins, "!=", "notEqual");
break;
+ case VKD3DSIH_ITOF:
+ case VKD3DSIH_UTOF:
+ shader_glsl_cast(gen, ins, "float", "vec");
+ break;
case VKD3DSIH_MOV:
shader_glsl_mov(gen, ins);
break;
@@ -680,6 +715,9 @@ static void vkd3d_glsl_handle_instruction(struct vkd3d_glsl_generator *gen,
case VKD3DSIH_RET:
shader_glsl_ret(gen, ins);
break;
+ case VKD3DSIH_ROUND_PI:
+ shader_glsl_intrinsic(gen, ins, "ceil");
+ break;
default:
shader_glsl_unhandled(gen, ins);
break;
diff --git a/libs/vkd3d/libs/vkd3d-shader/ir.c b/libs/vkd3d/libs/vkd3d-shader/ir.c
index db9992d9715..0bbe13ad7d8 100644
--- a/libs/vkd3d/libs/vkd3d-shader/ir.c
+++ b/libs/vkd3d/libs/vkd3d-shader/ir.c
@@ -1211,12 +1211,13 @@ static bool io_normaliser_is_in_control_point_phase(const struct io_normaliser *
static bool shader_signature_find_element_for_reg(const struct shader_signature *signature,
unsigned int reg_idx, unsigned int write_mask, unsigned int *element_idx)
{
+ const struct signature_element *e;
unsigned int i, base_write_mask;
for (i = 0; i < signature->element_count; ++i)
{
- struct signature_element *e = &signature->elements[i];
- if (e->register_index <= reg_idx && e->register_index + e->register_count > reg_idx
+ e = &signature->elements[i];
+ if (e->register_index <= reg_idx && e->register_count > reg_idx - e->register_index
&& (e->mask & write_mask) == write_mask)
{
*element_idx = i;
diff --git a/libs/vkd3d/libs/vkd3d-shader/msl.c b/libs/vkd3d/libs/vkd3d-shader/msl.c
index 7d2e713cddc..6b41363d60e 100644
--- a/libs/vkd3d/libs/vkd3d-shader/msl.c
+++ b/libs/vkd3d/libs/vkd3d-shader/msl.c
@@ -55,12 +55,44 @@ static void msl_print_indent(struct vkd3d_string_buffer *buffer, unsigned int in
vkd3d_string_buffer_printf(buffer, "%*s", 4 * indent, "");
}
+static void msl_print_register_datatype(struct vkd3d_string_buffer *buffer,
+ struct msl_generator *gen, const struct vkd3d_shader_register *reg)
+{
+ vkd3d_string_buffer_printf(buffer, ".");
+ switch (reg->data_type)
+ {
+ case VKD3D_DATA_FLOAT:
+ vkd3d_string_buffer_printf(buffer, "f");
+ break;
+ case VKD3D_DATA_INT:
+ vkd3d_string_buffer_printf(buffer, "i");
+ break;
+ case VKD3D_DATA_UINT:
+ vkd3d_string_buffer_printf(buffer, "u");
+ break;
+ default:
+ msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,
+ "Internal compiler error: Unhandled register datatype %#x.", reg->data_type);
+ vkd3d_string_buffer_printf(buffer, "<unrecognised register datatype %#x>", reg->data_type);
+ break;
+ }
+}
+
static void msl_print_register_name(struct vkd3d_string_buffer *buffer,
struct msl_generator *gen, const struct vkd3d_shader_register *reg)
{
- msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,
- "Internal compiler error: Unhandled register type %#x.", reg->type);
- vkd3d_string_buffer_printf(buffer, "<unrecognised register %#x>", reg->type);
+ switch (reg->type)
+ {
+ case VKD3DSPR_TEMP:
+ vkd3d_string_buffer_printf(buffer, "r[%u]", reg->idx[0].offset);
+ msl_print_register_datatype(buffer, gen, reg);
+ break;
+ default:
+ msl_compiler_error(gen, VKD3D_SHADER_ERROR_MSL_INTERNAL,
+ "Internal compiler error: Unhandled register type %#x.", reg->type);
+ vkd3d_string_buffer_printf(buffer, "<unrecognised register %#x>", reg->type);
+ break;
+ }
}
static void msl_print_swizzle(struct vkd3d_string_buffer *buffer, uint32_t swizzle, uint32_t mask)
@@ -221,9 +253,21 @@ static void msl_generator_generate(struct msl_generator *gen)
vkd3d_string_buffer_printf(gen->buffer, "/* Generated by %s. */\n\n", vkd3d_shader_get_version(NULL, NULL));
+ vkd3d_string_buffer_printf(gen->buffer, "union vkd3d_vec4\n{\n");
+ vkd3d_string_buffer_printf(gen->buffer, " uint4 u;\n");
+ vkd3d_string_buffer_printf(gen->buffer, " int4 i;\n");
+ vkd3d_string_buffer_printf(gen->buffer, " float4 f;\n};\n\n");
+
vkd3d_string_buffer_printf(gen->buffer, "void shader_main()\n{\n");
++gen->indent;
+
+ if (gen->program->temp_count)
+ {
+ msl_print_indent(gen->buffer, gen->indent);
+ vkd3d_string_buffer_printf(gen->buffer, "vkd3d_vec4 r[%u];\n\n", gen->program->temp_count);
+ }
+
for (i = 0; i < instructions->count; ++i)
{
msl_handle_instruction(gen, &instructions->elements[i]);
diff --git a/libs/vkd3d/libs/vkd3d-shader/preproc.l b/libs/vkd3d/libs/vkd3d-shader/preproc.l
index 7fc963192cf..41c21cca1f5 100644
--- a/libs/vkd3d/libs/vkd3d-shader/preproc.l
+++ b/libs/vkd3d/libs/vkd3d-shader/preproc.l
@@ -67,7 +67,7 @@ static void update_location(struct preproc_ctx *ctx);
NEWLINE \r?\n
WS [ \t\r]
-IDENTIFIER [A-Za-z_][A-Za-z0-9_]*
+IDENTIFIER (::)?[A-Za-z_]((::)?[A-Za-z0-9_]+)*
INT_SUFFIX [uUlL]{0,2}
%%
diff --git a/libs/vkd3d/libs/vkd3d-shader/spirv.c b/libs/vkd3d/libs/vkd3d-shader/spirv.c
index 1876ad38653..0278a6ca232 100644
--- a/libs/vkd3d/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d/libs/vkd3d-shader/spirv.c
@@ -6354,7 +6354,7 @@ static SpvImageFormat image_format_for_image_read(enum vkd3d_shader_component_ty
static uint32_t spirv_compiler_get_image_type_id(struct spirv_compiler *compiler,
const struct vkd3d_shader_register *reg, const struct vkd3d_shader_register_range *range,
const struct vkd3d_spirv_resource_type *resource_type_info, enum vkd3d_shader_component_type data_type,
- bool raw_structured, uint32_t depth)
+ bool raw_structured)
{
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
const struct vkd3d_shader_descriptor_info1 *d;
@@ -6377,7 +6377,7 @@ static uint32_t spirv_compiler_get_image_type_id(struct spirv_compiler *compiler
sampled_type_id = vkd3d_spirv_get_type_id(builder, data_type, 1);
return vkd3d_spirv_get_op_type_image(builder, sampled_type_id, resource_type_info->dim,
- depth, resource_type_info->arrayed, resource_type_info->ms,
+ 2, resource_type_info->arrayed, resource_type_info->ms,
reg->type == VKD3DSPR_UAV ? 2 : 1, format);
}
@@ -6392,18 +6392,14 @@ static void spirv_compiler_emit_combined_sampler_declarations(struct spirv_compi
const struct vkd3d_shader_combined_resource_sampler *current;
uint32_t image_type_id, type_id, ptr_type_id, var_id;
enum vkd3d_shader_binding_flag resource_type_flag;
- const struct vkd3d_shader_descriptor_info1 *d;
struct vkd3d_symbol symbol;
unsigned int i;
- bool depth;
resource_type_flag = resource_type == VKD3D_SHADER_RESOURCE_BUFFER
? VKD3D_SHADER_BINDING_FLAG_BUFFER : VKD3D_SHADER_BINDING_FLAG_IMAGE;
for (i = 0; i < shader_interface->combined_sampler_count; ++i)
{
- struct vkd3d_shader_register_range sampler_range;
-
current = &shader_interface->combined_samplers[i];
if (current->resource_space != resource_range->space || current->resource_index != resource_range->first)
@@ -6425,16 +6421,8 @@ static void spirv_compiler_emit_combined_sampler_declarations(struct spirv_compi
current->sampler_space, current->binding.count);
}
- sampler_range.space = current->sampler_space;
- sampler_range.first = current->sampler_index;
- sampler_range.last = current->sampler_index;
- d = spirv_compiler_get_descriptor_info(compiler,
- VKD3D_SHADER_DESCRIPTOR_TYPE_SAMPLER, &sampler_range);
- depth = current->sampler_index != VKD3D_SHADER_DUMMY_SAMPLER_INDEX
- && (d->flags & VKD3D_SHADER_DESCRIPTOR_INFO_FLAG_SAMPLER_COMPARISON_MODE);
-
image_type_id = spirv_compiler_get_image_type_id(compiler, resource, resource_range,
- resource_type_info, sampled_type, structure_stride || raw, depth);
+ resource_type_info, sampled_type, structure_stride || raw);
type_id = vkd3d_spirv_get_op_type_sampled_image(builder, image_type_id);
ptr_type_id = vkd3d_spirv_get_op_type_pointer(builder, storage_class, type_id);
@@ -6528,7 +6516,7 @@ static void spirv_compiler_emit_resource_declaration(struct spirv_compiler *comp
else
{
type_id = spirv_compiler_get_image_type_id(compiler, &reg, range,
- resource_type_info, sampled_type, structure_stride || raw, 0);
+ resource_type_info, sampled_type, structure_stride || raw);
}
var_id = spirv_compiler_build_descriptor_variable(compiler, storage_class,
@@ -8440,11 +8428,10 @@ static void spirv_compiler_prepare_image(struct spirv_compiler *compiler,
struct vkd3d_spirv_builder *builder = &compiler->spirv_builder;
uint32_t sampler_var_id, sampler_id, sampled_image_type_id;
const struct vkd3d_symbol *symbol = NULL;
- bool load, sampled, depth_comparison;
+ bool load, sampled;
load = !(flags & VKD3D_IMAGE_FLAG_NO_LOAD);
sampled = flags & VKD3D_IMAGE_FLAG_SAMPLED;
- depth_comparison = flags & VKD3D_IMAGE_FLAG_DEPTH;
if (resource_reg->type == VKD3DSPR_RESOURCE)
symbol = spirv_compiler_find_combined_sampler(compiler, resource_reg, sampler_reg);
@@ -8498,7 +8485,7 @@ static void spirv_compiler_prepare_image(struct spirv_compiler *compiler,
image->image_type_id = spirv_compiler_get_image_type_id(compiler, resource_reg,
&symbol->info.resource.range, image->resource_type_info,
- image->sampled_type, image->structure_stride || image->raw, depth_comparison);
+ image->sampled_type, image->structure_stride || image->raw);
if (sampled)
{
diff --git a/libs/vkd3d/libs/vkd3d/vkd3d_main.c b/libs/vkd3d/libs/vkd3d/vkd3d_main.c
index 9eccec111c7..5215cf8ef86 100644
--- a/libs/vkd3d/libs/vkd3d/vkd3d_main.c
+++ b/libs/vkd3d/libs/vkd3d/vkd3d_main.c
@@ -415,6 +415,7 @@ HRESULT vkd3d_create_versioned_root_signature_deserializer(const void *data, SIZ
if (FAILED(hr = d3d12_versioned_root_signature_deserializer_init(object, &dxbc)))
{
vkd3d_free(object);
+ *deserializer = NULL;
return hr;
}
--
2.45.2

View File

@@ -0,0 +1,232 @@
From de25c3d088ef5feba4c45ca9e885451604781749 Mon Sep 17 00:00:00 2001
From: Dmitry Timoshkov <dmitry@baikal.ru>
Date: Wed, 7 Feb 2024 19:14:29 +0300
Subject: [PATCH 1/2] win32u: Fix device<->world width/height converters.
Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru>
---
dlls/win32u/font.c | 130 +++++++++++++++++++++------------------------
1 file changed, 60 insertions(+), 70 deletions(-)
diff --git a/dlls/win32u/font.c b/dlls/win32u/font.c
index 62a4dc51035..8fbd8dc3f01 100644
--- a/dlls/win32u/font.c
+++ b/dlls/win32u/font.c
@@ -229,12 +229,10 @@ static inline int facename_compare( const WCHAR *str1, const WCHAR *str2, SIZE_T
*/
static inline INT INTERNAL_XDSTOWS(DC *dc, INT width)
{
- double floatWidth;
+ float scale_x;
- /* Perform operation with floating point */
- floatWidth = (double)width * dc->xformVport2World.eM11;
- /* Round to integers */
- return GDI_ROUND(floatWidth);
+ scale_x = hypotf(dc->xformWorld2Vport.eM11, dc->xformWorld2Vport.eM12);
+ return GDI_ROUND( (float)width / scale_x );
}
/* Performs a device to world transformation on the specified size (which
@@ -242,34 +240,26 @@ static inline INT INTERNAL_XDSTOWS(DC *dc, INT width)
*/
static inline INT INTERNAL_YDSTOWS(DC *dc, INT height)
{
- double floatHeight;
+ float scale_y;
- /* Perform operation with floating point */
- floatHeight = (double)height * dc->xformVport2World.eM22;
- /* Round to integers */
- return GDI_ROUND(floatHeight);
+ scale_y = hypotf(dc->xformWorld2Vport.eM21, dc->xformWorld2Vport.eM22);
+ return GDI_ROUND( (float)height / scale_y );
}
-/* scale width and height but don't mirror them */
-
-static inline INT width_to_LP( DC *dc, INT width )
+static inline INT INTERNAL_XWSTODS(DC *dc, INT width)
{
- return GDI_ROUND( (double)width * fabs( dc->xformVport2World.eM11 ));
-}
+ float scale_x;
-static inline INT height_to_LP( DC *dc, INT height )
-{
- return GDI_ROUND( (double)height * fabs( dc->xformVport2World.eM22 ));
+ scale_x = hypotf(dc->xformWorld2Vport.eM11, dc->xformWorld2Vport.eM12);
+ return GDI_ROUND( (float)width / scale_x );
}
static inline INT INTERNAL_YWSTODS(DC *dc, INT height)
{
- POINT pt[2];
- pt[0].x = pt[0].y = 0;
- pt[1].x = 0;
- pt[1].y = height;
- lp_to_dp(dc, pt, 2);
- return pt[1].y - pt[0].y;
+ float scale_y;
+
+ scale_y = hypotf(dc->xformWorld2Vport.eM21, dc->xformWorld2Vport.eM22);
+ return GDI_ROUND( (float)height / scale_y );
}
static INT FONT_GetObjectW( HGDIOBJ handle, INT count, LPVOID buffer );
@@ -4215,8 +4205,8 @@ static void scale_outline_font_metrics( const struct gdi_font *font, OUTLINETEXT
else
scale_x = font->scale_y;
- scale_x *= fabs(font->matrix.eM11);
- scale_y = font->scale_y * fabs(font->matrix.eM22);
+ scale_x *= hypotf(font->matrix.eM11, font->matrix.eM12);
+ scale_y = font->scale_y * hypotf(font->matrix.eM21, font->matrix.eM22);
/* Windows scales these values as signed integers even if they are unsigned */
#define SCALE_X(x) (x) = GDI_ROUND((int)(x) * (scale_x))
@@ -4430,8 +4420,8 @@ static void scale_font_metrics( struct gdi_font *font, TEXTMETRICW *tm )
else
scale_x = font->scale_y;
- scale_x *= fabs(font->matrix.eM11);
- scale_y = font->scale_y * fabs(font->matrix.eM22);
+ scale_x *= hypotf(font->matrix.eM11, font->matrix.eM12);
+ scale_y = font->scale_y * hypotf(font->matrix.eM21, font->matrix.eM22);
#define SCALE_X(x) (x) = GDI_ROUND((x) * scale_x)
#define SCALE_Y(y) (y) = GDI_ROUND((y) * scale_y)
@@ -5400,14 +5390,14 @@ BOOL WINAPI NtGdiGetTextMetricsW( HDC hdc, TEXTMETRICW *metrics, ULONG flags )
metrics->tmDigitizedAspectX = NtGdiGetDeviceCaps(hdc, LOGPIXELSX);
metrics->tmDigitizedAspectY = NtGdiGetDeviceCaps(hdc, LOGPIXELSY);
- metrics->tmHeight = height_to_LP( dc, metrics->tmHeight );
- metrics->tmAscent = height_to_LP( dc, metrics->tmAscent );
- metrics->tmDescent = height_to_LP( dc, metrics->tmDescent );
- metrics->tmInternalLeading = height_to_LP( dc, metrics->tmInternalLeading );
- metrics->tmExternalLeading = height_to_LP( dc, metrics->tmExternalLeading );
- metrics->tmAveCharWidth = width_to_LP( dc, metrics->tmAveCharWidth );
- metrics->tmMaxCharWidth = width_to_LP( dc, metrics->tmMaxCharWidth );
- metrics->tmOverhang = width_to_LP( dc, metrics->tmOverhang );
+ metrics->tmHeight = INTERNAL_YDSTOWS( dc, metrics->tmHeight );
+ metrics->tmAscent = INTERNAL_YDSTOWS( dc, metrics->tmAscent );
+ metrics->tmDescent = INTERNAL_YDSTOWS( dc, metrics->tmDescent );
+ metrics->tmInternalLeading = INTERNAL_YDSTOWS( dc, metrics->tmInternalLeading );
+ metrics->tmExternalLeading = INTERNAL_YDSTOWS( dc, metrics->tmExternalLeading );
+ metrics->tmAveCharWidth = INTERNAL_XDSTOWS( dc, metrics->tmAveCharWidth );
+ metrics->tmMaxCharWidth = INTERNAL_XDSTOWS( dc, metrics->tmMaxCharWidth );
+ metrics->tmOverhang = INTERNAL_XDSTOWS( dc, metrics->tmOverhang );
ret = TRUE;
TRACE("text metrics:\n"
@@ -5463,38 +5453,38 @@ UINT WINAPI NtGdiGetOutlineTextMetricsInternalW( HDC hdc, UINT cbData,
{
output->otmTextMetrics.tmDigitizedAspectX = NtGdiGetDeviceCaps(hdc, LOGPIXELSX);
output->otmTextMetrics.tmDigitizedAspectY = NtGdiGetDeviceCaps(hdc, LOGPIXELSY);
- output->otmTextMetrics.tmHeight = height_to_LP( dc, output->otmTextMetrics.tmHeight );
- output->otmTextMetrics.tmAscent = height_to_LP( dc, output->otmTextMetrics.tmAscent );
- output->otmTextMetrics.tmDescent = height_to_LP( dc, output->otmTextMetrics.tmDescent );
- output->otmTextMetrics.tmInternalLeading = height_to_LP( dc, output->otmTextMetrics.tmInternalLeading );
- output->otmTextMetrics.tmExternalLeading = height_to_LP( dc, output->otmTextMetrics.tmExternalLeading );
- output->otmTextMetrics.tmAveCharWidth = width_to_LP( dc, output->otmTextMetrics.tmAveCharWidth );
- output->otmTextMetrics.tmMaxCharWidth = width_to_LP( dc, output->otmTextMetrics.tmMaxCharWidth );
- output->otmTextMetrics.tmOverhang = width_to_LP( dc, output->otmTextMetrics.tmOverhang );
- output->otmAscent = height_to_LP( dc, output->otmAscent);
- output->otmDescent = height_to_LP( dc, output->otmDescent);
+ output->otmTextMetrics.tmHeight = INTERNAL_YDSTOWS( dc, output->otmTextMetrics.tmHeight );
+ output->otmTextMetrics.tmAscent = INTERNAL_YDSTOWS( dc, output->otmTextMetrics.tmAscent );
+ output->otmTextMetrics.tmDescent = INTERNAL_YDSTOWS( dc, output->otmTextMetrics.tmDescent );
+ output->otmTextMetrics.tmInternalLeading = INTERNAL_YDSTOWS( dc, output->otmTextMetrics.tmInternalLeading );
+ output->otmTextMetrics.tmExternalLeading = INTERNAL_YDSTOWS( dc, output->otmTextMetrics.tmExternalLeading );
+ output->otmTextMetrics.tmAveCharWidth = INTERNAL_XDSTOWS( dc, output->otmTextMetrics.tmAveCharWidth );
+ output->otmTextMetrics.tmMaxCharWidth = INTERNAL_XDSTOWS( dc, output->otmTextMetrics.tmMaxCharWidth );
+ output->otmTextMetrics.tmOverhang = INTERNAL_XDSTOWS( dc, output->otmTextMetrics.tmOverhang );
+ output->otmAscent = INTERNAL_YDSTOWS( dc, output->otmAscent);
+ output->otmDescent = INTERNAL_YDSTOWS( dc, output->otmDescent);
output->otmLineGap = INTERNAL_YDSTOWS(dc, output->otmLineGap);
output->otmsCapEmHeight = INTERNAL_YDSTOWS(dc, output->otmsCapEmHeight);
output->otmsXHeight = INTERNAL_YDSTOWS(dc, output->otmsXHeight);
- output->otmrcFontBox.top = height_to_LP( dc, output->otmrcFontBox.top);
- output->otmrcFontBox.bottom = height_to_LP( dc, output->otmrcFontBox.bottom);
- output->otmrcFontBox.left = width_to_LP( dc, output->otmrcFontBox.left);
- output->otmrcFontBox.right = width_to_LP( dc, output->otmrcFontBox.right);
- output->otmMacAscent = height_to_LP( dc, output->otmMacAscent);
- output->otmMacDescent = height_to_LP( dc, output->otmMacDescent);
+ output->otmrcFontBox.top = INTERNAL_YDSTOWS( dc, output->otmrcFontBox.top);
+ output->otmrcFontBox.bottom = INTERNAL_YDSTOWS( dc, output->otmrcFontBox.bottom);
+ output->otmrcFontBox.left = INTERNAL_XDSTOWS( dc, output->otmrcFontBox.left);
+ output->otmrcFontBox.right = INTERNAL_XDSTOWS( dc, output->otmrcFontBox.right);
+ output->otmMacAscent = INTERNAL_YDSTOWS( dc, output->otmMacAscent);
+ output->otmMacDescent = INTERNAL_YDSTOWS( dc, output->otmMacDescent);
output->otmMacLineGap = INTERNAL_YDSTOWS(dc, output->otmMacLineGap);
- output->otmptSubscriptSize.x = width_to_LP( dc, output->otmptSubscriptSize.x);
- output->otmptSubscriptSize.y = height_to_LP( dc, output->otmptSubscriptSize.y);
- output->otmptSubscriptOffset.x = width_to_LP( dc, output->otmptSubscriptOffset.x);
- output->otmptSubscriptOffset.y = height_to_LP( dc, output->otmptSubscriptOffset.y);
- output->otmptSuperscriptSize.x = width_to_LP( dc, output->otmptSuperscriptSize.x);
- output->otmptSuperscriptSize.y = height_to_LP( dc, output->otmptSuperscriptSize.y);
- output->otmptSuperscriptOffset.x = width_to_LP( dc, output->otmptSuperscriptOffset.x);
- output->otmptSuperscriptOffset.y = height_to_LP( dc, output->otmptSuperscriptOffset.y);
+ output->otmptSubscriptSize.x = INTERNAL_XDSTOWS( dc, output->otmptSubscriptSize.x);
+ output->otmptSubscriptSize.y = INTERNAL_YDSTOWS( dc, output->otmptSubscriptSize.y);
+ output->otmptSubscriptOffset.x = INTERNAL_XDSTOWS( dc, output->otmptSubscriptOffset.x);
+ output->otmptSubscriptOffset.y = INTERNAL_YDSTOWS( dc, output->otmptSubscriptOffset.y);
+ output->otmptSuperscriptSize.x = INTERNAL_XDSTOWS( dc, output->otmptSuperscriptSize.x);
+ output->otmptSuperscriptSize.y = INTERNAL_YDSTOWS( dc, output->otmptSuperscriptSize.y);
+ output->otmptSuperscriptOffset.x = INTERNAL_XDSTOWS( dc, output->otmptSuperscriptOffset.x);
+ output->otmptSuperscriptOffset.y = INTERNAL_YDSTOWS( dc, output->otmptSuperscriptOffset.y);
output->otmsStrikeoutSize = INTERNAL_YDSTOWS(dc, output->otmsStrikeoutSize);
- output->otmsStrikeoutPosition = height_to_LP( dc, output->otmsStrikeoutPosition);
- output->otmsUnderscoreSize = height_to_LP( dc, output->otmsUnderscoreSize);
- output->otmsUnderscorePosition = height_to_LP( dc, output->otmsUnderscorePosition);
+ output->otmsStrikeoutPosition = INTERNAL_YDSTOWS( dc, output->otmsStrikeoutPosition);
+ output->otmsUnderscoreSize = INTERNAL_YDSTOWS( dc, output->otmsUnderscoreSize);
+ output->otmsUnderscorePosition = INTERNAL_YDSTOWS( dc, output->otmsUnderscorePosition);
if(output != lpOTM)
{
@@ -5554,7 +5544,7 @@ BOOL WINAPI NtGdiGetCharWidthW( HDC hdc, UINT first, UINT last, WCHAR *chars,
INT *buffer = buf;
/* convert device units to logical */
for (i = 0; i < count; i++)
- buffer[i] = width_to_LP( dc, buffer[i] );
+ buffer[i] = INTERNAL_XDSTOWS( dc, buffer[i] );
}
else
{
@@ -5853,7 +5843,7 @@ BOOL nulldrv_ExtTextOut( PHYSDEV dev, INT x, INT y, UINT flags, const RECT *rect
*/
static inline int get_line_width( DC *dc, int metric_size )
{
- int width = abs( INTERNAL_YWSTODS( dc, metric_size ));
+ int width = abs( INTERNAL_XWSTODS( dc, metric_size ));
if (width == 0) width = 1;
if (metric_size < 0) width = -width;
return width;
@@ -6287,9 +6277,9 @@ BOOL WINAPI NtGdiGetCharABCWidthsW( HDC hdc, UINT first, UINT last, WCHAR *chars
/* convert device units to logical */
for (i = 0; i < count; i++)
{
- abc[i].abcA = width_to_LP( dc, abc[i].abcA );
- abc[i].abcB = width_to_LP( dc, abc[i].abcB );
- abc[i].abcC = width_to_LP( dc, abc[i].abcC );
+ abc[i].abcA = INTERNAL_XDSTOWS( dc, abc[i].abcA );
+ abc[i].abcB = INTERNAL_XDSTOWS( dc, abc[i].abcB );
+ abc[i].abcC = INTERNAL_XDSTOWS( dc, abc[i].abcC );
}
}
else
@@ -7078,8 +7068,8 @@ BOOL WINAPI NtGdiGetCharWidthInfo( HDC hdc, struct char_width_info *info )
if (ret)
{
- info->lsb = width_to_LP( dc, info->lsb );
- info->rsb = width_to_LP( dc, info->rsb );
+ info->lsb = INTERNAL_XDSTOWS( dc, info->lsb );
+ info->rsb = INTERNAL_XDSTOWS( dc, info->rsb );
}
release_dc_ptr(dc);
return ret;
--
2.46.0

View File

@@ -0,0 +1,55 @@
From 33d132644a7398e4a3a17f1745dcb626ea6694af Mon Sep 17 00:00:00 2001
From: Dmitry Timoshkov <dmitry@baikal.ru>
Date: Wed, 22 Nov 2023 11:51:23 +0300
Subject: [PATCH 2/2] win32u: NtGdiExtTextOutW() should translate x,y from
logical to device units at the last step.
Bug: https://bugs.winehq.org/show_bug.cgi?id=33190
Signed-off-by: Dmitry Timoshkov <dmitry@baikal.ru>
---
dlls/win32u/font.c | 14 ++++++--------
1 file changed, 6 insertions(+), 8 deletions(-)
diff --git a/dlls/win32u/font.c b/dlls/win32u/font.c
index 8fbd8dc3f01..f32becbe669 100644
--- a/dlls/win32u/font.c
+++ b/dlls/win32u/font.c
@@ -5972,12 +5972,6 @@ BOOL WINAPI NtGdiExtTextOutW( HDC hdc, INT x, INT y, UINT flags, const RECT *lpr
goto done;
}
- pt.x = x;
- pt.y = y;
- lp_to_dp(dc, &pt, 1);
- x = pt.x;
- y = pt.y;
-
char_extra = dc->attr->char_extra;
if (char_extra && lpDx && NtGdiGetDeviceCaps( hdc, TECHNOLOGY ) == DT_RASPRINTER)
char_extra = 0; /* Printer drivers don't add char_extra if lpDx is supplied */
@@ -6074,8 +6068,6 @@ BOOL WINAPI NtGdiExtTextOutW( HDC hdc, INT x, INT y, UINT flags, const RECT *lpr
width = desired[1];
}
- tm.tmAscent = abs(INTERNAL_YWSTODS(dc, tm.tmAscent));
- tm.tmDescent = abs(INTERNAL_YWSTODS(dc, tm.tmDescent));
switch( align & (TA_LEFT | TA_RIGHT | TA_CENTER) )
{
case TA_LEFT:
@@ -6143,6 +6135,12 @@ BOOL WINAPI NtGdiExtTextOutW( HDC hdc, INT x, INT y, UINT flags, const RECT *lpr
}
}
+ pt.x = x;
+ pt.y = y;
+ lp_to_dp(dc, &pt, 1);
+ x = pt.x;
+ y = pt.y;
+
ret = physdev->funcs->pExtTextOut( physdev, x, y, (flags & ~ETO_OPAQUE), &rc,
str, count, (INT*)deltas );
--
2.46.0

View File

@@ -0,0 +1,3 @@
Fixes [33190]: win32u - Fix rendering of the rotated and scaled text.
# Merge Request !5068

View File

@@ -1 +1 @@
Wine Staging 9.19
Wine Staging 9.20

Some files were not shown because too many files have changed in this diff Show More