mirror of
https://github.com/juce-framework/JUCE.git
synced 2026-01-20 01:14:20 +00:00
Refactored some rendering code.
This commit is contained in:
parent
f31dca5f2f
commit
be3565ac98
35 changed files with 386 additions and 239 deletions
|
|
@ -173,6 +173,7 @@
|
|||
271A1D94B96A8B7C949FD8ED = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ComponentMovementWatcher.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_ComponentMovementWatcher.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
2A060BB0D79BEC3CF644F553 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Clipboard.cpp"; path = "../../../../modules/juce_gui_basics/native/juce_linux_Clipboard.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
2A4B079CDB9C40EB912B6EEB = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileInputSource.h"; path = "../../../../modules/juce_core/streams/juce_FileInputSource.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
2AADCE9D8BADF4DAC05CCA1E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RenderingHelpers.h"; path = "../../../../modules/juce_graphics/native/juce_RenderingHelpers.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
2B074BFC193A25602E73D0CC = { isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../../../modules/juce_core/juce_module_info"; sourceTree = "SOURCE_ROOT"; };
|
||||
2B8548461E318DCB3354DB43 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_gui_basics.h"; path = "../../../../modules/juce_gui_basics/juce_gui_basics.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
2BB98D1E325EF7BD90C6BBB4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NamedPipe.h"; path = "../../../../modules/juce_core/network/juce_NamedPipe.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
|
|
@ -1202,6 +1203,7 @@
|
|||
1F36217CE7A5B1D63D41EA6C,
|
||||
045B9C5D21C5C86FED140D81,
|
||||
0B96A219A0CFF707E5A13B68,
|
||||
2AADCE9D8BADF4DAC05CCA1E,
|
||||
21FAFA7F2C5D0E8D99876EA8,
|
||||
5843A5060852C6ACC4770EC7 ); name = native; sourceTree = "<group>"; };
|
||||
E9819C83D0B797FC71811B1B = { isa = PBXGroup; children = (
|
||||
|
|
|
|||
|
|
@ -1874,6 +1874,7 @@
|
|||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsContext.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_Fonts.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_win32_Direct2DGraphicsContext.cpp">
|
||||
<FileConfiguration Name="Debug|Win32"
|
||||
ExcludedFromBuild="true">
|
||||
|
|
|
|||
|
|
@ -1874,6 +1874,7 @@
|
|||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsContext.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_Fonts.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_win32_Direct2DGraphicsContext.cpp">
|
||||
<FileConfiguration Name="Debug|Win32"
|
||||
ExcludedFromBuild="true">
|
||||
|
|
|
|||
|
|
@ -1166,6 +1166,7 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_graphics\effects\juce_ImageEffectFilter.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsContext.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>
|
||||
|
|
|
|||
|
|
@ -1851,6 +1851,9 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h">
|
||||
<Filter>Juce Modules\juce_graphics\native</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h">
|
||||
<Filter>Juce Modules\juce_graphics\native</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h">
|
||||
<Filter>Juce Modules\juce_graphics</Filter>
|
||||
</ClInclude>
|
||||
|
|
|
|||
|
|
@ -185,6 +185,7 @@
|
|||
2590DCE65DE2323D9EF77214 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OwnedArray.h"; path = "../../../../modules/juce_core/containers/juce_OwnedArray.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
2597ED98D3C16A7EEF1FBFFD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_osx_ObjCHelpers.h"; path = "../../../../modules/juce_core/native/juce_osx_ObjCHelpers.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
25FECE7ACACB29E1725A6A17 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatReader.cpp"; path = "../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
2649F70294DB168919CBCAD3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RenderingHelpers.h"; path = "../../../../modules/juce_graphics/native/juce_RenderingHelpers.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
2666A5013948E2EAD29458C1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Expression.cpp"; path = "../../../../modules/juce_core/maths/juce_Expression.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
26B73C77D47B146F92BEA265 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableText.h"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawableText.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
2708E4F2F73D88F73D8E54D0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawablePath.cpp"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
|
|
@ -1511,6 +1512,7 @@
|
|||
8EB9B4853F225BDB97D6626E,
|
||||
8154D2D681E028B8783E5331,
|
||||
0BBEDD3E8C0C2B7C4B52016A,
|
||||
2649F70294DB168919CBCAD3,
|
||||
5712EB90A8B51DBBC4E19A39,
|
||||
5CABE190EBD0F4EEB763114A ); name = native; sourceTree = "<group>"; };
|
||||
980520A52BB3BF76E45AECA8 = { isa = PBXGroup; children = (
|
||||
|
|
|
|||
|
|
@ -2608,6 +2608,7 @@
|
|||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsContext.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_Fonts.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_win32_Direct2DGraphicsContext.cpp">
|
||||
<FileConfiguration Name="Debug|Win32"
|
||||
ExcludedFromBuild="true">
|
||||
|
|
|
|||
|
|
@ -2608,6 +2608,7 @@
|
|||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsContext.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_Fonts.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_win32_Direct2DGraphicsContext.cpp">
|
||||
<FileConfiguration Name="Debug|Win32"
|
||||
ExcludedFromBuild="true">
|
||||
|
|
|
|||
|
|
@ -1431,6 +1431,7 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_graphics\effects\juce_ImageEffectFilter.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsContext.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>
|
||||
|
|
|
|||
|
|
@ -2334,6 +2334,9 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h">
|
||||
<Filter>Juce Modules\juce_graphics\native</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h">
|
||||
<Filter>Juce Modules\juce_graphics\native</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h">
|
||||
<Filter>Juce Modules\juce_graphics</Filter>
|
||||
</ClInclude>
|
||||
|
|
|
|||
|
|
@ -178,6 +178,7 @@
|
|||
2590DCE65DE2323D9EF77214 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OwnedArray.h"; path = "../../../../modules/juce_core/containers/juce_OwnedArray.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
2597ED98D3C16A7EEF1FBFFD = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_osx_ObjCHelpers.h"; path = "../../../../modules/juce_core/native/juce_osx_ObjCHelpers.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
25FECE7ACACB29E1725A6A17 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatReader.cpp"; path = "../../../../modules/juce_audio_formats/format/juce_AudioFormatReader.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
2649F70294DB168919CBCAD3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RenderingHelpers.h"; path = "../../../../modules/juce_graphics/native/juce_RenderingHelpers.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
2666A5013948E2EAD29458C1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Expression.cpp"; path = "../../../../modules/juce_core/maths/juce_Expression.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
26B73C77D47B146F92BEA265 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableText.h"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawableText.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
2708E4F2F73D88F73D8E54D0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawablePath.cpp"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawablePath.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
|
|
@ -1501,6 +1502,7 @@
|
|||
8EB9B4853F225BDB97D6626E,
|
||||
8154D2D681E028B8783E5331,
|
||||
0BBEDD3E8C0C2B7C4B52016A,
|
||||
2649F70294DB168919CBCAD3,
|
||||
5712EB90A8B51DBBC4E19A39,
|
||||
5CABE190EBD0F4EEB763114A ); name = native; sourceTree = "<group>"; };
|
||||
980520A52BB3BF76E45AECA8 = { isa = PBXGroup; children = (
|
||||
|
|
|
|||
|
|
@ -123,6 +123,7 @@
|
|||
103FA4C6C505052C818A4829 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUTimestampGenerator.h; path = Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUTimestampGenerator.h; sourceTree = "DEVELOPER_DIR"; };
|
||||
104CC5F094E0B3D1D3055D04 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioUnitPluginFormat.h"; path = "../../../../modules/juce_audio_processors/format_types/juce_AudioUnitPluginFormat.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
10A49DD74F3FB9E69FC989B9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_JPEGLoader.cpp"; path = "../../../../modules/juce_graphics/image_formats/juce_JPEGLoader.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
1127215528CC4A4A504078BF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RenderingHelpers.h"; path = "../../../../modules/juce_graphics/native/juce_RenderingHelpers.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
115FCA1C09C15AD7EB4AC87C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_BufferedInputStream.cpp"; path = "../../../../modules/juce_core/streams/juce_BufferedInputStream.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
121FB46FF3426D00B9776611 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChoicePropertyComponent.h"; path = "../../../../modules/juce_gui_basics/properties/juce_ChoicePropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
1225618F94215E066D1D982D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_QuickTimeAudioFormat.h"; path = "../../../../modules/juce_audio_formats/codecs/juce_QuickTimeAudioFormat.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
|
|
@ -1427,6 +1428,7 @@
|
|||
3F05190135896541D991C075,
|
||||
802E244849C0AE5DACD3FCCB,
|
||||
56A295F04B7F248D0A52B878,
|
||||
1127215528CC4A4A504078BF,
|
||||
C8302DD07934EBD796C2BFBB,
|
||||
78959840E3EF9DC06998BB42 ); name = native; sourceTree = "<group>"; };
|
||||
F0F89564A3784EB052CEE01B = { isa = PBXGroup; children = (
|
||||
|
|
|
|||
|
|
@ -2545,6 +2545,7 @@
|
|||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsContext.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_Fonts.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_win32_Direct2DGraphicsContext.cpp">
|
||||
<FileConfiguration Name="Debug|Win32"
|
||||
ExcludedFromBuild="true">
|
||||
|
|
|
|||
|
|
@ -2545,6 +2545,7 @@
|
|||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsContext.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_Fonts.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_win32_Direct2DGraphicsContext.cpp">
|
||||
<FileConfiguration Name="Debug|Win32"
|
||||
ExcludedFromBuild="true">
|
||||
|
|
|
|||
|
|
@ -521,6 +521,7 @@
|
|||
94A770B7E16685F3469CA932 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_NativeMessageBox.h"; path = "../../../../modules/juce_gui_basics/windows/juce_NativeMessageBox.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
94B22D21E4DE9259A3F385A3 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DropShadowEffect.h"; path = "../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
94B986F221A8369B8DE3D986 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WeakReference.h"; path = "../../../../modules/juce_core/memory/juce_WeakReference.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
94D27CA81B1481621186F4D5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RenderingHelpers.h"; path = "../../../../modules/juce_graphics/native/juce_RenderingHelpers.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
956BE0B32D5B1410E43A3C58 = { isa = PBXFileReference; lastKnownFileType = file; name = "juce_module_info"; path = "../../../../modules/juce_data_structures/juce_module_info"; sourceTree = "SOURCE_ROOT"; };
|
||||
957428BC0CD90C37ED1EB7E1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_StringArray.h"; path = "../../../../modules/juce_core/text/juce_StringArray.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
9647232A743A0C7BFE819385 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TextPropertyComponent.h"; path = "../../../../modules/juce_gui_basics/properties/juce_TextPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
|
|
@ -734,7 +735,6 @@
|
|||
DD53156BA824889FD7DF52D2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ThreadPool.cpp"; path = "../../../../modules/juce_core/threads/juce_ThreadPool.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
DD8E5D0C88FA2C287F824357 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GraphEditorPanel.h; path = ../../Source/GraphEditorPanel.h; sourceTree = "SOURCE_ROOT"; };
|
||||
DE0C4CC1CE545BAD009786E4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatWriter.cpp"; path = "../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
DE8035865F6033F8BBF41740 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_HyperlinkButton.cpp"; path = "../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
E146C1CCDC8EA0498CD33E5D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioIODevice.cpp"; path = "../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
E179C9C99270068D4ED16872 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReverbAudioSource.h"; path = "../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
E68018DE199135B7F738FB17 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; };
|
||||
|
|
@ -756,6 +756,7 @@
|
|||
DE0712F13AD6AB6180E2E680 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileSearchPathListComponent.cpp"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
DE1FE14BE1B14A214C2D8B66 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_WildcardFileFilter.cpp"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_WildcardFileFilter.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
DE435BB18276B8626AF37D05 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedValueSetter.h"; path = "../../../../modules/juce_core/containers/juce_ScopedValueSetter.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
DE8035865F6033F8BBF41740 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_HyperlinkButton.cpp"; path = "../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
DEEFCE87BE3B9D7AFC7ADC16 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationCommandInfo.cpp"; path = "../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
DF309886A3D26FC34280B329 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_CameraDevice.mm"; path = "../../../../modules/juce_video/native/juce_mac_CameraDevice.mm"; sourceTree = "SOURCE_ROOT"; };
|
||||
DF614EDBEA2D76889E002465 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_SystemTrayIcon.cpp"; path = "../../../../modules/juce_gui_extra/native/juce_linux_SystemTrayIcon.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
|
|
@ -1433,6 +1434,7 @@
|
|||
3D64A2C5EB65C68C4CBE47C3,
|
||||
2355148BC8F47D63CB66C40F,
|
||||
AA7350771ED17561EB915EED,
|
||||
94D27CA81B1481621186F4D5,
|
||||
C62FBDF34D1B74CCF12AEA2F,
|
||||
64A1DACEA71957604AD58B3C ); name = native; sourceTree = "<group>"; };
|
||||
735136A0AB9278D0871D9684 = { isa = PBXGroup; children = (
|
||||
|
|
|
|||
|
|
@ -2531,6 +2531,7 @@
|
|||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsContext.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_Fonts.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_win32_Direct2DGraphicsContext.cpp">
|
||||
<FileConfiguration Name="Debug|Win32"
|
||||
ExcludedFromBuild="true">
|
||||
|
|
|
|||
|
|
@ -2531,6 +2531,7 @@
|
|||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsContext.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_Fonts.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_win32_Direct2DGraphicsContext.cpp">
|
||||
<FileConfiguration Name="Debug|Win32"
|
||||
ExcludedFromBuild="true">
|
||||
|
|
|
|||
|
|
@ -204,6 +204,7 @@
|
|||
4A5ED88CC2ED6ADD8A5B102A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Result.h"; path = "../../../../modules/juce_core/misc/juce_Result.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
4A8C64BB96FB93919DDF2166 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_MessageManager.mm"; path = "../../../../modules/juce_events/native/juce_ios_MessageManager.mm"; sourceTree = "SOURCE_ROOT"; };
|
||||
4BCEEF3FC9849208FF6B1BD7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RectangleList.cpp"; path = "../../../../modules/juce_graphics/geometry/juce_RectangleList.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
4C34CB4DC542D86A193C055A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RenderingHelpers.h"; path = "../../../../modules/juce_graphics/native/juce_RenderingHelpers.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
4CC331BEE18B3EC4BADF38CE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Colours.h"; path = "../../../../modules/juce_graphics/colour/juce_Colours.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
4D44E9AD19469774ED8245B2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CodeEditorComponent.cpp"; path = "../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
4D6C90354134741F7F295412 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DirectoryContentsDisplayComponent.cpp"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
|
|
@ -987,6 +988,7 @@
|
|||
65A88D5E8C1F0BE74F05C072,
|
||||
06EF239CDE579FFC28F65BE2,
|
||||
C6BCFCD2732C7153C33B6168,
|
||||
4C34CB4DC542D86A193C055A,
|
||||
A3961F3261459774B65EBD3B,
|
||||
A5E748EC8CB636CEBF7BA497 ); name = native; sourceTree = "<group>"; };
|
||||
0BD57F3380CCDFE06E36335D = { isa = PBXGroup; children = (
|
||||
|
|
|
|||
|
|
@ -1602,6 +1602,7 @@
|
|||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsContext.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_Fonts.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_win32_Direct2DGraphicsContext.cpp">
|
||||
<FileConfiguration Name="Debug|Win32"
|
||||
ExcludedFromBuild="true">
|
||||
|
|
|
|||
|
|
@ -1602,6 +1602,7 @@
|
|||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsContext.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_Fonts.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_win32_Direct2DGraphicsContext.cpp">
|
||||
<FileConfiguration Name="Debug|Win32"
|
||||
ExcludedFromBuild="true">
|
||||
|
|
|
|||
|
|
@ -202,6 +202,7 @@
|
|||
4A5ED88CC2ED6ADD8A5B102A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Result.h"; path = "../../../../modules/juce_core/misc/juce_Result.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
4A8C64BB96FB93919DDF2166 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_ios_MessageManager.mm"; path = "../../../../modules/juce_events/native/juce_ios_MessageManager.mm"; sourceTree = "SOURCE_ROOT"; };
|
||||
4BCEEF3FC9849208FF6B1BD7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RectangleList.cpp"; path = "../../../../modules/juce_graphics/geometry/juce_RectangleList.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
4C34CB4DC542D86A193C055A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RenderingHelpers.h"; path = "../../../../modules/juce_graphics/native/juce_RenderingHelpers.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
4CC331BEE18B3EC4BADF38CE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Colours.h"; path = "../../../../modules/juce_graphics/colour/juce_Colours.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
4D44E9AD19469774ED8245B2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CodeEditorComponent.cpp"; path = "../../../../modules/juce_gui_extra/code_editor/juce_CodeEditorComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
4D6C90354134741F7F295412 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DirectoryContentsDisplayComponent.cpp"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_DirectoryContentsDisplayComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
|
|
@ -985,6 +986,7 @@
|
|||
65A88D5E8C1F0BE74F05C072,
|
||||
06EF239CDE579FFC28F65BE2,
|
||||
C6BCFCD2732C7153C33B6168,
|
||||
4C34CB4DC542D86A193C055A,
|
||||
A3961F3261459774B65EBD3B,
|
||||
A5E748EC8CB636CEBF7BA497 ); name = native; sourceTree = "<group>"; };
|
||||
0BD57F3380CCDFE06E36335D = { isa = PBXGroup; children = (
|
||||
|
|
|
|||
|
|
@ -283,6 +283,7 @@
|
|||
5880762117A1A76DD727CA63 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiDocumentPanel.h"; path = "../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
5902132028ACFC53C962F230 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_RelativePointPath.cpp"; path = "../../../../modules/juce_gui_basics/positioning/juce_RelativePointPath.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
592A4CD8EED76FAA0FBEA184 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FilenameComponent.h"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FilenameComponent.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
593F1523B6A7AB5415E2CD53 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RenderingHelpers.h"; path = "../../../../modules/juce_graphics/native/juce_RenderingHelpers.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
594ABD541467FC1AFBCD55FA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileBrowserListener.h"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FileBrowserListener.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
59832DC05A7ABD631038D969 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FilePreviewComponent.h"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FilePreviewComponent.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
59A49FA3DB4C77011B973631 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ResizableCornerComponent.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_ResizableCornerComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
|
|
@ -1352,6 +1353,7 @@
|
|||
56EBED6737E33DF652255BE9,
|
||||
D380ABD8012C0F956AFAAD10,
|
||||
FA89AC987131D027ACE40582,
|
||||
593F1523B6A7AB5415E2CD53,
|
||||
124BDF35CA497A669F44F8A0,
|
||||
AF1FAE38CC1CE6EA02FFD06E ); name = native; sourceTree = "<group>"; };
|
||||
CEDD2E509C8955328B9E4338 = { isa = PBXGroup; children = (
|
||||
|
|
|
|||
|
|
@ -2422,6 +2422,7 @@
|
|||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsContext.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_Fonts.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_win32_Direct2DGraphicsContext.cpp">
|
||||
<FileConfiguration Name="Debug|Win32"
|
||||
ExcludedFromBuild="true">
|
||||
|
|
|
|||
|
|
@ -1377,6 +1377,7 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_graphics\effects\juce_ImageEffectFilter.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsContext.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>
|
||||
|
|
|
|||
|
|
@ -2169,6 +2169,9 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h">
|
||||
<Filter>Juce Modules\juce_graphics\native</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h">
|
||||
<Filter>Juce Modules\juce_graphics\native</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h">
|
||||
<Filter>Juce Modules\juce_graphics</Filter>
|
||||
</ClInclude>
|
||||
|
|
|
|||
|
|
@ -304,6 +304,7 @@
|
|||
568F49023595072F6E4915D7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentAnimator.h"; path = "../../../../modules/juce_gui_basics/layout/juce_ComponentAnimator.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
56AF594373CD84AB81D63595 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_gui_basics.h"; path = "../../../../modules/juce_gui_basics/juce_gui_basics.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
56B86E116B1A1204837D4F02 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DynamicObject.cpp"; path = "../../../../modules/juce_core/containers/juce_DynamicObject.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
570D06B805FFCB2D29247478 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_RenderingHelpers.h"; path = "../../../../modules/juce_graphics/native/juce_RenderingHelpers.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
571668630341CED2E68ED143 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Files.mm"; path = "../../../../modules/juce_core/native/juce_mac_Files.mm"; sourceTree = "SOURCE_ROOT"; };
|
||||
5727AEA6C0EC63CDBC35623D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PropertySet.h"; path = "../../../../modules/juce_core/containers/juce_PropertySet.h"; sourceTree = "SOURCE_ROOT"; };
|
||||
5730B4F295752F68F543A5F1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Drawable.cpp"; path = "../../../../modules/juce_gui_basics/drawables/juce_Drawable.cpp"; sourceTree = "SOURCE_ROOT"; };
|
||||
|
|
@ -1247,6 +1248,7 @@
|
|||
FCB2AD7C12426703410DA46C,
|
||||
0875B5E550065BE3ACF5833E,
|
||||
4E07995C0E9951843B936AF1,
|
||||
570D06B805FFCB2D29247478,
|
||||
A27536EAA6565A95670917FE,
|
||||
A639ECE96CA7798C1E61F5FA ); name = native; sourceTree = "<group>"; };
|
||||
8E157165495A4C0D5FE429BE = { isa = PBXGroup; children = (
|
||||
|
|
|
|||
|
|
@ -1769,6 +1769,7 @@
|
|||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsContext.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_mac_Fonts.mm"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>
|
||||
<File RelativePath="..\..\..\..\modules\juce_graphics\native\juce_win32_Direct2DGraphicsContext.cpp">
|
||||
<FileConfiguration Name="Debug|Win32"
|
||||
ExcludedFromBuild="true">
|
||||
|
|
|
|||
|
|
@ -1163,6 +1163,7 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_graphics\effects\juce_ImageEffectFilter.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsContext.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>
|
||||
|
|
|
|||
|
|
@ -1908,6 +1908,9 @@
|
|||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h">
|
||||
<Filter>Juce Modules\juce_graphics\native</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h">
|
||||
<Filter>Juce Modules\juce_graphics\native</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h">
|
||||
<Filter>Juce Modules\juce_graphics</Filter>
|
||||
</ClInclude>
|
||||
|
|
|
|||
|
|
@ -424,6 +424,17 @@ bool isPowerOfTwo (IntegerType value)
|
|||
return (value & (value - 1)) == 0;
|
||||
}
|
||||
|
||||
/** Performs a modulo operation, but can cope with the dividend being negative.
|
||||
The divisor must be greater than zero.
|
||||
*/
|
||||
template <typename IntegerType>
|
||||
int negativeAwareModulo (IntegerType dividend, const IntegerType divisor) noexcept
|
||||
{
|
||||
jassert (divisor > 0);
|
||||
dividend %= divisor;
|
||||
return (dividend < 0) ? (dividend + divisor) : dividend;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
#if (JUCE_INTEL && JUCE_32BIT) || defined (DOXYGEN)
|
||||
/** This macro can be applied to a float variable to check whether it contains a denormalised
|
||||
|
|
|
|||
|
|
@ -394,17 +394,6 @@ private:
|
|||
JUCE_DECLARE_NON_COPYABLE (GradientEdgeTableRenderer);
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
namespace RenderingHelpers
|
||||
{
|
||||
forcedinline int safeModulo (int n, const int divisor) noexcept
|
||||
{
|
||||
jassert (divisor > 0);
|
||||
n %= divisor;
|
||||
return (n < 0) ? (n + divisor) : n;
|
||||
}
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
template <class DestPixelType, class SrcPixelType, bool repeatPattern>
|
||||
class ImageFillEdgeTableRenderer
|
||||
|
|
@ -417,8 +406,8 @@ public:
|
|||
: destData (destData_),
|
||||
srcData (srcData_),
|
||||
extraAlpha (extraAlpha_ + 1),
|
||||
xOffset (repeatPattern ? RenderingHelpers::safeModulo (x, srcData_.width) - srcData_.width : x),
|
||||
yOffset (repeatPattern ? RenderingHelpers::safeModulo (y, srcData_.height) - srcData_.height : y)
|
||||
xOffset (repeatPattern ? negativeAwareModulo (x, srcData_.width) - srcData_.width : x),
|
||||
yOffset (repeatPattern ? negativeAwareModulo (y, srcData_.height) - srcData_.height : y)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
@ -660,8 +649,8 @@ private:
|
|||
|
||||
if (repeatPattern)
|
||||
{
|
||||
loResX = RenderingHelpers::safeModulo (loResX, srcData.width);
|
||||
loResY = RenderingHelpers::safeModulo (loResY, srcData.height);
|
||||
loResX = negativeAwareModulo (loResX, srcData.width);
|
||||
loResY = negativeAwareModulo (loResY, srcData.height);
|
||||
}
|
||||
|
||||
if (betterQuality)
|
||||
|
|
@ -1762,69 +1751,36 @@ class LowLevelGraphicsSoftwareRenderer::SavedState
|
|||
public:
|
||||
SavedState (const Image& image_, const Rectangle<int>& clip_, const int xOffset_, const int yOffset_)
|
||||
: image (image_), clip (new SoftwareRendererClasses::ClipRegion_RectangleList (clip_)),
|
||||
xOffset (xOffset_), yOffset (yOffset_), compositionAlpha (1.0f),
|
||||
isOnlyTranslated (true), interpolationQuality (Graphics::mediumResamplingQuality)
|
||||
transform (xOffset_, yOffset_),
|
||||
interpolationQuality (Graphics::mediumResamplingQuality),
|
||||
transparencyLayerAlpha (1.0f)
|
||||
{
|
||||
}
|
||||
|
||||
SavedState (const Image& image_, const RectangleList& clip_, const int xOffset_, const int yOffset_)
|
||||
: image (image_), clip (new SoftwareRendererClasses::ClipRegion_RectangleList (clip_)),
|
||||
xOffset (xOffset_), yOffset (yOffset_), compositionAlpha (1.0f),
|
||||
isOnlyTranslated (true), interpolationQuality (Graphics::mediumResamplingQuality)
|
||||
transform (xOffset_, yOffset_),
|
||||
interpolationQuality (Graphics::mediumResamplingQuality),
|
||||
transparencyLayerAlpha (1.0f)
|
||||
{
|
||||
}
|
||||
|
||||
SavedState (const SavedState& other)
|
||||
: image (other.image), clip (other.clip), complexTransform (other.complexTransform),
|
||||
xOffset (other.xOffset), yOffset (other.yOffset), compositionAlpha (other.compositionAlpha),
|
||||
isOnlyTranslated (other.isOnlyTranslated), font (other.font), fillType (other.fillType),
|
||||
interpolationQuality (other.interpolationQuality)
|
||||
: image (other.image), clip (other.clip), transform (other.transform),
|
||||
font (other.font), fillType (other.fillType),
|
||||
interpolationQuality (other.interpolationQuality),
|
||||
transparencyLayerAlpha (other.transparencyLayerAlpha)
|
||||
{
|
||||
}
|
||||
|
||||
void setOrigin (const int x, const int y) noexcept
|
||||
{
|
||||
if (isOnlyTranslated)
|
||||
{
|
||||
xOffset += x;
|
||||
yOffset += y;
|
||||
}
|
||||
else
|
||||
{
|
||||
complexTransform = getTransformWith (AffineTransform::translation ((float) x, (float) y));
|
||||
}
|
||||
}
|
||||
|
||||
void addTransform (const AffineTransform& t)
|
||||
{
|
||||
if ((! isOnlyTranslated)
|
||||
|| (! t.isOnlyTranslation())
|
||||
|| (int) (t.getTranslationX() * 256.0f) != 0
|
||||
|| (int) (t.getTranslationY() * 256.0f) != 0)
|
||||
{
|
||||
complexTransform = getTransformWith (t);
|
||||
isOnlyTranslated = false;
|
||||
}
|
||||
else
|
||||
{
|
||||
xOffset += (int) t.getTranslationX();
|
||||
yOffset += (int) t.getTranslationY();
|
||||
}
|
||||
}
|
||||
|
||||
float getScaleFactor() const
|
||||
{
|
||||
return isOnlyTranslated ? 1.0f : complexTransform.getScaleFactor();
|
||||
}
|
||||
|
||||
bool clipToRectangle (const Rectangle<int>& r)
|
||||
{
|
||||
if (clip != nullptr)
|
||||
{
|
||||
if (isOnlyTranslated)
|
||||
if (transform.isOnlyTranslated)
|
||||
{
|
||||
cloneClipIfMultiplyReferenced();
|
||||
clip = clip->clipToRectangle (r.translated (xOffset, yOffset));
|
||||
clip = clip->clipToRectangle (transform.translated (r));
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1841,11 +1797,11 @@ public:
|
|||
{
|
||||
if (clip != nullptr)
|
||||
{
|
||||
if (isOnlyTranslated)
|
||||
if (transform.isOnlyTranslated)
|
||||
{
|
||||
cloneClipIfMultiplyReferenced();
|
||||
RectangleList offsetList (r);
|
||||
offsetList.offsetAll (xOffset, yOffset);
|
||||
offsetList.offsetAll (transform.xOffset, transform.yOffset);
|
||||
clip = clip->clipToRectangleList (offsetList);
|
||||
}
|
||||
else
|
||||
|
|
@ -1863,15 +1819,15 @@ public:
|
|||
{
|
||||
cloneClipIfMultiplyReferenced();
|
||||
|
||||
if (isOnlyTranslated)
|
||||
if (transform.isOnlyTranslated)
|
||||
{
|
||||
clip = clip->excludeClipRectangle (r.translated (xOffset, yOffset));
|
||||
clip = clip->excludeClipRectangle (transform.translated (r));
|
||||
}
|
||||
else
|
||||
{
|
||||
Path p;
|
||||
p.addRectangle (r.toFloat());
|
||||
p.applyTransform (complexTransform);
|
||||
p.applyTransform (transform.complexTransform);
|
||||
p.addRectangle (clip->getClipBounds().toFloat());
|
||||
p.setUsingNonZeroWinding (false);
|
||||
clip = clip->clipToPath (p, AffineTransform::identity);
|
||||
|
|
@ -1881,12 +1837,12 @@ public:
|
|||
return clip != nullptr;
|
||||
}
|
||||
|
||||
void clipToPath (const Path& p, const AffineTransform& transform)
|
||||
void clipToPath (const Path& p, const AffineTransform& t)
|
||||
{
|
||||
if (clip != nullptr)
|
||||
{
|
||||
cloneClipIfMultiplyReferenced();
|
||||
clip = clip->clipToPath (p, getTransformWith (transform));
|
||||
clip = clip->clipToPath (p, transform.getTransformWith (t));
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -1897,7 +1853,7 @@ public:
|
|||
if (sourceImage.hasAlphaChannel())
|
||||
{
|
||||
cloneClipIfMultiplyReferenced();
|
||||
clip = clip->clipToImageAlpha (sourceImage, getTransformWith (t),
|
||||
clip = clip->clipToImageAlpha (sourceImage, transform.getTransformWith (t),
|
||||
interpolationQuality != Graphics::lowResamplingQuality);
|
||||
}
|
||||
else
|
||||
|
|
@ -1913,8 +1869,8 @@ public:
|
|||
{
|
||||
if (clip != nullptr)
|
||||
{
|
||||
if (isOnlyTranslated)
|
||||
return clip->clipRegionIntersects (r.translated (xOffset, yOffset));
|
||||
if (transform.isOnlyTranslated)
|
||||
return clip->clipRegionIntersects (transform.translated (r));
|
||||
else
|
||||
return getClipBounds().intersects (r);
|
||||
}
|
||||
|
|
@ -1924,20 +1880,14 @@ public:
|
|||
|
||||
Rectangle<int> getUntransformedClipBounds() const
|
||||
{
|
||||
return clip != nullptr ? clip->getClipBounds() : Rectangle<int>();
|
||||
return clip != nullptr ? clip->getClipBounds()
|
||||
: Rectangle<int>();
|
||||
}
|
||||
|
||||
Rectangle<int> getClipBounds() const
|
||||
{
|
||||
if (clip != nullptr)
|
||||
{
|
||||
if (isOnlyTranslated)
|
||||
return clip->getClipBounds().translated (-xOffset, -yOffset);
|
||||
else
|
||||
return clip->getClipBounds().toFloat().transformed (complexTransform.inverted()).getSmallestIntegerContainer();
|
||||
}
|
||||
|
||||
return Rectangle<int>();
|
||||
return clip != nullptr ? transform.deviceSpaceToUserSpace (clip->getClipBounds())
|
||||
: Rectangle<int>();
|
||||
}
|
||||
|
||||
SavedState* beginTransparencyLayer (float opacity)
|
||||
|
|
@ -1946,18 +1896,8 @@ public:
|
|||
|
||||
SavedState* s = new SavedState (*this);
|
||||
s->image = Image (Image::ARGB, layerBounds.getWidth(), layerBounds.getHeight(), true);
|
||||
s->compositionAlpha = opacity;
|
||||
|
||||
if (s->isOnlyTranslated)
|
||||
{
|
||||
s->xOffset -= layerBounds.getX();
|
||||
s->yOffset -= layerBounds.getY();
|
||||
}
|
||||
else
|
||||
{
|
||||
s->complexTransform = s->complexTransform.followedBy (AffineTransform::translation ((float) -layerBounds.getX(),
|
||||
(float) -layerBounds.getY()));
|
||||
}
|
||||
s->transparencyLayerAlpha = opacity;
|
||||
s->transform.moveOriginInDeviceSpace (-layerBounds.getX(), -layerBounds.getY());
|
||||
|
||||
s->cloneClipIfMultiplyReferenced();
|
||||
s->clip = s->clip->translated (-layerBounds.getPosition());
|
||||
|
|
@ -1969,7 +1909,7 @@ public:
|
|||
const Rectangle<int> layerBounds (getUntransformedClipBounds());
|
||||
|
||||
const ScopedPointer<LowLevelGraphicsContext> g (image.createLowLevelContext());
|
||||
g->setOpacity (layerState.compositionAlpha);
|
||||
g->setOpacity (layerState.transparencyLayerAlpha);
|
||||
g->drawImage (layerState.image, AffineTransform::translation ((float) layerBounds.getX(),
|
||||
(float) layerBounds.getY()), false);
|
||||
}
|
||||
|
|
@ -1979,17 +1919,17 @@ public:
|
|||
{
|
||||
if (clip != nullptr)
|
||||
{
|
||||
if (isOnlyTranslated)
|
||||
if (transform.isOnlyTranslated)
|
||||
{
|
||||
if (fillType.isColour())
|
||||
{
|
||||
Image::BitmapData destData (image, Image::BitmapData::readWrite);
|
||||
clip->fillRectWithColour (destData, r.translated (xOffset, yOffset), fillType.colour.getPixelARGB(), replaceContents);
|
||||
clip->fillRectWithColour (destData, transform.translated (r), fillType.colour.getPixelARGB(), replaceContents);
|
||||
}
|
||||
else
|
||||
{
|
||||
const Rectangle<int> totalClip (clip->getClipBounds());
|
||||
const Rectangle<int> clipped (totalClip.getIntersection (r.translated (xOffset, yOffset)));
|
||||
const Rectangle<int> clipped (totalClip.getIntersection (transform.translated (r)));
|
||||
|
||||
if (! clipped.isEmpty())
|
||||
fillShape (new SoftwareRendererClasses::ClipRegion_RectangleList (clipped), false);
|
||||
|
|
@ -2008,17 +1948,17 @@ public:
|
|||
{
|
||||
if (clip != nullptr)
|
||||
{
|
||||
if (isOnlyTranslated)
|
||||
if (transform.isOnlyTranslated)
|
||||
{
|
||||
if (fillType.isColour())
|
||||
{
|
||||
Image::BitmapData destData (image, Image::BitmapData::readWrite);
|
||||
clip->fillRectWithColour (destData, r.translated ((float) xOffset, (float) yOffset), fillType.colour.getPixelARGB());
|
||||
clip->fillRectWithColour (destData, transform.translated (r), fillType.colour.getPixelARGB());
|
||||
}
|
||||
else
|
||||
{
|
||||
const Rectangle<float> totalClip (clip->getClipBounds().toFloat());
|
||||
const Rectangle<float> clipped (totalClip.getIntersection (r.translated ((float) xOffset, (float) yOffset)));
|
||||
const Rectangle<float> clipped (totalClip.getIntersection (transform.translated (r)));
|
||||
|
||||
if (! clipped.isEmpty())
|
||||
fillShape (new SoftwareRendererClasses::ClipRegion_EdgeTable (clipped), false);
|
||||
|
|
@ -2033,28 +1973,28 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
void fillPath (const Path& path, const AffineTransform& transform)
|
||||
void fillPath (const Path& path, const AffineTransform& t)
|
||||
{
|
||||
if (clip != nullptr)
|
||||
fillShape (new SoftwareRendererClasses::ClipRegion_EdgeTable (clip->getClipBounds(), path, getTransformWith (transform)), false);
|
||||
fillShape (new SoftwareRendererClasses::ClipRegion_EdgeTable (clip->getClipBounds(), path, transform.getTransformWith (t)), false);
|
||||
}
|
||||
|
||||
void fillEdgeTable (const EdgeTable& edgeTable, const float x, const int y)
|
||||
{
|
||||
jassert (isOnlyTranslated);
|
||||
jassert (transform.isOnlyTranslated);
|
||||
|
||||
if (clip != nullptr)
|
||||
{
|
||||
SoftwareRendererClasses::ClipRegion_EdgeTable* edgeTableClip = new SoftwareRendererClasses::ClipRegion_EdgeTable (edgeTable);
|
||||
SoftwareRendererClasses::ClipRegionBase::Ptr shapeToFill (edgeTableClip);
|
||||
edgeTableClip->edgeTable.translate (x + xOffset, y + yOffset);
|
||||
edgeTableClip->edgeTable.translate (x + transform.xOffset, y + transform.yOffset);
|
||||
fillShape (shapeToFill, false);
|
||||
}
|
||||
}
|
||||
|
||||
void drawGlyph (const Font& f, int glyphNumber, const AffineTransform& transform)
|
||||
void drawGlyph (const Font& f, int glyphNumber, const AffineTransform& t)
|
||||
{
|
||||
const ScopedPointer<EdgeTable> et (f.getTypeface()->getEdgeTableForGlyph (glyphNumber, getTransformWith (transform)));
|
||||
const ScopedPointer<EdgeTable> et (f.getTypeface()->getEdgeTableForGlyph (glyphNumber, transform.getTransformWith (t)));
|
||||
|
||||
if (et != nullptr && clip != nullptr)
|
||||
{
|
||||
|
|
@ -2080,19 +2020,19 @@ public:
|
|||
|
||||
ColourGradient g2 (*(fillType.gradient));
|
||||
g2.multiplyOpacity (fillType.getOpacity());
|
||||
AffineTransform transform (getTransformWith (fillType.transform).translated (-0.5f, -0.5f));
|
||||
AffineTransform t (transform.getTransformWith (fillType.transform).translated (-0.5f, -0.5f));
|
||||
|
||||
const bool isIdentity = transform.isOnlyTranslation();
|
||||
const bool isIdentity = t.isOnlyTranslation();
|
||||
|
||||
if (isIdentity)
|
||||
{
|
||||
// If our translation doesn't involve any distortion, we can speed it up..
|
||||
g2.point1.applyTransform (transform);
|
||||
g2.point2.applyTransform (transform);
|
||||
transform = AffineTransform::identity;
|
||||
g2.point1.applyTransform (t);
|
||||
g2.point2.applyTransform (t);
|
||||
t = AffineTransform::identity;
|
||||
}
|
||||
|
||||
shapeToFill->fillAllWithGradient (destData, g2, transform, isIdentity);
|
||||
shapeToFill->fillAllWithGradient (destData, g2, t, isIdentity);
|
||||
}
|
||||
else if (fillType.isTiledImage())
|
||||
{
|
||||
|
|
@ -2106,20 +2046,21 @@ public:
|
|||
}
|
||||
|
||||
//==============================================================================
|
||||
void renderImage (const Image& sourceImage, const AffineTransform& t, const SoftwareRendererClasses::ClipRegionBase* const tiledFillClipRegion)
|
||||
void renderImage (const Image& sourceImage, const AffineTransform& trans,
|
||||
const SoftwareRendererClasses::ClipRegionBase* const tiledFillClipRegion)
|
||||
{
|
||||
const AffineTransform transform (getTransformWith (t));
|
||||
const AffineTransform t (transform.getTransformWith (trans));
|
||||
|
||||
const Image::BitmapData destData (image, Image::BitmapData::readWrite);
|
||||
const Image::BitmapData srcData (sourceImage, Image::BitmapData::readOnly);
|
||||
const int alpha = fillType.colour.getAlpha();
|
||||
const bool betterQuality = (interpolationQuality != Graphics::lowResamplingQuality);
|
||||
|
||||
if (transform.isOnlyTranslation())
|
||||
if (t.isOnlyTranslation())
|
||||
{
|
||||
// If our translation doesn't involve any distortion, just use a simple blit..
|
||||
int tx = (int) (transform.getTranslationX() * 256.0f);
|
||||
int ty = (int) (transform.getTranslationY() * 256.0f);
|
||||
int tx = (int) (t.getTranslationX() * 256.0f);
|
||||
int ty = (int) (t.getTranslationY() * 256.0f);
|
||||
|
||||
if ((! betterQuality) || ((tx | ty) & 224) == 0)
|
||||
{
|
||||
|
|
@ -2149,12 +2090,12 @@ public:
|
|||
}
|
||||
}
|
||||
|
||||
if (transform.isSingularity())
|
||||
if (t.isSingularity())
|
||||
return;
|
||||
|
||||
if (tiledFillClipRegion != nullptr)
|
||||
{
|
||||
tiledFillClipRegion->renderImageTransformed (destData, srcData, alpha, transform, betterQuality, true);
|
||||
tiledFillClipRegion->renderImageTransformed (destData, srcData, alpha, t, betterQuality, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -2162,52 +2103,30 @@ public:
|
|||
p.addRectangle (sourceImage.getBounds());
|
||||
|
||||
SoftwareRendererClasses::ClipRegionBase::Ptr c (clip->clone());
|
||||
c = c->clipToPath (p, transform);
|
||||
c = c->clipToPath (p, t);
|
||||
|
||||
if (c != nullptr)
|
||||
c->renderImageTransformed (destData, srcData, alpha, transform, betterQuality, false);
|
||||
c->renderImageTransformed (destData, srcData, alpha, t, betterQuality, false);
|
||||
}
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
Image image;
|
||||
SoftwareRendererClasses::ClipRegionBase::Ptr clip;
|
||||
|
||||
private:
|
||||
AffineTransform complexTransform;
|
||||
int xOffset, yOffset;
|
||||
float compositionAlpha;
|
||||
|
||||
public:
|
||||
bool isOnlyTranslated;
|
||||
|
||||
RenderingHelpers::TranslationOrTransform transform;
|
||||
Font font;
|
||||
FillType fillType;
|
||||
Graphics::ResamplingQuality interpolationQuality;
|
||||
|
||||
private:
|
||||
float transparencyLayerAlpha;
|
||||
|
||||
void cloneClipIfMultiplyReferenced()
|
||||
{
|
||||
if (clip->getReferenceCount() > 1)
|
||||
clip = clip->clone();
|
||||
}
|
||||
|
||||
const AffineTransform getTransform() const
|
||||
{
|
||||
if (isOnlyTranslated)
|
||||
return AffineTransform::translation ((float) xOffset, (float) yOffset);
|
||||
|
||||
return complexTransform;
|
||||
}
|
||||
|
||||
const AffineTransform getTransformWith (const AffineTransform& userTransform) const
|
||||
{
|
||||
if (isOnlyTranslated)
|
||||
return userTransform.translated ((float) xOffset, (float) yOffset);
|
||||
|
||||
return userTransform.followedBy (complexTransform);
|
||||
}
|
||||
|
||||
SavedState& operator= (const SavedState&);
|
||||
};
|
||||
|
||||
|
|
@ -2238,17 +2157,17 @@ bool LowLevelGraphicsSoftwareRenderer::isVectorDevice() const
|
|||
//==============================================================================
|
||||
void LowLevelGraphicsSoftwareRenderer::setOrigin (int x, int y)
|
||||
{
|
||||
currentState->setOrigin (x, y);
|
||||
currentState->transform.setOrigin (x, y);
|
||||
}
|
||||
|
||||
void LowLevelGraphicsSoftwareRenderer::addTransform (const AffineTransform& transform)
|
||||
{
|
||||
currentState->addTransform (transform);
|
||||
currentState->transform.addTransform (transform);
|
||||
}
|
||||
|
||||
float LowLevelGraphicsSoftwareRenderer::getScaleFactor()
|
||||
{
|
||||
return currentState->getScaleFactor();
|
||||
return currentState->transform.getScaleFactor();
|
||||
}
|
||||
|
||||
bool LowLevelGraphicsSoftwareRenderer::clipToRectangle (const Rectangle<int>& r)
|
||||
|
|
@ -2288,7 +2207,7 @@ Rectangle<int> LowLevelGraphicsSoftwareRenderer::getClipBounds() const
|
|||
|
||||
bool LowLevelGraphicsSoftwareRenderer::isClipEmpty() const
|
||||
{
|
||||
return currentState->clip == 0;
|
||||
return currentState->clip == nullptr;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
|
|
@ -2376,93 +2295,6 @@ void LowLevelGraphicsSoftwareRenderer::drawHorizontalLine (const int y, float le
|
|||
currentState->fillRect (Rectangle<float> (left, (float) y, right - left, 1.0f));
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
template <class CachedGlyphType, class RenderTargetType>
|
||||
class GlyphCache : private DeletedAtShutdown
|
||||
{
|
||||
public:
|
||||
GlyphCache()
|
||||
: accessCounter (0), hits (0), misses (0)
|
||||
{
|
||||
addNewGlyphSlots (120);
|
||||
}
|
||||
|
||||
~GlyphCache()
|
||||
{
|
||||
getSingletonPointer() = nullptr;
|
||||
}
|
||||
|
||||
static GlyphCache& getInstance()
|
||||
{
|
||||
GlyphCache*& g = getSingletonPointer();
|
||||
|
||||
if (g == nullptr)
|
||||
g = new GlyphCache();
|
||||
|
||||
return *g;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
void drawGlyph (RenderTargetType& target, const Font& font, const int glyphNumber, float x, float y)
|
||||
{
|
||||
++accessCounter;
|
||||
int oldestCounter = std::numeric_limits<int>::max();
|
||||
CachedGlyphType* oldest = nullptr;
|
||||
|
||||
for (int i = glyphs.size(); --i >= 0;)
|
||||
{
|
||||
CachedGlyphType* const glyph = glyphs.getUnchecked (i);
|
||||
|
||||
if (glyph->glyph == glyphNumber && glyph->font == font)
|
||||
{
|
||||
++hits;
|
||||
glyph->lastAccessCount = accessCounter;
|
||||
glyph->draw (target, x, y);
|
||||
return;
|
||||
}
|
||||
|
||||
if (glyph->lastAccessCount <= oldestCounter)
|
||||
{
|
||||
oldestCounter = glyph->lastAccessCount;
|
||||
oldest = glyph;
|
||||
}
|
||||
}
|
||||
|
||||
if (hits + ++misses > (glyphs.size() << 4))
|
||||
{
|
||||
if (misses * 2 > hits)
|
||||
addNewGlyphSlots (32);
|
||||
|
||||
hits = misses = 0;
|
||||
oldest = glyphs.getLast();
|
||||
}
|
||||
|
||||
jassert (oldest != nullptr);
|
||||
oldest->lastAccessCount = accessCounter;
|
||||
oldest->generate (font, glyphNumber);
|
||||
oldest->draw (target, x, y);
|
||||
}
|
||||
|
||||
private:
|
||||
friend class OwnedArray <CachedGlyphType>;
|
||||
OwnedArray <CachedGlyphType> glyphs;
|
||||
int accessCounter, hits, misses;
|
||||
|
||||
void addNewGlyphSlots (int num)
|
||||
{
|
||||
while (--num >= 0)
|
||||
glyphs.add (new CachedGlyphType());
|
||||
}
|
||||
|
||||
static GlyphCache*& getSingletonPointer() noexcept
|
||||
{
|
||||
static GlyphCache* g = nullptr;
|
||||
return g;
|
||||
}
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GlyphCache);
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
class CachedGlyphEdgeTable
|
||||
{
|
||||
|
|
@ -2507,9 +2339,9 @@ void LowLevelGraphicsSoftwareRenderer::drawGlyph (int glyphNumber, const AffineT
|
|||
{
|
||||
Font& f = currentState->font;
|
||||
|
||||
if (transform.isOnlyTranslation() && currentState->isOnlyTranslated)
|
||||
if (transform.isOnlyTranslation() && currentState->transform.isOnlyTranslated)
|
||||
{
|
||||
GlyphCache <CachedGlyphEdgeTable, SavedState>::getInstance()
|
||||
RenderingHelpers::GlyphCache <CachedGlyphEdgeTable, SavedState>::getInstance()
|
||||
.drawGlyph (*currentState, f, glyphNumber,
|
||||
transform.getTranslationX(),
|
||||
transform.getTranslationY());
|
||||
|
|
|
|||
|
|
@ -54,6 +54,8 @@
|
|||
#endif
|
||||
|
||||
//==============================================================================
|
||||
#include "native/juce_RenderingHelpers.h"
|
||||
|
||||
// START_AUTOINCLUDE colour/*.cpp, geometry/*.cpp, placement/*.cpp, contexts/*.cpp, images/*.cpp,
|
||||
// image_formats/*.cpp, fonts/*.cpp, effects/*.cpp
|
||||
#include "colour/juce_Colour.cpp"
|
||||
|
|
|
|||
230
modules/juce_graphics/native/juce_RenderingHelpers.h
Normal file
230
modules/juce_graphics/native/juce_RenderingHelpers.h
Normal file
|
|
@ -0,0 +1,230 @@
|
|||
/*
|
||||
==============================================================================
|
||||
|
||||
This file is part of the JUCE library - "Jules' Utility Class Extensions"
|
||||
Copyright 2004-11 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.
|
||||
|
||||
==============================================================================
|
||||
*/
|
||||
|
||||
#ifndef __JUCE_RENDERINGHELPERS_JUCEHEADER__
|
||||
#define __JUCE_RENDERINGHELPERS_JUCEHEADER__
|
||||
|
||||
BEGIN_JUCE_NAMESPACE
|
||||
|
||||
namespace RenderingHelpers
|
||||
{
|
||||
|
||||
//==============================================================================
|
||||
/** Holds either a simple integer translation, or an affine transform.
|
||||
*/
|
||||
class TranslationOrTransform
|
||||
{
|
||||
public:
|
||||
TranslationOrTransform (int xOffset_, int yOffset_) noexcept
|
||||
: xOffset (xOffset_), yOffset (yOffset_), isOnlyTranslated (true)
|
||||
{
|
||||
}
|
||||
|
||||
TranslationOrTransform (const TranslationOrTransform& other) noexcept
|
||||
: complexTransform (other.complexTransform),
|
||||
xOffset (other.xOffset), yOffset (other.yOffset),
|
||||
isOnlyTranslated (other.isOnlyTranslated)
|
||||
{
|
||||
}
|
||||
|
||||
AffineTransform getTransform() const noexcept
|
||||
{
|
||||
return isOnlyTranslated ? AffineTransform::translation ((float) xOffset, (float) yOffset)
|
||||
: complexTransform;
|
||||
}
|
||||
|
||||
AffineTransform getTransformWith (const AffineTransform& userTransform) const noexcept
|
||||
{
|
||||
return isOnlyTranslated ? userTransform.translated ((float) xOffset, (float) yOffset)
|
||||
: userTransform.followedBy (complexTransform);
|
||||
}
|
||||
|
||||
void setOrigin (const int x, const int y) noexcept
|
||||
{
|
||||
if (isOnlyTranslated)
|
||||
{
|
||||
xOffset += x;
|
||||
yOffset += y;
|
||||
}
|
||||
else
|
||||
{
|
||||
complexTransform = AffineTransform::translation ((float) x, (float) y)
|
||||
.followedBy (complexTransform);
|
||||
}
|
||||
}
|
||||
|
||||
void addTransform (const AffineTransform& t) noexcept
|
||||
{
|
||||
if (isOnlyTranslated
|
||||
&& t.isOnlyTranslation()
|
||||
&& isIntegerTranlation (t))
|
||||
{
|
||||
xOffset += (int) t.getTranslationX();
|
||||
yOffset += (int) t.getTranslationY();
|
||||
}
|
||||
else
|
||||
{
|
||||
complexTransform = getTransformWith (t);
|
||||
isOnlyTranslated = false;
|
||||
}
|
||||
}
|
||||
|
||||
float getScaleFactor() const noexcept
|
||||
{
|
||||
return isOnlyTranslated ? 1.0f : complexTransform.getScaleFactor();
|
||||
}
|
||||
|
||||
void moveOriginInDeviceSpace (const int dx, const int dy) noexcept
|
||||
{
|
||||
if (isOnlyTranslated)
|
||||
{
|
||||
xOffset += dx;
|
||||
yOffset += dy;
|
||||
}
|
||||
else
|
||||
{
|
||||
complexTransform = complexTransform.translated ((float) dx, (float) dx);
|
||||
}
|
||||
}
|
||||
|
||||
template <typename Type>
|
||||
Rectangle<Type> translated (const Rectangle<Type>& r) const noexcept
|
||||
{
|
||||
jassert (isOnlyTranslated);
|
||||
return r.translated (static_cast <Type> (xOffset),
|
||||
static_cast <Type> (yOffset));
|
||||
}
|
||||
|
||||
Rectangle<int> deviceSpaceToUserSpace (const Rectangle<int>& r) const noexcept
|
||||
{
|
||||
return isOnlyTranslated ? r.translated (-xOffset, -yOffset)
|
||||
: r.toFloat().transformed (complexTransform.inverted()).getSmallestIntegerContainer();
|
||||
}
|
||||
|
||||
AffineTransform complexTransform;
|
||||
int xOffset, yOffset;
|
||||
bool isOnlyTranslated;
|
||||
|
||||
private:
|
||||
static inline bool isIntegerTranlation (const AffineTransform& t) noexcept
|
||||
{
|
||||
const int tx = (int) (t.getTranslationX() * 256.0f);
|
||||
const int ty = (int) (t.getTranslationY() * 256.0f);
|
||||
return ((tx | ty) & 0xf8) == 0;
|
||||
}
|
||||
};
|
||||
|
||||
//==============================================================================
|
||||
template <class CachedGlyphType, class RenderTargetType>
|
||||
class GlyphCache : private DeletedAtShutdown
|
||||
{
|
||||
public:
|
||||
GlyphCache()
|
||||
: accessCounter (0), hits (0), misses (0)
|
||||
{
|
||||
addNewGlyphSlots (120);
|
||||
}
|
||||
|
||||
~GlyphCache()
|
||||
{
|
||||
getSingletonPointer() = nullptr;
|
||||
}
|
||||
|
||||
static GlyphCache& getInstance()
|
||||
{
|
||||
GlyphCache*& g = getSingletonPointer();
|
||||
|
||||
if (g == nullptr)
|
||||
g = new GlyphCache();
|
||||
|
||||
return *g;
|
||||
}
|
||||
|
||||
//==============================================================================
|
||||
void drawGlyph (RenderTargetType& target, const Font& font, const int glyphNumber, float x, float y)
|
||||
{
|
||||
++accessCounter;
|
||||
int oldestCounter = std::numeric_limits<int>::max();
|
||||
CachedGlyphType* oldest = nullptr;
|
||||
|
||||
for (int i = glyphs.size(); --i >= 0;)
|
||||
{
|
||||
CachedGlyphType* const glyph = glyphs.getUnchecked (i);
|
||||
|
||||
if (glyph->glyph == glyphNumber && glyph->font == font)
|
||||
{
|
||||
++hits;
|
||||
glyph->lastAccessCount = accessCounter;
|
||||
glyph->draw (target, x, y);
|
||||
return;
|
||||
}
|
||||
|
||||
if (glyph->lastAccessCount <= oldestCounter)
|
||||
{
|
||||
oldestCounter = glyph->lastAccessCount;
|
||||
oldest = glyph;
|
||||
}
|
||||
}
|
||||
|
||||
if (hits + ++misses > (glyphs.size() << 4))
|
||||
{
|
||||
if (misses * 2 > hits)
|
||||
addNewGlyphSlots (32);
|
||||
|
||||
hits = misses = 0;
|
||||
oldest = glyphs.getLast();
|
||||
}
|
||||
|
||||
jassert (oldest != nullptr);
|
||||
oldest->lastAccessCount = accessCounter;
|
||||
oldest->generate (font, glyphNumber);
|
||||
oldest->draw (target, x, y);
|
||||
}
|
||||
|
||||
private:
|
||||
friend class OwnedArray <CachedGlyphType>;
|
||||
OwnedArray <CachedGlyphType> glyphs;
|
||||
int accessCounter, hits, misses;
|
||||
|
||||
void addNewGlyphSlots (int num)
|
||||
{
|
||||
while (--num >= 0)
|
||||
glyphs.add (new CachedGlyphType());
|
||||
}
|
||||
|
||||
static GlyphCache*& getSingletonPointer() noexcept
|
||||
{
|
||||
static GlyphCache* g = nullptr;
|
||||
return g;
|
||||
}
|
||||
|
||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GlyphCache);
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
END_JUCE_NAMESPACE
|
||||
|
||||
#endif // __JUCE_RENDERINGHELPERS_JUCEHEADER__
|
||||
|
|
@ -311,6 +311,28 @@ bool OpenGLFrameBuffer::initialise (const Image& image)
|
|||
return false;
|
||||
}
|
||||
|
||||
bool OpenGLFrameBuffer::initialise (const OpenGLFrameBuffer& other)
|
||||
{
|
||||
const Pimpl* const p = other.pimpl;
|
||||
|
||||
if (p == nullptr)
|
||||
{
|
||||
pimpl = nullptr;
|
||||
return true;
|
||||
}
|
||||
|
||||
if (initialise (p->width, p->height))
|
||||
{
|
||||
pimpl->bind();
|
||||
glDisable (GL_BLEND);
|
||||
glColor4f (1.0f, 1.0f, 1.0f, 1.0f);
|
||||
other.drawAt (0, 0);
|
||||
pimpl->unbind();
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
void OpenGLFrameBuffer::release()
|
||||
{
|
||||
pimpl = nullptr;
|
||||
|
|
|
|||
|
|
@ -55,6 +55,10 @@ public:
|
|||
*/
|
||||
bool initialise (const Image& content);
|
||||
|
||||
/** Tries to allocate a copy of another framebuffer.
|
||||
*/
|
||||
bool initialise (const OpenGLFrameBuffer& other);
|
||||
|
||||
/** Releases the buffer, if one has been allocated.
|
||||
Any saved state that was created with saveAndRelease() will also be freed by this call.
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue