@@ -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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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, | 30AD756E053A0663BF664823, | ||||
8DDA82E1200B61D3B6C526E8 ); name = "juce_graphics"; sourceTree = "<group>"; }; | 8DDA82E1200B61D3B6C526E8 ); name = "juce_graphics"; sourceTree = "<group>"; }; | ||||
2CEAE8B236FEF5E06317EF3B = { isa = PBXGroup; children = ( | 2CEAE8B236FEF5E06317EF3B = { isa = PBXGroup; children = ( | ||||
3CABAAC1C4BC0D8105183D56, | |||||
4C150A1BF98D747EC218A602, | 4C150A1BF98D747EC218A602, | ||||
FDD33A6837774904810208D5, | FDD33A6837774904810208D5, | ||||
0BEDB3FD70AB61D3E7891D74, | 0BEDB3FD70AB61D3E7891D74, | ||||
@@ -1941,6 +1941,7 @@ | |||||
</Filter> | </Filter> | ||||
<Filter Name="juce_gui_basics"> | <Filter Name="juce_gui_basics"> | ||||
<Filter Name="components"> | <Filter Name="components"> | ||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | <File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | ||||
<FileConfiguration Name="Debug|Win32" | <FileConfiguration Name="Debug|Win32" | ||||
ExcludedFromBuild="true"> | ExcludedFromBuild="true"> | ||||
@@ -1941,6 +1941,7 @@ | |||||
</Filter> | </Filter> | ||||
<Filter Name="juce_gui_basics"> | <Filter Name="juce_gui_basics"> | ||||
<Filter Name="components"> | <Filter Name="components"> | ||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | <File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | ||||
<FileConfiguration Name="Debug|Win32" | <FileConfiguration Name="Debug|Win32" | ||||
ExcludedFromBuild="true"> | ExcludedFromBuild="true"> | ||||
@@ -1178,6 +1178,7 @@ | |||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/> | <ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/> | ||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/> | <ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/> | ||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.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_Component.h"/> | ||||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/> | <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/> | ||||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/> | <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/> | ||||
@@ -1869,6 +1869,9 @@ | |||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"> | <ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"> | ||||
<Filter>Juce Modules\juce_graphics</Filter> | <Filter>Juce Modules\juce_graphics</Filter> | ||||
</ClInclude> | </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"> | <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"> | ||||
<Filter>Juce Modules\juce_gui_basics\components</Filter> | <Filter>Juce Modules\juce_gui_basics\components</Filter> | ||||
</ClInclude> | </ClInclude> | ||||
@@ -2697,6 +2697,7 @@ | |||||
</Filter> | </Filter> | ||||
<Filter Name="juce_gui_basics"> | <Filter Name="juce_gui_basics"> | ||||
<Filter Name="components"> | <Filter Name="components"> | ||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | <File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | ||||
<FileConfiguration Name="Debug|Win32" | <FileConfiguration Name="Debug|Win32" | ||||
ExcludedFromBuild="true"> | ExcludedFromBuild="true"> | ||||
@@ -2697,6 +2697,7 @@ | |||||
</Filter> | </Filter> | ||||
<Filter Name="juce_gui_basics"> | <Filter Name="juce_gui_basics"> | ||||
<Filter Name="components"> | <Filter Name="components"> | ||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | <File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | ||||
<FileConfiguration Name="Debug|Win32" | <FileConfiguration Name="Debug|Win32" | ||||
ExcludedFromBuild="true"> | ExcludedFromBuild="true"> | ||||
@@ -1454,6 +1454,7 @@ | |||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/> | <ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/> | ||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/> | <ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/> | ||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.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_Component.h"/> | ||||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/> | <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/> | ||||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/> | <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/> | ||||
@@ -2367,6 +2367,9 @@ | |||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"> | <ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"> | ||||
<Filter>Juce Modules\juce_graphics</Filter> | <Filter>Juce Modules\juce_graphics</Filter> | ||||
</ClInclude> | </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"> | <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"> | ||||
<Filter>Juce Modules\juce_gui_basics\components</Filter> | <Filter>Juce Modules\juce_gui_basics\components</Filter> | ||||
</ClInclude> | </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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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, | B523ED8502475B9BB3F392C7, | ||||
BF59C96BC3BCB29CCB421861 ); name = "juce_graphics"; sourceTree = "<group>"; }; | BF59C96BC3BCB29CCB421861 ); name = "juce_graphics"; sourceTree = "<group>"; }; | ||||
754D5C51D503AEDC94BCDDFC = { isa = PBXGroup; children = ( | 754D5C51D503AEDC94BCDDFC = { isa = PBXGroup; children = ( | ||||
A9B72D6049A3539B63AE79D5, | |||||
79078F37EB6919AA440017FC, | 79078F37EB6919AA440017FC, | ||||
C9AEAD8B2366F9508E63A178, | C9AEAD8B2366F9508E63A178, | ||||
BF6F272194D16055D6A90D94, | BF6F272194D16055D6A90D94, | ||||
@@ -33,11 +33,33 @@ class DemoOpenGLCanvas : public OpenGLComponent, | |||||
{ | { | ||||
public: | public: | ||||
DemoOpenGLCanvas() | DemoOpenGLCanvas() | ||||
: rotation (0.0f), | |||||
delta (1.0f), | |||||
: OpenGLComponent (openGLDefault), rotation (0.0f), | |||||
textScrollPos (200) | 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 | // when the component creates a new internal context, this is called, and | ||||
@@ -56,8 +78,7 @@ public: | |||||
void mouseDrag (const MouseEvent& e) | void mouseDrag (const MouseEvent& e) | ||||
{ | { | ||||
draggableOrientation.mouseDrag (e.getPosition()); | draggableOrientation.mouseDrag (e.getPosition()); | ||||
delta = e.getDistanceFromDragStartX() / 100.0f; | |||||
repaint(); | |||||
triggerRepaint(); | |||||
} | } | ||||
void resized() | void resized() | ||||
@@ -81,6 +102,7 @@ public: | |||||
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | ||||
glEnable (GL_TEXTURE_2D); | glEnable (GL_TEXTURE_2D); | ||||
OpenGLHelpers::prepareFor2D (getWidth(), getHeight()); | |||||
OpenGLHelpers::setPerspective (45.0, getWidth() / (double) getHeight(), 0.1, 100.0); | OpenGLHelpers::setPerspective (45.0, getWidth() / (double) getHeight(), 0.1, 100.0); | ||||
glTranslatef (0.0f, 0.0f, -5.0f); | 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); | 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() | void updateTextureImage() | ||||
@@ -110,7 +130,8 @@ public: | |||||
// This image is a special framebuffer-backed image, so when we draw to it, the context | // This image is a special framebuffer-backed image, so when we draw to it, the context | ||||
// will render directly into its framebuffer | // 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); | Graphics g (dynamicTextureImage); | ||||
@@ -127,9 +148,9 @@ public: | |||||
// This stuff just creates a spinning star shape and fills it.. | // This stuff just creates a spinning star shape and fills it.. | ||||
Path p; | Path p; | ||||
const float scale = getHeight() * 0.4f; | 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))), | g.setGradientFill (ColourGradient (Colours::green.withRotatedHue (fabsf (::sinf (rotation / 300.0f))), | ||||
0, 0, | 0, 0, | ||||
@@ -138,36 +159,21 @@ public: | |||||
g.fillPath (p); | 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() | void timerCallback() | ||||
{ | { | ||||
rotation += delta; | |||||
rotation += (float) speedSlider.getValue(); | |||||
textScrollPos += 1.4f; | textScrollPos += 1.4f; | ||||
repaint(); | |||||
triggerRepaint(); | |||||
} | } | ||||
private: | private: | ||||
Image logoImage, dynamicTextureImage; | Image logoImage, dynamicTextureImage; | ||||
float rotation, delta, textScrollPos; | |||||
float rotation, textScrollPos; | |||||
Draggable3DOrientation draggableOrientation; | Draggable3DOrientation draggableOrientation; | ||||
Slider speedSlider, sizeSlider; | |||||
Label infoLabel; | |||||
// Functions to create a couple of images to use as textures.. | // Functions to create a couple of images to use as textures.. | ||||
static Image createLogoImage() | static Image createLogoImage() | ||||
{ | { | ||||
@@ -194,6 +200,13 @@ private: | |||||
g.fillPath (pp); | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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, | 79B3B7E2DD82AB16C411D9E0, | ||||
E9B20812DF15AC01D00FAFF5 ); name = "juce_graphics"; sourceTree = "<group>"; }; | E9B20812DF15AC01D00FAFF5 ); name = "juce_graphics"; sourceTree = "<group>"; }; | ||||
644A6B4EE1701D8441A41B49 = { isa = PBXGroup; children = ( | 644A6B4EE1701D8441A41B49 = { isa = PBXGroup; children = ( | ||||
DC1620808CB348FA6A061F49, | |||||
9941F313443F3B72CA820E71, | 9941F313443F3B72CA820E71, | ||||
A7EE73FF3A5962BBF41DC2AB, | A7EE73FF3A5962BBF41DC2AB, | ||||
89520054769FD08A7E2C2D4C, | 89520054769FD08A7E2C2D4C, | ||||
@@ -2574,6 +2574,7 @@ | |||||
</Filter> | </Filter> | ||||
<Filter Name="juce_gui_basics"> | <Filter Name="juce_gui_basics"> | ||||
<Filter Name="components"> | <Filter Name="components"> | ||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | <File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | ||||
<FileConfiguration Name="Debug|Win32" | <FileConfiguration Name="Debug|Win32" | ||||
ExcludedFromBuild="true"> | ExcludedFromBuild="true"> | ||||
@@ -2574,6 +2574,7 @@ | |||||
</Filter> | </Filter> | ||||
<Filter Name="juce_gui_basics"> | <Filter Name="juce_gui_basics"> | ||||
<Filter Name="components"> | <Filter Name="components"> | ||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | <File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | ||||
<FileConfiguration Name="Debug|Win32" | <FileConfiguration Name="Debug|Win32" | ||||
ExcludedFromBuild="true"> | ExcludedFromBuild="true"> | ||||
@@ -718,33 +718,22 @@ | |||||
D313CF37B25D7FD313C4F336 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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, | 45200F793669CADC5D279093, | ||||
2483323E997B7A3171E39DE0 ); name = "juce_graphics"; sourceTree = "<group>"; }; | 2483323E997B7A3171E39DE0 ); name = "juce_graphics"; sourceTree = "<group>"; }; | ||||
46B3BECE46528A3B74650149 = { isa = PBXGroup; children = ( | 46B3BECE46528A3B74650149 = { isa = PBXGroup; children = ( | ||||
F8D23A339EA851D0838B8D4D, | |||||
536EA9AE6C2F76FE0AEB5958, | 536EA9AE6C2F76FE0AEB5958, | ||||
3D6993BA129CF5B3D55E3800, | 3D6993BA129CF5B3D55E3800, | ||||
89CF202FAEC4E5F57AF226C0, | 89CF202FAEC4E5F57AF226C0, | ||||
@@ -2620,6 +2620,7 @@ | |||||
</Filter> | </Filter> | ||||
<Filter Name="juce_gui_basics"> | <Filter Name="juce_gui_basics"> | ||||
<Filter Name="components"> | <Filter Name="components"> | ||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | <File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | ||||
<FileConfiguration Name="Debug|Win32" | <FileConfiguration Name="Debug|Win32" | ||||
ExcludedFromBuild="true"> | ExcludedFromBuild="true"> | ||||
@@ -2620,6 +2620,7 @@ | |||||
</Filter> | </Filter> | ||||
<Filter Name="juce_gui_basics"> | <Filter Name="juce_gui_basics"> | ||||
<Filter Name="components"> | <Filter Name="components"> | ||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | <File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | ||||
<FileConfiguration Name="Debug|Win32" | <FileConfiguration Name="Debug|Win32" | ||||
ExcludedFromBuild="true"> | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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, | 7402FA767F4FD9CCD3DD1578, | ||||
C794DBEF09A83E199223D205 ); name = "juce_graphics"; sourceTree = "<group>"; }; | C794DBEF09A83E199223D205 ); name = "juce_graphics"; sourceTree = "<group>"; }; | ||||
51F1DE322ACA481FA5B3E623 = { isa = PBXGroup; children = ( | 51F1DE322ACA481FA5B3E623 = { isa = PBXGroup; children = ( | ||||
37380DEDD5BEE5E9267FA12F, | |||||
9132D1324A6D6D049C9B2FFE, | 9132D1324A6D6D049C9B2FFE, | ||||
02BD81436ED17F1341E19522, | 02BD81436ED17F1341E19522, | ||||
01D5DC75EA54630B8805AD59, | 01D5DC75EA54630B8805AD59, | ||||
@@ -1669,6 +1669,7 @@ | |||||
</Filter> | </Filter> | ||||
<Filter Name="juce_gui_basics"> | <Filter Name="juce_gui_basics"> | ||||
<Filter Name="components"> | <Filter Name="components"> | ||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | <File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | ||||
<FileConfiguration Name="Debug|Win32" | <FileConfiguration Name="Debug|Win32" | ||||
ExcludedFromBuild="true"> | ExcludedFromBuild="true"> | ||||
@@ -1669,6 +1669,7 @@ | |||||
</Filter> | </Filter> | ||||
<Filter Name="juce_gui_basics"> | <Filter Name="juce_gui_basics"> | ||||
<Filter Name="components"> | <Filter Name="components"> | ||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | <File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | ||||
<FileConfiguration Name="Debug|Win32" | <FileConfiguration Name="Debug|Win32" | ||||
ExcludedFromBuild="true"> | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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, | 7402FA767F4FD9CCD3DD1578, | ||||
C794DBEF09A83E199223D205 ); name = "juce_graphics"; sourceTree = "<group>"; }; | C794DBEF09A83E199223D205 ); name = "juce_graphics"; sourceTree = "<group>"; }; | ||||
51F1DE322ACA481FA5B3E623 = { isa = PBXGroup; children = ( | 51F1DE322ACA481FA5B3E623 = { isa = PBXGroup; children = ( | ||||
37380DEDD5BEE5E9267FA12F, | |||||
9132D1324A6D6D049C9B2FFE, | 9132D1324A6D6D049C9B2FFE, | ||||
02BD81436ED17F1341E19522, | 02BD81436ED17F1341E19522, | ||||
01D5DC75EA54630B8805AD59, | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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, | F68ED837371C2CA43A42793F, | ||||
3C5821771E2E831483EBE312 ); name = "juce_graphics"; sourceTree = "<group>"; }; | 3C5821771E2E831483EBE312 ); name = "juce_graphics"; sourceTree = "<group>"; }; | ||||
EDA276A5ED4DDEA021B74225 = { isa = PBXGroup; children = ( | EDA276A5ED4DDEA021B74225 = { isa = PBXGroup; children = ( | ||||
018519396BA8CBC647868276, | |||||
196B21E0D34FF36EE398FE07, | 196B21E0D34FF36EE398FE07, | ||||
F8CB2C407443DD4FE38CA7BE, | F8CB2C407443DD4FE38CA7BE, | ||||
F7D11568291BA9EA434B7CFB, | F7D11568291BA9EA434B7CFB, | ||||
@@ -2511,6 +2511,7 @@ | |||||
</Filter> | </Filter> | ||||
<Filter Name="juce_gui_basics"> | <Filter Name="juce_gui_basics"> | ||||
<Filter Name="components"> | <Filter Name="components"> | ||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | <File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | ||||
<FileConfiguration Name="Debug|Win32" | <FileConfiguration Name="Debug|Win32" | ||||
ExcludedFromBuild="true"> | ExcludedFromBuild="true"> | ||||
@@ -1400,6 +1400,7 @@ | |||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/> | <ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/> | ||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/> | <ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/> | ||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.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_Component.h"/> | ||||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/> | <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/> | ||||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/> | <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/> | ||||
@@ -2202,6 +2202,9 @@ | |||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"> | <ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"> | ||||
<Filter>Juce Modules\juce_graphics</Filter> | <Filter>Juce Modules\juce_graphics</Filter> | ||||
</ClInclude> | </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"> | <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"> | ||||
<Filter>Juce Modules\juce_gui_basics\components</Filter> | <Filter>Juce Modules\juce_gui_basics\components</Filter> | ||||
</ClInclude> | </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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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"; }; | 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, | BA20E35BA5FF1801D0B86BC9, | ||||
E9DC95A85AB25565E8FACF91 ); name = "juce_graphics"; sourceTree = "<group>"; }; | E9DC95A85AB25565E8FACF91 ); name = "juce_graphics"; sourceTree = "<group>"; }; | ||||
F873E58ECE3D8868365BBECC = { isa = PBXGroup; children = ( | F873E58ECE3D8868365BBECC = { isa = PBXGroup; children = ( | ||||
F672BEFBC87CBC0692E299FC, | |||||
55670E58151A717FBD6D1C65, | 55670E58151A717FBD6D1C65, | ||||
846146B17629B8601BAFD3BC, | 846146B17629B8601BAFD3BC, | ||||
A8ED2088E4636DD9BC944833, | A8ED2088E4636DD9BC944833, | ||||
@@ -1836,6 +1836,7 @@ | |||||
</Filter> | </Filter> | ||||
<Filter Name="juce_gui_basics"> | <Filter Name="juce_gui_basics"> | ||||
<Filter Name="components"> | <Filter Name="components"> | ||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/> | |||||
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | <File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp"> | ||||
<FileConfiguration Name="Debug|Win32" | <FileConfiguration Name="Debug|Win32" | ||||
ExcludedFromBuild="true"> | ExcludedFromBuild="true"> | ||||
@@ -1175,6 +1175,7 @@ | |||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/> | <ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/> | ||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/> | <ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/> | ||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.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_Component.h"/> | ||||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/> | <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/> | ||||
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/> | <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/> | ||||
@@ -1926,6 +1926,9 @@ | |||||
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"> | <ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"> | ||||
<Filter>Juce Modules\juce_graphics</Filter> | <Filter>Juce Modules\juce_graphics</Filter> | ||||
</ClInclude> | </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"> | <ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"> | ||||
<Filter>Juce Modules\juce_gui_basics\components</Filter> | <Filter>Juce Modules\juce_gui_basics\components</Filter> | ||||
</ClInclude> | </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 | class Component::MouseListenerList | ||||
{ | { | ||||
public: | public: | ||||
MouseListenerList() | |||||
MouseListenerList() noexcept | |||||
: numDeepMouseListeners (0) | : 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() | 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. | // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. | ||||
CHECK_MESSAGE_MANAGER_IS_LOCKED | CHECK_MESSAGE_MANAGER_IS_LOCKED | ||||
WeakReference<Component> safePointer (this); | |||||
const WeakReference<Component> safePointer (this); | |||||
flags.visibleFlag = shouldBeVisible; | flags.visibleFlag = shouldBeVisible; | ||||
internalRepaint (0, 0, getWidth(), getHeight()); | |||||
if (shouldBeVisible) | |||||
repaint(); | |||||
else | |||||
repaintParent(); | |||||
sendFakeMouseMove(); | sendFakeMouseMove(); | ||||
if (! shouldBeVisible) | if (! shouldBeVisible) | ||||
{ | { | ||||
if (cachedImage != nullptr) | |||||
cachedImage->releaseResources(); | |||||
if (currentlyFocusedComponent == this || isParentOf (currentlyFocusedComponent)) | if (currentlyFocusedComponent == this || isParentOf (currentlyFocusedComponent)) | ||||
{ | { | ||||
if (parentComponent != nullptr) | if (parentComponent != nullptr) | ||||
@@ -567,7 +639,7 @@ void Component::addToDesktop (int styleWanted, void* nativeWindowToAttachTo) | |||||
if (styleWanted != currentStyleFlags || ! flags.hasHeavyweightPeerFlag) | if (styleWanted != currentStyleFlags || ! flags.hasHeavyweightPeerFlag) | ||||
{ | { | ||||
WeakReference<Component> safePointer (this); | |||||
const WeakReference<Component> safePointer (this); | |||||
#if JUCE_LINUX | #if JUCE_LINUX | ||||
// it's wise to give the component a non-zero size before | // 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) | 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... */ | /* Deprecated methods... */ | ||||
const Point<int> Component::relativePositionToGlobal (const Point<int>& relativePosition) const | |||||
Point<int> Component::relativePositionToGlobal (const Point<int>& relativePosition) const | |||||
{ | { | ||||
return localPointToGlobal (relativePosition); | 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); | 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) | return targetComponent == nullptr ? localPointToGlobal (positionRelativeToThis) | ||||
: targetComponent->getLocalPoint (this, 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) | else if (! flags.hasHeavyweightPeerFlag) | ||||
repaintParent(); | repaintParent(); | ||||
} | } | ||||
else | |||||
else if (cachedImage != nullptr) | |||||
{ | { | ||||
bufferedImage = Image::null; | |||||
cachedImage->invalidateAll(); | |||||
} | } | ||||
if (flags.hasHeavyweightPeerFlag) | if (flags.hasHeavyweightPeerFlag) | ||||
@@ -1375,12 +1462,17 @@ Component* Component::removeChildComponent (const int index, bool sendParentEven | |||||
if (sendParentEvents) | if (sendParentEvents) | ||||
{ | { | ||||
sendFakeMouseMove(); | sendFakeMouseMove(); | ||||
child->repaintParent(); | |||||
if (child->isVisible()) | |||||
child->repaintParent(); | |||||
} | } | ||||
childComponentList.remove (index); | childComponentList.remove (index); | ||||
child->parentComponent = nullptr; | 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) | // (NB: there are obscure situations where child->isShowing() = false, but it still has the focus) | ||||
if (currentlyFocusedComponent == child || child->isParentOf (currentlyFocusedComponent)) | if (currentlyFocusedComponent == child || child->isParentOf (currentlyFocusedComponent)) | ||||
{ | { | ||||
@@ -1702,112 +1794,76 @@ float Component::getAlpha() const | |||||
return (255 - componentTransparency) / 255.0f; | 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 | // 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. | // thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe. | ||||
CHECK_MESSAGE_MANAGER_IS_LOCKED | 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) | void Component::paintWithinParentContext (Graphics& g) | ||||
{ | { | ||||
g.setOrigin (getX(), getY()); | g.setOrigin (getX(), getY()); | ||||
paintEntireComponent (g, false); | |||||
if (cachedImage != nullptr) | |||||
cachedImage->paint (g); | |||||
else | |||||
paintEntireComponent (g, false); | |||||
} | } | ||||
void Component::paintComponentAndChildren (Graphics& g) | void Component::paintComponentAndChildren (Graphics& g) | ||||
@@ -1816,7 +1872,7 @@ void Component::paintComponentAndChildren (Graphics& g) | |||||
if (flags.dontClipGraphicsFlag) | if (flags.dontClipGraphicsFlag) | ||||
{ | { | ||||
paintComponent (g); | |||||
paint (g); | |||||
} | } | ||||
else | else | ||||
{ | { | ||||
@@ -1824,7 +1880,7 @@ void Component::paintComponentAndChildren (Graphics& g) | |||||
ComponentHelpers::clipObscuredRegions (*this, g, clipBounds, Point<int>()); | ComponentHelpers::clipObscuredRegions (*this, g, clipBounds, Point<int>()); | ||||
if (! g.isClipEmpty()) | if (! g.isClipEmpty()) | ||||
paintComponent (g); | |||||
paint (g); | |||||
g.restoreState(); | g.restoreState(); | ||||
} | } | ||||
@@ -1884,8 +1940,6 @@ void Component::paintComponentAndChildren (Graphics& g) | |||||
void Component::paintEntireComponent (Graphics& g, const bool ignoreAlphaLevel) | void Component::paintEntireComponent (Graphics& g, const bool ignoreAlphaLevel) | ||||
{ | { | ||||
jassert (! g.isClipEmpty()); | |||||
#if JUCE_DEBUG | #if JUCE_DEBUG | ||||
flags.isInsidePaintCall = true; | flags.isInsidePaintCall = true; | ||||
#endif | #endif | ||||
@@ -1990,7 +2044,7 @@ void Component::sendLookAndFeelChange() | |||||
{ | { | ||||
repaint(); | repaint(); | ||||
WeakReference<Component> safePointer (this); | |||||
const WeakReference<Component> safePointer (this); | |||||
lookAndFeelChanged(); | lookAndFeelChanged(); | ||||
@@ -2592,7 +2646,7 @@ void Component::focusLost (FocusChangeType) | |||||
void Component::internalFocusLoss (const FocusChangeType cause) | void Component::internalFocusLoss (const FocusChangeType cause) | ||||
{ | { | ||||
WeakReference<Component> safePointer (this); | |||||
const WeakReference<Component> safePointer (this); | |||||
focusLost (focusChangedDirectly); | focusLost (focusChangedDirectly); | ||||
@@ -2645,7 +2699,7 @@ void Component::setEnabled (const bool shouldBeEnabled) | |||||
void Component::sendEnablementChangeMessage() | void Component::sendEnablementChangeMessage() | ||||
{ | { | ||||
WeakReference<Component> safePointer (this); | |||||
const WeakReference<Component> safePointer (this); | |||||
enablementChanged(); | enablementChanged(); | ||||
@@ -2731,14 +2785,12 @@ void Component::takeKeyboardFocus (const FocusChangeType cause) | |||||
if (peer != nullptr) | if (peer != nullptr) | ||||
{ | { | ||||
WeakReference<Component> safePointer (this); | |||||
const WeakReference<Component> safePointer (this); | |||||
peer->grabFocus(); | peer->grabFocus(); | ||||
if (peer->isFocused() && currentlyFocusedComponent != this) | if (peer->isFocused() && currentlyFocusedComponent != this) | ||||
{ | { | ||||
WeakReference<Component> componentLosingFocus (currentlyFocusedComponent); | WeakReference<Component> componentLosingFocus (currentlyFocusedComponent); | ||||
currentlyFocusedComponent = this; | currentlyFocusedComponent = this; | ||||
Desktop::getInstance().triggerFocusCallback(); | Desktop::getInstance().triggerFocusCallback(); | ||||
@@ -2827,7 +2879,7 @@ void Component::moveKeyboardFocusToSibling (const bool moveToNext) | |||||
{ | { | ||||
if (nextComp->isCurrentlyBlockedByAnotherModalComponent()) | if (nextComp->isCurrentlyBlockedByAnotherModalComponent()) | ||||
{ | { | ||||
WeakReference<Component> nextCompPointer (nextComp); | |||||
const WeakReference<Component> nextCompPointer (nextComp); | |||||
internalModalInputAttempt(); | internalModalInputAttempt(); | ||||
if (nextCompPointer == nullptr || nextComp->isCurrentlyBlockedByAnotherModalComponent()) | if (nextCompPointer == nullptr || nextComp->isCurrentlyBlockedByAnotherModalComponent()) | ||||
@@ -40,6 +40,8 @@ class MouseInputSourceInternal; | |||||
class ComponentPeer; | class ComponentPeer; | ||||
class MarkerList; | class MarkerList; | ||||
class RelativeRectangle; | class RelativeRectangle; | ||||
class CachedComponentImage; | |||||
//============================================================================== | //============================================================================== | ||||
/** | /** | ||||
@@ -958,8 +960,9 @@ public: | |||||
There's no guarantee about how soon after calling repaint() the redraw will actually | 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. | 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, | To redraw just a subsection of the component rather than the whole thing, | ||||
use the repaint (int, int, int, int) method. | use the repaint (int, int, int, int) method. | ||||
@@ -2227,12 +2230,24 @@ public: | |||||
*/ | */ | ||||
void setPositioner (Positioner* newPositioner); | 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 | #ifndef DOXYGEN | ||||
// These methods are deprecated - use localPointToGlobal, getLocalPoint, getLocalPoint, etc instead. | // 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 | #endif | ||||
private: | private: | ||||
@@ -2254,7 +2269,7 @@ private: | |||||
LookAndFeel* lookAndFeel; | LookAndFeel* lookAndFeel; | ||||
MouseCursor cursor; | MouseCursor cursor; | ||||
ImageEffectFilter* effect; | ImageEffectFilter* effect; | ||||
Image bufferedImage; | |||||
ScopedPointer <CachedComponentImage> cachedImage; | |||||
class MouseListenerList; | class MouseListenerList; | ||||
friend class MouseListenerList; | friend class MouseListenerList; | ||||
@@ -2315,10 +2330,11 @@ private: | |||||
void internalModifierKeysChanged(); | void internalModifierKeysChanged(); | ||||
void internalChildrenChanged(); | void internalChildrenChanged(); | ||||
void internalHierarchyChanged(); | void internalHierarchyChanged(); | ||||
void internalRepaint (const Rectangle<int>&); | |||||
void internalRepaintUnchecked (const Rectangle<int>&, bool); | |||||
Component* removeChildComponent (int index, bool sendParentEvents, bool sendChildEvents); | Component* removeChildComponent (int index, bool sendParentEvents, bool sendChildEvents); | ||||
void moveChildInternal (int sourceIndex, int destIndex); | void moveChildInternal (int sourceIndex, int destIndex); | ||||
void paintComponentAndChildren (Graphics&); | void paintComponentAndChildren (Graphics&); | ||||
void paintComponent (Graphics&); | |||||
void paintWithinParentContext (Graphics&); | void paintWithinParentContext (Graphics&); | ||||
void sendMovedResizedMessages (bool wasMoved, bool wasResized); | void sendMovedResizedMessages (bool wasMoved, bool wasResized); | ||||
void repaintParent(); | void repaintParent(); | ||||
@@ -2353,8 +2369,6 @@ private: | |||||
protected: | protected: | ||||
//============================================================================== | //============================================================================== | ||||
/** @internal */ | /** @internal */ | ||||
virtual void internalRepaint (int x, int y, int w, int h); | |||||
/** @internal */ | |||||
virtual ComponentPeer* createNewPeer (int styleFlags, void* nativeWindowToAttachTo); | virtual ComponentPeer* createNewPeer (int styleFlags, void* nativeWindowToAttachTo); | ||||
#endif | #endif | ||||
}; | }; | ||||
@@ -75,6 +75,9 @@ BEGIN_JUCE_NAMESPACE | |||||
// START_AUTOINCLUDE components, mouse, keyboard, buttons, drawables, | // START_AUTOINCLUDE components, mouse, keyboard, buttons, drawables, | ||||
// filebrowser, layout, lookandfeel, menus, positioning, properties, | // filebrowser, layout, lookandfeel, menus, positioning, properties, | ||||
// widgets, windows, commands, application, misc | // widgets, windows, commands, application, misc | ||||
#ifndef __JUCE_CACHEDCOMPONENTIMAGE_JUCEHEADER__ | |||||
#include "components/juce_CachedComponentImage.h" | |||||
#endif | |||||
#ifndef __JUCE_COMPONENT_JUCEHEADER__ | #ifndef __JUCE_COMPONENT_JUCEHEADER__ | ||||
#include "components/juce_Component.h" | #include "components/juce_Component.h" | ||||
#endif | #endif | ||||
@@ -34,11 +34,6 @@ void* OpenGLComponent::getNativeWindowHandle() const | |||||
return nullptr; | 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>&) | void OpenGLComponent::updateEmbeddedPosition (const Rectangle<int>&) | ||||
{ | { | ||||
} | } | ||||
@@ -153,7 +153,8 @@ public: | |||||
glGenRenderbuffersOES (1, &depthBufferHandle); | glGenRenderbuffersOES (1, &depthBufferHandle); | ||||
glBindRenderbufferOES (GL_RENDERBUFFER_OES, colorBufferHandle); | 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; | GLint width, height; | ||||
glGetRenderbufferParameterivOES (GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &width); | glGetRenderbufferParameterivOES (GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &width); | ||||
@@ -178,6 +179,8 @@ public: | |||||
void freeGLBuffers() | void freeGLBuffers() | ||||
{ | { | ||||
[context renderbufferStorage: GL_RENDERBUFFER_OES fromDrawable: nil]; | |||||
if (frameBufferHandle != 0) | if (frameBufferHandle != 0) | ||||
{ | { | ||||
glDeleteFramebuffersOES (1, &frameBufferHandle); | glDeleteFramebuffersOES (1, &frameBufferHandle); | ||||
@@ -197,7 +200,6 @@ public: | |||||
} | } | ||||
} | } | ||||
//============================================================================== | |||||
private: | private: | ||||
WeakReference<Component> component; | WeakReference<Component> component; | ||||
JuceGLView* view; | JuceGLView* view; | ||||
@@ -208,7 +210,6 @@ private: | |||||
int numFrames; | int numFrames; | ||||
int lastWidth, lastHeight; | int lastWidth, lastHeight; | ||||
//============================================================================== | |||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GLESContext); | JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GLESContext); | ||||
}; | }; | ||||
@@ -221,16 +222,12 @@ OpenGLContext* OpenGLComponent::createContext() | |||||
if (peer != nullptr) | if (peer != nullptr) | ||||
return new GLESContext ((UIView*) peer->getNativeHandle(), this, preferredPixelFormat, | return new GLESContext ((UIView*) peer->getNativeHandle(), this, preferredPixelFormat, | ||||
dynamic_cast <const GLESContext*> (contextToShareListsWith), | dynamic_cast <const GLESContext*> (contextToShareListsWith), | ||||
type == openGLES2 ? kEAGLRenderingAPIOpenGLES2 : kEAGLRenderingAPIOpenGLES1); | |||||
(flags & openGLES2) == 0 ? kEAGLRenderingAPIOpenGLES1 | |||||
: kEAGLRenderingAPIOpenGLES2); | |||||
return nullptr; | 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) | void OpenGLComponent::updateEmbeddedPosition (const Rectangle<int>& bounds) | ||||
{ | { | ||||
if (context != nullptr) | if (context != nullptr) | ||||
@@ -190,11 +190,6 @@ OpenGLContext* OpenGLComponent::createContext() | |||||
return (c->renderContext != 0) ? c.release() : nullptr; | 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) | void OpenGLComponent::updateEmbeddedPosition (const Rectangle<int>& bounds) | ||||
{ | { | ||||
if (context != nullptr) | if (context != nullptr) | ||||
@@ -245,22 +245,6 @@ void* OpenGLComponent::getNativeWindowHandle() const | |||||
: nullptr; | : 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>&) | void OpenGLComponent::updateEmbeddedPosition (const Rectangle<int>&) | ||||
{ | { | ||||
} | } | ||||
@@ -324,17 +324,6 @@ void* OpenGLComponent::getNativeWindowHandle() const | |||||
return context != nullptr ? static_cast<WindowedGLContext*> (context.get())->getNativeWindowHandle() : nullptr; | 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) | void OpenGLComponent::updateEmbeddedPosition (const Rectangle<int>& bounds) | ||||
{ | { | ||||
if (context != nullptr) | if (context != nullptr) | ||||
@@ -30,7 +30,7 @@ BEGIN_JUCE_NAMESPACE | |||||
OpenGLPixelFormat::OpenGLPixelFormat (const int bitsPerRGBComponent, | OpenGLPixelFormat::OpenGLPixelFormat (const int bitsPerRGBComponent, | ||||
const int alphaBits_, | const int alphaBits_, | ||||
const int depthBufferBits_, | const int depthBufferBits_, | ||||
const int stencilBufferBits_) | |||||
const int stencilBufferBits_) noexcept | |||||
: redBits (bitsPerRGBComponent), | : redBits (bitsPerRGBComponent), | ||||
greenBits (bitsPerRGBComponent), | greenBits (bitsPerRGBComponent), | ||||
blueBits (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), | : redBits (other.redBits), | ||||
greenBits (other.greenBits), | greenBits (other.greenBits), | ||||
blueBits (other.blueBits), | 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; | redBits = other.redBits; | ||||
greenBits = other.greenBits; | greenBits = other.greenBits; | ||||
@@ -76,7 +76,7 @@ OpenGLPixelFormat& OpenGLPixelFormat::operator= (const OpenGLPixelFormat& other) | |||||
return *this; | return *this; | ||||
} | } | ||||
bool OpenGLPixelFormat::operator== (const OpenGLPixelFormat& other) const | |||||
bool OpenGLPixelFormat::operator== (const OpenGLPixelFormat& other) const noexcept | |||||
{ | { | ||||
return redBits == other.redBits | return redBits == other.redBits | ||||
&& greenBits == other.greenBits | && greenBits == other.greenBits | ||||
@@ -121,30 +121,30 @@ OpenGLContext* OpenGLContext::getCurrentContext() | |||||
class OpenGLComponent::OpenGLComponentWatcher : public ComponentMovementWatcher | class OpenGLComponent::OpenGLComponentWatcher : public ComponentMovementWatcher | ||||
{ | { | ||||
public: | public: | ||||
OpenGLComponentWatcher (OpenGLComponent* const owner_) | |||||
: ComponentMovementWatcher (owner_), | |||||
OpenGLComponentWatcher (OpenGLComponent& owner_) | |||||
: ComponentMovementWatcher (&owner_), | |||||
owner (owner_) | owner (owner_) | ||||
{ | { | ||||
} | } | ||||
void componentMovedOrResized (bool /*wasMoved*/, bool /*wasResized*/) | void componentMovedOrResized (bool /*wasMoved*/, bool /*wasResized*/) | ||||
{ | { | ||||
owner->updateContextPosition(); | |||||
owner.updateContextPosition(); | |||||
} | } | ||||
void componentPeerChanged() | void componentPeerChanged() | ||||
{ | { | ||||
owner->recreateContextAsync(); | |||||
owner.recreateContextAsync(); | |||||
} | } | ||||
void componentVisibilityChanged() | void componentVisibilityChanged() | ||||
{ | { | ||||
if (! owner->isShowing()) | |||||
owner->stopBackgroundThread(); | |||||
if (! owner.isShowing()) | |||||
owner.stopBackgroundThread(); | |||||
} | } | ||||
private: | private: | ||||
OpenGLComponent* const owner; | |||||
OpenGLComponent& owner; | |||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenGLComponentWatcher); | 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), | contextToShareListsWith (nullptr), | ||||
needToUpdateViewport (true), | needToUpdateViewport (true), | ||||
needToDeleteContext (false), | needToDeleteContext (false), | ||||
threadStarted (false), | |||||
useThread (useBackgroundThread) | |||||
threadStarted (false) | |||||
{ | { | ||||
setOpaque (true); | setOpaque (true); | ||||
componentWatcher = new OpenGLComponentWatcher (this); | |||||
componentWatcher = new OpenGLComponentWatcher (*this); | |||||
setCachedComponentImage (new OpenGLCachedComponentImage (*this)); | |||||
} | } | ||||
OpenGLComponent::~OpenGLComponent() | OpenGLComponent::~OpenGLComponent() | ||||
@@ -321,6 +480,7 @@ void OpenGLComponent::deleteContext() | |||||
} | } | ||||
context = nullptr; | context = nullptr; | ||||
setCachedComponentImage (nullptr); | |||||
} | } | ||||
needToDeleteContext = false; | 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() | bool OpenGLComponent::renderAndSwapBuffers() | ||||
{ | { | ||||
const ScopedLock sl (contextLock); | const ScopedLock sl (contextLock); | ||||
@@ -411,6 +537,21 @@ bool OpenGLComponent::renderAndSwapBuffers() | |||||
return true; | 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 | unsigned int OpenGLComponent::getFrameBufferID() const | ||||
{ | { | ||||
return context != nullptr ? context->getFrameBufferID() : 0; | return context != nullptr ? context->getFrameBufferID() : 0; | ||||
@@ -47,26 +47,42 @@ class JUCE_API OpenGLComponent : public OpenGLBaseType, | |||||
{ | { | ||||
public: | 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 | #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 | #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. | /** 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. */ | /** Destructor. */ | ||||
~OpenGLComponent(); | ~OpenGLComponent(); | ||||
@@ -101,7 +117,7 @@ public: | |||||
/** Returns true if the component is performing the rendering on a background thread. | /** Returns true if the component is performing the rendering on a background thread. | ||||
This property is specified in the constructor. | 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. | /** This replaces the normal paint() callback - use it to draw your openGL stuff. | ||||
@@ -177,6 +193,14 @@ public: | |||||
int getRenderingTargetWidth() const { return getWidth(); } | int getRenderingTargetWidth() const { return getWidth(); } | ||||
int getRenderingTargetHeight() const { return getHeight(); } | 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. | /** Calls the rendering callback, and swaps the buffers afterwards. | ||||
This is called automatically by paint() when the component needs to be rendered. | This is called automatically by paint() when the component needs to be rendered. | ||||
@@ -225,12 +249,11 @@ protected: | |||||
*/ | */ | ||||
virtual void stopRenderThread(); | virtual void stopRenderThread(); | ||||
//============================================================================== | |||||
/** @internal */ | /** @internal */ | ||||
void paint (Graphics& g); | |||||
void paint (Graphics&); | |||||
private: | private: | ||||
const OpenGLType type; | |||||
const int flags; | |||||
class OpenGLComponentRenderThread; | class OpenGLComponentRenderThread; | ||||
friend class OpenGLComponentRenderThread; | friend class OpenGLComponentRenderThread; | ||||
@@ -247,14 +270,15 @@ private: | |||||
CriticalSection contextLock; | CriticalSection contextLock; | ||||
OpenGLPixelFormat preferredPixelFormat; | OpenGLPixelFormat preferredPixelFormat; | ||||
bool needToUpdateViewport, needToDeleteContext, threadStarted; | bool needToUpdateViewport, needToDeleteContext, threadStarted; | ||||
const bool useThread; | |||||
class OpenGLCachedComponentImage; | |||||
friend class OpenGLCachedComponentImage; | |||||
OpenGLContext* createContext(); | OpenGLContext* createContext(); | ||||
void updateContext(); | void updateContext(); | ||||
void updateContextPosition(); | void updateContextPosition(); | ||||
void stopBackgroundThread(); | void stopBackgroundThread(); | ||||
void recreateContextAsync(); | void recreateContextAsync(); | ||||
void internalRepaint (int x, int y, int w, int h); | |||||
void updateEmbeddedPosition (const Rectangle<int>&); | void updateEmbeddedPosition (const Rectangle<int>&); | ||||
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenGLComponent); | 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 | ~GLShaderProgram() noexcept | ||||
{ | { | ||||
glDeleteProgram (program); | glDeleteProgram (program); | ||||
@@ -297,9 +290,9 @@ public: | |||||
#endif | #endif | ||||
} | } | ||||
struct UniformLocation | |||||
struct Uniform | |||||
{ | { | ||||
UniformLocation (const GLShaderProgram& program, const GLchar* name) | |||||
Uniform (const GLShaderProgram& program, const GLchar* name) | |||||
: uniformID (glGetUniformLocation (program.program, name)) | : uniformID (glGetUniformLocation (program.program, name)) | ||||
{ | { | ||||
jassert (uniformID >= 0); | jassert (uniformID >= 0); | ||||
@@ -335,76 +328,85 @@ struct ShaderPrograms | |||||
bool areShadersSupported; | bool areShadersSupported; | ||||
struct SolidColourMaskedProgram | |||||
struct ShaderBase | |||||
{ | |||||
ShaderBase (const char* fragmentShader) | |||||
{ | |||||
addShader (fragmentShader, GL_FRAGMENT_SHADER); | |||||
link(); | |||||
} | |||||
GLShaderProgram program; | |||||
}; | |||||
struct SolidColourMaskedProgram : public ShaderBase | |||||
{ | { | ||||
SolidColourMaskedProgram() | 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"), | maskTexture (program, "maskTexture"), | ||||
maskBounds (program, "maskBounds") | maskBounds (program, "maskBounds") | ||||
{ | { | ||||
} | } | ||||
GLShaderProgram program; | |||||
GLShaderProgram::UniformLocation maskTexture, maskBounds; | |||||
GLShaderProgram::Uniform maskTexture, maskBounds; | |||||
}; | }; | ||||
struct RadialGradientProgram | |||||
struct RadialGradientProgram : public ShaderBase | |||||
{ | { | ||||
RadialGradientProgram() | 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"), | gradientTexture (program, "gradientTexture"), | ||||
matrix (program, "matrix") | matrix (program, "matrix") | ||||
{ | { | ||||
} | } | ||||
GLShaderProgram program; | |||||
GLShaderProgram::UniformLocation gradientTexture, matrix; | |||||
GLShaderProgram::Uniform gradientTexture, matrix; | |||||
}; | }; | ||||
struct RadialGradientMaskedProgram | |||||
struct RadialGradientMaskedProgram : public ShaderBase | |||||
{ | { | ||||
RadialGradientMaskedProgram() | 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"), | gradientTexture (program, "gradientTexture"), | ||||
matrix (program, "matrix"), | matrix (program, "matrix"), | ||||
maskTexture (program, "maskTexture"), | 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() | 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"), | gradientTexture (program, "gradientTexture"), | ||||
gradientInfo (program, "gradientInfo") | gradientInfo (program, "gradientInfo") | ||||
{ | { | ||||
} | } | ||||
GLShaderProgram program; | |||||
GLShaderProgram::UniformLocation gradientTexture, gradientInfo; | |||||
GLShaderProgram::Uniform gradientTexture, gradientInfo; | |||||
}; | }; | ||||
struct LinearGradient1MaskedProgram | |||||
struct LinearGradient1MaskedProgram : public ShaderBase | |||||
{ | { | ||||
LinearGradient1MaskedProgram() | 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"), | gradientTexture (program, "gradientTexture"), | ||||
gradientInfo (program, "gradientInfo"), | gradientInfo (program, "gradientInfo"), | ||||
maskTexture (program, "maskTexture"), | 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() | 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"), | gradientTexture (program, "gradientTexture"), | ||||
gradientInfo (program, "gradientInfo") | gradientInfo (program, "gradientInfo") | ||||
{ | { | ||||
} | } | ||||
GLShaderProgram program; | |||||
GLShaderProgram::UniformLocation gradientTexture, gradientInfo; | |||||
GLShaderProgram::Uniform gradientTexture, gradientInfo; | |||||
}; | }; | ||||
struct LinearGradient2MaskedProgram | |||||
struct LinearGradient2MaskedProgram : public ShaderBase | |||||
{ | { | ||||
LinearGradient2MaskedProgram() | 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"), | gradientTexture (program, "gradientTexture"), | ||||
gradientInfo (program, "gradientInfo"), | gradientInfo (program, "gradientInfo"), | ||||
maskTexture (program, "maskTexture"), | 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; | SolidColourMaskedProgram solidColourMasked; | ||||
@@ -45,11 +45,11 @@ public: | |||||
OpenGLPixelFormat (int bitsPerRGBComponent = 8, | OpenGLPixelFormat (int bitsPerRGBComponent = 8, | ||||
int alphaBits = 8, | int alphaBits = 8, | ||||
int depthBufferBits = 16, | 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. */ | int redBits; /**< The number of bits per pixel to use for the red channel. */ | ||||