diff --git a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
index 6937aaa490..72b6547b68 100644
--- a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
+++ b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
@@ -1981,7 +1981,6 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_graphics/native/juce_CoreGraphicsHelpers_mac.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.h"
- "../../../../../modules/juce_graphics/native/juce_Direct2DHelpers_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DHwndContext_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DHwndContext_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DImage_windows.cpp"
@@ -4635,7 +4634,6 @@ set_source_files_properties(
"../../../../../modules/juce_graphics/native/juce_CoreGraphicsHelpers_mac.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.h"
- "../../../../../modules/juce_graphics/native/juce_Direct2DHelpers_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DHwndContext_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DHwndContext_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DImage_windows.cpp"
diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
index 0ebdc91dc7..ff6d1306c2 100644
--- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
@@ -2406,9 +2406,6 @@
true
-
- true
-
true
diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
index d2615a7b33..6932001272 100644
--- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
@@ -3184,9 +3184,6 @@
JUCE Modules\juce_graphics\native
-
- JUCE Modules\juce_graphics\native
-
JUCE Modules\juce_graphics\native
diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
index f424965b46..08e1fb346e 100644
--- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
@@ -2406,9 +2406,6 @@
true
-
- true
-
true
diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
index dc2f1aba16..78181d2f39 100644
--- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
@@ -3184,9 +3184,6 @@
JUCE Modules\juce_graphics\native
-
- JUCE Modules\juce_graphics\native
-
JUCE Modules\juce_graphics\native
diff --git a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
index 728848ae48..74fb7850f5 100644
--- a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
+++ b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
@@ -1743,7 +1743,6 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_graphics/native/juce_CoreGraphicsHelpers_mac.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.h"
- "../../../../../modules/juce_graphics/native/juce_Direct2DHelpers_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DHwndContext_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DHwndContext_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DImage_windows.cpp"
@@ -4011,7 +4010,6 @@ set_source_files_properties(
"../../../../../modules/juce_graphics/native/juce_CoreGraphicsHelpers_mac.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.h"
- "../../../../../modules/juce_graphics/native/juce_Direct2DHelpers_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DHwndContext_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DHwndContext_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DImage_windows.cpp"
diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
index 2462f9fe16..26faa98a92 100644
--- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
+++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
@@ -2097,9 +2097,6 @@
true
-
- true
-
true
diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
index 5c1f3f3100..ae73bf9263 100644
--- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
+++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
@@ -2692,9 +2692,6 @@
JUCE Modules\juce_graphics\native
-
- JUCE Modules\juce_graphics\native
-
JUCE Modules\juce_graphics\native
diff --git a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
index e9d3bbcf13..38a6fdaeca 100644
--- a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
+++ b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
@@ -1873,7 +1873,6 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_graphics/native/juce_CoreGraphicsHelpers_mac.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.h"
- "../../../../../modules/juce_graphics/native/juce_Direct2DHelpers_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DHwndContext_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DHwndContext_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DImage_windows.cpp"
@@ -4294,7 +4293,6 @@ set_source_files_properties(
"../../../../../modules/juce_graphics/native/juce_CoreGraphicsHelpers_mac.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.h"
- "../../../../../modules/juce_graphics/native/juce_Direct2DHelpers_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DHwndContext_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DHwndContext_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DImage_windows.cpp"
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
index f9a74186af..819d9e6515 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
@@ -2231,9 +2231,6 @@
true
-
- true
-
true
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
index 6b0a3c25d0..a2b6d40386 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
@@ -2899,9 +2899,6 @@
JUCE Modules\juce_graphics\native
-
- JUCE Modules\juce_graphics\native
-
JUCE Modules\juce_graphics\native
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
index 8e53833351..9ad8708791 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
@@ -2231,9 +2231,6 @@
true
-
- true
-
true
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
index e0abc080ed..638ee8e089 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
@@ -2899,9 +2899,6 @@
JUCE Modules\juce_graphics\native
-
- JUCE Modules\juce_graphics\native
-
JUCE Modules\juce_graphics\native
diff --git a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
index 5aefd05e71..2790ed2335 100644
--- a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
+++ b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
@@ -1762,7 +1762,6 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_graphics/native/juce_CoreGraphicsHelpers_mac.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.h"
- "../../../../../modules/juce_graphics/native/juce_Direct2DHelpers_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DHwndContext_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DHwndContext_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DImage_windows.cpp"
@@ -4110,7 +4109,6 @@ set_source_files_properties(
"../../../../../modules/juce_graphics/native/juce_CoreGraphicsHelpers_mac.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DGraphicsContext_windows.h"
- "../../../../../modules/juce_graphics/native/juce_Direct2DHelpers_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DHwndContext_windows.cpp"
"../../../../../modules/juce_graphics/native/juce_Direct2DHwndContext_windows.h"
"../../../../../modules/juce_graphics/native/juce_Direct2DImage_windows.cpp"
diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
index d87ef157d8..a7b2bbfedd 100644
--- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
+++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
@@ -2118,9 +2118,6 @@
true
-
- true
-
true
diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
index 43f7543ab1..6f0578ebf9 100644
--- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
+++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
@@ -2746,9 +2746,6 @@
JUCE Modules\juce_graphics\native
-
- JUCE Modules\juce_graphics\native
-
JUCE Modules\juce_graphics\native
diff --git a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj
index 082e3b8daa..87dc2749b0 100644
--- a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj
+++ b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj
@@ -1260,9 +1260,6 @@
true
-
- true
-
true
diff --git a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
index 04cc52b656..38c21b37e2 100644
--- a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
+++ b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
@@ -1585,9 +1585,6 @@
JUCE Modules\juce_graphics\native
-
- JUCE Modules\juce_graphics\native
-
JUCE Modules\juce_graphics\native
diff --git a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj
index 686034b3b4..c8414367c6 100644
--- a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj
+++ b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj
@@ -1260,9 +1260,6 @@
true
-
- true
-
true
diff --git a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters
index bd919d3745..bad3e2c0ab 100644
--- a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters
+++ b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters
@@ -1585,9 +1585,6 @@
JUCE Modules\juce_graphics\native
-
- JUCE Modules\juce_graphics\native
-
JUCE Modules\juce_graphics\native
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
index 36bab30742..4865e4f55a 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
@@ -2239,9 +2239,6 @@
true
-
- true
-
true
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
index 34eb2eac29..d8104cbaca 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -2947,9 +2947,6 @@
JUCE Modules\juce_graphics\native
-
- JUCE Modules\juce_graphics\native
-
JUCE Modules\juce_graphics\native
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
index b26ba19806..99e600adb3 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
@@ -2239,9 +2239,6 @@
true
-
- true
-
true
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
index 2ccbb18b5f..cfa2f6cc46 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -2947,9 +2947,6 @@
JUCE Modules\juce_graphics\native
-
- JUCE Modules\juce_graphics\native
-
JUCE Modules\juce_graphics\native
diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj
index fed1c6b250..bbfce27bd3 100644
--- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj
+++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj
@@ -2117,9 +2117,6 @@
true
-
- true
-
true
diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters
index 62abda9a53..01163314a8 100644
--- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters
+++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters
@@ -2743,9 +2743,6 @@
JUCE Modules\juce_graphics\native
-
- JUCE Modules\juce_graphics\native
-
JUCE Modules\juce_graphics\native
diff --git a/modules/juce_graphics/juce_graphics.cpp b/modules/juce_graphics/juce_graphics.cpp
index 161f712efe..4222121cb0 100644
--- a/modules/juce_graphics/juce_graphics.cpp
+++ b/modules/juce_graphics/juce_graphics.cpp
@@ -229,7 +229,6 @@ extern "C"
#include "native/juce_DirectWriteTypeface_windows.cpp"
#include "native/juce_IconHelpers_windows.cpp"
- #include "native/juce_Direct2DHelpers_windows.cpp"
#include "native/juce_Direct2DResources_windows.cpp"
#include "native/juce_Direct2DGraphicsContext_windows.cpp"
#include "native/juce_Direct2DHwndContext_windows.cpp"
diff --git a/modules/juce_graphics/native/juce_Direct2DHelpers_windows.cpp b/modules/juce_graphics/native/juce_Direct2DHelpers_windows.cpp
deleted file mode 100644
index 585bddc3c0..0000000000
--- a/modules/juce_graphics/native/juce_Direct2DHelpers_windows.cpp
+++ /dev/null
@@ -1,364 +0,0 @@
-/*
- ==============================================================================
-
- This file is part of the JUCE framework.
- Copyright (c) Raw Material Software Limited
-
- JUCE is an open source framework subject to commercial or open source
- licensing.
-
- By downloading, installing, or using the JUCE framework, or combining the
- JUCE framework with any other source code, object code, content or any other
- copyrightable work, you agree to the terms of the JUCE End User Licence
- Agreement, and all incorporated terms including the JUCE Privacy Policy and
- the JUCE Website Terms of Service, as applicable, which will bind you. If you
- do not agree to the terms of these agreements, we will not license the JUCE
- framework to you, and you must discontinue the installation or download
- process and cease use of the JUCE framework.
-
- JUCE End User Licence Agreement: https://juce.com/legal/juce-8-licence/
- JUCE Privacy Policy: https://juce.com/juce-privacy-policy
- JUCE Website Terms of Service: https://juce.com/juce-website-terms-of-service/
-
- Or:
-
- You may also use this code under the terms of the AGPLv3:
- https://www.gnu.org/licenses/agpl-3.0.en.html
-
- THE JUCE FRAMEWORK IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL
- WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF
- MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.
-
- ==============================================================================
-*/
-
-namespace juce
-{
-
-class ScopedMultithread
-{
-public:
- explicit ScopedMultithread (ID2D1Multithread* multithreadIn)
- : multithread (addComSmartPtrOwner (multithreadIn))
- {
- multithreadIn->Enter();
- }
-
- ~ScopedMultithread()
- {
- multithread->Leave();
- }
-
-private:
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ScopedMultithread)
-
- ComSmartPtr multithread;
-};
-
-/* ScopedGeometryWithSink creates an ID2D1PathGeometry object with an open sink. */
-struct ScopedGeometryWithSink
-{
- ScopedGeometryWithSink (ID2D1Factory* factory, D2D1_FILL_MODE fillMode)
- {
- if (const auto hr = factory->CreatePathGeometry (geometry.resetAndGetPointerAddress()); FAILED (hr))
- return;
-
- if (const auto hr = geometry->Open (sink.resetAndGetPointerAddress()); FAILED (hr))
- return;
-
- sink->SetFillMode (fillMode);
- }
-
- ~ScopedGeometryWithSink()
- {
- if (sink == nullptr)
- return;
-
- const auto hr = sink->Close();
- jassertquiet (SUCCEEDED (hr));
- }
-
- ComSmartPtr geometry;
- ComSmartPtr sink;
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ScopedGeometryWithSink)
-};
-
-class WindowsScopedEvent
-{
-public:
- explicit WindowsScopedEvent (HANDLE handleIn)
- : handle (handleIn)
- {
- }
-
- WindowsScopedEvent()
- : WindowsScopedEvent (CreateEvent (nullptr, FALSE, FALSE, nullptr))
- {
- }
-
- HANDLE getHandle() const noexcept
- {
- return handle.get();
- }
-
-private:
- std::unique_ptr, FunctionPointerDestructor> handle;
-};
-
-//==============================================================================
-struct D2DHelpers
-{
- static bool isTransformAxisAligned (const AffineTransform& transform)
- {
- return transform.mat01 == 0.0f && transform.mat10 == 0.0f;
- }
-
- static void pathToGeometrySink (const Path& path,
- ID2D1GeometrySink* sink,
- const AffineTransform& transform,
- D2D1_FIGURE_BEGIN figureMode)
- {
- class ScopedFigure
- {
- public:
- ScopedFigure (ID2D1GeometrySink* s, D2D1_POINT_2F pt, D2D1_FIGURE_BEGIN mode)
- : sink (s)
- {
- sink->BeginFigure (pt, mode);
- }
-
- ~ScopedFigure()
- {
- if (sink != nullptr)
- sink->EndFigure (end);
- }
-
- void setClosed()
- {
- end = D2D1_FIGURE_END_CLOSED;
- }
-
- private:
- ID2D1GeometrySink* sink = nullptr;
- D2D1_FIGURE_END end = D2D1_FIGURE_END_OPEN;
-
- JUCE_DECLARE_NON_COPYABLE (ScopedFigure)
- JUCE_DECLARE_NON_MOVEABLE (ScopedFigure)
- };
-
- // Every call to BeginFigure must have a matching call to EndFigure. But - the Path does not necessarily
- // have matching startNewSubPath and closePath markers.
- D2D1_POINT_2F lastLocation{};
- std::optional figure;
- Path::Iterator it (path);
-
- const auto doTransform = [&transform] (float x, float y)
- {
- transform.transformPoint (x, y);
- return D2D1_POINT_2F { x, y };
- };
-
- const auto updateFigure = [&] (float x, float y)
- {
- if (! figure.has_value())
- figure.emplace (sink, lastLocation, figureMode);
-
- lastLocation = doTransform (x, y);
- };
-
- while (it.next())
- {
- switch (it.elementType)
- {
- case Path::Iterator::lineTo:
- updateFigure (it.x1, it.y1);
- sink->AddLine (lastLocation);
- break;
-
- case Path::Iterator::quadraticTo:
- updateFigure (it.x2, it.y2);
- sink->AddQuadraticBezier ({ doTransform (it.x1, it.y1), lastLocation });
- break;
-
- case Path::Iterator::cubicTo:
- updateFigure (it.x3, it.y3);
- sink->AddBezier ({ doTransform (it.x1, it.y1), doTransform (it.x2, it.y2), lastLocation });
- break;
-
- case Path::Iterator::closePath:
- if (figure.has_value())
- figure->setClosed();
-
- figure.reset();
- break;
-
- case Path::Iterator::startNewSubPath:
- figure.reset();
- lastLocation = doTransform (it.x1, it.y1);
- figure.emplace (sink, lastLocation, figureMode);
- break;
- }
- }
- }
-
- static D2D1_POINT_2F pointTransformed (Point pt, const AffineTransform& transform)
- {
- transform.transformPoint (pt.x, pt.y);
- return { (FLOAT) pt.x, (FLOAT) pt.y };
- }
-
- static void rectToGeometrySink (const Rectangle& rect,
- ID2D1GeometrySink* sink,
- const AffineTransform& transform,
- D2D1_FIGURE_BEGIN figureMode)
- {
- const auto a = pointTransformed (rect.getTopLeft(), transform);
- const auto b = pointTransformed (rect.getTopRight(), transform);
- const auto c = pointTransformed (rect.getBottomRight(), transform);
- const auto d = pointTransformed (rect.getBottomLeft(), transform);
-
- sink->BeginFigure (a, figureMode);
- sink->AddLine (b);
- sink->AddLine (c);
- sink->AddLine (d);
- sink->EndFigure (D2D1_FIGURE_END_CLOSED);
- }
-
- static ComSmartPtr rectListToPathGeometry (ID2D1Factory* factory,
- const RectangleList& clipRegion,
- const AffineTransform& transform,
- D2D1_FILL_MODE fillMode,
- D2D1_FIGURE_BEGIN figureMode,
- [[maybe_unused]] Direct2DMetrics* metrics)
- {
- JUCE_D2DMETRICS_SCOPED_ELAPSED_TIME (metrics, createGeometryTime)
- ScopedGeometryWithSink objects { factory, fillMode };
-
- if (objects.sink == nullptr)
- return {};
-
- for (int i = clipRegion.getNumRectangles(); --i >= 0;)
- rectToGeometrySink (clipRegion.getRectangle (i), objects.sink, transform, figureMode);
-
- return objects.geometry;
- }
-
- static ComSmartPtr pathToPathGeometry (ID2D1Factory* factory,
- const Path& path,
- const AffineTransform& transform,
- D2D1_FIGURE_BEGIN figureMode,
- [[maybe_unused]] Direct2DMetrics* metrics)
- {
- JUCE_D2DMETRICS_SCOPED_ELAPSED_TIME (metrics, createGeometryTime)
- ScopedGeometryWithSink objects { factory, path.isUsingNonZeroWinding() ? D2D1_FILL_MODE_WINDING : D2D1_FILL_MODE_ALTERNATE };
-
- if (objects.sink == nullptr)
- return {};
-
- pathToGeometrySink (path, objects.sink, transform, figureMode);
-
- return objects.geometry;
- }
-
- static ComSmartPtr pathStrokeTypeToStrokeStyle (ID2D1Factory1* factory, const PathStrokeType& strokeType)
- {
- // JUCE JointStyle ID2D1StrokeStyle
- // --------------- ----------------
- // mitered D2D1_LINE_JOIN_MITER
- // curved D2D1_LINE_JOIN_ROUND
- // beveled D2D1_LINE_JOIN_BEVEL
- //
- // JUCE EndCapStyle ID2D1StrokeStyle
- // ---------------- ----------------
- // butt D2D1_CAP_STYLE_FLAT
- // square D2D1_CAP_STYLE_SQUARE
- // rounded D2D1_CAP_STYLE_ROUND
- auto lineJoin = D2D1_LINE_JOIN_MITER;
- switch (strokeType.getJointStyle())
- {
- case PathStrokeType::JointStyle::mitered:
- // already set
- break;
-
- case PathStrokeType::JointStyle::curved:
- lineJoin = D2D1_LINE_JOIN_ROUND;
- break;
-
- case PathStrokeType::JointStyle::beveled:
- lineJoin = D2D1_LINE_JOIN_BEVEL;
- break;
-
- default:
- // invalid EndCapStyle
- jassertfalse;
- break;
- }
-
- auto capStyle = D2D1_CAP_STYLE_FLAT;
- switch (strokeType.getEndStyle())
- {
- case PathStrokeType::EndCapStyle::butt:
- // already set
- break;
-
- case PathStrokeType::EndCapStyle::square:
- capStyle = D2D1_CAP_STYLE_SQUARE;
- break;
-
- case PathStrokeType::EndCapStyle::rounded:
- capStyle = D2D1_CAP_STYLE_ROUND;
- break;
-
- default:
- // invalid EndCapStyle
- jassertfalse;
- break;
- }
-
- D2D1_STROKE_STYLE_PROPERTIES1 strokeStyleProperties
- {
- capStyle,
- capStyle,
- capStyle,
- lineJoin,
- strokeType.getStrokeThickness(),
- D2D1_DASH_STYLE_SOLID,
- 0.0f,
- D2D1_STROKE_TRANSFORM_TYPE_NORMAL
- };
- ComSmartPtr strokeStyle;
- factory->CreateStrokeStyle (strokeStyleProperties,
- nullptr,
- 0,
- strokeStyle.resetAndGetPointerAddress());
-
- return strokeStyle;
- }
-
-};
-
-//==============================================================================
-/** Heap storage for a DirectWrite glyph run */
-class DirectWriteGlyphRun
-{
-public:
- void replace (Span> positions, float scale)
- {
- advances.resize (positions.size(), 0.0f);
- offsets.resize (positions.size());
- std::transform (positions.begin(), positions.end(), offsets.begin(), [&] (auto& g)
- {
- return DWRITE_GLYPH_OFFSET { g.x / scale, -g.y };
- });
- }
-
- auto* getAdvances() const { return advances.data(); }
- auto* getOffsets() const { return offsets .data(); }
-
-private:
- std::vector advances;
- std::vector offsets;
-};
-
-} // namespace juce
diff --git a/modules/juce_graphics/native/juce_DirectX_windows.h b/modules/juce_graphics/native/juce_DirectX_windows.h
index b7f19264fe..2160a19b46 100644
--- a/modules/juce_graphics/native/juce_DirectX_windows.h
+++ b/modules/juce_graphics/native/juce_DirectX_windows.h
@@ -37,6 +37,332 @@ namespace juce
constexpr auto enableDirectXDebugLayer = false;
+class ScopedMultithread
+{
+public:
+ explicit ScopedMultithread (ID2D1Multithread* multithreadIn)
+ : multithread (addComSmartPtrOwner (multithreadIn))
+ {
+ multithreadIn->Enter();
+ }
+
+ ~ScopedMultithread()
+ {
+ multithread->Leave();
+ }
+
+private:
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ScopedMultithread)
+
+ ComSmartPtr multithread;
+};
+
+/* ScopedGeometryWithSink creates an ID2D1PathGeometry object with an open sink. */
+struct ScopedGeometryWithSink
+{
+ ScopedGeometryWithSink (ID2D1Factory* factory, D2D1_FILL_MODE fillMode)
+ {
+ if (const auto hr = factory->CreatePathGeometry (geometry.resetAndGetPointerAddress()); FAILED (hr))
+ return;
+
+ if (const auto hr = geometry->Open (sink.resetAndGetPointerAddress()); FAILED (hr))
+ return;
+
+ sink->SetFillMode (fillMode);
+ }
+
+ ~ScopedGeometryWithSink()
+ {
+ if (sink == nullptr)
+ return;
+
+ const auto hr = sink->Close();
+ jassertquiet (SUCCEEDED (hr));
+ }
+
+ ComSmartPtr geometry;
+ ComSmartPtr sink;
+
+ JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (ScopedGeometryWithSink)
+};
+
+class WindowsScopedEvent
+{
+public:
+ explicit WindowsScopedEvent (HANDLE handleIn)
+ : handle (handleIn)
+ {
+ }
+
+ WindowsScopedEvent()
+ : WindowsScopedEvent (CreateEvent (nullptr, FALSE, FALSE, nullptr))
+ {
+ }
+
+ HANDLE getHandle() const noexcept
+ {
+ return handle.get();
+ }
+
+private:
+ std::unique_ptr, FunctionPointerDestructor> handle;
+};
+
+//==============================================================================
+struct D2DHelpers
+{
+ static bool isTransformAxisAligned (const AffineTransform& transform)
+ {
+ return transform.mat01 == 0.0f && transform.mat10 == 0.0f;
+ }
+
+ static void pathToGeometrySink (const Path& path,
+ ID2D1GeometrySink* sink,
+ const AffineTransform& transform,
+ D2D1_FIGURE_BEGIN figureMode)
+ {
+ class ScopedFigure
+ {
+ public:
+ ScopedFigure (ID2D1GeometrySink* s, D2D1_POINT_2F pt, D2D1_FIGURE_BEGIN mode)
+ : sink (s)
+ {
+ sink->BeginFigure (pt, mode);
+ }
+
+ ~ScopedFigure()
+ {
+ if (sink != nullptr)
+ sink->EndFigure (end);
+ }
+
+ void setClosed()
+ {
+ end = D2D1_FIGURE_END_CLOSED;
+ }
+
+ private:
+ ID2D1GeometrySink* sink = nullptr;
+ D2D1_FIGURE_END end = D2D1_FIGURE_END_OPEN;
+
+ JUCE_DECLARE_NON_COPYABLE (ScopedFigure)
+ JUCE_DECLARE_NON_MOVEABLE (ScopedFigure)
+ };
+
+ // Every call to BeginFigure must have a matching call to EndFigure. But - the Path does not necessarily
+ // have matching startNewSubPath and closePath markers.
+ D2D1_POINT_2F lastLocation{};
+ std::optional figure;
+ Path::Iterator it (path);
+
+ const auto doTransform = [&transform] (float x, float y)
+ {
+ transform.transformPoint (x, y);
+ return D2D1_POINT_2F { x, y };
+ };
+
+ const auto updateFigure = [&] (float x, float y)
+ {
+ if (! figure.has_value())
+ figure.emplace (sink, lastLocation, figureMode);
+
+ lastLocation = doTransform (x, y);
+ };
+
+ while (it.next())
+ {
+ switch (it.elementType)
+ {
+ case Path::Iterator::lineTo:
+ updateFigure (it.x1, it.y1);
+ sink->AddLine (lastLocation);
+ break;
+
+ case Path::Iterator::quadraticTo:
+ updateFigure (it.x2, it.y2);
+ sink->AddQuadraticBezier ({ doTransform (it.x1, it.y1), lastLocation });
+ break;
+
+ case Path::Iterator::cubicTo:
+ updateFigure (it.x3, it.y3);
+ sink->AddBezier ({ doTransform (it.x1, it.y1), doTransform (it.x2, it.y2), lastLocation });
+ break;
+
+ case Path::Iterator::closePath:
+ if (figure.has_value())
+ figure->setClosed();
+
+ figure.reset();
+ break;
+
+ case Path::Iterator::startNewSubPath:
+ figure.reset();
+ lastLocation = doTransform (it.x1, it.y1);
+ figure.emplace (sink, lastLocation, figureMode);
+ break;
+ }
+ }
+ }
+
+ static D2D1_POINT_2F pointTransformed (Point pt, const AffineTransform& transform)
+ {
+ transform.transformPoint (pt.x, pt.y);
+ return { (FLOAT) pt.x, (FLOAT) pt.y };
+ }
+
+ static void rectToGeometrySink (const Rectangle& rect,
+ ID2D1GeometrySink* sink,
+ const AffineTransform& transform,
+ D2D1_FIGURE_BEGIN figureMode)
+ {
+ const auto a = pointTransformed (rect.getTopLeft(), transform);
+ const auto b = pointTransformed (rect.getTopRight(), transform);
+ const auto c = pointTransformed (rect.getBottomRight(), transform);
+ const auto d = pointTransformed (rect.getBottomLeft(), transform);
+
+ sink->BeginFigure (a, figureMode);
+ sink->AddLine (b);
+ sink->AddLine (c);
+ sink->AddLine (d);
+ sink->EndFigure (D2D1_FIGURE_END_CLOSED);
+ }
+
+ static ComSmartPtr rectListToPathGeometry (ID2D1Factory* factory,
+ const RectangleList& clipRegion,
+ const AffineTransform& transform,
+ D2D1_FILL_MODE fillMode,
+ D2D1_FIGURE_BEGIN figureMode,
+ [[maybe_unused]] Direct2DMetrics* metrics)
+ {
+ JUCE_D2DMETRICS_SCOPED_ELAPSED_TIME (metrics, createGeometryTime)
+ ScopedGeometryWithSink objects { factory, fillMode };
+
+ if (objects.sink == nullptr)
+ return {};
+
+ for (int i = clipRegion.getNumRectangles(); --i >= 0;)
+ rectToGeometrySink (clipRegion.getRectangle (i), objects.sink, transform, figureMode);
+
+ return objects.geometry;
+ }
+
+ static ComSmartPtr pathToPathGeometry (ID2D1Factory* factory,
+ const Path& path,
+ const AffineTransform& transform,
+ D2D1_FIGURE_BEGIN figureMode,
+ [[maybe_unused]] Direct2DMetrics* metrics)
+ {
+ JUCE_D2DMETRICS_SCOPED_ELAPSED_TIME (metrics, createGeometryTime)
+ ScopedGeometryWithSink objects { factory, path.isUsingNonZeroWinding() ? D2D1_FILL_MODE_WINDING : D2D1_FILL_MODE_ALTERNATE };
+
+ if (objects.sink == nullptr)
+ return {};
+
+ pathToGeometrySink (path, objects.sink, transform, figureMode);
+
+ return objects.geometry;
+ }
+
+ static ComSmartPtr pathStrokeTypeToStrokeStyle (ID2D1Factory1* factory, const PathStrokeType& strokeType)
+ {
+ // JUCE JointStyle ID2D1StrokeStyle
+ // --------------- ----------------
+ // mitered D2D1_LINE_JOIN_MITER
+ // curved D2D1_LINE_JOIN_ROUND
+ // beveled D2D1_LINE_JOIN_BEVEL
+ //
+ // JUCE EndCapStyle ID2D1StrokeStyle
+ // ---------------- ----------------
+ // butt D2D1_CAP_STYLE_FLAT
+ // square D2D1_CAP_STYLE_SQUARE
+ // rounded D2D1_CAP_STYLE_ROUND
+ auto lineJoin = D2D1_LINE_JOIN_MITER;
+ switch (strokeType.getJointStyle())
+ {
+ case PathStrokeType::JointStyle::mitered:
+ // already set
+ break;
+
+ case PathStrokeType::JointStyle::curved:
+ lineJoin = D2D1_LINE_JOIN_ROUND;
+ break;
+
+ case PathStrokeType::JointStyle::beveled:
+ lineJoin = D2D1_LINE_JOIN_BEVEL;
+ break;
+
+ default:
+ // invalid EndCapStyle
+ jassertfalse;
+ break;
+ }
+
+ auto capStyle = D2D1_CAP_STYLE_FLAT;
+ switch (strokeType.getEndStyle())
+ {
+ case PathStrokeType::EndCapStyle::butt:
+ // already set
+ break;
+
+ case PathStrokeType::EndCapStyle::square:
+ capStyle = D2D1_CAP_STYLE_SQUARE;
+ break;
+
+ case PathStrokeType::EndCapStyle::rounded:
+ capStyle = D2D1_CAP_STYLE_ROUND;
+ break;
+
+ default:
+ // invalid EndCapStyle
+ jassertfalse;
+ break;
+ }
+
+ D2D1_STROKE_STYLE_PROPERTIES1 strokeStyleProperties
+ {
+ capStyle,
+ capStyle,
+ capStyle,
+ lineJoin,
+ strokeType.getStrokeThickness(),
+ D2D1_DASH_STYLE_SOLID,
+ 0.0f,
+ D2D1_STROKE_TRANSFORM_TYPE_NORMAL
+ };
+ ComSmartPtr strokeStyle;
+ factory->CreateStrokeStyle (strokeStyleProperties,
+ nullptr,
+ 0,
+ strokeStyle.resetAndGetPointerAddress());
+
+ return strokeStyle;
+ }
+
+};
+
+//==============================================================================
+/** Heap storage for a DirectWrite glyph run */
+class DirectWriteGlyphRun
+{
+public:
+ void replace (Span> positions, float scale)
+ {
+ advances.resize (positions.size(), 0.0f);
+ offsets.resize (positions.size());
+ std::transform (positions.begin(), positions.end(), offsets.begin(), [&] (auto& g)
+ {
+ return DWRITE_GLYPH_OFFSET { g.x / scale, -g.y };
+ });
+ }
+
+ auto* getAdvances() const { return advances.data(); }
+ auto* getOffsets() const { return offsets .data(); }
+
+private:
+ std::vector advances;
+ std::vector offsets;
+};
+
struct DxgiAdapter : public ReferenceCountedObject
{
using Ptr = ReferenceCountedObjectPtr;
diff --git a/modules/juce_gui_basics/juce_gui_basics.cpp b/modules/juce_gui_basics/juce_gui_basics.cpp
index e70d1a3401..21dc145cb6 100644
--- a/modules/juce_gui_basics/juce_gui_basics.cpp
+++ b/modules/juce_gui_basics/juce_gui_basics.cpp
@@ -91,6 +91,7 @@
#include
#include
#include
+ #include
#if JUCE_ETW_TRACELOGGING
#include
@@ -197,6 +198,7 @@
#include "native/juce_MouseCursor_mac.mm"
#elif JUCE_WINDOWS
+ #include
#include
#include
#include