Compare commits

..

42 Commits

Author SHA1 Message Date
Alistair Leslie-Hughes
946648d13f Release v10.3 2025-03-08 15:02:32 +11:00
Alistair Leslie-Hughes
d9670d89d1 Added msxml3-whitespace patchset 2025-03-08 13:47:30 +11:00
Alistair Leslie-Hughes
4914f150c5 Updated vkd3d-latest patchset 2025-03-07 10:10:10 +11:00
Alistair Leslie-Hughes
0af25de63c Rebase against 1f947b1c62c4f6fdfad4da812567cf33c904c1eb. 2025-03-07 10:09:45 +11:00
Elizabeth Figura
0682c26496 Rebase against 6e6334d4293b235fe11f05c556acf6cecb173412. 2025-03-03 16:36:08 -06:00
Elizabeth Figura
db49cb3767 Rebase against d17225a89cfb45988a89f60803756e7df4e68cc5. 2025-02-28 17:27:03 -06:00
Elizabeth Figura
6f8931b39a Rebase against 0bf15e3e0715ebda735e9857cbcb36ebc491293f. 2025-02-27 16:34:34 -06:00
Elizabeth Figura
0e1220c76d d3dx9_36-DDS: Rebase and re-enable.
Patch 0001 was implemented upstream by ee4ad2a0a460cf9737c7d0d6057b57528e8ea912.
2025-02-27 16:01:51 -06:00
Elizabeth Figura
acb3c0bb3c server-Realtime_Priority: Remove patch set.
This functionality was introduced upstream by 945efda7fe4c95276a1c64a8d10368726d834937.
2025-02-27 16:01:44 -06:00
Alistair Leslie-Hughes
a381f356d6 Updated vkd3d-latest patchset 2025-02-27 09:47:00 +11:00
Alistair Leslie-Hughes
b69d02ba02 Rebase against 32a81ee2135c67e393e49cce60ef8ebfbaefb531. 2025-02-27 09:44:42 +11:00
Alistair Leslie-Hughes
3546551685 Updated vkd3d-latest patchset 2025-02-25 12:01:15 +11:00
Alistair Leslie-Hughes
2439dab96c Rebase against 4c06d354b8093a8979316186474213bbc1c68904. 2025-02-25 10:37:42 +11:00
Alistair Leslie-Hughes
f5190ef988 Removed upstream patches 2025-02-23 17:47:18 +11:00
Alistair Leslie-Hughes
ec5fbb99b7 Rebase against e1b8e7f6ec755afd251a3b7af0e632c6e4d74a64. 2025-02-23 08:27:19 +11:00
Alistair Leslie-Hughes
857466ad4c Release v10.2 2025-02-23 08:13:03 +11:00
Alistair Leslie-Hughes
4378292a65 Rebase against 4bd044dd32818166d42a9262411a1ae7ef42cc07. 2025-02-21 09:44:20 +11:00
Alistair Leslie-Hughes
c2e4c17811 Rebase against 94dc1f470cc7adfee75cb0718e953ca1954599ef. 2025-02-20 10:50:18 +11:00
Alistair Leslie-Hughes
34a7d5e858 Updated vkd3d-latest patchset 2025-02-20 07:22:00 +11:00
Alistair Leslie-Hughes
a4e8224bd8 Rebase against a46043015322bf8e6c78a74bd33300f3478767e3. 2025-02-19 09:43:59 +11:00
Alistair Leslie-Hughes
1b224000ac Added ws2_32-af_unix patchset 2025-02-18 13:57:31 +11:00
Alistair Leslie-Hughes
2b9cd3663b Updated vkd3d-latest patchset 2025-02-18 09:01:06 +11:00
Elizabeth Figura
4901d72e77 Rebase against 59720e7d1b88ed519569135542aa55145a2a6ff7. 2025-02-17 15:39:12 -06:00
Alistair Leslie-Hughes
735225dbaa Rebase against 17915f730267b2b50550636fb6928a6ace247ccd. 2025-02-13 21:20:46 +11:00
Alistair Leslie-Hughes
7042b486e2 Rebase against 7b8663e465e92fb2c1052fd8ad47f0dcbf37a83c. 2025-02-11 11:19:10 +11:00
Dean M Greer
4ef147fbe5 macOS.yml: fix-up action 2025-02-10 23:20:41 +00:00
Alistair Leslie-Hughes
7b9777c23e Release v10.1 2025-02-09 18:37:10 +11:00
Alistair Leslie-Hughes
aed0bcfb83 Rebase against a1dddd902f21e3a5057a40cb9848351f0cbcfd82. 2025-02-09 18:37:05 +11:00
Alistair Leslie-Hughes
22f5ea5e4f Rebase against a47a9f39d1e9d19a7931cdc254a9cd68c1ed6fef. 2025-02-07 10:29:46 +11:00
Alistair Leslie-Hughes
7f5729fc14 Updated vkd3d-latest patchset 2025-02-04 10:23:08 +11:00
Alistair Leslie-Hughes
7fda13a16d Rebase against 40b0ede26e317bb994bf0b85ea37c7dab074e9f1. 2025-02-04 10:22:36 +11:00
Alistair Leslie-Hughes
667ee8a4ff Added oleaut32_VarAdd patchset 2025-01-24 20:23:21 +11:00
Alistair Leslie-Hughes
b45a0aead3 Added d2d1_ID2D1GeometryGroup patchset 2025-01-24 10:29:21 +11:00
Alistair Leslie-Hughes
36483a9c11 Added shell32_enumerableobejct patchset 2025-01-24 09:10:08 +11:00
Alistair Leslie-Hughes
28834e80f8 Added richedit20-ImportDataObject patchset 2025-01-24 08:51:23 +11:00
Alistair Leslie-Hughes
49770c6bc6 Added mf_http_support patchset 2025-01-24 07:45:00 +11:00
Alistair Leslie-Hughes
93f5b4f6a0 Added vbscript_join patchset 2025-01-24 07:44:13 +11:00
Alistair Leslie-Hughes
e452a6cbdc Added vbscript-classes patchset 2025-01-24 07:43:33 +11:00
Alistair Leslie-Hughes
23ccc2eef1 Rebase against ff2de2a73b830a601cfe26aca5feeafb309fbff5. 2025-01-23 09:01:50 +11:00
Alistair Leslie-Hughes
18f976c338 Updated vkd3d-latest patchset 2025-01-23 08:14:29 +11:00
Alistair Leslie-Hughes
05bc4b822f Release v10.0 2025-01-22 07:26:21 +11:00
Alistair Leslie-Hughes
177488c071 Updated vkd3d-latest patchset 2025-01-22 07:09:50 +11:00
80 changed files with 14874 additions and 24867 deletions

View File

@@ -20,7 +20,6 @@ jobs:
bison \
gphoto2 \
gstreamer \
gcenx/wine/libinotify-kqueue \
mingw-w64 \
molten-vk \
sdl2
@@ -44,10 +43,11 @@ jobs:
cd wine
$GITHUB_WORKSPACE/staging/patchinstall.py DESTDIR=. --all
- name: Configure wine64
- name: Configure wine
env:
LDFLAGS: "-Wl,-rpath,/opt/X11/lib"
# Avoid weird linker errors with Xcode 10 and later
# We need to tell the linker to add brew & Xquarts to the rpath stack.
LDFLAGS: "-Wl,-rpath,/usr/local/lib -Wl,-rpath,/opt/X11/lib"
# Use an older deployment target to avoid new dyld behaviors.
MACOSX_DEPLOYMENT_TARGET: "10.14"
run: |
cd $GITHUB_WORKSPACE/wine

View File

