@@ -218,6 +218,7 @@ | |||
3AB744A14A560E541723DC9A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Uuid.cpp"; path = "../../../../modules/juce_core/misc/juce_Uuid.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
3B061AB9BFD8883A6AE8BCE5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DynamicLibrary.h"; path = "../../../../modules/juce_core/threads/juce_DynamicLibrary.h"; sourceTree = "SOURCE_ROOT"; }; | |||
3C48242E40D358BC6FF7FE53 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PlatformDefs.h"; path = "../../../../modules/juce_core/system/juce_PlatformDefs.h"; sourceTree = "SOURCE_ROOT"; }; | |||
3CABAAC1C4BC0D8105183D56 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CachedComponentImage.h"; path = "../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h"; sourceTree = "SOURCE_ROOT"; }; | |||
3CD57938B4C273D0AA6E6B8B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Path.h"; path = "../../../../modules/juce_graphics/geometry/juce_Path.h"; sourceTree = "SOURCE_ROOT"; }; | |||
3D2B51C71E3676F283B778EA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DragAndDropContainer.h"; path = "../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h"; sourceTree = "SOURCE_ROOT"; }; | |||
3F1501FE4867042830B25DD5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CustomTypeface.cpp"; path = "../../../../modules/juce_graphics/fonts/juce_CustomTypeface.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
@@ -1227,6 +1228,7 @@ | |||
30AD756E053A0663BF664823, | |||
8DDA82E1200B61D3B6C526E8 ); name = "juce_graphics"; sourceTree = "<group>"; }; | |||
2CEAE8B236FEF5E06317EF3B = { isa = PBXGroup; children = ( | |||
3CABAAC1C4BC0D8105183D56, | |||
4C150A1BF98D747EC218A602, | |||
FDD33A6837774904810208D5, | |||
0BEDB3FD70AB61D3E7891D74, | |||
@@ -1941,6 +1941,7 @@ | |||
</Filter> | |||
<Filter Name="juce_gui_basics"> | |||
<Filter Name="components"> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | |||
<FileConfiguration Name="Debug|Win32" | |||
ExcludedFromBuild="true"> | |||
@@ -1941,6 +1941,7 @@ | |||
</Filter> | |||
<Filter Name="juce_gui_basics"> | |||
<Filter Name="components"> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | |||
<FileConfiguration Name="Debug|Win32" | |||
ExcludedFromBuild="true"> | |||
@@ -1178,6 +1178,7 @@ | |||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/> | |||
@@ -1869,6 +1869,9 @@ | |||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"> | |||
<Filter>Juce Modules\juce_graphics</Filter> | |||
</ClInclude> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"> | |||
<Filter>Juce Modules\juce_gui_basics\components</Filter> | |||
</ClInclude> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"> | |||
<Filter>Juce Modules\juce_gui_basics\components</Filter> | |||
</ClInclude> | |||
@@ -2697,6 +2697,7 @@ | |||
</Filter> | |||
<Filter Name="juce_gui_basics"> | |||
<Filter Name="components"> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | |||
<FileConfiguration Name="Debug|Win32" | |||
ExcludedFromBuild="true"> | |||
@@ -2697,6 +2697,7 @@ | |||
</Filter> | |||
<Filter Name="juce_gui_basics"> | |||
<Filter Name="components"> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | |||
<FileConfiguration Name="Debug|Win32" | |||
ExcludedFromBuild="true"> | |||
@@ -1454,6 +1454,7 @@ | |||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/> | |||
@@ -2367,6 +2367,9 @@ | |||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"> | |||
<Filter>Juce Modules\juce_graphics</Filter> | |||
</ClInclude> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"> | |||
<Filter>Juce Modules\juce_gui_basics\components</Filter> | |||
</ClInclude> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"> | |||
<Filter>Juce Modules\juce_gui_basics\components</Filter> | |||
</ClInclude> | |||
@@ -636,6 +636,7 @@ | |||
A974197873E277C3BA5DF666 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_cryptography.h"; path = "../../../../modules/juce_cryptography/juce_cryptography.h"; sourceTree = "SOURCE_ROOT"; }; | |||
A97EC32975392744C62684F9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_gui_extra.h"; path = "../../../../modules/juce_gui_extra/juce_gui_extra.h"; sourceTree = "SOURCE_ROOT"; }; | |||
A9958339328213FF76D8A79C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MouseInputSource.cpp"; path = "../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
A9B72D6049A3539B63AE79D5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CachedComponentImage.h"; path = "../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h"; sourceTree = "SOURCE_ROOT"; }; | |||
AA0DE5CA2B089393B110FD25 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableShape.h"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.h"; sourceTree = "SOURCE_ROOT"; }; | |||
AAABC8FBF364D9A596F4AA4E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_android_JNIHelpers.h"; path = "../../../../modules/juce_core/native/juce_android_JNIHelpers.h"; sourceTree = "SOURCE_ROOT"; }; | |||
AAC98CB517D934F42A25416E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BubbleComponent.h"; path = "../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h"; sourceTree = "SOURCE_ROOT"; }; | |||
@@ -1540,6 +1541,7 @@ | |||
B523ED8502475B9BB3F392C7, | |||
BF59C96BC3BCB29CCB421861 ); name = "juce_graphics"; sourceTree = "<group>"; }; | |||
754D5C51D503AEDC94BCDDFC = { isa = PBXGroup; children = ( | |||
A9B72D6049A3539B63AE79D5, | |||
79078F37EB6919AA440017FC, | |||
C9AEAD8B2366F9508E63A178, | |||
BF6F272194D16055D6A90D94, | |||
@@ -33,11 +33,33 @@ class DemoOpenGLCanvas : public OpenGLComponent, | |||
{ | |||
public: | |||
DemoOpenGLCanvas() | |||
: rotation (0.0f), | |||
delta (1.0f), | |||
: OpenGLComponent (openGLDefault), rotation (0.0f), | |||
textScrollPos (200) | |||
{ | |||
startTimer (20); | |||
infoLabel.setText ("These sliders demonstrate how components can be added as children " | |||
"of an OpenGLComponent, in which case, their content will be rendered into " | |||
"an OpenGL framebuffer and efficiently overlaid onto your GL content.", false); | |||
infoLabel.setBounds ("parent.width * 0.05, bottom - 150, parent.width * 0.4, parent.height - 60"); | |||
infoLabel.setInterceptsMouseClicks (false, false); | |||
addAndMakeVisible (&infoLabel); | |||
speedSlider.setRange (-10.0, 10.0, 0.1); | |||
speedSlider.setPopupMenuEnabled (true); | |||
speedSlider.setValue (Random::getSystemRandom().nextDouble() * 3.0, false, false); | |||
speedSlider.setSliderStyle (Slider::LinearHorizontal); | |||
speedSlider.setTextBoxStyle (Slider::TextBoxLeft, false, 80, 20); | |||
speedSlider.setBounds ("parent.width * 0.05, parent.height - 65, parent.width * 0.6, top + 24"); | |||
addAndMakeVisible (&speedSlider); | |||
sizeSlider.setRange (0.2, 2.0, 0.01); | |||
sizeSlider.setPopupMenuEnabled (true); | |||
sizeSlider.setValue (Random::getSystemRandom().nextDouble() + 0.5, false, false); | |||
sizeSlider.setSliderStyle (Slider::LinearHorizontal); | |||
sizeSlider.setTextBoxStyle (Slider::TextBoxLeft, false, 80, 20); | |||
sizeSlider.setBounds ("parent.width * 0.05, parent.height - 35, parent.width * 0.6, top + 24"); | |||
addAndMakeVisible (&sizeSlider); | |||
startTimer (1000 / 30); | |||
} | |||
// when the component creates a new internal context, this is called, and | |||
@@ -56,8 +78,7 @@ public: | |||
void mouseDrag (const MouseEvent& e) | |||
{ | |||
draggableOrientation.mouseDrag (e.getPosition()); | |||
delta = e.getDistanceFromDragStartX() / 100.0f; | |||
repaint(); | |||
triggerRepaint(); | |||
} | |||
void resized() | |||
@@ -81,6 +102,7 @@ public: | |||
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | |||
glEnable (GL_TEXTURE_2D); | |||
OpenGLHelpers::prepareFor2D (getWidth(), getHeight()); | |||
OpenGLHelpers::setPerspective (45.0, getWidth() / (double) getHeight(), 0.1, 100.0); | |||
glTranslatef (0.0f, 0.0f, -5.0f); | |||
@@ -101,8 +123,6 @@ public: | |||
tex2->draw3D (-1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, Colours::white); | |||
tex2->draw3D ( 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, Colours::white); | |||
tex2->draw3D (-1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, Colours::white); | |||
drawForeground2DStuff(); // draws our scrolling text overlay | |||
} | |||
void updateTextureImage() | |||
@@ -110,7 +130,8 @@ public: | |||
// This image is a special framebuffer-backed image, so when we draw to it, the context | |||
// will render directly into its framebuffer | |||
dynamicTextureImage.clear (dynamicTextureImage.getBounds(), Colours::red.withRotatedHue (fabsf (::sinf (rotation / 300.0f))).withAlpha (0.7f)); | |||
dynamicTextureImage.clear (dynamicTextureImage.getBounds(), | |||
Colours::red.withRotatedHue (fabsf (::sinf (rotation / 300.0f))).withAlpha (0.7f)); | |||
Graphics g (dynamicTextureImage); | |||
@@ -127,9 +148,9 @@ public: | |||
// This stuff just creates a spinning star shape and fills it.. | |||
Path p; | |||
const float scale = getHeight() * 0.4f; | |||
p.addStar (getLocalBounds().getCentre().toFloat(), 7, | |||
scale + ::cosf (rotation * 0.0021f) * scale / 2, | |||
scale + ::sinf (rotation * 0.001f) * scale / 2, rotation / 50.0f); | |||
p.addStar (Point<float> (getWidth() * 0.7f, getHeight() * 0.4f), 7, | |||
scale * (float) sizeSlider.getValue(), scale, | |||
rotation / 50.0f); | |||
g.setGradientFill (ColourGradient (Colours::green.withRotatedHue (fabsf (::sinf (rotation / 300.0f))), | |||
0, 0, | |||
@@ -138,36 +159,21 @@ public: | |||
g.fillPath (p); | |||
} | |||
void drawForeground2DStuff() | |||
{ | |||
OpenGLRenderer glRenderer (*this); // Create an OpenGLRenderer that will draw into this GL window.. | |||
Graphics g (&glRenderer); // ..and then wrap it in a normal Graphics object so we can draw with it. | |||
// Then, just draw our scolling text like we would in any other component. | |||
g.setColour (Colours::blue.withAlpha (0.5f)); | |||
g.setFont (30.0f, Font::bold); | |||
drawScrollingMessage (g, getHeight() / 2); | |||
} | |||
void drawScrollingMessage (Graphics& g, int y) const | |||
{ | |||
g.drawSingleLineText ("The background, foreground and texture are all being drawn using the OpenGLRenderer class, which " | |||
"lets you use a standard JUCE 2D graphics context to render directly onto an OpenGL window or framebuffer... ", | |||
(int) -std::fmod (textScrollPos, 2500.0f), y); | |||
} | |||
void timerCallback() | |||
{ | |||
rotation += delta; | |||
rotation += (float) speedSlider.getValue(); | |||
textScrollPos += 1.4f; | |||
repaint(); | |||
triggerRepaint(); | |||
} | |||
private: | |||
Image logoImage, dynamicTextureImage; | |||
float rotation, delta, textScrollPos; | |||
float rotation, textScrollPos; | |||
Draggable3DOrientation draggableOrientation; | |||
Slider speedSlider, sizeSlider; | |||
Label infoLabel; | |||
// Functions to create a couple of images to use as textures.. | |||
static Image createLogoImage() | |||
{ | |||
@@ -194,6 +200,13 @@ private: | |||
g.fillPath (pp); | |||
} | |||
} | |||
void drawScrollingMessage (Graphics& g, int y) const | |||
{ | |||
g.drawSingleLineText ("The background, foreground and texture are all being drawn using the OpenGLRenderer class, which " | |||
"lets you use a standard JUCE 2D graphics context to render directly onto an OpenGL window or framebuffer... ", | |||
(int) -std::fmod (textScrollPos, 2500.0f), y); | |||
} | |||
}; | |||
@@ -588,6 +588,7 @@ | |||
AAA122282581E6425F5D9405 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OggVorbisAudioFormat.cpp"; path = "../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
AB0E8347C9AC7E4A861C0252 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_IIRFilterAudioSource.h"; path = "../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; | |||
AB7726FF34DB2E7FA75ECC19 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToolbarItemComponent.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
AB7BCFBC4B2CB784F57A0FBC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUInputFormatConverter.h; path = Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUInputFormatConverter.h; sourceTree = "DEVELOPER_DIR"; }; | |||
AB87317D90A518C8A886EE9D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioDeviceSelectorComponent.h"; path = "../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h"; sourceTree = "SOURCE_ROOT"; }; | |||
ABC394D5E03B690404E80E1E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_MessageManager.mm"; path = "../../../../modules/juce_events/native/juce_mac_MessageManager.mm"; sourceTree = "SOURCE_ROOT"; }; | |||
ABCB715245090A15092108D5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioDeviceManager.h"; path = "../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h"; sourceTree = "SOURCE_ROOT"; }; | |||
@@ -611,7 +612,6 @@ | |||
AA012A21BE3049C205D4A44A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_AudioCDReader.cpp"; path = "../../../../modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
AAEC41BFA57E45EBF94ED3C1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableImage.cpp"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
AB10327C69AAE4AACCFC81EB = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableText.cpp"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawableText.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
AB7BCFBC4B2CB784F57A0FBC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUInputFormatConverter.h; path = Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUInputFormatConverter.h; sourceTree = "DEVELOPER_DIR"; }; | |||
AB9AD07EF899B75AC4CF01DA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAMutex.h; path = Extras/CoreAudio/PublicUtility/CAMutex.h; sourceTree = "DEVELOPER_DIR"; }; | |||
AC5452F5122E3A4B670B5185 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioThumbnail.h"; path = "../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.h"; sourceTree = "SOURCE_ROOT"; }; | |||
ACC4E765AD4BF1D025FB4E83 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Network.cpp"; path = "../../../../modules/juce_core/native/juce_linux_Network.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
@@ -735,6 +735,7 @@ | |||
DB28D7857D3A5BB7091AF74E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Network.mm"; path = "../../../../modules/juce_core/native/juce_mac_Network.mm"; sourceTree = "SOURCE_ROOT"; }; | |||
DBEA8C45A32E4462BADEF57C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ValueTree.h"; path = "../../../../modules/juce_data_structures/values/juce_ValueTree.h"; sourceTree = "SOURCE_ROOT"; }; | |||
DBFEFB5A6C80C7BA4F30E668 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GIFLoader.cpp"; path = "../../../../modules/juce_graphics/image_formats/juce_GIFLoader.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
DC1620808CB348FA6A061F49 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CachedComponentImage.h"; path = "../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h"; sourceTree = "SOURCE_ROOT"; }; | |||
DC4D4D24B977FC378EBED464 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatReaderSource.cpp"; path = "../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
DC56C72351E6237B4E6AC628 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Fonts.cpp"; path = "../../../../modules/juce_graphics/native/juce_linux_Fonts.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
DCB5B59D3F5E1075E42DC5AE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorPlayer.h"; path = "../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h"; sourceTree = "SOURCE_ROOT"; }; | |||
@@ -1460,6 +1461,7 @@ | |||
79B3B7E2DD82AB16C411D9E0, | |||
E9B20812DF15AC01D00FAFF5 ); name = "juce_graphics"; sourceTree = "<group>"; }; | |||
644A6B4EE1701D8441A41B49 = { isa = PBXGroup; children = ( | |||
DC1620808CB348FA6A061F49, | |||
9941F313443F3B72CA820E71, | |||
A7EE73FF3A5962BBF41DC2AB, | |||
89520054769FD08A7E2C2D4C, | |||
@@ -2574,6 +2574,7 @@ | |||
</Filter> | |||
<Filter Name="juce_gui_basics"> | |||
<Filter Name="components"> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | |||
<FileConfiguration Name="Debug|Win32" | |||
ExcludedFromBuild="true"> | |||
@@ -2574,6 +2574,7 @@ | |||
</Filter> | |||
<Filter Name="juce_gui_basics"> | |||
<Filter Name="components"> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | |||
<FileConfiguration Name="Debug|Win32" | |||
ExcludedFromBuild="true"> | |||
@@ -718,33 +718,22 @@ | |||
D313CF37B25D7FD313C4F336 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; | |||
D314CF2F97529FCF35042263 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ActionBroadcaster.cpp"; path = "../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
D3CBC8D7CD32BDA0D37B4155 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_File.h"; path = "../../../../modules/juce_core/files/juce_File.h"; sourceTree = "SOURCE_ROOT"; }; | |||
D3D7C89A43B6A3591B776B1E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_WebBrowserComponent.mm"; path = "../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm"; sourceTree = "SOURCE_ROOT"; }; | |||
D3EF8617364177AD4D247124 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_WASAPI.cpp"; path = "../../../../modules/juce_audio_devices/native/juce_win32_WASAPI.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
D41728E9EB1522CCAC9AC7D4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CameraDevice.h"; path = "../../../../modules/juce_video/capture/juce_CameraDevice.h"; sourceTree = "SOURCE_ROOT"; }; | |||
D41EA1E6002DE5DEB9A07CAA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentPeer.h"; path = "../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.h"; sourceTree = "SOURCE_ROOT"; }; | |||
D4CC4DE44C44AEE40085ACD7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_OpenGLComponent.cpp"; path = "../../../../modules/juce_opengl/native/juce_linux_OpenGLComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
D4DA13E7A12FB69C072D0FA7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ShapeButton.cpp"; path = "../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
D4EBC17BDB7F88CCBC76730B = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; }; | |||
D579AF76963B677C425CBF00 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OldSchoolLookAndFeel.h"; path = "../../../../modules/juce_gui_extra/lookandfeel/juce_OldSchoolLookAndFeel.h"; sourceTree = "SOURCE_ROOT"; }; | |||
D5952905FC386C19D0818398 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_JPEGLoader.cpp"; path = "../../../../modules/juce_graphics/image_formats/juce_JPEGLoader.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
D5C074653417ED69A2B570AC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_processors.mm"; path = "../../../../modules/juce_audio_processors/juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; }; | |||
D7433453EBB3700D2805FF42 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_XmlDocument.h"; path = "../../../../modules/juce_core/xml/juce_XmlDocument.h"; sourceTree = "SOURCE_ROOT"; }; | |||
D795067D4EFB5A34BC383250 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ThreadPool.h"; path = "../../../../modules/juce_core/threads/juce_ThreadPool.h"; sourceTree = "SOURCE_ROOT"; }; | |||
D79E29A54AE62E03A533F436 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StretchableLayoutResizerBar.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
D7C1255A555A016BA0D98228 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_cryptography.h"; path = "../../../../modules/juce_cryptography/juce_cryptography.h"; sourceTree = "SOURCE_ROOT"; }; | |||
D7D1FFD98DABD765479240E6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_EdgeTable.cpp"; path = "../../../../modules/juce_graphics/geometry/juce_EdgeTable.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
D8A3F086596562E081EB0F39 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormatManager.h"; path = "../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.h"; sourceTree = "SOURCE_ROOT"; }; | |||
D8B7DCDFD32613B13AC54008 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LookAndFeel.cpp"; path = "../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
D8C28108DE7AD0208D790606 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ProgressBar.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
D9207F324519739FC25FFBDE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_core.h"; path = "../../../../modules/juce_core/juce_core.h"; sourceTree = "SOURCE_ROOT"; }; | |||
D950776EDF9260DB0278C132 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SliderPropertyComponent.cpp"; path = "../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
D9857957A36A3081186D53FC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_CameraDevice.cpp"; path = "../../../../modules/juce_video/native/juce_android_CameraDevice.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
DA918320EF4057DF54FF8909 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ActionBroadcaster.h"; path = "../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.h"; sourceTree = "SOURCE_ROOT"; }; | |||
DBD90FC88456B62308AD9AD0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_events.mm"; path = "../../../../modules/juce_events/juce_events.mm"; sourceTree = "SOURCE_ROOT"; }; | |||
DC30BDE9C4EE1FD059D06902 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioDataConverters.cpp"; path = "../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
DD8E5D0C88FA2C287F824357 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GraphEditorPanel.h; path = ../../Source/GraphEditorPanel.h; sourceTree = "SOURCE_ROOT"; }; | |||
DE0C4CC1CE545BAD009786E4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatWriter.cpp"; path = "../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
DE8035865F6033F8BBF41740 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_HyperlinkButton.cpp"; path = "../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
E146C1CCDC8EA0498CD33E5D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioIODevice.cpp"; path = "../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
E179C9C99270068D4ED16872 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReverbAudioSource.h"; path = "../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.h"; sourceTree = "SOURCE_ROOT"; }; | |||
E68018DE199135B7F738FB17 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; }; | |||
@@ -755,11 +744,21 @@ | |||
CBE270C197A66B22EEE54D9C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginListComponent.cpp"; path = "../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
CF67033CFC21C0060B538042 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReferenceCountedObject.h"; path = "../../../../modules/juce_core/memory/juce_ReferenceCountedObject.h"; sourceTree = "SOURCE_ROOT"; }; | |||
D06DA3FA113EAB0CCF8D7A64 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Singleton.h"; path = "../../../../modules/juce_core/memory/juce_Singleton.h"; sourceTree = "SOURCE_ROOT"; }; | |||
D3D7C89A43B6A3591B776B1E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_WebBrowserComponent.mm"; path = "../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm"; sourceTree = "SOURCE_ROOT"; }; | |||
D41728E9EB1522CCAC9AC7D4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CameraDevice.h"; path = "../../../../modules/juce_video/capture/juce_CameraDevice.h"; sourceTree = "SOURCE_ROOT"; }; | |||
D4CC4DE44C44AEE40085ACD7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_OpenGLComponent.cpp"; path = "../../../../modules/juce_opengl/native/juce_linux_OpenGLComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
D4DA13E7A12FB69C072D0FA7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ShapeButton.cpp"; path = "../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
D52F4E0C637B4685217CBEB4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Decibels.h"; path = "../../../../modules/juce_audio_basics/effects/juce_Decibels.h"; sourceTree = "SOURCE_ROOT"; }; | |||
D5C074653417ED69A2B570AC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_processors.mm"; path = "../../../../modules/juce_audio_processors/juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; }; | |||
D79E29A54AE62E03A533F436 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StretchableLayoutResizerBar.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
D8B7DCDFD32613B13AC54008 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LookAndFeel.cpp"; path = "../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
D92D579F2458F2426E5F828A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedWriteLock.h"; path = "../../../../modules/juce_core/threads/juce_ScopedWriteLock.h"; sourceTree = "SOURCE_ROOT"; }; | |||
D950776EDF9260DB0278C132 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SliderPropertyComponent.cpp"; path = "../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
D9857957A36A3081186D53FC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_CameraDevice.cpp"; path = "../../../../modules/juce_video/native/juce_android_CameraDevice.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
DA9E577DC37123CEA41C4A71 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WaitableEvent.h"; path = "../../../../modules/juce_core/threads/juce_WaitableEvent.h"; sourceTree = "SOURCE_ROOT"; }; | |||
DAF7C72A4348C33364BB654C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CallbackMessage.h"; path = "../../../../modules/juce_events/messages/juce_CallbackMessage.h"; sourceTree = "SOURCE_ROOT"; }; | |||
DB246262CA669F13ABDDB33E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InterprocessConnectionServer.cpp"; path = "../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
DBD90FC88456B62308AD9AD0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_events.mm"; path = "../../../../modules/juce_events/juce_events.mm"; sourceTree = "SOURCE_ROOT"; }; | |||
DCACD63912A2F68687ED06CF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryInputStream.h"; path = "../../../../modules/juce_core/streams/juce_MemoryInputStream.h"; sourceTree = "SOURCE_ROOT"; }; | |||
DD53156BA824889FD7DF52D2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ThreadPool.cpp"; path = "../../../../modules/juce_core/threads/juce_ThreadPool.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
DD68D7D44BC0B2CA5DCE8532 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChangeBroadcaster.h"; path = "../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.h"; sourceTree = "SOURCE_ROOT"; }; | |||
@@ -769,6 +768,7 @@ | |||
DE0712F13AD6AB6180E2E680 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileSearchPathListComponent.cpp"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
DE1FE14BE1B14A214C2D8B66 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_WildcardFileFilter.cpp"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_WildcardFileFilter.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
DE435BB18276B8626AF37D05 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedValueSetter.h"; path = "../../../../modules/juce_core/containers/juce_ScopedValueSetter.h"; sourceTree = "SOURCE_ROOT"; }; | |||
DE8035865F6033F8BBF41740 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_HyperlinkButton.cpp"; path = "../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
DEEFCE87BE3B9D7AFC7ADC16 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationCommandInfo.cpp"; path = "../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
DF309886A3D26FC34280B329 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_CameraDevice.mm"; path = "../../../../modules/juce_video/native/juce_mac_CameraDevice.mm"; sourceTree = "SOURCE_ROOT"; }; | |||
DF614EDBEA2D76889E002465 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_SystemTrayIcon.cpp"; path = "../../../../modules/juce_gui_extra/native/juce_linux_SystemTrayIcon.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
@@ -854,6 +854,7 @@ | |||
F86E07B5B542F6F4B7F77A4F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorPlayer.h"; path = "../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h"; sourceTree = "SOURCE_ROOT"; }; | |||
F86F912E470660B0C7047823 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Threads.cpp"; path = "../../../../modules/juce_core/native/juce_android_Threads.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
F8700C66EB5AE3292B585E19 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_String.cpp"; path = "../../../../modules/juce_core/text/juce_String.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
F8D23A339EA851D0838B8D4D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CachedComponentImage.h"; path = "../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h"; sourceTree = "SOURCE_ROOT"; }; | |||
F95046FD2C915F846BD111EF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ColourSelector.h"; path = "../../../../modules/juce_gui_extra/misc/juce_ColourSelector.h"; sourceTree = "SOURCE_ROOT"; }; | |||
F98172E9B1C7D23875AC5D81 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Button.h"; path = "../../../../modules/juce_gui_basics/buttons/juce_Button.h"; sourceTree = "SOURCE_ROOT"; }; | |||
FA6653EBE05E085359941C7F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiDocumentPanel.h"; path = "../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h"; sourceTree = "SOURCE_ROOT"; }; | |||
@@ -1472,6 +1473,7 @@ | |||
45200F793669CADC5D279093, | |||
2483323E997B7A3171E39DE0 ); name = "juce_graphics"; sourceTree = "<group>"; }; | |||
46B3BECE46528A3B74650149 = { isa = PBXGroup; children = ( | |||
F8D23A339EA851D0838B8D4D, | |||
536EA9AE6C2F76FE0AEB5958, | |||
3D6993BA129CF5B3D55E3800, | |||
89CF202FAEC4E5F57AF226C0, | |||
@@ -2620,6 +2620,7 @@ | |||
</Filter> | |||
<Filter Name="juce_gui_basics"> | |||
<Filter Name="components"> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | |||
<FileConfiguration Name="Debug|Win32" | |||
ExcludedFromBuild="true"> | |||
@@ -2620,6 +2620,7 @@ | |||
</Filter> | |||
<Filter Name="juce_gui_basics"> | |||
<Filter Name="components"> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | |||
<FileConfiguration Name="Debug|Win32" | |||
ExcludedFromBuild="true"> | |||
@@ -158,6 +158,7 @@ | |||
35BD72D236BE7ADC019B5564 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Uuid.cpp"; path = "../../../../modules/juce_core/misc/juce_Uuid.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
35CCF611A1FFF0A68FA75161 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PNGLoader.cpp"; path = "../../../../modules/juce_graphics/image_formats/juce_PNGLoader.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
3705B72C4B467A1EABEC9C49 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_FileChooser.cpp"; path = "../../../../modules/juce_gui_basics/native/juce_win32_FileChooser.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
37380DEDD5BEE5E9267FA12F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CachedComponentImage.h"; path = "../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h"; sourceTree = "SOURCE_ROOT"; }; | |||
373E70565BE10D615B096C28 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DropShadowEffect.cpp"; path = "../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
3824684DA7C61AA29E386158 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InterprocessConnection.cpp"; path = "../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
3832110FA8DA58E650AB6F9E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Logger.cpp"; path = "../../../../modules/juce_core/logging/juce_Logger.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
@@ -1012,6 +1013,7 @@ | |||
7402FA767F4FD9CCD3DD1578, | |||
C794DBEF09A83E199223D205 ); name = "juce_graphics"; sourceTree = "<group>"; }; | |||
51F1DE322ACA481FA5B3E623 = { isa = PBXGroup; children = ( | |||
37380DEDD5BEE5E9267FA12F, | |||
9132D1324A6D6D049C9B2FFE, | |||
02BD81436ED17F1341E19522, | |||
01D5DC75EA54630B8805AD59, | |||
@@ -1669,6 +1669,7 @@ | |||
</Filter> | |||
<Filter Name="juce_gui_basics"> | |||
<Filter Name="components"> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | |||
<FileConfiguration Name="Debug|Win32" | |||
ExcludedFromBuild="true"> | |||
@@ -1669,6 +1669,7 @@ | |||
</Filter> | |||
<Filter Name="juce_gui_basics"> | |||
<Filter Name="components"> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | |||
<FileConfiguration Name="Debug|Win32" | |||
ExcludedFromBuild="true"> | |||
@@ -157,6 +157,7 @@ | |||
35BD72D236BE7ADC019B5564 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Uuid.cpp"; path = "../../../../modules/juce_core/misc/juce_Uuid.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
35CCF611A1FFF0A68FA75161 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PNGLoader.cpp"; path = "../../../../modules/juce_graphics/image_formats/juce_PNGLoader.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
3705B72C4B467A1EABEC9C49 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_FileChooser.cpp"; path = "../../../../modules/juce_gui_basics/native/juce_win32_FileChooser.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
37380DEDD5BEE5E9267FA12F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CachedComponentImage.h"; path = "../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h"; sourceTree = "SOURCE_ROOT"; }; | |||
373E70565BE10D615B096C28 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DropShadowEffect.cpp"; path = "../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
3824684DA7C61AA29E386158 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InterprocessConnection.cpp"; path = "../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
3832110FA8DA58E650AB6F9E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Logger.cpp"; path = "../../../../modules/juce_core/logging/juce_Logger.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
@@ -1012,6 +1013,7 @@ | |||
7402FA767F4FD9CCD3DD1578, | |||
C794DBEF09A83E199223D205 ); name = "juce_graphics"; sourceTree = "<group>"; }; | |||
51F1DE322ACA481FA5B3E623 = { isa = PBXGroup; children = ( | |||
37380DEDD5BEE5E9267FA12F, | |||
9132D1324A6D6D049C9B2FFE, | |||
02BD81436ED17F1341E19522, | |||
01D5DC75EA54630B8805AD59, | |||
@@ -23,6 +23,7 @@ | |||
00CF31E5308FA881A2BA8B08 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SystemTrayIconComponent.cpp"; path = "../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
013DC5FB9C18CB09AAF95E1E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TemporaryFile.cpp"; path = "../../../../modules/juce_core/files/juce_TemporaryFile.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
015B185333C7E2F470FC8325 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SliderPropertyComponent.h"; path = "../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; }; | |||
018519396BA8CBC647868276 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CachedComponentImage.h"; path = "../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h"; sourceTree = "SOURCE_ROOT"; }; | |||
0262A5CBDB40A5DFB3D90F1D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StretchableLayoutManager.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
032F9FED5A2B45277FBC5288 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileFilter.h"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FileFilter.h"; sourceTree = "SOURCE_ROOT"; }; | |||
0336581C6D8A82ED77962437 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Colour.h"; path = "../../../../modules/juce_graphics/colour/juce_Colour.h"; sourceTree = "SOURCE_ROOT"; }; | |||
@@ -1391,6 +1392,7 @@ | |||
F68ED837371C2CA43A42793F, | |||
3C5821771E2E831483EBE312 ); name = "juce_graphics"; sourceTree = "<group>"; }; | |||
EDA276A5ED4DDEA021B74225 = { isa = PBXGroup; children = ( | |||
018519396BA8CBC647868276, | |||
196B21E0D34FF36EE398FE07, | |||
F8CB2C407443DD4FE38CA7BE, | |||
F7D11568291BA9EA434B7CFB, | |||
@@ -2511,6 +2511,7 @@ | |||
</Filter> | |||
<Filter Name="juce_gui_basics"> | |||
<Filter Name="components"> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | |||
<FileConfiguration Name="Debug|Win32" | |||
ExcludedFromBuild="true"> | |||
@@ -1400,6 +1400,7 @@ | |||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/> | |||
@@ -2202,6 +2202,9 @@ | |||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"> | |||
<Filter>Juce Modules\juce_graphics</Filter> | |||
</ClInclude> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"> | |||
<Filter>Juce Modules\juce_gui_basics\components</Filter> | |||
</ClInclude> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"> | |||
<Filter>Juce Modules\juce_gui_basics\components</Filter> | |||
</ClInclude> | |||
@@ -739,6 +739,7 @@ | |||
F4E02B94DE69B0D5FAAE29BC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TabbedComponent.h"; path = "../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.h"; sourceTree = "SOURCE_ROOT"; }; | |||
F65E29974BC6055F80DA44C4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CallOutBox.cpp"; path = "../../../../modules/juce_gui_basics/windows/juce_CallOutBox.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
F66E3475BA4C36658C3EDA15 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MenuBarComponent.h"; path = "../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.h"; sourceTree = "SOURCE_ROOT"; }; | |||
F672BEFBC87CBC0692E299FC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CachedComponentImage.h"; path = "../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h"; sourceTree = "SOURCE_ROOT"; }; | |||
F6B1C427AA9129CDD9E4761B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LowLevelGraphicsSoftwareRenderer.h"; path = "../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h"; sourceTree = "SOURCE_ROOT"; }; | |||
F6F724542F5201858B8145DC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileBasedDocument.cpp"; path = "../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp"; sourceTree = "SOURCE_ROOT"; }; | |||
F758385A897FAE5BE521CD98 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ValueTree.h"; path = "../../../../modules/juce_data_structures/values/juce_ValueTree.h"; sourceTree = "SOURCE_ROOT"; }; | |||
@@ -1272,6 +1273,7 @@ | |||
BA20E35BA5FF1801D0B86BC9, | |||
E9DC95A85AB25565E8FACF91 ); name = "juce_graphics"; sourceTree = "<group>"; }; | |||
F873E58ECE3D8868365BBECC = { isa = PBXGroup; children = ( | |||
F672BEFBC87CBC0692E299FC, | |||
55670E58151A717FBD6D1C65, | |||
846146B17629B8601BAFD3BC, | |||
A8ED2088E4636DD9BC944833, | |||
@@ -1836,6 +1836,7 @@ | |||
</Filter> | |||
<Filter Name="juce_gui_basics"> | |||
<Filter Name="components"> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | |||
<FileConfiguration Name="Debug|Win32" | |||
ExcludedFromBuild="true"> | |||
@@ -1175,6 +1175,7 @@ | |||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/> | |||
@@ -1926,6 +1926,9 @@ | |||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"> | |||
<Filter>Juce Modules\juce_graphics</Filter> | |||
</ClInclude> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"> | |||
<Filter>Juce Modules\juce_gui_basics\components</Filter> | |||
</ClInclude> | |||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"> | |||
<Filter>Juce Modules\juce_gui_basics\components</Filter> | |||
</ClInclude> | |||
@@ -0,0 +1,67 @@ | |||
/* | |||
============================================================================== | |||
This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||
Copyright 2004-11 by Raw Material Software Ltd. | |||
------------------------------------------------------------------------------ | |||
JUCE can be redistributed and/or modified under the terms of the GNU General | |||
Public License (Version 2), as published by the Free Software Foundation. | |||
A copy of the license is included in the JUCE distribution, or can be found | |||
online at www.gnu.org/licenses. | |||
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY | |||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||
A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||
------------------------------------------------------------------------------ | |||
To release a closed-source product which uses JUCE, commercial licenses are | |||
available: visit www.rawmaterialsoftware.com/juce for more information. | |||
============================================================================== | |||
*/ | |||
#ifndef __JUCE_CACHEDCOMPONENTIMAGE_JUCEHEADER__ | |||
#define __JUCE_CACHEDCOMPONENTIMAGE_JUCEHEADER__ | |||
class Component; | |||
//============================================================================== | |||
/** | |||
Base class used internally for structures that can store cached images of | |||
component state. | |||
Most people are unlikely to ever need to know about this class - it's really | |||
only for power-users! | |||
@see Component::setCachedComponentImage | |||
*/ | |||
class JUCE_API CachedComponentImage | |||
{ | |||
public: | |||
CachedComponentImage() noexcept {} | |||
virtual ~CachedComponentImage() {} | |||
//============================================================================== | |||
/** Called as part of the parent component's paint method, this must draw | |||
the given component into the target graphics context, using the cached | |||
version where possible. | |||
*/ | |||
virtual void paint (Graphics&) = 0; | |||
/** Invalidates all cached image data. */ | |||
virtual void invalidateAll() = 0; | |||
/** Invalidates a section of the cached image data. */ | |||
virtual void invalidate (const Rectangle<int>& area) = 0; | |||
/** Called to indicate that the component is no longer active, so | |||
any cached data should be released if possible. | |||
*/ | |||
virtual void releaseResources() = 0; | |||
}; | |||
#endif // __JUCE_CACHEDCOMPONENTIMAGE_JUCEHEADER__ |
@@ -35,7 +35,7 @@ Component* Component::currentlyFocusedComponent = nullptr; | |||
class Component::MouseListenerList | |||
{ | |||
public: | |||
MouseListenerList() | |||
MouseListenerList() noexcept | |||
: numDeepMouseListeners (0) | |||
{ | |||
} | |||
@@ -377,6 +377,73 @@ public: | |||
} | |||
}; | |||
//============================================================================== | |||
class StandardCachedComponentImage : public CachedComponentImage | |||
{ | |||
public: | |||
StandardCachedComponentImage (Component& owner_) noexcept : owner (owner_) {} | |||
void paint (Graphics& g) | |||
{ | |||
const Rectangle<int> bounds (owner.getLocalBounds()); | |||
if (image.isNull() || image.getBounds() != bounds) | |||
{ | |||
image = Image (owner.isOpaque() ? Image::RGB : Image::ARGB, | |||
jmax (1, bounds.getWidth()), jmax (1, bounds.getHeight()), ! owner.isOpaque()); | |||
validArea.clear(); | |||
} | |||
{ | |||
Graphics imG (image); | |||
LowLevelGraphicsContext* const lg = imG.getInternalContext(); | |||
for (RectangleList::Iterator i (validArea); i.next();) | |||
lg->excludeClipRectangle (*i.getRectangle()); | |||
if (! lg->isClipEmpty()) | |||
{ | |||
if (! owner.isOpaque()) | |||
{ | |||
lg->setFill (Colours::transparentBlack); | |||
lg->fillRect (bounds, true); | |||
lg->setFill (Colours::black); | |||
} | |||
owner.paintEntireComponent (imG, true); | |||
} | |||
} | |||
validArea = bounds; | |||
g.setColour (Colours::black.withAlpha (owner.getAlpha())); | |||
g.drawImageAt (image, 0, 0); | |||
} | |||
void invalidateAll() | |||
{ | |||
validArea.clear(); | |||
} | |||
void invalidate (const Rectangle<int>& area) | |||
{ | |||
validArea.subtract (area); | |||
} | |||
void releaseResources() | |||
{ | |||
image = Image::null; | |||
} | |||
private: | |||
Image image; | |||
RectangleList validArea; | |||
Component& owner; | |||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (StandardCachedComponentImage); | |||
}; | |||
//============================================================================== | |||
Component::Component() | |||
@@ -461,16 +528,21 @@ void Component::setVisible (bool shouldBeVisible) | |||
// thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. | |||
CHECK_MESSAGE_MANAGER_IS_LOCKED | |||
WeakReference<Component> safePointer (this); | |||
const WeakReference<Component> safePointer (this); | |||
flags.visibleFlag = shouldBeVisible; | |||
internalRepaint (0, 0, getWidth(), getHeight()); | |||
if (shouldBeVisible) | |||
repaint(); | |||
else | |||
repaintParent(); | |||
sendFakeMouseMove(); | |||
if (! shouldBeVisible) | |||
{ | |||
if (cachedImage != nullptr) | |||
cachedImage->releaseResources(); | |||
if (currentlyFocusedComponent == this || isParentOf (currentlyFocusedComponent)) | |||
{ | |||
if (parentComponent != nullptr) | |||
@@ -567,7 +639,7 @@ void Component::addToDesktop (int styleWanted, void* nativeWindowToAttachTo) | |||
if (styleWanted != currentStyleFlags || ! flags.hasHeavyweightPeerFlag) | |||
{ | |||
WeakReference<Component> safePointer (this); | |||
const WeakReference<Component> safePointer (this); | |||
#if JUCE_LINUX | |||
// it's wise to give the component a non-zero size before | |||
@@ -701,12 +773,27 @@ bool Component::isOpaque() const noexcept | |||
} | |||
//============================================================================== | |||
void Component::setCachedComponentImage (CachedComponentImage* newCachedImage) | |||
{ | |||
cachedImage = newCachedImage; | |||
} | |||
void Component::setBufferedToImage (const bool shouldBeBuffered) | |||
{ | |||
if (shouldBeBuffered != flags.bufferToImageFlag) | |||
// This assertion means that this component is already using a custom CachedComponentImage, | |||
// so by calling setBufferedToImage, you'll be deleting the custom one - this is almost certainly | |||
// not what you wanted to happen... If you really do know what you're doing here, and want to | |||
// avoid this assertion, just call setCachedComponentImage (nullptr) before setBufferedToImage(). | |||
jassert (cachedImage == nullptr || dynamic_cast <StandardCachedComponentImage*> (cachedImage.get()) != nullptr); | |||
if (shouldBeBuffered) | |||
{ | |||
bufferedImage = Image::null; | |||
flags.bufferToImageFlag = shouldBeBuffered; | |||
if (cachedImage == nullptr) | |||
cachedImage = new StandardCachedComponentImage (*this); | |||
} | |||
else | |||
{ | |||
cachedImage = nullptr; | |||
} | |||
} | |||
@@ -935,17 +1022,17 @@ Rectangle<int> Component::localAreaToGlobal (const Rectangle<int>& area) const | |||
} | |||
/* Deprecated methods... */ | |||
const Point<int> Component::relativePositionToGlobal (const Point<int>& relativePosition) const | |||
Point<int> Component::relativePositionToGlobal (const Point<int>& relativePosition) const | |||
{ | |||
return localPointToGlobal (relativePosition); | |||
} | |||
const Point<int> Component::globalPositionToRelative (const Point<int>& screenPosition) const | |||
Point<int> Component::globalPositionToRelative (const Point<int>& screenPosition) const | |||
{ | |||
return getLocalPoint (nullptr, screenPosition); | |||
} | |||
const Point<int> Component::relativePositionToOtherComponent (const Component* const targetComponent, const Point<int>& positionRelativeToThis) const | |||
Point<int> Component::relativePositionToOtherComponent (const Component* const targetComponent, const Point<int>& positionRelativeToThis) const | |||
{ | |||
return targetComponent == nullptr ? localPointToGlobal (positionRelativeToThis) | |||
: targetComponent->getLocalPoint (this, positionRelativeToThis); | |||
@@ -991,9 +1078,9 @@ void Component::setBounds (const int x, const int y, int w, int h) | |||
else if (! flags.hasHeavyweightPeerFlag) | |||
repaintParent(); | |||
} | |||
else | |||
else if (cachedImage != nullptr) | |||
{ | |||
bufferedImage = Image::null; | |||
cachedImage->invalidateAll(); | |||
} | |||
if (flags.hasHeavyweightPeerFlag) | |||
@@ -1375,12 +1462,17 @@ Component* Component::removeChildComponent (const int index, bool sendParentEven | |||
if (sendParentEvents) | |||
{ | |||
sendFakeMouseMove(); | |||
child->repaintParent(); | |||
if (child->isVisible()) | |||
child->repaintParent(); | |||
} | |||
childComponentList.remove (index); | |||
child->parentComponent = nullptr; | |||
if (child->cachedImage != nullptr) | |||
child->cachedImage->releaseResources(); | |||
// (NB: there are obscure situations where child->isShowing() = false, but it still has the focus) | |||
if (currentlyFocusedComponent == child || child->isParentOf (currentlyFocusedComponent)) | |||
{ | |||
@@ -1702,112 +1794,76 @@ float Component::getAlpha() const | |||
return (255 - componentTransparency) / 255.0f; | |||
} | |||
void Component::repaintParent() | |||
//============================================================================== | |||
void Component::repaint() | |||
{ | |||
if (flags.visibleFlag) | |||
internalRepaint (0, 0, getWidth(), getHeight()); | |||
internalRepaintUnchecked (getLocalBounds(), true); | |||
} | |||
void Component::repaint() | |||
void Component::repaint (const int x, const int y, const int w, const int h) | |||
{ | |||
repaint (0, 0, getWidth(), getHeight()); | |||
internalRepaint (Rectangle<int> (x, y, w, h)); | |||
} | |||
void Component::repaint (const int x, const int y, | |||
const int w, const int h) | |||
void Component::repaint (const Rectangle<int>& area) | |||
{ | |||
bufferedImage = Image::null; | |||
internalRepaint (area); | |||
} | |||
if (flags.visibleFlag) | |||
internalRepaint (x, y, w, h); | |||
void Component::repaintParent() | |||
{ | |||
if (parentComponent != nullptr) | |||
parentComponent->internalRepaint (ComponentHelpers::convertToParentSpace (*this, getLocalBounds())); | |||
} | |||
void Component::repaint (const Rectangle<int>& area) | |||
void Component::internalRepaint (const Rectangle<int>& area) | |||
{ | |||
repaint (area.getX(), area.getY(), area.getWidth(), area.getHeight()); | |||
const Rectangle<int> r (area.getIntersection (getLocalBounds())); | |||
if (! r.isEmpty()) | |||
internalRepaintUnchecked (r, false); | |||
} | |||
void Component::internalRepaint (int x, int y, int w, int h) | |||
void Component::internalRepaintUnchecked (const Rectangle<int>& area, const bool isEntireComponent) | |||
{ | |||
// if component methods are being called from threads other than the message | |||
// thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. | |||
CHECK_MESSAGE_MANAGER_IS_LOCKED | |||
if (x < 0) | |||
{ | |||
w += x; | |||
x = 0; | |||
} | |||
if (x + w > getWidth()) | |||
w = getWidth() - x; | |||
if (w > 0) | |||
if (flags.visibleFlag) | |||
{ | |||
if (y < 0) | |||
if (flags.hasHeavyweightPeerFlag) | |||
{ | |||
h += y; | |||
y = 0; | |||
} | |||
if (y + h > getHeight()) | |||
h = getHeight() - y; | |||
ComponentPeer* const peer = getPeer(); | |||
if (h > 0) | |||
if (peer != nullptr) | |||
peer->repaint (area); | |||
} | |||
else | |||
{ | |||
if (parentComponent != nullptr) | |||
if (cachedImage != nullptr) | |||
{ | |||
if (parentComponent->flags.visibleFlag) | |||
{ | |||
if (affineTransform == nullptr) | |||
{ | |||
parentComponent->internalRepaint (x + getX(), y + getY(), w, h); | |||
} | |||
else | |||
{ | |||
const Rectangle<int> r (ComponentHelpers::convertToParentSpace (*this, Rectangle<int> (x, y, w, h))); | |||
parentComponent->internalRepaint (r.getX(), r.getY(), r.getWidth(), r.getHeight()); | |||
} | |||
} | |||
if (isEntireComponent) | |||
cachedImage->invalidateAll(); | |||
else | |||
cachedImage->invalidate (area); | |||
} | |||
else if (flags.hasHeavyweightPeerFlag) | |||
{ | |||
ComponentPeer* const peer = getPeer(); | |||
if (peer != nullptr) | |||
peer->repaint (Rectangle<int> (x, y, w, h)); | |||
} | |||
if (parentComponent != nullptr) | |||
parentComponent->internalRepaint (ComponentHelpers::convertToParentSpace (*this, area)); | |||
} | |||
} | |||
} | |||
//============================================================================== | |||
void Component::paintComponent (Graphics& g) | |||
{ | |||
if (flags.bufferToImageFlag) | |||
{ | |||
if (bufferedImage.isNull()) | |||
{ | |||
bufferedImage = Image (flags.opaqueFlag ? Image::RGB : Image::ARGB, | |||
getWidth(), getHeight(), ! flags.opaqueFlag); | |||
Graphics imG (bufferedImage); | |||
paint (imG); | |||
} | |||
g.setColour (Colours::black); | |||
g.drawImageAt (bufferedImage, 0, 0); | |||
} | |||
else | |||
{ | |||
paint (g); | |||
} | |||
} | |||
void Component::paintWithinParentContext (Graphics& g) | |||
{ | |||
g.setOrigin (getX(), getY()); | |||
paintEntireComponent (g, false); | |||
if (cachedImage != nullptr) | |||
cachedImage->paint (g); | |||
else | |||
paintEntireComponent (g, false); | |||
} | |||
void Component::paintComponentAndChildren (Graphics& g) | |||
@@ -1816,7 +1872,7 @@ void Component::paintComponentAndChildren (Graphics& g) | |||
if (flags.dontClipGraphicsFlag) | |||
{ | |||
paintComponent (g); | |||
paint (g); | |||
} | |||
else | |||
{ | |||
@@ -1824,7 +1880,7 @@ void Component::paintComponentAndChildren (Graphics& g) | |||
ComponentHelpers::clipObscuredRegions (*this, g, clipBounds, Point<int>()); | |||
if (! g.isClipEmpty()) | |||
paintComponent (g); | |||
paint (g); | |||
g.restoreState(); | |||
} | |||
@@ -1884,8 +1940,6 @@ void Component::paintComponentAndChildren (Graphics& g) | |||
void Component::paintEntireComponent (Graphics& g, const bool ignoreAlphaLevel) | |||
{ | |||
jassert (! g.isClipEmpty()); | |||
#if JUCE_DEBUG | |||
flags.isInsidePaintCall = true; | |||
#endif | |||
@@ -1990,7 +2044,7 @@ void Component::sendLookAndFeelChange() | |||
{ | |||
repaint(); | |||
WeakReference<Component> safePointer (this); | |||
const WeakReference<Component> safePointer (this); | |||
lookAndFeelChanged(); | |||
@@ -2592,7 +2646,7 @@ void Component::focusLost (FocusChangeType) | |||
void Component::internalFocusLoss (const FocusChangeType cause) | |||
{ | |||
WeakReference<Component> safePointer (this); | |||
const WeakReference<Component> safePointer (this); | |||
focusLost (focusChangedDirectly); | |||
@@ -2645,7 +2699,7 @@ void Component::setEnabled (const bool shouldBeEnabled) | |||
void Component::sendEnablementChangeMessage() | |||
{ | |||
WeakReference<Component> safePointer (this); | |||
const WeakReference<Component> safePointer (this); | |||
enablementChanged(); | |||
@@ -2731,14 +2785,12 @@ void Component::takeKeyboardFocus (const FocusChangeType cause) | |||
if (peer != nullptr) | |||
{ | |||
WeakReference<Component> safePointer (this); | |||
const WeakReference<Component> safePointer (this); | |||
peer->grabFocus(); | |||
if (peer->isFocused() && currentlyFocusedComponent != this) | |||
{ | |||
WeakReference<Component> componentLosingFocus (currentlyFocusedComponent); | |||
currentlyFocusedComponent = this; | |||
Desktop::getInstance().triggerFocusCallback(); | |||
@@ -2827,7 +2879,7 @@ void Component::moveKeyboardFocusToSibling (const bool moveToNext) | |||
{ | |||
if (nextComp->isCurrentlyBlockedByAnotherModalComponent()) | |||
{ | |||
WeakReference<Component> nextCompPointer (nextComp); | |||
const WeakReference<Component> nextCompPointer (nextComp); | |||
internalModalInputAttempt(); | |||
if (nextCompPointer == nullptr || nextComp->isCurrentlyBlockedByAnotherModalComponent()) | |||
@@ -40,6 +40,8 @@ class MouseInputSourceInternal; | |||
class ComponentPeer; | |||
class MarkerList; | |||
class RelativeRectangle; | |||
class CachedComponentImage; | |||
//============================================================================== | |||
/** | |||
@@ -958,8 +960,9 @@ public: | |||
There's no guarantee about how soon after calling repaint() the redraw will actually | |||
happen, and other queued events may be delivered before a redraw is done. | |||
If the setBufferedToImage() method has been used to cause this component | |||
to use a buffer, the repaint() call will invalidate the component's buffer. | |||
If the setBufferedToImage() method has been used to cause this component to use a | |||
buffer, the repaint() call will invalidate the cached buffer. If setCachedComponentImage() | |||
has been used to provide a custom image cache, that cache will be invalidated appropriately. | |||
To redraw just a subsection of the component rather than the whole thing, | |||
use the repaint (int, int, int, int) method. | |||
@@ -2227,12 +2230,24 @@ public: | |||
*/ | |||
void setPositioner (Positioner* newPositioner); | |||
/** Gives the component a CachedComponentImage that should be used to buffer its painting. | |||
The object that is passed-in will be owned by this component, and will be deleted automatically | |||
later on. | |||
@see setBufferedToImage | |||
*/ | |||
void setCachedComponentImage (CachedComponentImage* newCachedImage); | |||
/** Returns the object that was set by setCachedComponentImage(). | |||
@see setCachedComponentImage | |||
*/ | |||
CachedComponentImage* getCachedComponentImage() const noexcept { return cachedImage; } | |||
//============================================================================== | |||
#ifndef DOXYGEN | |||
// These methods are deprecated - use localPointToGlobal, getLocalPoint, getLocalPoint, etc instead. | |||
JUCE_DEPRECATED (const Point<int> relativePositionToGlobal (const Point<int>&) const); | |||
JUCE_DEPRECATED (const Point<int> globalPositionToRelative (const Point<int>&) const); | |||
JUCE_DEPRECATED (const Point<int> relativePositionToOtherComponent (const Component*, const Point<int>&) const); | |||
JUCE_DEPRECATED (Point<int> relativePositionToGlobal (const Point<int>&) const); | |||
JUCE_DEPRECATED (Point<int> globalPositionToRelative (const Point<int>&) const); | |||
JUCE_DEPRECATED (Point<int> relativePositionToOtherComponent (const Component*, const Point<int>&) const); | |||
#endif | |||
private: | |||
@@ -2254,7 +2269,7 @@ private: | |||
LookAndFeel* lookAndFeel; | |||
MouseCursor cursor; | |||
ImageEffectFilter* effect; | |||
Image bufferedImage; | |||
ScopedPointer <CachedComponentImage> cachedImage; | |||
class MouseListenerList; | |||
friend class MouseListenerList; | |||
@@ -2315,10 +2330,11 @@ private: | |||
void internalModifierKeysChanged(); | |||
void internalChildrenChanged(); | |||
void internalHierarchyChanged(); | |||
void internalRepaint (const Rectangle<int>&); | |||
void internalRepaintUnchecked (const Rectangle<int>&, bool); | |||
Component* removeChildComponent (int index, bool sendParentEvents, bool sendChildEvents); | |||
void moveChildInternal (int sourceIndex, int destIndex); | |||
void paintComponentAndChildren (Graphics&); | |||
void paintComponent (Graphics&); | |||
void paintWithinParentContext (Graphics&); | |||
void sendMovedResizedMessages (bool wasMoved, bool wasResized); | |||
void repaintParent(); | |||
@@ -2353,8 +2369,6 @@ private: | |||
protected: | |||
//============================================================================== | |||
/** @internal */ | |||
virtual void internalRepaint (int x, int y, int w, int h); | |||
/** @internal */ | |||
virtual ComponentPeer* createNewPeer (int styleFlags, void* nativeWindowToAttachTo); | |||
#endif | |||
}; | |||
@@ -75,6 +75,9 @@ BEGIN_JUCE_NAMESPACE | |||
// START_AUTOINCLUDE components, mouse, keyboard, buttons, drawables, | |||
// filebrowser, layout, lookandfeel, menus, positioning, properties, | |||
// widgets, windows, commands, application, misc | |||
#ifndef __JUCE_CACHEDCOMPONENTIMAGE_JUCEHEADER__ | |||
#include "components/juce_CachedComponentImage.h" | |||
#endif | |||
#ifndef __JUCE_COMPONENT_JUCEHEADER__ | |||
#include "components/juce_Component.h" | |||
#endif | |||
@@ -34,11 +34,6 @@ void* OpenGLComponent::getNativeWindowHandle() const | |||
return nullptr; | |||
} | |||
void OpenGLComponent::internalRepaint (int x, int y, int w, int h) | |||
{ | |||
Component::internalRepaint (x, y, w, h); | |||
} | |||
void OpenGLComponent::updateEmbeddedPosition (const Rectangle<int>&) | |||
{ | |||
} | |||
@@ -153,7 +153,8 @@ public: | |||
glGenRenderbuffersOES (1, &depthBufferHandle); | |||
glBindRenderbufferOES (GL_RENDERBUFFER_OES, colorBufferHandle); | |||
[context renderbufferStorage: GL_RENDERBUFFER_OES fromDrawable: glLayer]; | |||
bool ok = [context renderbufferStorage: GL_RENDERBUFFER_OES fromDrawable: glLayer]; | |||
jassert (ok); | |||
GLint width, height; | |||
glGetRenderbufferParameterivOES (GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &width); | |||
@@ -178,6 +179,8 @@ public: | |||
void freeGLBuffers() | |||
{ | |||
[context renderbufferStorage: GL_RENDERBUFFER_OES fromDrawable: nil]; | |||
if (frameBufferHandle != 0) | |||
{ | |||
glDeleteFramebuffersOES (1, &frameBufferHandle); | |||
@@ -197,7 +200,6 @@ public: | |||
} | |||
} | |||
//============================================================================== | |||
private: | |||
WeakReference<Component> component; | |||
JuceGLView* view; | |||
@@ -208,7 +210,6 @@ private: | |||
int numFrames; | |||
int lastWidth, lastHeight; | |||
//============================================================================== | |||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GLESContext); | |||
}; | |||
@@ -221,16 +222,12 @@ OpenGLContext* OpenGLComponent::createContext() | |||
if (peer != nullptr) | |||
return new GLESContext ((UIView*) peer->getNativeHandle(), this, preferredPixelFormat, | |||
dynamic_cast <const GLESContext*> (contextToShareListsWith), | |||
type == openGLES2 ? kEAGLRenderingAPIOpenGLES2 : kEAGLRenderingAPIOpenGLES1); | |||
(flags & openGLES2) == 0 ? kEAGLRenderingAPIOpenGLES1 | |||
: kEAGLRenderingAPIOpenGLES2); | |||
return nullptr; | |||
} | |||
void OpenGLComponent::internalRepaint (int x, int y, int w, int h) | |||
{ | |||
Component::internalRepaint (x, y, w, h); | |||
} | |||
void OpenGLComponent::updateEmbeddedPosition (const Rectangle<int>& bounds) | |||
{ | |||
if (context != nullptr) | |||
@@ -190,11 +190,6 @@ OpenGLContext* OpenGLComponent::createContext() | |||
return (c->renderContext != 0) ? c.release() : nullptr; | |||
} | |||
void OpenGLComponent::internalRepaint (int x, int y, int w, int h) | |||
{ | |||
Component::internalRepaint (x, y, w, h); | |||
} | |||
void OpenGLComponent::updateEmbeddedPosition (const Rectangle<int>& bounds) | |||
{ | |||
if (context != nullptr) | |||
@@ -245,22 +245,6 @@ void* OpenGLComponent::getNativeWindowHandle() const | |||
: nullptr; | |||
} | |||
void OpenGLComponent::internalRepaint (int x, int y, int w, int h) | |||
{ | |||
Component::internalRepaint (x, y, w, h); | |||
if (context != nullptr) | |||
{ | |||
NSView* const v = static_cast<WindowedGLContext*> (context.get())->view; | |||
// bit of a bodge here.. if we only invalidate the area of the gl component, | |||
// it's completely covered by the NSOpenGLView, so the OS throws away the | |||
// repaint message, thus never causing our paint() callback, and never repainting | |||
// the comp. So invalidating just a little bit around the edge helps.. | |||
[[v superview] setNeedsDisplayInRect: NSInsetRect ([v frame], -2.0f, -2.0f)]; | |||
} | |||
} | |||
void OpenGLComponent::updateEmbeddedPosition (const Rectangle<int>&) | |||
{ | |||
} | |||
@@ -324,17 +324,6 @@ void* OpenGLComponent::getNativeWindowHandle() const | |||
return context != nullptr ? static_cast<WindowedGLContext*> (context.get())->getNativeWindowHandle() : nullptr; | |||
} | |||
void OpenGLComponent::internalRepaint (int x, int y, int w, int h) | |||
{ | |||
Component::internalRepaint (x, y, w, h); | |||
if (context != nullptr) | |||
{ | |||
ComponentPeer* peer = static_cast<WindowedGLContext*> (context.get())->nativeWindow; | |||
peer->repaint (peer->getBounds().withPosition (Point<int>())); | |||
} | |||
} | |||
void OpenGLComponent::updateEmbeddedPosition (const Rectangle<int>& bounds) | |||
{ | |||
if (context != nullptr) | |||
@@ -30,7 +30,7 @@ BEGIN_JUCE_NAMESPACE | |||
OpenGLPixelFormat::OpenGLPixelFormat (const int bitsPerRGBComponent, | |||
const int alphaBits_, | |||
const int depthBufferBits_, | |||
const int stencilBufferBits_) | |||
const int stencilBufferBits_) noexcept | |||
: redBits (bitsPerRGBComponent), | |||
greenBits (bitsPerRGBComponent), | |||
blueBits (bitsPerRGBComponent), | |||
@@ -45,7 +45,7 @@ OpenGLPixelFormat::OpenGLPixelFormat (const int bitsPerRGBComponent, | |||
{ | |||
} | |||
OpenGLPixelFormat::OpenGLPixelFormat (const OpenGLPixelFormat& other) | |||
OpenGLPixelFormat::OpenGLPixelFormat (const OpenGLPixelFormat& other) noexcept | |||
: redBits (other.redBits), | |||
greenBits (other.greenBits), | |||
blueBits (other.blueBits), | |||
@@ -60,7 +60,7 @@ OpenGLPixelFormat::OpenGLPixelFormat (const OpenGLPixelFormat& other) | |||
{ | |||
} | |||
OpenGLPixelFormat& OpenGLPixelFormat::operator= (const OpenGLPixelFormat& other) | |||
OpenGLPixelFormat& OpenGLPixelFormat::operator= (const OpenGLPixelFormat& other) noexcept | |||
{ | |||
redBits = other.redBits; | |||
greenBits = other.greenBits; | |||
@@ -76,7 +76,7 @@ OpenGLPixelFormat& OpenGLPixelFormat::operator= (const OpenGLPixelFormat& other) | |||
return *this; | |||
} | |||
bool OpenGLPixelFormat::operator== (const OpenGLPixelFormat& other) const | |||
bool OpenGLPixelFormat::operator== (const OpenGLPixelFormat& other) const noexcept | |||
{ | |||
return redBits == other.redBits | |||
&& greenBits == other.greenBits | |||
@@ -121,30 +121,30 @@ OpenGLContext* OpenGLContext::getCurrentContext() | |||
class OpenGLComponent::OpenGLComponentWatcher : public ComponentMovementWatcher | |||
{ | |||
public: | |||
OpenGLComponentWatcher (OpenGLComponent* const owner_) | |||
: ComponentMovementWatcher (owner_), | |||
OpenGLComponentWatcher (OpenGLComponent& owner_) | |||
: ComponentMovementWatcher (&owner_), | |||
owner (owner_) | |||
{ | |||
} | |||
void componentMovedOrResized (bool /*wasMoved*/, bool /*wasResized*/) | |||
{ | |||
owner->updateContextPosition(); | |||
owner.updateContextPosition(); | |||
} | |||
void componentPeerChanged() | |||
{ | |||
owner->recreateContextAsync(); | |||
owner.recreateContextAsync(); | |||
} | |||
void componentVisibilityChanged() | |||
{ | |||
if (! owner->isShowing()) | |||
owner->stopBackgroundThread(); | |||
if (! owner.isShowing()) | |||
owner.stopBackgroundThread(); | |||
} | |||
private: | |||
OpenGLComponent* const owner; | |||
OpenGLComponent& owner; | |||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenGLComponentWatcher); | |||
}; | |||
@@ -217,16 +217,175 @@ void OpenGLComponent::stopRenderThread() | |||
} | |||
//============================================================================== | |||
OpenGLComponent::OpenGLComponent (const OpenGLType type_, const bool useBackgroundThread) | |||
: type (type_), | |||
class OpenGLComponent::OpenGLCachedComponentImage : public CachedComponentImage, | |||
public Timer // N.B. using a Timer rather than an AsyncUpdater | |||
// to avoid scheduling problems on Windows | |||
{ | |||
public: | |||
OpenGLCachedComponentImage (OpenGLComponent& owner_) | |||
: owner (owner_) | |||
{ | |||
} | |||
void paint (Graphics&) | |||
{ | |||
ComponentPeer* const peer = owner.getPeer(); | |||
if (peer != nullptr) | |||
{ | |||
const Point<int> topLeft (owner.getScreenPosition() - peer->getScreenPosition()); | |||
peer->addMaskedRegion (topLeft.x, topLeft.y, owner.getWidth(), owner.getHeight()); | |||
} | |||
if (owner.isUsingDedicatedThread()) | |||
{ | |||
if (peer != nullptr && owner.isShowing()) | |||
{ | |||
#if ! JUCE_LINUX | |||
owner.updateContext(); | |||
#endif | |||
if (! owner.threadStarted) | |||
{ | |||
owner.threadStarted = true; | |||
owner.startRenderThread(); | |||
} | |||
} | |||
} | |||
else | |||
{ | |||
owner.updateContext(); | |||
if (isTimerRunning()) | |||
timerCallback(); | |||
} | |||
} | |||
void invalidateAll() | |||
{ | |||
validArea.clear(); | |||
triggerRepaint(); | |||
} | |||
void invalidate (const Rectangle<int>& area) | |||
{ | |||
validArea.subtract (area); | |||
triggerRepaint(); | |||
} | |||
void releaseResources() | |||
{ | |||
frameBuffer.release(); | |||
} | |||
void timerCallback() | |||
{ | |||
stopTimer(); | |||
if (! owner.makeCurrentRenderingTarget()) | |||
return; | |||
const Rectangle<int> bounds (owner.getLocalBounds()); | |||
const int fbW = frameBuffer.getWidth(); | |||
const int fbH = frameBuffer.getHeight(); | |||
if (fbW < bounds.getWidth() | |||
|| fbH < bounds.getHeight() | |||
|| fbW > bounds.getWidth() + 128 | |||
|| fbH > bounds.getHeight() + 128 | |||
|| ! frameBuffer.isValid()) | |||
{ | |||
frameBuffer.initialise (bounds.getWidth(), bounds.getHeight()); | |||
validArea.clear(); | |||
} | |||
owner.renderOpenGL(); | |||
if ((owner.flags & allowSubComponents) != 0) | |||
{ | |||
{ | |||
RectangleList invalid (bounds); | |||
invalid.subtract (validArea); | |||
validArea = bounds; | |||
if (! invalid.isEmpty()) | |||
{ | |||
OpenGLRenderer g (frameBuffer); | |||
g.clipToRectangleList (invalid); | |||
g.setFill (Colours::transparentBlack); | |||
g.fillRect (bounds, true); | |||
g.setFill (Colours::black); | |||
paintOwner (g); | |||
} | |||
} | |||
owner.makeCurrentRenderingTarget(); | |||
OpenGLHelpers::prepareFor2D (bounds.getWidth(), bounds.getHeight()); | |||
glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA); | |||
glEnable (GL_BLEND); | |||
glColor4f (1.0f, 1.0f, 1.0f, owner.getAlpha()); | |||
frameBuffer.drawAt (0, (float) (bounds.getHeight() - frameBuffer.getHeight())); | |||
} | |||
owner.swapBuffers(); | |||
owner.releaseAsRenderingTarget(); | |||
} | |||
void triggerRepaint() | |||
{ | |||
if (! owner.isUsingDedicatedThread()) | |||
startTimer (1000 / 70); | |||
} | |||
private: | |||
void paintOwner (OpenGLRenderer& glRenderer) | |||
{ | |||
Graphics g (&glRenderer); | |||
#if JUCE_ENABLE_REPAINT_DEBUGGING | |||
g.saveState(); | |||
#endif | |||
JUCE_TRY | |||
{ | |||
owner.paintEntireComponent (g, false); | |||
} | |||
JUCE_CATCH_EXCEPTION | |||
#if JUCE_ENABLE_REPAINT_DEBUGGING | |||
// enabling this code will fill all areas that get repainted with a colour overlay, to show | |||
// clearly when things are being repainted. | |||
g.restoreState(); | |||
static Random rng; | |||
g.fillAll (Colour ((uint8) rng.nextInt (255), | |||
(uint8) rng.nextInt (255), | |||
(uint8) rng.nextInt (255), | |||
(uint8) 0x50)); | |||
#endif | |||
} | |||
OpenGLComponent& owner; | |||
OpenGLFrameBuffer frameBuffer; | |||
RectangleList validArea; | |||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenGLCachedComponentImage); | |||
}; | |||
//============================================================================== | |||
OpenGLComponent::OpenGLComponent (const int flags_) | |||
: flags (flags_), | |||
contextToShareListsWith (nullptr), | |||
needToUpdateViewport (true), | |||
needToDeleteContext (false), | |||
threadStarted (false), | |||
useThread (useBackgroundThread) | |||
threadStarted (false) | |||
{ | |||
setOpaque (true); | |||
componentWatcher = new OpenGLComponentWatcher (this); | |||
componentWatcher = new OpenGLComponentWatcher (*this); | |||
setCachedComponentImage (new OpenGLCachedComponentImage (*this)); | |||
} | |||
OpenGLComponent::~OpenGLComponent() | |||
@@ -321,6 +480,7 @@ void OpenGLComponent::deleteContext() | |||
} | |||
context = nullptr; | |||
setCachedComponentImage (nullptr); | |||
} | |||
needToDeleteContext = false; | |||
@@ -351,40 +511,6 @@ void OpenGLComponent::stopBackgroundThread() | |||
} | |||
} | |||
void OpenGLComponent::paint (Graphics&) | |||
{ | |||
ComponentPeer* const peer = getPeer(); | |||
if (useThread) | |||
{ | |||
if (peer != nullptr && isShowing()) | |||
{ | |||
#if ! JUCE_LINUX | |||
updateContext(); | |||
#endif | |||
if (! threadStarted) | |||
{ | |||
threadStarted = true; | |||
startRenderThread(); | |||
} | |||
} | |||
} | |||
else | |||
{ | |||
updateContext(); | |||
if (! renderAndSwapBuffers()) | |||
return; | |||
} | |||
if (peer != nullptr) | |||
{ | |||
const Point<int> topLeft (getScreenPosition() - peer->getScreenPosition()); | |||
peer->addMaskedRegion (topLeft.x, topLeft.y, getWidth(), getHeight()); | |||
} | |||
} | |||
bool OpenGLComponent::renderAndSwapBuffers() | |||
{ | |||
const ScopedLock sl (contextLock); | |||
@@ -411,6 +537,21 @@ bool OpenGLComponent::renderAndSwapBuffers() | |||
return true; | |||
} | |||
void OpenGLComponent::triggerRepaint() | |||
{ | |||
OpenGLCachedComponentImage* const c | |||
= dynamic_cast<OpenGLCachedComponentImage*> (getCachedComponentImage()); | |||
jassert (c != nullptr); // you mustn't set your own cached image object for an OpenGLComponent! | |||
if (c != nullptr) | |||
c->triggerRepaint(); | |||
} | |||
void OpenGLComponent::paint (Graphics&) | |||
{ | |||
} | |||
unsigned int OpenGLComponent::getFrameBufferID() const | |||
{ | |||
return context != nullptr ? context->getFrameBufferID() : 0; | |||
@@ -47,26 +47,42 @@ class JUCE_API OpenGLComponent : public OpenGLBaseType, | |||
{ | |||
public: | |||
//============================================================================== | |||
/** Used to select the type of openGL API to use, if more than one choice is available | |||
on a particular platform. | |||
/** These flags can be combined and passed to the OpenGLComponent constructor to | |||
specify various options. | |||
*/ | |||
enum OpenGLType | |||
enum OpenGLFlags | |||
{ | |||
openGLDefault = 0, | |||
/** This value can be used if you want your OpenGLComponent to use the | |||
default settings. | |||
*/ | |||
openGLDefault = 8, | |||
#if JUCE_IOS | |||
openGLES1, /**< On the iPhone, this selects openGL ES 1.0 */ | |||
openGLES2 /**< On the iPhone, this selects openGL ES 2.0 */ | |||
openGLES1 = 1, /**< On the iPhone, this selects openGL ES 1.0 */ | |||
openGLES2 = 2, /**< On the iPhone, this selects openGL ES 2.0 */ | |||
#endif | |||
/** If this flag is enabled, the component will launch a background thread to | |||
perform the rendering. If this flag is not enabled, then renderOpenGL() | |||
will be invoked on the main event thread when the component has been told to | |||
repaint, or after triggerRepaint() has been called. | |||
*/ | |||
useBackgroundThread = 4, | |||
/** If this flag is enabled, then any sub-components of the OpenGLComponent | |||
will be correctly overlaid on top of the GL content, and its paint() method will | |||
be able to render over it. If you're not using sub-components, you can disable | |||
this flag, which will eliminate some overhead. | |||
*/ | |||
allowSubComponents = 8 | |||
}; | |||
//============================================================================== | |||
/** Creates an OpenGLComponent. | |||
If useBackgroundThread is true, the component will launch a background thread | |||
to do the rendering. If false, then renderOpenGL() will be called as part of the | |||
normal paint() method. | |||
The flags parameter should be a combination of the values in the | |||
OpenGLFlags enum. | |||
*/ | |||
OpenGLComponent (OpenGLType type = openGLDefault, | |||
bool useBackgroundThread = false); | |||
OpenGLComponent (int flags = openGLDefault); | |||
/** Destructor. */ | |||
~OpenGLComponent(); | |||
@@ -101,7 +117,7 @@ public: | |||
/** Returns true if the component is performing the rendering on a background thread. | |||
This property is specified in the constructor. | |||
*/ | |||
bool isUsingDedicatedThread() const noexcept { return useThread; } | |||
inline bool isUsingDedicatedThread() const noexcept { return (flags & useBackgroundThread) != 0; } | |||
/** This replaces the normal paint() callback - use it to draw your openGL stuff. | |||
@@ -177,6 +193,14 @@ public: | |||
int getRenderingTargetWidth() const { return getWidth(); } | |||
int getRenderingTargetHeight() const { return getHeight(); } | |||
/** Causes a repaint to be invoked asynchronously. | |||
This has a similar effect to calling repaint(), and triggers a callback to | |||
renderOpenGL(), but unlike repaint(), it does not mark any of the component's | |||
children as needing a redraw, which means that their cached state can be re-used | |||
if possible. | |||
*/ | |||
void triggerRepaint(); | |||
//============================================================================== | |||
/** Calls the rendering callback, and swaps the buffers afterwards. | |||
This is called automatically by paint() when the component needs to be rendered. | |||
@@ -225,12 +249,11 @@ protected: | |||
*/ | |||
virtual void stopRenderThread(); | |||
//============================================================================== | |||
/** @internal */ | |||
void paint (Graphics& g); | |||
void paint (Graphics&); | |||
private: | |||
const OpenGLType type; | |||
const int flags; | |||
class OpenGLComponentRenderThread; | |||
friend class OpenGLComponentRenderThread; | |||
@@ -247,14 +270,15 @@ private: | |||
CriticalSection contextLock; | |||
OpenGLPixelFormat preferredPixelFormat; | |||
bool needToUpdateViewport, needToDeleteContext, threadStarted; | |||
const bool useThread; | |||
class OpenGLCachedComponentImage; | |||
friend class OpenGLCachedComponentImage; | |||
OpenGLContext* createContext(); | |||
void updateContext(); | |||
void updateContextPosition(); | |||
void stopBackgroundThread(); | |||
void recreateContextAsync(); | |||
void internalRepaint (int x, int y, int w, int h); | |||
void updateEmbeddedPosition (const Rectangle<int>&); | |||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenGLComponent); | |||
@@ -250,13 +250,6 @@ public: | |||
{ | |||
} | |||
GLShaderProgram (const GLchar* fragment) noexcept | |||
: program (glCreateProgram()) | |||
{ | |||
addShader (fragment, GL_FRAGMENT_SHADER); | |||
link(); | |||
} | |||
~GLShaderProgram() noexcept | |||
{ | |||
glDeleteProgram (program); | |||
@@ -297,9 +290,9 @@ public: | |||
#endif | |||
} | |||
struct UniformLocation | |||
struct Uniform | |||
{ | |||
UniformLocation (const GLShaderProgram& program, const GLchar* name) | |||
Uniform (const GLShaderProgram& program, const GLchar* name) | |||
: uniformID (glGetUniformLocation (program.program, name)) | |||
{ | |||
jassert (uniformID >= 0); | |||
@@ -335,76 +328,85 @@ struct ShaderPrograms | |||
bool areShadersSupported; | |||
struct SolidColourMaskedProgram | |||
struct ShaderBase | |||
{ | |||
ShaderBase (const char* fragmentShader) | |||
{ | |||
addShader (fragmentShader, GL_FRAGMENT_SHADER); | |||
link(); | |||
} | |||
GLShaderProgram program; | |||
}; | |||
struct SolidColourMaskedProgram : public ShaderBase | |||
{ | |||
SolidColourMaskedProgram() | |||
: program ("#version 120\n" | |||
"uniform sampler2D maskTexture;" | |||
"uniform ivec4 maskBounds;" | |||
"const float textureY = 0.5;" | |||
"" | |||
"void main()" | |||
"{" | |||
" vec2 maskPos;" | |||
" maskPos.x = (gl_FragCoord.x - maskBounds.x) / maskBounds.z;" | |||
" maskPos.y = 1.0 - (gl_FragCoord.y - maskBounds.y) / maskBounds.w;" | |||
" gl_FragColor = gl_Color * texture2D (maskTexture, maskPos).w;" | |||
"}"), | |||
: ShaderBase ("#version 120\n" | |||
"uniform sampler2D maskTexture;" | |||
"uniform ivec4 maskBounds;" | |||
"const float textureY = 0.5;" | |||
"" | |||
"void main()" | |||
"{" | |||
" vec2 maskPos;" | |||
" maskPos.x = (gl_FragCoord.x - maskBounds.x) / maskBounds.z;" | |||
" maskPos.y = 1.0 - (gl_FragCoord.y - maskBounds.y) / maskBounds.w;" | |||
" gl_FragColor = gl_Color * texture2D (maskTexture, maskPos).w;" | |||
"}"), | |||
maskTexture (program, "maskTexture"), | |||
maskBounds (program, "maskBounds") | |||
{ | |||
} | |||
GLShaderProgram program; | |||
GLShaderProgram::UniformLocation maskTexture, maskBounds; | |||
GLShaderProgram::Uniform maskTexture, maskBounds; | |||
}; | |||
struct RadialGradientProgram | |||
struct RadialGradientProgram : public ShaderBase | |||
{ | |||
RadialGradientProgram() | |||
: program ("#version 120\n" | |||
"uniform sampler2D gradientTexture;" | |||
"uniform mat2x3 matrix;" | |||
"const float textureY = 0.5;" | |||
"" | |||
"void main()" | |||
"{" | |||
" float dist = length (vec2 (matrix[0][0] * gl_FragCoord.x + matrix[0][1] * gl_FragCoord.y + matrix[0][2]," | |||
" matrix[1][0] * gl_FragCoord.x + matrix[1][1] * gl_FragCoord.y + matrix[1][2]));" | |||
" gl_FragColor = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));" | |||
"}"), | |||
: ShaderBase ("#version 120\n" | |||
"uniform sampler2D gradientTexture;" | |||
"uniform mat2x3 matrix;" | |||
"const float textureY = 0.5;" | |||
"" | |||
"void main()" | |||
"{" | |||
" float dist = length (vec2 (matrix[0][0] * gl_FragCoord.x + matrix[0][1] * gl_FragCoord.y + matrix[0][2]," | |||
" matrix[1][0] * gl_FragCoord.x + matrix[1][1] * gl_FragCoord.y + matrix[1][2]));" | |||
" gl_FragColor = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));" | |||
"}"), | |||
gradientTexture (program, "gradientTexture"), | |||
matrix (program, "matrix") | |||
{ | |||
} | |||
GLShaderProgram program; | |||
GLShaderProgram::UniformLocation gradientTexture, matrix; | |||
GLShaderProgram::Uniform gradientTexture, matrix; | |||
}; | |||
struct RadialGradientMaskedProgram | |||
struct RadialGradientMaskedProgram : public ShaderBase | |||
{ | |||
RadialGradientMaskedProgram() | |||
: program ("#version 120\n" | |||
"uniform sampler2D gradientTexture;" | |||
"uniform mat2x3 matrix;" | |||
"uniform sampler2D maskTexture;" | |||
"uniform ivec4 maskBounds;" | |||
"const float textureY = 0.5;" | |||
"" | |||
"void main()" | |||
"{" | |||
" float dist = length (vec2 (matrix[0][0] * gl_FragCoord.x + matrix[0][1] * gl_FragCoord.y + matrix[0][2]," | |||
" matrix[1][0] * gl_FragCoord.x + matrix[1][1] * gl_FragCoord.y + matrix[1][2]));" | |||
" vec4 result = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));" | |||
"" | |||
" vec2 maskPos;" | |||
" maskPos.x = (gl_FragCoord.x - maskBounds.x) / maskBounds.z;" | |||
" maskPos.y = 1.0 - (gl_FragCoord.y - maskBounds.y) / maskBounds.w;" | |||
" result *= texture2D (maskTexture, maskPos).w;" | |||
"" | |||
" gl_FragColor = result;" | |||
"}"), | |||
: ShaderBase ("#version 120\n" | |||
"uniform sampler2D gradientTexture;" | |||
"uniform mat2x3 matrix;" | |||
"uniform sampler2D maskTexture;" | |||
"uniform ivec4 maskBounds;" | |||
"const float textureY = 0.5;" | |||
"" | |||
"void main()" | |||
"{" | |||
" float dist = length (vec2 (matrix[0][0] * gl_FragCoord.x + matrix[0][1] * gl_FragCoord.y + matrix[0][2]," | |||
" matrix[1][0] * gl_FragCoord.x + matrix[1][1] * gl_FragCoord.y + matrix[1][2]));" | |||
" vec4 result = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));" | |||
"" | |||
" vec2 maskPos;" | |||
" maskPos.x = (gl_FragCoord.x - maskBounds.x) / maskBounds.z;" | |||
" maskPos.y = 1.0 - (gl_FragCoord.y - maskBounds.y) / maskBounds.w;" | |||
" result *= texture2D (maskTexture, maskPos).w;" | |||
"" | |||
" gl_FragColor = result;" | |||
"}"), | |||
gradientTexture (program, "gradientTexture"), | |||
matrix (program, "matrix"), | |||
maskTexture (program, "maskTexture"), | |||
@@ -412,54 +414,52 @@ struct ShaderPrograms | |||
{ | |||
} | |||
GLShaderProgram program; | |||
GLShaderProgram::UniformLocation gradientTexture, matrix; | |||
GLShaderProgram::UniformLocation maskTexture, maskBounds; | |||
GLShaderProgram::Uniform gradientTexture, matrix; | |||
GLShaderProgram::Uniform maskTexture, maskBounds; | |||
}; | |||
struct LinearGradient1Program | |||
struct LinearGradient1Program : public ShaderBase | |||
{ | |||
LinearGradient1Program() | |||
: program ("#version 120\n" | |||
"uniform sampler2D gradientTexture;" | |||
"uniform vec4 gradientInfo;" // x = x1, y = y1, z = (y2 - y1) / (x2 - x1), w = length | |||
"const float textureY = 0.5;" | |||
"" | |||
"void main()" | |||
"{" | |||
" float dist = (gl_FragCoord.y - (gradientInfo.y + (gradientInfo.z * (gl_FragCoord.x - gradientInfo.x)))) / gradientInfo.w;" | |||
" gl_FragColor = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));" | |||
"}"), | |||
: ShaderBase ("#version 120\n" | |||
"uniform sampler2D gradientTexture;" | |||
"uniform vec4 gradientInfo;" // x = x1, y = y1, z = (y2 - y1) / (x2 - x1), w = length | |||
"const float textureY = 0.5;" | |||
"" | |||
"void main()" | |||
"{" | |||
" float dist = (gl_FragCoord.y - (gradientInfo.y + (gradientInfo.z * (gl_FragCoord.x - gradientInfo.x)))) / gradientInfo.w;" | |||
" gl_FragColor = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));" | |||
"}"), | |||
gradientTexture (program, "gradientTexture"), | |||
gradientInfo (program, "gradientInfo") | |||
{ | |||
} | |||
GLShaderProgram program; | |||
GLShaderProgram::UniformLocation gradientTexture, gradientInfo; | |||
GLShaderProgram::Uniform gradientTexture, gradientInfo; | |||
}; | |||
struct LinearGradient1MaskedProgram | |||
struct LinearGradient1MaskedProgram : public ShaderBase | |||
{ | |||
LinearGradient1MaskedProgram() | |||
: program ("#version 120\n" | |||
"uniform sampler2D gradientTexture;" | |||
"uniform vec3 gradientInfo;" // x = (x2 - x1) / (y2 - y1), y = x1, z = length | |||
"uniform sampler2D maskTexture;" | |||
"uniform ivec4 maskBounds;" | |||
"const float textureY = 0.5;" | |||
"" | |||
"void main()" | |||
"{" | |||
" float dist = (gl_FragCoord.y - (gradientInfo.y + (gradientInfo.x * (gl_FragCoord.x - gradientInfo.y)))) / gradientInfo.z;" | |||
" vec4 result = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));" | |||
"" | |||
" vec2 maskPos;" | |||
" maskPos.x = (gl_FragCoord.x - maskBounds.x) / maskBounds.z;" | |||
" maskPos.y = 1.0 - (gl_FragCoord.y - maskBounds.y) / maskBounds.w;" | |||
" result *= texture2D (maskTexture, maskPos).w;" | |||
" gl_FragColor = result;" | |||
"}"), | |||
: ShaderBase ("#version 120\n" | |||
"uniform sampler2D gradientTexture;" | |||
"uniform vec3 gradientInfo;" // x = (x2 - x1) / (y2 - y1), y = x1, z = length | |||
"uniform sampler2D maskTexture;" | |||
"uniform ivec4 maskBounds;" | |||
"const float textureY = 0.5;" | |||
"" | |||
"void main()" | |||
"{" | |||
" float dist = (gl_FragCoord.y - (gradientInfo.y + (gradientInfo.x * (gl_FragCoord.x - gradientInfo.y)))) / gradientInfo.z;" | |||
" vec4 result = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));" | |||
"" | |||
" vec2 maskPos;" | |||
" maskPos.x = (gl_FragCoord.x - maskBounds.x) / maskBounds.z;" | |||
" maskPos.y = 1.0 - (gl_FragCoord.y - maskBounds.y) / maskBounds.w;" | |||
" result *= texture2D (maskTexture, maskPos).w;" | |||
" gl_FragColor = result;" | |||
"}"), | |||
gradientTexture (program, "gradientTexture"), | |||
gradientInfo (program, "gradientInfo"), | |||
maskTexture (program, "maskTexture"), | |||
@@ -467,54 +467,52 @@ struct ShaderPrograms | |||
{ | |||
} | |||
GLShaderProgram program; | |||
GLShaderProgram::UniformLocation gradientTexture, gradientInfo; | |||
GLShaderProgram::UniformLocation maskTexture, maskBounds; | |||
GLShaderProgram::Uniform gradientTexture, gradientInfo; | |||
GLShaderProgram::Uniform maskTexture, maskBounds; | |||
}; | |||
struct LinearGradient2Program | |||
struct LinearGradient2Program : public ShaderBase | |||
{ | |||
LinearGradient2Program() | |||
: program ("#version 120\n" | |||
"uniform sampler2D gradientTexture;" | |||
"uniform vec4 gradientInfo;" // x = x1, y = y1, z = (x2 - x1) / (y2 - y1), y = y1, w = length | |||
"const float textureY = 0.5;" | |||
"" | |||
"void main()" | |||
"{" | |||
" float dist = (gl_FragCoord.x - (gradientInfo.x + (gradientInfo.z * (gl_FragCoord.y - gradientInfo.y)))) / gradientInfo.w;" | |||
" gl_FragColor = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));" | |||
"}"), | |||
: ShaderBase ("#version 120\n" | |||
"uniform sampler2D gradientTexture;" | |||
"uniform vec4 gradientInfo;" // x = x1, y = y1, z = (x2 - x1) / (y2 - y1), y = y1, w = length | |||
"const float textureY = 0.5;" | |||
"" | |||
"void main()" | |||
"{" | |||
" float dist = (gl_FragCoord.x - (gradientInfo.x + (gradientInfo.z * (gl_FragCoord.y - gradientInfo.y)))) / gradientInfo.w;" | |||
" gl_FragColor = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));" | |||
"}"), | |||
gradientTexture (program, "gradientTexture"), | |||
gradientInfo (program, "gradientInfo") | |||
{ | |||
} | |||
GLShaderProgram program; | |||
GLShaderProgram::UniformLocation gradientTexture, gradientInfo; | |||
GLShaderProgram::Uniform gradientTexture, gradientInfo; | |||
}; | |||
struct LinearGradient2MaskedProgram | |||
struct LinearGradient2MaskedProgram : public ShaderBase | |||
{ | |||
LinearGradient2MaskedProgram() | |||
: program ("#version 120\n" | |||
"uniform sampler2D gradientTexture;" | |||
"uniform vec3 gradientInfo;" // x = (y2 - y1) / (x2 - x1), y = y1, z = length | |||
"uniform sampler2D maskTexture;" | |||
"uniform ivec4 maskBounds;" | |||
"const float textureY = 0.5;" | |||
"" | |||
"void main()" | |||
"{" | |||
" float dist = (gl_FragCoord.x - (gradientInfo.y + (gradientInfo.x * (gl_FragCoord.y - gradientInfo.y)))) / gradientInfo.z;" | |||
" vec4 result = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));" | |||
"" | |||
" vec2 maskPos;" | |||
" maskPos.x = (gl_FragCoord.x - maskBounds.x) / maskBounds.z;" | |||
" maskPos.y = 1.0 - (gl_FragCoord.y - maskBounds.y) / maskBounds.w;" | |||
" result *= texture2D (maskTexture, maskPos).w;" | |||
" gl_FragColor = result;" | |||
"}"), | |||
: ShaderBase ("#version 120\n" | |||
"uniform sampler2D gradientTexture;" | |||
"uniform vec3 gradientInfo;" // x = (y2 - y1) / (x2 - x1), y = y1, z = length | |||
"uniform sampler2D maskTexture;" | |||
"uniform ivec4 maskBounds;" | |||
"const float textureY = 0.5;" | |||
"" | |||
"void main()" | |||
"{" | |||
" float dist = (gl_FragCoord.x - (gradientInfo.y + (gradientInfo.x * (gl_FragCoord.y - gradientInfo.y)))) / gradientInfo.z;" | |||
" vec4 result = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));" | |||
"" | |||
" vec2 maskPos;" | |||
" maskPos.x = (gl_FragCoord.x - maskBounds.x) / maskBounds.z;" | |||
" maskPos.y = 1.0 - (gl_FragCoord.y - maskBounds.y) / maskBounds.w;" | |||
" result *= texture2D (maskTexture, maskPos).w;" | |||
" gl_FragColor = result;" | |||
"}"), | |||
gradientTexture (program, "gradientTexture"), | |||
gradientInfo (program, "gradientInfo"), | |||
maskTexture (program, "maskTexture"), | |||
@@ -522,9 +520,8 @@ struct ShaderPrograms | |||
{ | |||
} | |||
GLShaderProgram program; | |||
GLShaderProgram::UniformLocation gradientTexture, gradientInfo; | |||
GLShaderProgram::UniformLocation maskTexture, maskBounds; | |||
GLShaderProgram::Uniform gradientTexture, gradientInfo; | |||
GLShaderProgram::Uniform maskTexture, maskBounds; | |||
}; | |||
SolidColourMaskedProgram solidColourMasked; | |||
@@ -45,11 +45,11 @@ public: | |||
OpenGLPixelFormat (int bitsPerRGBComponent = 8, | |||
int alphaBits = 8, | |||
int depthBufferBits = 16, | |||
int stencilBufferBits = 0); | |||
int stencilBufferBits = 0) noexcept; | |||
OpenGLPixelFormat (const OpenGLPixelFormat&); | |||
OpenGLPixelFormat& operator= (const OpenGLPixelFormat&); | |||
bool operator== (const OpenGLPixelFormat&) const; | |||
OpenGLPixelFormat (const OpenGLPixelFormat&) noexcept; | |||
OpenGLPixelFormat& operator= (const OpenGLPixelFormat&) noexcept; | |||
bool operator== (const OpenGLPixelFormat&) const noexcept; | |||
//============================================================================== | |||
int redBits; /**< The number of bits per pixel to use for the red channel. */ | |||