Browse Source

New internal class CachedComponentImage, which is used internally to manage component buffering. I've used this to rebuild the OpenGLComponent's rendering algorithm so that it now supports sub-components and can have 2D content drawn in its paint method. Updated the openGL demo to show this in action.

tags/2021-05-28
jules 13 years ago
parent
commit
ea6df1c8f1
43 changed files with 3566 additions and 2492 deletions
  1. +2
    -0
      extras/Introjucer/Builds/MacOSX/The Introjucer.xcodeproj/project.pbxproj
  2. +1
    -0
      extras/Introjucer/Builds/VisualStudio2005/The Introjucer.vcproj
  3. +1
    -0
      extras/Introjucer/Builds/VisualStudio2008/The Introjucer.vcproj
  4. +1
    -0
      extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj
  5. +3
    -0
      extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj.filters
  6. +2851
    -2092
      extras/JuceDemo/Builds/MacOSX/Juce Demo.xcodeproj/project.pbxproj
  7. +1
    -0
      extras/JuceDemo/Builds/VisualStudio2005/Juce Demo.vcproj
  8. +1
    -0
      extras/JuceDemo/Builds/VisualStudio2008/Juce Demo.vcproj
  9. +1
    -0
      extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj
  10. +3
    -0
      extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj.filters
  11. +2
    -0
      extras/JuceDemo/Builds/iOS/Juce Demo.xcodeproj/project.pbxproj
  12. +45
    -32
      extras/JuceDemo/Source/demos/OpenGLDemo.cpp
  13. +3
    -1
      extras/audio plugin demo/Builds/MacOSX/JuceDemoPlugin.xcodeproj/project.pbxproj
  14. +1
    -0
      extras/audio plugin demo/Builds/VisualStudio2005/JuceDemoPlugin.vcproj
  15. +1
    -0
      extras/audio plugin demo/Builds/VisualStudio2008/JuceDemoPlugin.vcproj
  16. +13
    -11
      extras/audio plugin host/Builds/MacOSX/Plugin Host.xcodeproj/project.pbxproj
  17. +1
    -0
      extras/audio plugin host/Builds/VisualStudio2005/Plugin Host.vcproj
  18. +1
    -0
      extras/audio plugin host/Builds/VisualStudio2008/Plugin Host.vcproj
  19. +2
    -0
      extras/example projects/Builds/MacOSX/HelloWorld.xcodeproj/project.pbxproj
  20. +1
    -0
      extras/example projects/Builds/VisualStudio2005/HelloWorld.vcproj
  21. +1
    -0
      extras/example projects/Builds/VisualStudio2008/HelloWorld.vcproj
  22. +2
    -0
      extras/example projects/Builds/iOS/HelloWorld.xcodeproj/project.pbxproj
  23. +2
    -0
      extras/static library/Builds/MacOSX/juce.xcodeproj/project.pbxproj
  24. +1
    -0
      extras/static library/Builds/VisualStudio2008/juce.vcproj
  25. +1
    -0
      extras/static library/Builds/VisualStudio2010/juce.vcxproj
  26. +3
    -0
      extras/static library/Builds/VisualStudio2010/juce.vcxproj.filters
  27. +2
    -0
      extras/the jucer/Builds/MacOSX/Jucer.xcodeproj/project.pbxproj
  28. +1
    -0
      extras/the jucer/Builds/VisualStudio2008/Jucer.vcproj
  29. +1
    -0
      extras/the jucer/Builds/VisualStudio2010/Jucer.vcxproj
  30. +3
    -0
      extras/the jucer/Builds/VisualStudio2010/Jucer.vcxproj.filters
  31. +67
    -0
      modules/juce_gui_basics/components/juce_CachedComponentImage.h
  32. +150
    -98
      modules/juce_gui_basics/components/juce_Component.cpp
  33. +23
    -9
      modules/juce_gui_basics/components/juce_Component.h
  34. +3
    -0
      modules/juce_gui_basics/juce_gui_basics.h
  35. +0
    -5
      modules/juce_opengl/native/juce_android_OpenGLComponent.cpp
  36. +6
    -9
      modules/juce_opengl/native/juce_ios_OpenGLComponent.mm
  37. +0
    -5
      modules/juce_opengl/native/juce_linux_OpenGLComponent.cpp
  38. +0
    -16
      modules/juce_opengl/native/juce_mac_OpenGLComponent.mm
  39. +0
    -11
      modules/juce_opengl/native/juce_win32_OpenGLComponent.cpp
  40. +191
    -50
      modules/juce_opengl/opengl/juce_OpenGLComponent.cpp
  41. +41
    -17
      modules/juce_opengl/opengl/juce_OpenGLComponent.h
  42. +129
    -132
      modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp
  43. +4
    -4
      modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h

+ 2
- 0
extras/Introjucer/Builds/MacOSX/The Introjucer.xcodeproj/project.pbxproj View File