@@ -0,0 +1,267 @@
From e4d55d451648b67c9269241efce8eee63faf70a4 Mon Sep 17 00:00:00 2001
From: Philipp Knechtges <philipp-dev@knechtges.com>
Date: Fri, 13 Sep 2024 11:16:44 +0200
Subject: [PATCH] d2d1: Add tests for drawing ID2D1GeometryGroup
The functionality to draw ID2D1GeometryGroup is currently missing.
Nothing is drawn. This causes the blank pages in the bug below.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51139
---
dlls/d2d1/tests/d2d1.c | 219 +++++++++++++++++++++++++++++++++++++++++
1 file changed, 219 insertions(+)
diff --git a/dlls/d2d1/tests/d2d1.c b/dlls/d2d1/tests/d2d1.c
index 40bcf5079b8..41b36ef0dd5 100644
--- a/dlls/d2d1/tests/d2d1.c
+++ b/dlls/d2d1/tests/d2d1.c
@@ -7061,6 +7061,7 @@ static void test_gradient(BOOL d3d11)
static void test_draw_geometry(BOOL d3d11)
{
ID2D1TransformedGeometry *transformed_geometry[4];
+ ID2D1GeometryGroup *geometry_group;
ID2D1RectangleGeometry *rect_geometry[2];
D2D1_POINT_2F point = {0.0f, 0.0f};
D2D1_ROUNDED_RECT rounded_rect;
@@ -7970,6 +7971,117 @@ static void test_draw_geometry(BOOL d3d11)
hr = ID2D1PathGeometry_Open(geometry, &sink);
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+ set_point(&point, -0.402914f, 0.915514f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_HOLLOW);
+ quadratic_to(sink, -0.310379f, 0.882571f, -0.116057f, 0.824000f);
+ quadratic_to(sink, 0.008350f, 0.693614f, -0.052343f, 0.448886f);
+ quadratic_to(sink, -0.154236f, 0.246072f, -0.279229f, 0.025343f);
+ quadratic_to(sink, -0.370064f, -0.588586f, -0.383029f, -0.924114f);
+ quadratic_to(sink, -0.295479f, -0.958764f, -0.017086f, -0.988400f);
+ quadratic_to(sink, 0.208836f, -0.954157f, 0.272200f, -0.924114f);
+ quadratic_to(sink, 0.295614f, -0.569071f, 0.230143f, 0.022886f);
+ quadratic_to(sink, 0.101664f, 0.220643f, 0.012057f, 0.451571f);
+ quadratic_to(sink, -0.028764f, 0.709014f, 0.104029f, 0.833943f);
+ quadratic_to(sink, 0.319414f, 0.913057f, 0.403229f, 0.942628f);
+ quadratic_to(sink, 0.317721f, 1.023450f, -0.017086f, 1.021771f);
+ quadratic_to(sink, -0.310843f, 1.007472f, -0.402914f, 0.915514f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
+
+ hr = ID2D1GeometrySink_Close(sink);
+ ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+ ID2D1GeometrySink_Release(sink);
+
+ set_matrix_identity(&matrix);
+ translate_matrix(&matrix, 40.0f, 160.0f);
+ scale_matrix(&matrix, 20.0f, 80.0f);
+ hr = ID2D1Factory_CreateTransformedGeometry(factory,
+ (ID2D1Geometry *)geometry, &matrix, &transformed_geometry[0]);
+ ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+
+ set_matrix_identity(&matrix);
+ translate_matrix(&matrix, 160.0f, 640.0f);
+ scale_matrix(&matrix, 40.0f, 160.0f);
+ rotate_matrix(&matrix, M_PI / -5.0f);
+ hr = ID2D1Factory_CreateTransformedGeometry(factory,
+ (ID2D1Geometry *)geometry, &matrix, &transformed_geometry[1]);
+ ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+ ID2D1PathGeometry_Release(geometry);
+
+ set_matrix_identity(&matrix);
+ scale_matrix(&matrix, 0.5f, 1.0f);
+ translate_matrix(&matrix, -80.0f, 0.0f);
+ hr = ID2D1Factory_CreateTransformedGeometry(factory,
+ (ID2D1Geometry *)transformed_geometry[1], &matrix, &transformed_geometry[2]);
+ ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+
+ set_matrix_identity(&matrix);
+ rotate_matrix(&matrix, M_PI / 2.0f);
+ translate_matrix(&matrix, 80.0f, -320.0f);
+ scale_matrix(&matrix, 2.0f, 0.25f);
+ hr = ID2D1Factory_CreateTransformedGeometry(factory,
+ (ID2D1Geometry *)transformed_geometry[2], &matrix, &transformed_geometry[3]);
+ ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+
+ hr = ID2D1Factory_CreateGeometryGroup(factory, D2D1_FILL_MODE_WINDING,
+ (ID2D1Geometry**) &transformed_geometry, 4, &geometry_group);
+ ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+ ID2D1TransformedGeometry_Release(transformed_geometry[3]);
+ ID2D1TransformedGeometry_Release(transformed_geometry[2]);
+ ID2D1TransformedGeometry_Release(transformed_geometry[1]);
+ ID2D1TransformedGeometry_Release(transformed_geometry[0]);
+
+ ID2D1RenderTarget_BeginDraw(rt);
+ ID2D1RenderTarget_Clear(rt, &color);
+ ID2D1RenderTarget_DrawGeometry(rt, (ID2D1Geometry *)geometry_group, (ID2D1Brush *)brush, 10.0f, NULL);
+ hr = ID2D1RenderTarget_EndDraw(rt, NULL, NULL);
+ ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+ ID2D1GeometryGroup_Release(geometry_group);
+
+ match = compare_figure(&ctx, 0, 0, 160, 160, 0xff652e89, 256,
+ "iTANiwEagQEkeSp0LnIWAhZyFAYUchQGFHIUBhRyFAYUchQGFHIUBhRyFAYUchQGFHIUBhRyFAYU"
+ "cxQFFHMUBRRzFAUUcxQFFHMUBRRzFAUUcxQFFHMUBRRzFAUUcxQFFHQUBBR0FAQUdBQDFHUUAxR1"
+ "FAMUdRQDFHUUAxR1FQIUdhQCFHYUAhR2FAIUdhQCFHYUAhR2FAIUdhQBFHgoeCh4KHkmeiZ7JHwk"
+ "fSJ+In8ggAEfggEeggEdhAEchQEbhQEahwEZhwEYiQEXiQEWigEWigEWigEWiwEViwEViwEViwEV"
+ "igEXiQEXiQEXiQEYhwEZhgEbgwEefyR5KXQvbxgEGG4VBxhtMnAudCp6IoMBGOMu");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(&ctx, 160, 0, 320, 160, 0xff652e89, 512,
+ "xpcBB7QCEqkCG6ACJJgCLI8CNYcCHgMc/gEeDBr4AR4UGPIBHR0W7AEdIxbmAR0pFt8BHTAV2gEd"
+ "MBrWARwuIdMBGiwi1gEYKiPZARYoJNwBFiQk4AEWHyWxAQQvFhsltgEKKBYWJrwBECBOwQEXF0rI"
+ "ARwOSM4Ba9UBYeABRf0BOIoCMZECLJYCKJoCJ5wCJp0CJJ8CIqICH6QCHagCGa4CFLoCB/yUAQAA");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(&ctx, 0, 160, 160, 320, 0xff652e89, 512,
+ "yWQBnQEEmQEHlgELkwENkAEQjgETiwEVigEXhwEZhgEahQEcgwEdggEfgAEgfyF+I30jfCR8JXom"
+ "eid4KHgodxQCFHYUAhR1FAMUdBUEFHMUBRRyFQUUchQHFHEUBxRwFAgUcBQJFG4UChRuFAoUbRUL"
+ "FGwUDBRsFAwUbBQNFGwUDBRsFAwUbRQMFGwUDBRsFAwUbRQLFWwUDBRtFAsUbRQLFG0VCxRtFAsU"
+ "bRQLFG4UCxRtFAsUbhQKFG4UCxRuFAoUbhQKFG4VCRRvFAoUbhQKFG8UCRRvFAoUbxQJFG8UCRRw"
+ "FAgVbxQJFHAUCBRwFAgUcBUIFHAUCBRwFAgUcRQHFHEUBxRyFAYUchQGFHMUBRRzFAUUdBQEFHQU"
+ "BBR1FAQUdBQEFHUUAxR1FAMUdhQCFHYUAhR2FQEUdxQBFHcpeCh4KHkneSd6JnoneiZ7JXwkfSN+"
+ "In8hgAEggQEfgwEdhAEdhAEchQEbhgEahwEZiAEYGAFwGBYCcRcUBHEXEgZyFhEHchcOCXMWDAtz"
+ "FgsMdBYIDnQWBhB1FgQQdhYCEnYqdyl3KXcpeCd5J3kneSd5JnomeyR8JHwkfCN9I30ifiF/IX4h"
+ "fyF/IH8ggAEgfyCAASCAAR+AAR+BAR6CAR6BAR6CAR2CAR2DARyEARuEARuFARqGARmGARiKARSR"
+ "AQqhYwAA");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(&ctx, 160, 160, 320, 320, 0xff652e89, 1024,
+ "ytABA7gCCbICD60CFKkCF6cCGqMCHqACIZ0CJJoCJpgCKZUCFgIUkgIWBBWPAhYHFI4CFQoUjAIV"
+ "DBSKAhUNFYgCFQ8UhwIVERSFAhUTFIMCFRQVgQIUFxSAAhQZFP4BFBoV/AEUHBT7ARQeFPkBFB8V"
+ "9wEUIRT2ARQjFPQBFSMV8gEVJRTxARUnFPABFCgV7gEUKhTtARQsFOwBFCwV7AEULBTsARUsFOwB"
+ "FSsV7AEULBTtARQsFO0BFCsU7QEVKxTtARUqFe0BFSoU7gEUKxTuARQqFe4BFCoU7wEUKhTuARUp"
+ "FO8BFSkU7wEVKBXvARUoFPABFCkU8AEUKBTxARQoFPEBFCcV8QEUJxTxARUnFPEBFSYU8gEVJhTy"
+ "ARUlFfIBFSUU8wEUJRXzARQlFPQBFCUU9AEUJBT1ARQkFPUBFCMU9gEUIhT2ARUhFPcBFSAU+AEV"
+ "HxT5ARUeFPoBFR4U+gEVHRT7ARUcFPwBFRsU/QEVGhT+ARUZFP8BFBkUgAIUGBSBAhQXFIICFBcU"
+ "ggIUFhSDAhQVFIQCFBQUhQIUExSGAhQSFIcCFBIUhwIUERSIAhUPFIkCFg0UigIXCxSNAhYJFI8C"
+ "FggUkAIXBRSSAhcDFJQCFwEUlgIrlwIpmgImnAIkngIjnwIhoQIfowIepAIcpgIbpgIaqAIZqAIZ"
+ "qAIYKwP7ARgnBf0BGCMI/QEZHgz+ARgbD/8BGBcSgAIYEhaAAhoNGIICGggcgwIaBB+DAjyEAjyF"
+ "AjqGAjmIAjiIAiECFIkCFAIIBBSKAhQNFIsCFAwUjAIUCxSNAhQKFI4CFAkUjwIUBxWQAhQGFZEC"
+ "FAUVkQIUBRWRAhQFFZECFQMVkwIUAxWTAhQDFZMCFAIVlAIVARWVAiqVAimWAimWAiiYAiaZAiaZ"
+ "AiWaAiScAiKdAiGeAh+hAhyjAhmuAg3GxgEA");
+ ok(match, "Figure does not match.\n");
+
+ hr = ID2D1Factory_CreatePathGeometry(factory, &geometry);
+ ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+ hr = ID2D1PathGeometry_Open(geometry, &sink);
+ ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+
set_point(&point, 20.0f, 80.0f);
ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_HOLLOW);
quadratic_to(sink, 20.0f, 160.0f, 60.0f, 160.0f);
@@ -8011,6 +8123,7 @@ static void test_draw_geometry(BOOL d3d11)
static void test_fill_geometry(BOOL d3d11)
{
ID2D1TransformedGeometry *transformed_geometry[4];
+ ID2D1GeometryGroup *geometry_group;
ID2D1RectangleGeometry *rect_geometry[2];
D2D1_POINT_2F point = {0.0f, 0.0f};
D2D1_ROUNDED_RECT rounded_rect;
@@ -8728,6 +8841,112 @@ static void test_fill_geometry(BOOL d3d11)
hr = ID2D1PathGeometry_Open(geometry, &sink);
ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+ set_point(&point, -0.402914f, 0.915514f);
+ ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_FILLED);
+ quadratic_to(sink, -0.310379f, 0.882571f, -0.116057f, 0.824000f);
+ quadratic_to(sink, 0.008350f, 0.693614f, -0.052343f, 0.448886f);
+ quadratic_to(sink, -0.154236f, 0.246072f, -0.279229f, 0.025343f);
+ quadratic_to(sink, -0.370064f, -0.588586f, -0.383029f, -0.924114f);
+ quadratic_to(sink, -0.295479f, -0.958764f, -0.017086f, -0.988400f);
+ quadratic_to(sink, 0.208836f, -0.954157f, 0.272200f, -0.924114f);
+ quadratic_to(sink, 0.295614f, -0.569071f, 0.230143f, 0.022886f);
+ quadratic_to(sink, 0.101664f, 0.220643f, 0.012057f, 0.451571f);
+ quadratic_to(sink, -0.028764f, 0.709014f, 0.104029f, 0.833943f);
+ quadratic_to(sink, 0.319414f, 0.913057f, 0.403229f, 0.942628f);
+ quadratic_to(sink, 0.317721f, 1.023450f, -0.017086f, 1.021771f);
+ quadratic_to(sink, -0.310843f, 1.007472f, -0.402914f, 0.915514f);
+ ID2D1GeometrySink_EndFigure(sink, D2D1_FIGURE_END_CLOSED);
+
+ hr = ID2D1GeometrySink_Close(sink);
+ ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+ ID2D1GeometrySink_Release(sink);
+
+ set_matrix_identity(&matrix);
+ translate_matrix(&matrix, 40.0f, 160.0f);
+ scale_matrix(&matrix, 20.0f, 80.0f);
+ hr = ID2D1Factory_CreateTransformedGeometry(factory,
+ (ID2D1Geometry *)geometry, &matrix, &transformed_geometry[0]);
+ ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+
+ set_matrix_identity(&matrix);
+ translate_matrix(&matrix, 160.0f, 640.0f);
+ scale_matrix(&matrix, 40.0f, 160.0f);
+ rotate_matrix(&matrix, M_PI / -5.0f);
+ hr = ID2D1Factory_CreateTransformedGeometry(factory,
+ (ID2D1Geometry *)geometry, &matrix, &transformed_geometry[1]);
+ ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+ ID2D1PathGeometry_Release(geometry);
+
+ set_matrix_identity(&matrix);
+ scale_matrix(&matrix, 0.5f, 1.0f);
+ translate_matrix(&matrix, -80.0f, 0.0f);
+ hr = ID2D1Factory_CreateTransformedGeometry(factory,
+ (ID2D1Geometry *)transformed_geometry[1], &matrix, &transformed_geometry[2]);
+ ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+
+ set_matrix_identity(&matrix);
+ rotate_matrix(&matrix, M_PI / 2.0f);
+ translate_matrix(&matrix, 80.0f, -320.0f);
+ scale_matrix(&matrix, 2.0f, 0.25f);
+ hr = ID2D1Factory_CreateTransformedGeometry(factory,
+ (ID2D1Geometry *)transformed_geometry[2], &matrix, &transformed_geometry[3]);
+ ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+
+ hr = ID2D1Factory_CreateGeometryGroup(factory, D2D1_FILL_MODE_WINDING,
+ (ID2D1Geometry**) &transformed_geometry, 4, &geometry_group);
+ ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+ ID2D1TransformedGeometry_Release(transformed_geometry[3]);
+ ID2D1TransformedGeometry_Release(transformed_geometry[2]);
+ ID2D1TransformedGeometry_Release(transformed_geometry[1]);
+ ID2D1TransformedGeometry_Release(transformed_geometry[0]);
+
+ ID2D1RenderTarget_BeginDraw(rt);
+ ID2D1RenderTarget_Clear(rt, &color);
+ ID2D1RenderTarget_FillGeometry(rt, (ID2D1Geometry *)geometry_group, (ID2D1Brush *)brush, NULL);
+ hr = ID2D1RenderTarget_EndDraw(rt, NULL, NULL);
+ ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+ ID2D1GeometryGroup_Release(geometry_group);
+
+ match = compare_figure(&ctx, 0, 0, 160, 160, 0xff652e89, 32,
+ "zzIBlwEOjQEXiAEahgEahgEahgEahgEahgEahgEahgEahgEahgEahgEahwEZhwEZhwEZhwEZhwEZ"
+ "hwEZhwEZhwEZhwEZhwEZiAEYiAEYiAEXiQEXiQEXiQEXiQEXiQEXigEWigEWigEWigEWigEWigEW"
+ "igEVjAEUjAEUjAEUjQESjgESjwEQkAEQkQEOkgENlAEMlAELlgEKlwEImAEImQEHmQEGmwEFmwEE"
+ "nQEDnQECngECngECngECnwEBnwEBnwEBnwEBngEDnQEDnQEDnQEEmwEFmgEHmQEHlwELkQERjAEX"
+ "hgEdhAEfgwEchwEWjwEMqTEA");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(&ctx, 160, 0, 320, 160, 0xff652e89, 32,
+ "h58BBrUCD6wCGKQCIJsCKZMCMIwCNoUCPf8BQ/kBSPQBTu0BTu4BTfEBSfUBRfkBQf0BPYECOYUC"
+ "NIoCMI4CK+UBAS0W/AEHIweQAgsZBpcCEAwIngIepAIZqQIWrAITsAIRswIOtQIMuAIJuwIHwAIB"
+ "ypwB");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(&ctx, 0, 160, 160, 320, 0xff652e89, 32,
+ "wW4DnAEEmwEFmgEHmAEIlwEKlQELlAEMkwEOkQEPkAEQkAERjgESjgESjQEUjAEUiwEWigEWiQEX"
+ "iQEYhwEZhwEZhgEbhQEbhAEchAEdggEeggEeggEfgAEggAEggAEhgAEggAEggQEggAEggAEggQEf"
+ "gQEggQEfgQEfggEfgQEfgQEfggEfgQEfggEeggEfggEeggEeggEegwEeggEegwEdgwEegwEdgwEd"
+ "hAEchAEdhAEchAEchAEdhAEchAEchQEbhQEbhgEahgEahwEZhwEZiAEYiAEYiQEYiAEYiQEXiQEX"
+ "igEWigEWiwEViwEVjAEUjAEUjAEUjQETjQETjgESjgETjgESjwERkAEQkgEOkwENlAEMlQELlgEK"
+ "lwEJmAEJmAEImQEHmgEGmwEFnAEEnQEEnQEDnQEDngECngEDngECngECnwECngECnwECngECngED"
+ "ngECEgGLAQMQAosBAw4EjAEDCwWNAQQJBo0BBQYIjQEHAgqNARKOARKPARCQARCQARCQAQ+RAQ6S"
+ "AQ6SAQ2TAQ2SAQ2TAQ2TAQyTAQyUAQyTAQyUAQuVAQuUAQuVAQqWAQmWAQqWAQmXAQiXAQiYAQeY"
+ "AQeZAQWbAQSDZwAA");
+ ok(match, "Figure does not match.\n");
+ match = compare_figure(&ctx, 160, 160, 320, 320, 0xff652e89, 32,
+ "g90BBLkCCLYCC7ICDrACEa0CFKoCF6cCGqQCHKMCHqECIJ8CIpwCJJsCJpkCKJcCKZYCK5QCLZIC"
+ "L5ACMI8CMo0CNIsCNYoCN4gCOYcCOYYCO4QCPYICPoECQIACQYACQIECQIACQIECQIECQIECP4IC"
+ "P4ICP4ECP4ICP4ICPoMCPoMCPoMCPYQCPYMCPYQCPYQCPYQCPIUCPIUCPIUCO4YCO4YCOoYCO4YC"
+ "OocCOocCOocCOYgCOYgCOIkCOIkCN4oCNosCNYwCNI0CM44CMo4CM44CMo8CMZACMJECL5ICLpMC"
+ "LZQCLJUCK5YCK5YCKpcCKZgCKJkCJ5oCJpsCJpsCJZwCJJ4CIqACIKICH6MCHaUCG6cCGakCF6wC"
+ "Fa0CE68CEbECD7MCDrQCDLYCCrgCCbkCB7sCBrsCBbwCBbwCBL0CBL0CBL0CBL0CA70CBL0CBL0C"
+ "BLwCBSUBlgIFIQSXAgYbCJcCBxcKmQIIEQ6ZAgoMEJoCDQUTnAIknAIjnQIingIhnwIgoAIfoQIe"
+ "ogIdowIcpAIbpQIapQIZpgIZpgIZpwIYpwIXqAIXqAIXqQIVqgIVqgIUqwITrQISrQIRrgIQsAIO"
+ "sQIMswILtQIIhs4B");
+ ok(match, "Figure does not match.\n");
+
+ hr = ID2D1Factory_CreatePathGeometry(factory, &geometry);
+ ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+ hr = ID2D1PathGeometry_Open(geometry, &sink);
+ ok(hr == S_OK, "Got unexpected hr %#lx.\n", hr);
+
set_point(&point, -0.402914f, 0.915514f);
ID2D1GeometrySink_BeginFigure(sink, point, D2D1_FIGURE_BEGIN_HOLLOW);
quadratic_to(sink, -0.310379f, 0.882571f, -0.116057f, 0.824000f);
--
2.45.2

View File

@@ -0,0 +1,279 @@
From be0fbef50483da8fe3fd0c4b74469d15a5c9f1ea Mon Sep 17 00:00:00 2001
From: Philipp Knechtges <philipp-dev@knechtges.com>
Date: Fri, 13 Sep 2024 16:37:31 +0200
Subject: [PATCH] d2d1: Implement drawing for ID2D1GeometryGroup
Drawing of ID2D1GeometryGroup was so far unimplemented and resulted in
blank drawing buffers. This partially fixes the rendering issues mentioned
in the bug below.
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=51139
---
dlls/d2d1/geometry.c | 236 ++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 235 insertions(+), 1 deletion(-)
diff --git a/dlls/d2d1/geometry.c b/dlls/d2d1/geometry.c
index 3da3ad2e65b..93925408077 100644
--- a/dlls/d2d1/geometry.c
+++ b/dlls/d2d1/geometry.c
@@ -5497,8 +5497,13 @@ static const struct ID2D1GeometryGroupVtbl d2d_geometry_group_vtbl =
HRESULT d2d_geometry_group_init(struct d2d_geometry *geometry, ID2D1Factory *factory,
D2D1_FILL_MODE fill_mode, ID2D1Geometry **geometries, unsigned int geometry_count)
{
- unsigned int i;
+ unsigned int i, j;
+ struct d2d_geometry *other_geom;
+ D2D_MATRIX_3X2_F g, gplain;
+ size_t f_vertex_count, f_face_count, f_bezier_vertex_count, f_arc_vertex_count;
+ size_t o_vertex_count, o_face_count, o_bezier_count, o_bezier_face_count, o_arc_count, o_arc_face_count;
+ FIXME("Ignoring fill_mode=%#x!\n", fill_mode);
d2d_geometry_init(geometry, factory, &identity, (ID2D1GeometryVtbl *)&d2d_geometry_group_vtbl);
if (!(geometry->u.group.src_geometries = calloc(geometry_count, sizeof(*geometries))))
@@ -5507,13 +5512,242 @@ HRESULT d2d_geometry_group_init(struct d2d_geometry *geometry, ID2D1Factory *fac
return E_OUTOFMEMORY;
}
+ geometry->fill.vertex_count = 0;
+ geometry->fill.face_count = 0;
+ geometry->fill.bezier_vertex_count = 0;
+ geometry->fill.arc_vertex_count = 0;
+ geometry->outline.vertex_count = 0;
+ geometry->outline.face_count = 0;
+ geometry->outline.bezier_count = 0;
+ geometry->outline.bezier_face_count = 0;
+ geometry->outline.arc_count = 0;
+ geometry->outline.arc_face_count = 0;
for (i = 0; i < geometry_count; ++i)
{
ID2D1Geometry_AddRef(geometry->u.group.src_geometries[i] = geometries[i]);
+ other_geom = unsafe_impl_from_ID2D1Geometry(geometries[i]);
+ geometry->fill.vertex_count += other_geom->fill.vertex_count;
+ geometry->fill.face_count += other_geom->fill.face_count;
+ geometry->fill.bezier_vertex_count += other_geom->fill.bezier_vertex_count;
+ geometry->fill.arc_vertex_count += other_geom->fill.arc_vertex_count;
+ geometry->outline.vertex_count += other_geom->outline.vertex_count;
+ geometry->outline.face_count += other_geom->outline.face_count;
+ geometry->outline.bezier_count += other_geom->outline.bezier_count;
+ geometry->outline.bezier_face_count += other_geom->outline.bezier_face_count;
+ geometry->outline.arc_count += other_geom->outline.arc_count;
+ geometry->outline.arc_face_count += other_geom->outline.arc_face_count;
}
geometry->u.group.geometry_count = geometry_count;
geometry->u.group.fill_mode = fill_mode;
+ if (!(geometry->fill.vertices = calloc(geometry->fill.vertex_count, sizeof(D2D1_POINT_2F))))
+ {
+ for (i = 0; i < geometry->u.group.geometry_count; ++i)
+ ID2D1Geometry_Release(geometry->u.group.src_geometries[i]);
+ d2d_geometry_cleanup(geometry);
+ return E_OUTOFMEMORY;
+ }
+ if (!(geometry->fill.faces = calloc(geometry->fill.face_count, sizeof(struct d2d_face))))
+ {
+ for (i = 0; i < geometry->u.group.geometry_count; ++i)
+ ID2D1Geometry_Release(geometry->u.group.src_geometries[i]);
+ d2d_geometry_cleanup(geometry);
+ return E_OUTOFMEMORY;
+ }
+ geometry->fill.faces_size = geometry->fill.face_count;
+ if (!(geometry->fill.bezier_vertices = calloc(geometry->fill.bezier_vertex_count, sizeof(struct d2d_curve_vertex))))
+ {
+ for (i = 0; i < geometry->u.group.geometry_count; ++i)
+ ID2D1Geometry_Release(geometry->u.group.src_geometries[i]);
+ d2d_geometry_cleanup(geometry);
+ return E_OUTOFMEMORY;
+ }
+ geometry->fill.bezier_vertices_size = geometry->fill.bezier_vertex_count;
+ if (!(geometry->fill.arc_vertices = calloc(geometry->fill.arc_vertex_count, sizeof(struct d2d_curve_vertex))))
+ {
+ for (i = 0; i < geometry->u.group.geometry_count; ++i)
+ ID2D1Geometry_Release(geometry->u.group.src_geometries[i]);
+ d2d_geometry_cleanup(geometry);
+ return E_OUTOFMEMORY;
+ }
+ geometry->fill.arc_vertices_size = geometry->fill.arc_vertex_count;
+ if (!(geometry->outline.vertices = calloc(geometry->outline.vertex_count, sizeof(struct d2d_outline_vertex))))
+ {
+ for (i = 0; i < geometry->u.group.geometry_count; ++i)
+ ID2D1Geometry_Release(geometry->u.group.src_geometries[i]);
+ d2d_geometry_cleanup(geometry);
+ return E_OUTOFMEMORY;
+ }
+ geometry->outline.vertices_size = geometry->outline.vertex_count;
+ if (!(geometry->outline.faces = calloc(geometry->outline.face_count, sizeof(struct d2d_face))))
+ {
+ for (i = 0; i < geometry->u.group.geometry_count; ++i)
+ ID2D1Geometry_Release(geometry->u.group.src_geometries[i]);
+ d2d_geometry_cleanup(geometry);
+ return E_OUTOFMEMORY;
+ }
+ geometry->outline.faces_size = geometry->outline.face_count;
+ if (!(geometry->outline.beziers = calloc(geometry->outline.bezier_count, sizeof(struct d2d_curve_outline_vertex))))
+ {
+ for (i = 0; i < geometry->u.group.geometry_count; ++i)
+ ID2D1Geometry_Release(geometry->u.group.src_geometries[i]);
+ d2d_geometry_cleanup(geometry);
+ return E_OUTOFMEMORY;
+ }
+ geometry->outline.beziers_size = geometry->outline.bezier_count;
+ if (!(geometry->outline.bezier_faces = calloc(geometry->outline.bezier_face_count, sizeof(struct d2d_face))))
+ {
+ for (i = 0; i < geometry->u.group.geometry_count; ++i)
+ ID2D1Geometry_Release(geometry->u.group.src_geometries[i]);
+ d2d_geometry_cleanup(geometry);
+ return E_OUTOFMEMORY;
+ }
+ geometry->outline.bezier_faces_size = geometry->outline.bezier_face_count;
+ if (!(geometry->outline.arcs = calloc(geometry->outline.arc_count, sizeof(struct d2d_curve_outline_vertex))))
+ {
+ for (i = 0; i < geometry->u.group.geometry_count; ++i)
+ ID2D1Geometry_Release(geometry->u.group.src_geometries[i]);
+ d2d_geometry_cleanup(geometry);
+ return E_OUTOFMEMORY;
+ }
+ geometry->outline.arcs_size = geometry->outline.arc_count;
+ if (!(geometry->outline.arc_faces = calloc(geometry->outline.arc_face_count, sizeof(struct d2d_face))))
+ {
+ for (i = 0; i < geometry->u.group.geometry_count; ++i)
+ ID2D1Geometry_Release(geometry->u.group.src_geometries[i]);
+ d2d_geometry_cleanup(geometry);
+ return E_OUTOFMEMORY;
+ }
+ geometry->outline.arc_faces_size = geometry->outline.arc_face_count;
+
+ f_vertex_count = 0;
+ f_face_count = 0;
+ f_bezier_vertex_count = 0;
+ f_arc_vertex_count = 0;
+ o_vertex_count = 0;
+ o_face_count = 0;
+ o_bezier_count = 0;
+ o_bezier_face_count = 0;
+ o_arc_count = 0;
+ o_arc_face_count = 0;
+ for (i = 0; i < geometry_count; ++i)
+ {
+ other_geom = unsafe_impl_from_ID2D1Geometry(geometries[i]);
+ g = other_geom->transform;
+ gplain = g;
+ gplain.dx = 0.0f;
+ gplain.dy = 0.0f;
+
+ for (j = 0; j < other_geom->fill.vertex_count; ++j) {
+ d2d_point_transform(&geometry->fill.vertices[j+f_vertex_count], &g,
+ other_geom->fill.vertices[j].x, other_geom->fill.vertices[j].y);
+ }
+ for (j = 0; j < other_geom->fill.face_count; ++j) {
+ geometry->fill.faces[f_face_count+j].v[0] = other_geom->fill.faces[j].v[0]
+ + (UINT16) f_vertex_count;
+ geometry->fill.faces[f_face_count+j].v[1] = other_geom->fill.faces[j].v[1]
+ + (UINT16) f_vertex_count;
+ geometry->fill.faces[f_face_count+j].v[2] = other_geom->fill.faces[j].v[2]
+ + (UINT16) f_vertex_count;
+ }
+ f_vertex_count += other_geom->fill.vertex_count;
+ f_face_count += other_geom->fill.face_count;
+
+ for (j = 0; j < other_geom->fill.bezier_vertex_count; ++j) {
+ d2d_point_transform(&geometry->fill.bezier_vertices[j+f_bezier_vertex_count].position,
+ &g, other_geom->fill.bezier_vertices[j].position.x,
+ other_geom->fill.bezier_vertices[j].position.y);
+ geometry->fill.bezier_vertices[j+f_bezier_vertex_count].texcoord
+ = other_geom->fill.bezier_vertices[j].texcoord;
+ }
+ f_bezier_vertex_count += other_geom->fill.bezier_vertex_count;
+
+ for (j = 0; j < other_geom->fill.arc_vertex_count; ++j) {
+ d2d_point_transform(&geometry->fill.arc_vertices[j+f_arc_vertex_count].position,
+ &g, other_geom->fill.arc_vertices[j].position.x,
+ other_geom->fill.arc_vertices[j].position.y);
+ geometry->fill.arc_vertices[j+f_arc_vertex_count].texcoord
+ = other_geom->fill.arc_vertices[j].texcoord;
+
+ }
+ f_arc_vertex_count += other_geom->fill.arc_vertex_count;
+
+ for (j = 0; j < other_geom->outline.vertex_count; ++j) {
+ d2d_point_transform(&geometry->outline.vertices[j+o_vertex_count].position, &g,
+ other_geom->outline.vertices[j].position.x, other_geom->outline.vertices[j].position.y);
+ d2d_point_transform(&geometry->outline.vertices[j+o_vertex_count].prev, &gplain,
+ other_geom->outline.vertices[j].prev.x, other_geom->outline.vertices[j].prev.y);
+ d2d_point_normalise(&geometry->outline.vertices[j+o_vertex_count].prev);
+ d2d_point_transform(&geometry->outline.vertices[j+o_vertex_count].next, &gplain,
+ other_geom->outline.vertices[j].next.x, other_geom->outline.vertices[j].next.y);
+ d2d_point_normalise(&geometry->outline.vertices[j+o_vertex_count].next);
+ }
+ for (j = 0; j < other_geom->outline.face_count; ++j) {
+ geometry->outline.faces[o_face_count+j].v[0] = other_geom->outline.faces[j].v[0]
+ + (UINT16) o_vertex_count;
+ geometry->outline.faces[o_face_count+j].v[1] = other_geom->outline.faces[j].v[1]
+ + (UINT16) o_vertex_count;
+ geometry->outline.faces[o_face_count+j].v[2] = other_geom->outline.faces[j].v[2]
+ + (UINT16) o_vertex_count;
+ }
+ o_vertex_count += other_geom->outline.vertex_count;
+ o_face_count += other_geom->outline.face_count;
+
+ for (j = 0; j < other_geom->outline.bezier_count; ++j) {
+ d2d_point_transform(&geometry->outline.beziers[j+o_bezier_count].position, &g,
+ other_geom->outline.beziers[j].position.x, other_geom->outline.beziers[j].position.y);
+ d2d_point_transform(&geometry->outline.beziers[j+o_bezier_count].prev, &gplain,
+ other_geom->outline.beziers[j].prev.x, other_geom->outline.beziers[j].prev.y);
+ d2d_point_normalise(&geometry->outline.beziers[j+o_bezier_count].prev);
+ d2d_point_transform(&geometry->outline.beziers[j+o_bezier_count].next, &gplain,
+ other_geom->outline.beziers[j].next.x, other_geom->outline.beziers[j].next.y);
+ d2d_point_normalise(&geometry->outline.beziers[j+o_bezier_count].next);
+ d2d_point_transform(&geometry->outline.beziers[j+o_bezier_count].p0, &g,
+ other_geom->outline.beziers[j].p0.x, other_geom->outline.beziers[j].p0.y);
+ d2d_point_transform(&geometry->outline.beziers[j+o_bezier_count].p1, &g,
+ other_geom->outline.beziers[j].p1.x, other_geom->outline.beziers[j].p1.y);
+ d2d_point_transform(&geometry->outline.beziers[j+o_bezier_count].p2, &g,
+ other_geom->outline.beziers[j].p2.x, other_geom->outline.beziers[j].p2.y);
+ }
+ for (j = 0; j < other_geom->outline.bezier_face_count; ++j) {
+ geometry->outline.bezier_faces[o_bezier_face_count+j].v[0]
+ = other_geom->outline.bezier_faces[j].v[0] + (UINT16) o_bezier_count;
+ geometry->outline.bezier_faces[o_bezier_face_count+j].v[1]
+ = other_geom->outline.bezier_faces[j].v[1] + (UINT16) o_bezier_count;
+ geometry->outline.bezier_faces[o_bezier_face_count+j].v[2]
+ = other_geom->outline.bezier_faces[j].v[2] + (UINT16) o_bezier_count;
+ }
+ o_bezier_count += other_geom->outline.bezier_count;
+ o_bezier_face_count += other_geom->outline.bezier_face_count;
+
+ for (j = 0; j < other_geom->outline.arc_count; ++j) {
+ d2d_point_transform(&geometry->outline.arcs[j+o_arc_count].position, &g,
+ other_geom->outline.arcs[j].position.x, other_geom->outline.arcs[j].position.y);
+ d2d_point_transform(&geometry->outline.arcs[j+o_arc_count].prev, &gplain,
+ other_geom->outline.arcs[j].prev.x, other_geom->outline.arcs[j].prev.y);
+ d2d_point_normalise(&geometry->outline.arcs[j+o_arc_count].prev);
+ d2d_point_transform(&geometry->outline.arcs[j+o_arc_count].next, &gplain,
+ other_geom->outline.arcs[j].next.x, other_geom->outline.arcs[j].next.y);
+ d2d_point_normalise(&geometry->outline.arcs[j+o_arc_count].next);
+ d2d_point_transform(&geometry->outline.arcs[j+o_arc_count].p0, &g,
+ other_geom->outline.arcs[j].p0.x, other_geom->outline.arcs[j].p0.y);
+ d2d_point_transform(&geometry->outline.arcs[j+o_arc_count].p1, &g,
+ other_geom->outline.arcs[j].p1.x, other_geom->outline.arcs[j].p1.y);
+ d2d_point_transform(&geometry->outline.arcs[j+o_arc_count].p2, &g,
+ other_geom->outline.arcs[j].p2.x, other_geom->outline.arcs[j].p2.y);
+ }
+ for (j = 0; j < other_geom->outline.arc_face_count; ++j) {
+ geometry->outline.arc_faces[o_arc_face_count+j].v[0]
+ = other_geom->outline.arc_faces[j].v[0] + (UINT16) o_arc_count;
+ geometry->outline.arc_faces[o_arc_face_count+j].v[1]
+ = other_geom->outline.arc_faces[j].v[1] + (UINT16) o_arc_count;
+ geometry->outline.arc_faces[o_arc_face_count+j].v[2]
+ = other_geom->outline.arc_faces[j].v[2] + (UINT16) o_arc_count;
+ }
+ o_arc_count += other_geom->outline.arc_count;
+ o_arc_face_count += other_geom->outline.arc_face_count;
+ }
+
return S_OK;
}
--
2.45.2

View File

@@ -0,0 +1,3 @@
Fixes: [51139] d2d1: Implement drawing of ID2D1GeometryGroup
# MR https://gitlab.winehq.org/wine/wine/-/merge_requests/6492

View File

@@ -1,32 +0,0 @@
From 5d9d9cbdb4043848aa5ebdd8a1349d9c876650e3 Mon Sep 17 00:00:00 2001
From: Christian Costa <titan.costa@gmail.com>
Date: Sun, 11 Jan 2015 16:18:03 +0100
Subject: [PATCH] d3dx9_36: Add support for FOURCC surface to
save_dds_surface_to_memory.
---
dlls/d3dx9_36/surface.c | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/dlls/d3dx9_36/surface.c b/dlls/d3dx9_36/surface.c
index 26809a47e18..db334ee83f1 100644
--- a/dlls/d3dx9_36/surface.c
+++ b/dlls/d3dx9_36/surface.c
@@ -433,6 +433,14 @@ static HRESULT d3dformat_to_dds_pixel_format(struct dds_pixel_format *pixel_form
}
}
+ /* Reuse dds_fourcc_to_d3dformat as D3DFORMAT and FOURCC are DWORD with same values */
+ if (dds_fourcc_to_d3dformat(d3dformat) != D3DFMT_UNKNOWN)
+ {
+ pixel_format->flags |= DDS_PF_FOURCC;
+ pixel_format->fourcc = d3dformat;
+ return D3D_OK;
+ }
+
WARN("Unknown pixel format %#x.\n", d3dformat);
return E_NOTIMPL;
}
--
2.35.1

View File

@@ -1,4 +1,4 @@
From 96af775034dae1c0b133b315c45b7172090d3498 Mon Sep 17 00:00:00 2001
From 71d1c176af87bdc48326d5883fbea608314ee0a4 Mon Sep 17 00:00:00 2001
From: Christian Costa <titan.costa@gmail.com>
Date: Sun, 11 Jan 2015 16:29:30 +0100
Subject: [PATCH] d3dx9_36: Improve D3DXSaveTextureToFile to save simple
@@ -11,23 +11,23 @@ Subject: [PATCH] d3dx9_36: Improve D3DXSaveTextureToFile to save simple
3 files changed, 66 insertions(+), 4 deletions(-)
diff --git a/dlls/d3dx9_36/d3dx9_private.h b/dlls/d3dx9_36/d3dx9_private.h
index 34a9f6eec7f..878dff3fc01 100644
index 6a9b3e12b7b..0c6374f35ca 100644
--- a/dlls/d3dx9_36/d3dx9_private.h
+++ b/dlls/d3dx9_36/d3dx9_private.h
@@ -178,6 +178,8 @@ HRESULT lock_surface(IDirect3DSurface9 *surface, const RECT *surface_rect, D3DLO
@@ -316,6 +316,8 @@ HRESULT lock_surface(IDirect3DSurface9 *surface, const RECT *surface_rect, D3DLO
IDirect3DSurface9 **temp_surface, BOOL write);
HRESULT unlock_surface(IDirect3DSurface9 *surface, const RECT *surface_rect,
IDirect3DSurface9 *temp_surface, BOOL update);
+HRESULT save_dds_texture_to_memory(ID3DXBuffer **dst_buffer, IDirect3DBaseTexture9 *src_texture,
+ const PALETTEENTRY *src_palette);
HRESULT d3dx_pixels_init(const void *data, uint32_t row_pitch, uint32_t slice_pitch,
const PALETTEENTRY *palette, D3DFORMAT format, uint32_t left, uint32_t top, uint32_t right, uint32_t bottom,
uint32_t front, uint32_t back, struct d3dx_pixels *pixels);
const PALETTEENTRY *palette, enum d3dx_pixel_format_id format, uint32_t left, uint32_t top, uint32_t right,
uint32_t bottom, uint32_t front, uint32_t back, struct d3dx_pixels *pixels);
diff --git a/dlls/d3dx9_36/surface.c b/dlls/d3dx9_36/surface.c
index 31bce97bbab..212d452c654 100644
index 9d2dc96a979..912a3e3c849 100644
--- a/dlls/d3dx9_36/surface.c
+++ b/dlls/d3dx9_36/surface.c
@@ -574,6 +574,69 @@ static HRESULT save_dds_surface_to_memory(ID3DXBuffer **dst_buffer, IDirect3DSur
@@ -628,6 +628,69 @@ static HRESULT save_dds_surface_to_memory(ID3DXBuffer **dst_buffer, IDirect3DSur
return D3D_OK;
}
@@ -87,21 +87,21 @@ index 31bce97bbab..212d452c654 100644
+
+ if (SUCCEEDED(hr))
+ {
+ hr = save_dds_surface_to_memory(dst_buffer, surface, NULL);
+ hr = save_dds_surface_to_memory(dst_buffer, surface, NULL, NULL);
+ IDirect3DSurface9_Release(surface);
+ }
+
+ return hr;
+}
+
HRESULT load_cube_texture_from_dds(IDirect3DCubeTexture9 *cube_texture, const void *src_data,
const PALETTEENTRY *palette, DWORD filter, DWORD color_key, const D3DXIMAGE_INFO *src_info)
{
static const uint8_t bmp_file_signature[] = { 'B', 'M' };
static const uint8_t jpg_file_signature[] = { 0xff, 0xd8 };
static const uint8_t png_file_signature[] = { 0x89, 'P', 'N', 'G', 0x0d, 0x0a, 0x1a, 0x0a };
diff --git a/dlls/d3dx9_36/texture.c b/dlls/d3dx9_36/texture.c
index b42c9db3f2d..d84bac25cfe 100644
index 719a2787445..3f76ec209f9 100644
--- a/dlls/d3dx9_36/texture.c
+++ b/dlls/d3dx9_36/texture.c
@@ -1847,10 +1847,7 @@ HRESULT WINAPI D3DXSaveTextureToFileInMemory(ID3DXBuffer **dst_buffer, D3DXIMAGE
@@ -1866,10 +1866,7 @@ HRESULT WINAPI D3DXSaveTextureToFileInMemory(ID3DXBuffer **dst_buffer, D3DXIMAGE
if (!dst_buffer || !src_texture) return D3DERR_INVALIDCALL;
if (file_format == D3DXIFF_DDS)
@@ -114,5 +114,5 @@ index b42c9db3f2d..d84bac25cfe 100644
type = IDirect3DBaseTexture9_GetType(src_texture);
switch (type)
--
2.45.2
2.47.2

View File

@@ -1,87 +0,0 @@
From d258e0c4428f3d5b7c0b6f4b31058d8710244dd7 Mon Sep 17 00:00:00 2001
From: Christian Costa <titan.costa@gmail.com>
Date: Wed, 14 Aug 2013 09:31:31 +0200
Subject: d3dx9_36: Filter out D3DCompile warning messages that are not present
with D3DCompileShader. (try 4)
This patch fixes vertex processing issue of bug 33770.
The problem comes from the fact that even if the call succeeds,
the game interprets a non null error_messages pointer as an error.
By calling D3DCompile we use a newer version of the compiler which is more
strict and generates the following warning.
- warning X3206: 'dot': implicit truncation of vector type
- warning X3206: implicit truncation of vector type
- warning X3206: 'mul': implicit truncation of vector type
D3DCompileShader does not generate such warnings.
These is confirmed in the DX SDK release note:
New Warning X3206: Implicit Truncation of Vector Type
Beginning in the August 2009 release of the DirectX SDK, the compiler will warn
when an implicit truncation of a vector type occurs.
The warnings cannot be disable so this patch filters out these strings in D3DCompileShader
and reset the error messages pointer if the resulting buffer is empty.
Try 2:
- only filter out lines containing "X3206:" in case d3dcompiler_43 has localization
Try 3:
- use move in place instead of copying the buffer
Try 4:
- filter simplification by Sebastian and remove 'mul' testing left-out in search string
---
dlls/d3dx9_36/shader.c | 35 +++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
diff --git a/dlls/d3dx9_36/shader.c b/dlls/d3dx9_36/shader.c
index 5ea3d13..646d3dc 100644
--- a/dlls/d3dx9_36/shader.c
+++ b/dlls/d3dx9_36/shader.c
@@ -450,6 +450,41 @@ HRESULT WINAPI D3DXCompileShader(const char *data, UINT length, const D3DXMACRO
}
}
+ /* Filter out D3DCompile warning messages that are not present with D3DCompileShader */
+ if (SUCCEEDED(hr) && error_msgs && *error_msgs)
+ {
+ char *messages = ID3DXBuffer_GetBufferPointer(*error_msgs);
+ DWORD size = ID3DXBuffer_GetBufferSize(*error_msgs);
+
+ /* Ensure messages are null terminated for safe processing */
+ if (size) messages[size - 1] = 0;
+
+ while (size > 1)
+ {
+ char *prev, *next;
+
+ /* Warning has the form "warning X3206: ... implicit truncation of vector type"
+ but we only search for "X3206:" in case d3dcompiler_43 has localization */
+ prev = next = strstr(messages, "X3206:");
+ if (!prev) break;
+
+ /* get pointer to beginning and end of current line */
+ while (prev > messages && *(prev - 1) != '\n') prev--;
+ while (next < messages + size - 1 && *next != '\n') next++;
+ if (next < messages + size - 1 && *next == '\n') next++;
+
+ memmove(prev, next, messages + size - next);
+ size -= (next - prev);
+ }
+
+ /* Only return a buffer if the resulting string is not empty as some apps depend on that */
+ if (size <= 1)
+ {
+ ID3DXBuffer_Release(*error_msgs);
+ *error_msgs = NULL;
+ }
+ }
+
return hr;
}
--
2.1.2

View File

@@ -1 +0,0 @@
Fixes: [33770] D3DCompileShader should filter specific warning messages

View File

@@ -1,4 +1,4 @@
From 9b9b36ccc66866ba142ce1f0d12190025ac2e7f7 Mon Sep 17 00:00:00 2001
From da832ae3626406e9aee5f9f78bce01f2a0d49691 Mon Sep 17 00:00:00 2001
From: Zebediah Figura <z.figura12@gmail.com>
Date: Thu, 7 Jun 2018 20:09:59 -0500
Subject: [PATCH] server: Create server objects for eventfd-based
@@ -9,13 +9,13 @@ Subject: [PATCH] server: Create server objects for eventfd-based
server/esync.c | 318 ++++++++++++++++++++++++++++++++++++++++++++
server/esync.h | 24 ++++
server/main.c | 4 +
server/protocol.def | 25 +++-
5 files changed, 371 insertions(+), 1 deletion(-)
server/protocol.def | 24 ++++
5 files changed, 371 insertions(+)
create mode 100644 server/esync.c
create mode 100644 server/esync.h
diff --git a/server/Makefile.in b/server/Makefile.in
index ae502dbf17d..b164193ef20 100644
index 7e571ac2ba6..9632c4e694f 100644
--- a/server/Makefile.in
+++ b/server/Makefile.in
@@ -11,6 +11,7 @@ SOURCES = \
@@ -381,7 +381,7 @@ index 00000000000..00f9e638d83
+extern int do_esync(void);
+void esync_init(void);
diff --git a/server/main.c b/server/main.c
index ddda5f4e86e..5062d0999fa 100644
index e014ec535ff..052667b4c6b 100644
--- a/server/main.c
+++ b/server/main.c
@@ -34,6 +34,7 @@
@@ -401,20 +401,12 @@ index ddda5f4e86e..5062d0999fa 100644
+
if (debug_level) fprintf( stderr, "wineserver: starting (pid=%ld)\n", (long) getpid() );
set_current_time();
init_scheduler();
init_signals();
diff --git a/server/protocol.def b/server/protocol.def
index e86d3414247..03bc0aeb11e 100644
index fa4ca4aaa9e..a9ee996a8ab 100644
--- a/server/protocol.def
+++ b/server/protocol.def
@@ -3867,7 +3867,6 @@ struct handle_info
obj_handle_t handle; /* process handle */
@END
-
/* Iterate thread list for process */
@REQ(get_next_thread)
obj_handle_t process; /* process handle */
@@ -3879,6 +3878,29 @@ struct handle_info
@@ -4080,6 +4080,29 @@ struct handle_info
obj_handle_t handle; /* next thread handle */
@END
@@ -444,11 +436,11 @@ index e86d3414247..03bc0aeb11e 100644
/* Setup keyboard auto-repeat */
@REQ(set_keyboard_repeat)
@@ -3888,3 +3910,4 @@ struct handle_info
@@ -4089,3 +4112,4 @@ struct handle_info
@REPLY
int enable; /* previous state of auto-repeat enable */
@END
+
--
2.43.0
2.47.2

View File

@@ -1,5 +1,4 @@
Fixes: [36692] Many multi-threaded applications have poor performance due to heavy use of synchronization primitives
Depends: server-Realtime_Priority
Depends: ntdll-Junction_Points
Depends: server-PeekMessage
Depends: server-Signal_Thread

View File

@@ -0,0 +1,24 @@
From 252a1d6bb99c83ce8a0289fbd1f4fe135e2c55cd Mon Sep 17 00:00:00 2001
From: Torge Matthies <tmatthies@codeweavers.com>
Date: Fri, 25 Oct 2024 13:19:02 +0200
Subject: [PATCH] include: Add MFNETSOURCE_STATISTICS_SERVICE definition.
---
include/mfidl.idl | 1 +
1 file changed, 1 insertion(+)
diff --git a/include/mfidl.idl b/include/mfidl.idl
index 666af53c6e3..a8c5af05e68 100644
--- a/include/mfidl.idl
+++ b/include/mfidl.idl
@@ -1626,6 +1626,7 @@ cpp_quote("EXTERN_GUID(MR_STREAM_VOLUME_SERVICE, 0xf8b5fa2f, 0x32ef, 0x46f5, 0xb
cpp_quote("EXTERN_GUID(MR_AUDIO_POLICY_SERVICE, 0x911fd737, 0x6775, 0x4ab0, 0xa6, 0x14, 0x29, 0x78, 0x62, 0xfd, 0xac, 0x88);")
cpp_quote("EXTERN_GUID(MF_PROPERTY_HANDLER_SERVICE, 0xa3face02, 0x32b8, 0x41dd, 0x90, 0xe7, 0x5f, 0xef, 0x7c, 0x89, 0x91, 0xb5);")
cpp_quote("EXTERN_GUID(MF_WORKQUEUE_SERVICES, 0x8e37d489, 0x41e0, 0x413a, 0x90, 0x68, 0x28, 0x7c, 0x88, 0x6d, 0x8d, 0xda);")
+cpp_quote("EXTERN_GUID(MFNETSOURCE_STATISTICS_SERVICE, 0x3cb1f275, 0x0505, 0x4c5d, 0xae, 0x71, 0x0a, 0x55, 0x63, 0x44, 0xef, 0xa1);")
cpp_quote("EXTERN_GUID(MF_PROGRESSIVE_CODING_CONTENT, 0x8f020eea, 0x1508, 0x471f, 0x9d, 0xa6, 0x50, 0x7d, 0x7c, 0xfa, 0x40, 0xdb);")
cpp_quote("EXTERN_GUID(MF_NALU_LENGTH_SET, 0xa7911d53, 0x12a4, 0x4965, 0xae, 0x70, 0x6e, 0xad, 0xd6, 0xff, 0x05, 0x51);")
--
2.45.2

View File

@@ -0,0 +1,383 @@
From 0d4a7cf6b9bb3a57a098762113ca1750c43a810e Mon Sep 17 00:00:00 2001
From: Torge Matthies <tmatthies@codeweavers.com>
Date: Fri, 25 Oct 2024 10:47:30 +0200
Subject: [PATCH] mf/tests: Add network bytestream tests.
---
dlls/mf/tests/mf.c | 347 +++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 347 insertions(+)
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index d0f1f1cf0a4..61daaf35741 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -4726,6 +4726,7 @@ static void test_evr(void)
hr = IMFActivate_ActivateObject(activate, &IID_IMFMediaSink, (void **)&sink);
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ if (!sink) return;
check_interface(sink, &IID_IMFMediaSinkPreroll, TRUE);
check_interface(sink, &IID_IMFVideoRenderer, TRUE);
@@ -6803,6 +6804,351 @@ static void test_media_session_Close(void)
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
}
+static void test_network_bytestream(void)
+{
+ static const WCHAR *URL = L"http://test.winehq.org/tests/test.mp3";
+ static const WCHAR *EFFECTIVE_URL = L"http://test.winehq.org:80/tests/test.mp3";
+ static const WCHAR *CONTENT_TYPE = L"audio/mpeg";
+ static const BYTE LAST_MODIFIED_TIME[] = { 0x00, 0x3b, 0x4b, 0xbf, 0x05, 0x80, 0xd8, 0x01 };
+
+ IMFSourceResolver *resolver;
+ IUnknown *object = NULL, *bs = NULL;
+ MF_OBJECT_TYPE obj_type;
+ HRESULT hr;
+ void *ptr;
+
+ hr = MFStartup(MF_VERSION, MFSTARTUP_FULL);
+ ok(hr == S_OK, "Startup failure, hr %#lx.\n", hr);
+
+ hr = MFCreateSourceResolver(&resolver);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+
+ if (object) IUnknown_Release(object);
+
+ obj_type = (MF_OBJECT_TYPE)0xdeadbeef;
+ object = NULL;
+ hr = IMFSourceResolver_CreateObjectFromURL(resolver, L"http://nonexistent.url/file.mp4", MF_RESOLUTION_BYTESTREAM, NULL, &obj_type, &object);
+ todo_wine
+ ok(hr == NS_E_SERVER_NOT_FOUND, "Got hr %#lx.\n", hr);
+ ok(obj_type == MF_OBJECT_INVALID, "Unexpected obj_type %#x.\n", obj_type);
+ if (object) IUnknown_Release(object);
+
+ obj_type = (MF_OBJECT_TYPE)0xdeadbeef;
+ object = NULL;
+ hr = IMFSourceResolver_CreateObjectFromURL(resolver, L"http://test.winehq.org/tests/invalid.mp3", MF_RESOLUTION_BYTESTREAM, NULL, &obj_type, &object);
+ todo_wine
+ ok(hr == NS_E_FILE_NOT_FOUND, "Got hr %#lx.\n", hr);
+ todo_wine
+ ok(obj_type == MF_OBJECT_INVALID, "Unexpected obj_type %#x.\n", obj_type);
+ if (object) IUnknown_Release(object);
+
+ obj_type = (MF_OBJECT_TYPE)0xdeadbeef;
+ object = NULL;
+ hr = IMFSourceResolver_CreateObjectFromURL(resolver, URL, MF_RESOLUTION_BYTESTREAM, NULL, &obj_type, &object);
+ ok(hr == S_OK, "Got hr %#lx.\n", hr);
+ ok(obj_type == MF_OBJECT_BYTESTREAM, "Unexpected obj_type %#x.\n", obj_type);
+
+ ptr = NULL;
+ hr = IUnknown_QueryInterface(object, &IID_IMFAttributes, &ptr);
+ ok(hr == S_OK, "Got hr %#lx.\n", hr);
+ ok(ptr != NULL, "Got NULL ptr.\n");
+ if (SUCCEEDED(hr) && ptr)
+ {
+ IMFAttributes *attr = ptr;
+ UINT32 count = 0;
+ PROPVARIANT var;
+ GUID key = {0};
+
+ hr = IMFAttributes_GetCount(attr, &count);
+ ok(hr == S_OK, "Got hr %#lx\n", hr);
+ todo_wine
+ ok(count == 3, "count = %u\n", count);
+
+ PropVariantInit(&var);
+
+ hr = IMFAttributes_GetItemByIndex(attr, 0, &key, &var);
+ ok(hr == S_OK, "Got hr %#lx\n", hr);
+ ok(IsEqualGUID(&key, &MF_BYTESTREAM_EFFECTIVE_URL), "Got key %s\n", debugstr_guid(&key));
+ ok(var.vt == VT_LPWSTR, "Got type %d\n", var.vt);
+ todo_wine
+ ok(!lstrcmpW(var.pwszVal, EFFECTIVE_URL), "Got value %s\n", var.pszVal);
+ memset(&key, 0, sizeof(key));
+ PropVariantClear(&var);
+
+ hr = IMFAttributes_GetItemByIndex(attr, 1, &key, &var);
+ ok(hr == S_OK, "Got hr %#lx\n", hr);
+ ok(IsEqualGUID(&key, &MF_BYTESTREAM_CONTENT_TYPE), "Got key %s\n", debugstr_guid(&key));
+ ok(var.vt == VT_LPWSTR, "Got type %d\n", var.vt);
+ todo_wine
+ ok(!lstrcmpW(var.pwszVal, CONTENT_TYPE), "Got value %s\n", var.pszVal);
+ memset(&key, 0, sizeof(key));
+ PropVariantClear(&var);
+
+ hr = IMFAttributes_GetItemByIndex(attr, 2, &key, &var);
+ todo_wine
+ ok(hr == S_OK, "Got hr %#lx\n", hr);
+ todo_wine
+ ok(IsEqualGUID(&key, &MF_BYTESTREAM_LAST_MODIFIED_TIME), "Got key %s\n", debugstr_guid(&key));
+ todo_wine
+ ok(var.vt == (VT_VECTOR | VT_I1 | VT_NULL), "Got type %d\n", var.vt);
+ todo_wine
+ ok(var.blob.cbSize == sizeof(LAST_MODIFIED_TIME), "Got size %lu\n", var.blob.cbSize);
+ todo_wine
+ ok(var.blob.pBlobData != NULL, "Got NULL value\n");
+ if (var.blob.cbSize == sizeof(LAST_MODIFIED_TIME) && var.blob.pBlobData)
+ ok(!memcmp(var.blob.pBlobData, LAST_MODIFIED_TIME, sizeof(LAST_MODIFIED_TIME)), "Got wrong value\n");
+ memset(&key, 0, sizeof(key));
+ PropVariantClear(&var);
+
+ hr = IMFAttributes_GetItemByIndex(attr, 3, &key, &var);
+ ok(hr == E_INVALIDARG, "Got hr %#lx\n", hr);
+ ok(IsEqualGUID(&key, &GUID_NULL), "Got key %s\n", debugstr_guid(&key));
+ ok(var.vt == VT_EMPTY, "Got type %d\n", var.vt);
+ memset(&key, 0, sizeof(key));
+ PropVariantClear(&var);
+
+ IUnknown_Release((IUnknown *)ptr);
+ }
+
+ ptr = NULL;
+ hr = IUnknown_QueryInterface(object, &IID_IMFByteStreamCacheControl, &ptr);
+ todo_wine
+ ok(hr == S_OK, "Got hr %#lx.\n", hr);
+ todo_wine
+ ok(ptr != NULL, "Got NULL ptr.\n");
+ if (SUCCEEDED(hr) && ptr)
+ {
+ IMFByteStreamCacheControl *ctrl = ptr;
+ HRESULT hr;
+
+ hr = IMFByteStreamCacheControl_StopBackgroundTransfer(ctrl);
+ ok(hr == S_OK, "Got hr %#lx\n", hr);
+
+ IMFByteStreamCacheControl_Release(ctrl);
+ }
+
+ ptr = NULL;
+ hr = IUnknown_QueryInterface(object, &IID_IMFByteStreamBuffering, &ptr);
+ todo_wine
+ ok(hr == S_OK, "Got hr %#lx.\n", hr);
+ todo_wine
+ ok(ptr != NULL, "Got NULL ptr.\n");
+ if (SUCCEEDED(hr) && ptr)
+ {
+ MFBYTESTREAM_BUFFERING_PARAMS params = {0};
+ IMFByteStreamBuffering *buffering = ptr;
+ MF_LEAKY_BUCKET_PAIR bucket = {0};
+ HRESULT hr;
+
+ hr = IMFByteStreamBuffering_StopBuffering(buffering);
+ ok(hr == S_FALSE, "Got hr %#lx\n", hr);
+
+ hr = IMFByteStreamBuffering_EnableBuffering(buffering, FALSE);
+ ok(hr == S_OK, "Got hr %#lx\n", hr);
+
+ hr = IMFByteStreamBuffering_EnableBuffering(buffering, TRUE);
+ ok(hr == S_OK, "Got hr %#lx\n", hr);
+
+ hr = IMFByteStreamBuffering_StopBuffering(buffering);
+ ok(hr == S_OK || hr == S_FALSE, "Got hr %#lx\n", hr);
+
+ hr = IMFByteStreamBuffering_SetBufferingParams(buffering, NULL);
+ ok(hr == E_INVALIDARG, "Got hr %#lx\n", hr);
+
+ params.cbTotalFileSize = -1;
+ params.cbPlayableDataSize = -1;
+ params.prgBuckets = NULL;
+ params.cBuckets = 0;
+ params.qwNetBufferingTime = 0;
+ params.qwExtraBufferingTimeDuringSeek = 0;
+ params.qwPlayDuration = 0;
+ params.dRate = 1.0f;
+ hr = IMFByteStreamBuffering_SetBufferingParams(buffering, &params);
+ todo_wine
+ ok(hr == S_OK, "Got hr %#lx\n", hr);
+
+ params.cBuckets = 1;
+ hr = IMFByteStreamBuffering_SetBufferingParams(buffering, &params);
+ ok(hr == E_INVALIDARG, "Got hr %#lx\n", hr);
+
+ params.prgBuckets = &bucket;
+ bucket.dwBitrate = 0;
+ bucket.msBufferWindow = 0;
+ hr = IMFByteStreamBuffering_SetBufferingParams(buffering, &params);
+ todo_wine
+ ok(hr == S_OK, "Got hr %#lx\n", hr);
+
+ params.cbTotalFileSize = 0xdeadbeef;
+ params.cbPlayableDataSize = 0xdeadbeef;
+ bucket.dwBitrate = 0xdeadbeef;
+ bucket.msBufferWindow = 0xdeadbeef;
+ params.qwNetBufferingTime = 0xdeadbeef;
+ params.qwExtraBufferingTimeDuringSeek = 0xdeadbeef;
+ params.qwPlayDuration = 0xdeadbeef;
+ params.dRate = 12345.0f;
+ hr = IMFByteStreamBuffering_SetBufferingParams(buffering, &params);
+ todo_wine
+ ok(hr == S_OK, "Got hr %#lx\n", hr);
+
+ hr = IMFByteStreamBuffering_EnableBuffering(buffering, TRUE);
+ ok(hr == S_OK, "Got hr %#lx\n", hr);
+
+ IMFByteStreamBuffering_Release(buffering);
+ }
+
+ ptr = NULL;
+ hr = IUnknown_QueryInterface(object, &IID_IMFByteStreamTimeSeek, &ptr);
+ todo_wine
+ ok(hr == S_OK, "Got hr %#lx.\n", hr);
+ todo_wine
+ ok(ptr != NULL, "Got NULL ptr.\n");
+ if (SUCCEEDED(hr) && ptr)
+ {
+ QWORD start_time = 0xdeadbeef, stop_time = 0xdeadbef0, duration = 0xdeadbef1;
+ IMFByteStreamTimeSeek *seek = ptr;
+ BOOL b = 0xdeadbeef;
+ HRESULT hr;
+
+ hr = IMFByteStreamTimeSeek_GetTimeSeekResult(seek, NULL, NULL, NULL);
+ ok(hr == E_INVALIDARG, "Got hr %#lx\n", hr);
+
+ hr = IMFByteStreamTimeSeek_GetTimeSeekResult(seek, &start_time, &stop_time, &duration);
+ ok(hr == MF_E_INVALIDREQUEST, "Got hr %#lx\n", hr);
+ ok(start_time == 0, "start_time = %I64u\n", start_time);
+ ok(stop_time == 0, "stop_time = %I64u\n", stop_time);
+ ok(duration == 0, "duration = %I64u\n", duration);
+
+ hr = IMFByteStreamTimeSeek_IsTimeSeekSupported(seek, NULL);
+ ok(hr == S_FALSE, "Got hr %#lx\n", hr);
+
+ hr = IMFByteStreamTimeSeek_IsTimeSeekSupported(seek, &b);
+ ok(hr == S_FALSE, "Got hr %#lx\n", hr);
+ ok(!b, "supported = %x\n", b);
+
+ hr = IMFByteStreamTimeSeek_TimeSeek(seek, 0);
+ ok(hr == MF_E_INVALIDREQUEST, "Got hr %#lx\n", hr);
+
+ hr = IMFByteStreamTimeSeek_GetTimeSeekResult(seek, &start_time, &stop_time, &duration);
+ ok(hr == MF_E_INVALIDREQUEST, "Got hr %#lx\n", hr);
+ ok(start_time == 0, "start_time = %I64u\n", start_time);
+ ok(stop_time == 0, "stop_time = %I64u\n", stop_time);
+ ok(duration == 0, "duration = %I64u\n", duration);
+
+ IMFByteStreamTimeSeek_Release(seek);
+ }
+
+ {
+ BYTE *tmp = malloc(8192);
+ ULONG read = 0, written = 0;
+ QWORD len = 0;
+
+ hr = IMFByteStream_SetLength((IMFByteStream*)object, 1000);
+ ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr);
+
+ hr = IMFByteStream_SetCurrentPosition((IMFByteStream*)object, 1000);
+ ok(hr == S_OK, "Got hr %#lx.\n", hr);
+
+ hr = IMFByteStream_Read((IMFByteStream*)object, tmp, 8192, &read);
+ ok(hr == S_OK, "Got hr %#lx.\n", hr);
+ ok(read == 3365, "read = %lu\n", read);
+
+ hr = IMFByteStream_SetCurrentPosition((IMFByteStream*)object, 1000);
+ ok(hr == S_OK, "Got hr %#lx.\n", hr);
+
+ hr = IMFByteStream_Write((IMFByteStream*)object, tmp, 1000, &written);
+ ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr);
+ ok(written == 0, "written = %lu\n", written);
+
+ free(tmp);
+
+ hr = IMFByteStream_GetLength((IMFByteStream*)object, &len);
+ ok(hr == S_OK, "Got hr %#lx\n", hr);
+ ok(len != 0, "len = %I64u\n", len);
+
+ hr = IMFByteStream_Flush((IMFByteStream*)object);
+ todo_wine
+ ok(hr == S_OK, "Got hr %#lx\n", hr);
+ }
+
+ ptr = NULL;
+ hr = MFGetService(object, &MFNETSOURCE_STATISTICS_SERVICE, &IID_IPropertyStore, &ptr);
+ ok(hr == S_OK, "Got hr %#lx.\n", hr);
+ ok(ptr != NULL, "Got NULL ptr.\n");
+ if (SUCCEEDED(hr) && ptr)
+ {
+ IPropertyStore *pstore = ptr;
+ DWORD count = 0;
+
+ ptr = NULL;
+ hr = IUnknown_QueryInterface(object, &IID_IPropertyStore, &ptr);
+ ok(hr == S_OK, "Got hr %#lx.\n", hr);
+ ok(ptr == (void *)pstore, "Got different IPropertyStore: %p != %p.\n", ptr, pstore);
+ IPropertyStore_Release((IPropertyStore *)ptr);
+
+ hr = IPropertyStore_GetCount(pstore, &count);
+ ok(hr == S_OK, "Got hr %#lx.\n", hr);
+ ok(count == 0, "Got count %lu.\n", count);
+
+ IPropertyStore_Release(pstore);
+ }
+
+ ptr = NULL;
+ hr = IUnknown_QueryInterface(object, &IID_IMFMediaEventGenerator, &ptr);
+ todo_wine
+ ok(hr == S_OK, "Got hr %#lx.\n", hr);
+ todo_wine
+ ok(ptr != NULL, "Got NULL ptr.\n");
+ if (SUCCEEDED(hr) && ptr)
+ {
+ IMFMediaEvent *evt = (void *)(DWORD_PTR)0xdeadbeef;
+ BOOL seen_caps_changed = FALSE, buffering = FALSE;
+ IMFMediaEventGenerator *gen = ptr;
+ MediaEventType type;
+ HRESULT hr;
+
+ while (SUCCEEDED(hr = IMFMediaEventGenerator_GetEvent(gen, MF_EVENT_FLAG_NO_WAIT, &evt)))
+ {
+ type = (MediaEventType)0xdeadbeef;
+ hr = IMFMediaEvent_GetType(evt, &type);
+ ok(hr == S_OK, "Got hr %#lx.\n", hr);
+
+ if (type == MEByteStreamCharacteristicsChanged)
+ {
+ ok(!seen_caps_changed, "got multiple MEByteStreamCharacteristicsChanged events\n");
+ seen_caps_changed = TRUE;
+ }
+ else if (type == MEBufferingStarted)
+ {
+ ok(!buffering, "got MEBufferingStopped without MEBufferingStarted\n");
+ buffering = TRUE;
+ }
+ else if (type == MEBufferingStopped)
+ buffering = FALSE;
+ else
+ ok(0, "Unexpected event type %#lx\n", type);
+
+ IMFMediaEvent_Release(evt);
+ }
+ ok(hr == MF_E_NO_EVENTS_AVAILABLE, "Got hr %#lx.\n", hr);
+
+ IMFMediaEventGenerator_Release(gen);
+ }
+
+ obj_type = (MF_OBJECT_TYPE)0xdeadbeef;
+ bs = NULL;
+ hr = IMFSourceResolver_CreateObjectFromByteStream(resolver, (void *)object, NULL, MF_RESOLUTION_MEDIASOURCE, NULL, &obj_type, &bs);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(obj_type == MF_OBJECT_MEDIASOURCE, "Unexpected obj_type %#x.\n", obj_type);
+
+ if (bs) IUnknown_Release(bs);
+ if (object) IUnknown_Release(object);
+
+ IMFSourceResolver_Release(resolver);
+
+ hr = MFShutdown();
+ ok(hr == S_OK, "Shutdown failure, hr %#lx.\n", hr);
+}
+
START_TEST(mf)
{
init_functions();
@@ -6838,5 +7184,6 @@ START_TEST(mf)
test_media_session_Start();
test_MFEnumDeviceSources();
test_media_session_Close();
+ test_network_bytestream();
test_media_session_source_shutdown();
}
--
2.45.2

