mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-10 23:44:24 +00:00
First experimental check-in of Direct2D rendering - not for public use yet!
This commit is contained in:
parent
34d8bfcf63
commit
622f823bf7
37 changed files with 2626 additions and 606 deletions
|
|
@ -307,6 +307,7 @@ OBJECTS := \
|
|||
$(OBJDIR)/juce_win32_ASIO_60eb61ca.o \
|
||||
$(OBJDIR)/juce_win32_AudioCDReader_66c7252.o \
|
||||
$(OBJDIR)/juce_win32_CameraDevice_ea35306d.o \
|
||||
$(OBJDIR)/juce_win32_Direct2DGraphicsContext_9f1b6be1.o \
|
||||
$(OBJDIR)/juce_win32_DirectSound_3462415e.o \
|
||||
$(OBJDIR)/juce_win32_DynamicLibraryLoader_2df0d241.o \
|
||||
$(OBJDIR)/juce_win32_FileChooser_18a257.o \
|
||||
|
|
@ -1697,6 +1698,11 @@ $(OBJDIR)/juce_win32_CameraDevice_ea35306d.o: ../../src/native/windows/juce_win3
|
|||
@echo "Compiling juce_win32_CameraDevice.cpp"
|
||||
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
|
||||
|
||||
$(OBJDIR)/juce_win32_Direct2DGraphicsContext_9f1b6be1.o: ../../src/native/windows/juce_win32_Direct2DGraphicsContext.cpp
|
||||
-@mkdir -p $(OBJDIR)
|
||||
@echo "Compiling juce_win32_Direct2DGraphicsContext.cpp"
|
||||
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<"
|
||||
|
||||
$(OBJDIR)/juce_win32_DirectSound_3462415e.o: ../../src/native/windows/juce_win32_DirectSound.cpp
|
||||
-@mkdir -p $(OBJDIR)
|
||||
@echo "Compiling juce_win32_DirectSound.cpp"
|
||||
|
|
|
|||
|
|
@ -302,6 +302,7 @@
|
|||
4B4E17467BC41E2166549998 = { isa = PBXBuildFile; fileRef = 8F383A785B4876198C5B0194; };
|
||||
9686F29C29D1C26E353DE68A = { isa = PBXBuildFile; fileRef = F3B50EE3939E9F16D13C3C7C; };
|
||||
79B4C2F1C0CF592ACE8093C0 = { isa = PBXBuildFile; fileRef = 3A37CD82212075940421CE4F; };
|
||||
88A87D28B3809665F28DC16E = { isa = PBXBuildFile; fileRef = 7F3EF672D07ECE3E13AAF267; };
|
||||
BC3C22F5350ED7433D303A04 = { isa = PBXBuildFile; fileRef = 58B70C726D186B4E770300BC; };
|
||||
527CF9C21EB7512B2283E61C = { isa = PBXBuildFile; fileRef = 0CFD86AE0B7CBAE2ADE75C53; };
|
||||
0B41EC4D7839F8CBCB8F9A0D = { isa = PBXBuildFile; fileRef = DCD09B6EF4A4A109DE01F152; };
|
||||
|
|
@ -956,6 +957,7 @@
|
|||
F3B50EE3939E9F16D13C3C7C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_AudioCDReader.cpp; path = ../../src/native/windows/juce_win32_AudioCDReader.cpp; sourceTree = SOURCE_ROOT; };
|
||||
9C4D1018ECC0BA07346453EF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_win32_AutoLinkLibraries.h; path = ../../src/native/windows/juce_win32_AutoLinkLibraries.h; sourceTree = SOURCE_ROOT; };
|
||||
3A37CD82212075940421CE4F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_CameraDevice.cpp; path = ../../src/native/windows/juce_win32_CameraDevice.cpp; sourceTree = SOURCE_ROOT; };
|
||||
7F3EF672D07ECE3E13AAF267 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_Direct2DGraphicsContext.cpp; path = ../../src/native/windows/juce_win32_Direct2DGraphicsContext.cpp; sourceTree = SOURCE_ROOT; };
|
||||
58B70C726D186B4E770300BC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_DirectSound.cpp; path = ../../src/native/windows/juce_win32_DirectSound.cpp; sourceTree = SOURCE_ROOT; };
|
||||
0CFD86AE0B7CBAE2ADE75C53 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_DynamicLibraryLoader.cpp; path = ../../src/native/windows/juce_win32_DynamicLibraryLoader.cpp; sourceTree = SOURCE_ROOT; };
|
||||
BA66E265749F75DBA86EC3F1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_win32_DynamicLibraryLoader.h; path = ../../src/native/windows/juce_win32_DynamicLibraryLoader.h; sourceTree = SOURCE_ROOT; };
|
||||
|
|
@ -1728,6 +1730,7 @@
|
|||
F3B50EE3939E9F16D13C3C7C,
|
||||
9C4D1018ECC0BA07346453EF,
|
||||
3A37CD82212075940421CE4F,
|
||||
7F3EF672D07ECE3E13AAF267,
|
||||
58B70C726D186B4E770300BC,
|
||||
0CFD86AE0B7CBAE2ADE75C53,
|
||||
BA66E265749F75DBA86EC3F1,
|
||||
|
|
@ -2196,6 +2199,7 @@
|
|||
4B4E17467BC41E2166549998,
|
||||
9686F29C29D1C26E353DE68A,
|
||||
79B4C2F1C0CF592ACE8093C0,
|
||||
88A87D28B3809665F28DC16E,
|
||||
BC3C22F5350ED7433D303A04,
|
||||
527CF9C21EB7512B2283E61C,
|
||||
0B41EC4D7839F8CBCB8F9A0D,
|
||||
|
|
|
|||
|
|
@ -893,6 +893,7 @@
|
|||
<File RelativePath="..\..\src\native\windows\juce_win32_AudioCDReader.cpp"/>
|
||||
<File RelativePath="..\..\src\native\windows\juce_win32_AutoLinkLibraries.h"/>
|
||||
<File RelativePath="..\..\src\native\windows\juce_win32_CameraDevice.cpp"/>
|
||||
<File RelativePath="..\..\src\native\windows\juce_win32_Direct2DGraphicsContext.cpp"/>
|
||||
<File RelativePath="..\..\src\native\windows\juce_win32_DirectSound.cpp"/>
|
||||
<File RelativePath="..\..\src\native\windows\juce_win32_DynamicLibraryLoader.cpp"/>
|
||||
<File RelativePath="..\..\src\native\windows\juce_win32_DynamicLibraryLoader.h"/>
|
||||
|
|
|
|||
|
|
@ -893,6 +893,7 @@
|
|||
<File RelativePath="..\..\src\native\windows\juce_win32_AudioCDReader.cpp"/>
|
||||
<File RelativePath="..\..\src\native\windows\juce_win32_AutoLinkLibraries.h"/>
|
||||
<File RelativePath="..\..\src\native\windows\juce_win32_CameraDevice.cpp"/>
|
||||
<File RelativePath="..\..\src\native\windows\juce_win32_Direct2DGraphicsContext.cpp"/>
|
||||
<File RelativePath="..\..\src\native\windows\juce_win32_DirectSound.cpp"/>
|
||||
<File RelativePath="..\..\src\native\windows\juce_win32_DynamicLibraryLoader.cpp"/>
|
||||
<File RelativePath="..\..\src\native\windows\juce_win32_DynamicLibraryLoader.h"/>
|
||||
|
|
|
|||
|
|
@ -895,6 +895,7 @@
|
|||
<File RelativePath="..\..\src\native\windows\juce_win32_AudioCDReader.cpp"/>
|
||||
<File RelativePath="..\..\src\native\windows\juce_win32_AutoLinkLibraries.h"/>
|
||||
<File RelativePath="..\..\src\native\windows\juce_win32_CameraDevice.cpp"/>
|
||||
<File RelativePath="..\..\src\native\windows\juce_win32_Direct2DGraphicsContext.cpp"/>
|
||||
<File RelativePath="..\..\src\native\windows\juce_win32_DirectSound.cpp"/>
|
||||
<File RelativePath="..\..\src\native\windows\juce_win32_DynamicLibraryLoader.cpp"/>
|
||||
<File RelativePath="..\..\src\native\windows\juce_win32_DynamicLibraryLoader.h"/>
|
||||
|
|
|
|||
|
|
@ -390,6 +390,7 @@
|
|||
<ClCompile Include="..\..\src\native\windows\juce_win32_ASIO.cpp"/>
|
||||
<ClCompile Include="..\..\src\native\windows\juce_win32_AudioCDReader.cpp"/>
|
||||
<ClCompile Include="..\..\src\native\windows\juce_win32_CameraDevice.cpp"/>
|
||||
<ClCompile Include="..\..\src\native\windows\juce_win32_Direct2DGraphicsContext.cpp"/>
|
||||
<ClCompile Include="..\..\src\native\windows\juce_win32_DirectSound.cpp"/>
|
||||
<ClCompile Include="..\..\src\native\windows\juce_win32_DynamicLibraryLoader.cpp"/>
|
||||
<ClCompile Include="..\..\src\native\windows\juce_win32_FileChooser.cpp"/>
|
||||
|
|
|
|||
|
|
@ -1096,6 +1096,9 @@
|
|||
<ClCompile Include="..\..\src\native\windows\juce_win32_CameraDevice.cpp">
|
||||
<Filter>Juce\Source\native\windows</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\native\windows\juce_win32_Direct2DGraphicsContext.cpp">
|
||||
<Filter>Juce\Source\native\windows</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="..\..\src\native\windows\juce_win32_DirectSound.cpp">
|
||||
<Filter>Juce\Source\native\windows</Filter>
|
||||
</ClCompile>
|
||||
|
|
|
|||
|
|
@ -302,6 +302,7 @@
|
|||
4B4E17467BC41E2166549998 = { isa = PBXBuildFile; fileRef = 8F383A785B4876198C5B0194; };
|
||||
9686F29C29D1C26E353DE68A = { isa = PBXBuildFile; fileRef = F3B50EE3939E9F16D13C3C7C; };
|
||||
79B4C2F1C0CF592ACE8093C0 = { isa = PBXBuildFile; fileRef = 3A37CD82212075940421CE4F; };
|
||||
88A87D28B3809665F28DC16E = { isa = PBXBuildFile; fileRef = 7F3EF672D07ECE3E13AAF267; };
|
||||
BC3C22F5350ED7433D303A04 = { isa = PBXBuildFile; fileRef = 58B70C726D186B4E770300BC; };
|
||||
527CF9C21EB7512B2283E61C = { isa = PBXBuildFile; fileRef = 0CFD86AE0B7CBAE2ADE75C53; };
|
||||
0B41EC4D7839F8CBCB8F9A0D = { isa = PBXBuildFile; fileRef = DCD09B6EF4A4A109DE01F152; };
|
||||
|
|
@ -956,6 +957,7 @@
|
|||
F3B50EE3939E9F16D13C3C7C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_AudioCDReader.cpp; path = ../../src/native/windows/juce_win32_AudioCDReader.cpp; sourceTree = SOURCE_ROOT; };
|
||||
9C4D1018ECC0BA07346453EF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_win32_AutoLinkLibraries.h; path = ../../src/native/windows/juce_win32_AutoLinkLibraries.h; sourceTree = SOURCE_ROOT; };
|
||||
3A37CD82212075940421CE4F = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_CameraDevice.cpp; path = ../../src/native/windows/juce_win32_CameraDevice.cpp; sourceTree = SOURCE_ROOT; };
|
||||
7F3EF672D07ECE3E13AAF267 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_Direct2DGraphicsContext.cpp; path = ../../src/native/windows/juce_win32_Direct2DGraphicsContext.cpp; sourceTree = SOURCE_ROOT; };
|
||||
58B70C726D186B4E770300BC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_DirectSound.cpp; path = ../../src/native/windows/juce_win32_DirectSound.cpp; sourceTree = SOURCE_ROOT; };
|
||||
0CFD86AE0B7CBAE2ADE75C53 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_win32_DynamicLibraryLoader.cpp; path = ../../src/native/windows/juce_win32_DynamicLibraryLoader.cpp; sourceTree = SOURCE_ROOT; };
|
||||
BA66E265749F75DBA86EC3F1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_win32_DynamicLibraryLoader.h; path = ../../src/native/windows/juce_win32_DynamicLibraryLoader.h; sourceTree = SOURCE_ROOT; };
|
||||
|
|
@ -1728,6 +1730,7 @@
|
|||
F3B50EE3939E9F16D13C3C7C,
|
||||
9C4D1018ECC0BA07346453EF,
|
||||
3A37CD82212075940421CE4F,
|
||||
7F3EF672D07ECE3E13AAF267,
|
||||
58B70C726D186B4E770300BC,
|
||||
0CFD86AE0B7CBAE2ADE75C53,
|
||||
BA66E265749F75DBA86EC3F1,
|
||||
|
|
@ -2196,6 +2199,7 @@
|
|||
4B4E17467BC41E2166549998,
|
||||
9686F29C29D1C26E353DE68A,
|
||||
79B4C2F1C0CF592ACE8093C0,
|
||||
88A87D28B3809665F28DC16E,
|
||||
BC3C22F5350ED7433D303A04,
|
||||
527CF9C21EB7512B2283E61C,
|
||||
0B41EC4D7839F8CBCB8F9A0D,
|
||||
|
|
|
|||
|
|
@ -1359,6 +1359,8 @@
|
|||
resource="0" file="src/native/windows/juce_win32_AutoLinkLibraries.h"/>
|
||||
<FILE id="Ay6VgqxOG" name="juce_win32_CameraDevice.cpp" compile="1"
|
||||
resource="0" file="src/native/windows/juce_win32_CameraDevice.cpp"/>
|
||||
<FILE id="c4BNPC" name="juce_win32_Direct2DGraphicsContext.cpp" compile="1"
|
||||
resource="0" file="src/native/windows/juce_win32_Direct2DGraphicsContext.cpp"/>
|
||||
<FILE id="CVNbte6ov" name="juce_win32_DirectSound.cpp" compile="1"
|
||||
resource="0" file="src/native/windows/juce_win32_DirectSound.cpp"/>
|
||||
<FILE id="4w3jvZBLt" name="juce_win32_DynamicLibraryLoader.cpp" compile="1"
|
||||
|
|
@ -1508,5 +1510,6 @@
|
|||
JUCE_USE_XINERAMA="default" JUCE_USE_XSHM="default" JUCE_USE_XRENDER="default"
|
||||
JUCE_PLUGINHOST_VST="default" JUCE_PLUGINHOST_AU="default" JUCE_ONLY_BUILD_CORE_LIBRARY="default"
|
||||
JUCE_WEB_BROWSER="default" JUCE_SUPPORT_CARBON="default" JUCE_CHECK_MEMORY_LEAKS="default"
|
||||
JUCE_CATCH_UNHANDLED_EXCEPTIONS="default" JUCE_USE_XCURSOR="default"/>
|
||||
JUCE_CATCH_UNHANDLED_EXCEPTIONS="default" JUCE_USE_XCURSOR="default"
|
||||
JUCE_DIRECT2D="default"/>
|
||||
</JUCERPROJECT>
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
#define JUCE_ALSA 0
|
||||
#define JUCE_QUICKTIME 0
|
||||
#define JUCE_OPENGL 0
|
||||
//#define JUCE_DIRECT2D
|
||||
#define JUCE_USE_FLAC 0
|
||||
#define JUCE_USE_OGGVORBIS 0
|
||||
#define JUCE_USE_CDBURNER 0
|
||||
|
|
|
|||
|
|
@ -178,5 +178,5 @@
|
|||
JUCE_USE_XINERAMA="default" JUCE_USE_XSHM="default" JUCE_ONLY_BUILD_CORE_LIBRARY="default"
|
||||
JUCE_WEB_BROWSER="default" JUCE_SUPPORT_CARBON="default" JUCE_CHECK_MEMORY_LEAKS="default"
|
||||
JUCE_CATCH_UNHANDLED_EXCEPTIONS="default" JUCE_STRINGS_ARE_UNICODE="default"
|
||||
JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default"/>
|
||||
JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default" JUCE_DIRECT2D="default"/>
|
||||
</JUCERPROJECT>
|
||||
|
|
|
|||
|
|
@ -37,5 +37,5 @@
|
|||
JUCE_PLUGINHOST_AU="default" JUCE_ONLY_BUILD_CORE_LIBRARY="enabled"
|
||||
JUCE_WEB_BROWSER="default" JUCE_SUPPORT_CARBON="default" JUCE_CHECK_MEMORY_LEAKS="default"
|
||||
JUCE_CATCH_UNHANDLED_EXCEPTIONS="default" JUCE_STRINGS_ARE_UNICODE="default"
|
||||
JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default"/>
|
||||
JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default" JUCE_DIRECT2D="default"/>
|
||||
</JUCERPROJECT>
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
//#define JUCE_ALSA
|
||||
//#define JUCE_QUICKTIME
|
||||
//#define JUCE_OPENGL
|
||||
//#define JUCE_DIRECT2D
|
||||
//#define JUCE_USE_FLAC
|
||||
//#define JUCE_USE_OGGVORBIS
|
||||
//#define JUCE_USE_CDBURNER
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
#define JUCE_ALSA 1
|
||||
//#define JUCE_QUICKTIME
|
||||
//#define JUCE_OPENGL
|
||||
//#define JUCE_DIRECT2D
|
||||
//#define JUCE_USE_FLAC
|
||||
//#define JUCE_USE_OGGVORBIS
|
||||
//#define JUCE_USE_CDBURNER
|
||||
|
|
|
|||
|
|
@ -57,5 +57,5 @@
|
|||
JUCE_PLUGINHOST_AU="enabled" JUCE_ONLY_BUILD_CORE_LIBRARY="default"
|
||||
JUCE_WEB_BROWSER="default" JUCE_SUPPORT_CARBON="default" JUCE_CHECK_MEMORY_LEAKS="default"
|
||||
JUCE_CATCH_UNHANDLED_EXCEPTIONS="default" JUCE_STRINGS_ARE_UNICODE="default"
|
||||
JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default"/>
|
||||
JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default" JUCE_DIRECT2D="default"/>
|
||||
</JUCERPROJECT>
|
||||
|
|
|
|||
|
|
@ -43,5 +43,6 @@
|
|||
JUCE_USE_XINERAMA="default" JUCE_USE_XSHM="default" JUCE_USE_XRENDER="default"
|
||||
JUCE_PLUGINHOST_VST="default" JUCE_PLUGINHOST_AU="default" JUCE_ONLY_BUILD_CORE_LIBRARY="default"
|
||||
JUCE_WEB_BROWSER="default" JUCE_SUPPORT_CARBON="default" JUCE_CHECK_MEMORY_LEAKS="default"
|
||||
JUCE_CATCH_UNHANDLED_EXCEPTIONS="default" JUCE_USE_XCURSOR="default"/>
|
||||
JUCE_CATCH_UNHANDLED_EXCEPTIONS="default" JUCE_USE_XCURSOR="default"
|
||||
JUCE_DIRECT2D="default"/>
|
||||
</JUCERPROJECT>
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
//#define JUCE_ALSA
|
||||
#define JUCE_QUICKTIME 0
|
||||
//#define JUCE_OPENGL
|
||||
//#define JUCE_DIRECT2D
|
||||
//#define JUCE_USE_FLAC
|
||||
//#define JUCE_USE_OGGVORBIS
|
||||
//#define JUCE_USE_CDBURNER
|
||||
|
|
|
|||
|
|
@ -38,5 +38,5 @@
|
|||
JUCE_PLUGINHOST_AU="default" JUCE_ONLY_BUILD_CORE_LIBRARY="enabled"
|
||||
JUCE_WEB_BROWSER="default" JUCE_SUPPORT_CARBON="default" JUCE_CHECK_MEMORY_LEAKS="default"
|
||||
JUCE_CATCH_UNHANDLED_EXCEPTIONS="default" JUCE_STRINGS_ARE_UNICODE="default"
|
||||
JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default"/>
|
||||
JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default" JUCE_DIRECT2D="default"/>
|
||||
</JUCERPROJECT>
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
//#define JUCE_ALSA
|
||||
//#define JUCE_QUICKTIME
|
||||
//#define JUCE_OPENGL
|
||||
//#define JUCE_DIRECT2D
|
||||
//#define JUCE_USE_FLAC
|
||||
//#define JUCE_USE_OGGVORBIS
|
||||
//#define JUCE_USE_CDBURNER
|
||||
|
|
|
|||
|
|
@ -45,5 +45,5 @@
|
|||
JUCE_PLUGINHOST_AU="default" JUCE_ONLY_BUILD_CORE_LIBRARY="default"
|
||||
JUCE_WEB_BROWSER="default" JUCE_SUPPORT_CARBON="default" JUCE_CHECK_MEMORY_LEAKS="default"
|
||||
JUCE_CATCH_UNHANDLED_EXCEPTIONS="default" JUCE_STRINGS_ARE_UNICODE="default"
|
||||
JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default"/>
|
||||
JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default" JUCE_DIRECT2D="default"/>
|
||||
</JUCERPROJECT>
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
//#define JUCE_ALSA
|
||||
//#define JUCE_QUICKTIME
|
||||
//#define JUCE_OPENGL
|
||||
//#define JUCE_DIRECT2D
|
||||
//#define JUCE_USE_FLAC
|
||||
//#define JUCE_USE_OGGVORBIS
|
||||
//#define JUCE_USE_CDBURNER
|
||||
|
|
|
|||
|
|
@ -112,5 +112,5 @@
|
|||
JUCE_PLUGINHOST_AU="disabled" JUCE_ONLY_BUILD_CORE_LIBRARY="default"
|
||||
JUCE_WEB_BROWSER="default" JUCE_SUPPORT_CARBON="default" JUCE_CHECK_MEMORY_LEAKS="default"
|
||||
JUCE_CATCH_UNHANDLED_EXCEPTIONS="default" JUCE_STRINGS_ARE_UNICODE="default"
|
||||
JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default"/>
|
||||
JUCE_USE_XRENDER="default" JUCE_USE_XCURSOR="default" JUCE_DIRECT2D="default"/>
|
||||
</JUCERPROJECT>
|
||||
|
|
|
|||
|
|
@ -19,6 +19,7 @@
|
|||
//#define JUCE_ALSA
|
||||
//#define JUCE_QUICKTIME
|
||||
//#define JUCE_OPENGL
|
||||
//#define JUCE_DIRECT2D
|
||||
//#define JUCE_USE_FLAC
|
||||
//#define JUCE_USE_OGGVORBIS
|
||||
//#define JUCE_USE_CDBURNER
|
||||
|
|
|
|||
|
|
@ -37,6 +37,7 @@ public:
|
|||
recordedSound (1, 1),
|
||||
playingSampleNum (0),
|
||||
recordedSampleNum (-1),
|
||||
sampleRate (0),
|
||||
isRunning (false),
|
||||
resultsBox (resultsBox_)
|
||||
{
|
||||
|
|
|
|||
|
|
@ -117,6 +117,13 @@
|
|||
#define JUCE_OPENGL 1
|
||||
#endif
|
||||
|
||||
/** JUCE_DIRECT2D: Enables the Windows 7 Direct2D renderer.
|
||||
If you're building on a platform older than Vista, you won't be able to compile with this feature.
|
||||
*/
|
||||
#ifndef JUCE_DIRECT2D
|
||||
#define JUCE_DIRECT2D 0
|
||||
#endif
|
||||
|
||||
//=============================================================================
|
||||
/** JUCE_USE_FLAC: Enables the FLAC audio codec classes (available on all platforms).
|
||||
If your app doesn't need to read FLAC files, you might want to disable this to
|
||||
|
|
|
|||
1925
juce_amalgamated.cpp
1925
juce_amalgamated.cpp
File diff suppressed because it is too large
Load diff
|
|
@ -64,7 +64,7 @@
|
|||
*/
|
||||
#define JUCE_MAJOR_VERSION 1
|
||||
#define JUCE_MINOR_VERSION 52
|
||||
#define JUCE_BUILDNUMBER 54
|
||||
#define JUCE_BUILDNUMBER 55
|
||||
|
||||
/** Current Juce version number.
|
||||
|
||||
|
|
@ -309,6 +309,13 @@
|
|||
#define JUCE_OPENGL 1
|
||||
#endif
|
||||
|
||||
/** JUCE_DIRECT2D: Enables the Windows 7 Direct2D renderer.
|
||||
If you're building on a platform older than Vista, you won't be able to compile with this feature.
|
||||
*/
|
||||
#ifndef JUCE_DIRECT2D
|
||||
#define JUCE_DIRECT2D 0
|
||||
#endif
|
||||
|
||||
/** JUCE_USE_FLAC: Enables the FLAC audio codec classes (available on all platforms).
|
||||
If your app doesn't need to read FLAC files, you might want to disable this to
|
||||
reduce the size of your codebase and build time.
|
||||
|
|
@ -29733,7 +29740,7 @@ public:
|
|||
*/
|
||||
float** getArrayOfChannels() const throw() { return channels; }
|
||||
|
||||
/** Chages the buffer's size or number of channels.
|
||||
/** Changes the buffer's size or number of channels.
|
||||
|
||||
This can expand or contract the buffer's length, and add or remove channels.
|
||||
|
||||
|
|
@ -58136,9 +58143,9 @@ public:
|
|||
|
||||
static void bringModalComponentToFront();
|
||||
|
||||
virtual const StringArray getAvailableRenderingEngines() throw();
|
||||
virtual const StringArray getAvailableRenderingEngines();
|
||||
virtual int getCurrentRenderingEngine() throw();
|
||||
virtual void setCurrentRenderingEngine (int index) throw();
|
||||
virtual void setCurrentRenderingEngine (int index);
|
||||
|
||||
juce_UseDebuggingNewOperator
|
||||
|
||||
|
|
@ -61392,6 +61399,11 @@ END_JUCE_NAMESPACE
|
|||
#pragma comment (lib, "Strmiids.lib")
|
||||
#pragma comment (lib, "wmvcore.lib")
|
||||
#endif
|
||||
|
||||
#if JUCE_DIRECT2D
|
||||
#pragma comment (lib, "Dwrite.lib")
|
||||
#pragma comment (lib, "D2d1.lib")
|
||||
#endif
|
||||
/*** End of inlined file: juce_win32_AutoLinkLibraries.h ***/
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -135,7 +135,7 @@ public:
|
|||
float** getArrayOfChannels() const throw() { return channels; }
|
||||
|
||||
//==============================================================================
|
||||
/** Chages the buffer's size or number of channels.
|
||||
/** Changes the buffer's size or number of channels.
|
||||
|
||||
This can expand or contract the buffer's length, and add or remove channels.
|
||||
|
||||
|
|
|
|||
|
|
@ -33,7 +33,7 @@
|
|||
*/
|
||||
#define JUCE_MAJOR_VERSION 1
|
||||
#define JUCE_MINOR_VERSION 52
|
||||
#define JUCE_BUILDNUMBER 54
|
||||
#define JUCE_BUILDNUMBER 55
|
||||
|
||||
/** Current Juce version number.
|
||||
|
||||
|
|
|
|||
|
|
@ -521,7 +521,7 @@ void ComponentPeer::addMaskedRegion (int x, int y, int w, int h)
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
const StringArray ComponentPeer::getAvailableRenderingEngines() throw()
|
||||
const StringArray ComponentPeer::getAvailableRenderingEngines()
|
||||
{
|
||||
StringArray s;
|
||||
s.add ("Software Renderer");
|
||||
|
|
@ -533,7 +533,7 @@ int ComponentPeer::getCurrentRenderingEngine() throw()
|
|||
return 0;
|
||||
}
|
||||
|
||||
void ComponentPeer::setCurrentRenderingEngine (int /*index*/) throw()
|
||||
void ComponentPeer::setCurrentRenderingEngine (int /*index*/)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -345,9 +345,9 @@ public:
|
|||
static void bringModalComponentToFront();
|
||||
|
||||
//==============================================================================
|
||||
virtual const StringArray getAvailableRenderingEngines() throw();
|
||||
virtual const StringArray getAvailableRenderingEngines();
|
||||
virtual int getCurrentRenderingEngine() throw();
|
||||
virtual void setCurrentRenderingEngine (int index) throw();
|
||||
virtual void setCurrentRenderingEngine (int index);
|
||||
|
||||
//==============================================================================
|
||||
juce_UseDebuggingNewOperator
|
||||
|
|
|
|||
|
|
@ -97,8 +97,9 @@ BEGIN_JUCE_NAMESPACE
|
|||
|
||||
#if ! JUCE_ONLY_BUILD_CORE_LIBRARY
|
||||
#include "windows/juce_win32_Messaging.cpp"
|
||||
#include "windows/juce_win32_Windowing.cpp"
|
||||
#include "windows/juce_win32_Fonts.cpp"
|
||||
#include "windows/juce_win32_Direct2DGraphicsContext.cpp"
|
||||
#include "windows/juce_win32_Windowing.cpp"
|
||||
#include "windows/juce_win32_FileChooser.cpp"
|
||||
#include "windows/juce_win32_Misc.cpp"
|
||||
#include "windows/juce_win32_ActiveXComponent.cpp"
|
||||
|
|
|
|||
|
|
@ -170,9 +170,9 @@ public:
|
|||
void toFront (bool makeActiveWindow);
|
||||
void toBehind (ComponentPeer* other);
|
||||
void setIcon (const Image& newIcon);
|
||||
const StringArray getAvailableRenderingEngines() throw();
|
||||
const StringArray getAvailableRenderingEngines();
|
||||
int getCurrentRenderingEngine() throw();
|
||||
void setCurrentRenderingEngine (int index) throw();
|
||||
void setCurrentRenderingEngine (int index);
|
||||
|
||||
/* When you use multiple DLLs which share similarly-named obj-c classes - like
|
||||
for example having more than one juce plugin loaded into a host, then when a
|
||||
|
|
@ -1567,10 +1567,9 @@ void NSViewComponentPeer::drawRect (NSRect r)
|
|||
}
|
||||
}
|
||||
|
||||
const StringArray NSViewComponentPeer::getAvailableRenderingEngines() throw()
|
||||
const StringArray NSViewComponentPeer::getAvailableRenderingEngines()
|
||||
{
|
||||
StringArray s;
|
||||
s.add ("Software Renderer");
|
||||
StringArray s (ComponentPeer::getAvailableRenderingEngines());
|
||||
|
||||
#if USE_COREGRAPHICS_RENDERING
|
||||
s.add ("CoreGraphics Renderer");
|
||||
|
|
@ -1584,7 +1583,7 @@ int NSViewComponentPeer::getCurrentRenderingEngine() throw()
|
|||
return usingCoreGraphics ? 1 : 0;
|
||||
}
|
||||
|
||||
void NSViewComponentPeer::setCurrentRenderingEngine (int index) throw()
|
||||
void NSViewComponentPeer::setCurrentRenderingEngine (int index)
|
||||
{
|
||||
#if USE_COREGRAPHICS_RENDERING
|
||||
if (usingCoreGraphics != (index > 0))
|
||||
|
|
|
|||
|
|
@ -28,3 +28,8 @@
|
|||
#pragma comment (lib, "Strmiids.lib")
|
||||
#pragma comment (lib, "wmvcore.lib")
|
||||
#endif
|
||||
|
||||
#if JUCE_DIRECT2D
|
||||
#pragma comment (lib, "Dwrite.lib")
|
||||
#pragma comment (lib, "D2d1.lib")
|
||||
#endif
|
||||
|
|
|
|||
897
src/native/windows/juce_win32_Direct2DGraphicsContext.cpp
Normal file
897
src/native/windows/juce_win32_Direct2DGraphicsContext.cpp
Normal file
|
|
@ -0,0 +1,897 @@
|
|||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library - "Jules' Utility Class Extensions"
|
||||
Copyright 2004-10 by Raw Material Software Ltd.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
JUCE can be redistributed and/or modified under the terms of the GNU General
|
||||
Public License (Version 2), as published by the Free Software Foundation.
|
||||
A copy of the license is included in the JUCE distribution, or can be found
|
||||
online at www.gnu.org/licenses.
|
||||
|
||||
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
|
||||
A PARTICULAR PURPOSE. See the GNU General Public License for more details.
|
||||
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
To release a closed-source product which uses JUCE, commercial licenses are
|
||||
available: visit www.rawmaterialsoftware.com/juce for more information.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
// (This file gets included by juce_win32_NativeCode.cpp, rather than being
|
||||
// compiled on its own).
|
||||
#if JUCE_INCLUDED_FILE && JUCE_DIRECT2D
|
||||
|
||||
|
||||
//==============================================================================
|
||||
class SharedD2DFactory : public DeletedAtShutdown
|
||||
{
|
||||
public:
|
||||
SharedD2DFactory()
|
||||
{
|
||||
D2D1CreateFactory (D2D1_FACTORY_TYPE_SINGLE_THREADED, &d2dFactory);
|
||||
DWriteCreateFactory (DWRITE_FACTORY_TYPE_SHARED, __uuidof (IDWriteFactory), (IUnknown**) &directWriteFactory);
|
||||
|
||||
if (directWriteFactory != 0)
|
||||
directWriteFactory->GetSystemFontCollection (&systemFonts);
|
||||
}
|
||||
|
||||
~SharedD2DFactory()
|
||||
{
|
||||
clearSingletonInstance();
|
||||
}
|
||||
|
||||
juce_DeclareSingleton (SharedD2DFactory, false);
|
||||
|
||||
ComSmartPtr <ID2D1Factory> d2dFactory;
|
||||
ComSmartPtr <IDWriteFactory> directWriteFactory;
|
||||
ComSmartPtr <IDWriteFontCollection> systemFonts;
|
||||
};
|
||||
|
||||
juce_ImplementSingleton (SharedD2DFactory)
|
||||
|
||||
|
||||
//==============================================================================
|
||||
class Direct2DLowLevelGraphicsContext : public LowLevelGraphicsContext
|
||||
{
|
||||
public:
|
||||
Direct2DLowLevelGraphicsContext (HWND hwnd_)
|
||||
: hwnd (hwnd_),
|
||||
currentState (0)
|
||||
{
|
||||
RECT windowRect;
|
||||
GetClientRect (hwnd, &windowRect);
|
||||
D2D1_SIZE_U size = { windowRect.right - windowRect.left, windowRect.bottom - windowRect.top };
|
||||
bounds.setSize (size.width, size.height);
|
||||
|
||||
D2D1_RENDER_TARGET_PROPERTIES props = D2D1::RenderTargetProperties();
|
||||
D2D1_HWND_RENDER_TARGET_PROPERTIES propsHwnd = D2D1::HwndRenderTargetProperties (hwnd, size);
|
||||
|
||||
HRESULT hr = SharedD2DFactory::getInstance()->d2dFactory->CreateHwndRenderTarget (props, propsHwnd, &renderingTarget);
|
||||
// xxx check for error
|
||||
|
||||
hr = renderingTarget->CreateSolidColorBrush (D2D1::ColorF::ColorF (0.0f, 0.0f, 0.0f, 1.0f), &colourBrush);
|
||||
}
|
||||
|
||||
~Direct2DLowLevelGraphicsContext()
|
||||
{
|
||||
states.clear();
|
||||
}
|
||||
|
||||
void resized()
|
||||
{
|
||||
RECT windowRect;
|
||||
GetClientRect (hwnd, &windowRect);
|
||||
D2D1_SIZE_U size = { windowRect.right - windowRect.left, windowRect.bottom - windowRect.top };
|
||||
|
||||
renderingTarget->Resize (size);
|
||||
bounds.setSize (size.width, size.height);
|
||||
}
|
||||
|
||||
void clear()
|
||||
{
|
||||
renderingTarget->Clear (D2D1::ColorF (D2D1::ColorF::White, 0.0f)); // xxx why white and not black?
|
||||
}
|
||||
|
||||
void start()
|
||||
{
|
||||
renderingTarget->BeginDraw();
|
||||
saveState();
|
||||
}
|
||||
|
||||
void end()
|
||||
{
|
||||
states.clear();
|
||||
currentState = 0;
|
||||
renderingTarget->EndDraw();
|
||||
renderingTarget->CheckWindowState();
|
||||
}
|
||||
|
||||
bool isVectorDevice() const { return false; }
|
||||
|
||||
void setOrigin (int x, int y)
|
||||
{
|
||||
currentState->origin.addXY (x, y);
|
||||
}
|
||||
|
||||
bool clipToRectangle (const Rectangle<int>& r)
|
||||
{
|
||||
currentState->clipToRectangle (r);
|
||||
return ! isClipEmpty();
|
||||
}
|
||||
|
||||
bool clipToRectangleList (const RectangleList& clipRegion)
|
||||
{
|
||||
currentState->clipToRectList (rectListToPathGeometry (clipRegion));
|
||||
return ! isClipEmpty();
|
||||
}
|
||||
|
||||
void excludeClipRectangle (const Rectangle<int>&)
|
||||
{
|
||||
//xxx
|
||||
}
|
||||
|
||||
void clipToPath (const Path& path, const AffineTransform& transform)
|
||||
{
|
||||
currentState->clipToPath (pathToPathGeometry (path, transform, currentState->origin));
|
||||
}
|
||||
|
||||
void clipToImageAlpha (const Image& sourceImage, const AffineTransform& transform)
|
||||
{
|
||||
currentState->clipToImage (sourceImage,transform);
|
||||
}
|
||||
|
||||
bool clipRegionIntersects (const Rectangle<int>& r)
|
||||
{
|
||||
const Rectangle<int> r2 (r + currentState->origin);
|
||||
return currentState->clipRect.intersects (r2);
|
||||
}
|
||||
|
||||
const Rectangle<int> getClipBounds() const
|
||||
{
|
||||
// xxx could this take into account complex clip regions?
|
||||
return currentState->clipRect - currentState->origin;
|
||||
}
|
||||
|
||||
bool isClipEmpty() const
|
||||
{
|
||||
return currentState->clipRect.isEmpty();
|
||||
}
|
||||
|
||||
void saveState()
|
||||
{
|
||||
states.add (new SavedState (*this));
|
||||
currentState = states.getLast();
|
||||
}
|
||||
|
||||
void restoreState()
|
||||
{
|
||||
jassert (states.size() > 1) //you should never pop the last state!
|
||||
states.removeLast (1);
|
||||
currentState = states.getLast();
|
||||
}
|
||||
|
||||
void setFill (const FillType& fillType)
|
||||
{
|
||||
currentState->setFill (fillType);
|
||||
}
|
||||
|
||||
void setOpacity (float newOpacity)
|
||||
{
|
||||
currentState->setOpacity (newOpacity);
|
||||
}
|
||||
|
||||
void setInterpolationQuality (Graphics::ResamplingQuality /*quality*/)
|
||||
{
|
||||
}
|
||||
|
||||
void fillRect (const Rectangle<int>& r, bool replaceExistingContents)
|
||||
{
|
||||
currentState->createBrush();
|
||||
renderingTarget->FillRectangle (rectangleToRectF (r + currentState->origin), currentState->currentBrush);
|
||||
}
|
||||
|
||||
void fillPath (const Path& p, const AffineTransform& transform)
|
||||
{
|
||||
currentState->createBrush();
|
||||
ComSmartPtr <ID2D1Geometry> geometry (pathToPathGeometry (p, transform, currentState->origin));
|
||||
|
||||
if (renderingTarget != 0)
|
||||
renderingTarget->FillGeometry (geometry, currentState->currentBrush);
|
||||
}
|
||||
|
||||
void drawImage (const Image& image, const AffineTransform& transform, bool fillEntireClipAsTiles)
|
||||
{
|
||||
const int x = currentState->origin.getX();
|
||||
const int y = currentState->origin.getY();
|
||||
|
||||
renderingTarget->SetTransform (transfromToMatrix (transform) * D2D1::Matrix3x2F::Translation (x, y));
|
||||
|
||||
D2D1_SIZE_U size;
|
||||
size.width = image.getWidth();
|
||||
size.height = image.getHeight();
|
||||
|
||||
D2D1_BITMAP_PROPERTIES bp = D2D1::BitmapProperties();
|
||||
|
||||
Image img (image.convertedToFormat (Image::ARGB));
|
||||
Image::BitmapData bd (img, false);
|
||||
bp.pixelFormat = renderingTarget->GetPixelFormat();
|
||||
bp.pixelFormat.alphaMode = D2D1_ALPHA_MODE_PREMULTIPLIED;
|
||||
|
||||
{
|
||||
ComSmartPtr <ID2D1Bitmap> tempBitmap;
|
||||
renderingTarget->CreateBitmap (size, bd.data, bd.lineStride, bp, &tempBitmap);
|
||||
if (tempBitmap != 0)
|
||||
renderingTarget->DrawBitmap (tempBitmap);
|
||||
}
|
||||
|
||||
renderingTarget->SetTransform (D2D1::IdentityMatrix());
|
||||
}
|
||||
|
||||
void drawLine (const Line <float>& line)
|
||||
{
|
||||
// xxx doesn't seem to be correctly aligned, may need nudging by 0.5 to match the software renderer's behaviour
|
||||
const Line<float> l (line.getStart() + currentState->origin.toFloat(),
|
||||
line.getEnd() + currentState->origin.toFloat());
|
||||
|
||||
currentState->createBrush();
|
||||
|
||||
renderingTarget->DrawLine (D2D1::Point2F (l.getStartX(), l.getStartY()),
|
||||
D2D1::Point2F (l.getEndX(), l.getEndY()),
|
||||
currentState->currentBrush);
|
||||
}
|
||||
|
||||
void drawVerticalLine (int x, float top, float bottom)
|
||||
{
|
||||
// xxx doesn't seem to be correctly aligned, may need nudging by 0.5 to match the software renderer's behaviour
|
||||
currentState->createBrush();
|
||||
|
||||
x += currentState->origin.getX();
|
||||
const int y = currentState->origin.getY();
|
||||
|
||||
renderingTarget->DrawLine (D2D1::Point2F (x, y + top),
|
||||
D2D1::Point2F (x, y + bottom),
|
||||
currentState->currentBrush);
|
||||
}
|
||||
|
||||
void drawHorizontalLine (int y, float left, float right)
|
||||
{
|
||||
// xxx doesn't seem to be correctly aligned, may need nudging by 0.5 to match the software renderer's behaviour
|
||||
currentState->createBrush();
|
||||
|
||||
y += currentState->origin.getY();
|
||||
const int x = currentState->origin.getX();
|
||||
|
||||
renderingTarget->DrawLine (D2D1::Point2F (x + left, y),
|
||||
D2D1::Point2F (x + right, y),
|
||||
currentState->currentBrush);
|
||||
}
|
||||
|
||||
void setFont (const Font& newFont)
|
||||
{
|
||||
currentState->setFont (newFont);
|
||||
}
|
||||
|
||||
const Font getFont()
|
||||
{
|
||||
return currentState->font;
|
||||
}
|
||||
|
||||
void drawGlyph (int glyphNumber, const AffineTransform& transform)
|
||||
{
|
||||
const float x = currentState->origin.getX();
|
||||
const float y = currentState->origin.getY();
|
||||
|
||||
currentState->createBrush();
|
||||
currentState->createFont();
|
||||
|
||||
float kerning = currentState->font.getExtraKerningFactor(); // xxx why does removing this line mess up the kerning??
|
||||
float hScale = currentState->font.getHorizontalScale();
|
||||
|
||||
renderingTarget->SetTransform (D2D1::Matrix3x2F::Scale (hScale, 1) * transfromToMatrix (transform) * D2D1::Matrix3x2F::Translation (x, y));
|
||||
|
||||
float dpiX = 0, dpiY = 0;
|
||||
SharedD2DFactory::getInstance()->d2dFactory->GetDesktopDpi (&dpiX, &dpiY);
|
||||
|
||||
UINT32 glyphNum = glyphNumber;
|
||||
UINT16 glyphNum1 = 0; // xxx needs a better name - what is this for?
|
||||
currentState->currentFontFace->GetGlyphIndices (&glyphNum, 1, &glyphNum1);
|
||||
|
||||
DWRITE_GLYPH_OFFSET offset;
|
||||
offset.advanceOffset = 0;
|
||||
offset.ascenderOffset = 0;
|
||||
float glyphAdvances = 0;
|
||||
|
||||
DWRITE_GLYPH_RUN glyph;
|
||||
glyph.fontFace = currentState->currentFontFace;
|
||||
glyph.glyphCount = 1;
|
||||
glyph.glyphIndices = &glyphNum1;
|
||||
glyph.isSideways = FALSE;
|
||||
glyph.glyphAdvances = &glyphAdvances;
|
||||
glyph.glyphOffsets = &offset;
|
||||
glyph.fontEmSize = (float) currentState->font.getHeight() * dpiX / 96.0f * (1 + currentState->fontScaling) / 2;
|
||||
|
||||
renderingTarget->DrawGlyphRun (D2D1::Point2F (0, 0), &glyph, currentState->currentBrush);
|
||||
renderingTarget->SetTransform (D2D1::IdentityMatrix());
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
class SavedState
|
||||
{
|
||||
public:
|
||||
SavedState (Direct2DLowLevelGraphicsContext& owner_)
|
||||
: owner (owner_), currentBrush (0),
|
||||
fontScaling (1.0f), currentFontFace (0),
|
||||
clipsRect (false), shouldClipRect (false),
|
||||
clipsRectList (false), shouldClipRectList (false),
|
||||
clipsComplex (false), shouldClipComplex (false),
|
||||
clipsBitmap (false), shouldClipBitmap (false)
|
||||
{
|
||||
if (owner.currentState != 0)
|
||||
{
|
||||
// xxx seems like a very slow way to create one of these, and this is a performance
|
||||
// bottleneck.. Can the same internal objects be shared by multiple state objects, maybe using copy-on-write?
|
||||
setFill (owner.currentState->fillType);
|
||||
currentBrush = owner.currentState->currentBrush;
|
||||
origin = owner.currentState->origin;
|
||||
clipRect = owner.currentState->clipRect;
|
||||
|
||||
font = owner.currentState->font;
|
||||
currentFontFace = owner.currentState->currentFontFace;
|
||||
}
|
||||
else
|
||||
{
|
||||
const D2D1_SIZE_U size (owner.renderingTarget->GetPixelSize());
|
||||
clipRect.setSize (size.width, size.height);
|
||||
setFill (FillType (Colours::black));
|
||||
}
|
||||
}
|
||||
|
||||
~SavedState()
|
||||
{
|
||||
clearClip();
|
||||
clearFont();
|
||||
clearFill();
|
||||
clearPathClip();
|
||||
clearImageClip();
|
||||
complexClipLayer = 0;
|
||||
bitmapMaskLayer = 0;
|
||||
}
|
||||
|
||||
void clearClip()
|
||||
{
|
||||
popClips();
|
||||
shouldClipRect = false;
|
||||
}
|
||||
|
||||
void clipToRectangle (const Rectangle<int>& r)
|
||||
{
|
||||
clearClip();
|
||||
clipRect = r + origin;
|
||||
shouldClipRect = true;
|
||||
pushClips();
|
||||
}
|
||||
|
||||
void clearPathClip()
|
||||
{
|
||||
popClips();
|
||||
|
||||
if (shouldClipComplex)
|
||||
{
|
||||
complexClipGeometry = 0;
|
||||
shouldClipComplex = false;
|
||||
}
|
||||
}
|
||||
|
||||
void clipToPath (ID2D1Geometry* geometry)
|
||||
{
|
||||
clearPathClip();
|
||||
|
||||
if (complexClipLayer == 0)
|
||||
owner.renderingTarget->CreateLayer (&complexClipLayer);
|
||||
|
||||
complexClipGeometry = geometry;
|
||||
shouldClipComplex = true;
|
||||
pushClips();
|
||||
}
|
||||
|
||||
void clearRectListClip()
|
||||
{
|
||||
popClips();
|
||||
|
||||
if (shouldClipRectList)
|
||||
{
|
||||
rectListGeometry = 0;
|
||||
shouldClipRectList = false;
|
||||
}
|
||||
}
|
||||
|
||||
void clipToRectList (ID2D1Geometry* geometry)
|
||||
{
|
||||
clearRectListClip();
|
||||
|
||||
if (rectListLayer == 0)
|
||||
owner.renderingTarget->CreateLayer (&rectListLayer);
|
||||
|
||||
rectListGeometry = geometry;
|
||||
shouldClipRectList = true;
|
||||
pushClips();
|
||||
}
|
||||
|
||||
void clearImageClip()
|
||||
{
|
||||
popClips();
|
||||
|
||||
if (shouldClipBitmap)
|
||||
{
|
||||
maskBitmap = 0;
|
||||
bitmapMaskBrush = 0;
|
||||
shouldClipBitmap = false;
|
||||
}
|
||||
}
|
||||
|
||||
void clipToImage (const Image& image, const AffineTransform& transform)
|
||||
{
|
||||
clearImageClip();
|
||||
|
||||
if (bitmapMaskLayer == 0)
|
||||
owner.renderingTarget->CreateLayer (&bitmapMaskLayer);
|
||||
|
||||
D2D1_BRUSH_PROPERTIES brushProps;
|
||||
brushProps.opacity = 1;
|
||||
brushProps.transform = transfromToMatrix (transform);
|
||||
|
||||
D2D1_BITMAP_BRUSH_PROPERTIES bmProps = D2D1::BitmapBrushProperties (D2D1_EXTEND_MODE_WRAP, D2D1_EXTEND_MODE_WRAP);
|
||||
|
||||
D2D1_SIZE_U size;
|
||||
size.width = image.getWidth();
|
||||
size.height = image.getHeight();
|
||||
|
||||
D2D1_BITMAP_PROPERTIES bp = D2D1::BitmapProperties();
|
||||
|
||||
maskImage = image.convertedToFormat (Image::ARGB);
|
||||
Image::BitmapData bd (this->image, false); // xxx should be maskImage?
|
||||
bp.pixelFormat = owner.renderingTarget->GetPixelFormat();
|
||||
bp.pixelFormat.alphaMode = D2D1_ALPHA_MODE_PREMULTIPLIED;
|
||||
|
||||
HRESULT hr = owner.renderingTarget->CreateBitmap (size, bd.data, bd.lineStride, bp, &maskBitmap);
|
||||
hr = owner.renderingTarget->CreateBitmapBrush (maskBitmap, bmProps, brushProps, &bitmapMaskBrush);
|
||||
|
||||
imageMaskLayerParams = D2D1::LayerParameters();
|
||||
imageMaskLayerParams.opacityBrush = bitmapMaskBrush;
|
||||
|
||||
shouldClipBitmap = true;
|
||||
pushClips();
|
||||
}
|
||||
|
||||
void popClips()
|
||||
{
|
||||
if (clipsBitmap)
|
||||
{
|
||||
owner.renderingTarget->PopLayer();
|
||||
clipsBitmap = false;
|
||||
}
|
||||
|
||||
if (clipsComplex)
|
||||
{
|
||||
owner.renderingTarget->PopLayer();
|
||||
clipsComplex = false;
|
||||
}
|
||||
|
||||
if (clipsRectList)
|
||||
{
|
||||
owner.renderingTarget->PopLayer();
|
||||
clipsRectList = false;
|
||||
}
|
||||
|
||||
if (clipsRect)
|
||||
{
|
||||
owner.renderingTarget->PopAxisAlignedClip();
|
||||
clipsRect = false;
|
||||
}
|
||||
}
|
||||
|
||||
void pushClips()
|
||||
{
|
||||
if (shouldClipRect && ! clipsRect)
|
||||
{
|
||||
owner.renderingTarget->PushAxisAlignedClip (rectangleToRectF (clipRect), D2D1_ANTIALIAS_MODE_PER_PRIMITIVE);
|
||||
clipsRect = true;
|
||||
}
|
||||
|
||||
if (shouldClipRectList && ! clipsRectList)
|
||||
{
|
||||
D2D1_LAYER_PARAMETERS layerParams = D2D1::LayerParameters();
|
||||
rectListGeometry->GetBounds (D2D1::IdentityMatrix(), &layerParams.contentBounds);
|
||||
layerParams.geometricMask = rectListGeometry;
|
||||
owner.renderingTarget->PushLayer (layerParams, rectListLayer);
|
||||
clipsRectList = true;
|
||||
}
|
||||
|
||||
if (shouldClipComplex && ! clipsComplex)
|
||||
{
|
||||
D2D1_LAYER_PARAMETERS layerParams = D2D1::LayerParameters();
|
||||
complexClipGeometry->GetBounds (D2D1::IdentityMatrix(), &layerParams.contentBounds);
|
||||
layerParams.geometricMask = complexClipGeometry;
|
||||
owner.renderingTarget->PushLayer (layerParams, complexClipLayer);
|
||||
clipsComplex = true;
|
||||
}
|
||||
|
||||
if (shouldClipBitmap && ! clipsBitmap)
|
||||
{
|
||||
owner.renderingTarget->PushLayer (imageMaskLayerParams, bitmapMaskLayer);
|
||||
clipsBitmap = true;
|
||||
}
|
||||
}
|
||||
|
||||
void setFill (const FillType& newFillType)
|
||||
{
|
||||
if (fillType != newFillType)
|
||||
{
|
||||
fillType = newFillType;
|
||||
clearFill();
|
||||
}
|
||||
}
|
||||
|
||||
void clearFont()
|
||||
{
|
||||
currentFontFace = localFontFace = 0;
|
||||
}
|
||||
|
||||
void setFont (const Font& newFont)
|
||||
{
|
||||
if (font != newFont)
|
||||
{
|
||||
font = newFont;
|
||||
clearFont();
|
||||
}
|
||||
}
|
||||
|
||||
void createFont()
|
||||
{
|
||||
// xxx The font shouldn't be managed by the graphics context.
|
||||
// The correct way to handle font lifetimes is to use a subclass of Typeface - see
|
||||
// MacTypeface and WindowsTypeface classes. D2D support could probably just be added to the
|
||||
// WindowsTypeface class.
|
||||
|
||||
if (currentFontFace == 0)
|
||||
{
|
||||
WindowsTypeface* systemType = dynamic_cast<WindowsTypeface*> (font.getTypeface());
|
||||
fontScaling = systemType->getAscent();
|
||||
|
||||
BOOL fontFound;
|
||||
uint32 fontIndex;
|
||||
|
||||
IDWriteFontCollection* fonts = SharedD2DFactory::getInstance()->systemFonts;
|
||||
|
||||
fonts->FindFamilyName (systemType->getName(), &fontIndex, &fontFound);
|
||||
if (! fontFound)
|
||||
fontIndex = 0;
|
||||
|
||||
ComSmartPtr <IDWriteFontFamily> fontFam;
|
||||
fonts->GetFontFamily (fontIndex, &fontFam);
|
||||
|
||||
ComSmartPtr <IDWriteFont> font;
|
||||
DWRITE_FONT_WEIGHT weight = this->font.isBold() ? DWRITE_FONT_WEIGHT_BOLD : DWRITE_FONT_WEIGHT_NORMAL;
|
||||
DWRITE_FONT_STYLE style = this->font.isItalic() ? DWRITE_FONT_STYLE_ITALIC : DWRITE_FONT_STYLE_NORMAL;
|
||||
fontFam->GetFirstMatchingFont (weight, DWRITE_FONT_STRETCH_NORMAL, style, &font);
|
||||
|
||||
font->CreateFontFace (&localFontFace);
|
||||
currentFontFace = localFontFace;
|
||||
}
|
||||
}
|
||||
|
||||
void setOpacity (float newOpacity)
|
||||
{
|
||||
fillType.setOpacity (newOpacity);
|
||||
|
||||
if (currentBrush != 0)
|
||||
currentBrush->SetOpacity (newOpacity);
|
||||
}
|
||||
|
||||
void clearFill()
|
||||
{
|
||||
gradientStops = 0;
|
||||
linearGradient = 0;
|
||||
radialGradient = 0;
|
||||
bitmap = 0;
|
||||
bitmapBrush = 0;
|
||||
currentBrush = 0;
|
||||
}
|
||||
|
||||
void createBrush()
|
||||
{
|
||||
if (currentBrush == 0)
|
||||
{
|
||||
const int x = origin.getX();
|
||||
const int y = origin.getY();
|
||||
|
||||
if (fillType.isColour())
|
||||
{
|
||||
D2D1_COLOR_F colour = colourToD2D (fillType.colour);
|
||||
owner.colourBrush->SetColor (colour);
|
||||
currentBrush = owner.colourBrush;
|
||||
}
|
||||
else if (fillType.isTiledImage())
|
||||
{
|
||||
D2D1_BRUSH_PROPERTIES brushProps;
|
||||
brushProps.opacity = fillType.getOpacity();
|
||||
brushProps.transform = transfromToMatrix (fillType.transform);
|
||||
|
||||
D2D1_BITMAP_BRUSH_PROPERTIES bmProps = D2D1::BitmapBrushProperties (D2D1_EXTEND_MODE_WRAP,D2D1_EXTEND_MODE_WRAP);
|
||||
|
||||
image = fillType.image;
|
||||
|
||||
D2D1_SIZE_U size;
|
||||
size.width = image.getWidth();
|
||||
size.height = image.getHeight();
|
||||
|
||||
D2D1_BITMAP_PROPERTIES bp = D2D1::BitmapProperties();
|
||||
|
||||
this->image = image.convertedToFormat (Image::ARGB);
|
||||
Image::BitmapData bd (this->image, false);
|
||||
bp.pixelFormat = owner.renderingTarget->GetPixelFormat();
|
||||
bp.pixelFormat.alphaMode = D2D1_ALPHA_MODE_PREMULTIPLIED;
|
||||
|
||||
HRESULT hr = owner.renderingTarget->CreateBitmap (size, bd.data, bd.lineStride, bp, &bitmap);
|
||||
hr = owner.renderingTarget->CreateBitmapBrush (bitmap, bmProps, brushProps, &bitmapBrush);
|
||||
|
||||
currentBrush = bitmapBrush;
|
||||
}
|
||||
else if (fillType.isGradient())
|
||||
{
|
||||
gradientStops = 0;
|
||||
|
||||
D2D1_BRUSH_PROPERTIES brushProps;
|
||||
brushProps.opacity = fillType.getOpacity();
|
||||
brushProps.transform = transfromToMatrix (fillType.transform);
|
||||
|
||||
const int numColors = fillType.gradient->getNumColours();
|
||||
|
||||
HeapBlock<D2D1_GRADIENT_STOP> stops (numColors);
|
||||
|
||||
for (int i = fillType.gradient->getNumColours(); --i >= 0;)
|
||||
{
|
||||
stops[i].color = colourToD2D (fillType.gradient->getColour(i));
|
||||
stops[i].position = fillType.gradient->getColourPosition(i);
|
||||
}
|
||||
|
||||
owner.renderingTarget->CreateGradientStopCollection (stops.getData(), numColors, &gradientStops);
|
||||
|
||||
if (fillType.gradient->isRadial)
|
||||
{
|
||||
radialGradient = 0;
|
||||
|
||||
const Point<float>& p1 = fillType.gradient->point1;
|
||||
const Point<float>& p2 = fillType.gradient->point2;
|
||||
float r = p1.getDistanceFrom (p2);
|
||||
|
||||
D2D1_RADIAL_GRADIENT_BRUSH_PROPERTIES props =
|
||||
D2D1::RadialGradientBrushProperties (D2D1::Point2F (p1.getX() + x, p1.getY() + y),
|
||||
D2D1::Point2F (0, 0),
|
||||
r, r);
|
||||
|
||||
owner.renderingTarget->CreateRadialGradientBrush (props, brushProps, gradientStops, &radialGradient);
|
||||
currentBrush = radialGradient;
|
||||
}
|
||||
else
|
||||
{
|
||||
linearGradient = 0;
|
||||
|
||||
const Point<float>& p1 = fillType.gradient->point1;
|
||||
const Point<float>& p2 = fillType.gradient->point2;
|
||||
|
||||
D2D1_LINEAR_GRADIENT_BRUSH_PROPERTIES props =
|
||||
D2D1::LinearGradientBrushProperties (D2D1::Point2F (p1.getX() + x, p1.getY() + y),
|
||||
D2D1::Point2F (p2.getX() + x, p2.getY() + y));
|
||||
|
||||
owner.renderingTarget->CreateLinearGradientBrush (props, brushProps, gradientStops, &linearGradient);
|
||||
|
||||
currentBrush = linearGradient;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
juce_UseDebuggingNewOperator
|
||||
|
||||
//==============================================================================
|
||||
//xxx most of these members should probably be private...
|
||||
|
||||
Direct2DLowLevelGraphicsContext& owner;
|
||||
|
||||
Point<int> origin;
|
||||
|
||||
Font font;
|
||||
float fontScaling;
|
||||
IDWriteFontFace* currentFontFace;
|
||||
ComSmartPtr <IDWriteFontFace> localFontFace;
|
||||
|
||||
FillType fillType;
|
||||
|
||||
Image image;
|
||||
ComSmartPtr <ID2D1Bitmap> bitmap; // xxx needs a better name - what is this for??
|
||||
|
||||
Rectangle<int> clipRect;
|
||||
bool clipsRect, shouldClipRect;
|
||||
|
||||
ComSmartPtr <ID2D1Geometry> complexClipGeometry;
|
||||
D2D1_LAYER_PARAMETERS complexClipLayerParams;
|
||||
ComSmartPtr <ID2D1Layer> complexClipLayer;
|
||||
bool clipsComplex, shouldClipComplex;
|
||||
|
||||
ComSmartPtr <ID2D1Geometry> rectListGeometry;
|
||||
D2D1_LAYER_PARAMETERS rectListLayerParams;
|
||||
ComSmartPtr <ID2D1Layer> rectListLayer;
|
||||
bool clipsRectList, shouldClipRectList;
|
||||
|
||||
Image maskImage;
|
||||
D2D1_LAYER_PARAMETERS imageMaskLayerParams;
|
||||
ComSmartPtr <ID2D1Layer> bitmapMaskLayer;
|
||||
ComSmartPtr <ID2D1Bitmap> maskBitmap;
|
||||
ComSmartPtr <ID2D1BitmapBrush> bitmapMaskBrush;
|
||||
bool clipsBitmap, shouldClipBitmap;
|
||||
|
||||
ID2D1Brush* currentBrush;
|
||||
ComSmartPtr <ID2D1BitmapBrush> bitmapBrush;
|
||||
ComSmartPtr <ID2D1LinearGradientBrush> linearGradient;
|
||||
ComSmartPtr <ID2D1RadialGradientBrush> radialGradient;
|
||||
ComSmartPtr <ID2D1GradientStopCollection> gradientStops;
|
||||
|
||||
private:
|
||||
SavedState (const SavedState&);
|
||||
SavedState& operator= (const SavedState& other);
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
juce_UseDebuggingNewOperator
|
||||
|
||||
private:
|
||||
HWND hwnd;
|
||||
ComSmartPtr <ID2D1HwndRenderTarget> renderingTarget;
|
||||
ComSmartPtr <ID2D1SolidColorBrush> colourBrush;
|
||||
Rectangle<int> bounds;
|
||||
|
||||
SavedState* currentState;
|
||||
OwnedArray<SavedState> states;
|
||||
|
||||
//==============================================================================
|
||||
static D2D1_RECT_F rectangleToRectF (const Rectangle<int>& r)
|
||||
{
|
||||
return D2D1::RectF ((float) r.getX(), (float) r.getY(), (float) r.getRight(), (float) r.getBottom());
|
||||
}
|
||||
|
||||
static const D2D1_COLOR_F colourToD2D (const Colour& c)
|
||||
{
|
||||
return D2D1::ColorF::ColorF (c.getFloatRed(), c.getFloatGreen(), c.getFloatBlue(), c.getFloatAlpha());
|
||||
}
|
||||
|
||||
static const D2D1_POINT_2F pointTransformed (int x, int y, const AffineTransform& transform = AffineTransform::identity)
|
||||
{
|
||||
transform.transformPoint (x, y);
|
||||
return D2D1::Point2F (x, y);
|
||||
}
|
||||
|
||||
static void rectToGeometrySink (const Rectangle<int>& rect, ID2D1GeometrySink* sink)
|
||||
{
|
||||
sink->BeginFigure (pointTransformed (rect.getX(), rect.getY()), D2D1_FIGURE_BEGIN_FILLED);
|
||||
sink->AddLine (pointTransformed (rect.getRight(), rect.getY()));
|
||||
sink->AddLine (pointTransformed (rect.getRight(), rect.getBottom()));
|
||||
sink->AddLine (pointTransformed (rect.getX(), rect.getBottom()));
|
||||
sink->EndFigure (D2D1_FIGURE_END_CLOSED);
|
||||
}
|
||||
|
||||
static ID2D1PathGeometry* rectListToPathGeometry (const RectangleList& clipRegion)
|
||||
{
|
||||
ID2D1PathGeometry* p = 0;
|
||||
SharedD2DFactory::getInstance()->d2dFactory->CreatePathGeometry (&p);
|
||||
|
||||
ComSmartPtr <ID2D1GeometrySink> sink;
|
||||
HRESULT hr = p->Open (&sink); // xxx handle error
|
||||
sink->SetFillMode (D2D1_FILL_MODE_WINDING);
|
||||
|
||||
for (int i = clipRegion.getNumRectangles(); --i >= 0;)
|
||||
rectToGeometrySink (clipRegion.getRectangle(i), sink);
|
||||
|
||||
hr = sink->Close();
|
||||
return p;
|
||||
}
|
||||
|
||||
static void pathToGeometrySink (const Path& path, ID2D1GeometrySink* sink, const AffineTransform& transform, int x, int y)
|
||||
{
|
||||
Path::Iterator it (path);
|
||||
|
||||
while (it.next())
|
||||
{
|
||||
switch (it.elementType)
|
||||
{
|
||||
case Path::Iterator::cubicTo:
|
||||
{
|
||||
D2D1_BEZIER_SEGMENT seg;
|
||||
|
||||
transform.transformPoint (it.x1, it.y1);
|
||||
seg.point1 = D2D1::Point2F (it.x1 + x, it.y1 + y);
|
||||
|
||||
transform.transformPoint (it.x2, it.y2);
|
||||
seg.point2 = D2D1::Point2F (it.x2 + x, it.y2 + y);
|
||||
|
||||
transform.transformPoint(it.x3, it.y3);
|
||||
seg.point3 = D2D1::Point2F (it.x3 + x, it.y3 + y);
|
||||
|
||||
sink->AddBezier (seg);
|
||||
break;
|
||||
}
|
||||
|
||||
case Path::Iterator::lineTo:
|
||||
{
|
||||
transform.transformPoint (it.x1, it.y1);
|
||||
sink->AddLine (D2D1::Point2F (it.x1 + x, it.y1 + y));
|
||||
break;
|
||||
}
|
||||
|
||||
case Path::Iterator::quadraticTo:
|
||||
{
|
||||
D2D1_QUADRATIC_BEZIER_SEGMENT seg;
|
||||
|
||||
transform.transformPoint (it.x1, it.y1);
|
||||
seg.point1 = D2D1::Point2F (it.x1 + x, it.y1 + y);
|
||||
|
||||
transform.transformPoint (it.x2, it.y2);
|
||||
seg.point2 = D2D1::Point2F (it.x2 + x, it.y2 + y);
|
||||
|
||||
sink->AddQuadraticBezier (seg);
|
||||
break;
|
||||
}
|
||||
|
||||
case Path::Iterator::closePath:
|
||||
{
|
||||
sink->EndFigure (D2D1_FIGURE_END_CLOSED);
|
||||
break;
|
||||
}
|
||||
|
||||
case Path::Iterator::startNewSubPath:
|
||||
{
|
||||
transform.transformPoint (it.x1, it.y1);
|
||||
sink->BeginFigure (D2D1::Point2F (it.x1 + x, it.y1 + y), D2D1_FIGURE_BEGIN_FILLED);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static ID2D1PathGeometry* pathToPathGeometry (const Path& path, const AffineTransform& transform, const Point<int>& point)
|
||||
{
|
||||
ID2D1PathGeometry* p = 0;
|
||||
SharedD2DFactory::getInstance()->d2dFactory->CreatePathGeometry (&p);
|
||||
|
||||
ComSmartPtr <ID2D1GeometrySink> sink;
|
||||
HRESULT hr = p->Open (&sink);
|
||||
sink->SetFillMode (D2D1_FILL_MODE_WINDING); // xxx need to check Path::isUsingNonZeroWinding()
|
||||
|
||||
pathToGeometrySink (path, sink, transform, point.getX(), point.getY());
|
||||
|
||||
hr = sink->Close();
|
||||
return p;
|
||||
}
|
||||
|
||||
static const D2D1::Matrix3x2F transfromToMatrix (const AffineTransform& transform)
|
||||
{
|
||||
D2D1::Matrix3x2F matrix;
|
||||
matrix._11 = transform.mat00;
|
||||
matrix._12 = transform.mat10;
|
||||
matrix._21 = transform.mat01;
|
||||
matrix._22 = transform.mat11;
|
||||
matrix._31 = transform.mat02;
|
||||
matrix._32 = transform.mat12;
|
||||
return matrix;
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
#endif
|
||||
|
|
@ -183,6 +183,11 @@
|
|||
#pragma warning (pop)
|
||||
#endif
|
||||
|
||||
#if JUCE_DIRECT2D
|
||||
#include <d2d1.h>
|
||||
#include <dwrite.h>
|
||||
#endif
|
||||
|
||||
//==============================================================================
|
||||
/** A simple COM smart pointer.
|
||||
Avoids having to include ATL just to get one of these.
|
||||
|
|
@ -237,7 +242,10 @@ public:
|
|||
|
||||
HRESULT __stdcall QueryInterface (REFIID refId, void __RPC_FAR* __RPC_FAR* result)
|
||||
{
|
||||
#ifndef __MINGW32__
|
||||
if (refId == __uuidof (ComClass)) { AddRef(); *result = dynamic_cast <ComClass*> (this); return S_OK; }
|
||||
#endif
|
||||
|
||||
if (refId == IID_IUnknown) { AddRef(); *result = dynamic_cast <IUnknown*> (this); return S_OK; }
|
||||
|
||||
*result = 0;
|
||||
|
|
|
|||
|
|
@ -382,11 +382,22 @@ static void* callFunctionIfNotLocked (MessageCallbackFunction* callback, void* u
|
|||
class Win32ComponentPeer : public ComponentPeer
|
||||
{
|
||||
public:
|
||||
enum RenderingEngineType
|
||||
{
|
||||
softwareRenderingEngine = 0,
|
||||
direct2DRenderingEngine
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
Win32ComponentPeer (Component* const component,
|
||||
const int windowStyleFlags)
|
||||
: ComponentPeer (component, windowStyleFlags),
|
||||
dontRepaint (false),
|
||||
#if JUCE_DIRECT2D
|
||||
currentRenderingEngine (direct2DRenderingEngine),
|
||||
#else
|
||||
currentRenderingEngine (softwareRenderingEngine),
|
||||
#endif
|
||||
fullScreen (false),
|
||||
isDragging (false),
|
||||
isMouseOver (false),
|
||||
|
|
@ -427,6 +438,10 @@ public:
|
|||
dropTarget->Release();
|
||||
dropTarget = 0;
|
||||
}
|
||||
|
||||
#if JUCE_DIRECT2D
|
||||
direct2DContext = 0;
|
||||
#endif
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
|
@ -478,6 +493,11 @@ public:
|
|||
info.rcWindow.bottom - info.rcClient.bottom,
|
||||
info.rcWindow.right - info.rcClient.right);
|
||||
}
|
||||
|
||||
#if JUCE_DIRECT2D
|
||||
if (direct2DContext != 0)
|
||||
direct2DContext->resized();
|
||||
#endif
|
||||
}
|
||||
|
||||
void setSize (int w, int h)
|
||||
|
|
@ -842,6 +862,10 @@ public:
|
|||
private:
|
||||
HWND hwnd;
|
||||
ScopedPointer<DropShadower> shadower;
|
||||
RenderingEngineType currentRenderingEngine;
|
||||
#if JUCE_DIRECT2D
|
||||
ScopedPointer<Direct2DLowLevelGraphicsContext> direct2DContext;
|
||||
#endif
|
||||
bool fullScreen, isDragging, isMouseOver, hasCreatedCaret;
|
||||
BorderSize windowBorder;
|
||||
HICON currentWindowIcon;
|
||||
|
|
@ -988,6 +1012,10 @@ private:
|
|||
|
||||
hwnd = CreateWindowEx (exstyle, WindowClassHolder::getInstance()->windowClassName, L"", type, 0, 0, 0, 0, 0, 0, 0, 0);
|
||||
|
||||
#if JUCE_DIRECT2D
|
||||
updateDirect2DContext();
|
||||
#endif
|
||||
|
||||
if (hwnd != 0)
|
||||
{
|
||||
SetWindowLongPtr (hwnd, 0, 0);
|
||||
|
|
@ -1084,130 +1112,147 @@ private:
|
|||
//==============================================================================
|
||||
void handlePaintMessage()
|
||||
{
|
||||
HRGN rgn = CreateRectRgn (0, 0, 0, 0);
|
||||
const int regionType = GetUpdateRgn (hwnd, rgn, false);
|
||||
|
||||
PAINTSTRUCT paintStruct;
|
||||
HDC dc = BeginPaint (hwnd, &paintStruct); // Note this can immediately generate a WM_NCPAINT
|
||||
// message and become re-entrant, but that's OK
|
||||
|
||||
// if something in a paint handler calls, e.g. a message box, this can become reentrant and
|
||||
// corrupt the image it's using to paint into, so do a check here.
|
||||
static bool reentrant = false;
|
||||
if (reentrant)
|
||||
#if JUCE_DIRECT2D
|
||||
if (direct2DContext != 0)
|
||||
{
|
||||
DeleteObject (rgn);
|
||||
EndPaint (hwnd, &paintStruct);
|
||||
return;
|
||||
}
|
||||
|
||||
reentrant = true;
|
||||
|
||||
// this is the rectangle to update..
|
||||
int x = paintStruct.rcPaint.left;
|
||||
int y = paintStruct.rcPaint.top;
|
||||
int w = paintStruct.rcPaint.right - x;
|
||||
int h = paintStruct.rcPaint.bottom - y;
|
||||
|
||||
const bool transparent = isTransparent();
|
||||
|
||||
if (transparent)
|
||||
{
|
||||
// it's not possible to have a transparent window with a title bar at the moment!
|
||||
jassert (! hasTitleBar());
|
||||
|
||||
RECT r;
|
||||
GetWindowRect (hwnd, &r);
|
||||
x = y = 0;
|
||||
w = r.right - r.left;
|
||||
h = r.bottom - r.top;
|
||||
|
||||
if (GetUpdateRect (hwnd, &r, false))
|
||||
{
|
||||
direct2DContext->start();
|
||||
direct2DContext->clipToRectangle (Rectangle<int> (r.left, r.top, r.right - r.left, r.bottom - r.top));
|
||||
handlePaint (*direct2DContext);
|
||||
direct2DContext->end();
|
||||
}
|
||||
}
|
||||
|
||||
if (w > 0 && h > 0)
|
||||
else
|
||||
#endif
|
||||
{
|
||||
clearMaskedRegion();
|
||||
HRGN rgn = CreateRectRgn (0, 0, 0, 0);
|
||||
const int regionType = GetUpdateRgn (hwnd, rgn, false);
|
||||
|
||||
Image offscreenImage (offscreenImageGenerator.getImage (transparent, w, h));
|
||||
PAINTSTRUCT paintStruct;
|
||||
HDC dc = BeginPaint (hwnd, &paintStruct); // Note this can immediately generate a WM_NCPAINT
|
||||
// message and become re-entrant, but that's OK
|
||||
|
||||
RectangleList contextClip;
|
||||
const Rectangle<int> clipBounds (0, 0, w, h);
|
||||
|
||||
bool needToPaintAll = true;
|
||||
|
||||
if (regionType == COMPLEXREGION && ! transparent)
|
||||
// if something in a paint handler calls, e.g. a message box, this can become reentrant and
|
||||
// corrupt the image it's using to paint into, so do a check here.
|
||||
static bool reentrant = false;
|
||||
if (reentrant)
|
||||
{
|
||||
HRGN clipRgn = CreateRectRgnIndirect (&paintStruct.rcPaint);
|
||||
CombineRgn (rgn, rgn, clipRgn, RGN_AND);
|
||||
DeleteObject (clipRgn);
|
||||
|
||||
char rgnData [8192];
|
||||
const DWORD res = GetRegionData (rgn, sizeof (rgnData), (RGNDATA*) rgnData);
|
||||
|
||||
if (res > 0 && res <= sizeof (rgnData))
|
||||
{
|
||||
const RGNDATAHEADER* const hdr = &(((const RGNDATA*) rgnData)->rdh);
|
||||
|
||||
if (hdr->iType == RDH_RECTANGLES
|
||||
&& hdr->rcBound.right - hdr->rcBound.left >= w
|
||||
&& hdr->rcBound.bottom - hdr->rcBound.top >= h)
|
||||
{
|
||||
needToPaintAll = false;
|
||||
|
||||
const RECT* rects = (const RECT*) (rgnData + sizeof (RGNDATAHEADER));
|
||||
int num = ((RGNDATA*) rgnData)->rdh.nCount;
|
||||
|
||||
while (--num >= 0)
|
||||
{
|
||||
if (rects->right <= x + w && rects->bottom <= y + h)
|
||||
{
|
||||
// (need to move this one pixel to the left because of a win32 bug)
|
||||
const int cx = jmax (x, (int) rects->left - 1);
|
||||
contextClip.addWithoutMerging (Rectangle<int> (cx - x, rects->top - y, rects->right - cx, rects->bottom - rects->top)
|
||||
.getIntersection (clipBounds));
|
||||
}
|
||||
else
|
||||
{
|
||||
needToPaintAll = true;
|
||||
break;
|
||||
}
|
||||
|
||||
++rects;
|
||||
}
|
||||
}
|
||||
}
|
||||
DeleteObject (rgn);
|
||||
EndPaint (hwnd, &paintStruct);
|
||||
return;
|
||||
}
|
||||
|
||||
if (needToPaintAll)
|
||||
{
|
||||
contextClip.clear();
|
||||
contextClip.addWithoutMerging (Rectangle<int> (w, h));
|
||||
}
|
||||
reentrant = true;
|
||||
|
||||
// this is the rectangle to update..
|
||||
int x = paintStruct.rcPaint.left;
|
||||
int y = paintStruct.rcPaint.top;
|
||||
int w = paintStruct.rcPaint.right - x;
|
||||
int h = paintStruct.rcPaint.bottom - y;
|
||||
|
||||
const bool transparent = isTransparent();
|
||||
|
||||
if (transparent)
|
||||
{
|
||||
RectangleList::Iterator i (contextClip);
|
||||
// it's not possible to have a transparent window with a title bar at the moment!
|
||||
jassert (! hasTitleBar());
|
||||
|
||||
while (i.next())
|
||||
offscreenImage.clear (*i.getRectangle());
|
||||
RECT r;
|
||||
GetWindowRect (hwnd, &r);
|
||||
x = y = 0;
|
||||
w = r.right - r.left;
|
||||
h = r.bottom - r.top;
|
||||
}
|
||||
|
||||
// if the component's not opaque, this won't draw properly unless the platform can support this
|
||||
jassert (Desktop::canUseSemiTransparentWindows() || component->isOpaque());
|
||||
if (w > 0 && h > 0)
|
||||
{
|
||||
clearMaskedRegion();
|
||||
|
||||
updateCurrentModifiers();
|
||||
Image offscreenImage (offscreenImageGenerator.getImage (transparent, w, h));
|
||||
|
||||
LowLevelGraphicsSoftwareRenderer context (offscreenImage, -x, -y, contextClip);
|
||||
handlePaint (context);
|
||||
RectangleList contextClip;
|
||||
const Rectangle<int> clipBounds (0, 0, w, h);
|
||||
|
||||
if (! dontRepaint)
|
||||
static_cast <WindowsBitmapImage*> (offscreenImage.getSharedImage())
|
||||
->blitToWindow (hwnd, dc, transparent, x, y, maskedRegion);
|
||||
bool needToPaintAll = true;
|
||||
|
||||
if (regionType == COMPLEXREGION && ! transparent)
|
||||
{
|
||||
HRGN clipRgn = CreateRectRgnIndirect (&paintStruct.rcPaint);
|
||||
CombineRgn (rgn, rgn, clipRgn, RGN_AND);
|
||||
DeleteObject (clipRgn);
|
||||
|
||||
char rgnData [8192];
|
||||
const DWORD res = GetRegionData (rgn, sizeof (rgnData), (RGNDATA*) rgnData);
|
||||
|
||||
if (res > 0 && res <= sizeof (rgnData))
|
||||
{
|
||||
const RGNDATAHEADER* const hdr = &(((const RGNDATA*) rgnData)->rdh);
|
||||
|
||||
if (hdr->iType == RDH_RECTANGLES
|
||||
&& hdr->rcBound.right - hdr->rcBound.left >= w
|
||||
&& hdr->rcBound.bottom - hdr->rcBound.top >= h)
|
||||
{
|
||||
needToPaintAll = false;
|
||||
|
||||
const RECT* rects = (const RECT*) (rgnData + sizeof (RGNDATAHEADER));
|
||||
int num = ((RGNDATA*) rgnData)->rdh.nCount;
|
||||
|
||||
while (--num >= 0)
|
||||
{
|
||||
if (rects->right <= x + w && rects->bottom <= y + h)
|
||||
{
|
||||
// (need to move this one pixel to the left because of a win32 bug)
|
||||
const int cx = jmax (x, (int) rects->left - 1);
|
||||
contextClip.addWithoutMerging (Rectangle<int> (cx - x, rects->top - y, rects->right - cx, rects->bottom - rects->top)
|
||||
.getIntersection (clipBounds));
|
||||
}
|
||||
else
|
||||
{
|
||||
needToPaintAll = true;
|
||||
break;
|
||||
}
|
||||
|
||||
++rects;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (needToPaintAll)
|
||||
{
|
||||
contextClip.clear();
|
||||
contextClip.addWithoutMerging (Rectangle<int> (w, h));
|
||||
}
|
||||
|
||||
if (transparent)
|
||||
{
|
||||
RectangleList::Iterator i (contextClip);
|
||||
|
||||
while (i.next())
|
||||
offscreenImage.clear (*i.getRectangle());
|
||||
}
|
||||
|
||||
// if the component's not opaque, this won't draw properly unless the platform can support this
|
||||
jassert (Desktop::canUseSemiTransparentWindows() || component->isOpaque());
|
||||
|
||||
updateCurrentModifiers();
|
||||
|
||||
LowLevelGraphicsSoftwareRenderer context (offscreenImage, -x, -y, contextClip);
|
||||
handlePaint (context);
|
||||
|
||||
if (! dontRepaint)
|
||||
static_cast <WindowsBitmapImage*> (offscreenImage.getSharedImage())
|
||||
->blitToWindow (hwnd, dc, transparent, x, y, maskedRegion);
|
||||
}
|
||||
|
||||
DeleteObject (rgn);
|
||||
EndPaint (hwnd, &paintStruct);
|
||||
reentrant = false;
|
||||
}
|
||||
|
||||
DeleteObject (rgn);
|
||||
EndPaint (hwnd, &paintStruct);
|
||||
reentrant = false;
|
||||
|
||||
#ifndef JUCE_GCC //xxx should add this fn for gcc..
|
||||
_fpreset(); // because some graphics cards can unmask FP exceptions
|
||||
#endif
|
||||
|
|
@ -1221,6 +1266,48 @@ private:
|
|||
handleMouseEvent (0, position, currentModifiers, getMouseEventTime());
|
||||
}
|
||||
|
||||
const StringArray getAvailableRenderingEngines()
|
||||
{
|
||||
StringArray s (ComponentPeer::getAvailableRenderingEngines());
|
||||
|
||||
#if JUCE_DIRECT2D
|
||||
// xxx is this correct? Seems to enable it on Vista too??
|
||||
OSVERSIONINFO info;
|
||||
zerostruct (info);
|
||||
info.dwOSVersionInfoSize = sizeof (OSVERSIONINFO);
|
||||
GetVersionEx (&info);
|
||||
if (info.dwMajorVersion >= 6)
|
||||
s.add ("Direct2D");
|
||||
#endif
|
||||
return s;
|
||||
}
|
||||
|
||||
int getCurrentRenderingEngine() throw()
|
||||
{
|
||||
return currentRenderingEngine;
|
||||
}
|
||||
|
||||
#if JUCE_DIRECT2D
|
||||
void updateDirect2DContext()
|
||||
{
|
||||
if (currentRenderingEngine != direct2DRenderingEngine)
|
||||
direct2DContext = 0;
|
||||
else if (direct2DContext == 0)
|
||||
direct2DContext = new Direct2DLowLevelGraphicsContext (hwnd);
|
||||
}
|
||||
#endif
|
||||
|
||||
void setCurrentRenderingEngine (int index)
|
||||
{
|
||||
(void) index;
|
||||
|
||||
#if JUCE_DIRECT2D
|
||||
currentRenderingEngine = index == 1 ? direct2DRenderingEngine : softwareRenderingEngine;
|
||||
updateDirect2DContext();
|
||||
repaint (component->getLocalBounds());
|
||||
#endif
|
||||
}
|
||||
|
||||
void doMouseMove (const Point<int>& position)
|
||||
{
|
||||
if (! isMouseOver)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue