| @@ -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 | |||
| @@ -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 | |||
| @@ -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,129 +1112,146 @@ 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; | |||
| } | |||
| RECT r; | |||
| reentrant = true; | |||
| 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(); | |||
| } | |||
| } | |||
| else | |||
| #endif | |||
| { | |||
| HRGN rgn = CreateRectRgn (0, 0, 0, 0); | |||
| const int regionType = GetUpdateRgn (hwnd, rgn, false); | |||
| // 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; | |||
| PAINTSTRUCT paintStruct; | |||
| HDC dc = BeginPaint (hwnd, &paintStruct); // Note this can immediately generate a WM_NCPAINT | |||
| // message and become re-entrant, but that's OK | |||
| const bool transparent = isTransparent(); | |||
| // 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) | |||
| { | |||
| DeleteObject (rgn); | |||
| EndPaint (hwnd, &paintStruct); | |||
| return; | |||
| } | |||
| if (transparent) | |||
| { | |||
| // it's not possible to have a transparent window with a title bar at the moment! | |||
| jassert (! hasTitleBar()); | |||
| reentrant = true; | |||
| RECT r; | |||
| GetWindowRect (hwnd, &r); | |||
| x = y = 0; | |||
| w = r.right - r.left; | |||
| h = r.bottom - r.top; | |||
| } | |||
| // 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; | |||
| if (w > 0 && h > 0) | |||
| { | |||
| clearMaskedRegion(); | |||
| const bool transparent = isTransparent(); | |||
| Image offscreenImage (offscreenImageGenerator.getImage (transparent, w, h)); | |||
| 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; | |||
| } | |||
| RectangleList contextClip; | |||
| const Rectangle<int> clipBounds (0, 0, w, h); | |||
| if (w > 0 && h > 0) | |||
| { | |||
| clearMaskedRegion(); | |||
| bool needToPaintAll = true; | |||
| Image offscreenImage (offscreenImageGenerator.getImage (transparent, w, h)); | |||
| if (regionType == COMPLEXREGION && ! transparent) | |||
| { | |||
| HRGN clipRgn = CreateRectRgnIndirect (&paintStruct.rcPaint); | |||
| CombineRgn (rgn, rgn, clipRgn, RGN_AND); | |||
| DeleteObject (clipRgn); | |||
| RectangleList contextClip; | |||
| const Rectangle<int> clipBounds (0, 0, w, h); | |||
| char rgnData [8192]; | |||
| const DWORD res = GetRegionData (rgn, sizeof (rgnData), (RGNDATA*) rgnData); | |||
| bool needToPaintAll = true; | |||
| if (res > 0 && res <= sizeof (rgnData)) | |||
| if (regionType == COMPLEXREGION && ! transparent) | |||
| { | |||
| const RGNDATAHEADER* const hdr = &(((const RGNDATA*) rgnData)->rdh); | |||
| HRGN clipRgn = CreateRectRgnIndirect (&paintStruct.rcPaint); | |||
| CombineRgn (rgn, rgn, clipRgn, RGN_AND); | |||
| DeleteObject (clipRgn); | |||
| if (hdr->iType == RDH_RECTANGLES | |||
| && hdr->rcBound.right - hdr->rcBound.left >= w | |||
| && hdr->rcBound.bottom - hdr->rcBound.top >= h) | |||
| { | |||
| needToPaintAll = false; | |||
| char rgnData [8192]; | |||
| const DWORD res = GetRegionData (rgn, sizeof (rgnData), (RGNDATA*) rgnData); | |||
| const RECT* rects = (const RECT*) (rgnData + sizeof (RGNDATAHEADER)); | |||
| int num = ((RGNDATA*) rgnData)->rdh.nCount; | |||
| if (res > 0 && res <= sizeof (rgnData)) | |||
| { | |||
| const RGNDATAHEADER* const hdr = &(((const RGNDATA*) rgnData)->rdh); | |||
| while (--num >= 0) | |||
| if (hdr->iType == RDH_RECTANGLES | |||
| && hdr->rcBound.right - hdr->rcBound.left >= w | |||
| && hdr->rcBound.bottom - hdr->rcBound.top >= h) | |||
| { | |||
| 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 = false; | |||
| const RECT* rects = (const RECT*) (rgnData + sizeof (RGNDATAHEADER)); | |||
| int num = ((RGNDATA*) rgnData)->rdh.nCount; | |||
| while (--num >= 0) | |||
| { | |||
| needToPaintAll = true; | |||
| break; | |||
| 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; | |||
| } | |||
| ++rects; | |||
| } | |||
| } | |||
| } | |||
| } | |||
| if (needToPaintAll) | |||
| { | |||
| contextClip.clear(); | |||
| contextClip.addWithoutMerging (Rectangle<int> (w, h)); | |||
| } | |||
| if (needToPaintAll) | |||
| { | |||
| contextClip.clear(); | |||
| contextClip.addWithoutMerging (Rectangle<int> (w, h)); | |||
| } | |||
| if (transparent) | |||
| { | |||
| RectangleList::Iterator i (contextClip); | |||
| if (transparent) | |||
| { | |||
| RectangleList::Iterator i (contextClip); | |||
| while (i.next()) | |||
| offscreenImage.clear (*i.getRectangle()); | |||
| } | |||
| 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()); | |||
| // if the component's not opaque, this won't draw properly unless the platform can support this | |||
| jassert (Desktop::canUseSemiTransparentWindows() || component->isOpaque()); | |||
| updateCurrentModifiers(); | |||
| updateCurrentModifiers(); | |||
| LowLevelGraphicsSoftwareRenderer context (offscreenImage, -x, -y, contextClip); | |||
| handlePaint (context); | |||
| LowLevelGraphicsSoftwareRenderer context (offscreenImage, -x, -y, contextClip); | |||
| handlePaint (context); | |||
| if (! dontRepaint) | |||
| static_cast <WindowsBitmapImage*> (offscreenImage.getSharedImage()) | |||
| ->blitToWindow (hwnd, dc, transparent, x, y, maskedRegion); | |||
| } | |||
| 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 | |||
| @@ -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) | |||