| @@ -70,7 +70,6 @@ | |||
| 84816E8D10809DCB008FEC33 /* juce_BlowFish.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1E942104036B3006A1807 /* juce_BlowFish.h */; }; | |||
| 84816E8E10809DCB008FEC33 /* juce_BooleanPropertyComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EAE010403709006A1807 /* juce_BooleanPropertyComponent.h */; }; | |||
| 84816E8F10809DCB008FEC33 /* juce_BorderSize.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EB5A10403709006A1807 /* juce_BorderSize.h */; }; | |||
| 84816E9010809DCB008FEC33 /* juce_Brush.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EB1C10403709006A1807 /* juce_Brush.h */; }; | |||
| 84816E9110809DCB008FEC33 /* juce_BubbleComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EAF210403709006A1807 /* juce_BubbleComponent.h */; }; | |||
| 84816E9210809DCB008FEC33 /* juce_BubbleMessageComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EAF410403709006A1807 /* juce_BubbleMessageComponent.h */; }; | |||
| 84816E9310809DCB008FEC33 /* juce_BufferedInputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1E99F104036D6006A1807 /* juce_BufferedInputStream.h */; }; | |||
| @@ -143,7 +142,6 @@ | |||
| 84816ED610809DCB008FEC33 /* juce_GIFLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EB7710403709006A1807 /* juce_GIFLoader.h */; }; | |||
| 84816ED710809DCB008FEC33 /* juce_GlowEffect.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EB4910403709006A1807 /* juce_GlowEffect.h */; }; | |||
| 84816ED810809DCB008FEC33 /* juce_GlyphArrangement.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EB5110403709006A1807 /* juce_GlyphArrangement.h */; }; | |||
| 84816ED910809DCB008FEC33 /* juce_GradientBrush.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EB1E10403709006A1807 /* juce_GradientBrush.h */; }; | |||
| 84816EDA10809DCB008FEC33 /* juce_Graphics.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EB2F10403709006A1807 /* juce_Graphics.h */; }; | |||
| 84816EDB10809DCB008FEC33 /* juce_GroupComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EAAB10403709006A1807 /* juce_GroupComponent.h */; }; | |||
| 84816EDC10809DCB008FEC33 /* juce_GZIPCompressorOutputStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1E9A3104036D6006A1807 /* juce_GZIPCompressorOutputStream.h */; }; | |||
| @@ -152,7 +150,6 @@ | |||
| 84816EDF10809DCB008FEC33 /* juce_IIRFilter.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1E7B710403614006A1807 /* juce_IIRFilter.h */; }; | |||
| 84816EE010809DCB008FEC33 /* juce_IIRFilterAudioSource.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1E79F10403614006A1807 /* juce_IIRFilterAudioSource.h */; }; | |||
| 84816EE110809DCB008FEC33 /* juce_Image.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EB6E10403709006A1807 /* juce_Image.h */; }; | |||
| 84816EE210809DCB008FEC33 /* juce_ImageBrush.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EB2010403709006A1807 /* juce_ImageBrush.h */; }; | |||
| 84816EE310809DCB008FEC33 /* juce_ImageButton.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EA5710403709006A1807 /* juce_ImageButton.h */; }; | |||
| 84816EE410809DCB008FEC33 /* juce_ImageCache.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EB7010403709006A1807 /* juce_ImageCache.h */; }; | |||
| 84816EE510809DCB008FEC33 /* juce_ImageConvolutionKernel.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EB7210403709006A1807 /* juce_ImageConvolutionKernel.h */; }; | |||
| @@ -275,7 +272,6 @@ | |||
| 84816F5B10809DCB008FEC33 /* juce_SliderListener.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EA6B10403709006A1807 /* juce_SliderListener.h */; }; | |||
| 84816F5C10809DCB008FEC33 /* juce_SliderPropertyComponent.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EAEA10403709006A1807 /* juce_SliderPropertyComponent.h */; }; | |||
| 84816F5D10809DCB008FEC33 /* juce_Socket.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1E99A104036D6006A1807 /* juce_Socket.h */; }; | |||
| 84816F5E10809DCB008FEC33 /* juce_SolidColourBrush.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EB2210403709006A1807 /* juce_SolidColourBrush.h */; }; | |||
| 84816F5F10809DCB008FEC33 /* juce_SortedSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1E8DC10403671006A1807 /* juce_SortedSet.h */; }; | |||
| 84816F6010809DCB008FEC33 /* juce_SparseSet.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1E8DD10403671006A1807 /* juce_SparseSet.h */; }; | |||
| 84816F6110809DCB008FEC33 /* juce_SplashScreen.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EB1210403709006A1807 /* juce_SplashScreen.h */; }; | |||
| @@ -372,7 +368,6 @@ | |||
| 84816FBC10809E00008FEC33 /* juce_BlowFish.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1E941104036B3006A1807 /* juce_BlowFish.cpp */; }; | |||
| 84816FBD10809E00008FEC33 /* juce_BooleanPropertyComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EADF10403709006A1807 /* juce_BooleanPropertyComponent.cpp */; }; | |||
| 84816FBE10809E00008FEC33 /* juce_BorderSize.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EB5910403709006A1807 /* juce_BorderSize.cpp */; }; | |||
| 84816FBF10809E00008FEC33 /* juce_Brush.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EB1B10403709006A1807 /* juce_Brush.cpp */; }; | |||
| 84816FC010809E00008FEC33 /* juce_BubbleComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EAF110403709006A1807 /* juce_BubbleComponent.cpp */; }; | |||
| 84816FC110809E00008FEC33 /* juce_BubbleMessageComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EAF310403709006A1807 /* juce_BubbleMessageComponent.cpp */; }; | |||
| 84816FC210809E00008FEC33 /* juce_BufferedInputStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1E99E104036D6006A1807 /* juce_BufferedInputStream.cpp */; }; | |||
| @@ -434,7 +429,6 @@ | |||
| 84816FFA10809E00008FEC33 /* juce_GIFLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EB7610403709006A1807 /* juce_GIFLoader.cpp */; }; | |||
| 84816FFB10809E00008FEC33 /* juce_GlowEffect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EB4810403709006A1807 /* juce_GlowEffect.cpp */; }; | |||
| 84816FFC10809E00008FEC33 /* juce_GlyphArrangement.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EB5010403709006A1807 /* juce_GlyphArrangement.cpp */; }; | |||
| 84816FFD10809E00008FEC33 /* juce_GradientBrush.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EB1D10403709006A1807 /* juce_GradientBrush.cpp */; }; | |||
| 84816FFE10809E00008FEC33 /* juce_Graphics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EB2E10403709006A1807 /* juce_Graphics.cpp */; }; | |||
| 84816FFF10809E00008FEC33 /* juce_GroupComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EAAA10403709006A1807 /* juce_GroupComponent.cpp */; }; | |||
| 8481700010809E00008FEC33 /* juce_GZIPCompressorOutputStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1E9A2104036D6006A1807 /* juce_GZIPCompressorOutputStream.cpp */; }; | |||
| @@ -443,7 +437,6 @@ | |||
| 8481700310809E00008FEC33 /* juce_IIRFilter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1E7B610403614006A1807 /* juce_IIRFilter.cpp */; }; | |||
| 8481700410809E00008FEC33 /* juce_IIRFilterAudioSource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1E79E10403614006A1807 /* juce_IIRFilterAudioSource.cpp */; }; | |||
| 8481700510809E00008FEC33 /* juce_Image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EB6D10403709006A1807 /* juce_Image.cpp */; }; | |||
| 8481700610809E00008FEC33 /* juce_ImageBrush.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EB1F10403709006A1807 /* juce_ImageBrush.cpp */; }; | |||
| 8481700710809E00008FEC33 /* juce_ImageButton.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EA5610403709006A1807 /* juce_ImageButton.cpp */; }; | |||
| 8481700810809E00008FEC33 /* juce_ImageCache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EB6F10403709006A1807 /* juce_ImageCache.cpp */; }; | |||
| 8481700910809E00008FEC33 /* juce_ImageConvolutionKernel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EB7110403709006A1807 /* juce_ImageConvolutionKernel.cpp */; }; | |||
| @@ -566,7 +559,6 @@ | |||
| 8481707F10809E00008FEC33 /* juce_Slider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EA6910403709006A1807 /* juce_Slider.cpp */; }; | |||
| 8481708010809E00008FEC33 /* juce_SliderPropertyComponent.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EAE910403709006A1807 /* juce_SliderPropertyComponent.cpp */; }; | |||
| 8481708110809E00008FEC33 /* juce_Socket.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1E999104036D6006A1807 /* juce_Socket.cpp */; }; | |||
| 8481708210809E00008FEC33 /* juce_SolidColourBrush.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EB2110403709006A1807 /* juce_SolidColourBrush.cpp */; }; | |||
| 8481708310809E00008FEC33 /* juce_SplashScreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EB1110403709006A1807 /* juce_SplashScreen.cpp */; }; | |||
| 8481708410809E00008FEC33 /* juce_StretchableLayoutManager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EAB410403709006A1807 /* juce_StretchableLayoutManager.cpp */; }; | |||
| 8481708510809E00008FEC33 /* juce_StretchableLayoutResizerBar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EAB610403709006A1807 /* juce_StretchableLayoutResizerBar.cpp */; }; | |||
| @@ -1128,14 +1120,6 @@ | |||
| 84F1EC911040370A006A1807 /* juce_TooltipWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EB1610403709006A1807 /* juce_TooltipWindow.h */; }; | |||
| 84F1EC921040370A006A1807 /* juce_TopLevelWindow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EB1710403709006A1807 /* juce_TopLevelWindow.cpp */; }; | |||
| 84F1EC931040370A006A1807 /* juce_TopLevelWindow.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EB1810403709006A1807 /* juce_TopLevelWindow.h */; }; | |||
| 84F1EC941040370A006A1807 /* juce_Brush.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EB1B10403709006A1807 /* juce_Brush.cpp */; }; | |||
| 84F1EC951040370A006A1807 /* juce_Brush.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EB1C10403709006A1807 /* juce_Brush.h */; }; | |||
| 84F1EC961040370A006A1807 /* juce_GradientBrush.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EB1D10403709006A1807 /* juce_GradientBrush.cpp */; }; | |||
| 84F1EC971040370A006A1807 /* juce_GradientBrush.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EB1E10403709006A1807 /* juce_GradientBrush.h */; }; | |||
| 84F1EC981040370A006A1807 /* juce_ImageBrush.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EB1F10403709006A1807 /* juce_ImageBrush.cpp */; }; | |||
| 84F1EC991040370A006A1807 /* juce_ImageBrush.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EB2010403709006A1807 /* juce_ImageBrush.h */; }; | |||
| 84F1EC9A1040370A006A1807 /* juce_SolidColourBrush.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EB2110403709006A1807 /* juce_SolidColourBrush.cpp */; }; | |||
| 84F1EC9B1040370A006A1807 /* juce_SolidColourBrush.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EB2210403709006A1807 /* juce_SolidColourBrush.h */; }; | |||
| 84F1EC9C1040370A006A1807 /* juce_Colour.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EB2410403709006A1807 /* juce_Colour.cpp */; }; | |||
| 84F1EC9D1040370A006A1807 /* juce_ColourGradient.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EB2510403709006A1807 /* juce_ColourGradient.cpp */; }; | |||
| 84F1EC9E1040370A006A1807 /* juce_ColourGradient.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EB2610403709006A1807 /* juce_ColourGradient.h */; }; | |||
| @@ -1215,6 +1199,8 @@ | |||
| 84F1ECE81040370A006A1807 /* juce_GIFLoader.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F1EB7710403709006A1807 /* juce_GIFLoader.h */; }; | |||
| 84F1ECE91040370A006A1807 /* juce_JPEGLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EB7810403709006A1807 /* juce_JPEGLoader.cpp */; }; | |||
| 84F1ECEA1040370A006A1807 /* juce_PNGLoader.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F1EB7910403709006A1807 /* juce_PNGLoader.cpp */; }; | |||
| 84F29A9F10C2EFA5005014DF /* juce_FillType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 84F29A9D10C2EFA5005014DF /* juce_FillType.cpp */; }; | |||
| 84F29AA010C2EFA5005014DF /* juce_FillType.h in Headers */ = {isa = PBXBuildFile; fileRef = 84F29A9E10C2EFA5005014DF /* juce_FillType.h */; }; | |||
| /* End PBXBuildFile section */ | |||
| /* Begin PBXFileReference section */ | |||
| @@ -1739,14 +1725,6 @@ | |||
| 84F1EB1610403709006A1807 /* juce_TooltipWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = juce_TooltipWindow.h; path = ../../src/gui/components/windows/juce_TooltipWindow.h; sourceTree = SOURCE_ROOT; }; | |||
| 84F1EB1710403709006A1807 /* juce_TopLevelWindow.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = juce_TopLevelWindow.cpp; path = ../../src/gui/components/windows/juce_TopLevelWindow.cpp; sourceTree = SOURCE_ROOT; }; | |||
| 84F1EB1810403709006A1807 /* juce_TopLevelWindow.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = juce_TopLevelWindow.h; path = ../../src/gui/components/windows/juce_TopLevelWindow.h; sourceTree = SOURCE_ROOT; }; | |||
| 84F1EB1B10403709006A1807 /* juce_Brush.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Brush.cpp; path = ../../src/gui/graphics/brushes/juce_Brush.cpp; sourceTree = SOURCE_ROOT; }; | |||
| 84F1EB1C10403709006A1807 /* juce_Brush.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = juce_Brush.h; path = ../../src/gui/graphics/brushes/juce_Brush.h; sourceTree = SOURCE_ROOT; }; | |||
| 84F1EB1D10403709006A1807 /* juce_GradientBrush.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = juce_GradientBrush.cpp; path = ../../src/gui/graphics/brushes/juce_GradientBrush.cpp; sourceTree = SOURCE_ROOT; }; | |||
| 84F1EB1E10403709006A1807 /* juce_GradientBrush.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = juce_GradientBrush.h; path = ../../src/gui/graphics/brushes/juce_GradientBrush.h; sourceTree = SOURCE_ROOT; }; | |||
| 84F1EB1F10403709006A1807 /* juce_ImageBrush.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ImageBrush.cpp; path = ../../src/gui/graphics/brushes/juce_ImageBrush.cpp; sourceTree = SOURCE_ROOT; }; | |||
| 84F1EB2010403709006A1807 /* juce_ImageBrush.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = juce_ImageBrush.h; path = ../../src/gui/graphics/brushes/juce_ImageBrush.h; sourceTree = SOURCE_ROOT; }; | |||
| 84F1EB2110403709006A1807 /* juce_SolidColourBrush.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = juce_SolidColourBrush.cpp; path = ../../src/gui/graphics/brushes/juce_SolidColourBrush.cpp; sourceTree = SOURCE_ROOT; }; | |||
| 84F1EB2210403709006A1807 /* juce_SolidColourBrush.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = juce_SolidColourBrush.h; path = ../../src/gui/graphics/brushes/juce_SolidColourBrush.h; sourceTree = SOURCE_ROOT; }; | |||
| 84F1EB2410403709006A1807 /* juce_Colour.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = juce_Colour.cpp; path = ../../src/gui/graphics/colour/juce_Colour.cpp; sourceTree = SOURCE_ROOT; }; | |||
| 84F1EB2510403709006A1807 /* juce_ColourGradient.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = juce_ColourGradient.cpp; path = ../../src/gui/graphics/colour/juce_ColourGradient.cpp; sourceTree = SOURCE_ROOT; }; | |||
| 84F1EB2610403709006A1807 /* juce_ColourGradient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = juce_ColourGradient.h; path = ../../src/gui/graphics/colour/juce_ColourGradient.h; sourceTree = SOURCE_ROOT; }; | |||
| @@ -1826,6 +1804,8 @@ | |||
| 84F1EB7710403709006A1807 /* juce_GIFLoader.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = juce_GIFLoader.h; path = ../../src/gui/graphics/imaging/image_file_formats/juce_GIFLoader.h; sourceTree = SOURCE_ROOT; }; | |||
| 84F1EB7810403709006A1807 /* juce_JPEGLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = juce_JPEGLoader.cpp; path = ../../src/gui/graphics/imaging/image_file_formats/juce_JPEGLoader.cpp; sourceTree = SOURCE_ROOT; }; | |||
| 84F1EB7910403709006A1807 /* juce_PNGLoader.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = juce_PNGLoader.cpp; path = ../../src/gui/graphics/imaging/image_file_formats/juce_PNGLoader.cpp; sourceTree = SOURCE_ROOT; }; | |||
| 84F29A9D10C2EFA5005014DF /* juce_FillType.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = juce_FillType.cpp; sourceTree = "<group>"; }; | |||
| 84F29A9E10C2EFA5005014DF /* juce_FillType.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = juce_FillType.h; sourceTree = "<group>"; }; | |||
| D2AAC046055464E500DB518D /* libjucedebug.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libjucedebug.a; sourceTree = BUILT_PRODUCTS_DIR; }; | |||
| /* End PBXFileReference section */ | |||
| @@ -2730,7 +2710,6 @@ | |||
| 84F1EB1910403709006A1807 /* graphics */ = { | |||
| isa = PBXGroup; | |||
| children = ( | |||
| 84F1EB1A10403709006A1807 /* brushes */, | |||
| 84F1EB2310403709006A1807 /* colour */, | |||
| 84F1EB2B10403709006A1807 /* contexts */, | |||
| 84F1EB3910403709006A1807 /* drawables */, | |||
| @@ -2743,22 +2722,6 @@ | |||
| path = ../../src/gui/graphics; | |||
| sourceTree = SOURCE_ROOT; | |||
| }; | |||
| 84F1EB1A10403709006A1807 /* brushes */ = { | |||
| isa = PBXGroup; | |||
| children = ( | |||
| 84F1EB1B10403709006A1807 /* juce_Brush.cpp */, | |||
| 84F1EB1C10403709006A1807 /* juce_Brush.h */, | |||
| 84F1EB1D10403709006A1807 /* juce_GradientBrush.cpp */, | |||
| 84F1EB1E10403709006A1807 /* juce_GradientBrush.h */, | |||
| 84F1EB1F10403709006A1807 /* juce_ImageBrush.cpp */, | |||
| 84F1EB2010403709006A1807 /* juce_ImageBrush.h */, | |||
| 84F1EB2110403709006A1807 /* juce_SolidColourBrush.cpp */, | |||
| 84F1EB2210403709006A1807 /* juce_SolidColourBrush.h */, | |||
| ); | |||
| name = brushes; | |||
| path = ../../src/gui/graphics/brushes; | |||
| sourceTree = SOURCE_ROOT; | |||
| }; | |||
| 84F1EB2310403709006A1807 /* colour */ = { | |||
| isa = PBXGroup; | |||
| children = ( | |||
| @@ -2779,6 +2742,8 @@ | |||
| children = ( | |||
| 84F1EB2C10403709006A1807 /* juce_EdgeTable.cpp */, | |||
| 84F1EB2D10403709006A1807 /* juce_EdgeTable.h */, | |||
| 84F29A9D10C2EFA5005014DF /* juce_FillType.cpp */, | |||
| 84F29A9E10C2EFA5005014DF /* juce_FillType.h */, | |||
| 84F1EB2E10403709006A1807 /* juce_Graphics.cpp */, | |||
| 84F1EB2F10403709006A1807 /* juce_Graphics.h */, | |||
| 84F1EB3010403709006A1807 /* juce_Justification.cpp */, | |||
| @@ -2961,7 +2926,6 @@ | |||
| 84816E8D10809DCB008FEC33 /* juce_BlowFish.h in Headers */, | |||
| 84816E8E10809DCB008FEC33 /* juce_BooleanPropertyComponent.h in Headers */, | |||
| 84816E8F10809DCB008FEC33 /* juce_BorderSize.h in Headers */, | |||
| 84816E9010809DCB008FEC33 /* juce_Brush.h in Headers */, | |||
| 84816E9110809DCB008FEC33 /* juce_BubbleComponent.h in Headers */, | |||
| 84816E9210809DCB008FEC33 /* juce_BubbleMessageComponent.h in Headers */, | |||
| 84816E9310809DCB008FEC33 /* juce_BufferedInputStream.h in Headers */, | |||
| @@ -3034,7 +2998,6 @@ | |||
| 84816ED610809DCB008FEC33 /* juce_GIFLoader.h in Headers */, | |||
| 84816ED710809DCB008FEC33 /* juce_GlowEffect.h in Headers */, | |||
| 84816ED810809DCB008FEC33 /* juce_GlyphArrangement.h in Headers */, | |||
| 84816ED910809DCB008FEC33 /* juce_GradientBrush.h in Headers */, | |||
| 84816EDA10809DCB008FEC33 /* juce_Graphics.h in Headers */, | |||
| 84816EDB10809DCB008FEC33 /* juce_GroupComponent.h in Headers */, | |||
| 84816EDC10809DCB008FEC33 /* juce_GZIPCompressorOutputStream.h in Headers */, | |||
| @@ -3043,7 +3006,6 @@ | |||
| 84816EDF10809DCB008FEC33 /* juce_IIRFilter.h in Headers */, | |||
| 84816EE010809DCB008FEC33 /* juce_IIRFilterAudioSource.h in Headers */, | |||
| 84816EE110809DCB008FEC33 /* juce_Image.h in Headers */, | |||
| 84816EE210809DCB008FEC33 /* juce_ImageBrush.h in Headers */, | |||
| 84816EE310809DCB008FEC33 /* juce_ImageButton.h in Headers */, | |||
| 84816EE410809DCB008FEC33 /* juce_ImageCache.h in Headers */, | |||
| 84816EE510809DCB008FEC33 /* juce_ImageConvolutionKernel.h in Headers */, | |||
| @@ -3166,7 +3128,6 @@ | |||
| 84816F5B10809DCB008FEC33 /* juce_SliderListener.h in Headers */, | |||
| 84816F5C10809DCB008FEC33 /* juce_SliderPropertyComponent.h in Headers */, | |||
| 84816F5D10809DCB008FEC33 /* juce_Socket.h in Headers */, | |||
| 84816F5E10809DCB008FEC33 /* juce_SolidColourBrush.h in Headers */, | |||
| 84816F5F10809DCB008FEC33 /* juce_SortedSet.h in Headers */, | |||
| 84816F6010809DCB008FEC33 /* juce_SparseSet.h in Headers */, | |||
| 84816F6110809DCB008FEC33 /* juce_SplashScreen.h in Headers */, | |||
| @@ -3504,10 +3465,6 @@ | |||
| 84F1EC8F1040370A006A1807 /* juce_ThreadWithProgressWindow.h in Headers */, | |||
| 84F1EC911040370A006A1807 /* juce_TooltipWindow.h in Headers */, | |||
| 84F1EC931040370A006A1807 /* juce_TopLevelWindow.h in Headers */, | |||
| 84F1EC951040370A006A1807 /* juce_Brush.h in Headers */, | |||
| 84F1EC971040370A006A1807 /* juce_GradientBrush.h in Headers */, | |||
| 84F1EC991040370A006A1807 /* juce_ImageBrush.h in Headers */, | |||
| 84F1EC9B1040370A006A1807 /* juce_SolidColourBrush.h in Headers */, | |||
| 84F1EC9E1040370A006A1807 /* juce_ColourGradient.h in Headers */, | |||
| 84F1ECA01040370A006A1807 /* juce_Colours.h in Headers */, | |||
| 84F1ECA11040370A006A1807 /* juce_PixelFormats.h in Headers */, | |||
| @@ -3554,6 +3511,7 @@ | |||
| 84AB91FE10A078190048FC39 /* juce_CodeEditorComponent.h in Headers */, | |||
| 84AB920010A078190048FC39 /* juce_CPlusPlusCodeTokeniser.h in Headers */, | |||
| 84AB927210A082E30048FC39 /* juce_CodeTokeniser.h in Headers */, | |||
| 84F29AA010C2EFA5005014DF /* juce_FillType.h in Headers */, | |||
| ); | |||
| runOnlyForDeploymentPostprocessing = 0; | |||
| }; | |||
| @@ -3656,7 +3614,6 @@ | |||
| 84816FBC10809E00008FEC33 /* juce_BlowFish.cpp in Sources */, | |||
| 84816FBD10809E00008FEC33 /* juce_BooleanPropertyComponent.cpp in Sources */, | |||
| 84816FBE10809E00008FEC33 /* juce_BorderSize.cpp in Sources */, | |||
| 84816FBF10809E00008FEC33 /* juce_Brush.cpp in Sources */, | |||
| 84816FC010809E00008FEC33 /* juce_BubbleComponent.cpp in Sources */, | |||
| 84816FC110809E00008FEC33 /* juce_BubbleMessageComponent.cpp in Sources */, | |||
| 84816FC210809E00008FEC33 /* juce_BufferedInputStream.cpp in Sources */, | |||
| @@ -3718,7 +3675,6 @@ | |||
| 84816FFA10809E00008FEC33 /* juce_GIFLoader.cpp in Sources */, | |||
| 84816FFB10809E00008FEC33 /* juce_GlowEffect.cpp in Sources */, | |||
| 84816FFC10809E00008FEC33 /* juce_GlyphArrangement.cpp in Sources */, | |||
| 84816FFD10809E00008FEC33 /* juce_GradientBrush.cpp in Sources */, | |||
| 84816FFE10809E00008FEC33 /* juce_Graphics.cpp in Sources */, | |||
| 84816FFF10809E00008FEC33 /* juce_GroupComponent.cpp in Sources */, | |||
| 8481700010809E00008FEC33 /* juce_GZIPCompressorOutputStream.cpp in Sources */, | |||
| @@ -3727,7 +3683,6 @@ | |||
| 8481700310809E00008FEC33 /* juce_IIRFilter.cpp in Sources */, | |||
| 8481700410809E00008FEC33 /* juce_IIRFilterAudioSource.cpp in Sources */, | |||
| 8481700510809E00008FEC33 /* juce_Image.cpp in Sources */, | |||
| 8481700610809E00008FEC33 /* juce_ImageBrush.cpp in Sources */, | |||
| 8481700710809E00008FEC33 /* juce_ImageButton.cpp in Sources */, | |||
| 8481700810809E00008FEC33 /* juce_ImageCache.cpp in Sources */, | |||
| 8481700910809E00008FEC33 /* juce_ImageConvolutionKernel.cpp in Sources */, | |||
| @@ -3850,7 +3805,6 @@ | |||
| 8481707F10809E00008FEC33 /* juce_Slider.cpp in Sources */, | |||
| 8481708010809E00008FEC33 /* juce_SliderPropertyComponent.cpp in Sources */, | |||
| 8481708110809E00008FEC33 /* juce_Socket.cpp in Sources */, | |||
| 8481708210809E00008FEC33 /* juce_SolidColourBrush.cpp in Sources */, | |||
| 8481708310809E00008FEC33 /* juce_SplashScreen.cpp in Sources */, | |||
| 8481708410809E00008FEC33 /* juce_StretchableLayoutManager.cpp in Sources */, | |||
| 8481708510809E00008FEC33 /* juce_StretchableLayoutResizerBar.cpp in Sources */, | |||
| @@ -4144,10 +4098,6 @@ | |||
| 84F1EC8E1040370A006A1807 /* juce_ThreadWithProgressWindow.cpp in Sources */, | |||
| 84F1EC901040370A006A1807 /* juce_TooltipWindow.cpp in Sources */, | |||
| 84F1EC921040370A006A1807 /* juce_TopLevelWindow.cpp in Sources */, | |||
| 84F1EC941040370A006A1807 /* juce_Brush.cpp in Sources */, | |||
| 84F1EC961040370A006A1807 /* juce_GradientBrush.cpp in Sources */, | |||
| 84F1EC981040370A006A1807 /* juce_ImageBrush.cpp in Sources */, | |||
| 84F1EC9A1040370A006A1807 /* juce_SolidColourBrush.cpp in Sources */, | |||
| 84F1EC9C1040370A006A1807 /* juce_Colour.cpp in Sources */, | |||
| 84F1EC9D1040370A006A1807 /* juce_ColourGradient.cpp in Sources */, | |||
| 84F1EC9F1040370A006A1807 /* juce_Colours.cpp in Sources */, | |||
| @@ -4195,6 +4145,7 @@ | |||
| 84AB91FB10A078190048FC39 /* juce_CodeDocument.cpp in Sources */, | |||
| 84AB91FD10A078190048FC39 /* juce_CodeEditorComponent.cpp in Sources */, | |||
| 84AB91FF10A078190048FC39 /* juce_CPlusPlusCodeTokeniser.cpp in Sources */, | |||
| 84F29A9F10C2EFA5005014DF /* juce_FillType.cpp in Sources */, | |||
| ); | |||
| runOnlyForDeploymentPostprocessing = 0; | |||
| }; | |||
| @@ -2211,6 +2211,14 @@ | |||
| RelativePath="..\..\..\src\gui\graphics\contexts\juce_EdgeTable.h" | |||
| > | |||
| </File> | |||
| <File | |||
| RelativePath="..\..\..\src\gui\graphics\contexts\juce_FillType.cpp" | |||
| > | |||
| </File> | |||
| <File | |||
| RelativePath="..\..\..\src\gui\graphics\contexts\juce_FillType.h" | |||
| > | |||
| </File> | |||
| <File | |||
| RelativePath="..\..\..\src\gui\graphics\contexts\juce_Graphics.cpp" | |||
| > | |||
| @@ -301,10 +301,10 @@ private: | |||
| dp.setPath (shape); | |||
| dp.setStrokeThickness (4.0f); | |||
| dp.setStrokeColour (Colours::blue); | |||
| dp.setStrokeFill (Colours::blue); | |||
| dp.setFillGradient (ColourGradient (Colours::red.withAlpha (0.4f), -100.0f, -100.0f, | |||
| Colours::green.withAlpha (0.6f), 100.0f, 100.0f, false)); | |||
| dp.setFill (ColourGradient (Colours::red.withAlpha (0.4f), -100.0f, -100.0f, | |||
| Colours::green.withAlpha (0.6f), 100.0f, 100.0f, false)); | |||
| dc->insertDrawable (dp); | |||
| @@ -422,13 +422,13 @@ static Component* createRadioButtonPage() | |||
| Path p; | |||
| p.addStar (0.0f, 0.0f, i + 5, 20.0f, 50.0f, -0.2f); | |||
| normal.setPath (p); | |||
| normal.setFillColour (Colours::lightblue); | |||
| normal.setStrokeColour (Colours::black); | |||
| normal.setFill (Colours::lightblue); | |||
| normal.setStrokeFill (Colours::black); | |||
| normal.setStrokeThickness (4.0f); | |||
| over.setPath (p); | |||
| over.setFillColour (Colours::blue); | |||
| over.setStrokeColour (Colours::black); | |||
| over.setFill (Colours::blue); | |||
| over.setStrokeFill (Colours::black); | |||
| over.setStrokeThickness (4.0f); | |||
| DrawableButton* db = new DrawableButton (String (i + 5) + T(" points"), DrawableButton::ImageAboveTextLabel); | |||
| @@ -480,13 +480,13 @@ public: | |||
| Path p; | |||
| p.addStar (0.0f, 0.0f, 5, 20.0f, 50.0f, 0.2f); | |||
| normal.setPath (p); | |||
| normal.setFillColour (Colours::red); | |||
| normal.setFill (Colours::red); | |||
| p.clear(); | |||
| p.addStar (0.0f, 0.0f, 7, 30.0f, 50.0f, 0.0f); | |||
| over.setPath (p); | |||
| over.setFillColour (Colours::pink); | |||
| over.setStrokeColour (Colours::black); | |||
| over.setFill (Colours::pink); | |||
| over.setStrokeFill (Colours::black); | |||
| over.setStrokeThickness (5.0f); | |||
| DrawableImage down; | |||
| @@ -58,22 +58,22 @@ public: | |||
| void setIndex (const int newIndex) | |||
| { | |||
| FillType fill (isForStroke ? owner->getStrokeType().fill | |||
| : owner->getFillType()); | |||
| JucerFillType fill (isForStroke ? owner->getStrokeType().fill | |||
| : owner->getFillType()); | |||
| switch (newIndex) | |||
| { | |||
| case 0: | |||
| fill.mode = FillType::solidColour; | |||
| fill.mode = JucerFillType::solidColour; | |||
| break; | |||
| case 1: | |||
| fill.mode = FillType::linearGradient; | |||
| fill.mode = JucerFillType::linearGradient; | |||
| break; | |||
| case 2: | |||
| fill.mode = FillType::radialGradient; | |||
| fill.mode = JucerFillType::radialGradient; | |||
| break; | |||
| case 3: | |||
| fill.mode = FillType::imageBrush; | |||
| fill.mode = JucerFillType::imageBrush; | |||
| break; | |||
| default: | |||
| @@ -92,13 +92,13 @@ public: | |||
| switch (isForStroke ? owner->getStrokeType().fill.mode | |||
| : owner->getFillType().mode) | |||
| { | |||
| case FillType::solidColour: | |||
| case JucerFillType::solidColour: | |||
| return 0; | |||
| case FillType::linearGradient: | |||
| case JucerFillType::linearGradient: | |||
| return 1; | |||
| case FillType::radialGradient: | |||
| case JucerFillType::radialGradient: | |||
| return 2; | |||
| case FillType::imageBrush: | |||
| case JucerFillType::imageBrush: | |||
| return 3; | |||
| default: | |||
| jassertfalse | |||
| @@ -151,8 +151,8 @@ public: | |||
| { | |||
| owner->getDocument()->getUndoManager().undoCurrentTransactionOnly(); | |||
| FillType fill (isForStroke ? owner->getStrokeType().fill | |||
| : owner->getFillType()); | |||
| JucerFillType fill (isForStroke ? owner->getStrokeType().fill | |||
| : owner->getFillType()); | |||
| switch (type) | |||
| { | |||
| @@ -181,8 +181,8 @@ public: | |||
| const Colour getColour() const | |||
| { | |||
| const FillType fill (isForStroke ? owner->getStrokeType().fill | |||
| : owner->getFillType()); | |||
| const JucerFillType fill (isForStroke ? owner->getStrokeType().fill | |||
| : owner->getFillType()); | |||
| switch (type) | |||
| { | |||
| @@ -248,8 +248,8 @@ public: | |||
| //============================================================================== | |||
| void setPosition (const RelativePositionedRectangle& newPos) | |||
| { | |||
| FillType fill (isForStroke ? owner->getStrokeType().fill | |||
| : owner->getFillType()); | |||
| JucerFillType fill (isForStroke ? owner->getStrokeType().fill | |||
| : owner->getFillType()); | |||
| if (isStart) | |||
| fill.gradPos1 = newPos; | |||
| @@ -264,8 +264,8 @@ public: | |||
| const RelativePositionedRectangle getPosition() const | |||
| { | |||
| const FillType fill (isForStroke ? owner->getStrokeType().fill | |||
| : owner->getFillType()); | |||
| const JucerFillType fill (isForStroke ? owner->getStrokeType().fill | |||
| : owner->getFillType()); | |||
| return isStart ? fill.gradPos1 | |||
| : fill.gradPos2; | |||
| @@ -472,14 +472,14 @@ public: | |||
| { | |||
| if (isForStroke) | |||
| { | |||
| FillType type (element->getStrokeType().fill); | |||
| JucerFillType type (element->getStrokeType().fill); | |||
| type.imageResourceName = newName; | |||
| element->setStrokeFill (type, true); | |||
| } | |||
| else | |||
| { | |||
| FillType type (element->getFillType()); | |||
| JucerFillType type (element->getFillType()); | |||
| type.imageResourceName = newName; | |||
| element->setFillType (type, true); | |||
| @@ -523,13 +523,13 @@ public: | |||
| { | |||
| if (isForStroke) | |||
| { | |||
| FillType type (owner->getStrokeType().fill); | |||
| JucerFillType type (owner->getStrokeType().fill); | |||
| type.imageAnchor = newPos; | |||
| owner->setStrokeFill (type, true); | |||
| } | |||
| else | |||
| { | |||
| FillType type (owner->getFillType()); | |||
| JucerFillType type (owner->getFillType()); | |||
| type.imageAnchor = newPos; | |||
| owner->setFillType (type, true); | |||
| } | |||
| @@ -572,14 +572,14 @@ public: | |||
| if (isForStroke) | |||
| { | |||
| FillType type (element->getStrokeType().fill); | |||
| JucerFillType type (element->getStrokeType().fill); | |||
| type.imageOpacity = newValue; | |||
| element->setStrokeFill (type, true); | |||
| } | |||
| else | |||
| { | |||
| FillType type (element->getFillType()); | |||
| JucerFillType type (element->getFillType()); | |||
| type.imageOpacity = newValue; | |||
| element->setFillType (type, true); | |||
| @@ -634,12 +634,12 @@ void ColouredElement::getColourSpecificProperties (Array <PropertyComponent*>& p | |||
| switch (getFillType().mode) | |||
| { | |||
| case FillType::solidColour: | |||
| case JucerFillType::solidColour: | |||
| properties.add (new ElementFillColourProperty (T("colour"), this, ElementFillColourProperty::solidColour, false)); | |||
| break; | |||
| case FillType::linearGradient: | |||
| case FillType::radialGradient: | |||
| case JucerFillType::linearGradient: | |||
| case JucerFillType::radialGradient: | |||
| properties.add (new ElementFillColourProperty (T("colour 1"), this, ElementFillColourProperty::gradientColour1, false)); | |||
| properties.add (new ElementFillPositionProperty (this, T("x1"), PositionPropertyBase::componentX, true, false)); | |||
| properties.add (new ElementFillPositionProperty (this, T("y1"), PositionPropertyBase::componentY, true, false)); | |||
| @@ -648,7 +648,7 @@ void ColouredElement::getColourSpecificProperties (Array <PropertyComponent*>& p | |||
| properties.add (new ElementFillPositionProperty (this, T("y2"), PositionPropertyBase::componentY, false, false)); | |||
| break; | |||
| case FillType::imageBrush: | |||
| case JucerFillType::imageBrush: | |||
| properties.add (new ImageBrushResourceProperty (this, false)); | |||
| properties.add (new ImageBrushPositionProperty (this, T("anchor x"), PositionPropertyBase::componentX, false)); | |||
| properties.add (new ImageBrushPositionProperty (this, T("anchor y"), PositionPropertyBase::componentY, false)); | |||
| @@ -678,12 +678,12 @@ void ColouredElement::getColourSpecificProperties (Array <PropertyComponent*>& p | |||
| switch (getStrokeType().fill.mode) | |||
| { | |||
| case FillType::solidColour: | |||
| case JucerFillType::solidColour: | |||
| properties.add (new ElementFillColourProperty (T("colour"), this, ElementFillColourProperty::solidColour, true)); | |||
| break; | |||
| case FillType::linearGradient: | |||
| case FillType::radialGradient: | |||
| case JucerFillType::linearGradient: | |||
| case JucerFillType::radialGradient: | |||
| properties.add (new ElementFillColourProperty (T("colour 1"), this, ElementFillColourProperty::gradientColour1, true)); | |||
| properties.add (new ElementFillPositionProperty (this, T("x1"), PositionPropertyBase::componentX, true, true)); | |||
| properties.add (new ElementFillPositionProperty (this, T("y1"), PositionPropertyBase::componentY, true, true)); | |||
| @@ -692,7 +692,7 @@ void ColouredElement::getColourSpecificProperties (Array <PropertyComponent*>& p | |||
| properties.add (new ElementFillPositionProperty (this, T("y2"), PositionPropertyBase::componentY, false, true)); | |||
| break; | |||
| case FillType::imageBrush: | |||
| case JucerFillType::imageBrush: | |||
| properties.add (new ImageBrushResourceProperty (this, true)); | |||
| properties.add (new ImageBrushPositionProperty (this, T("stroke anchor x"), PositionPropertyBase::componentX, true)); | |||
| properties.add (new ImageBrushPositionProperty (this, T("stroke anchor y"), PositionPropertyBase::componentY, true)); | |||
| @@ -708,7 +708,7 @@ void ColouredElement::getColourSpecificProperties (Array <PropertyComponent*>& p | |||
| } | |||
| //============================================================================== | |||
| const FillType& ColouredElement::getFillType() throw() | |||
| const JucerFillType& ColouredElement::getFillType() throw() | |||
| { | |||
| return fillType; | |||
| } | |||
| @@ -716,7 +716,7 @@ const FillType& ColouredElement::getFillType() throw() | |||
| class FillTypeChangeAction : public PaintElementUndoableAction <ColouredElement> | |||
| { | |||
| public: | |||
| FillTypeChangeAction (ColouredElement* const element, const FillType& newState_) | |||
| FillTypeChangeAction (ColouredElement* const element, const JucerFillType& newState_) | |||
| : PaintElementUndoableAction <ColouredElement> (element), | |||
| newState (newState_) | |||
| { | |||
| @@ -738,10 +738,10 @@ public: | |||
| } | |||
| private: | |||
| FillType newState, oldState; | |||
| JucerFillType newState, oldState; | |||
| }; | |||
| void ColouredElement::setFillType (const FillType& newType, const bool undoable) | |||
| void ColouredElement::setFillType (const JucerFillType& newType, const bool undoable) | |||
| { | |||
| if (fillType != newType) | |||
| { | |||
| @@ -878,7 +878,7 @@ void ColouredElement::setStrokeType (const PathStrokeType& newType, const bool u | |||
| class StrokeFillTypeChangeAction : public PaintElementUndoableAction <ColouredElement> | |||
| { | |||
| public: | |||
| StrokeFillTypeChangeAction (ColouredElement* const element, const FillType& newState_) | |||
| StrokeFillTypeChangeAction (ColouredElement* const element, const JucerFillType& newState_) | |||
| : PaintElementUndoableAction <ColouredElement> (element), | |||
| newState (newState_) | |||
| { | |||
| @@ -900,10 +900,10 @@ public: | |||
| } | |||
| private: | |||
| FillType newState, oldState; | |||
| JucerFillType newState, oldState; | |||
| }; | |||
| void ColouredElement::setStrokeFill (const FillType& newType, const bool undoable) | |||
| void ColouredElement::setStrokeFill (const JucerFillType& newType, const bool undoable) | |||
| { | |||
| if (strokeType.fill != newType) | |||
| { | |||
| @@ -52,15 +52,15 @@ public: | |||
| void getColourSpecificProperties (Array <PropertyComponent*>& properties); | |||
| //============================================================================== | |||
| const FillType& getFillType() throw(); | |||
| void setFillType (const FillType& newType, const bool undoable); | |||
| const JucerFillType& getFillType() throw(); | |||
| void setFillType (const JucerFillType& newType, const bool undoable); | |||
| bool isStrokeEnabled() const throw(); | |||
| void enableStroke (bool enable, const bool undoable); | |||
| const StrokeType& getStrokeType() throw(); | |||
| void setStrokeType (const PathStrokeType& newType, const bool undoable); | |||
| void setStrokeFill (const FillType& newType, const bool undoable); | |||
| void setStrokeFill (const JucerFillType& newType, const bool undoable); | |||
| //============================================================================== | |||
| const Rectangle getCurrentBounds (const Rectangle& parentArea) const; | |||
| @@ -76,7 +76,7 @@ public: | |||
| juce_UseDebuggingNewOperator | |||
| protected: | |||
| FillType fillType; | |||
| JucerFillType fillType; | |||
| bool isStrokePresent; | |||
| const bool showOutline, showJointAndEnd; | |||
| @@ -28,13 +28,13 @@ | |||
| //============================================================================== | |||
| FillType::FillType() | |||
| JucerFillType::JucerFillType() | |||
| : image (0) | |||
| { | |||
| reset(); | |||
| } | |||
| FillType::FillType (const FillType& other) | |||
| JucerFillType::JucerFillType (const JucerFillType& other) | |||
| { | |||
| image = 0; | |||
| mode = other.mode; | |||
| @@ -48,7 +48,7 @@ FillType::FillType (const FillType& other) | |||
| imageAnchor = other.imageAnchor; | |||
| } | |||
| const FillType& FillType::operator= (const FillType& other) | |||
| const JucerFillType& JucerFillType::operator= (const JucerFillType& other) | |||
| { | |||
| ImageCache::release (image); | |||
| image = 0; | |||
| @@ -66,12 +66,12 @@ const FillType& FillType::operator= (const FillType& other) | |||
| return *this; | |||
| } | |||
| FillType::~FillType() | |||
| JucerFillType::~JucerFillType() | |||
| { | |||
| ImageCache::release (image); | |||
| } | |||
| bool FillType::operator== (const FillType& other) const throw() | |||
| bool JucerFillType::operator== (const JucerFillType& other) const throw() | |||
| { | |||
| return mode == other.mode | |||
| && colour == other.colour | |||
| @@ -84,12 +84,12 @@ bool FillType::operator== (const FillType& other) const throw() | |||
| && imageAnchor == other.imageAnchor; | |||
| } | |||
| bool FillType::operator!= (const FillType& other) const throw() | |||
| bool JucerFillType::operator!= (const JucerFillType& other) const throw() | |||
| { | |||
| return ! operator== (other); | |||
| } | |||
| void FillType::reset() | |||
| void JucerFillType::reset() | |||
| { | |||
| ImageCache::release (image); | |||
| image = 0; | |||
| @@ -110,7 +110,7 @@ void FillType::reset() | |||
| } | |||
| //============================================================================== | |||
| void FillType::setFillType (Graphics& g, JucerDocument* const document, const Rectangle& parentArea) | |||
| void JucerFillType::setFillType (Graphics& g, JucerDocument* const document, const Rectangle& parentArea) | |||
| { | |||
| if (mode == solidColour) | |||
| { | |||
| @@ -141,7 +141,7 @@ void FillType::setFillType (Graphics& g, JucerDocument* const document, const Re | |||
| } | |||
| } | |||
| void FillType::fillInGeneratedCode (GeneratedCode& code, String& paintMethodCode) const | |||
| void JucerFillType::fillInGeneratedCode (GeneratedCode& code, String& paintMethodCode) const | |||
| { | |||
| String s; | |||
| @@ -203,7 +203,7 @@ void FillType::fillInGeneratedCode (GeneratedCode& code, String& paintMethodCode | |||
| paintMethodCode += s; | |||
| } | |||
| const String FillType::toString() const | |||
| const String JucerFillType::toString() const | |||
| { | |||
| switch (mode) | |||
| { | |||
| @@ -235,7 +235,7 @@ const String FillType::toString() const | |||
| return String::empty; | |||
| } | |||
| void FillType::restoreFromString (const String& s) | |||
| void JucerFillType::restoreFromString (const String& s) | |||
| { | |||
| reset(); | |||
| @@ -278,7 +278,7 @@ void FillType::restoreFromString (const String& s) | |||
| } | |||
| } | |||
| bool FillType::isOpaque() const | |||
| bool JucerFillType::isOpaque() const | |||
| { | |||
| switch (mode) | |||
| { | |||
| @@ -302,7 +302,7 @@ bool FillType::isOpaque() const | |||
| return false; | |||
| } | |||
| bool FillType::isInvisible() const | |||
| bool JucerFillType::isInvisible() const | |||
| { | |||
| switch (mode) | |||
| { | |||
| @@ -324,7 +324,7 @@ bool FillType::isInvisible() const | |||
| return false; | |||
| } | |||
| void FillType::loadImage (JucerDocument* const document) | |||
| void JucerFillType::loadImage (JucerDocument* const document) | |||
| { | |||
| if (image == 0) | |||
| { | |||
| @@ -33,17 +33,17 @@ | |||
| /** | |||
| Defines a brush to be used to fill a shape. | |||
| */ | |||
| class FillType | |||
| class JucerFillType | |||
| { | |||
| public: | |||
| //============================================================================== | |||
| FillType(); | |||
| FillType (const FillType& other); | |||
| const FillType& operator= (const FillType& other); | |||
| ~FillType(); | |||
| JucerFillType(); | |||
| JucerFillType (const JucerFillType& other); | |||
| const JucerFillType& operator= (const JucerFillType& other); | |||
| ~JucerFillType(); | |||
| bool operator== (const FillType& other) const throw(); | |||
| bool operator!= (const FillType& other) const throw(); | |||
| bool operator== (const JucerFillType& other) const throw(); | |||
| bool operator!= (const JucerFillType& other) const throw(); | |||
| //============================================================================== | |||
| void setFillType (Graphics& g, JucerDocument* const document, const Rectangle& parentArea); | |||
| @@ -72,7 +72,7 @@ public: | |||
| if (isStroke) | |||
| { | |||
| FillType f (e->getStrokeType().fill); | |||
| JucerFillType f (e->getStrokeType().fill); | |||
| if (isStart) | |||
| f.gradPos1 = newPos; | |||
| @@ -83,7 +83,7 @@ public: | |||
| } | |||
| else | |||
| { | |||
| FillType f (e->getFillType()); | |||
| JucerFillType f (e->getFillType()); | |||
| if (isStart) | |||
| f.gradPos1 = newPos; | |||
| @@ -100,11 +100,11 @@ public: | |||
| ColouredElement* e = dynamic_cast <ColouredElement*> (owner); | |||
| FillType f (isStroke ? e->getStrokeType().fill | |||
| : e->getFillType()); | |||
| JucerFillType f (isStroke ? e->getStrokeType().fill | |||
| : e->getFillType()); | |||
| setVisible (f.mode == FillType::linearGradient | |||
| || f.mode == FillType::radialGradient); | |||
| setVisible (f.mode == JucerFillType::linearGradient | |||
| || f.mode == JucerFillType::radialGradient); | |||
| } | |||
| private: | |||
| @@ -41,7 +41,7 @@ StrokeType::~StrokeType() | |||
| void StrokeType::reset() | |||
| { | |||
| stroke = PathStrokeType (5.0f); | |||
| fill = FillType(); | |||
| fill = JucerFillType(); | |||
| fill.colour = Colours::black; | |||
| } | |||
| @@ -51,7 +51,7 @@ public: | |||
| //============================================================================== | |||
| PathStrokeType stroke; | |||
| FillType fill; | |||
| JucerFillType fill; | |||
| //============================================================================== | |||
| bool operator== (const StrokeType& other) const throw(); | |||
| @@ -19703,6 +19703,10 @@ private: | |||
| #endif // __JUCE_COLOURS_JUCEHEADER__ | |||
| /********* End of inlined file: juce_Colours.h *********/ | |||
| /********* Start of inlined file: juce_FillType.h *********/ | |||
| #ifndef __JUCE_GRAPHICS_JUCEHEADER__x | |||
| #define __JUCE_GRAPHICS_JUCEHEADER__x | |||
| /********* Start of inlined file: juce_ColourGradient.h *********/ | |||
| #ifndef __JUCE_COLOURGRADIENT_JUCEHEADER__ | |||
| #define __JUCE_COLOURGRADIENT_JUCEHEADER__ | |||
| @@ -19798,7 +19802,7 @@ public: | |||
| The caller must delete the array that is returned using juce_free(). | |||
| */ | |||
| PixelARGB* createLookupTable (int& numEntries) const throw(); | |||
| PixelARGB* createLookupTable (const AffineTransform& transform, int& numEntries) const throw(); | |||
| /** Returns true if all colours are opaque. */ | |||
| bool isOpaque() const throw(); | |||
| @@ -19819,9 +19823,6 @@ public: | |||
| */ | |||
| bool isRadial; | |||
| /** A transform to apply to the resultant gradient shape */ | |||
| AffineTransform transform; | |||
| juce_UseDebuggingNewOperator | |||
| private: | |||
| @@ -19831,6 +19832,92 @@ private: | |||
| #endif // __JUCE_COLOURGRADIENT_JUCEHEADER__ | |||
| /********* End of inlined file: juce_ColourGradient.h *********/ | |||
| class Image; | |||
| /** | |||
| Represents a colour or fill pattern to use for rendering paths. | |||
| This is used by the Graphics and DrawablePath classes as a way to encapsulate | |||
| a brush type. It can either be a solid colour, a gradient, or a tiled image. | |||
| @see Graphics::setFillType, DrawablePath::setFill | |||
| */ | |||
| class JUCE_API FillType | |||
| { | |||
| public: | |||
| /** Creates a default fill type, of solid black. */ | |||
| FillType() throw(); | |||
| /** Creates a fill type of a solid colour. | |||
| @see setColour | |||
| */ | |||
| FillType (const Colour& colour) throw(); | |||
| /** Creates a gradient fill type. | |||
| @see setGradient | |||
| */ | |||
| FillType (const ColourGradient& gradient) throw(); | |||
| /** Creates a tiled image fill type. The transform allows you to set the scaling, offset | |||
| and rotation of the pattern. | |||
| @see setTiledImage | |||
| */ | |||
| FillType (const Image& image, const AffineTransform& transform) throw(); | |||
| /** Creates a copy of another FillType. */ | |||
| FillType (const FillType& other) throw(); | |||
| /** Makes a copy of another FillType. */ | |||
| const FillType& operator= (const FillType& other) throw(); | |||
| /** Destructor. */ | |||
| ~FillType() throw(); | |||
| /** Returns true if this is a solid colour fill, and not a gradient or image. */ | |||
| bool isColour() const throw() { return gradient == 0 && image == 0; } | |||
| /** Returns true if this is a gradient fill. */ | |||
| bool isGradient() const throw() { return gradient != 0; } | |||
| /** Returns true if this is a tiled image pattern fill. */ | |||
| bool isTiledImage() const throw() { return image != 0; } | |||
| /** Turns this object into a solid colour fill. | |||
| If the object was an image or gradient, those fields will no longer be valid. */ | |||
| void setColour (const Colour& newColour) throw(); | |||
| /** Turns this object into a gradient fill. */ | |||
| void setGradient (const ColourGradient& newGradient) throw(); | |||
| /** Turns this object into a tiled image fill type. The transform allows you to set | |||
| the scaling, offset and rotation of the pattern. | |||
| */ | |||
| void setTiledImage (const Image& image, const AffineTransform& transform) throw(); | |||
| /** Returns the solid colour being used. */ | |||
| Colour colour; | |||
| /** Returns the gradient that should be used for filling. | |||
| This will be zero if the object is some other type of fill. | |||
| */ | |||
| ColourGradient* gradient; | |||
| /** Returns the image that should be used for tiling. | |||
| The FillType object just keeps a pointer to this image, it doesn't own it, so you have to | |||
| be careful to make sure the image doesn't get deleted while it's being used. | |||
| */ | |||
| const Image* image; | |||
| /** The transform that should be applied to the image or gradient that's being drawn. | |||
| */ | |||
| AffineTransform transform; | |||
| juce_UseDebuggingNewOperator | |||
| }; | |||
| #endif // __JUCE_GRAPHICS_JUCEHEADER__ | |||
| /********* End of inlined file: juce_FillType.h *********/ | |||
| /********* Start of inlined file: juce_RectanglePlacement.h *********/ | |||
| #ifndef __JUCE_RECTANGLEPLACEMENT_JUCEHEADER__ | |||
| #define __JUCE_RECTANGLEPLACEMENT_JUCEHEADER__ | |||
| @@ -20027,6 +20114,11 @@ public: | |||
| const int anchorY, | |||
| const float opacity) throw(); | |||
| /** Changes the current fill settings. | |||
| @see setColour, setGradientFill, setTiledImageFill | |||
| */ | |||
| void setFillType (const FillType& newFill) throw(); | |||
| /** Changes the font to use for subsequent text-drawing functions. | |||
| Note there's also a setFont (float, int) method to quickly change the size and | |||
| @@ -20533,7 +20625,7 @@ public: | |||
| /** Intersects the current clipping region with another region. | |||
| @returns true if the resulting clipping region is non-zero in size | |||
| @see setOrigin, clipRegionIntersects, getClipLeft, getClipRight, getClipWidth, getClipHeight | |||
| @see setOrigin, clipRegionIntersects | |||
| */ | |||
| bool reduceClipRegion (const int x, const int y, | |||
| const int width, const int height) throw(); | |||
| @@ -20541,10 +20633,34 @@ public: | |||
| /** Intersects the current clipping region with a rectangle list region. | |||
| @returns true if the resulting clipping region is non-zero in size | |||
| @see setOrigin, clipRegionIntersects, getClipLeft, getClipRight, getClipWidth, getClipHeight | |||
| @see setOrigin, clipRegionIntersects | |||
| */ | |||
| bool reduceClipRegion (const RectangleList& clipRegion) throw(); | |||
| /** Intersects the current clipping region with a path. | |||
| @returns true if the resulting clipping region is non-zero in size | |||
| @see reduceClipRegion | |||
| */ | |||
| bool reduceClipRegion (const Path& path, const AffineTransform& transform = AffineTransform::identity) throw(); | |||
| /** Intersects the current clipping region with an image's alpha-channel. | |||
| The current clipping path is intersected with the area covered by this image's | |||
| alpha-channel, after the image has been transformed by the specified matrix. | |||
| @param image the image whose alpha-channel should be used. If the image doesn't | |||
| have an alpha-channel, it is treated as entirely opaque. | |||
| @param sourceClipRegion a subsection of the image that should be used. To use the | |||
| entire image, just pass a rectangle of bounds | |||
| (0, 0, image.getWidth(), image.getHeight()). | |||
| @param transform a matrix to apply to the image | |||
| @returns true if the resulting clipping region is non-zero in size | |||
| @see reduceClipRegion | |||
| */ | |||
| bool reduceClipRegion (const Image& image, const Rectangle& sourceClipRegion, | |||
| const AffineTransform& transform) throw(); | |||
| /** Excludes a rectangle to stop it being drawn into. */ | |||
| void excludeClipRegion (const int x, const int y, | |||
| const int width, const int height) throw(); | |||
| @@ -20594,33 +20710,6 @@ public: | |||
| /** @internal */ | |||
| LowLevelGraphicsContext* getInternalContext() const throw() { return context; } | |||
| class FillType | |||
| { | |||
| public: | |||
| FillType() throw(); | |||
| FillType (const Colour& colour) throw(); | |||
| FillType (const ColourGradient& gradient) throw(); | |||
| FillType (Image* const image, const int x, const int y) throw(); | |||
| FillType (const FillType& other) throw(); | |||
| const FillType& operator= (const FillType& other) throw(); | |||
| ~FillType() throw(); | |||
| bool isColour() const throw() { return gradient == 0 && image == 0; } | |||
| bool isGradient() const throw() { return gradient != 0; } | |||
| bool isTiledImage() const throw() { return image != 0; } | |||
| void setColour (const Colour& newColour) throw(); | |||
| void setGradient (const ColourGradient& newGradient) throw(); | |||
| void setTiledImage (const Image& image, const int imageX, const int imageY) throw(); | |||
| Colour colour; | |||
| ColourGradient* gradient; | |||
| const Image* image; | |||
| int imageX, imageY; | |||
| juce_UseDebuggingNewOperator | |||
| }; | |||
| private: | |||
| LowLevelGraphicsContext* const context; | |||
| @@ -39717,9 +39806,7 @@ public: | |||
| virtual void saveState() = 0; | |||
| virtual void restoreState() = 0; | |||
| virtual void setColour (const Colour& colour) = 0; | |||
| virtual void setGradient (const ColourGradient& gradient) = 0; | |||
| virtual void setTiledFill (const Image& image, int x, int y) = 0; | |||
| virtual void setFill (const FillType& fillType) = 0; | |||
| virtual void setOpacity (float opacity) = 0; | |||
| virtual void setInterpolationQuality (Graphics::ResamplingQuality quality) = 0; | |||
| @@ -39782,14 +39869,10 @@ public: | |||
| void saveState(); | |||
| void restoreState(); | |||
| void setColour (const Colour& colour); | |||
| void setGradient (const ColourGradient& gradient); | |||
| void setTiledFill (const Image& image, int x, int y); | |||
| void setFill (const FillType& fillType); | |||
| void setOpacity (float opacity); | |||
| void setInterpolationQuality (Graphics::ResamplingQuality quality); | |||
| void fillAll (const bool replaceContents); | |||
| void fillRect (const Rectangle& r, const bool replaceExistingContents); | |||
| void fillPath (const Path& path, const AffineTransform& transform); | |||
| @@ -39848,45 +39931,36 @@ public: | |||
| bool isVectorDevice() const; | |||
| void setOrigin (int x, int y); | |||
| bool reduceClipRegion (int x, int y, int w, int h); | |||
| bool reduceClipRegion (const RectangleList& clipRegion); | |||
| void excludeClipRegion (int x, int y, int w, int h); | |||
| bool clipToRectangle (const Rectangle& r); | |||
| bool clipToRectangleList (const RectangleList& clipRegion); | |||
| void excludeClipRectangle (const Rectangle& r); | |||
| void clipToPath (const Path& path, const AffineTransform& transform); | |||
| void clipToImageAlpha (const Image& sourceImage, const Rectangle& srcClip, const AffineTransform& transform); | |||
| void saveState(); | |||
| void restoreState(); | |||
| bool clipRegionIntersects (int x, int y, int w, int h); | |||
| bool clipRegionIntersects (const Rectangle& r); | |||
| const Rectangle getClipBounds() const; | |||
| bool isClipEmpty() const; | |||
| void setColour (const Colour& colour); | |||
| void setGradient (const ColourGradient& gradient); | |||
| void setFill (const FillType& fillType); | |||
| void setOpacity (float opacity); | |||
| void setInterpolationQuality (Graphics::ResamplingQuality quality); | |||
| void fillRect (int x, int y, int w, int h, const bool replaceExistingContents); | |||
| void fillRect (const Rectangle& r, const bool replaceExistingContents); | |||
| void fillPath (const Path& path, const AffineTransform& transform); | |||
| void fillPathWithImage (const Path& path, const AffineTransform& transform, | |||
| const Image& image, int imageX, int imageY); | |||
| void fillAlphaChannel (const Image& alphaImage, int imageX, int imageY); | |||
| void fillAlphaChannelWithImage (const Image& alphaImage, int alphaImageX, int alphaImageY, | |||
| const Image& fillerImage, int fillerImageX, int fillerImageY); | |||
| void blendImage (const Image& sourceImage, int destX, int destY, int destW, int destH, | |||
| int sourceX, int sourceY); | |||
| void blendImageWarping (const Image& sourceImage, int srcClipX, int srcClipY, int srcClipW, int srcClipH, | |||
| const AffineTransform& transform); | |||
| void drawImage (const Image& sourceImage, const Rectangle& srcClip, | |||
| const AffineTransform& transform, const bool fillEntireClipAsTiles); | |||
| void drawLine (double x1, double y1, double x2, double y2); | |||
| void drawVerticalLine (const int x, double top, double bottom); | |||
| void drawHorizontalLine (const int x, double top, double bottom); | |||
| const Font getFont(); | |||
| void setFont (const Font& newFont); | |||
| void drawGlyph (int glyphNumber, float x, float y); | |||
| void drawGlyph (int glyphNumber, const AffineTransform& transform); | |||
| juce_UseDebuggingNewOperator | |||
| @@ -39894,27 +39968,21 @@ public: | |||
| protected: | |||
| OutputStream& out; | |||
| RectangleList* clip; | |||
| int totalWidth, totalHeight, xOffset, yOffset; | |||
| int totalWidth, totalHeight; | |||
| bool needToClip; | |||
| Colour lastColour, colour; | |||
| ColourGradient* gradient; | |||
| Font font; | |||
| Colour lastColour; | |||
| struct SavedState | |||
| { | |||
| SavedState (RectangleList* const clip, const int xOffset, const int yOffset, | |||
| const Colour& colour, ColourGradient* const gradient, const Font& font); | |||
| SavedState(); | |||
| ~SavedState(); | |||
| RectangleList* clip; | |||
| const int xOffset, yOffset; | |||
| Colour colour; | |||
| ColourGradient* gradient; | |||
| RectangleList clip; | |||
| int xOffset, yOffset; | |||
| FillType fillType; | |||
| Font font; | |||
| private: | |||
| SavedState (const SavedState&); | |||
| const SavedState& operator= (const SavedState&); | |||
| }; | |||
| @@ -41434,33 +41502,33 @@ public: | |||
| /** Returns the current path. */ | |||
| const Path& getPath() const throw() { return path; } | |||
| /** Sets a colour to fill the path with. | |||
| /** Sets a fill type for the path. | |||
| This colour is used to fill the path - if you don't want the path to be | |||
| filled (e.g. if you're just drawing an outline), set this colour to be | |||
| transparent. | |||
| filled (e.g. if you're just drawing an outline), set this to a transparent | |||
| colour. | |||
| @see setPath, setOutlineColour, setFillGradient | |||
| @see setPath, setStrokeFill | |||
| */ | |||
| void setFillColour (const Colour& newColour) throw(); | |||
| void setFill (const FillType& newFill) throw(); | |||
| /** Sets a gradient to use to fill the path. | |||
| /** Returns the current fill type. | |||
| @see setFill | |||
| */ | |||
| void setFillGradient (const ColourGradient& newGradient) throw(); | |||
| const FillType& getFill() const throw() { return mainFill; } | |||
| /** Sets the colour with which the outline will be drawn. | |||
| @see setStrokeGradient | |||
| /** Sets the fill type with which the outline will be drawn. | |||
| @see setFill | |||
| */ | |||
| void setStrokeColour (const Colour& newStrokeColour) throw(); | |||
| void setStrokeFill (const FillType& newStrokeFill) throw(); | |||
| /** Sets a gradient with with the outline will be drawn. | |||
| @see setStrokeColour | |||
| /** Returns the current stroke fill. | |||
| @see setStrokeFill | |||
| */ | |||
| void setStrokeGradient (const ColourGradient& newStrokeGradient) throw(); | |||
| const FillType& getStrokeFill() const throw() { return strokeFill; } | |||
| /** Changes the properties of the outline that will be drawn around the path. | |||
| If the stroke has 0 thickness, no stroke will be drawn. | |||
| @see setStrokeThickness, setStrokeColour | |||
| */ | |||
| void setStrokeType (const PathStrokeType& newStrokeType) throw(); | |||
| @@ -41471,7 +41539,7 @@ public: | |||
| void setStrokeThickness (const float newThickness) throw(); | |||
| /** Returns the current outline style. */ | |||
| const PathStrokeType& getStrokeType() const throw() { return strokeType; } | |||
| const PathStrokeType& getStrokeType() const throw() { return strokeType; } | |||
| /** @internal */ | |||
| void render (const Drawable::RenderingContext& context) const; | |||
| @@ -41493,10 +41561,8 @@ public: | |||
| juce_UseDebuggingNewOperator | |||
| private: | |||
| Path path, outline; | |||
| Colour fillColour, strokeColour; | |||
| ColourGradient* fillGradient; | |||
| ColourGradient* strokeGradient; | |||
| Path path, stroke; | |||
| FillType mainFill, strokeFill; | |||
| PathStrokeType strokeType; | |||
| void updateOutline(); | |||
| @@ -44093,6 +44159,21 @@ public: | |||
| */ | |||
| virtual const String getDescriptionForKeyPress (const KeyPress& key); | |||
| /** A set of colour IDs to use to change the colour of various aspects of the editor. | |||
| These constants can be used either via the Component::setColour(), or LookAndFeel::setColour() | |||
| methods. | |||
| To change the colours of the menu that pops up | |||
| @see Component::setColour, Component::findColour, LookAndFeel::setColour, LookAndFeel::findColour | |||
| */ | |||
| enum ColourIds | |||
| { | |||
| backgroundColourId = 0x100ad00, /**< The background colour to fill the editor background. */ | |||
| textColourId = 0x100ad01, /**< The colour for the text. */ | |||
| }; | |||
| /** @internal */ | |||
| void parentHierarchyChanged(); | |||
| /** @internal */ | |||
| @@ -44116,7 +44197,6 @@ private: | |||
| friend class KeyCategoryTreeViewItem; | |||
| friend class KeyMappingItemComponent; | |||
| friend class KeyMappingChangeButton; | |||
| Colour backgroundColour, textColour; | |||
| TextButton* resetButton; | |||
| void assignNewKey (const CommandID commandID, int index); | |||
| @@ -54872,6 +54952,8 @@ public: | |||
| virtual void drawLevelMeter (Graphics& g, int width, int height, float level); | |||
| virtual void drawKeymapChangeButton (Graphics& g, int width, int height, Button& button, const String& keyDescription); | |||
| /** | |||
| */ | |||
| virtual void playAlertSound(); | |||
| @@ -1521,7 +1521,10 @@ const String AudioUnitPluginFormat::getNameOfPluginFromIdentifier (const String& | |||
| bool AudioUnitPluginFormat::doesPluginStillExist (const PluginDescription& desc) | |||
| { | |||
| return File (desc.fileOrIdentifier).exists(); | |||
| if (desc.fileOrIdentifier.startsWithIgnoreCase (auIdentifierPrefix)) | |||
| return fileMightContainThisPluginType (desc.fileOrIdentifier); | |||
| else | |||
| return File (desc.fileOrIdentifier).exists(); | |||
| } | |||
| const FileSearchPath AudioUnitPluginFormat::getDefaultLocationsToSearch() | |||
| @@ -62,7 +62,7 @@ FileSearchPathListComponent::FileSearchPathListComponent() | |||
| Path arrowPath; | |||
| arrowPath.addArrow (50.0f, 100.0f, 50.0f, 0.0, 40.0f, 100.0f, 50.0f); | |||
| DrawablePath arrowImage; | |||
| arrowImage.setFillColour (Colours::black.withAlpha (0.4f)); | |||
| arrowImage.setFill (Colours::black.withAlpha (0.4f)); | |||
| arrowImage.setPath (arrowPath); | |||
| ((DrawableButton*) upButton)->setImages (&arrowImage); | |||
| @@ -75,7 +75,7 @@ FileSearchPathListComponent::FileSearchPathListComponent() | |||
| Path arrowPath; | |||
| arrowPath.addArrow (50.0f, 0.0f, 50.0f, 100.0f, 40.0f, 100.0f, 50.0f); | |||
| DrawablePath arrowImage; | |||
| arrowImage.setFillColour (Colours::black.withAlpha (0.4f)); | |||
| arrowImage.setFill (Colours::black.withAlpha (0.4f)); | |||
| arrowImage.setPath (arrowPath); | |||
| ((DrawableButton*) downButton)->setImages (&arrowImage); | |||
| @@ -35,6 +35,7 @@ BEGIN_JUCE_NAMESPACE | |||
| #include "juce_KeyMappingEditorComponent.h" | |||
| #include "../menus/juce_PopupMenu.h" | |||
| #include "../windows/juce_AlertWindow.h" | |||
| #include "../lookandfeel/juce_LookAndFeel.h" | |||
| #include "../../../text/juce_LocalisedStrings.h" | |||
| const int maxKeys = 3; | |||
| @@ -67,44 +68,8 @@ public: | |||
| void paintButton (Graphics& g, bool isOver, bool isDown) | |||
| { | |||
| if (keyNum >= 0) | |||
| { | |||
| if (isEnabled()) | |||
| { | |||
| const float alpha = isDown ? 0.3f : (isOver ? 0.15f : 0.08f); | |||
| g.fillAll (owner->textColour.withAlpha (alpha)); | |||
| g.setOpacity (0.3f); | |||
| g.drawBevel (0, 0, getWidth(), getHeight(), 2); | |||
| } | |||
| g.setColour (owner->textColour); | |||
| g.setFont (getHeight() * 0.6f); | |||
| g.drawFittedText (getName(), | |||
| 3, 0, getWidth() - 6, getHeight(), | |||
| Justification::centred, 1); | |||
| } | |||
| else | |||
| { | |||
| const float thickness = 7.0f; | |||
| const float indent = 22.0f; | |||
| Path p; | |||
| p.addEllipse (0.0f, 0.0f, 100.0f, 100.0f); | |||
| p.addRectangle (indent, 50.0f - thickness, 100.0f - indent * 2.0f, thickness * 2.0f); | |||
| p.addRectangle (50.0f - thickness, indent, thickness * 2.0f, 50.0f - indent - thickness); | |||
| p.addRectangle (50.0f - thickness, 50.0f + thickness, thickness * 2.0f, 50.0f - indent - thickness); | |||
| p.setUsingNonZeroWinding (false); | |||
| g.setColour (owner->textColour.withAlpha (isDown ? 0.7f : (isOver ? 0.5f : 0.3f))); | |||
| g.fillPath (p, p.getTransformToScaleToFit (2.0f, 2.0f, getWidth() - 4.0f, getHeight() - 4.0f, true)); | |||
| } | |||
| if (hasKeyboardFocus (false)) | |||
| { | |||
| g.setColour (owner->textColour.withAlpha (0.4f)); | |||
| g.drawRect (0, 0, getWidth(), getHeight()); | |||
| } | |||
| getLookAndFeel().drawKeymapChangeButton (g, getWidth(), getHeight(), *this, | |||
| keyNum >= 0 ? getName() : String::empty); | |||
| } | |||
| void clicked() | |||
| @@ -199,7 +164,7 @@ public: | |||
| void paint (Graphics& g) | |||
| { | |||
| g.setFont (getHeight() * 0.7f); | |||
| g.setColour (owner->textColour); | |||
| g.setColour (findColour (KeyMappingEditorComponent::textColourId)); | |||
| g.drawFittedText (owner->getMappings()->getCommandManager()->getNameOfCommand (commandID), | |||
| 4, 0, jmax (40, getChildComponent (0)->getX() - 5), getHeight(), | |||
| @@ -287,7 +252,7 @@ public: | |||
| void paintItem (Graphics& g, int width, int height) | |||
| { | |||
| g.setFont (height * 0.6f, Font::bold); | |||
| g.setColour (owner->textColour); | |||
| g.setColour (owner->findColour (KeyMappingEditorComponent::textColourId)); | |||
| g.drawText (categoryName, | |||
| 2, 0, width - 2, height, | |||
| @@ -329,8 +294,7 @@ private: | |||
| //============================================================================== | |||
| KeyMappingEditorComponent::KeyMappingEditorComponent (KeyPressMappingSet* const mappingManager, | |||
| const bool showResetToDefaultButton) | |||
| : mappings (mappingManager), | |||
| textColour (Colours::black) | |||
| : mappings (mappingManager) | |||
| { | |||
| jassert (mappingManager != 0); // can't be null! | |||
| @@ -347,7 +311,7 @@ KeyMappingEditorComponent::KeyMappingEditorComponent (KeyPressMappingSet* const | |||
| } | |||
| addAndMakeVisible (tree = new TreeView()); | |||
| tree->setColour (TreeView::backgroundColourId, backgroundColour); | |||
| tree->setColour (TreeView::backgroundColourId, findColour (backgroundColourId)); | |||
| tree->setRootItemVisible (false); | |||
| tree->setDefaultOpenness (true); | |||
| tree->setRootItem (this); | |||
| @@ -371,11 +335,11 @@ const String KeyMappingEditorComponent::getUniqueName() const | |||
| } | |||
| void KeyMappingEditorComponent::setColours (const Colour& mainBackground, | |||
| const Colour& textColour_) | |||
| const Colour& textColour) | |||
| { | |||
| backgroundColour = mainBackground; | |||
| textColour = textColour_; | |||
| tree->setColour (TreeView::backgroundColourId, backgroundColour); | |||
| setColour (backgroundColourId, mainBackground); | |||
| setColour (textColourId, textColour); | |||
| tree->setColour (TreeView::backgroundColourId, mainBackground); | |||
| } | |||
| void KeyMappingEditorComponent::parentHierarchyChanged() | |||
| @@ -99,6 +99,21 @@ public: | |||
| */ | |||
| virtual const String getDescriptionForKeyPress (const KeyPress& key); | |||
| //============================================================================== | |||
| /** A set of colour IDs to use to change the colour of various aspects of the editor. | |||
| These constants can be used either via the Component::setColour(), or LookAndFeel::setColour() | |||
| methods. | |||
| To change the colours of the menu that pops up | |||
| @see Component::setColour, Component::findColour, LookAndFeel::setColour, LookAndFeel::findColour | |||
| */ | |||
| enum ColourIds | |||
| { | |||
| backgroundColourId = 0x100ad00, /**< The background colour to fill the editor background. */ | |||
| textColourId = 0x100ad01, /**< The colour for the text. */ | |||
| }; | |||
| //============================================================================== | |||
| /** @internal */ | |||
| @@ -124,7 +139,6 @@ private: | |||
| friend class KeyCategoryTreeViewItem; | |||
| friend class KeyMappingItemComponent; | |||
| friend class KeyMappingChangeButton; | |||
| Colour backgroundColour, textColour; | |||
| TextButton* resetButton; | |||
| void assignNewKey (const CommandID commandID, int index); | |||
| @@ -46,6 +46,9 @@ KeyPress::KeyPress (const int keyCode_, | |||
| mods (mods_), | |||
| textCharacter (textCharacter_) | |||
| { | |||
| // If you specify an upper-case letter but no shift key, how is the user supposed to press it!? | |||
| // Stick to lower-case letters when defining a keypress, to avoid ambiguity. | |||
| jassert (! (CharacterFunctions::isUpperCase (textCharacter_) && ! mods.isShiftDown())); | |||
| } | |||
| KeyPress::KeyPress (const int keyCode_) throw() | |||
| @@ -49,6 +49,7 @@ BEGIN_JUCE_NAMESPACE | |||
| #include "../controls/juce_ToolbarItemComponent.h" | |||
| #include "../controls/juce_ProgressBar.h" | |||
| #include "../controls/juce_TreeView.h" | |||
| #include "../keyboard/juce_KeyMappingEditorComponent.h" | |||
| #include "../code_editor/juce_CodeEditorComponent.h" | |||
| #include "../filebrowser/juce_FilenameComponent.h" | |||
| #include "../filebrowser/juce_DirectoryContentsDisplayComponent.h" | |||
| @@ -218,6 +219,9 @@ LookAndFeel::LookAndFeel() | |||
| ColourSelector::backgroundColourId, 0xffe5e5e5, | |||
| ColourSelector::labelTextColourId, 0xff000000, | |||
| KeyMappingEditorComponent::backgroundColourId, 0x00000000, | |||
| KeyMappingEditorComponent::textColourId, 0xff000000, | |||
| FileSearchPathListComponent::backgroundColourId, 0xffffffff, | |||
| }; | |||
| @@ -2340,7 +2344,7 @@ Button* LookAndFeel::createTabBarExtrasButton() | |||
| DrawablePath ellipse; | |||
| ellipse.setPath (p); | |||
| ellipse.setFillColour (Colour (0x99ffffff)); | |||
| ellipse.setFill (Colour (0x99ffffff)); | |||
| p.clear(); | |||
| p.addEllipse (0.0f, 0.0f, 100.0f, 100.0f); | |||
| @@ -2351,13 +2355,13 @@ Button* LookAndFeel::createTabBarExtrasButton() | |||
| DrawablePath dp; | |||
| dp.setPath (p); | |||
| dp.setFillColour (Colour (0x59000000)); | |||
| dp.setFill (Colour (0x59000000)); | |||
| DrawableComposite normalImage; | |||
| normalImage.insertDrawable (ellipse); | |||
| normalImage.insertDrawable (dp); | |||
| dp.setFillColour (Colour (0xcc000000)); | |||
| dp.setFill (Colour (0xcc000000)); | |||
| DrawableComposite overImage; | |||
| overImage.insertDrawable (ellipse); | |||
| @@ -2604,7 +2608,7 @@ Button* LookAndFeel::createFileBrowserGoUpButton() | |||
| arrowPath.addArrow (50.0f, 100.0f, 50.0f, 0.0, 40.0f, 100.0f, 50.0f); | |||
| DrawablePath arrowImage; | |||
| arrowImage.setFillColour (Colours::black.withAlpha (0.4f)); | |||
| arrowImage.setFill (Colours::black.withAlpha (0.4f)); | |||
| arrowImage.setPath (arrowPath); | |||
| goUpButton->setImages (&arrowImage); | |||
| @@ -2757,6 +2761,51 @@ void LookAndFeel::drawLevelMeter (Graphics& g, int width, int height, float leve | |||
| } | |||
| } | |||
| //============================================================================== | |||
| void LookAndFeel::drawKeymapChangeButton (Graphics& g, int width, int height, Button& button, const String& keyDescription) | |||
| { | |||
| const Colour textColour (button.findColour (KeyMappingEditorComponent::textColourId, true)); | |||
| if (keyDescription.isNotEmpty()) | |||
| { | |||
| if (button.isEnabled()) | |||
| { | |||
| const float alpha = button.isDown() ? 0.3f : (button.isOver() ? 0.15f : 0.08f); | |||
| g.fillAll (textColour.withAlpha (alpha)); | |||
| g.setOpacity (0.3f); | |||
| g.drawBevel (0, 0, width, height, 2); | |||
| } | |||
| g.setColour (textColour); | |||
| g.setFont (height * 0.6f); | |||
| g.drawFittedText (keyDescription, | |||
| 3, 0, width - 6, height, | |||
| Justification::centred, 1); | |||
| } | |||
| else | |||
| { | |||
| const float thickness = 7.0f; | |||
| const float indent = 22.0f; | |||
| Path p; | |||
| p.addEllipse (0.0f, 0.0f, 100.0f, 100.0f); | |||
| p.addRectangle (indent, 50.0f - thickness, 100.0f - indent * 2.0f, thickness * 2.0f); | |||
| p.addRectangle (50.0f - thickness, indent, thickness * 2.0f, 50.0f - indent - thickness); | |||
| p.addRectangle (50.0f - thickness, 50.0f + thickness, thickness * 2.0f, 50.0f - indent - thickness); | |||
| p.setUsingNonZeroWinding (false); | |||
| g.setColour (textColour.withAlpha (button.isDown() ? 0.7f : (button.isOver() ? 0.5f : 0.3f))); | |||
| g.fillPath (p, p.getTransformToScaleToFit (2.0f, 2.0f, width - 4.0f, height - 4.0f, true)); | |||
| } | |||
| if (button.hasKeyboardFocus (false)) | |||
| { | |||
| g.setColour (textColour.withAlpha (0.4f)); | |||
| g.drawRect (0, 0, width, height); | |||
| } | |||
| } | |||
| //============================================================================== | |||
| static void createRoundedPath (Path& p, | |||
| const float x, const float y, | |||
| @@ -594,6 +594,8 @@ public: | |||
| //============================================================================== | |||
| virtual void drawLevelMeter (Graphics& g, int width, int height, float level); | |||
| virtual void drawKeymapChangeButton (Graphics& g, int width, int height, Button& button, const String& keyDescription); | |||
| //============================================================================== | |||
| /** | |||
| */ | |||
| @@ -557,7 +557,7 @@ Button* OldSchoolLookAndFeel::createDocumentWindowButton (int buttonType) | |||
| DrawableButton* b = new DrawableButton ("minimise", DrawableButton::ImageFitted); | |||
| DrawablePath dp; | |||
| dp.setPath (shape); | |||
| dp.setFillColour (Colours::black.withAlpha (0.3f)); | |||
| dp.setFill (Colours::black.withAlpha (0.3f)); | |||
| b->setImages (&dp); | |||
| return b; | |||
| } | |||
| @@ -569,7 +569,7 @@ Button* OldSchoolLookAndFeel::createDocumentWindowButton (int buttonType) | |||
| DrawableButton* b = new DrawableButton ("maximise", DrawableButton::ImageFitted); | |||
| DrawablePath dp; | |||
| dp.setPath (shape); | |||
| dp.setFillColour (Colours::black.withAlpha (0.3f)); | |||
| dp.setFill (Colours::black.withAlpha (0.3f)); | |||
| b->setImages (&dp); | |||
| return b; | |||
| } | |||
| @@ -138,7 +138,7 @@ const Colour ColourGradient::getColourAtPosition (const float position) const th | |||
| } | |||
| //============================================================================== | |||
| PixelARGB* ColourGradient::createLookupTable (int& numEntries) const throw() | |||
| PixelARGB* ColourGradient::createLookupTable (const AffineTransform& transform, int& numEntries) const throw() | |||
| { | |||
| #ifdef JUCE_DEBUG | |||
| // trying to use the object without setting its co-ordinates? Have a careful read of | |||
| @@ -126,7 +126,7 @@ public: | |||
| The caller must delete the array that is returned using juce_free(). | |||
| */ | |||
| PixelARGB* createLookupTable (int& numEntries) const throw(); | |||
| PixelARGB* createLookupTable (const AffineTransform& transform, int& numEntries) const throw(); | |||
| /** Returns true if all colours are opaque. */ | |||
| bool isOpaque() const throw(); | |||
| @@ -148,9 +148,6 @@ public: | |||
| */ | |||
| bool isRadial; | |||
| /** A transform to apply to the resultant gradient shape */ | |||
| AffineTransform transform; | |||
| //============================================================================== | |||
| juce_UseDebuggingNewOperator | |||
| @@ -0,0 +1,109 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||
| Copyright 2004-9 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. | |||
| ============================================================================== | |||
| */ | |||
| #include "../../../core/juce_StandardHeader.h" | |||
| BEGIN_JUCE_NAMESPACE | |||
| #include "juce_FillType.h" | |||
| //============================================================================== | |||
| FillType::FillType() throw() | |||
| : colour (0xff000000), gradient (0), image (0) | |||
| { | |||
| } | |||
| FillType::FillType (const Colour& colour_) throw() | |||
| : colour (colour_), gradient (0), image (0) | |||
| { | |||
| } | |||
| FillType::FillType (const ColourGradient& gradient) throw() | |||
| : colour (0xff000000), gradient (new ColourGradient (gradient)), image (0) | |||
| { | |||
| } | |||
| FillType::FillType (const Image& image_, const AffineTransform& transform_) throw() | |||
| : colour (0xff000000), gradient (0), | |||
| image (&image_), transform (transform_) | |||
| { | |||
| } | |||
| FillType::FillType (const FillType& other) throw() | |||
| : colour (other.colour), | |||
| gradient (other.gradient != 0 ? new ColourGradient (*other.gradient) : 0), | |||
| image (other.image), transform (other.transform) | |||
| { | |||
| } | |||
| const FillType& FillType::operator= (const FillType& other) throw() | |||
| { | |||
| if (this != &other) | |||
| { | |||
| colour = other.colour; | |||
| delete gradient; | |||
| gradient = (other.gradient != 0 ? new ColourGradient (*other.gradient) : 0); | |||
| image = other.image; | |||
| transform = other.transform; | |||
| } | |||
| return *this; | |||
| } | |||
| FillType::~FillType() throw() | |||
| { | |||
| delete gradient; | |||
| } | |||
| void FillType::setColour (const Colour& newColour) throw() | |||
| { | |||
| deleteAndZero (gradient); | |||
| image = 0; | |||
| colour = newColour; | |||
| } | |||
| void FillType::setGradient (const ColourGradient& newGradient) throw() | |||
| { | |||
| if (gradient != 0) | |||
| { | |||
| *gradient = newGradient; | |||
| } | |||
| else | |||
| { | |||
| image = 0; | |||
| gradient = new ColourGradient (newGradient); | |||
| } | |||
| } | |||
| void FillType::setTiledImage (const Image& image_, const AffineTransform& transform_) throw() | |||
| { | |||
| deleteAndZero (gradient); | |||
| image = &image_; | |||
| transform = transform_; | |||
| } | |||
| END_JUCE_NAMESPACE | |||
| @@ -0,0 +1,116 @@ | |||
| /* | |||
| ============================================================================== | |||
| This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||
| Copyright 2004-9 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_GRAPHICS_JUCEHEADER__x | |||
| #define __JUCE_GRAPHICS_JUCEHEADER__x | |||
| #include "../colour/juce_ColourGradient.h" | |||
| class Image; | |||
| //============================================================================== | |||
| /** | |||
| Represents a colour or fill pattern to use for rendering paths. | |||
| This is used by the Graphics and DrawablePath classes as a way to encapsulate | |||
| a brush type. It can either be a solid colour, a gradient, or a tiled image. | |||
| @see Graphics::setFillType, DrawablePath::setFill | |||
| */ | |||
| class JUCE_API FillType | |||
| { | |||
| public: | |||
| /** Creates a default fill type, of solid black. */ | |||
| FillType() throw(); | |||
| /** Creates a fill type of a solid colour. | |||
| @see setColour | |||
| */ | |||
| FillType (const Colour& colour) throw(); | |||
| /** Creates a gradient fill type. | |||
| @see setGradient | |||
| */ | |||
| FillType (const ColourGradient& gradient) throw(); | |||
| /** Creates a tiled image fill type. The transform allows you to set the scaling, offset | |||
| and rotation of the pattern. | |||
| @see setTiledImage | |||
| */ | |||
| FillType (const Image& image, const AffineTransform& transform) throw(); | |||
| /** Creates a copy of another FillType. */ | |||
| FillType (const FillType& other) throw(); | |||
| /** Makes a copy of another FillType. */ | |||
| const FillType& operator= (const FillType& other) throw(); | |||
| /** Destructor. */ | |||
| ~FillType() throw(); | |||
| /** Returns true if this is a solid colour fill, and not a gradient or image. */ | |||
| bool isColour() const throw() { return gradient == 0 && image == 0; } | |||
| /** Returns true if this is a gradient fill. */ | |||
| bool isGradient() const throw() { return gradient != 0; } | |||
| /** Returns true if this is a tiled image pattern fill. */ | |||
| bool isTiledImage() const throw() { return image != 0; } | |||
| /** Turns this object into a solid colour fill. | |||
| If the object was an image or gradient, those fields will no longer be valid. */ | |||
| void setColour (const Colour& newColour) throw(); | |||
| /** Turns this object into a gradient fill. */ | |||
| void setGradient (const ColourGradient& newGradient) throw(); | |||
| /** Turns this object into a tiled image fill type. The transform allows you to set | |||
| the scaling, offset and rotation of the pattern. | |||
| */ | |||
| void setTiledImage (const Image& image, const AffineTransform& transform) throw(); | |||
| /** Returns the solid colour being used. */ | |||
| Colour colour; | |||
| /** Returns the gradient that should be used for filling. | |||
| This will be zero if the object is some other type of fill. | |||
| */ | |||
| ColourGradient* gradient; | |||
| /** Returns the image that should be used for tiling. | |||
| The FillType object just keeps a pointer to this image, it doesn't own it, so you have to | |||
| be careful to make sure the image doesn't get deleted while it's being used. | |||
| */ | |||
| const Image* image; | |||
| /** The transform that should be applied to the image or gradient that's being drawn. | |||
| */ | |||
| AffineTransform transform; | |||
| juce_UseDebuggingNewOperator | |||
| }; | |||
| #endif // __JUCE_GRAPHICS_JUCEHEADER__ | |||
| @@ -86,7 +86,7 @@ Graphics::~Graphics() throw() | |||
| void Graphics::resetToDefaultState() throw() | |||
| { | |||
| saveStateIfPending(); | |||
| context->setColour (Colours::black); | |||
| context->setFill (FillType()); | |||
| context->setFont (Font()); | |||
| context->setInterpolationQuality (defaultQuality); | |||
| } | |||
| @@ -109,6 +109,20 @@ bool Graphics::reduceClipRegion (const RectangleList& clipRegion) throw() | |||
| return context->clipToRectangleList (clipRegion); | |||
| } | |||
| bool Graphics::reduceClipRegion (const Path& path, const AffineTransform& transform) throw() | |||
| { | |||
| saveStateIfPending(); | |||
| context->clipToPath (path, transform); | |||
| return ! context->isClipEmpty(); | |||
| } | |||
| bool Graphics::reduceClipRegion (const Image& image, const Rectangle& sourceClipRegion, const AffineTransform& transform) throw() | |||
| { | |||
| saveStateIfPending(); | |||
| context->clipToImageAlpha (image, sourceClipRegion, transform); | |||
| return ! context->isClipEmpty(); | |||
| } | |||
| void Graphics::excludeClipRegion (const int x, const int y, | |||
| const int w, const int h) throw() | |||
| { | |||
| @@ -166,7 +180,7 @@ bool Graphics::clipRegionIntersects (const int x, const int y, | |||
| void Graphics::setColour (const Colour& newColour) throw() | |||
| { | |||
| saveStateIfPending(); | |||
| context->setColour (newColour); | |||
| context->setFill (FillType (newColour)); | |||
| } | |||
| void Graphics::setOpacity (const float newOpacity) throw() | |||
| @@ -178,7 +192,7 @@ void Graphics::setOpacity (const float newOpacity) throw() | |||
| void Graphics::setGradientFill (const ColourGradient& gradient) throw() | |||
| { | |||
| saveStateIfPending(); | |||
| context->setGradient (gradient); | |||
| context->setFill (FillType (gradient)); | |||
| } | |||
| void Graphics::setTiledImageFill (const Image& imageToUse, | |||
| @@ -187,10 +201,16 @@ void Graphics::setTiledImageFill (const Image& imageToUse, | |||
| const float opacity) throw() | |||
| { | |||
| saveStateIfPending(); | |||
| context->setTiledFill (imageToUse, anchorX, anchorY); | |||
| context->setFill (FillType (imageToUse, AffineTransform::translation ((float) anchorX, (float) anchorY))); | |||
| context->setOpacity (opacity); | |||
| } | |||
| void Graphics::setFillType (const FillType& newFill) throw() | |||
| { | |||
| saveStateIfPending(); | |||
| context->setFill (newFill); | |||
| } | |||
| //============================================================================== | |||
| void Graphics::setFont (const Font& newFont) throw() | |||
| { | |||
| @@ -345,7 +365,7 @@ void Graphics::fillAll (const Colour& colourToUse) const throw() | |||
| const Rectangle clip (context->getClipBounds()); | |||
| context->saveState(); | |||
| context->setColour (colourToUse); | |||
| context->setFill (FillType (colourToUse)); | |||
| context->fillRect (clip, false); | |||
| context->restoreState(); | |||
| } | |||
| @@ -435,13 +455,13 @@ void Graphics::drawBevel (const int x, | |||
| const float op = useGradient ? ramp * (sharpEdgeOnOutside ? bevelThickness - i : i) | |||
| : oldOpacity; | |||
| context->setColour (topLeftColour.withMultipliedAlpha (op)); | |||
| context->setFill (FillType (topLeftColour.withMultipliedAlpha (op))); | |||
| context->fillRect (Rectangle (x + i, y + i, width - i * 2, 1), false); | |||
| context->setColour (topLeftColour.withMultipliedAlpha (op * 0.75f)); | |||
| context->setFill (FillType (topLeftColour.withMultipliedAlpha (op * 0.75f))); | |||
| context->fillRect (Rectangle (x + i, y + i + 1, 1, height - i * 2 - 2), false); | |||
| context->setColour (bottomRightColour.withMultipliedAlpha (op)); | |||
| context->setFill (FillType (bottomRightColour.withMultipliedAlpha (op))); | |||
| context->fillRect (Rectangle (x + i, y + height - i - 1, width - i * 2, 1), false); | |||
| context->setColour (bottomRightColour.withMultipliedAlpha (op * 0.75f)); | |||
| context->setFill (FillType (bottomRightColour.withMultipliedAlpha (op * 0.75f))); | |||
| context->fillRect (Rectangle (x + width - i - 1, y + i + 1, 1, height - i * 2 - 2), false); | |||
| } | |||
| @@ -557,7 +577,7 @@ void Graphics::fillCheckerBoard (int x, int y, | |||
| if (colour1 == colour2) | |||
| { | |||
| context->setColour (colour1); | |||
| context->setFill (FillType (colour1)); | |||
| context->fillRect (Rectangle (x, y, width, height), false); | |||
| } | |||
| else | |||
| @@ -574,7 +594,7 @@ void Graphics::fillCheckerBoard (int x, int y, | |||
| for (int xx = x; xx < right; xx += checkWidth) | |||
| { | |||
| context->setColour (((cx++ & 1) == 0) ? colour1 : colour2); | |||
| context->setFill (FillType (((cx++ & 1) == 0) ? colour1 : colour2)); | |||
| context->fillRect (Rectangle (xx, y, jmin (checkWidth, right - xx), jmin (checkHeight, bottom - y)), | |||
| false); | |||
| } | |||
| @@ -776,78 +796,5 @@ void Graphics::drawImageTransformed (const Image* const imageToDraw, | |||
| } | |||
| } | |||
| //============================================================================== | |||
| Graphics::FillType::FillType() throw() | |||
| : colour (0xff000000), gradient (0), | |||
| image (0), imageX (0), imageY (0) | |||
| { | |||
| } | |||
| Graphics::FillType::FillType (const Colour& colour_) throw() | |||
| : colour (colour_), gradient (0), | |||
| image (0), imageX (0), imageY (0) | |||
| { | |||
| } | |||
| Graphics::FillType::FillType (const ColourGradient& gradient) throw() | |||
| : colour (0xff000000), gradient (new ColourGradient (gradient)), | |||
| image (0), imageX (0), imageY (0) | |||
| { | |||
| } | |||
| Graphics::FillType::FillType (Image* const image_, const int x, const int y) throw() | |||
| : colour (0xff000000), gradient (0), | |||
| image (image_), imageX (x), imageY (y) | |||
| { | |||
| } | |||
| Graphics::FillType::FillType (const FillType& other) throw() | |||
| : colour (other.colour), | |||
| gradient (other.gradient != 0 ? new ColourGradient (*other.gradient) : 0), | |||
| image (other.image), imageX (other.imageX), imageY (other.imageY) | |||
| { | |||
| } | |||
| const Graphics::FillType& Graphics::FillType::operator= (const FillType& other) throw() | |||
| { | |||
| if (this != &other) | |||
| { | |||
| colour = other.colour; | |||
| delete gradient; | |||
| gradient = (other.gradient != 0 ? new ColourGradient (*other.gradient) : 0); | |||
| image = other.image; | |||
| imageX = other.imageX; | |||
| imageY = other.imageY; | |||
| } | |||
| return *this; | |||
| } | |||
| Graphics::FillType::~FillType() throw() | |||
| { | |||
| delete gradient; | |||
| } | |||
| void Graphics::FillType::setColour (const Colour& newColour) throw() | |||
| { | |||
| deleteAndZero (gradient); | |||
| colour = newColour; | |||
| } | |||
| void Graphics::FillType::setGradient (const ColourGradient& newGradient) throw() | |||
| { | |||
| if (gradient != 0) | |||
| *gradient = newGradient; | |||
| else | |||
| gradient = new ColourGradient (newGradient); | |||
| } | |||
| void Graphics::FillType::setTiledImage (const Image& image_, const int imageX_, const int imageY_) throw() | |||
| { | |||
| deleteAndZero (gradient); | |||
| image = &image_; | |||
| imageX = imageX_; | |||
| imageY = imageY_; | |||
| } | |||
| END_JUCE_NAMESPACE | |||
| @@ -31,7 +31,7 @@ | |||
| #include "../geometry/juce_PathStrokeType.h" | |||
| #include "../geometry/juce_Line.h" | |||
| #include "../colour/juce_Colours.h" | |||
| #include "../colour/juce_ColourGradient.h" | |||
| #include "juce_FillType.h" | |||
| #include "juce_RectanglePlacement.h" | |||
| class LowLevelGraphicsContext; | |||
| class Image; | |||
| @@ -106,6 +106,11 @@ public: | |||
| const int anchorY, | |||
| const float opacity) throw(); | |||
| /** Changes the current fill settings. | |||
| @see setColour, setGradientFill, setTiledImageFill | |||
| */ | |||
| void setFillType (const FillType& newFill) throw(); | |||
| //============================================================================== | |||
| /** Changes the font to use for subsequent text-drawing functions. | |||
| @@ -622,7 +627,7 @@ public: | |||
| /** Intersects the current clipping region with another region. | |||
| @returns true if the resulting clipping region is non-zero in size | |||
| @see setOrigin, clipRegionIntersects, getClipLeft, getClipRight, getClipWidth, getClipHeight | |||
| @see setOrigin, clipRegionIntersects | |||
| */ | |||
| bool reduceClipRegion (const int x, const int y, | |||
| const int width, const int height) throw(); | |||
| @@ -630,10 +635,34 @@ public: | |||
| /** Intersects the current clipping region with a rectangle list region. | |||
| @returns true if the resulting clipping region is non-zero in size | |||
| @see setOrigin, clipRegionIntersects, getClipLeft, getClipRight, getClipWidth, getClipHeight | |||
| @see setOrigin, clipRegionIntersects | |||
| */ | |||
| bool reduceClipRegion (const RectangleList& clipRegion) throw(); | |||
| /** Intersects the current clipping region with a path. | |||
| @returns true if the resulting clipping region is non-zero in size | |||
| @see reduceClipRegion | |||
| */ | |||
| bool reduceClipRegion (const Path& path, const AffineTransform& transform = AffineTransform::identity) throw(); | |||
| /** Intersects the current clipping region with an image's alpha-channel. | |||
| The current clipping path is intersected with the area covered by this image's | |||
| alpha-channel, after the image has been transformed by the specified matrix. | |||
| @param image the image whose alpha-channel should be used. If the image doesn't | |||
| have an alpha-channel, it is treated as entirely opaque. | |||
| @param sourceClipRegion a subsection of the image that should be used. To use the | |||
| entire image, just pass a rectangle of bounds | |||
| (0, 0, image.getWidth(), image.getHeight()). | |||
| @param transform a matrix to apply to the image | |||
| @returns true if the resulting clipping region is non-zero in size | |||
| @see reduceClipRegion | |||
| */ | |||
| bool reduceClipRegion (const Image& image, const Rectangle& sourceClipRegion, | |||
| const AffineTransform& transform) throw(); | |||
| /** Excludes a rectangle to stop it being drawn into. */ | |||
| void excludeClipRegion (const int x, const int y, | |||
| const int width, const int height) throw(); | |||
| @@ -684,34 +713,6 @@ public: | |||
| /** @internal */ | |||
| LowLevelGraphicsContext* getInternalContext() const throw() { return context; } | |||
| //============================================================================== | |||
| class FillType | |||
| { | |||
| public: | |||
| FillType() throw(); | |||
| FillType (const Colour& colour) throw(); | |||
| FillType (const ColourGradient& gradient) throw(); | |||
| FillType (Image* const image, const int x, const int y) throw(); | |||
| FillType (const FillType& other) throw(); | |||
| const FillType& operator= (const FillType& other) throw(); | |||
| ~FillType() throw(); | |||
| bool isColour() const throw() { return gradient == 0 && image == 0; } | |||
| bool isGradient() const throw() { return gradient != 0; } | |||
| bool isTiledImage() const throw() { return image != 0; } | |||
| void setColour (const Colour& newColour) throw(); | |||
| void setGradient (const ColourGradient& newGradient) throw(); | |||
| void setTiledImage (const Image& image, const int imageX, const int imageY) throw(); | |||
| Colour colour; | |||
| ColourGradient* gradient; | |||
| const Image* image; | |||
| int imageX, imageY; | |||
| juce_UseDebuggingNewOperator | |||
| }; | |||
| private: | |||
| //============================================================================== | |||
| LowLevelGraphicsContext* const context; | |||
| @@ -80,9 +80,7 @@ public: | |||
| virtual void restoreState() = 0; | |||
| //============================================================================== | |||
| virtual void setColour (const Colour& colour) = 0; | |||
| virtual void setGradient (const ColourGradient& gradient) = 0; | |||
| virtual void setTiledFill (const Image& image, int x, int y) = 0; | |||
| virtual void setFill (const FillType& fillType) = 0; | |||
| virtual void setOpacity (float opacity) = 0; | |||
| virtual void setInterpolationQuality (Graphics::ResamplingQuality quality) = 0; | |||
| @@ -59,13 +59,10 @@ LowLevelGraphicsPostScriptRenderer::LowLevelGraphicsPostScriptRenderer (OutputSt | |||
| : out (resultingPostScript), | |||
| totalWidth (totalWidth_), | |||
| totalHeight (totalHeight_), | |||
| xOffset (0), | |||
| yOffset (0), | |||
| needToClip (true), | |||
| colour (Colours::black), | |||
| gradient (0) | |||
| needToClip (true) | |||
| { | |||
| clip = new RectangleList (Rectangle (0, 0, totalWidth_, totalHeight_)); | |||
| stateStack.add (new SavedState()); | |||
| stateStack.getLast()->clip = Rectangle (0, 0, totalWidth_, totalHeight_); | |||
| const float scale = jmin ((520.0f / totalWidth_), (750.0f / totalHeight)); | |||
| @@ -102,8 +99,6 @@ LowLevelGraphicsPostScriptRenderer::LowLevelGraphicsPostScriptRenderer (OutputSt | |||
| LowLevelGraphicsPostScriptRenderer::~LowLevelGraphicsPostScriptRenderer() | |||
| { | |||
| delete clip; | |||
| delete gradient; | |||
| } | |||
| //============================================================================== | |||
| @@ -116,91 +111,84 @@ void LowLevelGraphicsPostScriptRenderer::setOrigin (int x, int y) | |||
| { | |||
| if (x != 0 || y != 0) | |||
| { | |||
| xOffset += x; | |||
| yOffset += y; | |||
| stateStack.getLast()->xOffset += x; | |||
| stateStack.getLast()->yOffset += y; | |||
| needToClip = true; | |||
| } | |||
| } | |||
| bool LowLevelGraphicsPostScriptRenderer::reduceClipRegion (int x, int y, int w, int h) | |||
| bool LowLevelGraphicsPostScriptRenderer::clipToRectangle (const Rectangle& r) | |||
| { | |||
| needToClip = true; | |||
| return clip->clipTo (Rectangle (x + xOffset, y + yOffset, w, h)); | |||
| return stateStack.getLast()->clip.clipTo (r.translated (stateStack.getLast()->xOffset, stateStack.getLast()->yOffset)); | |||
| } | |||
| bool LowLevelGraphicsPostScriptRenderer::reduceClipRegion (const RectangleList& clipRegion) | |||
| bool LowLevelGraphicsPostScriptRenderer::clipToRectangleList (const RectangleList& clipRegion) | |||
| { | |||
| needToClip = true; | |||
| return clip->clipTo (clipRegion); | |||
| return stateStack.getLast()->clip.clipTo (clipRegion); | |||
| } | |||
| void LowLevelGraphicsPostScriptRenderer::excludeClipRegion (int x, int y, int w, int h) | |||
| void LowLevelGraphicsPostScriptRenderer::excludeClipRectangle (const Rectangle& r) | |||
| { | |||
| needToClip = true; | |||
| clip->subtract (Rectangle (x + xOffset, y + yOffset, w, h)); | |||
| stateStack.getLast()->clip.subtract (r.translated (stateStack.getLast()->xOffset, stateStack.getLast()->yOffset)); | |||
| } | |||
| bool LowLevelGraphicsPostScriptRenderer::clipRegionIntersects (int x, int y, int w, int h) | |||
| void LowLevelGraphicsPostScriptRenderer::clipToPath (const Path& path, const AffineTransform& transform) | |||
| { | |||
| return clip->intersectsRectangle (Rectangle (x + xOffset, y + yOffset, w, h)); | |||
| writeClip(); | |||
| Path p (path); | |||
| p.applyTransform (transform.translated ((float) stateStack.getLast()->xOffset, (float) stateStack.getLast()->yOffset)); | |||
| writePath (p); | |||
| out << "clip\n"; | |||
| } | |||
| void LowLevelGraphicsPostScriptRenderer::clipToImageAlpha (const Image& sourceImage, const Rectangle& srcClip, const AffineTransform& transform) | |||
| { | |||
| needToClip = true; | |||
| jassertfalse // xxx | |||
| } | |||
| bool LowLevelGraphicsPostScriptRenderer::clipRegionIntersects (const Rectangle& r) | |||
| { | |||
| return stateStack.getLast()->clip.intersectsRectangle (r.translated (stateStack.getLast()->xOffset, stateStack.getLast()->yOffset)); | |||
| } | |||
| const Rectangle LowLevelGraphicsPostScriptRenderer::getClipBounds() const | |||
| { | |||
| return clip->getBounds().translated (-xOffset, -yOffset); | |||
| return stateStack.getLast()->clip.getBounds().translated (-stateStack.getLast()->xOffset, | |||
| -stateStack.getLast()->yOffset); | |||
| } | |||
| bool LowLevelGraphicsPostScriptRenderer::isClipEmpty() const | |||
| { | |||
| return clip->isEmpty(); | |||
| return stateStack.getLast()->clip.isEmpty(); | |||
| } | |||
| //============================================================================== | |||
| LowLevelGraphicsPostScriptRenderer::SavedState::SavedState (RectangleList* const clip_, | |||
| const int xOffset_, const int yOffset_, | |||
| const Colour& colour_, ColourGradient* const gradient_, | |||
| const Font& font_) | |||
| : clip (clip_), | |||
| xOffset (xOffset_), | |||
| yOffset (yOffset_), | |||
| colour (colour_), | |||
| gradient (gradient_), | |||
| font (font_) | |||
| LowLevelGraphicsPostScriptRenderer::SavedState::SavedState() | |||
| : xOffset (0), | |||
| yOffset (0) | |||
| { | |||
| } | |||
| LowLevelGraphicsPostScriptRenderer::SavedState::~SavedState() | |||
| { | |||
| delete clip; | |||
| delete gradient; | |||
| } | |||
| void LowLevelGraphicsPostScriptRenderer::saveState() | |||
| { | |||
| stateStack.add (new SavedState (new RectangleList (*clip), xOffset, yOffset, colour, | |||
| gradient != 0 ? new ColourGradient (*gradient) : 0, font)); | |||
| stateStack.add (new SavedState (*stateStack.getLast())); | |||
| } | |||
| void LowLevelGraphicsPostScriptRenderer::restoreState() | |||
| { | |||
| SavedState* const top = stateStack.getLast(); | |||
| if (top != 0) | |||
| { | |||
| swapVariables (clip, top->clip); | |||
| swapVariables (gradient, top->gradient); | |||
| colour = top->colour; | |||
| xOffset = top->xOffset; | |||
| yOffset = top->yOffset; | |||
| font = top->font; | |||
| jassert (stateStack.size() > 0); | |||
| if (stateStack.size() > 0) | |||
| stateStack.removeLast(); | |||
| needToClip = true; | |||
| } | |||
| else | |||
| { | |||
| jassertfalse // trying to pop with an empty stack! | |||
| } | |||
| } | |||
| //============================================================================== | |||
| @@ -214,7 +202,7 @@ void LowLevelGraphicsPostScriptRenderer::writeClip() | |||
| int itemsOnLine = 0; | |||
| for (RectangleList::Iterator i (*clip); i.next();) | |||
| for (RectangleList::Iterator i (stateStack.getLast()->clip); i.next();) | |||
| { | |||
| if (++itemsOnLine == 6) | |||
| { | |||
| @@ -336,16 +324,9 @@ void LowLevelGraphicsPostScriptRenderer::writeTransform (const AffineTransform& | |||
| } | |||
| //============================================================================== | |||
| void LowLevelGraphicsPostScriptRenderer::setColour (const Colour& colour_) | |||
| { | |||
| colour = colour_; | |||
| deleteAndZero (gradient); | |||
| } | |||
| void LowLevelGraphicsPostScriptRenderer::setGradient (const ColourGradient& gradient_) | |||
| void LowLevelGraphicsPostScriptRenderer::setFill (const FillType& fillType) | |||
| { | |||
| delete gradient; | |||
| gradient = new ColourGradient (gradient_); | |||
| stateStack.getLast()->fillType = fillType; | |||
| } | |||
| void LowLevelGraphicsPostScriptRenderer::setOpacity (float opacity) | |||
| @@ -357,22 +338,21 @@ void LowLevelGraphicsPostScriptRenderer::setInterpolationQuality (Graphics::Resa | |||
| } | |||
| //============================================================================== | |||
| void LowLevelGraphicsPostScriptRenderer::fillRect (int x, int y, int w, int h, const bool /*replaceExistingContents*/) | |||
| void LowLevelGraphicsPostScriptRenderer::fillRect (const Rectangle& r, const bool /*replaceExistingContents*/) | |||
| { | |||
| if (gradient == 0) | |||
| if (stateStack.getLast()->fillType.isColour()) | |||
| { | |||
| writeClip(); | |||
| writeColour (colour); | |||
| writeColour (stateStack.getLast()->fillType.colour); | |||
| x += xOffset; | |||
| y += yOffset; | |||
| Rectangle r2 (r.translated (stateStack.getLast()->xOffset, stateStack.getLast()->yOffset)); | |||
| out << x << ' ' << -(y + h) << ' ' << w << ' ' << h << " rectfill\n"; | |||
| out << r2.getX() << ' ' << -r2.getBottom() << ' ' << r2.getWidth() << ' ' << r2.getHeight() << " rectfill\n"; | |||
| } | |||
| else | |||
| { | |||
| Path p; | |||
| p.addRectangle ((float) x, (float) y, (float) w, (float) h); | |||
| p.addRectangle (r); | |||
| fillPath (p, AffineTransform::identity); | |||
| } | |||
| @@ -381,19 +361,20 @@ void LowLevelGraphicsPostScriptRenderer::fillRect (int x, int y, int w, int h, c | |||
| //============================================================================== | |||
| void LowLevelGraphicsPostScriptRenderer::fillPath (const Path& path, const AffineTransform& t) | |||
| { | |||
| if (gradient == 0) | |||
| if (stateStack.getLast()->fillType.isColour()) | |||
| { | |||
| writeClip(); | |||
| Path p (path); | |||
| p.applyTransform (t.translated ((float) xOffset, (float) yOffset)); | |||
| p.applyTransform (t.translated ((float) stateStack.getLast()->xOffset, | |||
| (float) stateStack.getLast()->yOffset)); | |||
| writePath (p); | |||
| writeColour (colour); | |||
| writeColour (stateStack.getLast()->fillType.colour); | |||
| out << "fill\n"; | |||
| } | |||
| else | |||
| else if (stateStack.getLast()->fillType.isGradient()) | |||
| { | |||
| // this doesn't work correctly yet - it could be improved to handle solid gradients, but | |||
| // postscript can't do semi-transparent ones. | |||
| @@ -404,78 +385,22 @@ void LowLevelGraphicsPostScriptRenderer::fillPath (const Path& path, const Affin | |||
| { | |||
| Path p (path); | |||
| p.applyTransform (t.translated ((float) xOffset, (float) yOffset)); | |||
| p.applyTransform (t.translated ((float) stateStack.getLast()->xOffset, (float) stateStack.getLast()->yOffset)); | |||
| writePath (p); | |||
| out << "clip\n"; | |||
| } | |||
| const Rectangle bounds (clip->getBounds()); | |||
| const Rectangle bounds (stateStack.getLast()->clip.getBounds()); | |||
| // ideally this would draw lots of lines or ellipses to approximate the gradient, but for the | |||
| // time-being, this just fills it with the average colour.. | |||
| writeColour (gradient->getColourAtPosition (0.5)); | |||
| writeColour (stateStack.getLast()->fillType.gradient->getColourAtPosition (0.5)); | |||
| out << bounds.getX() << ' ' << -bounds.getBottom() << ' ' << bounds.getWidth() << ' ' << bounds.getHeight() << " rectfill\n"; | |||
| out << "grestore\n"; | |||
| } | |||
| } | |||
| void LowLevelGraphicsPostScriptRenderer::fillPathWithImage (const Path& path, const AffineTransform& transform, | |||
| const Image& sourceImage, | |||
| int imageX, int imageY) | |||
| { | |||
| writeClip(); | |||
| out << "gsave "; | |||
| Path p (path); | |||
| p.applyTransform (transform.translated ((float) xOffset, (float) yOffset)); | |||
| writePath (p); | |||
| out << "clip\n"; | |||
| blendImage (sourceImage, imageX, imageY, sourceImage.getWidth(), sourceImage.getHeight(), 0, 0); | |||
| out << "grestore\n"; | |||
| } | |||
| //============================================================================== | |||
| void LowLevelGraphicsPostScriptRenderer::fillAlphaChannel (const Image& /*clipImage*/, int x, int y) | |||
| { | |||
| x += xOffset; | |||
| y += yOffset; | |||
| writeClip(); | |||
| if (gradient == 0) | |||
| { | |||
| writeColour (colour); | |||
| } | |||
| notPossibleInPostscriptAssert // you can disable this warning by setting the WARN_ABOUT_NON_POSTSCRIPT_OPERATIONS flag at the top of this file | |||
| } | |||
| void LowLevelGraphicsPostScriptRenderer::fillAlphaChannelWithImage (const Image& /*alphaImage*/, int alphaImageX, int alphaImageY, | |||
| const Image& /*fillerImage*/, int fillerImageX, int fillerImageY) | |||
| { | |||
| alphaImageX += xOffset; | |||
| alphaImageY += yOffset; | |||
| fillerImageX += xOffset; | |||
| fillerImageY += yOffset; | |||
| writeClip(); | |||
| notPossibleInPostscriptAssert // you can disable this warning by setting the WARN_ABOUT_NON_POSTSCRIPT_OPERATIONS flag at the top of this file | |||
| } | |||
| //============================================================================== | |||
| void LowLevelGraphicsPostScriptRenderer::blendImage (const Image& sourceImage, int dx, int dy, int dw, int dh, int sx, int sy) | |||
| { | |||
| blendImageWarping (sourceImage, | |||
| sx, sy, dw, dh, | |||
| AffineTransform::translation ((float) dx, (float) dy)); | |||
| } | |||
| //============================================================================== | |||
| void LowLevelGraphicsPostScriptRenderer::writeImage (const Image& im, | |||
| const int sx, const int sy, | |||
| @@ -535,23 +460,21 @@ void LowLevelGraphicsPostScriptRenderer::writeImage (const Image& im, | |||
| out << "\n>}\n"; | |||
| } | |||
| void LowLevelGraphicsPostScriptRenderer::blendImageWarping (const Image& sourceImage, | |||
| int srcClipX, int srcClipY, | |||
| int srcClipW, int srcClipH, | |||
| const AffineTransform& t) | |||
| void LowLevelGraphicsPostScriptRenderer::drawImage (const Image& sourceImage, const Rectangle& srcClip, | |||
| const AffineTransform& transform, const bool fillEntireClipAsTiles) | |||
| { | |||
| const int w = jmin (sourceImage.getWidth(), srcClipX + srcClipW); | |||
| const int h = jmin (sourceImage.getHeight(), srcClipY + srcClipH); | |||
| const int w = jmin (sourceImage.getWidth(), srcClip.getRight()); | |||
| const int h = jmin (sourceImage.getHeight(), srcClip.getBottom()); | |||
| writeClip(); | |||
| out << "gsave "; | |||
| writeTransform (t.translated ((float) xOffset, (float) yOffset) | |||
| .scaled (1.0f, -1.0f)); | |||
| writeTransform (transform.translated ((float) stateStack.getLast()->xOffset, (float) stateStack.getLast()->yOffset) | |||
| .scaled (1.0f, -1.0f)); | |||
| RectangleList imageClip; | |||
| sourceImage.createSolidAreaMask (imageClip, 0.5f); | |||
| imageClip.clipTo (Rectangle (srcClipX, srcClipY, srcClipW, srcClipH)); | |||
| imageClip.clipTo (srcClip); | |||
| out << "newpath "; | |||
| int itemsOnLine = 0; | |||
| @@ -574,7 +497,7 @@ void LowLevelGraphicsPostScriptRenderer::blendImageWarping (const Image& sourceI | |||
| out << w << ' ' << h << " scale\n"; | |||
| out << w << ' ' << h << " 8 [" << w << " 0 0 -" << h << ' ' << (int) 0 << ' ' << h << " ]\n"; | |||
| writeImage (sourceImage, srcClipX, srcClipY, srcClipW, srcClipH); | |||
| writeImage (sourceImage, srcClip.getX(), srcClip.getY(), srcClip.getWidth(), srcClip.getHeight()); | |||
| out << "false 3 colorimage grestore\n"; | |||
| needToClip = true; | |||
| @@ -603,19 +526,19 @@ void LowLevelGraphicsPostScriptRenderer::drawHorizontalLine (const int y, double | |||
| //============================================================================== | |||
| void LowLevelGraphicsPostScriptRenderer::setFont (const Font& newFont) | |||
| { | |||
| font = newFont; | |||
| stateStack.getLast()->font = newFont; | |||
| } | |||
| void LowLevelGraphicsPostScriptRenderer::drawGlyph (int glyphNumber, float x, float y) | |||
| const Font LowLevelGraphicsPostScriptRenderer::getFont() | |||
| { | |||
| drawGlyph (glyphNumber, AffineTransform::translation (x, y)); | |||
| return stateStack.getLast()->font; | |||
| } | |||
| void LowLevelGraphicsPostScriptRenderer::drawGlyph (int glyphNumber, const AffineTransform& transform) | |||
| { | |||
| Path p; | |||
| Font& font = stateStack.getLast()->font; | |||
| font.getTypeface()->getOutlineForGlyph (glyphNumber, p); | |||
| fillPath (p, AffineTransform::scale (font.getHeight() * font.getHorizontalScale(), font.getHeight()).followedBy (transform)); | |||
| } | |||
| @@ -50,50 +50,39 @@ public: | |||
| bool isVectorDevice() const; | |||
| void setOrigin (int x, int y); | |||
| bool reduceClipRegion (int x, int y, int w, int h); | |||
| bool reduceClipRegion (const RectangleList& clipRegion); | |||
| void excludeClipRegion (int x, int y, int w, int h); | |||
| bool clipToRectangle (const Rectangle& r); | |||
| bool clipToRectangleList (const RectangleList& clipRegion); | |||
| void excludeClipRectangle (const Rectangle& r); | |||
| void clipToPath (const Path& path, const AffineTransform& transform); | |||
| void clipToImageAlpha (const Image& sourceImage, const Rectangle& srcClip, const AffineTransform& transform); | |||
| void saveState(); | |||
| void restoreState(); | |||
| bool clipRegionIntersects (int x, int y, int w, int h); | |||
| bool clipRegionIntersects (const Rectangle& r); | |||
| const Rectangle getClipBounds() const; | |||
| bool isClipEmpty() const; | |||
| //============================================================================== | |||
| void setColour (const Colour& colour); | |||
| void setGradient (const ColourGradient& gradient); | |||
| void setFill (const FillType& fillType); | |||
| void setOpacity (float opacity); | |||
| void setInterpolationQuality (Graphics::ResamplingQuality quality); | |||
| //============================================================================== | |||
| void fillRect (int x, int y, int w, int h, const bool replaceExistingContents); | |||
| void fillRect (const Rectangle& r, const bool replaceExistingContents); | |||
| void fillPath (const Path& path, const AffineTransform& transform); | |||
| void fillPathWithImage (const Path& path, const AffineTransform& transform, | |||
| const Image& image, int imageX, int imageY); | |||
| void drawImage (const Image& sourceImage, const Rectangle& srcClip, | |||
| const AffineTransform& transform, const bool fillEntireClipAsTiles); | |||
| void fillAlphaChannel (const Image& alphaImage, int imageX, int imageY); | |||
| void fillAlphaChannelWithImage (const Image& alphaImage, int alphaImageX, int alphaImageY, | |||
| const Image& fillerImage, int fillerImageX, int fillerImageY); | |||
| //============================================================================== | |||
| void blendImage (const Image& sourceImage, int destX, int destY, int destW, int destH, | |||
| int sourceX, int sourceY); | |||
| void blendImageWarping (const Image& sourceImage, int srcClipX, int srcClipY, int srcClipW, int srcClipH, | |||
| const AffineTransform& transform); | |||
| //============================================================================== | |||
| void drawLine (double x1, double y1, double x2, double y2); | |||
| void drawVerticalLine (const int x, double top, double bottom); | |||
| void drawHorizontalLine (const int x, double top, double bottom); | |||
| //============================================================================== | |||
| const Font getFont(); | |||
| void setFont (const Font& newFont); | |||
| void drawGlyph (int glyphNumber, float x, float y); | |||
| void drawGlyph (int glyphNumber, const AffineTransform& transform); | |||
| //============================================================================== | |||
| @@ -102,27 +91,21 @@ public: | |||
| protected: | |||
| //============================================================================== | |||
| OutputStream& out; | |||
| RectangleList* clip; | |||
| int totalWidth, totalHeight, xOffset, yOffset; | |||
| int totalWidth, totalHeight; | |||
| bool needToClip; | |||
| Colour lastColour, colour; | |||
| ColourGradient* gradient; | |||
| Font font; | |||
| Colour lastColour; | |||
| struct SavedState | |||
| { | |||
| SavedState (RectangleList* const clip, const int xOffset, const int yOffset, | |||
| const Colour& colour, ColourGradient* const gradient, const Font& font); | |||
| SavedState(); | |||
| ~SavedState(); | |||
| RectangleList* clip; | |||
| const int xOffset, yOffset; | |||
| Colour colour; | |||
| ColourGradient* gradient; | |||
| RectangleList clip; | |||
| int xOffset, yOffset; | |||
| FillType fillType; | |||
| Font font; | |||
| private: | |||
| SavedState (const SavedState&); | |||
| const SavedState& operator= (const SavedState&); | |||
| }; | |||
| @@ -109,7 +109,6 @@ private: | |||
| { | |||
| dest->blend (colour); | |||
| ++dest; | |||
| } while (--width > 0); | |||
| } | |||
| @@ -173,7 +172,7 @@ private: | |||
| class LinearGradientPixelGenerator | |||
| { | |||
| public: | |||
| LinearGradientPixelGenerator (const ColourGradient& gradient, const PixelARGB* const lookupTable_, const int numEntries_) | |||
| LinearGradientPixelGenerator (const ColourGradient& gradient, const AffineTransform& transform, const PixelARGB* const lookupTable_, const int numEntries_) | |||
| : lookupTable (lookupTable_), numEntries (numEntries_) | |||
| { | |||
| jassert (numEntries_ >= 0); | |||
| @@ -182,16 +181,16 @@ public: | |||
| float x2 = gradient.x2; | |||
| float y2 = gradient.y2; | |||
| if (! gradient.transform.isIdentity()) | |||
| if (! transform.isIdentity()) | |||
| { | |||
| const Line l (x2, y2, x1, y1); | |||
| const Point p3 = l.getPointAlongLine (0.0, 100.0f); | |||
| float x3 = p3.getX(); | |||
| float y3 = p3.getY(); | |||
| gradient.transform.transformPoint (x1, y1); | |||
| gradient.transform.transformPoint (x2, y2); | |||
| gradient.transform.transformPoint (x3, y3); | |||
| transform.transformPoint (x1, y1); | |||
| transform.transformPoint (x2, y2); | |||
| transform.transformPoint (x3, y3); | |||
| const Line l2 (x2, y2, x3, y3); | |||
| const float prop = l2.findNearestPointTo (x1, y1); | |||
| @@ -254,7 +253,7 @@ private: | |||
| class RadialGradientPixelGenerator | |||
| { | |||
| public: | |||
| RadialGradientPixelGenerator (const ColourGradient& gradient, | |||
| RadialGradientPixelGenerator (const ColourGradient& gradient, const AffineTransform&, | |||
| const PixelARGB* const lookupTable_, const int numEntries_) throw() | |||
| : lookupTable (lookupTable_), | |||
| numEntries (numEntries_), | |||
| @@ -298,10 +297,10 @@ protected: | |||
| class TransformedRadialGradientPixelGenerator : public RadialGradientPixelGenerator | |||
| { | |||
| public: | |||
| TransformedRadialGradientPixelGenerator (const ColourGradient& gradient, | |||
| TransformedRadialGradientPixelGenerator (const ColourGradient& gradient, const AffineTransform& transform, | |||
| const PixelARGB* const lookupTable_, const int numEntries_) throw() | |||
| : RadialGradientPixelGenerator (gradient, lookupTable_, numEntries_), | |||
| inverseTransform (gradient.transform.inverted()) | |||
| : RadialGradientPixelGenerator (gradient, transform, lookupTable_, numEntries_), | |||
| inverseTransform (transform.inverted()) | |||
| { | |||
| tM10 = inverseTransform.mat10; | |||
| tM00 = inverseTransform.mat00; | |||
| @@ -340,9 +339,9 @@ template <class PixelType, class GradientType> | |||
| class GradientEdgeTableRenderer : public GradientType | |||
| { | |||
| public: | |||
| GradientEdgeTableRenderer (const Image::BitmapData& destData_, const ColourGradient& gradient, | |||
| GradientEdgeTableRenderer (const Image::BitmapData& destData_, const ColourGradient& gradient, const AffineTransform& transform, | |||
| const PixelARGB* const lookupTable, const int numEntries) throw() | |||
| : GradientType (gradient, lookupTable, numEntries - 1), | |||
| : GradientType (gradient, transform, lookupTable, numEntries - 1), | |||
| destData (destData_) | |||
| { | |||
| } | |||
| @@ -367,7 +366,6 @@ public: | |||
| do | |||
| { | |||
| (dest++)->blend (GradientType::getPixel (x++), alphaLevel); | |||
| } while (--width > 0); | |||
| } | |||
| else | |||
| @@ -375,7 +373,6 @@ public: | |||
| do | |||
| { | |||
| (dest++)->blend (GradientType::getPixel (x++)); | |||
| } while (--width > 0); | |||
| } | |||
| } | |||
| @@ -490,7 +487,6 @@ private: | |||
| do | |||
| { | |||
| dest++ ->blend (*src++); | |||
| } while (--width > 0); | |||
| } | |||
| @@ -886,7 +882,7 @@ class LLGCSavedState | |||
| { | |||
| public: | |||
| LLGCSavedState (const Rectangle& clip_, const int xOffset_, const int yOffset_, | |||
| const Font& font_, const Graphics::FillType& fillType_, | |||
| const Font& font_, const FillType& fillType_, | |||
| const Graphics::ResamplingQuality interpolationQuality_) throw() | |||
| : edgeTable (new EdgeTableHolder (EdgeTable (clip_))), | |||
| xOffset (xOffset_), yOffset (yOffset_), | |||
| @@ -909,15 +905,17 @@ public: | |||
| bool clipToRectangle (const Rectangle& r) throw() | |||
| { | |||
| dupeEdgeTableIfMultiplyReferenced(); | |||
| edgeTable->edgeTable.clipToRectangle (r); | |||
| edgeTable->edgeTable.clipToRectangle (r.translated (xOffset, yOffset)); | |||
| return ! edgeTable->edgeTable.isEmpty(); | |||
| } | |||
| bool clipToRectangleList (const RectangleList& r) throw() | |||
| { | |||
| dupeEdgeTableIfMultiplyReferenced(); | |||
| RectangleList temp (r); | |||
| temp.offsetAll (xOffset, yOffset); | |||
| RectangleList totalArea (edgeTable->edgeTable.getMaximumBounds()); | |||
| totalArea.subtract (r); | |||
| totalArea.subtract (temp); | |||
| for (RectangleList::Iterator i (totalArea); i.next();) | |||
| edgeTable->edgeTable.excludeRectangle (*i.getRectangle()); | |||
| @@ -928,14 +926,14 @@ public: | |||
| bool excludeClipRectangle (const Rectangle& r) throw() | |||
| { | |||
| dupeEdgeTableIfMultiplyReferenced(); | |||
| edgeTable->edgeTable.excludeRectangle (r); | |||
| edgeTable->edgeTable.excludeRectangle (r.translated (xOffset, yOffset)); | |||
| return ! edgeTable->edgeTable.isEmpty(); | |||
| } | |||
| void clipToPath (const Path& p, const AffineTransform& transform) throw() | |||
| { | |||
| dupeEdgeTableIfMultiplyReferenced(); | |||
| EdgeTable et (edgeTable->edgeTable.getMaximumBounds(), p, transform); | |||
| EdgeTable et (edgeTable->edgeTable.getMaximumBounds(), p, transform.translated ((float) xOffset, (float) yOffset)); | |||
| edgeTable->edgeTable.clipToEdgeTable (et); | |||
| } | |||
| @@ -951,33 +949,26 @@ public: | |||
| jassert (! replaceContents); // that option is just for solid colours | |||
| ColourGradient g2 (*(fillType.gradient)); | |||
| const bool isIdentity = g2.transform.isOnlyTranslation(); | |||
| AffineTransform transform (fillType.transform.translated ((float) xOffset, (float) yOffset)); | |||
| const bool isIdentity = transform.isOnlyTranslation(); | |||
| if (isIdentity) | |||
| { | |||
| // If our translation doesn't involve any distortion, we can speed it up.. | |||
| const float tx = g2.transform.getTranslationX() + xOffset; | |||
| const float ty = g2.transform.getTranslationY() + yOffset; | |||
| g2.x1 += tx; | |||
| g2.x2 += tx; | |||
| g2.y1 += ty; | |||
| g2.y2 += ty; | |||
| } | |||
| else | |||
| { | |||
| g2.transform = g2.transform.translated ((float) xOffset, (float) yOffset); | |||
| transform.transformPoint (g2.x1, g2.y1); | |||
| transform.transformPoint (g2.x2, g2.y2); | |||
| transform = AffineTransform::identity; | |||
| } | |||
| int numLookupEntries; | |||
| PixelARGB* const lookupTable = g2.createLookupTable (numLookupEntries); | |||
| PixelARGB* const lookupTable = g2.createLookupTable (transform, numLookupEntries); | |||
| jassert (numLookupEntries > 0); | |||
| switch (image.getFormat()) | |||
| { | |||
| case Image::ARGB: renderGradient <PixelARGB> (et, destData, g2, lookupTable, numLookupEntries, isIdentity); break; | |||
| case Image::RGB: renderGradient <PixelRGB> (et, destData, g2, lookupTable, numLookupEntries, isIdentity); break; | |||
| default: renderGradient <PixelAlpha> (et, destData, g2, lookupTable, numLookupEntries, isIdentity); break; | |||
| case Image::ARGB: renderGradient <PixelARGB> (et, destData, g2, transform, lookupTable, numLookupEntries, isIdentity); break; | |||
| case Image::RGB: renderGradient <PixelRGB> (et, destData, g2, transform, lookupTable, numLookupEntries, isIdentity); break; | |||
| default: renderGradient <PixelAlpha> (et, destData, g2, transform, lookupTable, numLookupEntries, isIdentity); break; | |||
| } | |||
| juce_free (lookupTable); | |||
| @@ -985,7 +976,7 @@ public: | |||
| else if (fillType.isTiledImage()) | |||
| { | |||
| renderImage (image, *(fillType.image), Rectangle (0, 0, fillType.image->getWidth(), fillType.image->getHeight()), | |||
| AffineTransform::translation ((float) fillType.imageX, (float) fillType.imageY), &et); | |||
| fillType.transform, &et); | |||
| } | |||
| else | |||
| { | |||
| @@ -1061,18 +1052,19 @@ public: | |||
| } | |||
| //============================================================================== | |||
| void clipToImageAlpha (const Image& image, const Rectangle& srcClip, const AffineTransform& transform) throw() | |||
| void clipToImageAlpha (const Image& image, const Rectangle& srcClip, const AffineTransform& t) throw() | |||
| { | |||
| if (! image.hasAlphaChannel()) | |||
| { | |||
| Path p; | |||
| p.addRectangle (srcClip); | |||
| clipToPath (p, transform); | |||
| clipToPath (p, t); | |||
| return; | |||
| } | |||
| dupeEdgeTableIfMultiplyReferenced(); | |||
| const AffineTransform transform (t.translated ((float) xOffset, (float) yOffset)); | |||
| const Image::BitmapData srcData (image, srcClip.getX(), srcClip.getY(), srcClip.getWidth(), srcClip.getHeight()); | |||
| const bool betterQuality = (interpolationQuality != Graphics::lowResamplingQuality); | |||
| EdgeTable& et = edgeTable->edgeTable; | |||
| @@ -1145,9 +1137,7 @@ public: | |||
| class EdgeTableHolder : public ReferenceCountedObject | |||
| { | |||
| public: | |||
| EdgeTableHolder (const EdgeTable& e) throw() | |||
| : edgeTable (e) | |||
| {} | |||
| EdgeTableHolder (const EdgeTable& e) throw() : edgeTable (e) {} | |||
| EdgeTable edgeTable; | |||
| }; | |||
| @@ -1155,7 +1145,7 @@ public: | |||
| ReferenceCountedObjectPtr<EdgeTableHolder> edgeTable; | |||
| int xOffset, yOffset; | |||
| Font font; | |||
| Graphics::FillType fillType; | |||
| FillType fillType; | |||
| Graphics::ResamplingQuality interpolationQuality; | |||
| private: | |||
| @@ -1169,7 +1159,7 @@ private: | |||
| //============================================================================== | |||
| template <class DestPixelType> | |||
| void renderGradient (EdgeTable& et, const Image::BitmapData& destData, const ColourGradient& g, | |||
| void renderGradient (EdgeTable& et, const Image::BitmapData& destData, const ColourGradient& g, const AffineTransform& transform, | |||
| const PixelARGB* const lookupTable, const int numLookupEntries, const bool isIdentity) throw() | |||
| { | |||
| jassert (destData.pixelStride == sizeof (DestPixelType)); | |||
| @@ -1178,18 +1168,18 @@ private: | |||
| { | |||
| if (isIdentity) | |||
| { | |||
| GradientEdgeTableRenderer <DestPixelType, RadialGradientPixelGenerator> renderer (destData, g, lookupTable, numLookupEntries); | |||
| GradientEdgeTableRenderer <DestPixelType, RadialGradientPixelGenerator> renderer (destData, g, transform, lookupTable, numLookupEntries); | |||
| et.iterate (renderer); | |||
| } | |||
| else | |||
| { | |||
| GradientEdgeTableRenderer <DestPixelType, TransformedRadialGradientPixelGenerator> renderer (destData, g, lookupTable, numLookupEntries); | |||
| GradientEdgeTableRenderer <DestPixelType, TransformedRadialGradientPixelGenerator> renderer (destData, g, transform, lookupTable, numLookupEntries); | |||
| et.iterate (renderer); | |||
| } | |||
| } | |||
| else | |||
| { | |||
| GradientEdgeTableRenderer <DestPixelType, LinearGradientPixelGenerator> renderer (destData, g, lookupTable, numLookupEntries); | |||
| GradientEdgeTableRenderer <DestPixelType, LinearGradientPixelGenerator> renderer (destData, g, transform, lookupTable, numLookupEntries); | |||
| et.iterate (renderer); | |||
| } | |||
| } | |||
| @@ -1286,7 +1276,7 @@ LowLevelGraphicsSoftwareRenderer::LowLevelGraphicsSoftwareRenderer (Image& image | |||
| stateStack (20) | |||
| { | |||
| currentState = new LLGCSavedState (Rectangle (0, 0, image_.getWidth(), image_.getHeight()), | |||
| 0, 0, Font(), Graphics::FillType(), Graphics::mediumResamplingQuality); | |||
| 0, 0, Font(), FillType(), Graphics::mediumResamplingQuality); | |||
| } | |||
| LowLevelGraphicsSoftwareRenderer::~LowLevelGraphicsSoftwareRenderer() | |||
| @@ -1308,30 +1298,27 @@ void LowLevelGraphicsSoftwareRenderer::setOrigin (int x, int y) | |||
| bool LowLevelGraphicsSoftwareRenderer::clipToRectangle (const Rectangle& r) | |||
| { | |||
| return currentState->clipToRectangle (r.translated (currentState->xOffset, currentState->yOffset)); | |||
| return currentState->clipToRectangle (r); | |||
| } | |||
| bool LowLevelGraphicsSoftwareRenderer::clipToRectangleList (const RectangleList& clipRegion) | |||
| { | |||
| RectangleList temp (clipRegion); | |||
| temp.offsetAll (currentState->xOffset, currentState->yOffset); | |||
| return currentState->clipToRectangleList (temp); | |||
| return currentState->clipToRectangleList (clipRegion); | |||
| } | |||
| void LowLevelGraphicsSoftwareRenderer::excludeClipRectangle (const Rectangle& r) | |||
| { | |||
| currentState->excludeClipRectangle (r.translated (currentState->xOffset, currentState->yOffset)); | |||
| currentState->excludeClipRectangle (r); | |||
| } | |||
| void LowLevelGraphicsSoftwareRenderer::clipToPath (const Path& path, const AffineTransform& transform) | |||
| { | |||
| currentState->clipToPath (path, transform.translated ((float) currentState->xOffset, (float) currentState->yOffset)); | |||
| currentState->clipToPath (path, transform); | |||
| } | |||
| void LowLevelGraphicsSoftwareRenderer::clipToImageAlpha (const Image& sourceImage, const Rectangle& srcClip, const AffineTransform& transform) | |||
| { | |||
| currentState->clipToImageAlpha (sourceImage, srcClip, transform.translated ((float) currentState->xOffset, (float) currentState->yOffset)); | |||
| currentState->clipToImageAlpha (sourceImage, srcClip, transform); | |||
| } | |||
| bool LowLevelGraphicsSoftwareRenderer::clipRegionIntersects (const Rectangle& r) | |||
| @@ -1373,19 +1360,9 @@ void LowLevelGraphicsSoftwareRenderer::restoreState() | |||
| } | |||
| //============================================================================== | |||
| void LowLevelGraphicsSoftwareRenderer::setColour (const Colour& colour) | |||
| { | |||
| currentState->fillType.setColour (colour); | |||
| } | |||
| void LowLevelGraphicsSoftwareRenderer::setGradient (const ColourGradient& gradient) | |||
| void LowLevelGraphicsSoftwareRenderer::setFill (const FillType& fillType) | |||
| { | |||
| currentState->fillType.setGradient (gradient); | |||
| } | |||
| void LowLevelGraphicsSoftwareRenderer::setTiledFill (const Image& image, int x, int y) | |||
| { | |||
| currentState->fillType.setTiledImage (image, x, y); | |||
| currentState->fillType = fillType; | |||
| } | |||
| void LowLevelGraphicsSoftwareRenderer::setOpacity (float opacity) | |||
| @@ -1455,7 +1432,8 @@ public: | |||
| GlyphCache() throw() | |||
| : accessCounter (0), hits (0), misses (0) | |||
| { | |||
| enlargeCache (120); | |||
| for (int i = 120; --i >= 0;) | |||
| glyphs.add (new CachedGlyph()); | |||
| } | |||
| ~GlyphCache() throw() | |||
| @@ -1491,15 +1469,15 @@ public: | |||
| } | |||
| } | |||
| ++misses; | |||
| if (hits + misses > (glyphs.size() << 4)) | |||
| if (hits + ++misses > (glyphs.size() << 4)) | |||
| { | |||
| if (misses * 2 > hits) | |||
| enlargeCache (glyphs.size() + 32); | |||
| { | |||
| for (int i = 32; --i >= 0;) | |||
| glyphs.add (new CachedGlyph()); | |||
| } | |||
| hits = 0; | |||
| misses = 0; | |||
| hits = misses = 0; | |||
| oldest = glyphs.getLast(); | |||
| } | |||
| @@ -1513,16 +1491,8 @@ public: | |||
| class CachedGlyph | |||
| { | |||
| public: | |||
| CachedGlyph() throw() | |||
| : glyph (0), lastAccessCount (0) | |||
| { | |||
| edgeTable = 0; | |||
| } | |||
| ~CachedGlyph() throw() | |||
| { | |||
| delete edgeTable; | |||
| } | |||
| CachedGlyph() throw() : glyph (0), lastAccessCount (0), edgeTable (0) {} | |||
| ~CachedGlyph() throw() { delete edgeTable; } | |||
| void draw (LLGCSavedState& state, Image& image, const float x, const float y) const throw() | |||
| { | |||
| @@ -1575,12 +1545,6 @@ public: | |||
| juce_UseDebuggingNewOperator | |||
| private: | |||
| void enlargeCache (const int num) throw() | |||
| { | |||
| while (glyphs.size() < num) | |||
| glyphs.add (new CachedGlyph()); | |||
| } | |||
| OwnedArray <CachedGlyph> glyphs; | |||
| int accessCounter, hits, misses; | |||
| @@ -1615,7 +1579,6 @@ void LowLevelGraphicsSoftwareRenderer::drawGlyph (int glyphNumber, const AffineT | |||
| { | |||
| Path p; | |||
| f.getTypeface()->getOutlineForGlyph (glyphNumber, p); | |||
| fillPath (p, AffineTransform::scale (f.getHeight() * f.getHorizontalScale(), f.getHeight()).followedBy (transform)); | |||
| } | |||
| } | |||
| @@ -63,15 +63,11 @@ public: | |||
| void restoreState(); | |||
| //============================================================================== | |||
| void setColour (const Colour& colour); | |||
| void setGradient (const ColourGradient& gradient); | |||
| void setTiledFill (const Image& image, int x, int y); | |||
| void setFill (const FillType& fillType); | |||
| void setOpacity (float opacity); | |||
| void setInterpolationQuality (Graphics::ResamplingQuality quality); | |||
| //============================================================================== | |||
| void fillAll (const bool replaceContents); | |||
| void fillRect (const Rectangle& r, const bool replaceExistingContents); | |||
| void fillPath (const Path& path, const AffineTransform& transform); | |||
| @@ -33,17 +33,14 @@ BEGIN_JUCE_NAMESPACE | |||
| //============================================================================== | |||
| DrawablePath::DrawablePath() | |||
| : fillColour (0xff000000), | |||
| fillGradient (0), | |||
| strokeGradient (0), | |||
| : mainFill (FillType (Colours::black)), | |||
| strokeFill (FillType (Colours::transparentBlack)), | |||
| strokeType (0.0f) | |||
| { | |||
| } | |||
| DrawablePath::~DrawablePath() | |||
| { | |||
| delete fillGradient; | |||
| delete strokeGradient; | |||
| } | |||
| //============================================================================== | |||
| @@ -53,16 +50,14 @@ void DrawablePath::setPath (const Path& newPath) throw() | |||
| updateOutline(); | |||
| } | |||
| void DrawablePath::setFillColour (const Colour& newColour) throw() | |||
| void DrawablePath::setFill (const FillType& newFill) throw() | |||
| { | |||
| deleteAndZero (fillGradient); | |||
| fillColour = newColour; | |||
| mainFill = newFill; | |||
| } | |||
| void DrawablePath::setFillGradient (const ColourGradient& gradient) throw() | |||
| void DrawablePath::setStrokeFill (const FillType& newFill) throw() | |||
| { | |||
| delete fillGradient; | |||
| fillGradient = new ColourGradient (gradient); | |||
| strokeFill = newFill; | |||
| } | |||
| void DrawablePath::setStrokeType (const PathStrokeType& newStrokeType) throw() | |||
| @@ -76,63 +71,39 @@ void DrawablePath::setStrokeThickness (const float newThickness) throw() | |||
| setStrokeType (PathStrokeType (newThickness, strokeType.getJointStyle(), strokeType.getEndStyle())); | |||
| } | |||
| void DrawablePath::setStrokeColour (const Colour& newStrokeColour) throw() | |||
| { | |||
| deleteAndZero (strokeGradient); | |||
| strokeColour = newStrokeColour; | |||
| } | |||
| void DrawablePath::setStrokeGradient (const ColourGradient& newStrokeGradient) throw() | |||
| { | |||
| delete strokeGradient; | |||
| strokeGradient = new ColourGradient (newStrokeGradient); | |||
| } | |||
| //============================================================================== | |||
| void DrawablePath::render (const Drawable::RenderingContext& context) const | |||
| { | |||
| if (fillGradient != 0) | |||
| { | |||
| ColourGradient cg (*fillGradient); | |||
| cg.transform = cg.transform.followedBy (context.transform); | |||
| cg.multiplyOpacity (context.opacity); | |||
| context.g.setGradientFill (cg); | |||
| } | |||
| else | |||
| { | |||
| context.g.setColour (fillColour); | |||
| } | |||
| FillType f (mainFill); | |||
| if (f.isGradient()) | |||
| f.gradient->multiplyOpacity (context.opacity); | |||
| f.transform = f.transform.followedBy (context.transform); | |||
| context.g.setFillType (f); | |||
| context.g.fillPath (path, context.transform); | |||
| if (strokeType.getStrokeThickness() > 0.0f) | |||
| { | |||
| if (strokeGradient != 0) | |||
| { | |||
| ColourGradient cg (*strokeGradient); | |||
| cg.transform = cg.transform.followedBy (context.transform); | |||
| cg.multiplyOpacity (context.opacity); | |||
| context.g.setGradientFill (cg); | |||
| } | |||
| else | |||
| { | |||
| context.g.setColour (strokeColour); | |||
| } | |||
| FillType f (strokeFill); | |||
| if (f.isGradient()) | |||
| f.gradient->multiplyOpacity (context.opacity); | |||
| context.g.fillPath (outline, context.transform); | |||
| f.transform = f.transform.followedBy (context.transform); | |||
| context.g.setFillType (f); | |||
| context.g.fillPath (stroke, context.transform); | |||
| } | |||
| } | |||
| void DrawablePath::updateOutline() | |||
| { | |||
| outline.clear(); | |||
| strokeType.createStrokedPath (outline, path, AffineTransform::identity, 4.0f); | |||
| stroke.clear(); | |||
| strokeType.createStrokedPath (stroke, path, AffineTransform::identity, 4.0f); | |||
| } | |||
| void DrawablePath::getBounds (float& x, float& y, float& width, float& height) const | |||
| { | |||
| if (strokeType.getStrokeThickness() > 0.0f) | |||
| outline.getBounds (x, y, width, height); | |||
| stroke.getBounds (x, y, width, height); | |||
| else | |||
| path.getBounds (x, y, width, height); | |||
| } | |||
| @@ -140,7 +111,7 @@ void DrawablePath::getBounds (float& x, float& y, float& width, float& height) c | |||
| bool DrawablePath::hitTest (float x, float y) const | |||
| { | |||
| return path.contains (x, y) | |||
| || outline.contains (x, y); | |||
| || stroke.contains (x, y); | |||
| } | |||
| Drawable* DrawablePath::createCopy() const | |||
| @@ -148,106 +119,107 @@ Drawable* DrawablePath::createCopy() const | |||
| DrawablePath* const dp = new DrawablePath(); | |||
| dp->path = path; | |||
| dp->outline = outline; | |||
| dp->fillColour = fillColour; | |||
| dp->strokeColour = strokeColour; | |||
| dp->fillGradient = (fillGradient != 0) ? new ColourGradient (*fillGradient) : 0; | |||
| dp->strokeGradient = (strokeGradient != 0) ? new ColourGradient (*strokeGradient) : 0; | |||
| dp->stroke = stroke; | |||
| dp->mainFill = mainFill; | |||
| dp->strokeFill = strokeFill; | |||
| dp->strokeType = strokeType; | |||
| return dp; | |||
| } | |||
| //============================================================================== | |||
| static const Colour readColourFromBinary (InputStream& input, ColourGradient*& gradient) | |||
| static const FillType readColourFromBinary (InputStream& input) | |||
| { | |||
| deleteAndZero (gradient); | |||
| switch (input.readByte()) | |||
| { | |||
| case 1: | |||
| return Colour ((uint32) input.readInt()); | |||
| return FillType (Colour ((uint32) input.readInt())); | |||
| case 2: | |||
| { | |||
| gradient = new ColourGradient(); | |||
| gradient->x1 = input.readFloat(); | |||
| gradient->y1 = input.readFloat(); | |||
| gradient->x2 = input.readFloat(); | |||
| gradient->y2 = input.readFloat(); | |||
| gradient->isRadial = input.readByte() != 0; | |||
| ColourGradient g; | |||
| g.x1 = input.readFloat(); | |||
| g.y1 = input.readFloat(); | |||
| g.x2 = input.readFloat(); | |||
| g.y2 = input.readFloat(); | |||
| g.isRadial = input.readByte() != 0; | |||
| const int numColours = input.readCompressedInt(); | |||
| for (int i = 0; i < numColours; ++i) | |||
| { | |||
| double proportion = (double) input.readFloat(); | |||
| const Colour col ((uint32) input.readInt()); | |||
| gradient->addColour (proportion, col); | |||
| g.addColour (proportion, col); | |||
| } | |||
| break; | |||
| return FillType (g); | |||
| } | |||
| default: | |||
| break; | |||
| } | |||
| return Colours::black; | |||
| return FillType(); | |||
| } | |||
| static void writeColourToBinary (OutputStream& output, const Colour& colour, const ColourGradient* const gradient) | |||
| static void writeColourToBinary (OutputStream& output, const FillType& fillType) | |||
| { | |||
| if (gradient == 0) | |||
| if (fillType.isColour()) | |||
| { | |||
| output.writeByte (1); | |||
| output.writeInt ((int) colour.getARGB()); | |||
| output.writeInt ((int) fillType.colour.getARGB()); | |||
| } | |||
| else | |||
| else if (fillType.isGradient()) | |||
| { | |||
| output.writeByte (2); | |||
| output.writeFloat (gradient->x1); | |||
| output.writeFloat (gradient->y1); | |||
| output.writeFloat (gradient->x2); | |||
| output.writeFloat (gradient->y2); | |||
| output.writeByte (gradient->isRadial ? 1 : 0); | |||
| output.writeFloat (fillType.gradient->x1); | |||
| output.writeFloat (fillType.gradient->y1); | |||
| output.writeFloat (fillType.gradient->x2); | |||
| output.writeFloat (fillType.gradient->y2); | |||
| output.writeByte (fillType.gradient->isRadial ? 1 : 0); | |||
| output.writeCompressedInt (gradient->getNumColours()); | |||
| output.writeCompressedInt (fillType.gradient->getNumColours()); | |||
| for (int i = 0; i < gradient->getNumColours(); ++i) | |||
| for (int i = 0; i < fillType.gradient->getNumColours(); ++i) | |||
| { | |||
| output.writeFloat ((float) gradient->getColourPosition (i)); | |||
| output.writeInt ((int) gradient->getColour (i).getARGB()); | |||
| output.writeFloat ((float) fillType.gradient->getColourPosition (i)); | |||
| output.writeInt ((int) fillType.gradient->getColour (i).getARGB()); | |||
| } | |||
| } | |||
| else | |||
| { | |||
| jassertfalse // xxx | |||
| } | |||
| } | |||
| static const Colour readColourFromXml (const XmlElement* xml, ColourGradient*& gradient) | |||
| static const FillType readColourFromXml (const XmlElement* xml) | |||
| { | |||
| deleteAndZero (gradient); | |||
| if (xml != 0) | |||
| { | |||
| const String type (xml->getStringAttribute (T("type"))); | |||
| if (type.equalsIgnoreCase (T("solid"))) | |||
| { | |||
| return Colour ((uint32) xml->getStringAttribute (T("colour"), T("ff000000")).getHexValue32()); | |||
| return FillType (Colour ((uint32) xml->getStringAttribute (T("colour"), T("ff000000")).getHexValue32())); | |||
| } | |||
| else if (type.equalsIgnoreCase (T("gradient"))) | |||
| { | |||
| gradient = new ColourGradient(); | |||
| gradient->x1 = (float) xml->getDoubleAttribute (T("x1")); | |||
| gradient->y1 = (float) xml->getDoubleAttribute (T("y1")); | |||
| gradient->x2 = (float) xml->getDoubleAttribute (T("x2")); | |||
| gradient->y2 = (float) xml->getDoubleAttribute (T("y2")); | |||
| gradient->isRadial = xml->getBoolAttribute (T("radial"), false); | |||
| ColourGradient g; | |||
| g.x1 = (float) xml->getDoubleAttribute (T("x1")); | |||
| g.y1 = (float) xml->getDoubleAttribute (T("y1")); | |||
| g.x2 = (float) xml->getDoubleAttribute (T("x2")); | |||
| g.y2 = (float) xml->getDoubleAttribute (T("y2")); | |||
| g.isRadial = xml->getBoolAttribute (T("radial"), false); | |||
| StringArray colours; | |||
| colours.addTokens (xml->getStringAttribute (T("colours")), false); | |||
| for (int i = 0; i < colours.size() / 2; ++i) | |||
| gradient->addColour (colours[i * 2].getDoubleValue(), | |||
| Colour ((uint32) colours[i * 2 + 1].getHexValue32())); | |||
| g.addColour (colours[i * 2].getDoubleValue(), | |||
| Colour ((uint32) colours[i * 2 + 1].getHexValue32())); | |||
| return FillType (g); | |||
| } | |||
| else | |||
| { | |||
| @@ -255,42 +227,47 @@ static const Colour readColourFromXml (const XmlElement* xml, ColourGradient*& g | |||
| } | |||
| } | |||
| return Colours::black; | |||
| return FillType(); | |||
| } | |||
| static XmlElement* writeColourToXml (const String& tagName, const Colour& colour, const ColourGradient* const gradient) | |||
| static XmlElement* writeColourToXml (const String& tagName, const FillType& fillType) | |||
| { | |||
| XmlElement* const xml = new XmlElement (tagName); | |||
| if (gradient == 0) | |||
| if (fillType.isColour()) | |||
| { | |||
| xml->setAttribute (T("type"), T("solid")); | |||
| xml->setAttribute (T("colour"), String::toHexString ((int) colour.getARGB())); | |||
| xml->setAttribute (T("colour"), String::toHexString ((int) fillType.colour.getARGB())); | |||
| } | |||
| else | |||
| else if (fillType.isGradient()) | |||
| { | |||
| xml->setAttribute (T("type"), T("gradient")); | |||
| xml->setAttribute (T("x1"), gradient->x1); | |||
| xml->setAttribute (T("y1"), gradient->y1); | |||
| xml->setAttribute (T("x2"), gradient->x2); | |||
| xml->setAttribute (T("y2"), gradient->y2); | |||
| xml->setAttribute (T("radial"), gradient->isRadial); | |||
| xml->setAttribute (T("x1"), fillType.gradient->x1); | |||
| xml->setAttribute (T("y1"), fillType.gradient->y1); | |||
| xml->setAttribute (T("x2"), fillType.gradient->x2); | |||
| xml->setAttribute (T("y2"), fillType.gradient->y2); | |||
| xml->setAttribute (T("radial"), fillType.gradient->isRadial); | |||
| String s; | |||
| for (int i = 0; i < gradient->getNumColours(); ++i) | |||
| s << " " << gradient->getColourPosition (i) << " " << String::toHexString ((int) gradient->getColour(i).getARGB()); | |||
| for (int i = 0; i < fillType.gradient->getNumColours(); ++i) | |||
| s << " " << fillType.gradient->getColourPosition (i) | |||
| << " " << String::toHexString ((int) fillType.gradient->getColour(i).getARGB()); | |||
| xml->setAttribute (T("colours"), s.trimStart()); | |||
| } | |||
| else | |||
| { | |||
| jassertfalse //xxx | |||
| } | |||
| return xml; | |||
| } | |||
| bool DrawablePath::readBinary (InputStream& input) | |||
| { | |||
| fillColour = readColourFromBinary (input, fillGradient); | |||
| strokeColour = readColourFromBinary (input, strokeGradient); | |||
| mainFill = readColourFromBinary (input); | |||
| strokeFill = readColourFromBinary (input); | |||
| const float strokeThickness = input.readFloat(); | |||
| const int jointStyle = input.readByte(); | |||
| @@ -319,8 +296,8 @@ bool DrawablePath::readBinary (InputStream& input) | |||
| bool DrawablePath::writeBinary (OutputStream& output) const | |||
| { | |||
| writeColourToBinary (output, fillColour, fillGradient); | |||
| writeColourToBinary (output, strokeColour, strokeGradient); | |||
| writeColourToBinary (output, mainFill); | |||
| writeColourToBinary (output, strokeFill); | |||
| output.writeFloat (strokeType.getStrokeThickness()); | |||
| output.writeByte (strokeType.getJointStyle() == PathStrokeType::mitered ? 0 | |||
| @@ -337,8 +314,8 @@ bool DrawablePath::writeBinary (OutputStream& output) const | |||
| bool DrawablePath::readXml (const XmlElement& xml) | |||
| { | |||
| fillColour = readColourFromXml (xml.getChildByName (T("fill")), fillGradient); | |||
| strokeColour = readColourFromXml (xml.getChildByName (T("stroke")), strokeGradient); | |||
| mainFill = readColourFromXml (xml.getChildByName (T("fill"))); | |||
| strokeFill = readColourFromXml (xml.getChildByName (T("stroke"))); | |||
| const String jointStyle (xml.getStringAttribute (T("jointStyle"), String::empty)); | |||
| const String endStyle (xml.getStringAttribute (T("capStyle"), String::empty)); | |||
| @@ -358,8 +335,8 @@ bool DrawablePath::readXml (const XmlElement& xml) | |||
| void DrawablePath::writeXml (XmlElement& xml) const | |||
| { | |||
| xml.addChildElement (writeColourToXml (T("fill"), fillColour, fillGradient)); | |||
| xml.addChildElement (writeColourToXml (T("stroke"), strokeColour, strokeGradient)); | |||
| xml.addChildElement (writeColourToXml (T("fill"), mainFill)); | |||
| xml.addChildElement (writeColourToXml (T("stroke"), strokeFill)); | |||
| xml.setAttribute (T("strokeWidth"), (double) strokeType.getStrokeThickness()); | |||
| xml.setAttribute (T("jointStyle"), | |||
| @@ -57,33 +57,33 @@ public: | |||
| /** Returns the current path. */ | |||
| const Path& getPath() const throw() { return path; } | |||
| /** Sets a colour to fill the path with. | |||
| /** Sets a fill type for the path. | |||
| This colour is used to fill the path - if you don't want the path to be | |||
| filled (e.g. if you're just drawing an outline), set this colour to be | |||
| transparent. | |||
| filled (e.g. if you're just drawing an outline), set this to a transparent | |||
| colour. | |||
| @see setPath, setOutlineColour, setFillGradient | |||
| @see setPath, setStrokeFill | |||
| */ | |||
| void setFillColour (const Colour& newColour) throw(); | |||
| void setFill (const FillType& newFill) throw(); | |||
| /** Sets a gradient to use to fill the path. | |||
| /** Returns the current fill type. | |||
| @see setFill | |||
| */ | |||
| void setFillGradient (const ColourGradient& newGradient) throw(); | |||
| const FillType& getFill() const throw() { return mainFill; } | |||
| /** Sets the colour with which the outline will be drawn. | |||
| @see setStrokeGradient | |||
| /** Sets the fill type with which the outline will be drawn. | |||
| @see setFill | |||
| */ | |||
| void setStrokeColour (const Colour& newStrokeColour) throw(); | |||
| void setStrokeFill (const FillType& newStrokeFill) throw(); | |||
| /** Sets a gradient with with the outline will be drawn. | |||
| @see setStrokeColour | |||
| /** Returns the current stroke fill. | |||
| @see setStrokeFill | |||
| */ | |||
| void setStrokeGradient (const ColourGradient& newStrokeGradient) throw(); | |||
| const FillType& getStrokeFill() const throw() { return strokeFill; } | |||
| /** Changes the properties of the outline that will be drawn around the path. | |||
| If the stroke has 0 thickness, no stroke will be drawn. | |||
| @see setStrokeThickness, setStrokeColour | |||
| */ | |||
| void setStrokeType (const PathStrokeType& newStrokeType) throw(); | |||
| @@ -94,7 +94,7 @@ public: | |||
| void setStrokeThickness (const float newThickness) throw(); | |||
| /** Returns the current outline style. */ | |||
| const PathStrokeType& getStrokeType() const throw() { return strokeType; } | |||
| const PathStrokeType& getStrokeType() const throw() { return strokeType; } | |||
| //============================================================================== | |||
| @@ -119,10 +119,8 @@ public: | |||
| juce_UseDebuggingNewOperator | |||
| private: | |||
| Path path, outline; | |||
| Colour fillColour, strokeColour; | |||
| ColourGradient* fillGradient; | |||
| ColourGradient* strokeGradient; | |||
| Path path, stroke; | |||
| FillType mainFill, strokeFill; | |||
| PathStrokeType strokeType; | |||
| void updateOutline(); | |||
| @@ -607,7 +607,7 @@ private: | |||
| DrawablePath* dp = new DrawablePath(); | |||
| dp->setName (xml.getStringAttribute (T("id"))); | |||
| dp->setFillColour (Colours::transparentBlack); | |||
| dp->setFill (FillType (Colours::transparentBlack)); | |||
| path.applyTransform (transform); | |||
| dp->setPath (path); | |||
| @@ -624,47 +624,21 @@ private: | |||
| } | |||
| } | |||
| ColourGradient* fillGradient = 0; | |||
| const Colour fillColour (getPathFillType (path, | |||
| getStyleAttribute (&xml, T("fill")), | |||
| getStyleAttribute (&xml, T("fill-opacity")), | |||
| getStyleAttribute (&xml, T("opacity")), | |||
| containsClosedSubPath ? Colours::black | |||
| : Colours::transparentBlack, | |||
| fillGradient)); | |||
| if (fillGradient != 0) | |||
| { | |||
| fillGradient->transform = fillGradient->transform.followedBy (transform); | |||
| dp->setFillGradient (*fillGradient); | |||
| delete fillGradient; | |||
| } | |||
| else | |||
| { | |||
| dp->setFillColour (fillColour); | |||
| } | |||
| dp->setFill (getPathFillType (path, | |||
| getStyleAttribute (&xml, T("fill")), | |||
| getStyleAttribute (&xml, T("fill-opacity")), | |||
| getStyleAttribute (&xml, T("opacity")), | |||
| containsClosedSubPath ? Colours::black | |||
| : Colours::transparentBlack)); | |||
| const String strokeType (getStyleAttribute (&xml, T("stroke"))); | |||
| if (strokeType.isNotEmpty() && ! strokeType.equalsIgnoreCase (T("none"))) | |||
| { | |||
| ColourGradient* strokeGradient = 0; | |||
| const Colour strokeColour (getPathFillType (path, strokeType, | |||
| getStyleAttribute (&xml, T("stroke-opacity")), | |||
| getStyleAttribute (&xml, T("opacity")), | |||
| Colours::transparentBlack, | |||
| strokeGradient)); | |||
| if (strokeGradient != 0) | |||
| { | |||
| strokeGradient->transform = strokeGradient->transform.followedBy (transform); | |||
| dp->setStrokeGradient (*strokeGradient); | |||
| delete strokeGradient; | |||
| } | |||
| else | |||
| { | |||
| dp->setStrokeColour (strokeColour); | |||
| } | |||
| dp->setStrokeFill (getPathFillType (path, strokeType, | |||
| getStyleAttribute (&xml, T("stroke-opacity")), | |||
| getStyleAttribute (&xml, T("opacity")), | |||
| Colours::transparentBlack)); | |||
| dp->setStrokeType (getStrokeFor (&xml)); | |||
| } | |||
| @@ -704,12 +678,11 @@ private: | |||
| } | |||
| } | |||
| const Colour getPathFillType (const Path& path, | |||
| const String& fill, | |||
| const String& fillOpacity, | |||
| const String& overallOpacity, | |||
| const Colour& defaultColour, | |||
| ColourGradient*& gradient) const | |||
| const FillType getPathFillType (const Path& path, | |||
| const String& fill, | |||
| const String& fillOpacity, | |||
| const String& overallOpacity, | |||
| const Colour& defaultColour) const | |||
| { | |||
| float opacity = 1.0f; | |||
| @@ -732,29 +705,28 @@ private: | |||
| { | |||
| const XmlElement* inheritedFrom = findLinkedElement (fillXml); | |||
| gradient = new ColourGradient(); | |||
| ColourGradient gradient; | |||
| addGradientStopsIn (*gradient, inheritedFrom); | |||
| addGradientStopsIn (*gradient, fillXml); | |||
| addGradientStopsIn (gradient, inheritedFrom); | |||
| addGradientStopsIn (gradient, fillXml); | |||
| if (gradient->getNumColours() > 0) | |||
| if (gradient.getNumColours() > 0) | |||
| { | |||
| gradient->addColour (0.0, gradient->getColour (0)); | |||
| gradient->addColour (1.0, gradient->getColour (gradient->getNumColours() - 1)); | |||
| gradient.addColour (0.0, gradient.getColour (0)); | |||
| gradient.addColour (1.0, gradient.getColour (gradient.getNumColours() - 1)); | |||
| } | |||
| else | |||
| { | |||
| gradient->addColour (0.0, Colours::black); | |||
| gradient->addColour (1.0, Colours::black); | |||
| gradient.addColour (0.0, Colours::black); | |||
| gradient.addColour (1.0, Colours::black); | |||
| } | |||
| if (overallOpacity.isNotEmpty()) | |||
| gradient->multiplyOpacity (overallOpacity.getFloatValue()); | |||
| gradient.multiplyOpacity (overallOpacity.getFloatValue()); | |||
| jassert (gradient->getNumColours() > 0); | |||
| jassert (gradient.getNumColours() > 0); | |||
| gradient->isRadial = fillXml->hasTagName (T("radialGradient")); | |||
| gradient->transform = parseTransform (fillXml->getStringAttribute (T("gradientTransform"))); | |||
| gradient.isRadial = fillXml->hasTagName (T("radialGradient")); | |||
| float width = viewBoxW; | |||
| float height = viewBoxH; | |||
| @@ -766,35 +738,34 @@ private: | |||
| if (! userSpace) | |||
| path.getBounds (dx, dy, width, height); | |||
| if (gradient->isRadial) | |||
| if (gradient.isRadial) | |||
| { | |||
| gradient->x1 = dx + getCoordLength (fillXml->getStringAttribute (T("cx"), T("50%")), width); | |||
| gradient->y1 = dy + getCoordLength (fillXml->getStringAttribute (T("cy"), T("50%")), height); | |||
| gradient.x1 = dx + getCoordLength (fillXml->getStringAttribute (T("cx"), T("50%")), width); | |||
| gradient.y1 = dy + getCoordLength (fillXml->getStringAttribute (T("cy"), T("50%")), height); | |||
| const float radius = getCoordLength (fillXml->getStringAttribute (T("r"), T("50%")), width); | |||
| gradient->x2 = gradient->x1 + radius; | |||
| gradient->y2 = gradient->y1; | |||
| gradient.x2 = gradient.x1 + radius; | |||
| gradient.y2 = gradient.y1; | |||
| //xxx (the fx, fy focal point isn't handled properly here..) | |||
| } | |||
| else | |||
| { | |||
| gradient->x1 = dx + getCoordLength (fillXml->getStringAttribute (T("x1"), T("0%")), width); | |||
| gradient->y1 = dy + getCoordLength (fillXml->getStringAttribute (T("y1"), T("0%")), height); | |||
| gradient.x1 = dx + getCoordLength (fillXml->getStringAttribute (T("x1"), T("0%")), width); | |||
| gradient.y1 = dy + getCoordLength (fillXml->getStringAttribute (T("y1"), T("0%")), height); | |||
| gradient->x2 = dx + getCoordLength (fillXml->getStringAttribute (T("x2"), T("100%")), width); | |||
| gradient->y2 = dy + getCoordLength (fillXml->getStringAttribute (T("y2"), T("0%")), height); | |||
| gradient.x2 = dx + getCoordLength (fillXml->getStringAttribute (T("x2"), T("100%")), width); | |||
| gradient.y2 = dy + getCoordLength (fillXml->getStringAttribute (T("y2"), T("0%")), height); | |||
| if (gradient->x1 == gradient->x2 && gradient->y1 == gradient->y2) | |||
| { | |||
| const Colour col (gradient->getColour (gradient->getNumColours() - 1)); | |||
| deleteAndZero (gradient); | |||
| return col; | |||
| } | |||
| if (gradient.x1 == gradient.x2 && gradient.y1 == gradient.y2) | |||
| return Colour (gradient.getColour (gradient.getNumColours() - 1)); | |||
| } | |||
| return defaultColour; | |||
| FillType type (gradient); | |||
| type.transform = parseTransform (fillXml->getStringAttribute (T("gradientTransform"))) | |||
| .followedBy (transform); | |||
| return type; | |||
| } | |||
| } | |||
| @@ -802,7 +773,7 @@ private: | |||
| return Colours::transparentBlack; | |||
| int i = 0; | |||
| Colour colour (parseColour (fill, i, defaultColour)); | |||
| const Colour colour (parseColour (fill, i, defaultColour)); | |||
| return colour.withMultipliedAlpha (opacity); | |||
| } | |||
| @@ -288,6 +288,7 @@ | |||
| #include "gui/graphics/colour/juce_ColourGradient.cpp" | |||
| #include "gui/graphics/colour/juce_Colours.cpp" | |||
| #include "gui/graphics/contexts/juce_EdgeTable.cpp" | |||
| #include "gui/graphics/contexts/juce_FillType.cpp" | |||
| #include "gui/graphics/contexts/juce_Graphics.cpp" | |||
| #include "gui/graphics/contexts/juce_Justification.cpp" | |||
| #include "gui/graphics/contexts/juce_LowLevelGraphicsPostScriptRenderer.cpp" | |||
| @@ -1799,7 +1799,7 @@ private: | |||
| context.setOrigin (-totalArea.getX(), -totalArea.getY()); | |||
| if (context.reduceClipRegion (regionsNeedingRepaint)) | |||
| if (context.clipToRectangleList (regionsNeedingRepaint)) | |||
| peer->handlePaint (context); | |||
| if (! peer->maskedRegion.isEmpty()) | |||
| @@ -2570,31 +2570,52 @@ void juce_updateMultiMonitorInfo (Array <Rectangle>& monitorCoords, const bool / | |||
| #if JUCE_USE_XINERAMA | |||
| int major_opcode, first_event, first_error; | |||
| if (XQueryExtension (display, "XINERAMA", &major_opcode, &first_event, &first_error) | |||
| && XineramaIsActive (display)) | |||
| if (XQueryExtension (display, "XINERAMA", &major_opcode, &first_event, &first_error)) | |||
| { | |||
| int numMonitors = 0; | |||
| XineramaScreenInfo* const screens = XineramaQueryScreens (display, &numMonitors); | |||
| typedef Bool (*tXineramaIsActive) (Display*); | |||
| typedef XineramaScreenInfo* (*tXineramaQueryScreens) (Display*, int*); | |||
| if (screens != 0) | |||
| static tXineramaIsActive xXineramaIsActive = 0; | |||
| static tXineramaQueryScreens xXineramaQueryScreens = 0; | |||
| if (xXineramaIsActive == 0 || xXineramaQueryScreens == 0) | |||
| { | |||
| for (int i = numMonitors; --i >= 0;) | |||
| void* h = dlopen ("libXinerama.so", RTLD_GLOBAL | RTLD_NOW); | |||
| if (h != 0) | |||
| { | |||
| int index = screens[i].screen_number; | |||
| xXineramaIsActive = (tXineramaIsActive) dlsym (h, "XineramaIsActive"); | |||
| xXineramaQueryScreens = (tXineramaQueryScreens) dlsym (h, "XineramaQueryScreens"); | |||
| } | |||
| } | |||
| if (xXineramaIsActive != 0 | |||
| && xXineramaQueryScreens != 0 | |||
| && xXineramaIsActive (display)) | |||
| { | |||
| int numMonitors = 0; | |||
| XineramaScreenInfo* const screens = xXineramaQueryScreens (display, &numMonitors); | |||
| if (index >= 0) | |||
| if (screens != 0) | |||
| { | |||
| for (int i = numMonitors; --i >= 0;) | |||
| { | |||
| while (monitorCoords.size() < index) | |||
| monitorCoords.add (Rectangle (0, 0, 0, 0)); | |||
| int index = screens[i].screen_number; | |||
| if (index >= 0) | |||
| { | |||
| while (monitorCoords.size() < index) | |||
| monitorCoords.add (Rectangle (0, 0, 0, 0)); | |||
| monitorCoords.set (index, Rectangle (screens[i].x_org, | |||
| screens[i].y_org, | |||
| screens[i].width, | |||
| screens[i].height)); | |||
| monitorCoords.set (index, Rectangle (screens[i].x_org, | |||
| screens[i].y_org, | |||
| screens[i].width, | |||
| screens[i].height)); | |||
| } | |||
| } | |||
| } | |||
| XFree (screens); | |||
| XFree (screens); | |||
| } | |||
| } | |||
| } | |||
| @@ -209,24 +209,16 @@ public: | |||
| } | |||
| //============================================================================== | |||
| void setColour (const Colour& colour) | |||
| void setFill (const FillType& fillType) | |||
| { | |||
| state->fillType.setColour (colour); | |||
| state->fillType = fillType; | |||
| CGContextSetRGBFillColor (context, | |||
| colour.getFloatRed(), colour.getFloatGreen(), | |||
| colour.getFloatBlue(), colour.getFloatAlpha()); | |||
| CGContextSetAlpha (context, 1.0f); | |||
| } | |||
| void setGradient (const ColourGradient& gradient) | |||
| { | |||
| state->fillType.setGradient (gradient); | |||
| } | |||
| void setTiledFill (const Image& image, int x, int y) | |||
| { | |||
| state->fillType.setTiledImage (image, x, y); | |||
| if (fillType.isColour()) | |||
| { | |||
| CGContextSetRGBFillColor (context, fillType.colour.getFloatRed(), fillType.colour.getFloatGreen(), | |||
| fillType.colour.getFloatBlue(), fillType.colour.getFloatAlpha()); | |||
| CGContextSetAlpha (context, 1.0f); | |||
| } | |||
| } | |||
| void setOpacity (float opacity) | |||
| @@ -272,7 +264,6 @@ public: | |||
| { | |||
| CGContextSaveGState (context); | |||
| CGContextClipToRect (context, cgRect); | |||
| flip(); | |||
| drawGradient(); | |||
| CGContextRestoreGState (context); | |||
| } | |||
| @@ -281,7 +272,7 @@ public: | |||
| CGContextSaveGState (context); | |||
| CGContextClipToRect (context, cgRect); | |||
| drawImage (*(state->fillType.image), Rectangle (0, 0, state->fillType.image->getWidth(), state->fillType.image->getHeight()), | |||
| AffineTransform::translation (state->fillType.imageX, state->fillType.imageY), true); | |||
| state->fillType.transform, true); | |||
| CGContextRestoreGState (context); | |||
| } | |||
| } | |||
| @@ -302,22 +293,21 @@ public: | |||
| else | |||
| CGContextEOFillPath (context); | |||
| } | |||
| else if (state->fillType.isGradient()) | |||
| { | |||
| createPath (path, transform); | |||
| CGContextClip (context); | |||
| flip(); | |||
| applyTransform (state->fillType.gradient->transform); | |||
| drawGradient(); | |||
| } | |||
| else | |||
| { | |||
| createPath (path, transform); | |||
| CGContextClip (context); | |||
| drawImage (*(state->fillType.image), Rectangle (0, 0, state->fillType.image->getWidth(), state->fillType.image->getHeight()), | |||
| AffineTransform::translation (state->fillType.imageX, state->fillType.imageY), true); | |||
| } | |||
| if (path.isUsingNonZeroWinding()) | |||
| CGContextClip (context); | |||
| else | |||
| CGContextEOClip (context); | |||
| if (state->fillType.isGradient()) | |||
| drawGradient(); | |||
| else | |||
| drawImage (*(state->fillType.image), Rectangle (0, 0, state->fillType.image->getWidth(), state->fillType.image->getHeight()), | |||
| state->fillType.transform, true); | |||
| } | |||
| CGContextRestoreGState (context); | |||
| } | |||
| @@ -492,7 +482,7 @@ private: | |||
| { | |||
| } | |||
| Graphics::FillType fillType; | |||
| FillType fillType; | |||
| Font font; | |||
| CGFontRef fontRef; | |||
| CGAffineTransform fontTransform; | |||
| @@ -517,10 +507,10 @@ private: | |||
| outData[3] = colour.getAlpha() / 255.0f; | |||
| } | |||
| CGShadingRef createGradient (const ColourGradient* const gradient) throw() | |||
| CGShadingRef createGradient (const AffineTransform& transform, const ColourGradient* const gradient) throw() | |||
| { | |||
| delete gradientLookupTable; | |||
| gradientLookupTable = gradient->createLookupTable (numGradientLookupEntries); | |||
| gradientLookupTable = gradient->createLookupTable (transform, numGradientLookupEntries); | |||
| --numGradientLookupEntries; | |||
| CGShadingRef result = 0; | |||
| @@ -546,10 +536,13 @@ private: | |||
| void drawGradient() throw() | |||
| { | |||
| flip(); | |||
| applyTransform (state->fillType.transform); | |||
| CGContextSetAlpha (context, 1.0f); | |||
| CGContextSetInterpolationQuality (context, kCGInterpolationDefault); // (This is required for 10.4, where there's a crash if | |||
| // you draw a gradient with high quality interp enabled). | |||
| CGShadingRef shading = createGradient (state->fillType.gradient); | |||
| CGShadingRef shading = createGradient (state->fillType.transform, state->fillType.gradient); | |||
| CGContextDrawShading (context, shading); | |||
| CGShadingRelease (shading); | |||
| } | |||