Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
December 2020
- 68 participants
- 931 messages
[RFC] Announcing Wayland driver development
by Alexandros Frantzis
Hi all,
For some time now I have been working on a Wayland driver for Wine, and
it has now reached a good enough state to present it to the wider
community. This driver allows users to run Windows GDI and OpenGL
applications directly on Wayland compositors without an intermediate
layer to translate from X11 to Wayland. This leads to a leaner and more
efficient stack.
The code currently resides at:
https://gitlab.collabora.com/alf/wine/-/commits/wayland
Get it with:
$ git clone -b wayland https://gitlab.collabora.com/alf/wine/
Configure with (you need the wayland-client and wayland-egl packages):
$ ./configure --with-wayland
To run, ensure there is a Wayland compositor running, unset DISPLAY (so
that Wayland is picked instead of X11) and set WAYLAND_DISPLAY (if
needed):
$ DISPLAY= WAYLAND_DISPLAY=wayland-0 ./wine ...
Here is video showcasing a few Windows applications running with the
Wayland driver on the Weston reference compositor:
https://youtu.be/br2b8gUy5n8
The Wayland protocol is by design more constrained compared to more
traditional display systems like X11. These constraints add some
special challenges in the integration of Wayland with Win32.
Since Wayland's window model is not based on a single flat 2D
co-ordinate space, as X11's was, the Wayland protocol doesn't allow
applications to control their absolute position on the screen. For Win32
transient windows (menus, tooltips, etc) the driver tries to work around
the lack of absolute positioning by "anchoring" them to an owning
Wayland surface and treating them as subsurfaces of that owner. Screen
coordinates for such windows are transformed to local coordinates
relative to the owning surface, allowing correct placement through
relative subsurface movement, which is supported by Wayland. By using
heuristics to select the proper owning surface, this approach has led to
very good results.
Absolute positioning of non-transient top level windows is not supported
at this time, and will likely require a (possibly controversial) Wayland
extension if it is to ever be pursued. The lack of absolute positioning
also has an adverse effect on input handling, when parts of windows
reside outside the visible windows display space, but are still full
accessible in the Wayland compositor display space (and thus the user).
Input events to such areas don't reach their intended coordinates (are
clamped to Windows display bounds) leaving the user mystified about why
they are unable to interact with a perfectly visible area in their
Wayland compositor. The current partial workaround is to force all
windows at (0,0) windows display coordinates, to maximize the area which
can be interacted with. With this workaround, and as long as windows
remain smaller than the display size, input works without issues.
Here what's supported at the moment (modulo bugs):
* GDI apps, including layered/translucent windows
* OpenGL apps
* Window resizing
* Maximized and fullscreen window states
* Mouse and keyboard (only QWERTY) input
* Mouse cursors
* Menus, tooltips, etc
* Single display
What needs more work (or is completely missing):
* Minimize
* Better z-order and activation handling
* Keyboard layout support
* Grabs
* GTK menu mouse handling bug (cannot click to select items)
* Multiple displays
* Vulkan. Note that that there is another effort at
https://github.com/varmd/wine-wayland/ focusing solely on vulkan.
My hope is that we will be able to share efforts going forward.
Programs I have tried and which are working well (again modulo bugs):
* Native Wine/Win32 apps (notepad, regedit etc)
* Supertuxkart
* 010Editor
* Firefox
* Stellarium
* Battle For Wesnoth
* GIMP (except clicking items in GTK menus as noted above)
* Unigine Valley
My first question to the Wine community is how complete the driver
should be before being considered for inclusion. Is the current Wayland
driver state enough? If there is interest, I was hoping to get the
driver in earlier rather than later, in an experimental capacity, in
order to provide a single, official point of development for people
wanting to contribute.
My second question is about the best way to move forward with
upstreaming. The code is currently split between just a few commits,
mostly as a result of the experimental nature of this effort, and also
because I used existing code from winex11 and wineandroid as my starting
point. I would like to split this into smaller commits to make it more
review-friendly for the mailing list. I was thinking of splitting by
user32 function (and internal dependencies), but since this is going to
be an artificial split, I am open to other ideas to make reviewers'
lives easier.
Looking forward to your feedback and questions!
Thanks,
Alexandros
Dec. 15, 2020
[PATCH vkd3d v2 2/2] vkd3d-shader: Move location tracking out of the vkd3d_shader_message_context structure.
by Zebediah Figura
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
v2: Retain source names for shader_extract_from_dxbc().
I still think it's better and easier to get rid of the pointless "<anonymous>"
for signature parsing and compilation, but that functional change can be
reverted as well...
libs/vkd3d-shader/dxbc.c | 63 +++++++++++++-----------
libs/vkd3d-shader/spirv.c | 6 ++-
libs/vkd3d-shader/vkd3d_shader_main.c | 61 ++++++++++++-----------
libs/vkd3d-shader/vkd3d_shader_private.h | 19 ++++---
4 files changed, 83 insertions(+), 66 deletions(-)
diff --git a/libs/vkd3d-shader/dxbc.c b/libs/vkd3d-shader/dxbc.c
index 9977d1a3..278912d8 100644
--- a/libs/vkd3d-shader/dxbc.c
+++ b/libs/vkd3d-shader/dxbc.c
@@ -2021,9 +2021,11 @@ static const char *shader_get_string(const char *data, size_t data_size, DWORD o
return data + offset;
}
-static int parse_dxbc(const char *data, size_t data_size, struct vkd3d_shader_message_context *message_context,
+static int parse_dxbc(const char *data, size_t data_size,
+ struct vkd3d_shader_message_context *message_context, const char *source_name,
int (*chunk_handler)(const char *data, DWORD data_size, DWORD tag, void *ctx), void *ctx)
{
+ const struct vkd3d_shader_location location = {.source_name = source_name};
uint32_t checksum[4], calculated_checksum[4];
const char *ptr = data;
int ret = VKD3D_OK;
@@ -2036,7 +2038,7 @@ static int parse_dxbc(const char *data, size_t data_size, struct vkd3d_shader_me
if (data_size < VKD3D_DXBC_HEADER_SIZE)
{
WARN("Invalid data size %zu.\n", data_size);
- vkd3d_shader_error(message_context, VKD3D_SHADER_ERROR_DXBC_INVALID_SIZE,
+ vkd3d_shader_error(message_context, &location, VKD3D_SHADER_ERROR_DXBC_INVALID_SIZE,
"DXBC size %zu is smaller than the DXBC header size.", data_size);
return VKD3D_ERROR_INVALID_ARGUMENT;
}
@@ -2047,7 +2049,7 @@ static int parse_dxbc(const char *data, size_t data_size, struct vkd3d_shader_me
if (tag != TAG_DXBC)
{
WARN("Wrong tag.\n");
- vkd3d_shader_error(message_context, VKD3D_SHADER_ERROR_DXBC_INVALID_MAGIC, "Invalid DXBC magic.");
+ vkd3d_shader_error(message_context, &location, VKD3D_SHADER_ERROR_DXBC_INVALID_MAGIC, "Invalid DXBC magic.");
return VKD3D_ERROR_INVALID_ARGUMENT;
}
@@ -2063,7 +2065,8 @@ static int parse_dxbc(const char *data, size_t data_size, struct vkd3d_shader_me
checksum[0], checksum[1], checksum[2], checksum[3],
calculated_checksum[0], calculated_checksum[1],
calculated_checksum[2], calculated_checksum[3]);
- vkd3d_shader_error(message_context, VKD3D_SHADER_ERROR_DXBC_INVALID_CHECKSUM, "Invalid DXBC checksum.");
+ vkd3d_shader_error(message_context, &location, VKD3D_SHADER_ERROR_DXBC_INVALID_CHECKSUM,
+ "Invalid DXBC checksum.");
return VKD3D_ERROR_INVALID_ARGUMENT;
}
@@ -2072,7 +2075,7 @@ static int parse_dxbc(const char *data, size_t data_size, struct vkd3d_shader_me
if (version != 0x00000001)
{
WARN("Got unexpected DXBC version %#x.\n", version);
- vkd3d_shader_error(message_context, VKD3D_SHADER_ERROR_DXBC_INVALID_VERSION,
+ vkd3d_shader_error(message_context, &location, VKD3D_SHADER_ERROR_DXBC_INVALID_VERSION,
"DXBC version %#x is not supported.", version);
return VKD3D_ERROR_INVALID_ARGUMENT;
}
@@ -2095,7 +2098,7 @@ static int parse_dxbc(const char *data, size_t data_size, struct vkd3d_shader_me
if (chunk_offset >= data_size || !require_space(chunk_offset, 2, sizeof(DWORD), data_size))
{
WARN("Invalid chunk offset %#x (data size %zu).\n", chunk_offset, data_size);
- vkd3d_shader_error(message_context, VKD3D_SHADER_ERROR_DXBC_INVALID_CHUNK_OFFSET,
+ vkd3d_shader_error(message_context, &location, VKD3D_SHADER_ERROR_DXBC_INVALID_CHUNK_OFFSET,
"DXBC chunk %u has invalid offset %#x (data size %#zx).", i, chunk_offset, data_size);
return VKD3D_ERROR_INVALID_ARGUMENT;
}
@@ -2109,7 +2112,7 @@ static int parse_dxbc(const char *data, size_t data_size, struct vkd3d_shader_me
{
WARN("Invalid chunk size %#x (data size %zu, chunk offset %#x).\n",
chunk_size, data_size, chunk_offset);
- vkd3d_shader_error(message_context, VKD3D_SHADER_ERROR_DXBC_INVALID_CHUNK_SIZE,
+ vkd3d_shader_error(message_context, &location, VKD3D_SHADER_ERROR_DXBC_INVALID_CHUNK_SIZE,
"DXBC chunk %u has invalid size %#x (data size %#zx, chunk offset %#x).",
i, chunk_offset, data_size, chunk_offset);
return VKD3D_ERROR_INVALID_ARGUMENT;
@@ -2229,7 +2232,7 @@ int shader_parse_input_signature(const void *dxbc, size_t dxbc_length,
int ret;
memset(signature, 0, sizeof(*signature));
- if ((ret = parse_dxbc(dxbc, dxbc_length, message_context, isgn_handler, signature)) < 0)
+ if ((ret = parse_dxbc(dxbc, dxbc_length, message_context, NULL, isgn_handler, signature)) < 0)
ERR("Failed to parse input signature.\n");
return ret;
@@ -2304,7 +2307,7 @@ void free_shader_desc(struct vkd3d_shader_desc *desc)
}
int shader_extract_from_dxbc(const void *dxbc, size_t dxbc_length,
- struct vkd3d_shader_message_context *message_context, struct vkd3d_shader_desc *desc)
+ struct vkd3d_shader_message_context *message_context, const char *source_name, struct vkd3d_shader_desc *desc)
{
int ret;
@@ -2314,7 +2317,7 @@ int shader_extract_from_dxbc(const void *dxbc, size_t dxbc_length,
memset(&desc->output_signature, 0, sizeof(desc->output_signature));
memset(&desc->patch_constant_signature, 0, sizeof(desc->patch_constant_signature));
- ret = parse_dxbc(dxbc, dxbc_length, message_context, shdr_handler, desc);
+ ret = parse_dxbc(dxbc, dxbc_length, message_context, source_name, shdr_handler, desc);
if (!desc->byte_code)
ret = VKD3D_ERROR_INVALID_ARGUMENT;
@@ -2781,9 +2784,9 @@ int vkd3d_shader_parse_root_signature(const struct vkd3d_shader_code *dxbc,
memset(root_signature, 0, sizeof(*root_signature));
if (messages)
*messages = NULL;
- vkd3d_shader_message_context_init(&message_context, VKD3D_SHADER_LOG_INFO, NULL);
+ vkd3d_shader_message_context_init(&message_context, VKD3D_SHADER_LOG_INFO);
- ret = parse_dxbc(dxbc->code, dxbc->size, &message_context, rts0_handler, root_signature);
+ ret = parse_dxbc(dxbc->code, dxbc->size, &message_context, NULL, rts0_handler, root_signature);
vkd3d_shader_message_context_trace_messages(&message_context);
if (!vkd3d_shader_message_context_copy_messages(&message_context, messages))
ret = VKD3D_ERROR_OUT_OF_MEMORY;
@@ -2935,7 +2938,7 @@ static int shader_write_root_signature_header(struct root_signature_writer_conte
return VKD3D_OK;
fail:
- vkd3d_shader_error(&context->message_context, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY,
+ vkd3d_shader_error(&context->message_context, NULL, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY,
"Out of memory while writing root signature header.");
return VKD3D_ERROR_OUT_OF_MEMORY;
}
@@ -2963,7 +2966,7 @@ static int shader_write_descriptor_ranges(struct root_signature_writer_context *
return VKD3D_OK;
fail:
- vkd3d_shader_error(&context->message_context, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY,
+ vkd3d_shader_error(&context->message_context, NULL, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY,
"Out of memory while writing root signature descriptor ranges.");
return VKD3D_ERROR_OUT_OF_MEMORY;
}
@@ -2993,7 +2996,7 @@ static int shader_write_descriptor_ranges1(struct root_signature_writer_context
return VKD3D_OK;
fail:
- vkd3d_shader_error(&context->message_context, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY,
+ vkd3d_shader_error(&context->message_context, NULL, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY,
"Out of memory while writing root signature descriptor ranges.");
return VKD3D_ERROR_OUT_OF_MEMORY;
}
@@ -3009,7 +3012,7 @@ static int shader_write_descriptor_table(struct root_signature_writer_context *c
return shader_write_descriptor_ranges(context, table);
fail:
- vkd3d_shader_error(&context->message_context, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY,
+ vkd3d_shader_error(&context->message_context, NULL, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY,
"Out of memory while writing root signature root descriptor table.");
return VKD3D_ERROR_OUT_OF_MEMORY;
}
@@ -3025,7 +3028,7 @@ static int shader_write_descriptor_table1(struct root_signature_writer_context *
return shader_write_descriptor_ranges1(context, table);
fail:
- vkd3d_shader_error(&context->message_context, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY,
+ vkd3d_shader_error(&context->message_context, NULL, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY,
"Out of memory while writing root signature root descriptor table.");
return VKD3D_ERROR_OUT_OF_MEMORY;
}
@@ -3043,7 +3046,7 @@ static int shader_write_root_constants(struct root_signature_writer_context *con
return VKD3D_OK;
fail:
- vkd3d_shader_error(&context->message_context, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY,
+ vkd3d_shader_error(&context->message_context, NULL, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY,
"Out of memory while writing root signature root constants.");
return VKD3D_ERROR_OUT_OF_MEMORY;
}
@@ -3059,7 +3062,7 @@ static int shader_write_root_descriptor(struct root_signature_writer_context *co
return VKD3D_OK;
fail:
- vkd3d_shader_error(&context->message_context, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY,
+ vkd3d_shader_error(&context->message_context, NULL, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY,
"Out of memory while writing root signature root descriptor.");
return VKD3D_ERROR_OUT_OF_MEMORY;
}
@@ -3077,7 +3080,7 @@ static int shader_write_root_descriptor1(struct root_signature_writer_context *c
return VKD3D_OK;
fail:
- vkd3d_shader_error(&context->message_context, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY,
+ vkd3d_shader_error(&context->message_context, NULL, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY,
"Out of memory while writing root signature root descriptor.");
return VKD3D_ERROR_OUT_OF_MEMORY;
}
@@ -3126,7 +3129,7 @@ static int shader_write_root_parameters(struct root_signature_writer_context *co
break;
default:
FIXME("Unrecognized type %#x.\n", versioned_root_signature_get_parameter_type(desc, i));
- vkd3d_shader_error(&context->message_context, VKD3D_SHADER_ERROR_RS_INVALID_ROOT_PARAMETER_TYPE,
+ vkd3d_shader_error(&context->message_context, NULL, VKD3D_SHADER_ERROR_RS_INVALID_ROOT_PARAMETER_TYPE,
"Invalid/unrecognised root signature root parameter type %#x.",
versioned_root_signature_get_parameter_type(desc, i));
return VKD3D_ERROR_INVALID_ARGUMENT;
@@ -3139,7 +3142,7 @@ static int shader_write_root_parameters(struct root_signature_writer_context *co
return VKD3D_OK;
fail:
- vkd3d_shader_error(&context->message_context, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY,
+ vkd3d_shader_error(&context->message_context, NULL, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY,
"Out of memory while writing root signature root parameters.");
return VKD3D_ERROR_OUT_OF_MEMORY;
}
@@ -3183,7 +3186,7 @@ static int shader_write_static_samplers(struct root_signature_writer_context *co
return VKD3D_OK;
fail:
- vkd3d_shader_error(&context->message_context, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY,
+ vkd3d_shader_error(&context->message_context, NULL, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY,
"Out of memory while writing root signature static samplers.");
return VKD3D_ERROR_OUT_OF_MEMORY;
}
@@ -3218,7 +3221,7 @@ static int shader_write_root_signature(struct root_signature_writer_context *con
return shader_write_static_samplers(context, desc);
fail:
- vkd3d_shader_error(&context->message_context, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY,
+ vkd3d_shader_error(&context->message_context, NULL, VKD3D_SHADER_ERROR_RS_OUT_OF_MEMORY,
"Out of memory while writing root signature.");
return VKD3D_ERROR_OUT_OF_MEMORY;
}
@@ -3247,7 +3250,7 @@ static int validate_descriptor_table_v_1_0(const struct vkd3d_shader_root_descri
else
{
WARN("Invalid descriptor range type %#x.\n", r->range_type);
- vkd3d_shader_error(message_context, VKD3D_SHADER_ERROR_RS_INVALID_DESCRIPTOR_RANGE_TYPE,
+ vkd3d_shader_error(message_context, NULL, VKD3D_SHADER_ERROR_RS_INVALID_DESCRIPTOR_RANGE_TYPE,
"Invalid root signature descriptor range type %#x.", r->range_type);
return VKD3D_ERROR_INVALID_ARGUMENT;
}
@@ -3256,7 +3259,7 @@ static int validate_descriptor_table_v_1_0(const struct vkd3d_shader_root_descri
if (have_srv_uav_cbv && have_sampler)
{
WARN("Samplers cannot be mixed with CBVs/SRVs/UAVs in descriptor tables.\n");
- vkd3d_shader_error(message_context, VKD3D_SHADER_ERROR_RS_MIXED_DESCRIPTOR_RANGE_TYPES,
+ vkd3d_shader_error(message_context, NULL, VKD3D_SHADER_ERROR_RS_MIXED_DESCRIPTOR_RANGE_TYPES,
"Encountered both CBV/SRV/UAV and sampler descriptor ranges in the same root descriptor table.");
return VKD3D_ERROR_INVALID_ARGUMENT;
}
@@ -3288,7 +3291,7 @@ static int validate_descriptor_table_v_1_1(const struct vkd3d_shader_root_descri
else
{
WARN("Invalid descriptor range type %#x.\n", r->range_type);
- vkd3d_shader_error(message_context, VKD3D_SHADER_ERROR_RS_INVALID_DESCRIPTOR_RANGE_TYPE,
+ vkd3d_shader_error(message_context, NULL, VKD3D_SHADER_ERROR_RS_INVALID_DESCRIPTOR_RANGE_TYPE,
"Invalid root signature descriptor range type %#x.", r->range_type);
return VKD3D_ERROR_INVALID_ARGUMENT;
}
@@ -3297,7 +3300,7 @@ static int validate_descriptor_table_v_1_1(const struct vkd3d_shader_root_descri
if (have_srv_uav_cbv && have_sampler)
{
WARN("Samplers cannot be mixed with CBVs/SRVs/UAVs in descriptor tables.\n");
- vkd3d_shader_error(message_context, VKD3D_SHADER_ERROR_RS_MIXED_DESCRIPTOR_RANGE_TYPES,
+ vkd3d_shader_error(message_context, NULL, VKD3D_SHADER_ERROR_RS_MIXED_DESCRIPTOR_RANGE_TYPES,
"Encountered both CBV/SRV/UAV and sampler descriptor ranges in the same root descriptor table.");
return VKD3D_ERROR_INVALID_ARGUMENT;
}
@@ -3345,14 +3348,14 @@ int vkd3d_shader_serialize_root_signature(const struct vkd3d_shader_versioned_ro
*messages = NULL;
memset(&context, 0, sizeof(context));
- vkd3d_shader_message_context_init(&context.message_context, VKD3D_SHADER_LOG_INFO, NULL);
+ vkd3d_shader_message_context_init(&context.message_context, VKD3D_SHADER_LOG_INFO);
if (root_signature->version != VKD3D_SHADER_ROOT_SIGNATURE_VERSION_1_0
&& root_signature->version != VKD3D_SHADER_ROOT_SIGNATURE_VERSION_1_1)
{
ret = VKD3D_ERROR_INVALID_ARGUMENT;
WARN("Root signature version %#x not supported.\n", root_signature->version);
- vkd3d_shader_error(&context.message_context, VKD3D_SHADER_ERROR_RS_INVALID_VERSION,
+ vkd3d_shader_error(&context.message_context, NULL, VKD3D_SHADER_ERROR_RS_INVALID_VERSION,
"Root signature version %#x is not supported.", root_signature->version);
goto done;
}
diff --git a/libs/vkd3d-shader/spirv.c b/libs/vkd3d-shader/spirv.c
index cb9c7a12..61d0d472 100644
--- a/libs/vkd3d-shader/spirv.c
+++ b/libs/vkd3d-shader/spirv.c
@@ -2155,6 +2155,7 @@ struct vkd3d_dxbc_compiler
struct vkd3d_spirv_builder spirv_builder;
struct vkd3d_shader_message_context *message_context;
+ struct vkd3d_shader_location location;
bool failed;
bool strip_debug;
@@ -2245,6 +2246,8 @@ struct vkd3d_dxbc_compiler *vkd3d_dxbc_compiler_create(const struct vkd3d_shader
memset(compiler, 0, sizeof(*compiler));
compiler->message_context = message_context;
+ compiler->location.source_name = compile_info->source_name;
+ compiler->location.line = 2; /* Line 1 is the version token. */
if ((target_info = vkd3d_find_struct(compile_info->next, SPIRV_TARGET_INFO)))
{
@@ -2452,7 +2455,7 @@ static void VKD3D_PRINTF_FUNC(3, 4) vkd3d_dxbc_compiler_error(struct vkd3d_dxbc_
va_list args;
va_start(args, format);
- vkd3d_shader_verror(compiler->message_context, error, format, args);
+ vkd3d_shader_verror(compiler->message_context, &compiler->location, error, format, args);
va_end(args);
compiler->failed = true;
}
@@ -9194,6 +9197,7 @@ int vkd3d_dxbc_compiler_handle_instruction(struct vkd3d_dxbc_compiler *compiler,
FIXME("Unhandled instruction %#x.\n", instruction->handler_idx);
}
+ ++compiler->location.line;
return ret;
}
diff --git a/libs/vkd3d-shader/vkd3d_shader_main.c b/libs/vkd3d-shader/vkd3d_shader_main.c
index 2ea233bb..173ff170 100644
--- a/libs/vkd3d-shader/vkd3d_shader_main.c
+++ b/libs/vkd3d-shader/vkd3d_shader_main.c
@@ -108,13 +108,9 @@ void vkd3d_string_buffer_trace_(const struct vkd3d_string_buffer *buffer, const
}
void vkd3d_shader_message_context_init(struct vkd3d_shader_message_context *context,
- enum vkd3d_shader_log_level log_level, const char *source_name)
+ enum vkd3d_shader_log_level log_level)
{
context->log_level = log_level;
- context->source_name = source_name ? source_name : "<anonymous>";
- context->line = 0;
- context->column = 0;
-
vkd3d_string_buffer_init(&context->messages);
}
@@ -148,28 +144,37 @@ bool vkd3d_shader_message_context_copy_messages(struct vkd3d_shader_message_cont
return true;
}
-void vkd3d_shader_verror(struct vkd3d_shader_message_context *context,
+void vkd3d_shader_verror(struct vkd3d_shader_message_context *context, const struct vkd3d_shader_location *location,
enum vkd3d_shader_error error, const char *format, va_list args)
{
if (context->log_level < VKD3D_SHADER_LOG_ERROR)
return;
- if (context->line)
- vkd3d_string_buffer_printf(&context->messages, "%s:%u:%u: E%04u: ",
- context->source_name, context->line, context->column, error);
+ if (location)
+ {
+ const char *source_name = location->source_name ? location->source_name : "<anonymous>";
+
+ if (location->line)
+ vkd3d_string_buffer_printf(&context->messages, "%s:%u:%u: E%04u: ",
+ source_name, location->line, location->column, error);
+ else
+ vkd3d_string_buffer_printf(&context->messages, "%s: E%04u: ", source_name, error);
+ }
else
- vkd3d_string_buffer_printf(&context->messages, "%s: E%04u: ", context->source_name, error);
+ {
+ vkd3d_string_buffer_printf(&context->messages, "E%04u: ", error);
+ }
vkd3d_string_buffer_vprintf(&context->messages, format, args);
vkd3d_string_buffer_printf(&context->messages, "\n");
}
-void vkd3d_shader_error(struct vkd3d_shader_message_context *context,
+void vkd3d_shader_error(struct vkd3d_shader_message_context *context, const struct vkd3d_shader_location *location,
enum vkd3d_shader_error error, const char *format, ...)
{
va_list args;
va_start(args, format);
- vkd3d_shader_verror(context, error, format, args);
+ vkd3d_shader_verror(context, location, error, format, args);
va_end(args);
}
@@ -222,12 +227,13 @@ struct vkd3d_shader_parser
};
static int vkd3d_shader_parser_init(struct vkd3d_shader_parser *parser,
- const struct vkd3d_shader_code *dxbc, struct vkd3d_shader_message_context *message_context)
+ const struct vkd3d_shader_compile_info *compile_info, struct vkd3d_shader_message_context *message_context)
{
struct vkd3d_shader_desc *shader_desc = &parser->shader_desc;
int ret;
- if ((ret = shader_extract_from_dxbc(dxbc->code, dxbc->size, message_context, shader_desc)) < 0)
+ if ((ret = shader_extract_from_dxbc(compile_info->source.code, compile_info->source.size,
+ message_context, compile_info->source_name, shader_desc)) < 0)
{
WARN("Failed to extract shader, vkd3d result %d.\n", ret);
return ret;
@@ -307,6 +313,7 @@ struct vkd3d_shader_scan_context
size_t descriptors_size;
struct vkd3d_shader_message_context *message_context;
+ struct vkd3d_shader_location location;
struct vkd3d_shader_cf_info
{
@@ -332,12 +339,15 @@ struct vkd3d_shader_scan_context
};
static void vkd3d_shader_scan_context_init(struct vkd3d_shader_scan_context *context,
+ const struct vkd3d_shader_compile_info *compile_info,
struct vkd3d_shader_scan_descriptor_info *scan_descriptor_info,
struct vkd3d_shader_message_context *message_context)
{
memset(context, 0, sizeof(*context));
context->scan_descriptor_info = scan_descriptor_info;
context->message_context = message_context;
+ context->location.source_name = compile_info->source_name;
+ context->location.line = 2; /* Line 1 is the version token. */
}
static void vkd3d_shader_scan_context_cleanup(struct vkd3d_shader_scan_context *context)
@@ -606,7 +616,7 @@ static void vkd3d_shader_scan_error(struct vkd3d_shader_scan_context *context,
va_list args;
va_start(args, format);
- vkd3d_shader_verror(context->message_context, error, format, args);
+ vkd3d_shader_verror(context->message_context, &context->location, error, format, args);
va_end(args);
}
@@ -774,6 +784,7 @@ static int vkd3d_shader_scan_instruction(struct vkd3d_shader_scan_context *conte
if (vkd3d_shader_instruction_is_uav_counter(instruction))
vkd3d_shader_scan_record_uav_counter(context, &instruction->src[0].reg);
+ ++context->location.line;
return VKD3D_OK;
}
@@ -792,9 +803,9 @@ static int scan_dxbc(const struct vkd3d_shader_compile_info *compile_info,
scan_descriptor_info->descriptor_count = 0;
}
- vkd3d_shader_scan_context_init(&context, scan_descriptor_info, message_context);
+ vkd3d_shader_scan_context_init(&context, compile_info, scan_descriptor_info, message_context);
- if ((ret = vkd3d_shader_parser_init(&parser, &compile_info->source, message_context)) < 0)
+ if ((ret = vkd3d_shader_parser_init(&parser, compile_info, message_context)) < 0)
{
vkd3d_shader_scan_context_cleanup(&context);
return ret;
@@ -803,8 +814,6 @@ static int scan_dxbc(const struct vkd3d_shader_compile_info *compile_info,
if (TRACE_ON())
vkd3d_shader_trace(parser.data);
- message_context->line = 2; /* Line 1 is the version token. */
- message_context->column = 1;
while (!shader_sm4_is_end(parser.data, &parser.ptr))
{
shader_sm4_read_instruction(parser.data, &parser.ptr, &instruction);
@@ -824,7 +833,6 @@ static int scan_dxbc(const struct vkd3d_shader_compile_info *compile_info,
vkd3d_shader_free_scan_descriptor_info(scan_descriptor_info);
goto done;
}
- ++message_context->line;
}
ret = VKD3D_OK;
@@ -848,7 +856,7 @@ int vkd3d_shader_scan(const struct vkd3d_shader_compile_info *compile_info, char
if ((ret = vkd3d_shader_validate_compile_info(compile_info, true)) < 0)
return ret;
- vkd3d_shader_message_context_init(&message_context, compile_info->log_level, compile_info->source_name);
+ vkd3d_shader_message_context_init(&message_context, compile_info->log_level);
ret = scan_dxbc(compile_info, &message_context);
@@ -877,7 +885,7 @@ static int compile_dxbc_tpf(const struct vkd3d_shader_compile_info *compile_info
if ((ret = scan_dxbc(&scan_info, message_context)) < 0)
return ret;
- if ((ret = vkd3d_shader_parser_init(&parser, &compile_info->source, message_context)) < 0)
+ if ((ret = vkd3d_shader_parser_init(&parser, compile_info, message_context)) < 0)
{
vkd3d_shader_free_scan_descriptor_info(&scan_descriptor_info);
return ret;
@@ -902,8 +910,6 @@ static int compile_dxbc_tpf(const struct vkd3d_shader_compile_info *compile_info
return VKD3D_ERROR;
}
- message_context->line = 2; /* Line 1 is the version token. */
- message_context->column = 1;
while (!shader_sm4_is_end(parser.data, &parser.ptr))
{
shader_sm4_read_instruction(parser.data, &parser.ptr, &instruction);
@@ -917,7 +923,6 @@ static int compile_dxbc_tpf(const struct vkd3d_shader_compile_info *compile_info
if ((ret = vkd3d_dxbc_compiler_handle_instruction(spirv_compiler, &instruction)) < 0)
break;
- ++message_context->line;
}
if (ret >= 0)
@@ -949,7 +954,7 @@ int vkd3d_shader_compile(const struct vkd3d_shader_compile_info *compile_info,
if ((ret = vkd3d_shader_validate_compile_info(compile_info, true)) < 0)
return ret;
- vkd3d_shader_message_context_init(&message_context, compile_info->log_level, compile_info->source_name);
+ vkd3d_shader_message_context_init(&message_context, compile_info->log_level);
switch (compile_info->source_type)
{
@@ -1051,7 +1056,7 @@ int vkd3d_shader_parse_input_signature(const struct vkd3d_shader_code *dxbc,
if (messages)
*messages = NULL;
- vkd3d_shader_message_context_init(&message_context, VKD3D_SHADER_LOG_INFO, NULL);
+ vkd3d_shader_message_context_init(&message_context, VKD3D_SHADER_LOG_INFO);
ret = shader_parse_input_signature(dxbc->code, dxbc->size, &message_context, signature);
vkd3d_shader_message_context_trace_messages(&message_context);
@@ -1174,7 +1179,7 @@ int vkd3d_shader_preprocess(const struct vkd3d_shader_compile_info *compile_info
if ((ret = vkd3d_shader_validate_compile_info(compile_info, false)) < 0)
return ret;
- vkd3d_shader_message_context_init(&message_context, compile_info->log_level, compile_info->source_name);
+ vkd3d_shader_message_context_init(&message_context, compile_info->log_level);
ret = preproc_lexer_parse(compile_info, out, &message_context);
diff --git a/libs/vkd3d-shader/vkd3d_shader_private.h b/libs/vkd3d-shader/vkd3d_shader_private.h
index 83038384..e974b928 100644
--- a/libs/vkd3d-shader/vkd3d_shader_private.h
+++ b/libs/vkd3d-shader/vkd3d_shader_private.h
@@ -844,11 +844,15 @@ int vkd3d_string_buffer_printf(struct vkd3d_string_buffer *buffer,
void vkd3d_string_buffer_trace_(const struct vkd3d_string_buffer *buffer, const char *function) DECLSPEC_HIDDEN;
int vkd3d_string_buffer_vprintf(struct vkd3d_string_buffer *buffer, const char *format, va_list args) DECLSPEC_HIDDEN;
-struct vkd3d_shader_message_context
+struct vkd3d_shader_location
{
- enum vkd3d_shader_log_level log_level;
const char *source_name;
unsigned int line, column;
+};
+
+struct vkd3d_shader_message_context
+{
+ enum vkd3d_shader_log_level log_level;
struct vkd3d_string_buffer messages;
};
@@ -856,18 +860,19 @@ void vkd3d_shader_message_context_cleanup(struct vkd3d_shader_message_context *c
bool vkd3d_shader_message_context_copy_messages(struct vkd3d_shader_message_context *context,
char **out) DECLSPEC_HIDDEN;
void vkd3d_shader_message_context_init(struct vkd3d_shader_message_context *context,
- enum vkd3d_shader_log_level log_level, const char *source_name) DECLSPEC_HIDDEN;
+ enum vkd3d_shader_log_level log_level) DECLSPEC_HIDDEN;
void vkd3d_shader_message_context_trace_messages_(const struct vkd3d_shader_message_context *context,
const char *function) DECLSPEC_HIDDEN;
#define vkd3d_shader_message_context_trace_messages(context) \
vkd3d_shader_message_context_trace_messages_(context, __FUNCTION__)
-void vkd3d_shader_error(struct vkd3d_shader_message_context *context, enum vkd3d_shader_error error,
- const char *format, ...) VKD3D_PRINTF_FUNC(3, 4) DECLSPEC_HIDDEN;
-void vkd3d_shader_verror(struct vkd3d_shader_message_context *context,
+void vkd3d_shader_error(struct vkd3d_shader_message_context *context, const struct vkd3d_shader_location *location,
+ enum vkd3d_shader_error error, const char *format, ...) VKD3D_PRINTF_FUNC(4, 5) DECLSPEC_HIDDEN;
+void vkd3d_shader_verror(struct vkd3d_shader_message_context *context, const struct vkd3d_shader_location *location,
enum vkd3d_shader_error error, const char *format, va_list args) DECLSPEC_HIDDEN;
int shader_extract_from_dxbc(const void *dxbc, size_t dxbc_length,
- struct vkd3d_shader_message_context *message_context, struct vkd3d_shader_desc *desc) DECLSPEC_HIDDEN;
+ struct vkd3d_shader_message_context *message_context, const char *source_name,
+ struct vkd3d_shader_desc *desc) DECLSPEC_HIDDEN;
void free_shader_desc(struct vkd3d_shader_desc *desc) DECLSPEC_HIDDEN;
int shader_parse_input_signature(const void *dxbc, size_t dxbc_length,
--
2.29.2
Dec. 15, 2020
Re: [PATCH vkd3d 1/2] vkd3d-shader: Introduce a helper to report errors while scanning.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
Dec. 15, 2020
Re: [PATCH vkd3d] build: Create object directories before running bison or flex.
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
Dec. 15, 2020
Re: [PATCH vkd3d 2/2] vkd3d-shader: Move location tracking out of the vkd3d_shader_message_context structure.
by Henri Verbeet
On Tue, 15 Dec 2020 at 08:19, Zebediah Figura <zfigura(a)codeweavers.com> wrote:
>
> Includes a slight change in behaviour: parse_dxbc() and
> vkd3d_shader_serialize_root_signature() now print nothing instead of
> "<anonymous>".
>
It does a bit more than that. E.g., before this patch:
$ vkd3d-compiler -b d3d-asm invalid.dxbc
invalid.dxbc: E0003: Invalid DXBC checksum.
Failed to compile shader, ret -3.
After this patch, parse_dxbc() doesn't print source names at all.
Dec. 15, 2020
Re: TestBot news
by Francois Gouget
On Mon, 7 Dec 2020, Francois Gouget wrote:
[...]
> vm3 SSD
> -------
>
> The SSD of the vm3 host died last week so I moved its VMs to vm1 and
> vm4. That's part of why the TestBot was slow at the start of the week.
> The other reasons are:
[...]
> vm4's SSD is also on the brink of death according to smartctl so they'll
> both get new and bigger SSDs soon.
vm3 has a new SSD and is fully operational again. I moved the w1064 VM
back to it which will give a bit of breathing room to vm1.
vm4 also has a new SSD. It is also back on the 4.19 kernel + QEmu 3.1
[1] which matches the configuration of the other VM hosts . To do so I
had to change the pc-q35-5.0 machine to pc-q35-3.1 on w10pro64. As far
as I can tell this makes no difference to the guest.
I will certainly move back to QEmu 5.0 one day but for now it did not
seem to have any benefit. So sticking to QEmu 3.1 will avoid the "no
Spice client" audio bug [2] and avoid any issue when moving VMs created
on vm4 to the other hosts.
I also inadvertantly confirmed that the ntdll:exception crash is related
to the kernel version: it happens with 4.19.0-8 but not with 4.19.0-13.
Also this only impacts Windows 10: w7u never had any problem even with
4.19.0-8!
And while checking the WineTest results I noticed some getting this
error:
C:\Users\Public\Documents>winetest64-latest.exe -q -s exe64.report
The system cannot execute the specified program.
https://testbot.winehq.org/JobDetails.pl?Key=83433&f101=task.log#k101
https://testbot.winehq.org/JobDetails.pl?Key=83455&f101=task.log#k101
Yet Windows successfully ran WineTest just before. As far as I can tell
this only happens on Windows 10 so I suspect Windows Defender since it
does not seem possible to completely disable it on the recent versions.
But this is not systematic so it's going to be hard to confirm.
It also happened last week so it's not related to the latest vm3 and vm4
update.
[1] Instead of kernel 5.8 + QEmu 5.0
[2] https://www.winehq.org/pipermail/wine-devel/2020-November/177510.html
--
Francois Gouget <fgouget(a)codeweavers.com>
Dec. 15, 2020
[PATCH] po: Update Japanese translation.
by Akihiro Sagawa
Signed-off-by: Akihiro Sagawa <sagawa.aki(a)gmail.com>
---
po/ja.po | 34 +++++++++++++++++-----------------
1 file changed, 17 insertions(+), 17 deletions(-)
Dec. 15, 2020
[PATCH 2/2] wined3d: Avoid referencing empty command buffers in wined3d_query_event_vk_issue().
by Henri Verbeet
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
This fixes a deadlock in "Ryse: Son of Rome" when starting a new campaign.
dlls/wined3d/query.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/dlls/wined3d/query.c b/dlls/wined3d/query.c
index 9e0e22b32e5..4670bbfddff 100644
--- a/dlls/wined3d/query.c
+++ b/dlls/wined3d/query.c
@@ -1720,6 +1720,14 @@ static BOOL wined3d_query_event_vk_issue(struct wined3d_query *query, uint32_t f
{
context_vk = wined3d_context_vk(context_acquire(&device_vk->d, NULL, 0));
wined3d_context_vk_reference_query(context_vk, query_vk);
+ /* Because we don't actually submit any commands to the command buffer
+ * for event queries, the context's current command buffer may still
+ * be empty, and we should wait on the preceding command buffer
+ * instead. That's not merely an optimisation; if the command buffer
+ * referenced by the query is still empty by the time the application
+ * waits for it, that wait will never complete. */
+ if (!context_vk->current_command_buffer.vk_command_buffer)
+ --query_vk->command_buffer_id;
context_release(&context_vk->c);
return TRUE;
--
2.20.1
Dec. 15, 2020
[PATCH 1/2] wined3d: Zero-initialise context_vk in wined3d_context_vk_init().
by Henri Verbeet
wined3d_context_vk_init() assumes zero-initialised memory, but that's not
necessarily true in case we previously went through an
adapter_vk_init_3d()/adapter_vk_uninit_3d() pair.
Signed-off-by: Henri Verbeet <hverbeet(a)codeweavers.com>
---
This fixes a crash on startup with the Vulkan backend in Batman: Arkham
Origins.
dlls/wined3d/context_vk.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/dlls/wined3d/context_vk.c b/dlls/wined3d/context_vk.c
index 9db363172f1..2d80c59ca32 100644
--- a/dlls/wined3d/context_vk.c
+++ b/dlls/wined3d/context_vk.c
@@ -3158,6 +3158,7 @@ HRESULT wined3d_context_vk_init(struct wined3d_context_vk *context_vk, struct wi
TRACE("context_vk %p, swapchain %p.\n", context_vk, swapchain);
+ memset(context_vk, 0, sizeof(*context_vk));
wined3d_context_init(&context_vk->c, swapchain);
device_vk = wined3d_device_vk(swapchain->device);
adapter_vk = wined3d_adapter_vk(device_vk->d.adapter);
--
2.20.1
Dec. 15, 2020
[PATCH v2 4/4] fonts: Correct default glyph index for MS Sans Serif font to match Windows.
by Dmitry Timoshkov
This one doesn't depend on previous patches in the sequence.
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
fonts/ms_sans_serif.sfd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fonts/ms_sans_serif.sfd b/fonts/ms_sans_serif.sfd
index 751b35d064..e8c720b528 100644
--- a/fonts/ms_sans_serif.sfd
+++ b/fonts/ms_sans_serif.sfd
@@ -4,7 +4,7 @@ FullName: MS Sans Serif
FamilyName: MS Sans Serif
Weight: Medium
Copyright: Copyright (C) 2004 Huw D M Davies, Dmitry Timoshkov
-UComments: "#pragma makedep font ssee1255.fon -d 129 13,1255,5 16,1255,7 20,1255,8+AAoA#pragma makedep font ssee1256.fon -d 129 13,1256,5 16,1256,7 20,1256,8+AAoA#pragma makedep font ssee1257.fon -d 129 13,1257,5 16,1257,7 20,1257,8+AAoA#pragma makedep font ssee874.fon -d 129 13,874,5 16,874,7 20,874,8+AAoA#pragma makedep font ssef1255.fon -d 129 -r 120 16,1255,7 20,1255,8+AAoA#pragma makedep font ssef1256.fon -d 129 -r 120 16,1256,7 20,1256,8+AAoA#pragma makedep font ssef1257.fon -d 129 -r 120 16,1257,7 20,1257,8+AAoA#pragma makedep font ssef874.fon -d 129 -r 120 16,874,7 20,874,8+AAoA#pragma makedep font sserife.fon -d 129 13,1252,5 16,1252,7 20,1252,8+AAoA#pragma makedep font sserifee.fon -d 129 13,1250,5 16,1250,7+AAoA#pragma makedep font sserifeg.fon -d 129 13,1253,5 16,1253,7 20,1253,8 +AAoA#pragma makedep font sserifer.fon -d 129 13,1251,5 16,1251,7 20,1251,8+AAoA#pragma makedep font sserifet.fon -d 129 13,1254,5 16,1254,7 20,1254,8+AAoA#pragma makedep font sseriff.fon -d 129 -r 120 16,1252,7 20,1252,8+AAoA#pragma makedep font sseriffe.fon -d 129 -r 120 16,1250,7+AAoA#pragma makedep font sseriffg.fon -d 129 -r 120 16,1253,7 20,1253,8 +AAoA#pragma makedep font sseriffr.fon -d 129 -r 120 16,1251,7 20,1251,8+AAoA#pragma makedep font sserifft.fon -d 129 -r 120 16,1254,7 20,1254,8"
+UComments: "#pragma makedep font ssee1255.fon -d 129 13,1255,5 16,1255,7 20,1255,8+AAoA#pragma makedep font ssee1256.fon -d 129 13,1256,5 16,1256,7 20,1256,8+AAoA#pragma makedep font ssee1257.fon -d 128 13,1257,5 16,1257,7 20,1257,8+AAoA#pragma makedep font ssee874.fon -d 129 13,874,5 16,874,7 20,874,8+AAoA#pragma makedep font ssef1255.fon -d 129 -r 120 16,1255,7 20,1255,8+AAoA#pragma makedep font ssef1256.fon -d 129 -r 120 16,1256,7 20,1256,8+AAoA#pragma makedep font ssef1257.fon -d 128 -r 120 16,1257,7 20,1257,8+AAoA#pragma makedep font ssef874.fon -d 129 -r 120 16,874,7 20,874,8+AAoA#pragma makedep font sserife.fon -d 129 13,1252,5 16,1252,7 20,1252,8+AAoA#pragma makedep font sserifee.fon -d 128 13,1250,5 16,1250,7+AAoA#pragma makedep font sserifeg.fon -d 129 13,1253,5 16,1253,7 20,1253,8 +AAoA#pragma makedep font sserifer.fon -d 127 13,1251,5 16,1251,7 20,1251,8+AAoA#pragma makedep font sserifet.fon -d 129 13,1254,5 16,1254,7 20,1254,8+AAoA#pragma makedep font sseriff.fon -d 129 -r 120 16,1252,7 20,1252,8+AAoA#pragma makedep font sseriffe.fon -d 128 -r 120 16,1250,7+AAoA#pragma makedep font sseriffg.fon -d 129 -r 120 16,1253,7 20,1253,8 +AAoA#pragma makedep font sseriffr.fon -d 127 -r 120 16,1251,7 20,1251,8+AAoA#pragma makedep font sserifft.fon -d 129 -r 120 16,1254,7 20,1254,8"
Version: 001.000
ItalicAngle: 0
UnderlinePosition: -15753.8
--
2.29.2
Dec. 15, 2020
[PATCH v2 3/4] gdi32: Avoid best fit chars when mapping unicode character to a glyph index.
by Dmitry Timoshkov
This part fixes drawing text.
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/gdi32/font.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index 9380d3efbe..850bbaab19 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -2910,11 +2910,11 @@ static UINT get_glyph_index( struct gdi_font *font, UINT glyph )
glyph = get_glyph_index_symbol( font, wc );
if (!glyph)
{
- if (WideCharToMultiByte( CP_ACP, 0, &wc, 1, &ch, 1, NULL, NULL ))
+ if (WideCharToMultiByte( CP_ACP, WC_NO_BEST_FIT_CHARS, &wc, 1, &ch, 1, NULL, NULL ))
glyph = get_glyph_index_symbol( font, (unsigned char)ch );
}
}
- else if (WideCharToMultiByte( font->codepage, 0, &wc, 1, &ch, 1, NULL, &used ) && !used)
+ else if (WideCharToMultiByte( font->codepage, WC_NO_BEST_FIT_CHARS, &wc, 1, &ch, 1, NULL, &used ) && !used)
{
glyph = (unsigned char)ch;
font_funcs->get_glyph_index( font, &glyph, FALSE );
--
2.29.2
Dec. 15, 2020
[PATCH v2 2/4] gdi32: Avoid best fit chars when mapping unicode character to a glyph index.
by Dmitry Timoshkov
This part fixes GetGlyphIndices.
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/gdi32/font.c | 2 +-
dlls/gdi32/tests/font.c | 2 --
2 files changed, 1 insertion(+), 3 deletions(-)
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index 00bbeb0a11..9380d3efbe 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -3223,7 +3223,7 @@ static DWORD CDECL font_GetGlyphIndices( PHYSDEV dev, const WCHAR *str, INT coun
if (str[i] >= 0xf020 && str[i] <= 0xf100) glyph = str[i] - 0xf000;
else if (str[i] < 0x100) glyph = str[i];
}
- else if (WideCharToMultiByte( physdev->font->codepage, 0, &str[i], 1,
+ else if (WideCharToMultiByte( physdev->font->codepage, WC_NO_BEST_FIT_CHARS, &str[i], 1,
&ch, 1, NULL, &used ) && !used)
glyph = (unsigned char)ch;
}
diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c
index c630b65e5e..5eb069bf31 100644
--- a/dlls/gdi32/tests/font.c
+++ b/dlls/gdi32/tests/font.c
@@ -1690,14 +1690,12 @@ static void test_GetGlyphIndices(void)
charcount = GetGlyphIndicesW(hdc, c, ARRAY_SIZE(c), glyphs, GGI_MARK_NONEXISTING_GLYPHS);
ok(charcount == ARRAY_SIZE(c), "got %u\n", charcount);
ok(glyphs[0] == 0x001f || glyphs[0] == 0xffff /* Vista */, "got %#x\n", glyphs[0]);
-todo_wine
ok(glyphs[1] == 0x001f || glyphs[1] == 0xffff /* Vista */, "got %#x\n", glyphs[1]);
glyphs[0] = glyphs[1] = 0;
charcount = GetGlyphIndicesW(hdc, c, ARRAY_SIZE(c), glyphs, 0);
ok(charcount == ARRAY_SIZE(c), "got %u\n", charcount);
ok(glyphs[0] == textm.tmDefaultChar || glyphs[0] == 0x20 /* CJK Windows */, "got %#x\n", glyphs[0]);
-todo_wine
ok(glyphs[1] == textm.tmDefaultChar || glyphs[1] == 0x20 /* CJK Windows */, "got %#x\n", glyphs[1]);
DeleteObject(SelectObject(hdc, hOldFont));
--
2.29.2
Dec. 15, 2020
[PATCH v2 1/4] gdi32/tests: Add some tests to show that GetGlyphIndices() should avoid best fit chars.
by Dmitry Timoshkov
v2: Fix test failures under CJK Windows versions.
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/gdi32/tests/font.c | 41 ++++++++++++++++++++++++++++++++++++-----
1 file changed, 36 insertions(+), 5 deletions(-)
diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c
index 86ccddd05e..c630b65e5e 100644
--- a/dlls/gdi32/tests/font.c
+++ b/dlls/gdi32/tests/font.c
@@ -1634,6 +1634,7 @@ static void test_GetGlyphIndices(void)
LOGFONTA lf;
DWORD flags = 0;
WCHAR testtext[] = {'T','e','s','t',0xffff,0};
+ WCHAR c[] = { 0x25bc /* Black Down-Pointing Triangle */, 0x212a /* Kelvin Sign */ };
WORD glyphs[(sizeof(testtext)/2)-1];
TEXTMETRICA textm;
HFONT hOldFont;
@@ -1655,8 +1656,9 @@ static void test_GetGlyphIndices(void)
lf.lfCharSet = ANSI_CHARSET;
hfont = CreateFontIndirectA(&lf);
- ok(hfont != 0, "CreateFontIndirectEx failed\n");
- ok(GetTextMetricsA(hdc, &textm), "GetTextMetric failed\n");
+ ok(hfont != 0, "CreateFontIndirect failed\n");
+ hOldFont = SelectObject(hdc, hfont);
+ ok(GetTextMetricsA(hdc, &textm), "GetTextMetrics failed\n");
if (textm.tmCharSet == ANSI_CHARSET)
{
flags |= GGI_MARK_NONEXISTING_GLYPHS;
@@ -1666,16 +1668,44 @@ static void test_GetGlyphIndices(void)
flags = 0;
charcount = pGetGlyphIndicesW(hdc, testtext, (sizeof(testtext)/2)-1, glyphs, flags);
ok(charcount == 5, "GetGlyphIndicesW count of glyphs should = 5 not %d\n", charcount);
- ok(glyphs[4] == textm.tmDefaultChar, "GetGlyphIndicesW should have returned a %04x not %04x\n",
- textm.tmDefaultChar, glyphs[4]);
+ ok(glyphs[4] == textm.tmDefaultChar || glyphs[4] == 0x20 /* CJK Windows */,
+ "GetGlyphIndicesW should have returned a %04x not %04x\n", textm.tmDefaultChar, glyphs[4]);
}
else
/* FIXME: Write tests for non-ANSI charsets. */
skip("GetGlyphIndices System font tests only for ANSI_CHARSET\n");
+ DeleteObject(SelectObject(hdc, hOldFont));
+
+ memset(&lf, 0, sizeof(lf));
+ strcpy(lf.lfFaceName, "MS Sans Serif");
+ lf.lfHeight = -13;
+ lf.lfCharSet = DEFAULT_CHARSET;
+ hfont = CreateFontIndirectA(&lf);
+ ok(hfont != 0, "CreateFontIndirect failed\n");
+ hOldFont = SelectObject(hdc, hfont);
+ ok(GetTextMetricsA(hdc, &textm), "GetTextMetrics failed\n");
+
+ glyphs[0] = glyphs[1] = 0;
+ charcount = GetGlyphIndicesW(hdc, c, ARRAY_SIZE(c), glyphs, GGI_MARK_NONEXISTING_GLYPHS);
+ ok(charcount == ARRAY_SIZE(c), "got %u\n", charcount);
+ ok(glyphs[0] == 0x001f || glyphs[0] == 0xffff /* Vista */, "got %#x\n", glyphs[0]);
+todo_wine
+ ok(glyphs[1] == 0x001f || glyphs[1] == 0xffff /* Vista */, "got %#x\n", glyphs[1]);
+
+ glyphs[0] = glyphs[1] = 0;
+ charcount = GetGlyphIndicesW(hdc, c, ARRAY_SIZE(c), glyphs, 0);
+ ok(charcount == ARRAY_SIZE(c), "got %u\n", charcount);
+ ok(glyphs[0] == textm.tmDefaultChar || glyphs[0] == 0x20 /* CJK Windows */, "got %#x\n", glyphs[0]);
+todo_wine
+ ok(glyphs[1] == textm.tmDefaultChar || glyphs[1] == 0x20 /* CJK Windows */, "got %#x\n", glyphs[1]);
+
+ DeleteObject(SelectObject(hdc, hOldFont));
+
if(!is_font_installed("Tahoma"))
{
skip("Tahoma is not installed so skipping this test\n");
+ ReleaseDC(0, hdc);
return;
}
memset(&lf, 0, sizeof(lf));
@@ -1720,12 +1750,13 @@ static void test_GetGlyphIndices(void)
ok(glyphs[4] == 0, "GetGlyphIndicesW should have returned 0 not %04x\n", glyphs[4]);
DeleteObject(SelectObject(hdc, hOldFont));
+ ReleaseDC(0, hdc);
+
ret = pRemoveFontMemResourceEx(rsrc);
ok(ret, "RemoveFontMemResourceEx error %d\n", GetLastError());
free_font(font);
ret = DeleteFileA(ttf_name);
ok(ret, "Failed to delete font file, %d.\n", GetLastError());
-
}
static void test_GetKerningPairs(void)
--
2.29.2
Dec. 15, 2020
[PATCH v3 2/2] ntdll: Save unwind information in KiUserApcDispatcher() on x64.
by Paul Gofman
Signed-off-by: Paul Gofman <pgofman(a)codeweavers.com>
---
v2:
- fix build for other archs.
dlls/ntdll/tests/exception.c | 53 +++++++++++++++++++++++++++++++++
dlls/ntdll/thread.c | 28 ++++++++++++++++-
dlls/ntdll/unix/signal_x86_64.c | 23 ++++++++++++--
3 files changed, 101 insertions(+), 3 deletions(-)
diff --git a/dlls/ntdll/tests/exception.c b/dlls/ntdll/tests/exception.c
index 5686e39ab9e..3a0a5ac049c 100644
--- a/dlls/ntdll/tests/exception.c
+++ b/dlls/ntdll/tests/exception.c
@@ -37,6 +37,8 @@ static void *code_mem;
static NTSTATUS (WINAPI *pNtGetContextThread)(HANDLE,CONTEXT*);
static NTSTATUS (WINAPI *pNtSetContextThread)(HANDLE,CONTEXT*);
+static NTSTATUS (WINAPI *pNtQueueApcThread)(HANDLE handle, PNTAPCFUNC func,
+ ULONG_PTR arg1, ULONG_PTR arg2, ULONG_PTR arg3);
static NTSTATUS (WINAPI *pRtlRaiseException)(EXCEPTION_RECORD *rec);
static PVOID (WINAPI *pRtlUnwind)(PVOID, PVOID, PEXCEPTION_RECORD, PVOID);
static VOID (WINAPI *pRtlCaptureContext)(CONTEXT*);
@@ -4061,6 +4063,55 @@ static void test_nested_exception(void)
ok(got_prev_frame_exception, "Did not get nested exception in the previous frame.\n");
}
+static CONTEXT test_unwind_apc_context;
+static BOOL test_unwind_apc_called;
+
+static void CALLBACK test_unwind_apc(ULONG_PTR arg1, ULONG_PTR arg2, ULONG_PTR arg3)
+{
+ EXCEPTION_RECORD rec;
+
+ test_unwind_apc_called = TRUE;
+ memset(&rec, 0, sizeof(rec));
+ pRtlUnwind((void *)test_unwind_apc_context.Rsp, (void *)test_unwind_apc_context.Rip, &rec, (void *)0xdeadbeef);
+ ok(0, "Should not get here.\n");
+}
+
+static void test_unwind_from_apc(void)
+{
+ NTSTATUS status;
+ int pass;
+
+ if (!pNtQueueApcThread)
+ {
+ win_skip("NtQueueApcThread is not available.\n");
+ return;
+ }
+
+ pass = 0;
+ InterlockedIncrement(&pass);
+ RtlCaptureContext(&test_unwind_apc_context);
+ InterlockedIncrement(&pass);
+
+ if (pass == 2)
+ {
+ test_unwind_apc_called = FALSE;
+ status = pNtQueueApcThread(GetCurrentThread(), test_unwind_apc, 0, 0, 0);
+ ok(!status, "Got unexpected status %#x.\n", status);
+ SleepEx(0, TRUE);
+ ok(0, "Should not get here.\n");
+ }
+ if (pass == 3)
+ {
+ ok(test_unwind_apc_called, "Test user APC was not called.\n");
+ test_unwind_apc_called = FALSE;
+ status = pNtQueueApcThread(GetCurrentThread(), test_unwind_apc, 0, 0, 0);
+ ok(!status, "Got unexpected status %#x.\n", status);
+ NtContinue(&test_unwind_apc_context, TRUE );
+ ok(0, "Should not get here.\n");
+ }
+ ok(pass == 4, "Got unexpected pass %d.\n", pass);
+ ok(test_unwind_apc_called, "Test user APC was not called.\n");
+}
#elif defined(__arm__)
static void test_thread_context(void)
@@ -8073,6 +8124,7 @@ START_TEST(exception)
#define X(f) p##f = (void*)GetProcAddress(hntdll, #f)
X(NtGetContextThread);
X(NtSetContextThread);
+ X(NtQueueApcThread);
X(NtReadVirtualMemory);
X(NtClose);
X(RtlUnwind);
@@ -8241,6 +8293,7 @@ START_TEST(exception)
skip( "Dynamic unwind functions not found\n" );
test_extended_context();
test_copy_context();
+ test_unwind_from_apc();
#elif defined(__aarch64__)
diff --git a/dlls/ntdll/thread.c b/dlls/ntdll/thread.c
index 578c7a5436c..5bf456ec040 100644
--- a/dlls/ntdll/thread.c
+++ b/dlls/ntdll/thread.c
@@ -78,7 +78,7 @@ int __cdecl __wine_dbg_output( const char *str )
/*******************************************************************
* KiUserApcDispatcher (NTDLL.@)
*/
-void WINAPI KiUserApcDispatcher( CONTEXT *context, ULONG_PTR ctx, ULONG_PTR arg1, ULONG_PTR arg2,
+void WINAPI dispatch_apc( CONTEXT *context, ULONG_PTR ctx, ULONG_PTR arg1, ULONG_PTR arg2,
PNTAPCFUNC func )
{
func( ctx, arg1, arg2 );
@@ -86,6 +86,32 @@ void WINAPI KiUserApcDispatcher( CONTEXT *context, ULONG_PTR ctx, ULONG_PTR arg1
}
+#ifdef __x86_64__
+__ASM_GLOBAL_FUNC( KiUserApcDispatcher,
+ "addq $0x8,%rsp\n\t"
+ "mov 0x98(%rcx),%r10\n\t" /* context->Rsp */
+ "mov 0xf8(%rcx),%r11\n\t" /* context->Rip */
+ "mov %r11,-0x8(%r10)\n\t"
+ "mov %rbp,-0x10(%r10)\n\t"
+ "lea -0x10(%r10),%rbp\n\t"
+ __ASM_SEH(".seh_pushreg %rbp\n\t")
+ __ASM_SEH(".seh_setframe %rbp,0\n\t")
+ __ASM_SEH(".seh_endprologue\n\t")
+ __ASM_CFI(".cfi_signal_frame\n\t")
+ __ASM_CFI(".cfi_adjust_cfa_offset 0x10\n\t")
+ __ASM_CFI(".cfi_def_cfa %rbp,0x10\n\t")
+ __ASM_CFI(".cfi_rel_offset %rip,0x8\n\t")
+ __ASM_CFI(".cfi_rel_offset %rbp,0\n\t")
+ "call " __ASM_NAME("dispatch_apc") "\n\t"
+ "int3")
+#else
+void WINAPI KiUserApcDispatcher( CONTEXT *context, ULONG_PTR ctx, ULONG_PTR arg1, ULONG_PTR arg2,
+ PNTAPCFUNC func )
+{
+ dispatch_apc( context, ctx, arg1, arg2, func );
+}
+#endif
+
/***********************************************************************
* RtlExitUserThread (NTDLL.@)
*/
diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c
index 0fc7ad69584..290e275a86e 100644
--- a/dlls/ntdll/unix/signal_x86_64.c
+++ b/dlls/ntdll/unix/signal_x86_64.c
@@ -2077,9 +2077,28 @@ __ASM_GLOBAL_FUNC( call_user_apc_dispatcher,
"movq %r14,%r9\n" /* arg2 */
"movq $0,0x328(%rbx)\n\t" /* amd64_thread_data()->syscall_frame */
"movq %rsi,0x20(%rsp)\n\t" /* func */
- "movq 0xa0(%rcx),%rbp\n\t" /* context.Rbp */
+ "movq %rdi,%r10\n\t"
+ /* Set nonvolatile regs from context. */
+ "movq 0xa0(%rcx),%rbp\n\t"
+ "movq 0x90(%rcx),%rbx\n\t"
+ "movq 0xa8(%rcx),%rsi\n\t"
+ "movq 0xb0(%rcx),%rdi\n\t"
+ "movq 0xd8(%rcx),%r12\n\t"
+ "movq 0xe0(%rcx),%r13\n\t"
+ "movq 0xe8(%rcx),%r14\n\t"
+ "movq 0xf0(%rcx),%r15\n\t"
+ "movdqa 0x200(%rcx),%xmm6\n\t"
+ "movdqa 0x210(%rcx),%xmm7\n\t"
+ "movdqa 0x220(%rcx),%xmm8\n\t"
+ "movdqa 0x230(%rcx),%xmm9\n\t"
+ "movdqa 0x240(%rcx),%xmm10\n\t"
+ "movdqa 0x250(%rcx),%xmm11\n\t"
+ "movdqa 0x260(%rcx),%xmm12\n\t"
+ "movdqa 0x270(%rcx),%xmm13\n\t"
+ "movdqa 0x280(%rcx),%xmm14\n\t"
+ "movdqa 0x290(%rcx),%xmm15\n\t"
"pushq 0xf8(%rcx)\n\t" /* context.Rip */
- "jmp *%rdi" )
+ "jmp *%r10" )
/***********************************************************************
--
2.29.2
Dec. 15, 2020
[PATCH v3 1/2] ntdll: Always copy context in call_user_apc_dispatcher() on x64.
by Paul Gofman
Currently, if call_user_apc_dispatcher() is called with nonzero context,
there is no guarantee that the provided context is stored above the
rsp = context_ptr->Rsp - (sizeof(CONTEXT) + offsetof(frame,ret_addr))
being set.
Signed-off-by: Paul Gofman <pgofman(a)codeweavers.com>
---
v3:
- properly align / reserve stack for setup_user_apc_dispatcher_stack() call.
dlls/ntdll/unix/signal_x86_64.c | 62 +++++++++++++++++++++++++--------
1 file changed, 48 insertions(+), 14 deletions(-)
diff --git a/dlls/ntdll/unix/signal_x86_64.c b/dlls/ntdll/unix/signal_x86_64.c
index 359f2d7c361..0fc7ad69584 100644
--- a/dlls/ntdll/unix/signal_x86_64.c
+++ b/dlls/ntdll/unix/signal_x86_64.c
@@ -254,6 +254,22 @@ C_ASSERT((offsetof(struct stack_layout, xstate) == sizeof(struct stack_layout)))
C_ASSERT( sizeof(XSTATE) == 0x140 );
C_ASSERT( sizeof(struct stack_layout) == 0x5b0 ); /* Should match the size in call_user_exception_dispatcher(). */
+/* stack layout when calling an user apc function.
+ * FIXME: match Windows ABI. */
+struct apc_stack_layout
+{
+ ULONG64 save_regs[4];
+ void *func;
+ ULONG64 align;
+ CONTEXT context;
+ ULONG64 rbp;
+ ULONG64 rip;
+};
+
+/* Should match size and offset in call_user_apc_dispatcher(). */
+C_ASSERT( offsetof(struct apc_stack_layout, context) == 0x30 );
+C_ASSERT( sizeof(struct apc_stack_layout) == 0x510 );
+
struct syscall_frame
{
ULONG64 xmm[10 * 2]; /* xmm6-xmm15 */
@@ -270,6 +286,9 @@ struct syscall_frame
ULONG64 ret_addr;
};
+/* Should match the offset in call_user_apc_dispatcher(). */
+C_ASSERT( offsetof( struct syscall_frame, ret_addr ) == 0xf0);
+
struct amd64_thread_data
{
DWORD_PTR dr0; /* 02f0 debug registers */
@@ -2017,31 +2036,46 @@ static void setup_exception( ucontext_t *sigcontext, EXCEPTION_RECORD *rec )
/***********************************************************************
* call_user_apc_dispatcher
*/
+struct apc_stack_layout * WINAPI setup_user_apc_dispatcher_stack( CONTEXT *context, struct apc_stack_layout *stack )
+{
+ CONTEXT c;
+
+ if (!context)
+ {
+ c.ContextFlags = CONTEXT_FULL;
+ NtGetContextThread( GetCurrentThread(), &c );
+ context = &c;
+ }
+ memmove( &stack->context, context, sizeof(stack->context) );
+ return stack;
+}
+
__ASM_GLOBAL_FUNC( call_user_apc_dispatcher,
"movq 0x28(%rsp),%rsi\n\t" /* func */
"movq 0x30(%rsp),%rdi\n\t" /* dispatcher */
"movq %gs:0x30,%rbx\n\t"
- "jrcxz 1f\n\t"
- "movq 0x98(%rcx),%rax\n\t" /* context_ptr->Rsp */
- "leaq -0x5c0(%rax),%rsp\n\t" /* sizeof(CONTEXT) + offsetof(frame,ret_addr) */
- "andq $~15,%rsp\n\t"
- "jmp 2f\n"
- "1:\tmovq 0x328(%rbx),%rax\n\t" /* amd64_thread_data()->syscall_frame */
- "leaq -0x4d0(%rax),%rsp\n\t"
- "andq $~15,%rsp\n\t"
"movq %rdx,%r12\n\t" /* ctx */
"movq %r8,%r13\n\t" /* arg1 */
"movq %r9,%r14\n\t" /* arg2 */
- "movq %rsp,%rdx\n\t" /* context */
- "movl $0x10000b,0x30(%rdx)\n\t" /* context.ContextFlags */
- "movq $~1,%rcx\n\t"
- "call " __ASM_NAME("NtGetContextThread") "\n\t"
- "movq %rsp,%rcx\n\t" /* context */
+ "jrcxz 1f\n\t"
+ "movq 0x98(%rcx),%rdx\n\t" /* context->Rsp */
+ "jmp 2f\n\t"
+ "1:\tmovq 0x328(%rbx),%rax\n\t" /* amd64_thread_data()->syscall_frame */
+ "leaq 0xf0(%rax),%rdx\n\t" /* &amd64_thread_data()->syscall_frame->ret_addr */
+ "2:\tsubq $0x510,%rdx\n\t" /* sizeof(struct apc_stack_layout) */
+ "andq $~0xf,%rdx\n\t"
+ "addq $8,%rsp\n\t" /* pop return address */
+ "cmpq %rsp,%rdx\n\t"
+ "cmovbq %rdx,%rsp\n\t"
+ "subq $0x20,%rsp\n\t"
+ "call " __ASM_NAME("setup_user_apc_dispatcher_stack") "\n\t"
+ "movq %rax,%rsp\n\t"
+ "leaq 0x30(%rsp),%rcx\n\t" /* context */
"movq $0xc0,0x78(%rcx)\n\t" /* context.Rax = STATUS_USER_APC */
"movq %r12,%rdx\n\t" /* ctx */
"movq %r13,%r8\n\t" /* arg1 */
"movq %r14,%r9\n" /* arg2 */
- "2:\tmovq $0,0x328(%rbx)\n\t"
+ "movq $0,0x328(%rbx)\n\t" /* amd64_thread_data()->syscall_frame */
"movq %rsi,0x20(%rsp)\n\t" /* func */
"movq 0xa0(%rcx),%rbp\n\t" /* context.Rbp */
"pushq 0xf8(%rcx)\n\t" /* context.Rip */
--
2.29.2
Dec. 15, 2020
Re: [PATCH 2/3] gdi32: Avoid best fit chars when mapping unicode character to a glyph index.
by Marvin
Hi,
While running your changed tests, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=83438
Your paranoid android.
=== w10pro64_ja (64 bit report) ===
gdi32:
font.c:1671: Test failed: GetGlyphIndicesW should have returned a 0081 not 0020
font.c:1698: Test failed: got 0x20
font.c:1700: Test failed: got 0x20
=== w10pro64_zh_CN (64 bit report) ===
gdi32:
font.c:1698: Test failed: got 0x20
font.c:1700: Test failed: got 0x20
Dec. 15, 2020
Re: [PATCH 1/3] gdi32/tests: Add some tests to show that GetGlyphIndices() should avoid best fit chars.
by Marvin
Hi,
While running your changed tests, I think I found new failures.
Being a bot and all I'm not very good at pattern recognition, so I might be
wrong, but could you please double-check?
Full results can be found at:
https://testbot.winehq.org/JobDetails.pl?Key=83437
Your paranoid android.
=== w10pro64_ja (64 bit report) ===
gdi32:
font.c:1671: Test failed: GetGlyphIndicesW should have returned a 0081 not 0020
font.c:1700: Test failed: got 0x20
font.c:1702: Test failed: got 0x20
=== w10pro64_zh_CN (64 bit report) ===
gdi32:
font.c:1700: Test failed: got 0x20
font.c:1702: Test failed: got 0x20
Dec. 15, 2020
Dec. 15, 2020
Dec. 15, 2020
Dec. 15, 2020
[PATCH 3/3] fonts: Correct default glyph index for MS Sans Serif font to match Windows.
by Dmitry Timoshkov
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
fonts/ms_sans_serif.sfd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/fonts/ms_sans_serif.sfd b/fonts/ms_sans_serif.sfd
index 751b35d064..e8c720b528 100644
--- a/fonts/ms_sans_serif.sfd
+++ b/fonts/ms_sans_serif.sfd
@@ -4,7 +4,7 @@ FullName: MS Sans Serif
FamilyName: MS Sans Serif
Weight: Medium
Copyright: Copyright (C) 2004 Huw D M Davies, Dmitry Timoshkov
-UComments: "#pragma makedep font ssee1255.fon -d 129 13,1255,5 16,1255,7 20,1255,8+AAoA#pragma makedep font ssee1256.fon -d 129 13,1256,5 16,1256,7 20,1256,8+AAoA#pragma makedep font ssee1257.fon -d 129 13,1257,5 16,1257,7 20,1257,8+AAoA#pragma makedep font ssee874.fon -d 129 13,874,5 16,874,7 20,874,8+AAoA#pragma makedep font ssef1255.fon -d 129 -r 120 16,1255,7 20,1255,8+AAoA#pragma makedep font ssef1256.fon -d 129 -r 120 16,1256,7 20,1256,8+AAoA#pragma makedep font ssef1257.fon -d 129 -r 120 16,1257,7 20,1257,8+AAoA#pragma makedep font ssef874.fon -d 129 -r 120 16,874,7 20,874,8+AAoA#pragma makedep font sserife.fon -d 129 13,1252,5 16,1252,7 20,1252,8+AAoA#pragma makedep font sserifee.fon -d 129 13,1250,5 16,1250,7+AAoA#pragma makedep font sserifeg.fon -d 129 13,1253,5 16,1253,7 20,1253,8 +AAoA#pragma makedep font sserifer.fon -d 129 13,1251,5 16,1251,7 20,1251,8+AAoA#pragma makedep font sserifet.fon -d 129 13,1254,5 16,1254,7 20,1254,8+AAoA#pragma makedep font sseriff.fon -d 129 -r 120 16,1252,7 20,1252,8+AAoA#pragma makedep font sseriffe.fon -d 129 -r 120 16,1250,7+AAoA#pragma makedep font sseriffg.fon -d 129 -r 120 16,1253,7 20,1253,8 +AAoA#pragma makedep font sseriffr.fon -d 129 -r 120 16,1251,7 20,1251,8+AAoA#pragma makedep font sserifft.fon -d 129 -r 120 16,1254,7 20,1254,8"
+UComments: "#pragma makedep font ssee1255.fon -d 129 13,1255,5 16,1255,7 20,1255,8+AAoA#pragma makedep font ssee1256.fon -d 129 13,1256,5 16,1256,7 20,1256,8+AAoA#pragma makedep font ssee1257.fon -d 128 13,1257,5 16,1257,7 20,1257,8+AAoA#pragma makedep font ssee874.fon -d 129 13,874,5 16,874,7 20,874,8+AAoA#pragma makedep font ssef1255.fon -d 129 -r 120 16,1255,7 20,1255,8+AAoA#pragma makedep font ssef1256.fon -d 129 -r 120 16,1256,7 20,1256,8+AAoA#pragma makedep font ssef1257.fon -d 128 -r 120 16,1257,7 20,1257,8+AAoA#pragma makedep font ssef874.fon -d 129 -r 120 16,874,7 20,874,8+AAoA#pragma makedep font sserife.fon -d 129 13,1252,5 16,1252,7 20,1252,8+AAoA#pragma makedep font sserifee.fon -d 128 13,1250,5 16,1250,7+AAoA#pragma makedep font sserifeg.fon -d 129 13,1253,5 16,1253,7 20,1253,8 +AAoA#pragma makedep font sserifer.fon -d 127 13,1251,5 16,1251,7 20,1251,8+AAoA#pragma makedep font sserifet.fon -d 129 13,1254,5 16,1254,7 20,1254,8+AAoA#pragma makedep font sseriff.fon -d 129 -r 120 16,1252,7 20,1252,8+AAoA#pragma makedep font sseriffe.fon -d 128 -r 120 16,1250,7+AAoA#pragma makedep font sseriffg.fon -d 129 -r 120 16,1253,7 20,1253,8 +AAoA#pragma makedep font sseriffr.fon -d 127 -r 120 16,1251,7 20,1251,8+AAoA#pragma makedep font sserifft.fon -d 129 -r 120 16,1254,7 20,1254,8"
Version: 001.000
ItalicAngle: 0
UnderlinePosition: -15753.8
--
2.29.2
Dec. 15, 2020
[PATCH 2/3] gdi32: Avoid best fit chars when mapping unicode character to a glyph index.
by Dmitry Timoshkov
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/gdi32/font.c | 4 ++--
dlls/gdi32/tests/font.c | 2 --
2 files changed, 2 insertions(+), 4 deletions(-)
diff --git a/dlls/gdi32/font.c b/dlls/gdi32/font.c
index 00bbeb0a11..b8ba4258e9 100644
--- a/dlls/gdi32/font.c
+++ b/dlls/gdi32/font.c
@@ -2910,11 +2910,11 @@ static UINT get_glyph_index( struct gdi_font *font, UINT glyph )
glyph = get_glyph_index_symbol( font, wc );
if (!glyph)
{
- if (WideCharToMultiByte( CP_ACP, 0, &wc, 1, &ch, 1, NULL, NULL ))
+ if (WideCharToMultiByte( CP_ACP, WC_NO_BEST_FIT_CHARS, &wc, 1, &ch, 1, NULL, NULL ))
glyph = get_glyph_index_symbol( font, (unsigned char)ch );
}
}
- else if (WideCharToMultiByte( font->codepage, 0, &wc, 1, &ch, 1, NULL, &used ) && !used)
+ else if (WideCharToMultiByte( font->codepage, WC_NO_BEST_FIT_CHARS, &wc, 1, &ch, 1, NULL, &used ) && !used)
{
glyph = (unsigned char)ch;
font_funcs->get_glyph_index( font, &glyph, FALSE );
diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c
index dde41b501a..f6d2a49c91 100644
--- a/dlls/gdi32/tests/font.c
+++ b/dlls/gdi32/tests/font.c
@@ -1689,9 +1689,7 @@ static void test_GetGlyphIndices(void)
glyphs[0] = glyphs[1] = 0;
charcount = GetGlyphIndicesW(hdc, c, ARRAY_SIZE(c), glyphs, GGI_MARK_NONEXISTING_GLYPHS);
ok(charcount == ARRAY_SIZE(c), "got %u\n", charcount);
-todo_wine
ok(glyphs[0] == 0x001f || glyphs[0] == 0xffff /* Vista */, "got %#x\n", glyphs[0]);
-todo_wine
ok(glyphs[1] == 0x001f || glyphs[0] == 0xffff /* Vista */, "got %#x\n", glyphs[1]);
glyphs[0] = glyphs[1] = 0;
--
2.29.2
Dec. 15, 2020
[PATCH 1/3] gdi32/tests: Add some tests to show that GetGlyphIndices() should avoid best fit chars.
by Dmitry Timoshkov
Signed-off-by: Dmitry Timoshkov <dmitry(a)baikal.ru>
---
dlls/gdi32/tests/font.c | 38 +++++++++++++++++++++++++++++++++++---
1 file changed, 35 insertions(+), 3 deletions(-)
diff --git a/dlls/gdi32/tests/font.c b/dlls/gdi32/tests/font.c
index 86ccddd05e..dde41b501a 100644
--- a/dlls/gdi32/tests/font.c
+++ b/dlls/gdi32/tests/font.c
@@ -1634,6 +1634,7 @@ static void test_GetGlyphIndices(void)
LOGFONTA lf;
DWORD flags = 0;
WCHAR testtext[] = {'T','e','s','t',0xffff,0};
+ WCHAR c[] = { 0x25bc /* Black Down-Pointing Triangle */, 0x212a /* Kelvin Sign */ };
WORD glyphs[(sizeof(testtext)/2)-1];
TEXTMETRICA textm;
HFONT hOldFont;
@@ -1655,8 +1656,9 @@ static void test_GetGlyphIndices(void)
lf.lfCharSet = ANSI_CHARSET;
hfont = CreateFontIndirectA(&lf);
- ok(hfont != 0, "CreateFontIndirectEx failed\n");
- ok(GetTextMetricsA(hdc, &textm), "GetTextMetric failed\n");
+ ok(hfont != 0, "CreateFontIndirect failed\n");
+ hOldFont = SelectObject(hdc, hfont);
+ ok(GetTextMetricsA(hdc, &textm), "GetTextMetrics failed\n");
if (textm.tmCharSet == ANSI_CHARSET)
{
flags |= GGI_MARK_NONEXISTING_GLYPHS;
@@ -1673,9 +1675,38 @@ static void test_GetGlyphIndices(void)
/* FIXME: Write tests for non-ANSI charsets. */
skip("GetGlyphIndices System font tests only for ANSI_CHARSET\n");
+ DeleteObject(SelectObject(hdc, hOldFont));
+
+ memset(&lf, 0, sizeof(lf));
+ strcpy(lf.lfFaceName, "MS Sans Serif");
+ lf.lfHeight = -13;
+ lf.lfCharSet = DEFAULT_CHARSET;
+ hfont = CreateFontIndirectA(&lf);
+ ok(hfont != 0, "CreateFontIndirect failed\n");
+ hOldFont = SelectObject(hdc, hfont);
+ ok(GetTextMetricsA(hdc, &textm), "GetTextMetrics failed\n");
+
+ glyphs[0] = glyphs[1] = 0;
+ charcount = GetGlyphIndicesW(hdc, c, ARRAY_SIZE(c), glyphs, GGI_MARK_NONEXISTING_GLYPHS);
+ ok(charcount == ARRAY_SIZE(c), "got %u\n", charcount);
+todo_wine
+ ok(glyphs[0] == 0x001f || glyphs[0] == 0xffff /* Vista */, "got %#x\n", glyphs[0]);
+todo_wine
+ ok(glyphs[1] == 0x001f || glyphs[0] == 0xffff /* Vista */, "got %#x\n", glyphs[1]);
+
+ glyphs[0] = glyphs[1] = 0;
+ charcount = GetGlyphIndicesW(hdc, c, ARRAY_SIZE(c), glyphs, 0);
+ ok(charcount == ARRAY_SIZE(c), "got %u\n", charcount);
+ ok(glyphs[0] == textm.tmDefaultChar, "got %#x\n", glyphs[0]);
+todo_wine
+ ok(glyphs[1] == textm.tmDefaultChar, "got %#x\n", glyphs[1]);
+
+ DeleteObject(SelectObject(hdc, hOldFont));
+
if(!is_font_installed("Tahoma"))
{
skip("Tahoma is not installed so skipping this test\n");
+ ReleaseDC(0, hdc);
return;
}
memset(&lf, 0, sizeof(lf));
@@ -1720,12 +1751,13 @@ static void test_GetGlyphIndices(void)
ok(glyphs[4] == 0, "GetGlyphIndicesW should have returned 0 not %04x\n", glyphs[4]);
DeleteObject(SelectObject(hdc, hOldFont));
+ ReleaseDC(0, hdc);
+
ret = pRemoveFontMemResourceEx(rsrc);
ok(ret, "RemoveFontMemResourceEx error %d\n", GetLastError());
free_font(font);
ret = DeleteFileA(ttf_name);
ok(ret, "Failed to delete font file, %d.\n", GetLastError());
-
}
static void test_GetKerningPairs(void)
--
2.29.2
Dec. 15, 2020
[PATCH] po: Update Simplified Chinese translation.
by Jactry Zeng
Signed-off-by: Jactry Zeng <jzeng(a)codeweavers.com>
---
po/zh_CN.po | 228 ++++++++++++++++------------------------------------
1 file changed, 70 insertions(+), 158 deletions(-)
diff --git a/po/zh_CN.po b/po/zh_CN.po
index ae0d24b32c6..14771308488 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -5,14 +5,14 @@ msgstr ""
"Project-Id-Version: Wine\n"
"Report-Msgid-Bugs-To: https://bugs.winehq.org\n"
"POT-Creation-Date: N/A\n"
-"PO-Revision-Date: 2019-06-04 19:24-0600\n"
-"Last-Translator: Zixing Liu <liushuyu011(a)gmail.com>\n"
+"PO-Revision-Date: 2020-12-15 16:24+0800\n"
+"Last-Translator: Jactry Zeng <jzeng(a)codeweavers.com>\n"
"Language-Team: Chinese (PRC)\n"
"Language: zh_CN\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.2.1\n"
+"X-Generator: Poedit 2.4.2\n"
"Plural-Forms: nplurals=1; plural=0;\n"
#: dlls/appwiz.cpl/appwiz.rc:58
@@ -3686,7 +3686,7 @@ msgstr "游戏控制器"
#: dlls/joy.cpl/joy.rc:32
msgid "Test and configure game controllers."
-msgstr ""
+msgstr "测试和配置游戏控制器。"
#: dlls/jscript/jscript.rc:28
msgid "Error converting object to primitive type"
@@ -3701,10 +3701,8 @@ msgid "Subscript out of range"
msgstr "标记越界"
#: dlls/jscript/jscript.rc:31
-#, fuzzy
-#| msgid "Out of paper; "
msgid "Out of stack space"
-msgstr "缺纸;"
+msgstr "堆栈空间不足"
#: dlls/jscript/jscript.rc:32
msgid "Object required"
@@ -3843,16 +3841,12 @@ msgid "JScript object expected"
msgstr "期望得到 JScript 对象"
#: dlls/jscript/jscript.rc:63
-#, fuzzy
-#| msgid "Array object expected"
msgid "Enumerator object expected"
-msgstr "期望得到 Array 对象"
+msgstr "期望得到枚举器对象"
#: dlls/jscript/jscript.rc:64
-#, fuzzy
-#| msgid "Boolean object expected"
msgid "Regular Expression object expected"
-msgstr "期望得到布尔型对象"
+msgstr "期望得到正则表达式对象"
#: dlls/jscript/jscript.rc:65
msgid "Syntax error in regular expression"
@@ -6874,32 +6868,24 @@ msgid "Connection reset by peer.\n"
msgstr "连接被重置。\n"
#: dlls/kernel32/winerror.mc:3767
-#, fuzzy
-#| msgid "Not implemented"
msgid "Not implemented.\n"
-msgstr "尚未实现"
+msgstr "尚未实现。\n"
#: dlls/kernel32/winerror.mc:3788
-#, fuzzy
-#| msgid "RPC call failed.\n"
msgid "Call failed.\n"
-msgstr "RPC 调用失败。\n"
+msgstr "调用失败。\n"
#: dlls/kernel32/winerror.mc:3760
msgid "No Signature found in file.\n"
msgstr "未在文件内找到签名。\n"
#: dlls/kernel32/winerror.mc:3774
-#, fuzzy
-#| msgid "Invalid level.\n"
msgid "Invalid call.\n"
-msgstr "无效的级别。\n"
+msgstr "无效调用。\n"
#: dlls/kernel32/winerror.mc:3781
-#, fuzzy
-#| msgid "Value is not available.\n"
msgid "Resource is not currently available.\n"
-msgstr "值不可用。\n"
+msgstr "资源当前不可用。\n"
#: dlls/localspl/localspl.rc:31 dlls/localui/localui.rc:31
#: dlls/winspool.drv/winspool.rc:30
@@ -9838,16 +9824,12 @@ msgid "Iran Daylight Time"
msgstr "伊朗夏令时"
#: dlls/tzres/tzres.rc:204
-#, fuzzy
-#| msgid "Haiti Standard Time"
msgid "Saint Pierre Standard Time"
-msgstr "海地标准时间"
+msgstr "圣皮埃尔标准时间"
#: dlls/tzres/tzres.rc:205
-#, fuzzy
-#| msgid "Haiti Daylight Time"
msgid "Saint Pierre Daylight Time"
-msgstr "海地夏令时"
+msgstr "圣皮埃尔夏令时"
#: dlls/tzres/tzres.rc:170
msgid "Namibia Standard Time"
@@ -9890,16 +9872,12 @@ msgid "Central Asia Daylight Time"
msgstr "中亚夏令时"
#: dlls/tzres/tzres.rc:146
-#, fuzzy
-#| msgid "Korea Standard Time"
msgid "Lord Howe Standard Time"
-msgstr "韩国标准时间"
+msgstr "豪勋爵标准时间"
#: dlls/tzres/tzres.rc:147
-#, fuzzy
-#| msgid "Korea Daylight Time"
msgid "Lord Howe Daylight Time"
-msgstr "韩国夏令时"
+msgstr "豪勋爵夏令时"
#: dlls/tzres/tzres.rc:40
msgid "Arabic Standard Time"
@@ -9950,16 +9928,12 @@ msgid "Azerbaijan Daylight Time"
msgstr "阿塞拜疆夏令时"
#: dlls/tzres/tzres.rc:150
-#, fuzzy
-#| msgid "Magadan Standard Time"
msgid "Magallanes Standard Time"
-msgstr "马加丹标准时间"
+msgstr "麦哲伦标准时间"
#: dlls/tzres/tzres.rc:151
-#, fuzzy
-#| msgid "Magadan Daylight Time"
msgid "Magallanes Daylight Time"
-msgstr "马加丹夏令时"
+msgstr "麦哲伦夏令时"
#: dlls/tzres/tzres.rc:206
msgid "Samoa Standard Time"
@@ -10010,16 +9984,12 @@ msgid "Line Islands Daylight Time"
msgstr "莱恩群岛夏令时"
#: dlls/tzres/tzres.rc:92
-#, fuzzy
-#| msgid "China Standard Time"
msgid "Cuba Standard Time"
-msgstr "中国标准时间"
+msgstr "古巴标准时间"
#: dlls/tzres/tzres.rc:93
-#, fuzzy
-#| msgid "China Daylight Time"
msgid "Cuba Daylight Time"
-msgstr "中国夏令时"
+msgstr "古巴夏令时"
#: dlls/tzres/tzres.rc:136
msgid "Jordan Standard Time"
@@ -10218,16 +10188,12 @@ msgid "US Eastern Daylight Time"
msgstr "美国东部夏令时"
#: dlls/tzres/tzres.rc:182
-#, fuzzy
-#| msgid "Korea Standard Time"
msgid "North Korea Standard Time"
-msgstr "韩国标准时间"
+msgstr "朝鲜标准时间"
#: dlls/tzres/tzres.rc:183
-#, fuzzy
-#| msgid "Korea Daylight Time"
msgid "North Korea Daylight Time"
-msgstr "韩国夏令时"
+msgstr "朝鲜夏令时"
#: dlls/tzres/tzres.rc:220
msgid "Tasmania Standard Time"
@@ -10318,16 +10284,12 @@ msgid "Arabian Daylight Time"
msgstr "阿拉伯夏令时"
#: dlls/tzres/tzres.rc:222
-#, fuzzy
-#| msgid "Mountain Standard Time"
msgid "Tocantins Standard Time"
-msgstr "山地标准时间"
+msgstr "托坎廷斯标准时间"
#: dlls/tzres/tzres.rc:223
-#, fuzzy
-#| msgid "Mountain Daylight Time"
msgid "Tocantins Daylight Time"
-msgstr "山地夏令时"
+msgstr "托坎廷斯夏令时"
#: dlls/tzres/tzres.rc:196
msgid "Russian Standard Time"
@@ -10338,16 +10300,12 @@ msgid "Russian Daylight Time"
msgstr "俄罗斯夏令时"
#: dlls/tzres/tzres.rc:48
-#, fuzzy
-#| msgid "AUS Central Standard Time"
msgid "Aus Central W. Standard Time"
-msgstr "澳大利亚中部标准时间"
+msgstr "澳大利亚中西部标准时间"
#: dlls/tzres/tzres.rc:49
-#, fuzzy
-#| msgid "AUS Central Daylight Time"
msgid "Aus Central W. Daylight Time"
-msgstr "澳大利亚中部夏令时"
+msgstr "澳大利亚中西部夏令时"
#: dlls/tzres/tzres.rc:194
msgid "Romance Standard Time"
@@ -10566,16 +10524,12 @@ msgid "Egypt Daylight Time"
msgstr "埃及夏令时"
#: dlls/tzres/tzres.rc:106
-#, fuzzy
-#| msgid "Central Standard Time (Mexico)"
msgid "Eastern Standard Time (Mexico)"
-msgstr "中部标准时间(墨西哥)"
+msgstr "东部标准时间(墨西哥)"
#: dlls/tzres/tzres.rc:107
-#, fuzzy
-#| msgid "Central Daylight Time (Mexico)"
msgid "Eastern Daylight Time (Mexico)"
-msgstr "中部夏令时(墨西哥)"
+msgstr "东部夏令时(墨西哥)"
#: dlls/tzres/tzres.rc:154
msgid "Mauritius Standard Time"
@@ -10780,153 +10734,115 @@ msgstr "更多窗口(&M)..."
#: dlls/vbscript/vbscript.rc:30
msgid "Overflow"
-msgstr ""
+msgstr "溢出"
#: dlls/vbscript/vbscript.rc:31
-#, fuzzy
-#| msgid "Out of memory."
msgid "Out of memory"
-msgstr "内存不足。"
+msgstr "内存不足"
#: dlls/vbscript/vbscript.rc:33
msgid "This array is fixed or temporarily locked"
-msgstr ""
+msgstr "该数组为固定数组或已被临时锁定"
#: dlls/vbscript/vbscript.rc:34
-#, fuzzy
-#| msgid "Data type mismatch.\n"
msgid "Type mismatch"
-msgstr "数据类型不匹配。\n"
+msgstr "类型不匹配"
#: dlls/vbscript/vbscript.rc:36
-#, fuzzy
-#| msgid "I/O device error.\n"
msgid "Device I/O error"
-msgstr "I/O 设备错误。\n"
+msgstr "设备 I/O 错误"
#: dlls/vbscript/vbscript.rc:37
-#, fuzzy
-#| msgid "File already exists.\n"
msgid "File already exists"
-msgstr "文件已存在。\n"
+msgstr "文件已存在"
#: dlls/vbscript/vbscript.rc:38
-#, fuzzy
-#| msgid "Disk full.\n"
msgid "Disk full"
-msgstr "磁盘满。\n"
+msgstr "磁盘已满"
#: dlls/vbscript/vbscript.rc:39
-#, fuzzy
-#| msgid "Too many open files.\n"
msgid "Too many files"
-msgstr "太多打开的文件。\n"
+msgstr "太多文件"
#: dlls/vbscript/vbscript.rc:40
-#, fuzzy
-#| msgid "Access denied.\n"
msgid "Permission denied"
-msgstr "访问被拒绝。\n"
+msgstr "没有权限"
#: dlls/vbscript/vbscript.rc:41
msgid "Path/File access error"
-msgstr ""
+msgstr "路径/文件访问出错"
#: dlls/vbscript/vbscript.rc:42
-#, fuzzy
-#| msgid "Path not found.\n"
msgid "Path not found"
-msgstr "找不到路径。\n"
+msgstr "找不到路径"
#: dlls/vbscript/vbscript.rc:43
-#, fuzzy
-#| msgid "(value not set)"
msgid "Object variable not set"
-msgstr "(没有设值)"
+msgstr "未设置对象变量"
#: dlls/vbscript/vbscript.rc:44
-#, fuzzy
-#| msgid "Invalid user buffer.\n"
msgid "Invalid use of Null"
-msgstr "用户缓冲区无效。\n"
+msgstr "Null 使用无效"
#: dlls/vbscript/vbscript.rc:45
msgid "Can't create necessary temporary file"
-msgstr ""
+msgstr "无法创建必要的临时文件"
#: dlls/vbscript/vbscript.rc:46
-#, fuzzy
-#| msgid "Automation server can't create object"
msgid "ActiveX component can't create object"
-msgstr "自动化服务器无法创建对象"
+msgstr "ActiveX 组件无法创建对象"
#: dlls/vbscript/vbscript.rc:47
-#, fuzzy
-#| msgid "Object doesn't support this action"
msgid "Class doesn't support Automation"
-msgstr "对象不支持此动作"
+msgstr "类不支持自动化"
#: dlls/vbscript/vbscript.rc:48
msgid "File name or class name not found during Automation operation"
-msgstr ""
+msgstr "自动化操作期间无法找到文件名或类名"
#: dlls/vbscript/vbscript.rc:51
-#, fuzzy
-#| msgid "Object doesn't support this action"
msgid "Object doesn't support named arguments"
-msgstr "对象不支持此动作"
+msgstr "对象不支持命名参数"
#: dlls/vbscript/vbscript.rc:52
-#, fuzzy
-#| msgid "Object doesn't support this action"
msgid "Object doesn't support current locale setting"
-msgstr "对象不支持此动作"
+msgstr "对象不支持当前 locale 设置"
#: dlls/vbscript/vbscript.rc:53 dlls/vbscript/vbscript.rc:54
-#, fuzzy
-#| msgid "Element not found.\n"
msgid "Named argument not found"
-msgstr "找不到元素。\n"
+msgstr "未找到命名参数"
#: dlls/vbscript/vbscript.rc:55
msgid "Wrong number of arguments or invalid property assignment"
-msgstr ""
+msgstr "参数数量错误或无效的指定属性"
#: dlls/vbscript/vbscript.rc:56
-#, fuzzy
-#| msgid "Object Class Violation"
msgid "Object not a collection"
-msgstr "对象类冲突"
+msgstr "对象不是集合"
#: dlls/vbscript/vbscript.rc:57
-#, fuzzy
-#| msgid "Specified control was not found in message"
msgid "Specified DLL function not found"
-msgstr "消息中找不到指定的控制"
+msgstr "未找到指定的 DLL 函数"
#: dlls/vbscript/vbscript.rc:58
msgid "Variable uses an Automation type not supported in VBScript"
-msgstr ""
+msgstr "变量使用了 VBScript 中不支持的自动化类型"
#: dlls/vbscript/vbscript.rc:59
msgid "The remote server machine does not exist or is unavailable"
-msgstr ""
+msgstr "远程服务器不存在或不可用"
#: dlls/vbscript/vbscript.rc:60
msgid "Invalid or unqualified reference"
-msgstr ""
+msgstr "无效或不合格引用"
#: dlls/vbscript/vbscript.rc:62
-#, fuzzy
-#| msgid "Microsoft JScript compilation error"
msgid "Microsoft VBScript compilation error"
-msgstr "Microsoft JScript 编译错误"
+msgstr "Microsoft VBScript 编译错误"
#: dlls/vbscript/vbscript.rc:63
-#, fuzzy
-#| msgid "Microsoft JScript runtime error"
msgid "Microsoft VBScript runtime error"
-msgstr "Microsoft JScript 运行时错误"
+msgstr "Microsoft VBScript 运行时错误"
#: dlls/winemac.drv/winemac.rc:33
msgid "Hide %@"
@@ -11023,33 +10939,27 @@ msgstr "证书至少带有一个不明安全问题。"
#: dlls/wininet/wininet.rc:35
msgid "Effective Date"
-msgstr ""
+msgstr "生效日期"
#: dlls/wininet/wininet.rc:37
-#, fuzzy
-#| msgid "Security"
msgid "Security Protocol"
-msgstr "安全"
+msgstr "安全协议"
#: dlls/wininet/wininet.rc:38
-#, fuzzy
-#| msgid "Signature"
msgid "Signature Type"
-msgstr "签名"
+msgstr "签名类型"
#: dlls/wininet/wininet.rc:39
-#, fuzzy
-#| msgid "Encrypting File System"
msgid "Encryption Type"
-msgstr "正在加密文件系統"
+msgstr "加密类型"
#: dlls/wininet/wininet.rc:40
msgid "Privacy Strength"
-msgstr ""
+msgstr "隐私级别"
#: dlls/wininet/wininet.rc:43
msgid "bits"
-msgstr ""
+msgstr "bits"
#: dlls/wininet/winineterror.mc:26
msgid "The request has timed out.\n"
@@ -12937,6 +12847,9 @@ msgid ""
"\n"
"hardlink hardlink management\n"
msgstr ""
+"- 支持命令 -\n"
+"\n"
+"hardlink 硬链接管理\n"
#: programs/fsutil/fsutil.mc:35
msgid ""
@@ -12944,10 +12857,13 @@ msgid ""
"\n"
"create create a hardlink\n"
msgstr ""
+"- Hardlink - 支持命令 -\n"
+"\n"
+"create 创建硬链接\n"
#: programs/fsutil/fsutil.mc:40
msgid "Syntax: fsutil hardlink create <new> <existing>\n"
-msgstr ""
+msgstr "语法:fsutil hardlink create <new> <existing>\n"
#: programs/hostname/hostname.rc:30
msgid "Usage: hostname\n"
@@ -16713,10 +16629,8 @@ msgid "&Beginner"
msgstr "初学者(&B)"
#: programs/winemine/winemine.rc:45
-#, fuzzy
-#| msgid "Interface"
msgid "&Intermediate"
-msgstr "接口"
+msgstr "&中等"
#: programs/winemine/winemine.rc:46
msgid "&Expert"
@@ -16747,10 +16661,8 @@ msgid "Beginner"
msgstr "初学者"
#: programs/winemine/winemine.rc:65
-#, fuzzy
-#| msgid "Interface"
msgid "Intermediate"
-msgstr "接口"
+msgstr "中等"
#: programs/winemine/winemine.rc:66
msgid "Expert"
--
2.29.2
Dec. 15, 2020