@@ -218,6 +218,7 @@
3AB744A14A560E541723DC9A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Uuid.cpp"; path = "../../../../modules/juce_core/misc/juce_Uuid.cpp"; sourceTree = "SOURCE_ROOT"; };
3B061AB9BFD8883A6AE8BCE5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DynamicLibrary.h"; path = "../../../../modules/juce_core/threads/juce_DynamicLibrary.h"; sourceTree = "SOURCE_ROOT"; };
3C48242E40D358BC6FF7FE53 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_PlatformDefs.h"; path = "../../../../modules/juce_core/system/juce_PlatformDefs.h"; sourceTree = "SOURCE_ROOT"; };
3CABAAC1C4BC0D8105183D56 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CachedComponentImage.h"; path = "../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h"; sourceTree = "SOURCE_ROOT"; };
3CD57938B4C273D0AA6E6B8B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Path.h"; path = "../../../../modules/juce_graphics/geometry/juce_Path.h"; sourceTree = "SOURCE_ROOT"; };
3D2B51C71E3676F283B778EA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DragAndDropContainer.h"; path = "../../../../modules/juce_gui_basics/mouse/juce_DragAndDropContainer.h"; sourceTree = "SOURCE_ROOT"; };
3F1501FE4867042830B25DD5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CustomTypeface.cpp"; path = "../../../../modules/juce_graphics/fonts/juce_CustomTypeface.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -1227,6 +1228,7 @@
30AD756E053A0663BF664823,
8DDA82E1200B61D3B6C526E8 ); name = "juce_graphics"; sourceTree = "<group>"; };
2CEAE8B236FEF5E06317EF3B = { isa = PBXGroup; children = (
3CABAAC1C4BC0D8105183D56,
4C150A1BF98D747EC218A602,
FDD33A6837774904810208D5,
0BEDB3FD70AB61D3E7891D74,


+ 1
- 0
extras/Introjucer/Builds/VisualStudio2005/The Introjucer.vcproj View File

@@ -1941,6 +1941,7 @@
</Filter>
<Filter Name="juce_gui_basics">
<Filter Name="components">
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp">
<FileConfiguration Name="Debug|Win32"
ExcludedFromBuild="true">


+ 1
- 0
extras/Introjucer/Builds/VisualStudio2008/The Introjucer.vcproj View File

@@ -1941,6 +1941,7 @@
</Filter>
<Filter Name="juce_gui_basics">
<Filter Name="components">
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp">
<FileConfiguration Name="Debug|Win32"
ExcludedFromBuild="true">


+ 1
- 0
extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj View File

@@ -1178,6 +1178,7 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"/>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>


+ 3
- 0
extras/Introjucer/Builds/VisualStudio2010/The Introjucer.vcxproj.filters View File

@@ -1869,6 +1869,9 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h">
<Filter>Juce Modules\juce_graphics</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h">
<Filter>Juce Modules\juce_gui_basics\components</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h">
<Filter>Juce Modules\juce_gui_basics\components</Filter>
</ClInclude>


+ 2851
- 2092
extras/JuceDemo/Builds/MacOSX/Juce Demo.xcodeproj/project.pbxproj
File diff suppressed because it is too large
View File


+ 1
- 0
extras/JuceDemo/Builds/VisualStudio2005/Juce Demo.vcproj View File

@@ -2697,6 +2697,7 @@
</Filter>
<Filter Name="juce_gui_basics">
<Filter Name="components">
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp">
<FileConfiguration Name="Debug|Win32"
ExcludedFromBuild="true">


+ 1
- 0
extras/JuceDemo/Builds/VisualStudio2008/Juce Demo.vcproj View File

@@ -2697,6 +2697,7 @@
</Filter>
<Filter Name="juce_gui_basics">
<Filter Name="components">
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp">
<FileConfiguration Name="Debug|Win32"
ExcludedFromBuild="true">


+ 1
- 0
extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj View File

@@ -1454,6 +1454,7 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"/>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>


+ 3
- 0
extras/JuceDemo/Builds/VisualStudio2010/Juce Demo.vcxproj.filters View File

@@ -2367,6 +2367,9 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h">
<Filter>Juce Modules\juce_graphics</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h">
<Filter>Juce Modules\juce_gui_basics\components</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h">
<Filter>Juce Modules\juce_gui_basics\components</Filter>
</ClInclude>


+ 2
- 0
extras/JuceDemo/Builds/iOS/Juce Demo.xcodeproj/project.pbxproj View File

@@ -636,6 +636,7 @@
A974197873E277C3BA5DF666 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_cryptography.h"; path = "../../../../modules/juce_cryptography/juce_cryptography.h"; sourceTree = "SOURCE_ROOT"; };
A97EC32975392744C62684F9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_gui_extra.h"; path = "../../../../modules/juce_gui_extra/juce_gui_extra.h"; sourceTree = "SOURCE_ROOT"; };
A9958339328213FF76D8A79C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_MouseInputSource.cpp"; path = "../../../../modules/juce_gui_basics/mouse/juce_MouseInputSource.cpp"; sourceTree = "SOURCE_ROOT"; };
A9B72D6049A3539B63AE79D5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CachedComponentImage.h"; path = "../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h"; sourceTree = "SOURCE_ROOT"; };
AA0DE5CA2B089393B110FD25 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_DrawableShape.h"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawableShape.h"; sourceTree = "SOURCE_ROOT"; };
AAABC8FBF364D9A596F4AA4E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_android_JNIHelpers.h"; path = "../../../../modules/juce_core/native/juce_android_JNIHelpers.h"; sourceTree = "SOURCE_ROOT"; };
AAC98CB517D934F42A25416E = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_BubbleComponent.h"; path = "../../../../modules/juce_gui_basics/misc/juce_BubbleComponent.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1540,6 +1541,7 @@
B523ED8502475B9BB3F392C7,
BF59C96BC3BCB29CCB421861 ); name = "juce_graphics"; sourceTree = "<group>"; };
754D5C51D503AEDC94BCDDFC = { isa = PBXGroup; children = (
A9B72D6049A3539B63AE79D5,
79078F37EB6919AA440017FC,
C9AEAD8B2366F9508E63A178,
BF6F272194D16055D6A90D94,


+ 45
- 32
extras/JuceDemo/Source/demos/OpenGLDemo.cpp View File

@@ -33,11 +33,33 @@ class DemoOpenGLCanvas : public OpenGLComponent,
{
public:
DemoOpenGLCanvas()
: rotation (0.0f),
delta (1.0f),
: OpenGLComponent (openGLDefault), rotation (0.0f),
textScrollPos (200)
{
startTimer (20);
infoLabel.setText ("These sliders demonstrate how components can be added as children "
"of an OpenGLComponent, in which case, their content will be rendered into "
"an OpenGL framebuffer and efficiently overlaid onto your GL content.", false);
infoLabel.setBounds ("parent.width * 0.05, bottom - 150, parent.width * 0.4, parent.height - 60");
infoLabel.setInterceptsMouseClicks (false, false);
addAndMakeVisible (&infoLabel);
speedSlider.setRange (-10.0, 10.0, 0.1);
speedSlider.setPopupMenuEnabled (true);
speedSlider.setValue (Random::getSystemRandom().nextDouble() * 3.0, false, false);
speedSlider.setSliderStyle (Slider::LinearHorizontal);
speedSlider.setTextBoxStyle (Slider::TextBoxLeft, false, 80, 20);
speedSlider.setBounds ("parent.width * 0.05, parent.height - 65, parent.width * 0.6, top + 24");
addAndMakeVisible (&speedSlider);
sizeSlider.setRange (0.2, 2.0, 0.01);
sizeSlider.setPopupMenuEnabled (true);
sizeSlider.setValue (Random::getSystemRandom().nextDouble() + 0.5, false, false);
sizeSlider.setSliderStyle (Slider::LinearHorizontal);
sizeSlider.setTextBoxStyle (Slider::TextBoxLeft, false, 80, 20);
sizeSlider.setBounds ("parent.width * 0.05, parent.height - 35, parent.width * 0.6, top + 24");
addAndMakeVisible (&sizeSlider);
startTimer (1000 / 30);
}
// when the component creates a new internal context, this is called, and
@@ -56,8 +78,7 @@ public:
void mouseDrag (const MouseEvent& e)
{
draggableOrientation.mouseDrag (e.getPosition());
delta = e.getDistanceFromDragStartX() / 100.0f;
repaint();
triggerRepaint();
}
void resized()
@@ -81,6 +102,7 @@ public:
glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
glEnable (GL_TEXTURE_2D);
OpenGLHelpers::prepareFor2D (getWidth(), getHeight());
OpenGLHelpers::setPerspective (45.0, getWidth() / (double) getHeight(), 0.1, 100.0);
glTranslatef (0.0f, 0.0f, -5.0f);
@@ -101,8 +123,6 @@ public:
tex2->draw3D (-1.0f, 1.0f, -1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, Colours::white);
tex2->draw3D ( 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, 1.0f, 1.0f, -1.0f, 1.0f, 1.0f, -1.0f, -1.0f, Colours::white);
tex2->draw3D (-1.0f, 1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, -1.0f, 1.0f, -1.0f, 1.0f, 1.0f, Colours::white);
drawForeground2DStuff(); // draws our scrolling text overlay
}
void updateTextureImage()
@@ -110,7 +130,8 @@ public:
// This image is a special framebuffer-backed image, so when we draw to it, the context
// will render directly into its framebuffer
dynamicTextureImage.clear (dynamicTextureImage.getBounds(), Colours::red.withRotatedHue (fabsf (::sinf (rotation / 300.0f))).withAlpha (0.7f));
dynamicTextureImage.clear (dynamicTextureImage.getBounds(),
Colours::red.withRotatedHue (fabsf (::sinf (rotation / 300.0f))).withAlpha (0.7f));
Graphics g (dynamicTextureImage);
@@ -127,9 +148,9 @@ public:
// This stuff just creates a spinning star shape and fills it..
Path p;
const float scale = getHeight() * 0.4f;
p.addStar (getLocalBounds().getCentre().toFloat(), 7,
scale + ::cosf (rotation * 0.0021f) * scale / 2,
scale + ::sinf (rotation * 0.001f) * scale / 2, rotation / 50.0f);
p.addStar (Point<float> (getWidth() * 0.7f, getHeight() * 0.4f), 7,
scale * (float) sizeSlider.getValue(), scale,
rotation / 50.0f);
g.setGradientFill (ColourGradient (Colours::green.withRotatedHue (fabsf (::sinf (rotation / 300.0f))),
0, 0,
@@ -138,36 +159,21 @@ public:
g.fillPath (p);
}
void drawForeground2DStuff()
{
OpenGLRenderer glRenderer (*this); // Create an OpenGLRenderer that will draw into this GL window..
Graphics g (&glRenderer); // ..and then wrap it in a normal Graphics object so we can draw with it.
// Then, just draw our scolling text like we would in any other component.
g.setColour (Colours::blue.withAlpha (0.5f));
g.setFont (30.0f, Font::bold);
drawScrollingMessage (g, getHeight() / 2);
}
void drawScrollingMessage (Graphics& g, int y) const
{
g.drawSingleLineText ("The background, foreground and texture are all being drawn using the OpenGLRenderer class, which "
"lets you use a standard JUCE 2D graphics context to render directly onto an OpenGL window or framebuffer... ",
(int) -std::fmod (textScrollPos, 2500.0f), y);
}
void timerCallback()
{
rotation += delta;
rotation += (float) speedSlider.getValue();
textScrollPos += 1.4f;
repaint();
triggerRepaint();
}
private:
Image logoImage, dynamicTextureImage;
float rotation, delta, textScrollPos;
float rotation, textScrollPos;
Draggable3DOrientation draggableOrientation;
Slider speedSlider, sizeSlider;
Label infoLabel;
// Functions to create a couple of images to use as textures..
static Image createLogoImage()
{
@@ -194,6 +200,13 @@ private:
g.fillPath (pp);
}
}
void drawScrollingMessage (Graphics& g, int y) const
{
g.drawSingleLineText ("The background, foreground and texture are all being drawn using the OpenGLRenderer class, which "
"lets you use a standard JUCE 2D graphics context to render directly onto an OpenGL window or framebuffer... ",
(int) -std::fmod (textScrollPos, 2500.0f), y);
}
};


+ 3
- 1
extras/audio plugin demo/Builds/MacOSX/JuceDemoPlugin.xcodeproj/project.pbxproj View File

@@ -588,6 +588,7 @@
AAA122282581E6425F5D9405 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_OggVorbisAudioFormat.cpp"; path = "../../../../modules/juce_audio_formats/codecs/juce_OggVorbisAudioFormat.cpp"; sourceTree = "SOURCE_ROOT"; };
AB0E8347C9AC7E4A861C0252 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_IIRFilterAudioSource.h"; path = "../../../../modules/juce_audio_basics/sources/juce_IIRFilterAudioSource.h"; sourceTree = "SOURCE_ROOT"; };
AB7726FF34DB2E7FA75ECC19 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ToolbarItemComponent.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_ToolbarItemComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
AB7BCFBC4B2CB784F57A0FBC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUInputFormatConverter.h; path = Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUInputFormatConverter.h; sourceTree = "DEVELOPER_DIR"; };
AB87317D90A518C8A886EE9D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioDeviceSelectorComponent.h"; path = "../../../../modules/juce_audio_utils/gui/juce_AudioDeviceSelectorComponent.h"; sourceTree = "SOURCE_ROOT"; };
ABC394D5E03B690404E80E1E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_MessageManager.mm"; path = "../../../../modules/juce_events/native/juce_mac_MessageManager.mm"; sourceTree = "SOURCE_ROOT"; };
ABCB715245090A15092108D5 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioDeviceManager.h"; path = "../../../../modules/juce_audio_devices/audio_io/juce_AudioDeviceManager.h"; sourceTree = "SOURCE_ROOT"; };
@@ -611,7 +612,6 @@
AA012A21BE3049C205D4A44A = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_AudioCDReader.cpp"; path = "../../../../modules/juce_audio_devices/native/juce_win32_AudioCDReader.cpp"; sourceTree = "SOURCE_ROOT"; };
AAEC41BFA57E45EBF94ED3C1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableImage.cpp"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawableImage.cpp"; sourceTree = "SOURCE_ROOT"; };
AB10327C69AAE4AACCFC81EB = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DrawableText.cpp"; path = "../../../../modules/juce_gui_basics/drawables/juce_DrawableText.cpp"; sourceTree = "SOURCE_ROOT"; };
AB7BCFBC4B2CB784F57A0FBC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = AUInputFormatConverter.h; path = Extras/CoreAudio/AudioUnits/AUPublic/Utility/AUInputFormatConverter.h; sourceTree = "DEVELOPER_DIR"; };
AB9AD07EF899B75AC4CF01DA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = CAMutex.h; path = Extras/CoreAudio/PublicUtility/CAMutex.h; sourceTree = "DEVELOPER_DIR"; };
AC5452F5122E3A4B670B5185 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioThumbnail.h"; path = "../../../../modules/juce_audio_utils/gui/juce_AudioThumbnail.h"; sourceTree = "SOURCE_ROOT"; };
ACC4E765AD4BF1D025FB4E83 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Network.cpp"; path = "../../../../modules/juce_core/native/juce_linux_Network.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -735,6 +735,7 @@
DB28D7857D3A5BB7091AF74E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_Network.mm"; path = "../../../../modules/juce_core/native/juce_mac_Network.mm"; sourceTree = "SOURCE_ROOT"; };
DBEA8C45A32E4462BADEF57C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ValueTree.h"; path = "../../../../modules/juce_data_structures/values/juce_ValueTree.h"; sourceTree = "SOURCE_ROOT"; };
DBFEFB5A6C80C7BA4F30E668 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_GIFLoader.cpp"; path = "../../../../modules/juce_graphics/image_formats/juce_GIFLoader.cpp"; sourceTree = "SOURCE_ROOT"; };
DC1620808CB348FA6A061F49 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CachedComponentImage.h"; path = "../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h"; sourceTree = "SOURCE_ROOT"; };
DC4D4D24B977FC378EBED464 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatReaderSource.cpp"; path = "../../../../modules/juce_audio_formats/format/juce_AudioFormatReaderSource.cpp"; sourceTree = "SOURCE_ROOT"; };
DC56C72351E6237B4E6AC628 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_Fonts.cpp"; path = "../../../../modules/juce_graphics/native/juce_linux_Fonts.cpp"; sourceTree = "SOURCE_ROOT"; };
DCB5B59D3F5E1075E42DC5AE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorPlayer.h"; path = "../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1460,6 +1461,7 @@
79B3B7E2DD82AB16C411D9E0,
E9B20812DF15AC01D00FAFF5 ); name = "juce_graphics"; sourceTree = "<group>"; };
644A6B4EE1701D8441A41B49 = { isa = PBXGroup; children = (
DC1620808CB348FA6A061F49,
9941F313443F3B72CA820E71,
A7EE73FF3A5962BBF41DC2AB,
89520054769FD08A7E2C2D4C,


+ 1
- 0
extras/audio plugin demo/Builds/VisualStudio2005/JuceDemoPlugin.vcproj View File

@@ -2574,6 +2574,7 @@
</Filter>
<Filter Name="juce_gui_basics">
<Filter Name="components">
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp">
<FileConfiguration Name="Debug|Win32"
ExcludedFromBuild="true">


+ 1
- 0
extras/audio plugin demo/Builds/VisualStudio2008/JuceDemoPlugin.vcproj View File

@@ -2574,6 +2574,7 @@
</Filter>
<Filter Name="juce_gui_basics">
<Filter Name="components">
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp">
<FileConfiguration Name="Debug|Win32"
ExcludedFromBuild="true">


+ 13
- 11
extras/audio plugin host/Builds/MacOSX/Plugin Host.xcodeproj/project.pbxproj View File

@@ -718,33 +718,22 @@
D313CF37B25D7FD313C4F336 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; };
D314CF2F97529FCF35042263 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ActionBroadcaster.cpp"; path = "../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.cpp"; sourceTree = "SOURCE_ROOT"; };
D3CBC8D7CD32BDA0D37B4155 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_File.h"; path = "../../../../modules/juce_core/files/juce_File.h"; sourceTree = "SOURCE_ROOT"; };
D3D7C89A43B6A3591B776B1E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_WebBrowserComponent.mm"; path = "../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm"; sourceTree = "SOURCE_ROOT"; };
D3EF8617364177AD4D247124 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_WASAPI.cpp"; path = "../../../../modules/juce_audio_devices/native/juce_win32_WASAPI.cpp"; sourceTree = "SOURCE_ROOT"; };
D41728E9EB1522CCAC9AC7D4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CameraDevice.h"; path = "../../../../modules/juce_video/capture/juce_CameraDevice.h"; sourceTree = "SOURCE_ROOT"; };
D41EA1E6002DE5DEB9A07CAA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ComponentPeer.h"; path = "../../../../modules/juce_gui_basics/windows/juce_ComponentPeer.h"; sourceTree = "SOURCE_ROOT"; };
D4CC4DE44C44AEE40085ACD7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_OpenGLComponent.cpp"; path = "../../../../modules/juce_opengl/native/juce_linux_OpenGLComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
D4DA13E7A12FB69C072D0FA7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ShapeButton.cpp"; path = "../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.cpp"; sourceTree = "SOURCE_ROOT"; };
D4EBC17BDB7F88CCBC76730B = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = AudioToolbox.framework; path = System/Library/Frameworks/AudioToolbox.framework; sourceTree = SDKROOT; };
D579AF76963B677C425CBF00 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_OldSchoolLookAndFeel.h"; path = "../../../../modules/juce_gui_extra/lookandfeel/juce_OldSchoolLookAndFeel.h"; sourceTree = "SOURCE_ROOT"; };
D5952905FC386C19D0818398 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_JPEGLoader.cpp"; path = "../../../../modules/juce_graphics/image_formats/juce_JPEGLoader.cpp"; sourceTree = "SOURCE_ROOT"; };
D5C074653417ED69A2B570AC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_processors.mm"; path = "../../../../modules/juce_audio_processors/juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; };
D7433453EBB3700D2805FF42 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_XmlDocument.h"; path = "../../../../modules/juce_core/xml/juce_XmlDocument.h"; sourceTree = "SOURCE_ROOT"; };
D795067D4EFB5A34BC383250 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ThreadPool.h"; path = "../../../../modules/juce_core/threads/juce_ThreadPool.h"; sourceTree = "SOURCE_ROOT"; };
D79E29A54AE62E03A533F436 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StretchableLayoutResizerBar.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp"; sourceTree = "SOURCE_ROOT"; };
D7C1255A555A016BA0D98228 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_cryptography.h"; path = "../../../../modules/juce_cryptography/juce_cryptography.h"; sourceTree = "SOURCE_ROOT"; };
D7D1FFD98DABD765479240E6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_EdgeTable.cpp"; path = "../../../../modules/juce_graphics/geometry/juce_EdgeTable.cpp"; sourceTree = "SOURCE_ROOT"; };
D8A3F086596562E081EB0F39 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioFormatManager.h"; path = "../../../../modules/juce_audio_formats/format/juce_AudioFormatManager.h"; sourceTree = "SOURCE_ROOT"; };
D8B7DCDFD32613B13AC54008 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LookAndFeel.cpp"; path = "../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp"; sourceTree = "SOURCE_ROOT"; };
D8C28108DE7AD0208D790606 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ProgressBar.cpp"; path = "../../../../modules/juce_gui_basics/widgets/juce_ProgressBar.cpp"; sourceTree = "SOURCE_ROOT"; };
D9207F324519739FC25FFBDE = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_core.h"; path = "../../../../modules/juce_core/juce_core.h"; sourceTree = "SOURCE_ROOT"; };
D950776EDF9260DB0278C132 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SliderPropertyComponent.cpp"; path = "../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
D9857957A36A3081186D53FC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_CameraDevice.cpp"; path = "../../../../modules/juce_video/native/juce_android_CameraDevice.cpp"; sourceTree = "SOURCE_ROOT"; };
DA918320EF4057DF54FF8909 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ActionBroadcaster.h"; path = "../../../../modules/juce_events/broadcasters/juce_ActionBroadcaster.h"; sourceTree = "SOURCE_ROOT"; };
DBD90FC88456B62308AD9AD0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_events.mm"; path = "../../../../modules/juce_events/juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
DC30BDE9C4EE1FD059D06902 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioDataConverters.cpp"; path = "../../../../modules/juce_audio_basics/buffers/juce_AudioDataConverters.cpp"; sourceTree = "SOURCE_ROOT"; };
DD8E5D0C88FA2C287F824357 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = GraphEditorPanel.h; path = ../../Source/GraphEditorPanel.h; sourceTree = "SOURCE_ROOT"; };
DE0C4CC1CE545BAD009786E4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioFormatWriter.cpp"; path = "../../../../modules/juce_audio_formats/format/juce_AudioFormatWriter.cpp"; sourceTree = "SOURCE_ROOT"; };
DE8035865F6033F8BBF41740 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_HyperlinkButton.cpp"; path = "../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp"; sourceTree = "SOURCE_ROOT"; };
E146C1CCDC8EA0498CD33E5D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_AudioIODevice.cpp"; path = "../../../../modules/juce_audio_devices/audio_io/juce_AudioIODevice.cpp"; sourceTree = "SOURCE_ROOT"; };
E179C9C99270068D4ED16872 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReverbAudioSource.h"; path = "../../../../modules/juce_audio_basics/sources/juce_ReverbAudioSource.h"; sourceTree = "SOURCE_ROOT"; };
E68018DE199135B7F738FB17 = { isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreAudioKit.framework; path = System/Library/Frameworks/CoreAudioKit.framework; sourceTree = SDKROOT; };
@@ -755,11 +744,21 @@
CBE270C197A66B22EEE54D9C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PluginListComponent.cpp"; path = "../../../../modules/juce_audio_processors/scanning/juce_PluginListComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
CF67033CFC21C0060B538042 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ReferenceCountedObject.h"; path = "../../../../modules/juce_core/memory/juce_ReferenceCountedObject.h"; sourceTree = "SOURCE_ROOT"; };
D06DA3FA113EAB0CCF8D7A64 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Singleton.h"; path = "../../../../modules/juce_core/memory/juce_Singleton.h"; sourceTree = "SOURCE_ROOT"; };
D3D7C89A43B6A3591B776B1E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_WebBrowserComponent.mm"; path = "../../../../modules/juce_gui_extra/native/juce_mac_WebBrowserComponent.mm"; sourceTree = "SOURCE_ROOT"; };
D41728E9EB1522CCAC9AC7D4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CameraDevice.h"; path = "../../../../modules/juce_video/capture/juce_CameraDevice.h"; sourceTree = "SOURCE_ROOT"; };
D4CC4DE44C44AEE40085ACD7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_OpenGLComponent.cpp"; path = "../../../../modules/juce_opengl/native/juce_linux_OpenGLComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
D4DA13E7A12FB69C072D0FA7 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ShapeButton.cpp"; path = "../../../../modules/juce_gui_basics/buttons/juce_ShapeButton.cpp"; sourceTree = "SOURCE_ROOT"; };
D52F4E0C637B4685217CBEB4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Decibels.h"; path = "../../../../modules/juce_audio_basics/effects/juce_Decibels.h"; sourceTree = "SOURCE_ROOT"; };
D5C074653417ED69A2B570AC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_audio_processors.mm"; path = "../../../../modules/juce_audio_processors/juce_audio_processors.mm"; sourceTree = "SOURCE_ROOT"; };
D79E29A54AE62E03A533F436 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StretchableLayoutResizerBar.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutResizerBar.cpp"; sourceTree = "SOURCE_ROOT"; };
D8B7DCDFD32613B13AC54008 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_LookAndFeel.cpp"; path = "../../../../modules/juce_gui_basics/lookandfeel/juce_LookAndFeel.cpp"; sourceTree = "SOURCE_ROOT"; };
D92D579F2458F2426E5F828A = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedWriteLock.h"; path = "../../../../modules/juce_core/threads/juce_ScopedWriteLock.h"; sourceTree = "SOURCE_ROOT"; };
D950776EDF9260DB0278C132 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SliderPropertyComponent.cpp"; path = "../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
D9857957A36A3081186D53FC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_CameraDevice.cpp"; path = "../../../../modules/juce_video/native/juce_android_CameraDevice.cpp"; sourceTree = "SOURCE_ROOT"; };
DA9E577DC37123CEA41C4A71 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_WaitableEvent.h"; path = "../../../../modules/juce_core/threads/juce_WaitableEvent.h"; sourceTree = "SOURCE_ROOT"; };
DAF7C72A4348C33364BB654C = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CallbackMessage.h"; path = "../../../../modules/juce_events/messages/juce_CallbackMessage.h"; sourceTree = "SOURCE_ROOT"; };
DB246262CA669F13ABDDB33E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InterprocessConnectionServer.cpp"; path = "../../../../modules/juce_events/interprocess/juce_InterprocessConnectionServer.cpp"; sourceTree = "SOURCE_ROOT"; };
DBD90FC88456B62308AD9AD0 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_events.mm"; path = "../../../../modules/juce_events/juce_events.mm"; sourceTree = "SOURCE_ROOT"; };
DCACD63912A2F68687ED06CF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MemoryInputStream.h"; path = "../../../../modules/juce_core/streams/juce_MemoryInputStream.h"; sourceTree = "SOURCE_ROOT"; };
DD53156BA824889FD7DF52D2 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ThreadPool.cpp"; path = "../../../../modules/juce_core/threads/juce_ThreadPool.cpp"; sourceTree = "SOURCE_ROOT"; };
DD68D7D44BC0B2CA5DCE8532 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ChangeBroadcaster.h"; path = "../../../../modules/juce_events/broadcasters/juce_ChangeBroadcaster.h"; sourceTree = "SOURCE_ROOT"; };
@@ -769,6 +768,7 @@
DE0712F13AD6AB6180E2E680 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileSearchPathListComponent.cpp"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FileSearchPathListComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
DE1FE14BE1B14A214C2D8B66 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_WildcardFileFilter.cpp"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_WildcardFileFilter.cpp"; sourceTree = "SOURCE_ROOT"; };
DE435BB18276B8626AF37D05 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ScopedValueSetter.h"; path = "../../../../modules/juce_core/containers/juce_ScopedValueSetter.h"; sourceTree = "SOURCE_ROOT"; };
DE8035865F6033F8BBF41740 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_HyperlinkButton.cpp"; path = "../../../../modules/juce_gui_basics/buttons/juce_HyperlinkButton.cpp"; sourceTree = "SOURCE_ROOT"; };
DEEFCE87BE3B9D7AFC7ADC16 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_ApplicationCommandInfo.cpp"; path = "../../../../modules/juce_gui_basics/commands/juce_ApplicationCommandInfo.cpp"; sourceTree = "SOURCE_ROOT"; };
DF309886A3D26FC34280B329 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; name = "juce_mac_CameraDevice.mm"; path = "../../../../modules/juce_video/native/juce_mac_CameraDevice.mm"; sourceTree = "SOURCE_ROOT"; };
DF614EDBEA2D76889E002465 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_linux_SystemTrayIcon.cpp"; path = "../../../../modules/juce_gui_extra/native/juce_linux_SystemTrayIcon.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -854,6 +854,7 @@
F86E07B5B542F6F4B7F77A4F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_AudioProcessorPlayer.h"; path = "../../../../modules/juce_audio_utils/players/juce_AudioProcessorPlayer.h"; sourceTree = "SOURCE_ROOT"; };
F86F912E470660B0C7047823 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_android_Threads.cpp"; path = "../../../../modules/juce_core/native/juce_android_Threads.cpp"; sourceTree = "SOURCE_ROOT"; };
F8700C66EB5AE3292B585E19 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_String.cpp"; path = "../../../../modules/juce_core/text/juce_String.cpp"; sourceTree = "SOURCE_ROOT"; };
F8D23A339EA851D0838B8D4D = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CachedComponentImage.h"; path = "../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h"; sourceTree = "SOURCE_ROOT"; };
F95046FD2C915F846BD111EF = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ColourSelector.h"; path = "../../../../modules/juce_gui_extra/misc/juce_ColourSelector.h"; sourceTree = "SOURCE_ROOT"; };
F98172E9B1C7D23875AC5D81 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Button.h"; path = "../../../../modules/juce_gui_basics/buttons/juce_Button.h"; sourceTree = "SOURCE_ROOT"; };
FA6653EBE05E085359941C7F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MultiDocumentPanel.h"; path = "../../../../modules/juce_gui_basics/layout/juce_MultiDocumentPanel.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1472,6 +1473,7 @@
45200F793669CADC5D279093,
2483323E997B7A3171E39DE0 ); name = "juce_graphics"; sourceTree = "<group>"; };
46B3BECE46528A3B74650149 = { isa = PBXGroup; children = (
F8D23A339EA851D0838B8D4D,
536EA9AE6C2F76FE0AEB5958,
3D6993BA129CF5B3D55E3800,
89CF202FAEC4E5F57AF226C0,


+ 1
- 0
extras/audio plugin host/Builds/VisualStudio2005/Plugin Host.vcproj View File

@@ -2620,6 +2620,7 @@
</Filter>
<Filter Name="juce_gui_basics">
<Filter Name="components">
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp">
<FileConfiguration Name="Debug|Win32"
ExcludedFromBuild="true">


+ 1
- 0
extras/audio plugin host/Builds/VisualStudio2008/Plugin Host.vcproj View File

@@ -2620,6 +2620,7 @@
</Filter>
<Filter Name="juce_gui_basics">
<Filter Name="components">
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp">
<FileConfiguration Name="Debug|Win32"
ExcludedFromBuild="true">


+ 2
- 0
extras/example projects/Builds/MacOSX/HelloWorld.xcodeproj/project.pbxproj View File

@@ -158,6 +158,7 @@
35BD72D236BE7ADC019B5564 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Uuid.cpp"; path = "../../../../modules/juce_core/misc/juce_Uuid.cpp"; sourceTree = "SOURCE_ROOT"; };
35CCF611A1FFF0A68FA75161 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PNGLoader.cpp"; path = "../../../../modules/juce_graphics/image_formats/juce_PNGLoader.cpp"; sourceTree = "SOURCE_ROOT"; };
3705B72C4B467A1EABEC9C49 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_FileChooser.cpp"; path = "../../../../modules/juce_gui_basics/native/juce_win32_FileChooser.cpp"; sourceTree = "SOURCE_ROOT"; };
37380DEDD5BEE5E9267FA12F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CachedComponentImage.h"; path = "../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h"; sourceTree = "SOURCE_ROOT"; };
373E70565BE10D615B096C28 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DropShadowEffect.cpp"; path = "../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp"; sourceTree = "SOURCE_ROOT"; };
3824684DA7C61AA29E386158 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InterprocessConnection.cpp"; path = "../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp"; sourceTree = "SOURCE_ROOT"; };
3832110FA8DA58E650AB6F9E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Logger.cpp"; path = "../../../../modules/juce_core/logging/juce_Logger.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -1012,6 +1013,7 @@
7402FA767F4FD9CCD3DD1578,
C794DBEF09A83E199223D205 ); name = "juce_graphics"; sourceTree = "<group>"; };
51F1DE322ACA481FA5B3E623 = { isa = PBXGroup; children = (
37380DEDD5BEE5E9267FA12F,
9132D1324A6D6D049C9B2FFE,
02BD81436ED17F1341E19522,
01D5DC75EA54630B8805AD59,


+ 1
- 0
extras/example projects/Builds/VisualStudio2005/HelloWorld.vcproj View File

@@ -1669,6 +1669,7 @@
</Filter>
<Filter Name="juce_gui_basics">
<Filter Name="components">
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp">
<FileConfiguration Name="Debug|Win32"
ExcludedFromBuild="true">


+ 1
- 0
extras/example projects/Builds/VisualStudio2008/HelloWorld.vcproj View File

@@ -1669,6 +1669,7 @@
</Filter>
<Filter Name="juce_gui_basics">
<Filter Name="components">
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp">
<FileConfiguration Name="Debug|Win32"
ExcludedFromBuild="true">


+ 2
- 0
extras/example projects/Builds/iOS/HelloWorld.xcodeproj/project.pbxproj View File

@@ -157,6 +157,7 @@
35BD72D236BE7ADC019B5564 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Uuid.cpp"; path = "../../../../modules/juce_core/misc/juce_Uuid.cpp"; sourceTree = "SOURCE_ROOT"; };
35CCF611A1FFF0A68FA75161 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_PNGLoader.cpp"; path = "../../../../modules/juce_graphics/image_formats/juce_PNGLoader.cpp"; sourceTree = "SOURCE_ROOT"; };
3705B72C4B467A1EABEC9C49 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_win32_FileChooser.cpp"; path = "../../../../modules/juce_gui_basics/native/juce_win32_FileChooser.cpp"; sourceTree = "SOURCE_ROOT"; };
37380DEDD5BEE5E9267FA12F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CachedComponentImage.h"; path = "../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h"; sourceTree = "SOURCE_ROOT"; };
373E70565BE10D615B096C28 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_DropShadowEffect.cpp"; path = "../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp"; sourceTree = "SOURCE_ROOT"; };
3824684DA7C61AA29E386158 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_InterprocessConnection.cpp"; path = "../../../../modules/juce_events/interprocess/juce_InterprocessConnection.cpp"; sourceTree = "SOURCE_ROOT"; };
3832110FA8DA58E650AB6F9E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_Logger.cpp"; path = "../../../../modules/juce_core/logging/juce_Logger.cpp"; sourceTree = "SOURCE_ROOT"; };
@@ -1012,6 +1013,7 @@
7402FA767F4FD9CCD3DD1578,
C794DBEF09A83E199223D205 ); name = "juce_graphics"; sourceTree = "<group>"; };
51F1DE322ACA481FA5B3E623 = { isa = PBXGroup; children = (
37380DEDD5BEE5E9267FA12F,
9132D1324A6D6D049C9B2FFE,
02BD81436ED17F1341E19522,
01D5DC75EA54630B8805AD59,


+ 2
- 0
extras/static library/Builds/MacOSX/juce.xcodeproj/project.pbxproj View File

@@ -23,6 +23,7 @@
00CF31E5308FA881A2BA8B08 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_SystemTrayIconComponent.cpp"; path = "../../../../modules/juce_gui_extra/misc/juce_SystemTrayIconComponent.cpp"; sourceTree = "SOURCE_ROOT"; };
013DC5FB9C18CB09AAF95E1E = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_TemporaryFile.cpp"; path = "../../../../modules/juce_core/files/juce_TemporaryFile.cpp"; sourceTree = "SOURCE_ROOT"; };
015B185333C7E2F470FC8325 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_SliderPropertyComponent.h"; path = "../../../../modules/juce_gui_basics/properties/juce_SliderPropertyComponent.h"; sourceTree = "SOURCE_ROOT"; };
018519396BA8CBC647868276 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CachedComponentImage.h"; path = "../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h"; sourceTree = "SOURCE_ROOT"; };
0262A5CBDB40A5DFB3D90F1D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_StretchableLayoutManager.cpp"; path = "../../../../modules/juce_gui_basics/layout/juce_StretchableLayoutManager.cpp"; sourceTree = "SOURCE_ROOT"; };
032F9FED5A2B45277FBC5288 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_FileFilter.h"; path = "../../../../modules/juce_gui_basics/filebrowser/juce_FileFilter.h"; sourceTree = "SOURCE_ROOT"; };
0336581C6D8A82ED77962437 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_Colour.h"; path = "../../../../modules/juce_graphics/colour/juce_Colour.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1391,6 +1392,7 @@
F68ED837371C2CA43A42793F,
3C5821771E2E831483EBE312 ); name = "juce_graphics"; sourceTree = "<group>"; };
EDA276A5ED4DDEA021B74225 = { isa = PBXGroup; children = (
018519396BA8CBC647868276,
196B21E0D34FF36EE398FE07,
F8CB2C407443DD4FE38CA7BE,
F7D11568291BA9EA434B7CFB,


+ 1
- 0
extras/static library/Builds/VisualStudio2008/juce.vcproj View File

@@ -2511,6 +2511,7 @@
</Filter>
<Filter Name="juce_gui_basics">
<Filter Name="components">
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp">
<FileConfiguration Name="Debug|Win32"
ExcludedFromBuild="true">


+ 1
- 0
extras/static library/Builds/VisualStudio2010/juce.vcxproj View File

@@ -1400,6 +1400,7 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"/>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>


+ 3
- 0
extras/static library/Builds/VisualStudio2010/juce.vcxproj.filters View File

@@ -2202,6 +2202,9 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h">
<Filter>Juce Modules\juce_graphics</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h">
<Filter>Juce Modules\juce_gui_basics\components</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h">
<Filter>Juce Modules\juce_gui_basics\components</Filter>
</ClInclude>


+ 2
- 0
extras/the jucer/Builds/MacOSX/Jucer.xcodeproj/project.pbxproj View File

@@ -739,6 +739,7 @@
F4E02B94DE69B0D5FAAE29BC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_TabbedComponent.h"; path = "../../../../modules/juce_gui_basics/layout/juce_TabbedComponent.h"; sourceTree = "SOURCE_ROOT"; };
F65E29974BC6055F80DA44C4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_CallOutBox.cpp"; path = "../../../../modules/juce_gui_basics/windows/juce_CallOutBox.cpp"; sourceTree = "SOURCE_ROOT"; };
F66E3475BA4C36658C3EDA15 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_MenuBarComponent.h"; path = "../../../../modules/juce_gui_basics/menus/juce_MenuBarComponent.h"; sourceTree = "SOURCE_ROOT"; };
F672BEFBC87CBC0692E299FC = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_CachedComponentImage.h"; path = "../../../../modules/juce_gui_basics/components/juce_CachedComponentImage.h"; sourceTree = "SOURCE_ROOT"; };
F6B1C427AA9129CDD9E4761B = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_LowLevelGraphicsSoftwareRenderer.h"; path = "../../../../modules/juce_graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.h"; sourceTree = "SOURCE_ROOT"; };
F6F724542F5201858B8145DC = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = "juce_FileBasedDocument.cpp"; path = "../../../../modules/juce_gui_extra/documents/juce_FileBasedDocument.cpp"; sourceTree = "SOURCE_ROOT"; };
F758385A897FAE5BE521CD98 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "juce_ValueTree.h"; path = "../../../../modules/juce_data_structures/values/juce_ValueTree.h"; sourceTree = "SOURCE_ROOT"; };
@@ -1272,6 +1273,7 @@
BA20E35BA5FF1801D0B86BC9,
E9DC95A85AB25565E8FACF91 ); name = "juce_graphics"; sourceTree = "<group>"; };
F873E58ECE3D8868365BBECC = { isa = PBXGroup; children = (
F672BEFBC87CBC0692E299FC,
55670E58151A717FBD6D1C65,
846146B17629B8601BAFD3BC,
A8ED2088E4636DD9BC944833,


+ 1
- 0
extras/the jucer/Builds/VisualStudio2008/Jucer.vcproj View File

@@ -1836,6 +1836,7 @@
</Filter>
<Filter Name="juce_gui_basics">
<Filter Name="components">
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>
<File RelativePath="..\..\..\..\modules\juce_gui_basics\components\juce_Component.cpp">
<FileConfiguration Name="Debug|Win32"
ExcludedFromBuild="true">


+ 1
- 0
extras/the jucer/Builds/VisualStudio2010/Jucer.vcxproj View File

@@ -1175,6 +1175,7 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_mac_CoreGraphicsHelpers.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\native\juce_RenderingHelpers.h"/>
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h"/>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h"/>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h"/>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_ComponentListener.h"/>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Desktop.h"/>


+ 3
- 0
extras/the jucer/Builds/VisualStudio2010/Jucer.vcxproj.filters View File

@@ -1926,6 +1926,9 @@
<ClInclude Include="..\..\..\..\modules\juce_graphics\juce_graphics.h">
<Filter>Juce Modules\juce_graphics</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_CachedComponentImage.h">
<Filter>Juce Modules\juce_gui_basics\components</Filter>
</ClInclude>
<ClInclude Include="..\..\..\..\modules\juce_gui_basics\components\juce_Component.h">
<Filter>Juce Modules\juce_gui_basics\components</Filter>
</ClInclude>


+ 67
- 0
modules/juce_gui_basics/components/juce_CachedComponentImage.h View File

@@ -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__

+ 150
- 98
modules/juce_gui_basics/components/juce_Component.cpp View File

@@ -35,7 +35,7 @@ Component* Component::currentlyFocusedComponent = nullptr;
class Component::MouseListenerList
{
public:
MouseListenerList()
MouseListenerList() noexcept
: numDeepMouseListeners (0)
{
}
@@ -377,6 +377,73 @@ public:
}
};
//==============================================================================
class StandardCachedComponentImage : public CachedComponentImage
{
public:
StandardCachedComponentImage (Component& owner_) noexcept : owner (owner_) {}
void paint (Graphics& g)
{
const Rectangle<int> bounds (owner.getLocalBounds());
if (image.isNull() || image.getBounds() != bounds)
{
image = Image (owner.isOpaque() ? Image::RGB : Image::ARGB,
jmax (1, bounds.getWidth()), jmax (1, bounds.getHeight()), ! owner.isOpaque());
validArea.clear();
}
{
Graphics imG (image);
LowLevelGraphicsContext* const lg = imG.getInternalContext();
for (RectangleList::Iterator i (validArea); i.next();)
lg->excludeClipRectangle (*i.getRectangle());
if (! lg->isClipEmpty())
{
if (! owner.isOpaque())
{
lg->setFill (Colours::transparentBlack);
lg->fillRect (bounds, true);
lg->setFill (Colours::black);
}
owner.paintEntireComponent (imG, true);
}
}
validArea = bounds;
g.setColour (Colours::black.withAlpha (owner.getAlpha()));
g.drawImageAt (image, 0, 0);
}
void invalidateAll()
{
validArea.clear();
}
void invalidate (const Rectangle<int>& area)
{
validArea.subtract (area);
}
void releaseResources()
{
image = Image::null;
}
private:
Image image;
RectangleList validArea;
Component& owner;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (StandardCachedComponentImage);
};
//==============================================================================
Component::Component()
@@ -461,16 +528,21 @@ void Component::setVisible (bool shouldBeVisible)
// thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.
CHECK_MESSAGE_MANAGER_IS_LOCKED
WeakReference<Component> safePointer (this);
const WeakReference<Component> safePointer (this);
flags.visibleFlag = shouldBeVisible;
internalRepaint (0, 0, getWidth(), getHeight());
if (shouldBeVisible)
repaint();
else
repaintParent();
sendFakeMouseMove();
if (! shouldBeVisible)
{
if (cachedImage != nullptr)
cachedImage->releaseResources();
if (currentlyFocusedComponent == this || isParentOf (currentlyFocusedComponent))
{
if (parentComponent != nullptr)
@@ -567,7 +639,7 @@ void Component::addToDesktop (int styleWanted, void* nativeWindowToAttachTo)
if (styleWanted != currentStyleFlags || ! flags.hasHeavyweightPeerFlag)
{
WeakReference<Component> safePointer (this);
const WeakReference<Component> safePointer (this);
#if JUCE_LINUX
// it's wise to give the component a non-zero size before
@@ -701,12 +773,27 @@ bool Component::isOpaque() const noexcept
}
//==============================================================================
void Component::setCachedComponentImage (CachedComponentImage* newCachedImage)
{
cachedImage = newCachedImage;
}
void Component::setBufferedToImage (const bool shouldBeBuffered)
{
if (shouldBeBuffered != flags.bufferToImageFlag)
// This assertion means that this component is already using a custom CachedComponentImage,
// so by calling setBufferedToImage, you'll be deleting the custom one - this is almost certainly
// not what you wanted to happen... If you really do know what you're doing here, and want to
// avoid this assertion, just call setCachedComponentImage (nullptr) before setBufferedToImage().
jassert (cachedImage == nullptr || dynamic_cast <StandardCachedComponentImage*> (cachedImage.get()) != nullptr);
if (shouldBeBuffered)
{
bufferedImage = Image::null;
flags.bufferToImageFlag = shouldBeBuffered;
if (cachedImage == nullptr)
cachedImage = new StandardCachedComponentImage (*this);
}
else
{
cachedImage = nullptr;
}
}
@@ -935,17 +1022,17 @@ Rectangle<int> Component::localAreaToGlobal (const Rectangle<int>& area) const
}
/* Deprecated methods... */
const Point<int> Component::relativePositionToGlobal (const Point<int>& relativePosition) const
Point<int> Component::relativePositionToGlobal (const Point<int>& relativePosition) const
{
return localPointToGlobal (relativePosition);
}
const Point<int> Component::globalPositionToRelative (const Point<int>& screenPosition) const
Point<int> Component::globalPositionToRelative (const Point<int>& screenPosition) const
{
return getLocalPoint (nullptr, screenPosition);
}
const Point<int> Component::relativePositionToOtherComponent (const Component* const targetComponent, const Point<int>& positionRelativeToThis) const
Point<int> Component::relativePositionToOtherComponent (const Component* const targetComponent, const Point<int>& positionRelativeToThis) const
{
return targetComponent == nullptr ? localPointToGlobal (positionRelativeToThis)
: targetComponent->getLocalPoint (this, positionRelativeToThis);
@@ -991,9 +1078,9 @@ void Component::setBounds (const int x, const int y, int w, int h)
else if (! flags.hasHeavyweightPeerFlag)
repaintParent();
}
else
else if (cachedImage != nullptr)
{
bufferedImage = Image::null;
cachedImage->invalidateAll();
}
if (flags.hasHeavyweightPeerFlag)
@@ -1375,12 +1462,17 @@ Component* Component::removeChildComponent (const int index, bool sendParentEven
if (sendParentEvents)
{
sendFakeMouseMove();
child->repaintParent();
if (child->isVisible())
child->repaintParent();
}
childComponentList.remove (index);
child->parentComponent = nullptr;
if (child->cachedImage != nullptr)
child->cachedImage->releaseResources();
// (NB: there are obscure situations where child->isShowing() = false, but it still has the focus)
if (currentlyFocusedComponent == child || child->isParentOf (currentlyFocusedComponent))
{
@@ -1702,112 +1794,76 @@ float Component::getAlpha() const
return (255 - componentTransparency) / 255.0f;
}
void Component::repaintParent()
//==============================================================================
void Component::repaint()
{
if (flags.visibleFlag)
internalRepaint (0, 0, getWidth(), getHeight());
internalRepaintUnchecked (getLocalBounds(), true);
}
void Component::repaint()
void Component::repaint (const int x, const int y, const int w, const int h)
{
repaint (0, 0, getWidth(), getHeight());
internalRepaint (Rectangle<int> (x, y, w, h));
}
void Component::repaint (const int x, const int y,
const int w, const int h)
void Component::repaint (const Rectangle<int>& area)
{
bufferedImage = Image::null;
internalRepaint (area);
}
if (flags.visibleFlag)
internalRepaint (x, y, w, h);
void Component::repaintParent()
{
if (parentComponent != nullptr)
parentComponent->internalRepaint (ComponentHelpers::convertToParentSpace (*this, getLocalBounds()));
}
void Component::repaint (const Rectangle<int>& area)
void Component::internalRepaint (const Rectangle<int>& area)
{
repaint (area.getX(), area.getY(), area.getWidth(), area.getHeight());
const Rectangle<int> r (area.getIntersection (getLocalBounds()));
if (! r.isEmpty())
internalRepaintUnchecked (r, false);
}
void Component::internalRepaint (int x, int y, int w, int h)
void Component::internalRepaintUnchecked (const Rectangle<int>& area, const bool isEntireComponent)
{
// if component methods are being called from threads other than the message
// thread, you'll need to use a MessageManagerLock object to make sure it's thread-safe.
CHECK_MESSAGE_MANAGER_IS_LOCKED
if (x < 0)
{
w += x;
x = 0;
}
if (x + w > getWidth())
w = getWidth() - x;
if (w > 0)
if (flags.visibleFlag)
{
if (y < 0)
if (flags.hasHeavyweightPeerFlag)
{
h += y;
y = 0;
}
if (y + h > getHeight())
h = getHeight() - y;
ComponentPeer* const peer = getPeer();
if (h > 0)
if (peer != nullptr)
peer->repaint (area);
}
else
{
if (parentComponent != nullptr)
if (cachedImage != nullptr)
{
if (parentComponent->flags.visibleFlag)
{
if (affineTransform == nullptr)
{
parentComponent->internalRepaint (x + getX(), y + getY(), w, h);
}
else
{
const Rectangle<int> r (ComponentHelpers::convertToParentSpace (*this, Rectangle<int> (x, y, w, h)));
parentComponent->internalRepaint (r.getX(), r.getY(), r.getWidth(), r.getHeight());
}
}
if (isEntireComponent)
cachedImage->invalidateAll();
else
cachedImage->invalidate (area);
}
else if (flags.hasHeavyweightPeerFlag)
{
ComponentPeer* const peer = getPeer();
if (peer != nullptr)
peer->repaint (Rectangle<int> (x, y, w, h));
}
if (parentComponent != nullptr)
parentComponent->internalRepaint (ComponentHelpers::convertToParentSpace (*this, area));
}
}
}
//==============================================================================
void Component::paintComponent (Graphics& g)
{
if (flags.bufferToImageFlag)
{
if (bufferedImage.isNull())
{
bufferedImage = Image (flags.opaqueFlag ? Image::RGB : Image::ARGB,
getWidth(), getHeight(), ! flags.opaqueFlag);
Graphics imG (bufferedImage);
paint (imG);
}
g.setColour (Colours::black);
g.drawImageAt (bufferedImage, 0, 0);
}
else
{
paint (g);
}
}
void Component::paintWithinParentContext (Graphics& g)
{
g.setOrigin (getX(), getY());
paintEntireComponent (g, false);
if (cachedImage != nullptr)
cachedImage->paint (g);
else
paintEntireComponent (g, false);
}
void Component::paintComponentAndChildren (Graphics& g)
@@ -1816,7 +1872,7 @@ void Component::paintComponentAndChildren (Graphics& g)
if (flags.dontClipGraphicsFlag)
{
paintComponent (g);
paint (g);
}
else
{
@@ -1824,7 +1880,7 @@ void Component::paintComponentAndChildren (Graphics& g)
ComponentHelpers::clipObscuredRegions (*this, g, clipBounds, Point<int>());
if (! g.isClipEmpty())
paintComponent (g);
paint (g);
g.restoreState();
}
@@ -1884,8 +1940,6 @@ void Component::paintComponentAndChildren (Graphics& g)
void Component::paintEntireComponent (Graphics& g, const bool ignoreAlphaLevel)
{
jassert (! g.isClipEmpty());
#if JUCE_DEBUG
flags.isInsidePaintCall = true;
#endif
@@ -1990,7 +2044,7 @@ void Component::sendLookAndFeelChange()
{
repaint();
WeakReference<Component> safePointer (this);
const WeakReference<Component> safePointer (this);
lookAndFeelChanged();
@@ -2592,7 +2646,7 @@ void Component::focusLost (FocusChangeType)
void Component::internalFocusLoss (const FocusChangeType cause)
{
WeakReference<Component> safePointer (this);
const WeakReference<Component> safePointer (this);
focusLost (focusChangedDirectly);
@@ -2645,7 +2699,7 @@ void Component::setEnabled (const bool shouldBeEnabled)
void Component::sendEnablementChangeMessage()
{
WeakReference<Component> safePointer (this);
const WeakReference<Component> safePointer (this);
enablementChanged();
@@ -2731,14 +2785,12 @@ void Component::takeKeyboardFocus (const FocusChangeType cause)
if (peer != nullptr)
{
WeakReference<Component> safePointer (this);
const WeakReference<Component> safePointer (this);
peer->grabFocus();
if (peer->isFocused() && currentlyFocusedComponent != this)
{
WeakReference<Component> componentLosingFocus (currentlyFocusedComponent);
currentlyFocusedComponent = this;
Desktop::getInstance().triggerFocusCallback();
@@ -2827,7 +2879,7 @@ void Component::moveKeyboardFocusToSibling (const bool moveToNext)
{
if (nextComp->isCurrentlyBlockedByAnotherModalComponent())
{
WeakReference<Component> nextCompPointer (nextComp);
const WeakReference<Component> nextCompPointer (nextComp);
internalModalInputAttempt();
if (nextCompPointer == nullptr || nextComp->isCurrentlyBlockedByAnotherModalComponent())


+ 23
- 9
modules/juce_gui_basics/components/juce_Component.h View File

@@ -40,6 +40,8 @@ class MouseInputSourceInternal;
class ComponentPeer;
class MarkerList;
class RelativeRectangle;
class CachedComponentImage;
//==============================================================================
/**
@@ -958,8 +960,9 @@ public:
There's no guarantee about how soon after calling repaint() the redraw will actually
happen, and other queued events may be delivered before a redraw is done.
If the setBufferedToImage() method has been used to cause this component
to use a buffer, the repaint() call will invalidate the component's buffer.
If the setBufferedToImage() method has been used to cause this component to use a
buffer, the repaint() call will invalidate the cached buffer. If setCachedComponentImage()
has been used to provide a custom image cache, that cache will be invalidated appropriately.
To redraw just a subsection of the component rather than the whole thing,
use the repaint (int, int, int, int) method.
@@ -2227,12 +2230,24 @@ public:
*/
void setPositioner (Positioner* newPositioner);
/** Gives the component a CachedComponentImage that should be used to buffer its painting.
The object that is passed-in will be owned by this component, and will be deleted automatically
later on.
@see setBufferedToImage
*/
void setCachedComponentImage (CachedComponentImage* newCachedImage);
/** Returns the object that was set by setCachedComponentImage().
@see setCachedComponentImage
*/
CachedComponentImage* getCachedComponentImage() const noexcept { return cachedImage; }
//==============================================================================
#ifndef DOXYGEN
// These methods are deprecated - use localPointToGlobal, getLocalPoint, getLocalPoint, etc instead.
JUCE_DEPRECATED (const Point<int> relativePositionToGlobal (const Point<int>&) const);
JUCE_DEPRECATED (const Point<int> globalPositionToRelative (const Point<int>&) const);
JUCE_DEPRECATED (const Point<int> relativePositionToOtherComponent (const Component*, const Point<int>&) const);
JUCE_DEPRECATED (Point<int> relativePositionToGlobal (const Point<int>&) const);
JUCE_DEPRECATED (Point<int> globalPositionToRelative (const Point<int>&) const);
JUCE_DEPRECATED (Point<int> relativePositionToOtherComponent (const Component*, const Point<int>&) const);
#endif
private:
@@ -2254,7 +2269,7 @@ private:
LookAndFeel* lookAndFeel;
MouseCursor cursor;
ImageEffectFilter* effect;
Image bufferedImage;
ScopedPointer <CachedComponentImage> cachedImage;
class MouseListenerList;
friend class MouseListenerList;
@@ -2315,10 +2330,11 @@ private:
void internalModifierKeysChanged();
void internalChildrenChanged();
void internalHierarchyChanged();
void internalRepaint (const Rectangle<int>&);
void internalRepaintUnchecked (const Rectangle<int>&, bool);
Component* removeChildComponent (int index, bool sendParentEvents, bool sendChildEvents);
void moveChildInternal (int sourceIndex, int destIndex);
void paintComponentAndChildren (Graphics&);
void paintComponent (Graphics&);
void paintWithinParentContext (Graphics&);
void sendMovedResizedMessages (bool wasMoved, bool wasResized);
void repaintParent();
@@ -2353,8 +2369,6 @@ private:
protected:
//==============================================================================
/** @internal */
virtual void internalRepaint (int x, int y, int w, int h);
/** @internal */
virtual ComponentPeer* createNewPeer (int styleFlags, void* nativeWindowToAttachTo);
#endif
};


+ 3
- 0
modules/juce_gui_basics/juce_gui_basics.h View File

@@ -75,6 +75,9 @@ BEGIN_JUCE_NAMESPACE
// START_AUTOINCLUDE components, mouse, keyboard, buttons, drawables,
// filebrowser, layout, lookandfeel, menus, positioning, properties,
// widgets, windows, commands, application, misc
#ifndef __JUCE_CACHEDCOMPONENTIMAGE_JUCEHEADER__
#include "components/juce_CachedComponentImage.h"
#endif
#ifndef __JUCE_COMPONENT_JUCEHEADER__
#include "components/juce_Component.h"
#endif


+ 0
- 5
modules/juce_opengl/native/juce_android_OpenGLComponent.cpp View File

@@ -34,11 +34,6 @@ void* OpenGLComponent::getNativeWindowHandle() const
return nullptr;
}
void OpenGLComponent::internalRepaint (int x, int y, int w, int h)
{
Component::internalRepaint (x, y, w, h);
}
void OpenGLComponent::updateEmbeddedPosition (const Rectangle<int>&)
{
}


+ 6
- 9
modules/juce_opengl/native/juce_ios_OpenGLComponent.mm View File

@@ -153,7 +153,8 @@ public:
glGenRenderbuffersOES (1, &depthBufferHandle);
glBindRenderbufferOES (GL_RENDERBUFFER_OES, colorBufferHandle);
[context renderbufferStorage: GL_RENDERBUFFER_OES fromDrawable: glLayer];
bool ok = [context renderbufferStorage: GL_RENDERBUFFER_OES fromDrawable: glLayer];
jassert (ok);
GLint width, height;
glGetRenderbufferParameterivOES (GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &width);
@@ -178,6 +179,8 @@ public:
void freeGLBuffers()
{
[context renderbufferStorage: GL_RENDERBUFFER_OES fromDrawable: nil];
if (frameBufferHandle != 0)
{
glDeleteFramebuffersOES (1, &frameBufferHandle);
@@ -197,7 +200,6 @@ public:
}
}
//==============================================================================
private:
WeakReference<Component> component;
JuceGLView* view;
@@ -208,7 +210,6 @@ private:
int numFrames;
int lastWidth, lastHeight;
//==============================================================================
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (GLESContext);
};
@@ -221,16 +222,12 @@ OpenGLContext* OpenGLComponent::createContext()
if (peer != nullptr)
return new GLESContext ((UIView*) peer->getNativeHandle(), this, preferredPixelFormat,
dynamic_cast <const GLESContext*> (contextToShareListsWith),
type == openGLES2 ? kEAGLRenderingAPIOpenGLES2 : kEAGLRenderingAPIOpenGLES1);
(flags & openGLES2) == 0 ? kEAGLRenderingAPIOpenGLES1
: kEAGLRenderingAPIOpenGLES2);
return nullptr;
}
void OpenGLComponent::internalRepaint (int x, int y, int w, int h)
{
Component::internalRepaint (x, y, w, h);
}
void OpenGLComponent::updateEmbeddedPosition (const Rectangle<int>& bounds)
{
if (context != nullptr)


+ 0
- 5
modules/juce_opengl/native/juce_linux_OpenGLComponent.cpp View File

@@ -190,11 +190,6 @@ OpenGLContext* OpenGLComponent::createContext()
return (c->renderContext != 0) ? c.release() : nullptr;
}
void OpenGLComponent::internalRepaint (int x, int y, int w, int h)
{
Component::internalRepaint (x, y, w, h);
}
void OpenGLComponent::updateEmbeddedPosition (const Rectangle<int>& bounds)
{
if (context != nullptr)


+ 0
- 16
modules/juce_opengl/native/juce_mac_OpenGLComponent.mm View File

@@ -245,22 +245,6 @@ void* OpenGLComponent::getNativeWindowHandle() const
: nullptr;
}
void OpenGLComponent::internalRepaint (int x, int y, int w, int h)
{
Component::internalRepaint (x, y, w, h);
if (context != nullptr)
{
NSView* const v = static_cast<WindowedGLContext*> (context.get())->view;
// bit of a bodge here.. if we only invalidate the area of the gl component,
// it's completely covered by the NSOpenGLView, so the OS throws away the
// repaint message, thus never causing our paint() callback, and never repainting
// the comp. So invalidating just a little bit around the edge helps..
[[v superview] setNeedsDisplayInRect: NSInsetRect ([v frame], -2.0f, -2.0f)];
}
}
void OpenGLComponent::updateEmbeddedPosition (const Rectangle<int>&)
{
}


+ 0
- 11
modules/juce_opengl/native/juce_win32_OpenGLComponent.cpp View File

@@ -324,17 +324,6 @@ void* OpenGLComponent::getNativeWindowHandle() const
return context != nullptr ? static_cast<WindowedGLContext*> (context.get())->getNativeWindowHandle() : nullptr;
}
void OpenGLComponent::internalRepaint (int x, int y, int w, int h)
{
Component::internalRepaint (x, y, w, h);
if (context != nullptr)
{
ComponentPeer* peer = static_cast<WindowedGLContext*> (context.get())->nativeWindow;
peer->repaint (peer->getBounds().withPosition (Point<int>()));
}
}
void OpenGLComponent::updateEmbeddedPosition (const Rectangle<int>& bounds)
{
if (context != nullptr)


+ 191
- 50
modules/juce_opengl/opengl/juce_OpenGLComponent.cpp View File

@@ -30,7 +30,7 @@ BEGIN_JUCE_NAMESPACE
OpenGLPixelFormat::OpenGLPixelFormat (const int bitsPerRGBComponent,
const int alphaBits_,
const int depthBufferBits_,
const int stencilBufferBits_)
const int stencilBufferBits_) noexcept
: redBits (bitsPerRGBComponent),
greenBits (bitsPerRGBComponent),
blueBits (bitsPerRGBComponent),
@@ -45,7 +45,7 @@ OpenGLPixelFormat::OpenGLPixelFormat (const int bitsPerRGBComponent,
{
}
OpenGLPixelFormat::OpenGLPixelFormat (const OpenGLPixelFormat& other)
OpenGLPixelFormat::OpenGLPixelFormat (const OpenGLPixelFormat& other) noexcept
: redBits (other.redBits),
greenBits (other.greenBits),
blueBits (other.blueBits),
@@ -60,7 +60,7 @@ OpenGLPixelFormat::OpenGLPixelFormat (const OpenGLPixelFormat& other)
{
}
OpenGLPixelFormat& OpenGLPixelFormat::operator= (const OpenGLPixelFormat& other)
OpenGLPixelFormat& OpenGLPixelFormat::operator= (const OpenGLPixelFormat& other) noexcept
{
redBits = other.redBits;
greenBits = other.greenBits;
@@ -76,7 +76,7 @@ OpenGLPixelFormat& OpenGLPixelFormat::operator= (const OpenGLPixelFormat& other)
return *this;
}
bool OpenGLPixelFormat::operator== (const OpenGLPixelFormat& other) const
bool OpenGLPixelFormat::operator== (const OpenGLPixelFormat& other) const noexcept
{
return redBits == other.redBits
&& greenBits == other.greenBits
@@ -121,30 +121,30 @@ OpenGLContext* OpenGLContext::getCurrentContext()
class OpenGLComponent::OpenGLComponentWatcher : public ComponentMovementWatcher
{
public:
OpenGLComponentWatcher (OpenGLComponent* const owner_)
: ComponentMovementWatcher (owner_),
OpenGLComponentWatcher (OpenGLComponent& owner_)
: ComponentMovementWatcher (&owner_),
owner (owner_)
{
}
void componentMovedOrResized (bool /*wasMoved*/, bool /*wasResized*/)
{
owner->updateContextPosition();
owner.updateContextPosition();
}
void componentPeerChanged()
{
owner->recreateContextAsync();
owner.recreateContextAsync();
}
void componentVisibilityChanged()
{
if (! owner->isShowing())
owner->stopBackgroundThread();
if (! owner.isShowing())
owner.stopBackgroundThread();
}
private:
OpenGLComponent* const owner;
OpenGLComponent& owner;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenGLComponentWatcher);
};
@@ -217,16 +217,175 @@ void OpenGLComponent::stopRenderThread()
}
//==============================================================================
OpenGLComponent::OpenGLComponent (const OpenGLType type_, const bool useBackgroundThread)
: type (type_),
class OpenGLComponent::OpenGLCachedComponentImage : public CachedComponentImage,
public Timer // N.B. using a Timer rather than an AsyncUpdater
// to avoid scheduling problems on Windows
{
public:
OpenGLCachedComponentImage (OpenGLComponent& owner_)
: owner (owner_)
{
}
void paint (Graphics&)
{
ComponentPeer* const peer = owner.getPeer();
if (peer != nullptr)
{
const Point<int> topLeft (owner.getScreenPosition() - peer->getScreenPosition());
peer->addMaskedRegion (topLeft.x, topLeft.y, owner.getWidth(), owner.getHeight());
}
if (owner.isUsingDedicatedThread())
{
if (peer != nullptr && owner.isShowing())
{
#if ! JUCE_LINUX
owner.updateContext();
#endif
if (! owner.threadStarted)
{
owner.threadStarted = true;
owner.startRenderThread();
}
}
}
else
{
owner.updateContext();
if (isTimerRunning())
timerCallback();
}
}
void invalidateAll()
{
validArea.clear();
triggerRepaint();
}
void invalidate (const Rectangle<int>& area)
{
validArea.subtract (area);
triggerRepaint();
}
void releaseResources()
{
frameBuffer.release();
}
void timerCallback()
{
stopTimer();
if (! owner.makeCurrentRenderingTarget())
return;
const Rectangle<int> bounds (owner.getLocalBounds());
const int fbW = frameBuffer.getWidth();
const int fbH = frameBuffer.getHeight();
if (fbW < bounds.getWidth()
|| fbH < bounds.getHeight()
|| fbW > bounds.getWidth() + 128
|| fbH > bounds.getHeight() + 128
|| ! frameBuffer.isValid())
{
frameBuffer.initialise (bounds.getWidth(), bounds.getHeight());
validArea.clear();
}
owner.renderOpenGL();
if ((owner.flags & allowSubComponents) != 0)
{
{
RectangleList invalid (bounds);
invalid.subtract (validArea);
validArea = bounds;
if (! invalid.isEmpty())
{
OpenGLRenderer g (frameBuffer);
g.clipToRectangleList (invalid);
g.setFill (Colours::transparentBlack);
g.fillRect (bounds, true);
g.setFill (Colours::black);
paintOwner (g);
}
}
owner.makeCurrentRenderingTarget();
OpenGLHelpers::prepareFor2D (bounds.getWidth(), bounds.getHeight());
glBlendFunc (GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
glEnable (GL_BLEND);
glColor4f (1.0f, 1.0f, 1.0f, owner.getAlpha());
frameBuffer.drawAt (0, (float) (bounds.getHeight() - frameBuffer.getHeight()));
}
owner.swapBuffers();
owner.releaseAsRenderingTarget();
}
void triggerRepaint()
{
if (! owner.isUsingDedicatedThread())
startTimer (1000 / 70);
}
private:
void paintOwner (OpenGLRenderer& glRenderer)
{
Graphics g (&glRenderer);
#if JUCE_ENABLE_REPAINT_DEBUGGING
g.saveState();
#endif
JUCE_TRY
{
owner.paintEntireComponent (g, false);
}
JUCE_CATCH_EXCEPTION
#if JUCE_ENABLE_REPAINT_DEBUGGING
// enabling this code will fill all areas that get repainted with a colour overlay, to show
// clearly when things are being repainted.
g.restoreState();
static Random rng;
g.fillAll (Colour ((uint8) rng.nextInt (255),
(uint8) rng.nextInt (255),
(uint8) rng.nextInt (255),
(uint8) 0x50));
#endif
}
OpenGLComponent& owner;
OpenGLFrameBuffer frameBuffer;
RectangleList validArea;
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenGLCachedComponentImage);
};
//==============================================================================
OpenGLComponent::OpenGLComponent (const int flags_)
: flags (flags_),
contextToShareListsWith (nullptr),
needToUpdateViewport (true),
needToDeleteContext (false),
threadStarted (false),
useThread (useBackgroundThread)
threadStarted (false)
{
setOpaque (true);
componentWatcher = new OpenGLComponentWatcher (this);
componentWatcher = new OpenGLComponentWatcher (*this);
setCachedComponentImage (new OpenGLCachedComponentImage (*this));
}
OpenGLComponent::~OpenGLComponent()
@@ -321,6 +480,7 @@ void OpenGLComponent::deleteContext()
}
context = nullptr;
setCachedComponentImage (nullptr);
}
needToDeleteContext = false;
@@ -351,40 +511,6 @@ void OpenGLComponent::stopBackgroundThread()
}
}
void OpenGLComponent::paint (Graphics&)
{
ComponentPeer* const peer = getPeer();
if (useThread)
{
if (peer != nullptr && isShowing())
{
#if ! JUCE_LINUX
updateContext();
#endif
if (! threadStarted)
{
threadStarted = true;
startRenderThread();
}
}
}
else
{
updateContext();
if (! renderAndSwapBuffers())
return;
}
if (peer != nullptr)
{
const Point<int> topLeft (getScreenPosition() - peer->getScreenPosition());
peer->addMaskedRegion (topLeft.x, topLeft.y, getWidth(), getHeight());
}
}
bool OpenGLComponent::renderAndSwapBuffers()
{
const ScopedLock sl (contextLock);
@@ -411,6 +537,21 @@ bool OpenGLComponent::renderAndSwapBuffers()
return true;
}
void OpenGLComponent::triggerRepaint()
{
OpenGLCachedComponentImage* const c
= dynamic_cast<OpenGLCachedComponentImage*> (getCachedComponentImage());
jassert (c != nullptr); // you mustn't set your own cached image object for an OpenGLComponent!
if (c != nullptr)
c->triggerRepaint();
}
void OpenGLComponent::paint (Graphics&)
{
}
unsigned int OpenGLComponent::getFrameBufferID() const
{
return context != nullptr ? context->getFrameBufferID() : 0;


+ 41
- 17
modules/juce_opengl/opengl/juce_OpenGLComponent.h View File

@@ -47,26 +47,42 @@ class JUCE_API OpenGLComponent : public OpenGLBaseType,
{
public:
//==============================================================================
/** Used to select the type of openGL API to use, if more than one choice is available
on a particular platform.
/** These flags can be combined and passed to the OpenGLComponent constructor to
specify various options.
*/
enum OpenGLType
enum OpenGLFlags
{
openGLDefault = 0,
/** This value can be used if you want your OpenGLComponent to use the
default settings.
*/
openGLDefault = 8,
#if JUCE_IOS
openGLES1, /**< On the iPhone, this selects openGL ES 1.0 */
openGLES2 /**< On the iPhone, this selects openGL ES 2.0 */
openGLES1 = 1, /**< On the iPhone, this selects openGL ES 1.0 */
openGLES2 = 2, /**< On the iPhone, this selects openGL ES 2.0 */
#endif
/** If this flag is enabled, the component will launch a background thread to
perform the rendering. If this flag is not enabled, then renderOpenGL()
will be invoked on the main event thread when the component has been told to
repaint, or after triggerRepaint() has been called.
*/
useBackgroundThread = 4,
/** If this flag is enabled, then any sub-components of the OpenGLComponent
will be correctly overlaid on top of the GL content, and its paint() method will
be able to render over it. If you're not using sub-components, you can disable
this flag, which will eliminate some overhead.
*/
allowSubComponents = 8
};
//==============================================================================
/** Creates an OpenGLComponent.
If useBackgroundThread is true, the component will launch a background thread
to do the rendering. If false, then renderOpenGL() will be called as part of the
normal paint() method.
The flags parameter should be a combination of the values in the
OpenGLFlags enum.
*/
OpenGLComponent (OpenGLType type = openGLDefault,
bool useBackgroundThread = false);
OpenGLComponent (int flags = openGLDefault);
/** Destructor. */
~OpenGLComponent();
@@ -101,7 +117,7 @@ public:
/** Returns true if the component is performing the rendering on a background thread.
This property is specified in the constructor.
*/
bool isUsingDedicatedThread() const noexcept { return useThread; }
inline bool isUsingDedicatedThread() const noexcept { return (flags & useBackgroundThread) != 0; }
/** This replaces the normal paint() callback - use it to draw your openGL stuff.
@@ -177,6 +193,14 @@ public:
int getRenderingTargetWidth() const { return getWidth(); }
int getRenderingTargetHeight() const { return getHeight(); }
/** Causes a repaint to be invoked asynchronously.
This has a similar effect to calling repaint(), and triggers a callback to
renderOpenGL(), but unlike repaint(), it does not mark any of the component's
children as needing a redraw, which means that their cached state can be re-used
if possible.
*/
void triggerRepaint();
//==============================================================================
/** Calls the rendering callback, and swaps the buffers afterwards.
This is called automatically by paint() when the component needs to be rendered.
@@ -225,12 +249,11 @@ protected:
*/
virtual void stopRenderThread();
//==============================================================================
/** @internal */
void paint (Graphics& g);
void paint (Graphics&);
private:
const OpenGLType type;
const int flags;
class OpenGLComponentRenderThread;
friend class OpenGLComponentRenderThread;
@@ -247,14 +270,15 @@ private:
CriticalSection contextLock;
OpenGLPixelFormat preferredPixelFormat;
bool needToUpdateViewport, needToDeleteContext, threadStarted;
const bool useThread;
class OpenGLCachedComponentImage;
friend class OpenGLCachedComponentImage;
OpenGLContext* createContext();
void updateContext();
void updateContextPosition();
void stopBackgroundThread();
void recreateContextAsync();
void internalRepaint (int x, int y, int w, int h);
void updateEmbeddedPosition (const Rectangle<int>&);
JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR (OpenGLComponent);


+ 129
- 132
modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp View File

@@ -250,13 +250,6 @@ public:
{
}
GLShaderProgram (const GLchar* fragment) noexcept
: program (glCreateProgram())
{
addShader (fragment, GL_FRAGMENT_SHADER);
link();
}
~GLShaderProgram() noexcept
{
glDeleteProgram (program);
@@ -297,9 +290,9 @@ public:
#endif
}
struct UniformLocation
struct Uniform
{
UniformLocation (const GLShaderProgram& program, const GLchar* name)
Uniform (const GLShaderProgram& program, const GLchar* name)
: uniformID (glGetUniformLocation (program.program, name))
{
jassert (uniformID >= 0);
@@ -335,76 +328,85 @@ struct ShaderPrograms
bool areShadersSupported;
struct SolidColourMaskedProgram
struct ShaderBase
{
ShaderBase (const char* fragmentShader)
{
addShader (fragmentShader, GL_FRAGMENT_SHADER);
link();
}
GLShaderProgram program;
};
struct SolidColourMaskedProgram : public ShaderBase
{
SolidColourMaskedProgram()
: program ("#version 120\n"
"uniform sampler2D maskTexture;"
"uniform ivec4 maskBounds;"
"const float textureY = 0.5;"
""
"void main()"
"{"
" vec2 maskPos;"
" maskPos.x = (gl_FragCoord.x - maskBounds.x) / maskBounds.z;"
" maskPos.y = 1.0 - (gl_FragCoord.y - maskBounds.y) / maskBounds.w;"
" gl_FragColor = gl_Color * texture2D (maskTexture, maskPos).w;"
"}"),
: ShaderBase ("#version 120\n"
"uniform sampler2D maskTexture;"
"uniform ivec4 maskBounds;"
"const float textureY = 0.5;"
""
"void main()"
"{"
" vec2 maskPos;"
" maskPos.x = (gl_FragCoord.x - maskBounds.x) / maskBounds.z;"
" maskPos.y = 1.0 - (gl_FragCoord.y - maskBounds.y) / maskBounds.w;"
" gl_FragColor = gl_Color * texture2D (maskTexture, maskPos).w;"
"}"),
maskTexture (program, "maskTexture"),
maskBounds (program, "maskBounds")
{
}
GLShaderProgram program;
GLShaderProgram::UniformLocation maskTexture, maskBounds;
GLShaderProgram::Uniform maskTexture, maskBounds;
};
struct RadialGradientProgram
struct RadialGradientProgram : public ShaderBase
{
RadialGradientProgram()
: program ("#version 120\n"
"uniform sampler2D gradientTexture;"
"uniform mat2x3 matrix;"
"const float textureY = 0.5;"
""
"void main()"
"{"
" float dist = length (vec2 (matrix[0][0] * gl_FragCoord.x + matrix[0][1] * gl_FragCoord.y + matrix[0][2],"
" matrix[1][0] * gl_FragCoord.x + matrix[1][1] * gl_FragCoord.y + matrix[1][2]));"
" gl_FragColor = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));"
"}"),
: ShaderBase ("#version 120\n"
"uniform sampler2D gradientTexture;"
"uniform mat2x3 matrix;"
"const float textureY = 0.5;"
""
"void main()"
"{"
" float dist = length (vec2 (matrix[0][0] * gl_FragCoord.x + matrix[0][1] * gl_FragCoord.y + matrix[0][2],"
" matrix[1][0] * gl_FragCoord.x + matrix[1][1] * gl_FragCoord.y + matrix[1][2]));"
" gl_FragColor = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));"
"}"),
gradientTexture (program, "gradientTexture"),
matrix (program, "matrix")
{
}
GLShaderProgram program;
GLShaderProgram::UniformLocation gradientTexture, matrix;
GLShaderProgram::Uniform gradientTexture, matrix;
};
struct RadialGradientMaskedProgram
struct RadialGradientMaskedProgram : public ShaderBase
{
RadialGradientMaskedProgram()
: program ("#version 120\n"
"uniform sampler2D gradientTexture;"
"uniform mat2x3 matrix;"
"uniform sampler2D maskTexture;"
"uniform ivec4 maskBounds;"
"const float textureY = 0.5;"
""
"void main()"
"{"
" float dist = length (vec2 (matrix[0][0] * gl_FragCoord.x + matrix[0][1] * gl_FragCoord.y + matrix[0][2],"
" matrix[1][0] * gl_FragCoord.x + matrix[1][1] * gl_FragCoord.y + matrix[1][2]));"
" vec4 result = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));"
""
" vec2 maskPos;"
" maskPos.x = (gl_FragCoord.x - maskBounds.x) / maskBounds.z;"
" maskPos.y = 1.0 - (gl_FragCoord.y - maskBounds.y) / maskBounds.w;"
" result *= texture2D (maskTexture, maskPos).w;"
""
" gl_FragColor = result;"
"}"),
: ShaderBase ("#version 120\n"
"uniform sampler2D gradientTexture;"
"uniform mat2x3 matrix;"
"uniform sampler2D maskTexture;"
"uniform ivec4 maskBounds;"
"const float textureY = 0.5;"
""
"void main()"
"{"
" float dist = length (vec2 (matrix[0][0] * gl_FragCoord.x + matrix[0][1] * gl_FragCoord.y + matrix[0][2],"
" matrix[1][0] * gl_FragCoord.x + matrix[1][1] * gl_FragCoord.y + matrix[1][2]));"
" vec4 result = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));"
""
" vec2 maskPos;"
" maskPos.x = (gl_FragCoord.x - maskBounds.x) / maskBounds.z;"
" maskPos.y = 1.0 - (gl_FragCoord.y - maskBounds.y) / maskBounds.w;"
" result *= texture2D (maskTexture, maskPos).w;"
""
" gl_FragColor = result;"
"}"),
gradientTexture (program, "gradientTexture"),
matrix (program, "matrix"),
maskTexture (program, "maskTexture"),
@@ -412,54 +414,52 @@ struct ShaderPrograms
{
}
GLShaderProgram program;
GLShaderProgram::UniformLocation gradientTexture, matrix;
GLShaderProgram::UniformLocation maskTexture, maskBounds;
GLShaderProgram::Uniform gradientTexture, matrix;
GLShaderProgram::Uniform maskTexture, maskBounds;
};
struct LinearGradient1Program
struct LinearGradient1Program : public ShaderBase
{
LinearGradient1Program()
: program ("#version 120\n"
"uniform sampler2D gradientTexture;"
"uniform vec4 gradientInfo;" // x = x1, y = y1, z = (y2 - y1) / (x2 - x1), w = length
"const float textureY = 0.5;"
""
"void main()"
"{"
" float dist = (gl_FragCoord.y - (gradientInfo.y + (gradientInfo.z * (gl_FragCoord.x - gradientInfo.x)))) / gradientInfo.w;"
" gl_FragColor = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));"
"}"),
: ShaderBase ("#version 120\n"
"uniform sampler2D gradientTexture;"
"uniform vec4 gradientInfo;" // x = x1, y = y1, z = (y2 - y1) / (x2 - x1), w = length
"const float textureY = 0.5;"
""
"void main()"
"{"
" float dist = (gl_FragCoord.y - (gradientInfo.y + (gradientInfo.z * (gl_FragCoord.x - gradientInfo.x)))) / gradientInfo.w;"
" gl_FragColor = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));"
"}"),
gradientTexture (program, "gradientTexture"),
gradientInfo (program, "gradientInfo")
{
}
GLShaderProgram program;
GLShaderProgram::UniformLocation gradientTexture, gradientInfo;
GLShaderProgram::Uniform gradientTexture, gradientInfo;
};
struct LinearGradient1MaskedProgram
struct LinearGradient1MaskedProgram : public ShaderBase
{
LinearGradient1MaskedProgram()
: program ("#version 120\n"
"uniform sampler2D gradientTexture;"
"uniform vec3 gradientInfo;" // x = (x2 - x1) / (y2 - y1), y = x1, z = length
"uniform sampler2D maskTexture;"
"uniform ivec4 maskBounds;"
"const float textureY = 0.5;"
""
"void main()"
"{"
" float dist = (gl_FragCoord.y - (gradientInfo.y + (gradientInfo.x * (gl_FragCoord.x - gradientInfo.y)))) / gradientInfo.z;"
" vec4 result = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));"
""
" vec2 maskPos;"
" maskPos.x = (gl_FragCoord.x - maskBounds.x) / maskBounds.z;"
" maskPos.y = 1.0 - (gl_FragCoord.y - maskBounds.y) / maskBounds.w;"
" result *= texture2D (maskTexture, maskPos).w;"
" gl_FragColor = result;"
"}"),
: ShaderBase ("#version 120\n"
"uniform sampler2D gradientTexture;"
"uniform vec3 gradientInfo;" // x = (x2 - x1) / (y2 - y1), y = x1, z = length
"uniform sampler2D maskTexture;"
"uniform ivec4 maskBounds;"
"const float textureY = 0.5;"
""
"void main()"
"{"
" float dist = (gl_FragCoord.y - (gradientInfo.y + (gradientInfo.x * (gl_FragCoord.x - gradientInfo.y)))) / gradientInfo.z;"
" vec4 result = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));"
""
" vec2 maskPos;"
" maskPos.x = (gl_FragCoord.x - maskBounds.x) / maskBounds.z;"
" maskPos.y = 1.0 - (gl_FragCoord.y - maskBounds.y) / maskBounds.w;"
" result *= texture2D (maskTexture, maskPos).w;"
" gl_FragColor = result;"
"}"),
gradientTexture (program, "gradientTexture"),
gradientInfo (program, "gradientInfo"),
maskTexture (program, "maskTexture"),
@@ -467,54 +467,52 @@ struct ShaderPrograms
{
}
GLShaderProgram program;
GLShaderProgram::UniformLocation gradientTexture, gradientInfo;
GLShaderProgram::UniformLocation maskTexture, maskBounds;
GLShaderProgram::Uniform gradientTexture, gradientInfo;
GLShaderProgram::Uniform maskTexture, maskBounds;
};
struct LinearGradient2Program
struct LinearGradient2Program : public ShaderBase
{
LinearGradient2Program()
: program ("#version 120\n"
"uniform sampler2D gradientTexture;"
"uniform vec4 gradientInfo;" // x = x1, y = y1, z = (x2 - x1) / (y2 - y1), y = y1, w = length
"const float textureY = 0.5;"
""
"void main()"
"{"
" float dist = (gl_FragCoord.x - (gradientInfo.x + (gradientInfo.z * (gl_FragCoord.y - gradientInfo.y)))) / gradientInfo.w;"
" gl_FragColor = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));"
"}"),
: ShaderBase ("#version 120\n"
"uniform sampler2D gradientTexture;"
"uniform vec4 gradientInfo;" // x = x1, y = y1, z = (x2 - x1) / (y2 - y1), y = y1, w = length
"const float textureY = 0.5;"
""
"void main()"
"{"
" float dist = (gl_FragCoord.x - (gradientInfo.x + (gradientInfo.z * (gl_FragCoord.y - gradientInfo.y)))) / gradientInfo.w;"
" gl_FragColor = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));"
"}"),
gradientTexture (program, "gradientTexture"),
gradientInfo (program, "gradientInfo")
{
}
GLShaderProgram program;
GLShaderProgram::UniformLocation gradientTexture, gradientInfo;
GLShaderProgram::Uniform gradientTexture, gradientInfo;
};
struct LinearGradient2MaskedProgram
struct LinearGradient2MaskedProgram : public ShaderBase
{
LinearGradient2MaskedProgram()
: program ("#version 120\n"
"uniform sampler2D gradientTexture;"
"uniform vec3 gradientInfo;" // x = (y2 - y1) / (x2 - x1), y = y1, z = length
"uniform sampler2D maskTexture;"
"uniform ivec4 maskBounds;"
"const float textureY = 0.5;"
""
"void main()"
"{"
" float dist = (gl_FragCoord.x - (gradientInfo.y + (gradientInfo.x * (gl_FragCoord.y - gradientInfo.y)))) / gradientInfo.z;"
" vec4 result = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));"
""
" vec2 maskPos;"
" maskPos.x = (gl_FragCoord.x - maskBounds.x) / maskBounds.z;"
" maskPos.y = 1.0 - (gl_FragCoord.y - maskBounds.y) / maskBounds.w;"
" result *= texture2D (maskTexture, maskPos).w;"
" gl_FragColor = result;"
"}"),
: ShaderBase ("#version 120\n"
"uniform sampler2D gradientTexture;"
"uniform vec3 gradientInfo;" // x = (y2 - y1) / (x2 - x1), y = y1, z = length
"uniform sampler2D maskTexture;"
"uniform ivec4 maskBounds;"
"const float textureY = 0.5;"
""
"void main()"
"{"
" float dist = (gl_FragCoord.x - (gradientInfo.y + (gradientInfo.x * (gl_FragCoord.y - gradientInfo.y)))) / gradientInfo.z;"
" vec4 result = gl_Color.w * texture2D (gradientTexture, vec2 (dist, textureY));"
""
" vec2 maskPos;"
" maskPos.x = (gl_FragCoord.x - maskBounds.x) / maskBounds.z;"
" maskPos.y = 1.0 - (gl_FragCoord.y - maskBounds.y) / maskBounds.w;"
" result *= texture2D (maskTexture, maskPos).w;"
" gl_FragColor = result;"
"}"),
gradientTexture (program, "gradientTexture"),
gradientInfo (program, "gradientInfo"),
maskTexture (program, "maskTexture"),
@@ -522,9 +520,8 @@ struct ShaderPrograms
{
}
GLShaderProgram program;
GLShaderProgram::UniformLocation gradientTexture, gradientInfo;
GLShaderProgram::UniformLocation maskTexture, maskBounds;
GLShaderProgram::Uniform gradientTexture, gradientInfo;
GLShaderProgram::Uniform maskTexture, maskBounds;
};
SolidColourMaskedProgram solidColourMasked;


+ 4
- 4
modules/juce_opengl/opengl/juce_OpenGLPixelFormat.h View File

@@ -45,11 +45,11 @@ public:
OpenGLPixelFormat (int bitsPerRGBComponent = 8,
int alphaBits = 8,
int depthBufferBits = 16,
int stencilBufferBits = 0);
int stencilBufferBits = 0) noexcept;
OpenGLPixelFormat (const OpenGLPixelFormat&);
OpenGLPixelFormat& operator= (const OpenGLPixelFormat&);
bool operator== (const OpenGLPixelFormat&) const;
OpenGLPixelFormat (const OpenGLPixelFormat&) noexcept;
OpenGLPixelFormat& operator= (const OpenGLPixelFormat&) noexcept;
bool operator== (const OpenGLPixelFormat&) const noexcept;
//==============================================================================
int redBits; /**< The number of bits per pixel to use for the red channel. */


Loading…
Cancel
Save