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