View File

@@ -0,0 +1,346 @@
From 68227ee19646a7c98f1b1e6eed72a7a6a2a21fc1 Mon Sep 17 00:00:00 2001
From: Torge Matthies <tmatthies@codeweavers.com>
Date: Fri, 25 Oct 2024 10:47:31 +0200
Subject: [PATCH] mf: Implement and use HttpSchemePlugin.
---
dlls/mf/main.c | 2 ++
dlls/mf/mf.idl | 6 ++++++
dlls/mf/mf.rgs | 16 ++++++++++++++--
dlls/mf/mf_private.h | 1 +
dlls/mf/scheme_handler.c | 33 +++++++++++++++++++++++++++++++++
dlls/mf/tests/mf.c | 38 ++++----------------------------------
dlls/mfplat/mfplat.spec | 3 +++
dlls/mfplat/network.c | 5 +++++
8 files changed, 68 insertions(+), 36 deletions(-)
diff --git a/dlls/mf/main.c b/dlls/mf/main.c
index e74a4ae8e4c..120343a1be2 100644
--- a/dlls/mf/main.c
+++ b/dlls/mf/main.c
@@ -549,6 +549,7 @@ static const IClassFactoryVtbl class_factory_vtbl =
};
static struct class_factory file_scheme_handler_factory = { { &class_factory_vtbl }, file_scheme_handler_construct };
+static struct class_factory http_scheme_handler_factory = { { &class_factory_vtbl }, http_scheme_handler_construct };
static struct class_factory urlmon_scheme_handler_factory = { { &class_factory_vtbl }, urlmon_scheme_handler_construct };
static const struct class_object
@@ -559,6 +560,7 @@ static const struct class_object
class_objects[] =
{
{ &CLSID_FileSchemePlugin, &file_scheme_handler_factory.IClassFactory_iface },
+ { &CLSID_HttpSchemePlugin, &http_scheme_handler_factory.IClassFactory_iface },
{ &CLSID_UrlmonSchemePlugin, &urlmon_scheme_handler_factory.IClassFactory_iface },
};
diff --git a/dlls/mf/mf.idl b/dlls/mf/mf.idl
index 4f5ef36c965..ca05a991ca9 100644
--- a/dlls/mf/mf.idl
+++ b/dlls/mf/mf.idl
@@ -25,6 +25,12 @@
]
coclass FileSchemePlugin { }
+[
+ threading(both),
+ uuid(44cb442b-9da9-49df-b3fd-023777b16e50)
+]
+coclass HttpSchemePlugin {}
+
[
threading(both),
uuid(9ec4b4f9-3029-45ad-947b-344de2a249e2)
diff --git a/dlls/mf/mf.rgs b/dlls/mf/mf.rgs
index f06576baccb..778b07e65ed 100644
--- a/dlls/mf/mf.rgs
+++ b/dlls/mf/mf.rgs
@@ -14,11 +14,23 @@ HKLM
}
'http:'
{
- val '{9ec4b4f9-3029-45ad-947b-344de2a249e2}' = s 'Urlmon Scheme Handler'
+ val '{44cb442b-9da9-49df-b3fd-023777b16e50}' = s 'Http Scheme Handler'
}
'https:'
{
- val '{9ec4b4f9-3029-45ad-947b-344de2a249e2}' = s 'Urlmon Scheme Handler'
+ val '{44cb442b-9da9-49df-b3fd-023777b16e50}' = s 'Http Scheme Handler'
+ }
+ 'httpd:'
+ {
+ val '{44cb442b-9da9-49df-b3fd-023777b16e50}' = s 'Http Scheme Handler'
+ }
+ 'httpsd:'
+ {
+ val '{44cb442b-9da9-49df-b3fd-023777b16e50}' = s 'Http Scheme Handler'
+ }
+ 'mms:'
+ {
+ val '{44cb442b-9da9-49df-b3fd-023777b16e50}' = s 'Http Scheme Handler'
}
}
}
diff --git a/dlls/mf/mf_private.h b/dlls/mf/mf_private.h
index 1f2ef17a8c9..adb35e14194 100644
--- a/dlls/mf/mf_private.h
+++ b/dlls/mf/mf_private.h
@@ -114,6 +114,7 @@ static inline const char *debugstr_propvar(const PROPVARIANT *v)
}
extern HRESULT file_scheme_handler_construct(REFIID riid, void **obj);
+extern HRESULT http_scheme_handler_construct(REFIID riid, void **obj);
extern HRESULT urlmon_scheme_handler_construct(REFIID riid, void **obj);
extern BOOL mf_is_sample_copier_transform(IMFTransform *transform);
diff --git a/dlls/mf/scheme_handler.c b/dlls/mf/scheme_handler.c
index 7e92748aeb9..3cd16319b2a 100644
--- a/dlls/mf/scheme_handler.c
+++ b/dlls/mf/scheme_handler.c
@@ -483,6 +483,39 @@ HRESULT file_scheme_handler_construct(REFIID riid, void **obj)
return hr;
}
+WINAPI HRESULT __wine_create_http_bytestream(const WCHAR *url, void **out);
+
+static HRESULT http_stream_create(const WCHAR *url, DWORD flags, IMFByteStream **out)
+{
+ if (flags & MF_RESOLUTION_WRITE)
+ return E_INVALIDARG;
+
+ return __wine_create_http_bytestream(url, (void **)out);
+}
+
+HRESULT http_scheme_handler_construct(REFIID riid, void **obj)
+{
+ struct scheme_handler *handler;
+ HRESULT hr;
+
+ TRACE("%s, %p.\n", debugstr_guid(riid), obj);
+
+ if (!(handler = calloc(1, sizeof(*handler))))
+ return E_OUTOFMEMORY;
+
+ handler->IMFSchemeHandler_iface.lpVtbl = &scheme_handler_vtbl;
+ handler->IMFAsyncCallback_iface.lpVtbl = &scheme_handler_callback_vtbl;
+ handler->refcount = 1;
+ list_init(&handler->results);
+ InitializeCriticalSection(&handler->cs);
+ handler->create_stream = http_stream_create;
+
+ hr = IMFSchemeHandler_QueryInterface(&handler->IMFSchemeHandler_iface, riid, obj);
+ IMFSchemeHandler_Release(&handler->IMFSchemeHandler_iface);
+
+ return hr;
+}
+
static HRESULT urlmon_stream_create(const WCHAR *url, DWORD flags, IMFByteStream **out)
{
IMFAttributes *attributes;
diff --git a/dlls/mf/tests/mf.c b/dlls/mf/tests/mf.c
index 61daaf35741..39dfe3ca1b2 100644
--- a/dlls/mf/tests/mf.c
+++ b/dlls/mf/tests/mf.c
@@ -5384,7 +5384,6 @@ static void test_scheme_resolvers(void)
for (i = 0; i < ARRAY_SIZE(urls); i++)
{
hr = IMFSourceResolver_CreateObjectFromURL(resolver, urls[i], MF_RESOLUTION_BYTESTREAM, NULL, &type, &object);
- todo_wine_if(i >= 2)
ok(hr == S_OK, "got hr %#lx\n", hr);
if (hr != S_OK)
continue;
@@ -5408,7 +5407,6 @@ static void test_scheme_resolvers(void)
hr = IMFAttributes_GetItem(attributes, &MF_BYTESTREAM_CONTENT_TYPE, NULL);
ok(hr == S_OK, "got hr %#lx\n", hr);
hr = IMFAttributes_GetItem(attributes, &MF_BYTESTREAM_LAST_MODIFIED_TIME, NULL);
- todo_wine
ok(hr == S_OK, "got hr %#lx\n", hr);
IMFAttributes_Release(attributes);
@@ -5416,8 +5414,7 @@ static void test_scheme_resolvers(void)
ok(hr == S_OK, "got hr %#lx\n", hr);
hr = IMFByteStream_GetCapabilities(byte_stream, &caps);
ok(hr == S_OK, "got hr %#lx\n", hr);
- todo_wine
- ok(caps == (expect_caps | MFBYTESTREAM_IS_PARTIALLY_DOWNLOADED)
+ ok(caps == expect_caps || caps == (expect_caps | MFBYTESTREAM_IS_PARTIALLY_DOWNLOADED)
|| caps == (expect_caps | MFBYTESTREAM_DOES_NOT_USE_NETWORK),
"got caps %#lx\n", caps);
hr = IMFByteStream_GetLength(byte_stream, &length);
@@ -5436,35 +5433,25 @@ static void test_scheme_resolvers(void)
ok(hr == MF_E_UNSUPPORTED_BYTESTREAM_TYPE, "got hr %#lx\n", hr);
hr = IMFSourceResolver_CreateObjectFromURL(resolver, L"http://test.winehq.bla/tests/test.mp3", MF_RESOLUTION_BYTESTREAM, NULL, &type, &object);
- todo_wine
ok(hr == NS_E_SERVER_NOT_FOUND, "got hr %#lx\n", hr);
hr = IMFSourceResolver_CreateObjectFromURL(resolver, L"https://test.winehq.bla/tests/test.mp3", MF_RESOLUTION_BYTESTREAM, NULL, &type, &object);
- todo_wine
ok(hr == WININET_E_NAME_NOT_RESOLVED, "got hr %#lx\n", hr);
hr = IMFSourceResolver_CreateObjectFromURL(resolver, L"httpd://test.winehq.bla/tests/test.mp3", MF_RESOLUTION_BYTESTREAM, NULL, &type, &object);
- todo_wine
ok(hr == WININET_E_NAME_NOT_RESOLVED, "got hr %#lx\n", hr);
hr = IMFSourceResolver_CreateObjectFromURL(resolver, L"httpsd://test.winehq.bla/tests/test.mp3", MF_RESOLUTION_BYTESTREAM, NULL, &type, &object);
- todo_wine
ok(hr == WININET_E_NAME_NOT_RESOLVED, "got hr %#lx\n", hr);
hr = IMFSourceResolver_CreateObjectFromURL(resolver, L"mms://test.winehq.bla/tests/test.mp3", MF_RESOLUTION_BYTESTREAM, NULL, &type, &object);
- todo_wine
ok(hr == WININET_E_NAME_NOT_RESOLVED, "got hr %#lx\n", hr);
hr = IMFSourceResolver_CreateObjectFromURL(resolver, L"http://test.winehq.org/tests/invalid.mp3", MF_RESOLUTION_BYTESTREAM, NULL, &type, &object);
- todo_wine
ok(hr == NS_E_FILE_NOT_FOUND, "got hr %#lx\n", hr);
hr = IMFSourceResolver_CreateObjectFromURL(resolver, L"https://test.winehq.org/tests/invalid.mp3", MF_RESOLUTION_BYTESTREAM, NULL, &type, &object);
- todo_wine
ok(hr == NS_E_FILE_NOT_FOUND, "got hr %#lx\n", hr);
hr = IMFSourceResolver_CreateObjectFromURL(resolver, L"httpd://test.winehq.org/tests/invalid.mp3", MF_RESOLUTION_BYTESTREAM, NULL, &type, &object);
- todo_wine
ok(hr == NS_E_FILE_NOT_FOUND, "got hr %#lx\n", hr);
hr = IMFSourceResolver_CreateObjectFromURL(resolver, L"httpsd://test.winehq.org/tests/invalid.mp3", MF_RESOLUTION_BYTESTREAM, NULL, &type, &object);
- todo_wine
ok(hr == NS_E_FILE_NOT_FOUND, "got hr %#lx\n", hr);
hr = IMFSourceResolver_CreateObjectFromURL(resolver, L"mms://test.winehq.org/tests/invalid.mp3", MF_RESOLUTION_BYTESTREAM, NULL, &type, &object);
- todo_wine
ok(hr == MF_E_UNSUPPORTED_BYTESTREAM_TYPE, "got hr %#lx\n", hr);
IMFSourceResolver_Release(resolver);
@@ -6828,7 +6815,6 @@ static void test_network_bytestream(void)
obj_type = (MF_OBJECT_TYPE)0xdeadbeef;
object = NULL;
hr = IMFSourceResolver_CreateObjectFromURL(resolver, L"http://nonexistent.url/file.mp4", MF_RESOLUTION_BYTESTREAM, NULL, &obj_type, &object);
- todo_wine
ok(hr == NS_E_SERVER_NOT_FOUND, "Got hr %#lx.\n", hr);
ok(obj_type == MF_OBJECT_INVALID, "Unexpected obj_type %#x.\n", obj_type);
if (object) IUnknown_Release(object);
@@ -6836,9 +6822,7 @@ static void test_network_bytestream(void)
obj_type = (MF_OBJECT_TYPE)0xdeadbeef;
object = NULL;
hr = IMFSourceResolver_CreateObjectFromURL(resolver, L"http://test.winehq.org/tests/invalid.mp3", MF_RESOLUTION_BYTESTREAM, NULL, &obj_type, &object);
- todo_wine
ok(hr == NS_E_FILE_NOT_FOUND, "Got hr %#lx.\n", hr);
- todo_wine
ok(obj_type == MF_OBJECT_INVALID, "Unexpected obj_type %#x.\n", obj_type);
if (object) IUnknown_Release(object);
@@ -6861,7 +6845,6 @@ static void test_network_bytestream(void)
hr = IMFAttributes_GetCount(attr, &count);
ok(hr == S_OK, "Got hr %#lx\n", hr);
- todo_wine
ok(count == 3, "count = %u\n", count);
PropVariantInit(&var);
@@ -6870,7 +6853,6 @@ static void test_network_bytestream(void)
ok(hr == S_OK, "Got hr %#lx\n", hr);
ok(IsEqualGUID(&key, &MF_BYTESTREAM_EFFECTIVE_URL), "Got key %s\n", debugstr_guid(&key));
ok(var.vt == VT_LPWSTR, "Got type %d\n", var.vt);
- todo_wine
ok(!lstrcmpW(var.pwszVal, EFFECTIVE_URL), "Got value %s\n", var.pszVal);
memset(&key, 0, sizeof(key));
PropVariantClear(&var);
@@ -6879,21 +6861,15 @@ static void test_network_bytestream(void)
ok(hr == S_OK, "Got hr %#lx\n", hr);
ok(IsEqualGUID(&key, &MF_BYTESTREAM_CONTENT_TYPE), "Got key %s\n", debugstr_guid(&key));
ok(var.vt == VT_LPWSTR, "Got type %d\n", var.vt);
- todo_wine
ok(!lstrcmpW(var.pwszVal, CONTENT_TYPE), "Got value %s\n", var.pszVal);
memset(&key, 0, sizeof(key));
PropVariantClear(&var);
hr = IMFAttributes_GetItemByIndex(attr, 2, &key, &var);
- todo_wine
ok(hr == S_OK, "Got hr %#lx\n", hr);
- todo_wine
ok(IsEqualGUID(&key, &MF_BYTESTREAM_LAST_MODIFIED_TIME), "Got key %s\n", debugstr_guid(&key));
- todo_wine
ok(var.vt == (VT_VECTOR | VT_I1 | VT_NULL), "Got type %d\n", var.vt);
- todo_wine
ok(var.blob.cbSize == sizeof(LAST_MODIFIED_TIME), "Got size %lu\n", var.blob.cbSize);
- todo_wine
ok(var.blob.pBlobData != NULL, "Got NULL value\n");
if (var.blob.cbSize == sizeof(LAST_MODIFIED_TIME) && var.blob.pBlobData)
ok(!memcmp(var.blob.pBlobData, LAST_MODIFIED_TIME, sizeof(LAST_MODIFIED_TIME)), "Got wrong value\n");
@@ -6912,9 +6888,7 @@ static void test_network_bytestream(void)
ptr = NULL;
hr = IUnknown_QueryInterface(object, &IID_IMFByteStreamCacheControl, &ptr);
- todo_wine
ok(hr == S_OK, "Got hr %#lx.\n", hr);
- todo_wine
ok(ptr != NULL, "Got NULL ptr.\n");
if (SUCCEEDED(hr) && ptr)
{
@@ -6929,9 +6903,7 @@ static void test_network_bytestream(void)
ptr = NULL;
hr = IUnknown_QueryInterface(object, &IID_IMFByteStreamBuffering, &ptr);
- todo_wine
ok(hr == S_OK, "Got hr %#lx.\n", hr);
- todo_wine
ok(ptr != NULL, "Got NULL ptr.\n");
if (SUCCEEDED(hr) && ptr)
{
@@ -6998,9 +6970,7 @@ static void test_network_bytestream(void)
ptr = NULL;
hr = IUnknown_QueryInterface(object, &IID_IMFByteStreamTimeSeek, &ptr);
- todo_wine
ok(hr == S_OK, "Got hr %#lx.\n", hr);
- todo_wine
ok(ptr != NULL, "Got NULL ptr.\n");
if (SUCCEEDED(hr) && ptr)
{
@@ -7059,6 +7029,9 @@ static void test_network_bytestream(void)
ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr);
ok(written == 0, "written = %lu\n", written);
+ hr = IMFByteStream_BeginWrite((IMFByteStream*)object, tmp, 1000, (void *)(DWORD_PTR)0xdeadbeef, NULL);
+ ok(hr == E_NOTIMPL, "Got hr %#lx.\n", hr);
+
free(tmp);
hr = IMFByteStream_GetLength((IMFByteStream*)object, &len);
@@ -7066,7 +7039,6 @@ static void test_network_bytestream(void)
ok(len != 0, "len = %I64u\n", len);
hr = IMFByteStream_Flush((IMFByteStream*)object);
- todo_wine
ok(hr == S_OK, "Got hr %#lx\n", hr);
}
@@ -7094,9 +7066,7 @@ static void test_network_bytestream(void)
ptr = NULL;
hr = IUnknown_QueryInterface(object, &IID_IMFMediaEventGenerator, &ptr);
- todo_wine
ok(hr == S_OK, "Got hr %#lx.\n", hr);
- todo_wine
ok(ptr != NULL, "Got NULL ptr.\n");
if (SUCCEEDED(hr) && ptr)
{
diff --git a/dlls/mfplat/mfplat.spec b/dlls/mfplat/mfplat.spec
index 7b356f9f457..f55f49b7e8c 100644
--- a/dlls/mfplat/mfplat.spec
+++ b/dlls/mfplat/mfplat.spec
@@ -181,3 +181,6 @@
@ stdcall -ret64 MFllMulDiv(int64 int64 int64 int64)
@ stub PropVariantFromStream
@ stub PropVariantToStream
+
+# Wine extension
+@ stdcall __wine_create_http_bytestream(wstr ptr)
diff --git a/dlls/mfplat/network.c b/dlls/mfplat/network.c
index d9a2981f5a7..2369dbf31fd 100644
--- a/dlls/mfplat/network.c
+++ b/dlls/mfplat/network.c
@@ -2012,3 +2012,8 @@ error:
hr = MF_E_UNSUPPORTED_BYTESTREAM_TYPE;
return hr;
}
+
+WINAPI HRESULT __wine_create_http_bytestream(const WCHAR *url, void **out)
+{
+ return create_http_bytestream(url, out);
+}
--
2.45.2

View File

@@ -0,0 +1,5 @@
Fixes: [52769] mf: Add HTTP/HTTPS IMFByteStream implementation.
# MR https://gitlab.winehq.org/wine/wine/-/merge_requests/6733
# Game: The good life.

View File

@@ -1,4 +1,4 @@
From c4694f8dfffa56648976c1a05bb4788262a8677b Mon Sep 17 00:00:00 2001
From 5bcc58b53dd99c5d6d85141d5658a5d7e98d8253 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?R=C3=A9mi=20Bernon?= <rbernon@codeweavers.com>
Date: Tue, 8 Sep 2020 18:43:52 +0200
Subject: [PATCH] msxml3: Implement FreeThreadedXMLHTTP60.
@@ -27,10 +27,10 @@ index 7e59a223143..5044c4e2c79 100644
SOURCES = \
diff --git a/dlls/msxml3/factory.c b/dlls/msxml3/factory.c
index 218ba87c4a8..ed14bd63a87 100644
index e35839db2a3..0e2482d61be 100644
--- a/dlls/msxml3/factory.c
+++ b/dlls/msxml3/factory.c
@@ -281,6 +281,7 @@ static HRESULT DOMClassFactory_Create(const GUID *clsid, REFIID riid, void **ppv
@@ -279,6 +279,7 @@ static HRESULT DOMClassFactory_Create(const GUID *clsid, REFIID riid, void **ppv
static ClassFactory xmldoccf = { { &ClassFactoryVtbl }, XMLDocument_create };
static ClassFactory httpreqcf = { { &ClassFactoryVtbl }, XMLHTTPRequest_create };
@@ -38,7 +38,7 @@ index 218ba87c4a8..ed14bd63a87 100644
static ClassFactory serverhttp = { { &ClassFactoryVtbl }, ServerXMLHTTP_create };
static ClassFactory xsltemplatecf = { { &ClassFactoryVtbl }, XSLTemplate_create };
static ClassFactory mxnsmanagercf = { {&ClassFactoryVtbl }, MXNamespaceManager_create };
@@ -342,6 +343,10 @@ HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, void **ppv )
@@ -340,6 +341,10 @@ HRESULT WINAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, void **ppv )
{
cf = &httpreqcf.IClassFactory_iface;
}
@@ -50,7 +50,7 @@ index 218ba87c4a8..ed14bd63a87 100644
IsEqualCLSID( rclsid, &CLSID_ServerXMLHTTP30 ) ||
IsEqualCLSID( rclsid, &CLSID_ServerXMLHTTP40 ) ||
diff --git a/dlls/msxml3/httprequest.c b/dlls/msxml3/httprequest.c
index 6e4ab4c6519..412958a2a40 100644
index 90be57ebabf..15a591c90be 100644
--- a/dlls/msxml3/httprequest.c
+++ b/dlls/msxml3/httprequest.c
@@ -37,10 +37,12 @@
@@ -65,9 +65,9 @@ index 6e4ab4c6519..412958a2a40 100644
-WINE_DEFAULT_DEBUG_CHANNEL(msxml);
+WINE_DEFAULT_DEBUG_CHANNEL(xmlhttp);
static const WCHAR colspaceW[] = {':',' ',0};
static const WCHAR crlfW[] = {'\r','\n',0};
@@ -2054,6 +2056,468 @@ static const struct IServerXMLHTTPRequestVtbl ServerXMLHTTPRequestVtbl =
static const DWORD safety_supported_options =
INTERFACESAFE_FOR_UNTRUSTED_CALLER |
@@ -2044,6 +2046,468 @@ static const struct IServerXMLHTTPRequestVtbl ServerXMLHTTPRequestVtbl =
ServerXMLHTTPRequest_setOption
};
@@ -536,7 +536,7 @@ index 6e4ab4c6519..412958a2a40 100644
static void init_httprequest(httprequest *req)
{
req->IXMLHTTPRequest_iface.lpVtbl = &XMLHTTPRequestVtbl;
@@ -2103,6 +2567,35 @@ HRESULT XMLHTTPRequest_create(void **obj)
@@ -2093,6 +2557,35 @@ HRESULT XMLHTTPRequest_create(void **obj)
return S_OK;
}
@@ -573,7 +573,7 @@ index 6e4ab4c6519..412958a2a40 100644
{
serverhttp *req;
diff --git a/dlls/msxml3/msxml_private.h b/dlls/msxml3/msxml_private.h
index 54f54995c76..6188414c5ce 100644
index ea492bc6b36..c2827563884 100644
--- a/dlls/msxml3/msxml_private.h
+++ b/dlls/msxml3/msxml_private.h
@@ -343,6 +343,7 @@ extern HRESULT XMLDocument_create(void**);
@@ -1061,7 +1061,7 @@ index 7214d23c5dc..320a7e04fa3 100644
/*
* Note that because of a #define in msxml2.h, we end up initializing
diff --git a/include/msxml6.idl b/include/msxml6.idl
index 7396826a1f6..b2d8bd3b337 100644
index bf7e0905057..a02f7b2db14 100644
--- a/include/msxml6.idl
+++ b/include/msxml6.idl
@@ -1715,17 +1715,6 @@ interface ISAXDeclHandler : IUnknown
@@ -1101,5 +1101,5 @@ index 7396826a1f6..b2d8bd3b337 100644
helpstring("XML DOM Document 6.0"),
progid("Msxml2.DOMDocument.6.0"),
--
2.43.0
2.47.2

View File

@@ -0,0 +1,69 @@
From f9e8c57e69b4edeefca2894fa2b48e07291dce80 Mon Sep 17 00:00:00 2001
From: Alistair Leslie-Hughes <leslie_alistair@hotmail.com>
Date: Wed, 5 Mar 2025 11:59:15 +1100
Subject: [PATCH] msxml3: IXMLDOMDocument3::preserveWhiteSpace fix for a non
VARIANT_BOOL value.
0024:trace:msxml:domdoc_put_preserveWhiteSpace (068F0520)->(1)
Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=21940
---
dlls/msxml3/domdoc.c | 2 +-
dlls/msxml3/tests/domdoc.c | 21 +++++++++++++++++++++
2 files changed, 22 insertions(+), 1 deletion(-)
diff --git a/dlls/msxml3/domdoc.c b/dlls/msxml3/domdoc.c
index 8407f914c4f..e1e8e6c803f 100644
--- a/dlls/msxml3/domdoc.c
+++ b/dlls/msxml3/domdoc.c
@@ -2746,7 +2746,7 @@ static HRESULT WINAPI domdoc_put_preserveWhiteSpace(
{
domdoc *This = impl_from_IXMLDOMDocument3( iface );
TRACE("(%p)->(%d)\n", This, isPreserving);
- This->properties->preserving = isPreserving;
+ This->properties->preserving = isPreserving == VARIANT_TRUE ? VARIANT_TRUE : VARIANT_FALSE;
return S_OK;
}
diff --git a/dlls/msxml3/tests/domdoc.c b/dlls/msxml3/tests/domdoc.c
index 76f0c827c2a..dcb83f781ba 100644
--- a/dlls/msxml3/tests/domdoc.c
+++ b/dlls/msxml3/tests/domdoc.c
@@ -4859,6 +4859,16 @@ static void test_whitespace(void)
check_ws_ignored(class_ptr->name, doc3, NULL);
check_ws_preserved(class_ptr->name, doc4, NULL);
+ hr = IXMLDOMDocument2_put_preserveWhiteSpace(doc4, 1);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ hr = IXMLDOMDocument2_get_preserveWhiteSpace(doc4, &b);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(b == VARIANT_FALSE, "expected true\n");
+ check_ws_ignored(class_ptr->name, doc4, NULL);
+
+ hr = IXMLDOMDocument2_put_preserveWhiteSpace(doc4, VARIANT_TRUE);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+
/* setting after loading xml affects trimming of leading/trailing ws only */
hr = IXMLDOMDocument2_put_preserveWhiteSpace(doc1, VARIANT_TRUE);
ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
@@ -4925,6 +4935,17 @@ static void test_whitespace(void)
IXMLDOMNodeList_Release(list);
IXMLDOMElement_Release(root);
+ hr = IXMLDOMDocument2_put_preserveWhiteSpace(doc1, VARIANT_TRUE);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ hr = IXMLDOMDocument2_get_preserveWhiteSpace(doc1, &b);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(b == VARIANT_TRUE, "expected true %d\n", b);
+ hr = IXMLDOMDocument2_put_preserveWhiteSpace(doc1, 1);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ hr = IXMLDOMDocument2_get_preserveWhiteSpace(doc1, &b);
+ ok(hr == S_OK, "Unexpected hr %#lx.\n", hr);
+ ok(b == VARIANT_FALSE, "expected true %d\n", b);
+
IXMLDOMDocument2_Release(doc1);
free_bstrs();
--
2.47.2

View File

@@ -0,0 +1,8 @@
Fixes: [21940] msxml: Improve support for the whitespace value.
# PR https://gitlab.winehq.org/wine/wine/-/merge_requests/7494
#
# NOTES:
# Current tests fail when 1 is passed as a WhiteSpace value.

View File

@@ -1,4 +1,4 @@
From e93243e7863c239a1e4b2d91cb12dcd2cb373b36 Mon Sep 17 00:00:00 2001
From ca8481ab78a89e7433f25c340b7e3965d9f3e092 Mon Sep 17 00:00:00 2001
From: Sebastian Lackner <sebastian@fds-team.de>
Date: Sat, 30 May 2015 02:23:15 +0200
Subject: [PATCH] ntdll: Add support for hiding wine version information from
@@ -10,7 +10,7 @@ Subject: [PATCH] ntdll: Add support for hiding wine version information from
2 files changed, 103 insertions(+), 1 deletion(-)
diff --git a/dlls/ntdll/loader.c b/dlls/ntdll/loader.c
index 9dcb475c148..9e61c38d773 100644
index d263a6a786d..04dd4c106e3 100644
--- a/dlls/ntdll/loader.c
+++ b/dlls/ntdll/loader.c
@@ -88,6 +88,9 @@ const WCHAR system_dir[] = L"C:\\windows\\system32\\";
@@ -32,7 +32,7 @@ index 9dcb475c148..9e61c38d773 100644
struct ldr_notification
{
struct list entry;
@@ -2022,6 +2027,96 @@ NTSTATUS WINAPI LdrUnlockLoaderLock( ULONG flags, ULONG_PTR magic )
@@ -2049,6 +2054,96 @@ NTSTATUS WINAPI LdrUnlockLoaderLock( ULONG flags, ULONG_PTR magic )
}
@@ -129,16 +129,16 @@ index 9dcb475c148..9e61c38d773 100644
/******************************************************************
* LdrGetProcedureAddress (NTDLL.@)
*/
@@ -2042,7 +2137,7 @@ NTSTATUS WINAPI LdrGetProcedureAddress(HMODULE module, const ANSI_STRING *name,
@@ -2069,7 +2164,7 @@ NTSTATUS WINAPI LdrGetProcedureAddress(HMODULE module, const ANSI_STRING *name,
{
void *proc = name ? find_named_export( module, exports, exp_size, name->Buffer, -1, NULL )
: find_ordinal_export( module, exports, exp_size, ord - exports->Base, NULL );
void *proc = name ? find_named_export( module, exports, exp_size, name->Buffer, -1, NULL, wm, TRUE )
: find_ordinal_export( module, exports, exp_size, ord - exports->Base, NULL, wm, TRUE );
- if (proc)
+ if (proc && !is_hidden_export( proc ))
{
*address = proc;
ret = STATUS_SUCCESS;
@@ -2304,6 +2399,8 @@ static void build_ntdll_module(void)
@@ -2340,6 +2435,8 @@ static void build_ntdll_module(void)
wm->ldr.Flags &= ~LDR_DONT_RESOLVE_REFS;
node_ntdll = wm->ldr.DdagNode;
if (TRACE_ON(relay)) RELAY_SetupDLL( module );
@@ -164,5 +164,5 @@ index fb5fb311646..a342cbf7d26 100644
static inline void ascii_to_unicode( WCHAR *dst, const char *src, size_t len )
{
--
2.45.2
2.47.2

View File

@@ -1,4 +1,4 @@
From 7b9165576a8ba0e317c280c9bedd2137fb745149 Mon Sep 17 00:00:00 2001
From c8fe58f588703421d2e85eb6376d93e3299f0880 Mon Sep 17 00:00:00 2001
From: "Erich E. Hoover" <erich.e.hoover@gmail.com>
Date: Thu, 16 Jan 2014 20:56:49 -0700
Subject: [PATCH] ntdll: Add support for creating reparse points.
@@ -13,10 +13,10 @@ Signed-off-by: Erich E. Hoover <erich.e.hoover@gmail.com>
5 files changed, 451 insertions(+), 19 deletions(-)
diff --git a/configure.ac b/configure.ac
index 0368b661e61..eb7f8223b51 100644
index a171e143136..abd91b6b51f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -2082,6 +2082,8 @@ AC_CHECK_FUNCS(\
@@ -2084,6 +2084,8 @@ AC_CHECK_FUNCS(\
prctl \
sched_getcpu \
sched_yield \
@@ -26,12 +26,12 @@ index 0368b661e61..eb7f8223b51 100644
setprogname \
sigprocmask \
diff --git a/dlls/ntdll/Makefile.in b/dlls/ntdll/Makefile.in
index 37bd6c86e31..f9a15d28ed2 100644
index f7558bb5d86..aad14d17e61 100644
--- a/dlls/ntdll/Makefile.in
+++ b/dlls/ntdll/Makefile.in
@@ -4,7 +4,7 @@ UNIXLIB = ntdll.so
IMPORTLIB = ntdll
IMPORTS = $(MUSL_PE_LIBS) winecrt0
@@ -5,7 +5,7 @@ IMPORTLIB = ntdll
IMPORTS = $(TOMCRYPT_PE_LIBS) $(MUSL_PE_LIBS)
EXTRAINCL = $(TOMCRYPT_PE_CFLAGS)
UNIX_CFLAGS = $(UNWIND_CFLAGS)
-UNIX_LIBS = $(IOKIT_LIBS) $(COREFOUNDATION_LIBS) $(CORESERVICES_LIBS) $(RT_LIBS) $(PTHREAD_LIBS) $(UNWIND_LIBS) $(I386_LIBS) $(PROCSTAT_LIBS)
+UNIX_LIBS = $(IOKIT_LIBS) $(COREFOUNDATION_LIBS) $(CORESERVICES_LIBS) $(RT_LIBS) $(PTHREAD_LIBS) $(UNWIND_LIBS) $(I386_LIBS) $(PROCSTAT_LIBS) -lm
@@ -39,7 +39,7 @@ index 37bd6c86e31..f9a15d28ed2 100644
EXTRADLLFLAGS = -nodefaultlibs
i386_EXTRADLLFLAGS = -Wl,--image-base,0x7bc00000
diff --git a/dlls/ntdll/tests/file.c b/dlls/ntdll/tests/file.c
index 02bdf67796d..63b5ebcab54 100644
index cc0afdbdb64..00f90552e84 100644
--- a/dlls/ntdll/tests/file.c
+++ b/dlls/ntdll/tests/file.c
@@ -38,6 +38,7 @@
@@ -50,7 +50,7 @@ index 02bdf67796d..63b5ebcab54 100644
#ifndef IO_COMPLETION_ALL_ACCESS
#define IO_COMPLETION_ALL_ACCESS 0x001F0003
@@ -5952,32 +5953,154 @@ static void test_mailslot_name(void)
@@ -6028,32 +6029,154 @@ static void test_mailslot_name(void)
CloseHandle( device );
}
@@ -222,7 +222,7 @@ index 02bdf67796d..63b5ebcab54 100644
}
static void test_set_io_completion_ex(void)
@@ -6117,6 +6240,6 @@ START_TEST(file)
@@ -6193,6 +6316,6 @@ START_TEST(file)
test_ioctl();
test_query_ea();
test_flush_buffers_file();
@@ -231,7 +231,7 @@ index 02bdf67796d..63b5ebcab54 100644
+ test_mailslot_name();
}
diff --git a/dlls/ntdll/unix/file.c b/dlls/ntdll/unix/file.c
index 8bc69557057..00ac7377dd4 100644
index faef06ae084..a47c3d90df4 100644
--- a/dlls/ntdll/unix/file.c
+++ b/dlls/ntdll/unix/file.c
@@ -36,6 +36,8 @@
@@ -389,7 +389,7 @@ index 8bc69557057..00ac7377dd4 100644
static BOOL fd_is_mount_point( int fd, const struct stat *st )
{
struct stat parent;
@@ -3416,6 +3536,181 @@ done:
@@ -3441,6 +3561,181 @@ done:
}
@@ -571,7 +571,7 @@ index 8bc69557057..00ac7377dd4 100644
/******************************************************************************
* lookup_unix_name
*
@@ -6246,6 +6541,13 @@ NTSTATUS WINAPI NtFsControlFile( HANDLE handle, HANDLE event, PIO_APC_ROUTINE ap
@@ -6271,6 +6566,13 @@ NTSTATUS WINAPI NtFsControlFile( HANDLE handle, HANDLE event, PIO_APC_ROUTINE ap
break;
}
@@ -602,5 +602,5 @@ index 980235abdc9..90248b4897c 100644
{
UCHAR DataBuffer[1];
--
2.45.2
2.47.2

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