@@ -243,6 +243,8 @@ OBJECTS := \ | |||
$(OBJDIR)/juce_DrawableComposite_4cd2d2ab.o \ | |||
$(OBJDIR)/juce_DrawableImage_53f04eff.o \ | |||
$(OBJDIR)/juce_DrawablePath_fb538a0b.o \ | |||
$(OBJDIR)/juce_DrawableRectangle_5f2f5993.o \ | |||
$(OBJDIR)/juce_DrawableShape_26926245.o \ | |||
$(OBJDIR)/juce_DrawableText_75eda713.o \ | |||
$(OBJDIR)/juce_SVGParser_b79416c5.o \ | |||
$(OBJDIR)/juce_DropShadowEffect_da52d75.o \ | |||
@@ -1382,6 +1384,16 @@ $(OBJDIR)/juce_DrawablePath_fb538a0b.o: ../../src/gui/graphics/drawables/juce_Dr | |||
@echo "Compiling juce_DrawablePath.cpp" | |||
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
$(OBJDIR)/juce_DrawableRectangle_5f2f5993.o: ../../src/gui/graphics/drawables/juce_DrawableRectangle.cpp | |||
-@mkdir -p $(OBJDIR) | |||
@echo "Compiling juce_DrawableRectangle.cpp" | |||
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
$(OBJDIR)/juce_DrawableShape_26926245.o: ../../src/gui/graphics/drawables/juce_DrawableShape.cpp | |||
-@mkdir -p $(OBJDIR) | |||
@echo "Compiling juce_DrawableShape.cpp" | |||
@$(CXX) $(CXXFLAGS) -o "$@" -c "$<" | |||
$(OBJDIR)/juce_DrawableText_75eda713.o: ../../src/gui/graphics/drawables/juce_DrawableText.cpp | |||
-@mkdir -p $(OBJDIR) | |||
@echo "Compiling juce_DrawableText.cpp" | |||
@@ -212,6 +212,8 @@ | |||
00FE118356919D0BA97AE853 = { isa = PBXBuildFile; fileRef = 85B7BCACB40E02815844F71D; }; | |||
18D8A96CCD34E41A5E162AD5 = { isa = PBXBuildFile; fileRef = A54BC72C899A2AF82E1E37F8; }; | |||
CEB8A9B9A37EBBA79A6478D4 = { isa = PBXBuildFile; fileRef = 582DCC2F948F1DEA0D450B0D; }; | |||
D6D48B2CC53FAE2BD126B0DE = { isa = PBXBuildFile; fileRef = E0694CD7C814AA99E5A84799; }; | |||
C384A89F786FDE8426F657D5 = { isa = PBXBuildFile; fileRef = 62967D33232C5A86D88084B4; }; | |||
3D324F656EEF8F1FB2B437AC = { isa = PBXBuildFile; fileRef = C17613C202D8E1C366F21D3C; }; | |||
645AF66C048A4815F5A8ECDD = { isa = PBXBuildFile; fileRef = 2BFC199D03DEEC329D6A7CB1; }; | |||
38EFE824E76B3BB99824C265 = { isa = PBXBuildFile; fileRef = 32EA297812F1C88B42099501; }; | |||
@@ -820,6 +822,10 @@ | |||
849E645981CA10B8D5576462 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawableImage.h; path = ../../src/gui/graphics/drawables/juce_DrawableImage.h; sourceTree = SOURCE_ROOT; }; | |||
582DCC2F948F1DEA0D450B0D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawablePath.cpp; path = ../../src/gui/graphics/drawables/juce_DrawablePath.cpp; sourceTree = SOURCE_ROOT; }; | |||
17EBDF689C731DA257B243C9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawablePath.h; path = ../../src/gui/graphics/drawables/juce_DrawablePath.h; sourceTree = SOURCE_ROOT; }; | |||
E0694CD7C814AA99E5A84799 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableRectangle.cpp; path = ../../src/gui/graphics/drawables/juce_DrawableRectangle.cpp; sourceTree = SOURCE_ROOT; }; | |||
0FA9E378EBD7EE63EF72124F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawableRectangle.h; path = ../../src/gui/graphics/drawables/juce_DrawableRectangle.h; sourceTree = SOURCE_ROOT; }; | |||
62967D33232C5A86D88084B4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableShape.cpp; path = ../../src/gui/graphics/drawables/juce_DrawableShape.cpp; sourceTree = SOURCE_ROOT; }; | |||
2FBD6F49349E7CC8FC2051EA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawableShape.h; path = ../../src/gui/graphics/drawables/juce_DrawableShape.h; sourceTree = SOURCE_ROOT; }; | |||
C17613C202D8E1C366F21D3C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableText.cpp; path = ../../src/gui/graphics/drawables/juce_DrawableText.cpp; sourceTree = SOURCE_ROOT; }; | |||
1FA43B2E4244CD74B551DAD6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawableText.h; path = ../../src/gui/graphics/drawables/juce_DrawableText.h; sourceTree = SOURCE_ROOT; }; | |||
2BFC199D03DEEC329D6A7CB1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_SVGParser.cpp; path = ../../src/gui/graphics/drawables/juce_SVGParser.cpp; sourceTree = SOURCE_ROOT; }; | |||
@@ -1574,6 +1580,10 @@ | |||
849E645981CA10B8D5576462, | |||
582DCC2F948F1DEA0D450B0D, | |||
17EBDF689C731DA257B243C9, | |||
E0694CD7C814AA99E5A84799, | |||
0FA9E378EBD7EE63EF72124F, | |||
62967D33232C5A86D88084B4, | |||
2FBD6F49349E7CC8FC2051EA, | |||
C17613C202D8E1C366F21D3C, | |||
1FA43B2E4244CD74B551DAD6, | |||
2BFC199D03DEEC329D6A7CB1 ); name = drawables; sourceTree = "<group>"; }; | |||
@@ -2127,6 +2137,8 @@ | |||
00FE118356919D0BA97AE853, | |||
18D8A96CCD34E41A5E162AD5, | |||
CEB8A9B9A37EBBA79A6478D4, | |||
D6D48B2CC53FAE2BD126B0DE, | |||
C384A89F786FDE8426F657D5, | |||
3D324F656EEF8F1FB2B437AC, | |||
645AF66C048A4815F5A8ECDD, | |||
38EFE824E76B3BB99824C265, | |||
@@ -723,6 +723,10 @@ | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawableImage.h"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawablePath.cpp"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawablePath.h"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawableRectangle.cpp"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawableRectangle.h"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawableShape.cpp"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawableShape.h"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawableText.cpp"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawableText.h"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_SVGParser.cpp"/> | |||
@@ -723,6 +723,10 @@ | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawableImage.h"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawablePath.cpp"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawablePath.h"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawableRectangle.cpp"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawableRectangle.h"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawableShape.cpp"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawableShape.h"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawableText.cpp"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawableText.h"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_SVGParser.cpp"/> | |||
@@ -725,6 +725,10 @@ | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawableImage.h"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawablePath.cpp"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawablePath.h"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawableRectangle.cpp"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawableRectangle.h"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawableShape.cpp"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawableShape.h"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawableText.cpp"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_DrawableText.h"/> | |||
<File RelativePath="..\..\src\gui\graphics\drawables\juce_SVGParser.cpp"/> | |||
@@ -326,6 +326,8 @@ | |||
<ClCompile Include="..\..\src\gui\graphics\drawables\juce_DrawableComposite.cpp"/> | |||
<ClCompile Include="..\..\src\gui\graphics\drawables\juce_DrawableImage.cpp"/> | |||
<ClCompile Include="..\..\src\gui\graphics\drawables\juce_DrawablePath.cpp"/> | |||
<ClCompile Include="..\..\src\gui\graphics\drawables\juce_DrawableRectangle.cpp"/> | |||
<ClCompile Include="..\..\src\gui\graphics\drawables\juce_DrawableShape.cpp"/> | |||
<ClCompile Include="..\..\src\gui\graphics\drawables\juce_DrawableText.cpp"/> | |||
<ClCompile Include="..\..\src\gui\graphics\drawables\juce_SVGParser.cpp"/> | |||
<ClCompile Include="..\..\src\gui\graphics\effects\juce_DropShadowEffect.cpp"/> | |||
@@ -692,6 +694,8 @@ | |||
<ClInclude Include="..\..\src\gui\graphics\drawables\juce_DrawableComposite.h"/> | |||
<ClInclude Include="..\..\src\gui\graphics\drawables\juce_DrawableImage.h"/> | |||
<ClInclude Include="..\..\src\gui\graphics\drawables\juce_DrawablePath.h"/> | |||
<ClInclude Include="..\..\src\gui\graphics\drawables\juce_DrawableRectangle.h"/> | |||
<ClInclude Include="..\..\src\gui\graphics\drawables\juce_DrawableShape.h"/> | |||
<ClInclude Include="..\..\src\gui\graphics\drawables\juce_DrawableText.h"/> | |||
<ClInclude Include="..\..\src\gui\graphics\effects\juce_DropShadowEffect.h"/> | |||
<ClInclude Include="..\..\src\gui\graphics\effects\juce_GlowEffect.h"/> | |||
@@ -826,6 +826,12 @@ | |||
<ClCompile Include="..\..\src\gui\graphics\drawables\juce_DrawablePath.cpp"> | |||
<Filter>Juce\Source\gui\graphics\drawables</Filter> | |||
</ClCompile> | |||
<ClCompile Include="..\..\src\gui\graphics\drawables\juce_DrawableRectangle.cpp"> | |||
<Filter>Juce\Source\gui\graphics\drawables</Filter> | |||
</ClCompile> | |||
<ClCompile Include="..\..\src\gui\graphics\drawables\juce_DrawableShape.cpp"> | |||
<Filter>Juce\Source\gui\graphics\drawables</Filter> | |||
</ClCompile> | |||
<ClCompile Include="..\..\src\gui\graphics\drawables\juce_DrawableText.cpp"> | |||
<Filter>Juce\Source\gui\graphics\drawables</Filter> | |||
</ClCompile> | |||
@@ -1998,6 +2004,12 @@ | |||
<ClInclude Include="..\..\src\gui\graphics\drawables\juce_DrawablePath.h"> | |||
<Filter>Juce\Source\gui\graphics\drawables</Filter> | |||
</ClInclude> | |||
<ClInclude Include="..\..\src\gui\graphics\drawables\juce_DrawableRectangle.h"> | |||
<Filter>Juce\Source\gui\graphics\drawables</Filter> | |||
</ClInclude> | |||
<ClInclude Include="..\..\src\gui\graphics\drawables\juce_DrawableShape.h"> | |||
<Filter>Juce\Source\gui\graphics\drawables</Filter> | |||
</ClInclude> | |||
<ClInclude Include="..\..\src\gui\graphics\drawables\juce_DrawableText.h"> | |||
<Filter>Juce\Source\gui\graphics\drawables</Filter> | |||
</ClInclude> | |||
@@ -212,6 +212,8 @@ | |||
00FE118356919D0BA97AE853 = { isa = PBXBuildFile; fileRef = 85B7BCACB40E02815844F71D; }; | |||
18D8A96CCD34E41A5E162AD5 = { isa = PBXBuildFile; fileRef = A54BC72C899A2AF82E1E37F8; }; | |||
CEB8A9B9A37EBBA79A6478D4 = { isa = PBXBuildFile; fileRef = 582DCC2F948F1DEA0D450B0D; }; | |||
D6D48B2CC53FAE2BD126B0DE = { isa = PBXBuildFile; fileRef = E0694CD7C814AA99E5A84799; }; | |||
C384A89F786FDE8426F657D5 = { isa = PBXBuildFile; fileRef = 62967D33232C5A86D88084B4; }; | |||
3D324F656EEF8F1FB2B437AC = { isa = PBXBuildFile; fileRef = C17613C202D8E1C366F21D3C; }; | |||
645AF66C048A4815F5A8ECDD = { isa = PBXBuildFile; fileRef = 2BFC199D03DEEC329D6A7CB1; }; | |||
38EFE824E76B3BB99824C265 = { isa = PBXBuildFile; fileRef = 32EA297812F1C88B42099501; }; | |||
@@ -820,6 +822,10 @@ | |||
849E645981CA10B8D5576462 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawableImage.h; path = ../../src/gui/graphics/drawables/juce_DrawableImage.h; sourceTree = SOURCE_ROOT; }; | |||
582DCC2F948F1DEA0D450B0D = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawablePath.cpp; path = ../../src/gui/graphics/drawables/juce_DrawablePath.cpp; sourceTree = SOURCE_ROOT; }; | |||
17EBDF689C731DA257B243C9 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawablePath.h; path = ../../src/gui/graphics/drawables/juce_DrawablePath.h; sourceTree = SOURCE_ROOT; }; | |||
E0694CD7C814AA99E5A84799 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableRectangle.cpp; path = ../../src/gui/graphics/drawables/juce_DrawableRectangle.cpp; sourceTree = SOURCE_ROOT; }; | |||
0FA9E378EBD7EE63EF72124F = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawableRectangle.h; path = ../../src/gui/graphics/drawables/juce_DrawableRectangle.h; sourceTree = SOURCE_ROOT; }; | |||
62967D33232C5A86D88084B4 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableShape.cpp; path = ../../src/gui/graphics/drawables/juce_DrawableShape.cpp; sourceTree = SOURCE_ROOT; }; | |||
2FBD6F49349E7CC8FC2051EA = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawableShape.h; path = ../../src/gui/graphics/drawables/juce_DrawableShape.h; sourceTree = SOURCE_ROOT; }; | |||
C17613C202D8E1C366F21D3C = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_DrawableText.cpp; path = ../../src/gui/graphics/drawables/juce_DrawableText.cpp; sourceTree = SOURCE_ROOT; }; | |||
1FA43B2E4244CD74B551DAD6 = { isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = juce_DrawableText.h; path = ../../src/gui/graphics/drawables/juce_DrawableText.h; sourceTree = SOURCE_ROOT; }; | |||
2BFC199D03DEEC329D6A7CB1 = { isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.cpp; name = juce_SVGParser.cpp; path = ../../src/gui/graphics/drawables/juce_SVGParser.cpp; sourceTree = SOURCE_ROOT; }; | |||
@@ -1574,6 +1580,10 @@ | |||
849E645981CA10B8D5576462, | |||
582DCC2F948F1DEA0D450B0D, | |||
17EBDF689C731DA257B243C9, | |||
E0694CD7C814AA99E5A84799, | |||
0FA9E378EBD7EE63EF72124F, | |||
62967D33232C5A86D88084B4, | |||
2FBD6F49349E7CC8FC2051EA, | |||
C17613C202D8E1C366F21D3C, | |||
1FA43B2E4244CD74B551DAD6, | |||
2BFC199D03DEEC329D6A7CB1 ); name = drawables; sourceTree = "<group>"; }; | |||
@@ -2127,6 +2137,8 @@ | |||
00FE118356919D0BA97AE853, | |||
18D8A96CCD34E41A5E162AD5, | |||
CEB8A9B9A37EBBA79A6478D4, | |||
D6D48B2CC53FAE2BD126B0DE, | |||
C384A89F786FDE8426F657D5, | |||
3D324F656EEF8F1FB2B437AC, | |||
645AF66C048A4815F5A8ECDD, | |||
38EFE824E76B3BB99824C265, | |||
@@ -1057,6 +1057,14 @@ | |||
file="src/gui/graphics/drawables/juce_DrawablePath.cpp"/> | |||
<FILE id="kCwPUxGn" name="juce_DrawablePath.h" compile="0" resource="0" | |||
file="src/gui/graphics/drawables/juce_DrawablePath.h"/> | |||
<FILE id="dhwj8Vp" name="juce_DrawableRectangle.cpp" compile="1" resource="0" | |||
file="src/gui/graphics/drawables/juce_DrawableRectangle.cpp"/> | |||
<FILE id="4NWl38N" name="juce_DrawableRectangle.h" compile="0" resource="0" | |||
file="src/gui/graphics/drawables/juce_DrawableRectangle.h"/> | |||
<FILE id="D0V36hB" name="juce_DrawableShape.cpp" compile="1" resource="0" | |||
file="src/gui/graphics/drawables/juce_DrawableShape.cpp"/> | |||
<FILE id="pEOXc23" name="juce_DrawableShape.h" compile="0" resource="0" | |||
file="src/gui/graphics/drawables/juce_DrawableShape.h"/> | |||
<FILE id="V1TBbJfVS" name="juce_DrawableText.cpp" compile="1" resource="0" | |||
file="src/gui/graphics/drawables/juce_DrawableText.cpp"/> | |||
<FILE id="Z7WEXaWaD" name="juce_DrawableText.h" compile="0" resource="0" | |||
@@ -341,9 +341,11 @@ | |||
#include "../src/gui/graphics/contexts/juce_LowLevelGraphicsSoftwareRenderer.cpp" | |||
#include "../src/gui/graphics/contexts/juce_RectanglePlacement.cpp" | |||
#include "../src/gui/graphics/drawables/juce_Drawable.cpp" | |||
#include "../src/gui/graphics/drawables/juce_DrawableShape.cpp" | |||
#include "../src/gui/graphics/drawables/juce_DrawableComposite.cpp" | |||
#include "../src/gui/graphics/drawables/juce_DrawableImage.cpp" | |||
#include "../src/gui/graphics/drawables/juce_DrawablePath.cpp" | |||
#include "../src/gui/graphics/drawables/juce_DrawableRectangle.cpp" | |||
#include "../src/gui/graphics/drawables/juce_DrawableText.cpp" | |||
#include "../src/gui/graphics/drawables/juce_SVGParser.cpp" | |||
#include "../src/gui/graphics/effects/juce_DropShadowEffect.cpp" | |||
@@ -385,6 +385,16 @@ public: | |||
bool openFile (const File& file) | |||
{ | |||
for (int j = mainWindows.size(); --j >= 0;) | |||
{ | |||
if (mainWindows.getUnchecked(j)->getProject() != 0 | |||
&& mainWindows.getUnchecked(j)->getProject()->getFile() == file) | |||
{ | |||
mainWindows.getUnchecked(j)->toFront (true); | |||
return true; | |||
} | |||
} | |||
if (file.hasFileExtension (Project::projectFileExtension)) | |||
{ | |||
ScopedPointer <Project> newDoc (new Project (file)); | |||
@@ -64,7 +64,7 @@ | |||
*/ | |||
#define JUCE_MAJOR_VERSION 1 | |||
#define JUCE_MINOR_VERSION 52 | |||
#define JUCE_BUILDNUMBER 78 | |||
#define JUCE_BUILDNUMBER 79 | |||
/** Current Juce version number. | |||
@@ -777,10 +777,10 @@ | |||
// Now include some basics that are needed by most of the Juce classes... | |||
BEGIN_JUCE_NAMESPACE | |||
extern bool JUCE_PUBLIC_FUNCTION juce_isRunningUnderDebugger(); | |||
extern JUCE_API bool JUCE_CALLTYPE juce_isRunningUnderDebugger(); | |||
#if JUCE_LOG_ASSERTIONS | |||
extern void JUCE_API juce_LogAssertion (const char* filename, int lineNum) throw(); | |||
extern JUCE_API void juce_LogAssertion (const char* filename, int lineNum) throw(); | |||
#endif | |||
@@ -2605,83 +2605,83 @@ private: | |||
}; | |||
/** Concatenates two strings. */ | |||
const String JUCE_PUBLIC_FUNCTION operator+ (const char* string1, const String& string2); | |||
JUCE_API const String JUCE_CALLTYPE operator+ (const char* string1, const String& string2); | |||
/** Concatenates two strings. */ | |||
const String JUCE_PUBLIC_FUNCTION operator+ (const juce_wchar* string1, const String& string2); | |||
JUCE_API const String JUCE_CALLTYPE operator+ (const juce_wchar* string1, const String& string2); | |||
/** Concatenates two strings. */ | |||
const String JUCE_PUBLIC_FUNCTION operator+ (char string1, const String& string2); | |||
JUCE_API const String JUCE_CALLTYPE operator+ (char string1, const String& string2); | |||
/** Concatenates two strings. */ | |||
const String JUCE_PUBLIC_FUNCTION operator+ (juce_wchar string1, const String& string2); | |||
JUCE_API const String JUCE_CALLTYPE operator+ (juce_wchar string1, const String& string2); | |||
/** Concatenates two strings. */ | |||
const String JUCE_PUBLIC_FUNCTION operator+ (String string1, const String& string2); | |||
JUCE_API const String JUCE_CALLTYPE operator+ (String string1, const String& string2); | |||
/** Concatenates two strings. */ | |||
const String JUCE_PUBLIC_FUNCTION operator+ (String string1, const char* string2); | |||
JUCE_API const String JUCE_CALLTYPE operator+ (String string1, const char* string2); | |||
/** Concatenates two strings. */ | |||
const String JUCE_PUBLIC_FUNCTION operator+ (String string1, const juce_wchar* string2); | |||
JUCE_API const String JUCE_CALLTYPE operator+ (String string1, const juce_wchar* string2); | |||
/** Concatenates two strings. */ | |||
const String JUCE_PUBLIC_FUNCTION operator+ (String string1, char characterToAppend); | |||
JUCE_API const String JUCE_CALLTYPE operator+ (String string1, char characterToAppend); | |||
/** Concatenates two strings. */ | |||
const String JUCE_PUBLIC_FUNCTION operator+ (String string1, juce_wchar characterToAppend); | |||
JUCE_API const String JUCE_CALLTYPE operator+ (String string1, juce_wchar characterToAppend); | |||
/** Appends a character at the end of a string. */ | |||
String& JUCE_PUBLIC_FUNCTION operator<< (String& string1, char characterToAppend); | |||
JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, char characterToAppend); | |||
/** Appends a character at the end of a string. */ | |||
String& JUCE_PUBLIC_FUNCTION operator<< (String& string1, juce_wchar characterToAppend); | |||
JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, juce_wchar characterToAppend); | |||
/** Appends a string to the end of the first one. */ | |||
String& JUCE_PUBLIC_FUNCTION operator<< (String& string1, const char* string2); | |||
JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, const char* string2); | |||
/** Appends a string to the end of the first one. */ | |||
String& JUCE_PUBLIC_FUNCTION operator<< (String& string1, const juce_wchar* string2); | |||
JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, const juce_wchar* string2); | |||
/** Appends a string to the end of the first one. */ | |||
String& JUCE_PUBLIC_FUNCTION operator<< (String& string1, const String& string2); | |||
JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, const String& string2); | |||
/** Appends a decimal number at the end of a string. */ | |||
String& JUCE_PUBLIC_FUNCTION operator<< (String& string1, short number); | |||
JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, short number); | |||
/** Appends a decimal number at the end of a string. */ | |||
String& JUCE_PUBLIC_FUNCTION operator<< (String& string1, int number); | |||
JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, int number); | |||
/** Appends a decimal number at the end of a string. */ | |||
String& JUCE_PUBLIC_FUNCTION operator<< (String& string1, unsigned int number); | |||
JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, unsigned int number); | |||
/** Appends a decimal number at the end of a string. */ | |||
String& JUCE_PUBLIC_FUNCTION operator<< (String& string1, long number); | |||
JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, long number); | |||
/** Appends a decimal number at the end of a string. */ | |||
String& JUCE_PUBLIC_FUNCTION operator<< (String& string1, unsigned long number); | |||
JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, unsigned long number); | |||
/** Appends a decimal number at the end of a string. */ | |||
String& JUCE_PUBLIC_FUNCTION operator<< (String& string1, float number); | |||
JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, float number); | |||
/** Appends a decimal number at the end of a string. */ | |||
String& JUCE_PUBLIC_FUNCTION operator<< (String& string1, double number); | |||
JUCE_API String& JUCE_CALLTYPE operator<< (String& string1, double number); | |||
/** Case-sensitive comparison of two strings. */ | |||
bool JUCE_PUBLIC_FUNCTION operator== (const String& string1, const String& string2) throw(); | |||
JUCE_API bool JUCE_CALLTYPE operator== (const String& string1, const String& string2) throw(); | |||
/** Case-sensitive comparison of two strings. */ | |||
bool JUCE_PUBLIC_FUNCTION operator== (const String& string1, const char* string2) throw(); | |||
JUCE_API bool JUCE_CALLTYPE operator== (const String& string1, const char* string2) throw(); | |||
/** Case-sensitive comparison of two strings. */ | |||
bool JUCE_PUBLIC_FUNCTION operator== (const String& string1, const juce_wchar* string2) throw(); | |||
JUCE_API bool JUCE_CALLTYPE operator== (const String& string1, const juce_wchar* string2) throw(); | |||
/** Case-sensitive comparison of two strings. */ | |||
bool JUCE_PUBLIC_FUNCTION operator!= (const String& string1, const String& string2) throw(); | |||
JUCE_API bool JUCE_CALLTYPE operator!= (const String& string1, const String& string2) throw(); | |||
/** Case-sensitive comparison of two strings. */ | |||
bool JUCE_PUBLIC_FUNCTION operator!= (const String& string1, const char* string2) throw(); | |||
JUCE_API bool JUCE_CALLTYPE operator!= (const String& string1, const char* string2) throw(); | |||
/** Case-sensitive comparison of two strings. */ | |||
bool JUCE_PUBLIC_FUNCTION operator!= (const String& string1, const juce_wchar* string2) throw(); | |||
JUCE_API bool JUCE_CALLTYPE operator!= (const String& string1, const juce_wchar* string2) throw(); | |||
/** Case-sensitive comparison of two strings. */ | |||
bool JUCE_PUBLIC_FUNCTION operator> (const String& string1, const String& string2) throw(); | |||
JUCE_API bool JUCE_CALLTYPE operator> (const String& string1, const String& string2) throw(); | |||
/** Case-sensitive comparison of two strings. */ | |||
bool JUCE_PUBLIC_FUNCTION operator< (const String& string1, const String& string2) throw(); | |||
JUCE_API bool JUCE_CALLTYPE operator< (const String& string1, const String& string2) throw(); | |||
/** Case-sensitive comparison of two strings. */ | |||
bool JUCE_PUBLIC_FUNCTION operator>= (const String& string1, const String& string2) throw(); | |||
JUCE_API bool JUCE_CALLTYPE operator>= (const String& string1, const String& string2) throw(); | |||
/** Case-sensitive comparison of two strings. */ | |||
bool JUCE_PUBLIC_FUNCTION operator<= (const String& string1, const String& string2) throw(); | |||
JUCE_API bool JUCE_CALLTYPE operator<= (const String& string1, const String& string2) throw(); | |||
/** This streaming override allows you to pass a juce String directly into std output streams. | |||
This is very handy for writing strings to std::cout, std::cerr, etc. | |||
*/ | |||
template <class charT, class traits> | |||
std::basic_ostream <charT, traits>& JUCE_PUBLIC_FUNCTION operator<< (std::basic_ostream <charT, traits>& stream, const String& stringToWrite) | |||
JUCE_API std::basic_ostream <charT, traits>& JUCE_CALLTYPE operator<< (std::basic_ostream <charT, traits>& stream, const String& stringToWrite) | |||
{ | |||
return stream << stringToWrite.toUTF8(); | |||
} | |||
/** Writes a string to an OutputStream as UTF8. */ | |||
OutputStream& JUCE_PUBLIC_FUNCTION operator<< (OutputStream& stream, const String& text); | |||
JUCE_API OutputStream& JUCE_CALLTYPE operator<< (OutputStream& stream, const String& text); | |||
#endif // __JUCE_STRING_JUCEHEADER__ | |||
/*** End of inlined file: juce_String.h ***/ | |||
@@ -14107,7 +14107,7 @@ private: | |||
@see shutdownJuce_GUI(), initialiseJuce_NonGUI() | |||
*/ | |||
void JUCE_PUBLIC_FUNCTION initialiseJuce_GUI(); | |||
JUCE_API void JUCE_CALLTYPE initialiseJuce_GUI(); | |||
/** Clears up any static data being used by Juce's GUI classes. | |||
@@ -14117,7 +14117,7 @@ void JUCE_PUBLIC_FUNCTION initialiseJuce_GUI(); | |||
@see initialiseJuce_GUI(), initialiseJuce_NonGUI() | |||
*/ | |||
void JUCE_PUBLIC_FUNCTION shutdownJuce_GUI(); | |||
JUCE_API void JUCE_CALLTYPE shutdownJuce_GUI(); | |||
/** Initialises the core parts of Juce. | |||
@@ -14129,7 +14129,7 @@ void JUCE_PUBLIC_FUNCTION shutdownJuce_GUI(); | |||
@see shutdownJuce_NonGUI, initialiseJuce_GUI | |||
*/ | |||
void JUCE_PUBLIC_FUNCTION initialiseJuce_NonGUI(); | |||
JUCE_API void JUCE_CALLTYPE initialiseJuce_NonGUI(); | |||
/** Clears up any static data being used by Juce's non-gui core classes. | |||
@@ -14139,7 +14139,7 @@ void JUCE_PUBLIC_FUNCTION initialiseJuce_NonGUI(); | |||
@see initialiseJuce_NonGUI, initialiseJuce_GUI | |||
*/ | |||
void JUCE_PUBLIC_FUNCTION shutdownJuce_NonGUI(); | |||
JUCE_API void JUCE_CALLTYPE shutdownJuce_NonGUI(); | |||
/** A utility object that helps you initialise and shutdown Juce correctly | |||
using an RAII pattern. | |||
@@ -41008,6 +41008,11 @@ public: | |||
*/ | |||
bool scanNextFile (bool dontRescanIfAlreadyInList); | |||
/** Skips over the next file without scanning it. | |||
Returns false when there are no more files to try. | |||
*/ | |||
bool skipNextFile(); | |||
/** Returns the description of the plugin that will be scanned during the next | |||
call to scanNextFile(). | |||
@@ -44439,6 +44444,7 @@ class JUCE_API RelativeParallelogram | |||
public: | |||
RelativeParallelogram(); | |||
RelativeParallelogram (const Rectangle<float>& simpleRectangle); | |||
RelativeParallelogram (const RelativePoint& topLeft, const RelativePoint& topRight, const RelativePoint& bottomLeft); | |||
RelativeParallelogram (const String& topLeft, const String& topRight, const String& bottomLeft); | |||
~RelativeParallelogram(); | |||
@@ -44662,28 +44668,18 @@ public: | |||
void setID (const String& newID, UndoManager* undoManager); | |||
static const Identifier idProperty; | |||
static const FillType readFillType (const ValueTree& v, RelativePoint* gradientPoint1, | |||
RelativePoint* gradientPoint2, RelativePoint* gradientPoint3, | |||
Expression::EvaluationContext* nameFinder, | |||
ImageProvider* imageProvider); | |||
static void writeFillType (ValueTree& v, const FillType& fillType, | |||
const RelativePoint* gradientPoint1, const RelativePoint* gradientPoint2, | |||
const RelativePoint* gradientPoint3, ImageProvider* imageProvider, | |||
UndoManager* undoManager); | |||
ValueTree state; | |||
static const Identifier type, gradientPoint1, gradientPoint2, gradientPoint3, | |||
colour, radial, colours, imageId, imageOpacity; | |||
}; | |||
juce_UseDebuggingNewOperator | |||
protected: | |||
friend class DrawableComposite; | |||
/** @internal */ | |||
DrawableComposite* parent; | |||
/** @internal */ | |||
virtual void invalidatePoints() = 0; | |||
/** @internal */ | |||
static Drawable* createChildFromValueTree (DrawableComposite* parent, const ValueTree& tree, ImageProvider* imageProvider); | |||
private: | |||
@@ -55377,7 +55373,7 @@ public: | |||
juce_UseDebuggingNewOperator | |||
private: | |||
friend void JUCE_PUBLIC_FUNCTION shutdownJuce_GUI(); | |||
friend JUCE_API void JUCE_CALLTYPE shutdownJuce_GUI(); | |||
static void clearDefaultLookAndFeel() throw(); // called at shutdown | |||
Array <int> colourIds; | |||
@@ -60271,16 +60267,16 @@ public: | |||
*/ | |||
void bringToFront (int index); | |||
/** Changes the main content area. | |||
/** Returns the main content rectangle. | |||
The content area is actually defined by the markers named "left", "right", "top" and | |||
"bottom", but this method is a shortcut that sets them all at once. | |||
"bottom", but this method is a shortcut that returns them all at once. | |||
@see contentLeftMarkerName, contentRightMarkerName, contentTopMarkerName, contentBottomMarkerName | |||
*/ | |||
const RelativeRectangle getContentArea() const; | |||
/** Returns the main content rectangle. | |||
/** Changes the main content area. | |||
The content area is actually defined by the markers named "left", "right", "top" and | |||
"bottom", but this method is a shortcut that returns them all at once. | |||
"bottom", but this method is a shortcut that sets them all at once. | |||
@see setBoundingBox, contentLeftMarkerName, contentRightMarkerName, contentTopMarkerName, contentBottomMarkerName | |||
*/ | |||
void setContentArea (const RelativeRectangle& newArea); | |||
@@ -60382,11 +60378,10 @@ public: | |||
void setMarker (bool xAxis, const Marker& marker, UndoManager* undoManager); | |||
void removeMarker (bool xAxis, const ValueTree& state, UndoManager* undoManager); | |||
static const Identifier nameProperty, posProperty; | |||
static const Identifier nameProperty, posProperty, topLeft, topRight, bottomLeft; | |||
private: | |||
static const Identifier topLeft, topRight, bottomLeft, childGroupTag, markerGroupTagX, | |||
markerGroupTagY, markerTag; | |||
static const Identifier childGroupTag, markerGroupTagX, markerGroupTagY, markerTag; | |||
ValueTree getChildList() const; | |||
ValueTree getChildListCreating (UndoManager* undoManager); | |||
@@ -60535,30 +60530,29 @@ private: | |||
#ifndef __JUCE_DRAWABLEPATH_JUCEHEADER__ | |||
#define __JUCE_DRAWABLEPATH_JUCEHEADER__ | |||
/*** Start of inlined file: juce_DrawableShape.h ***/ | |||
#ifndef __JUCE_DRAWABLESHAPE_JUCEHEADER__ | |||
#define __JUCE_DRAWABLESHAPE_JUCEHEADER__ | |||
/** | |||
A drawable object which renders a filled or outlined shape. | |||
A base class implementing common functionality for Drawable classes which | |||
consist of some kind of filled and stroked outline. | |||
@see Drawable | |||
@see DrawablePath, DrawableRectangle | |||
*/ | |||
class JUCE_API DrawablePath : public Drawable | |||
class JUCE_API DrawableShape : public Drawable | |||
{ | |||
public: | |||
protected: | |||
/** Creates a DrawablePath. */ | |||
DrawablePath(); | |||
DrawablePath (const DrawablePath& other); | |||
DrawableShape(); | |||
DrawableShape (const DrawableShape&); | |||
public: | |||
/** Destructor. */ | |||
~DrawablePath(); | |||
/** Changes the path that will be drawn. | |||
@see setFillColour, setStrokeType | |||
*/ | |||
void setPath (const Path& newPath); | |||
~DrawableShape(); | |||
/** Sets a fill type for the path. | |||
This colour is used to fill the path - if you don't want the path to be | |||
filled (e.g. if you're just drawing an outline), set this to a transparent | |||
colour. | |||
@@ -60596,23 +60590,125 @@ public: | |||
/** Returns the current outline style. */ | |||
const PathStrokeType& getStrokeType() const throw() { return strokeType; } | |||
/** Returns the current path. */ | |||
const Path& getPath() const; | |||
/** @internal */ | |||
class FillAndStrokeState : public ValueTreeWrapperBase | |||
{ | |||
public: | |||
FillAndStrokeState (const ValueTree& state); | |||
/** Returns the current path for the outline. */ | |||
const Path& getStrokePath() const; | |||
const FillType getMainFill (Expression::EvaluationContext* nameFinder, | |||
ImageProvider* imageProvider) const; | |||
ValueTree getMainFillState(); | |||
void setMainFill (const FillType& newFill, const RelativePoint* gradientPoint1, | |||
const RelativePoint* gradientPoint2, const RelativePoint* gradientPoint3, | |||
ImageProvider* imageProvider, UndoManager* undoManager); | |||
const FillType getStrokeFill (Expression::EvaluationContext* nameFinder, | |||
ImageProvider* imageProvider) const; | |||
ValueTree getStrokeFillState(); | |||
void setStrokeFill (const FillType& newFill, const RelativePoint* gradientPoint1, | |||
const RelativePoint* gradientPoint2, const RelativePoint* gradientPoint3, | |||
ImageProvider* imageProvider, UndoManager* undoManager); | |||
const PathStrokeType getStrokeType() const; | |||
void setStrokeType (const PathStrokeType& newStrokeType, UndoManager* undoManager); | |||
static const FillType readFillType (const ValueTree& v, RelativePoint* gradientPoint1, | |||
RelativePoint* gradientPoint2, RelativePoint* gradientPoint3, | |||
Expression::EvaluationContext* nameFinder, | |||
ImageProvider* imageProvider); | |||
static void writeFillType (ValueTree& v, const FillType& fillType, | |||
const RelativePoint* gradientPoint1, const RelativePoint* gradientPoint2, | |||
const RelativePoint* gradientPoint3, ImageProvider* imageProvider, | |||
UndoManager* undoManager); | |||
static const Identifier type, colour, colours, fill, stroke, path, jointStyle, capStyle, strokeWidth, | |||
gradientPoint1, gradientPoint2, gradientPoint3, radial, imageId, imageOpacity; | |||
}; | |||
/** @internal */ | |||
void invalidatePoints(); | |||
/** @internal */ | |||
void render (const Drawable::RenderingContext& context) const; | |||
/** @internal */ | |||
const Rectangle<float> getBounds() const; | |||
/** @internal */ | |||
bool hitTest (float x, float y) const; | |||
protected: | |||
/** Called when the cached path should be updated. */ | |||
void pathChanged(); | |||
/** Called when the cached stroke should be updated. */ | |||
void strokeChanged(); | |||
/** Implemented by subclasses to regenerate the path. */ | |||
virtual bool rebuildPath (Path& path) const = 0; | |||
/** True if there's a stroke with a non-zero thickness and non-transparent colour. */ | |||
bool isStrokeVisible() const throw(); | |||
/** Updates the details from a FillAndStrokeState object, returning true if something changed. */ | |||
bool refreshFillTypes (const FillAndStrokeState& newState, | |||
Expression::EvaluationContext* nameFinder, | |||
ImageProvider* imageProvider); | |||
/** Writes the stroke and fill details to a FillAndStrokeState object. */ | |||
void writeTo (FillAndStrokeState& state, ImageProvider* imageProvider, UndoManager* undoManager) const; | |||
/** Returns the current cached path outline. */ | |||
const Path& getCachedPath() const; | |||
/** Returns the current cached stroke outline. */ | |||
const Path& getCachedStrokePath() const; | |||
PathStrokeType strokeType; | |||
mutable Path cachedPath, cachedStroke; | |||
private: | |||
FillType mainFill, strokeFill; | |||
mutable bool pathNeedsUpdating, strokeNeedsUpdating; | |||
static void setBrush (const Drawable::RenderingContext& context, const FillType& type); | |||
DrawableShape& operator= (const DrawableShape&); | |||
}; | |||
#endif // __JUCE_DRAWABLESHAPE_JUCEHEADER__ | |||
/*** End of inlined file: juce_DrawableShape.h ***/ | |||
/** | |||
A drawable object which renders a filled or outlined shape. | |||
For details on how to change the fill and stroke, see the DrawableShape class. | |||
@see Drawable, DrawableShape | |||
*/ | |||
class JUCE_API DrawablePath : public DrawableShape | |||
{ | |||
public: | |||
/** Creates a DrawablePath. */ | |||
DrawablePath(); | |||
DrawablePath (const DrawablePath& other); | |||
/** Destructor. */ | |||
~DrawablePath(); | |||
/** Changes the path that will be drawn. | |||
@see setFillColour, setStrokeType | |||
*/ | |||
void setPath (const Path& newPath); | |||
/** Returns the current path. */ | |||
const Path& getPath() const; | |||
/** Returns the current path for the outline. */ | |||
const Path& getStrokePath() const; | |||
/** @internal */ | |||
Drawable* createCopy() const; | |||
/** @internal */ | |||
void invalidatePoints(); | |||
/** @internal */ | |||
const Rectangle<float> refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider); | |||
/** @internal */ | |||
const ValueTree createValueTree (ImageProvider* imageProvider) const; | |||
@@ -60622,28 +60718,11 @@ public: | |||
const Identifier getValueTreeType() const { return valueTreeType; } | |||
/** Internally-used class for wrapping a DrawablePath's state into a ValueTree. */ | |||
class ValueTreeWrapper : public ValueTreeWrapperBase | |||
class ValueTreeWrapper : public FillAndStrokeState | |||
{ | |||
public: | |||
ValueTreeWrapper (const ValueTree& state); | |||
const FillType getMainFill (Expression::EvaluationContext* nameFinder, | |||
ImageProvider* imageProvider) const; | |||
ValueTree getMainFillState(); | |||
void setMainFill (const FillType& newFill, const RelativePoint* gradientPoint1, | |||
const RelativePoint* gradientPoint2, const RelativePoint* gradientPoint3, | |||
ImageProvider* imageProvider, UndoManager* undoManager); | |||
const FillType getStrokeFill (Expression::EvaluationContext* nameFinder, | |||
ImageProvider* imageProvider) const; | |||
ValueTree getStrokeFillState(); | |||
void setStrokeFill (const FillType& newFill, const RelativePoint* gradientPoint1, | |||
const RelativePoint* gradientPoint2, const RelativePoint* gradientPoint3, | |||
ImageProvider* imageProvider, UndoManager* undoManager); | |||
const PathStrokeType getStrokeType() const; | |||
void setStrokeType (const PathStrokeType& newStrokeType, UndoManager* undoManager); | |||
bool usesNonZeroWinding() const; | |||
void setUsesNonZeroWinding (bool b, UndoManager* undoManager); | |||
@@ -60687,22 +60766,16 @@ public: | |||
ValueTree getPathState(); | |||
static const Identifier fill, stroke, path, jointStyle, capStyle, strokeWidth, | |||
nonZeroWinding, point1, point2, point3; | |||
static const Identifier nonZeroWinding, point1, point2, point3; | |||
}; | |||
juce_UseDebuggingNewOperator | |||
protected: | |||
bool rebuildPath (Path& path) const; | |||
private: | |||
FillType mainFill, strokeFill; | |||
PathStrokeType strokeType; | |||
ScopedPointer<RelativePointPath> relativePath; | |||
mutable Path path, stroke; | |||
mutable bool pathNeedsUpdating, strokeNeedsUpdating; | |||
void updatePath() const; | |||
void updateStroke() const; | |||
bool isStrokeVisible() const throw(); | |||
DrawablePath& operator= (const DrawablePath&); | |||
}; | |||
@@ -60711,6 +60784,91 @@ private: | |||
/*** End of inlined file: juce_DrawablePath.h ***/ | |||
#endif | |||
#ifndef __JUCE_DRAWABLERECTANGLE_JUCEHEADER__ | |||
/*** Start of inlined file: juce_DrawableRectangle.h ***/ | |||
#ifndef __JUCE_DRAWABLERECTANGLE_JUCEHEADER__ | |||
#define __JUCE_DRAWABLERECTANGLE_JUCEHEADER__ | |||
/** | |||
A Drawable object which draws a rectangle. | |||
For details on how to change the fill and stroke, see the DrawableShape class. | |||
@see Drawable, DrawableShape | |||
*/ | |||
class JUCE_API DrawableRectangle : public DrawableShape | |||
{ | |||
public: | |||
DrawableRectangle(); | |||
DrawableRectangle (const DrawableRectangle& other); | |||
/** Destructor. */ | |||
~DrawableRectangle(); | |||
/** Sets the rectangle's bounds. */ | |||
void setRectangle (const RelativeParallelogram& newBounds); | |||
/** Returns the rectangle's bounds. */ | |||
const RelativeParallelogram& getRectangle() const throw() { return bounds; } | |||
/** Returns the corner size to be used. */ | |||
const RelativePoint getCornerSize() const { return cornerSize; } | |||
/** Sets a new corner size for the rectangle */ | |||
void setCornerSize (const RelativePoint& newSize); | |||
/** @internal */ | |||
Drawable* createCopy() const; | |||
/** @internal */ | |||
const Rectangle<float> refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider); | |||
/** @internal */ | |||
const ValueTree createValueTree (ImageProvider* imageProvider) const; | |||
/** @internal */ | |||
static const Identifier valueTreeType; | |||
/** @internal */ | |||
const Identifier getValueTreeType() const { return valueTreeType; } | |||
/** Internally-used class for wrapping a DrawableRectangle's state into a ValueTree. */ | |||
class ValueTreeWrapper : public FillAndStrokeState | |||
{ | |||
public: | |||
ValueTreeWrapper (const ValueTree& state); | |||
const RelativeParallelogram getRectangle() const; | |||
void setRectangle (const RelativeParallelogram& newBounds, UndoManager* undoManager); | |||
void setCornerSize (const RelativePoint& cornerSize, UndoManager* undoManager); | |||
const RelativePoint getCornerSize() const; | |||
Value getCornerSizeValue (UndoManager* undoManager) const; | |||
static const Identifier topLeft, topRight, bottomLeft, cornerSize; | |||
}; | |||
juce_UseDebuggingNewOperator | |||
protected: | |||
/** @internal */ | |||
bool rebuildPath (Path& path) const; | |||
private: | |||
RelativeParallelogram bounds; | |||
RelativePoint cornerSize; | |||
const AffineTransform calculateTransform() const; | |||
DrawableRectangle& operator= (const DrawableRectangle&); | |||
}; | |||
#endif // __JUCE_DRAWABLERECTANGLE_JUCEHEADER__ | |||
/*** End of inlined file: juce_DrawableRectangle.h ***/ | |||
#endif | |||
#ifndef __JUCE_DRAWABLESHAPE_JUCEHEADER__ | |||
#endif | |||
#ifndef __JUCE_DRAWABLETEXT_JUCEHEADER__ | |||
@@ -190,14 +190,12 @@ bool ApplicationCommandManager::invoke (const ApplicationCommandTarget::Invocati | |||
// manager first.. | |||
jassert (MessageManager::getInstance()->currentThreadHasLockedMessageManager()); | |||
ApplicationCommandTarget* const target = getFirstCommandTarget (info_.commandID); | |||
ApplicationCommandInfo commandInfo (0); | |||
ApplicationCommandTarget* const target = getTargetForCommand (info_.commandID, commandInfo); | |||
if (target == 0) | |||
return false; | |||
ApplicationCommandInfo commandInfo (0); | |||
target->getCommandInfo (info_.commandID, commandInfo); | |||
ApplicationCommandTarget::InvocationInfo info (info_); | |||
info.commandFlags = commandInfo.flags; | |||
@@ -33,7 +33,7 @@ | |||
*/ | |||
#define JUCE_MAJOR_VERSION 1 | |||
#define JUCE_MINOR_VERSION 52 | |||
#define JUCE_BUILDNUMBER 78 | |||
#define JUCE_BUILDNUMBER 79 | |||
/** Current Juce version number. | |||
@@ -30,6 +30,7 @@ BEGIN_JUCE_NAMESPACE | |||
#include "juce_Drawable.h" | |||
#include "juce_DrawableComposite.h" | |||
#include "juce_DrawablePath.h" | |||
#include "juce_DrawableRectangle.h" | |||
#include "juce_DrawableImage.h" | |||
#include "juce_DrawableText.h" | |||
#include "../imaging/juce_ImageFileFormat.h" | |||
@@ -139,6 +140,8 @@ Drawable* Drawable::createChildFromValueTree (DrawableComposite* parent, const V | |||
d = new DrawablePath(); | |||
else if (type == DrawableComposite::valueTreeType) | |||
d = new DrawableComposite(); | |||
else if (type == DrawableRectangle::valueTreeType) | |||
d = new DrawableRectangle(); | |||
else if (type == DrawableImage::valueTreeType) | |||
d = new DrawableImage(); | |||
else if (type == DrawableText::valueTreeType) | |||
@@ -156,15 +159,6 @@ Drawable* Drawable::createChildFromValueTree (DrawableComposite* parent, const V | |||
//============================================================================== | |||
const Identifier Drawable::ValueTreeWrapperBase::idProperty ("id"); | |||
const Identifier Drawable::ValueTreeWrapperBase::type ("type"); | |||
const Identifier Drawable::ValueTreeWrapperBase::gradientPoint1 ("point1"); | |||
const Identifier Drawable::ValueTreeWrapperBase::gradientPoint2 ("point2"); | |||
const Identifier Drawable::ValueTreeWrapperBase::gradientPoint3 ("point3"); | |||
const Identifier Drawable::ValueTreeWrapperBase::colour ("colour"); | |||
const Identifier Drawable::ValueTreeWrapperBase::radial ("radial"); | |||
const Identifier Drawable::ValueTreeWrapperBase::colours ("colours"); | |||
const Identifier Drawable::ValueTreeWrapperBase::imageId ("imageId"); | |||
const Identifier Drawable::ValueTreeWrapperBase::imageOpacity ("imageOpacity"); | |||
Drawable::ValueTreeWrapperBase::ValueTreeWrapperBase (const ValueTree& state_) | |||
: state (state_) | |||
@@ -188,119 +182,5 @@ void Drawable::ValueTreeWrapperBase::setID (const String& newID, UndoManager* co | |||
state.setProperty (idProperty, newID, undoManager); | |||
} | |||
const FillType Drawable::ValueTreeWrapperBase::readFillType (const ValueTree& v, RelativePoint* const gp1, RelativePoint* const gp2, RelativePoint* const gp3, | |||
Expression::EvaluationContext* const nameFinder, ImageProvider* imageProvider) | |||
{ | |||
const String newType (v[type].toString()); | |||
if (newType == "solid") | |||
{ | |||
const String colourString (v [colour].toString()); | |||
return FillType (Colour (colourString.isEmpty() ? (uint32) 0xff000000 | |||
: (uint32) colourString.getHexValue32())); | |||
} | |||
else if (newType == "gradient") | |||
{ | |||
RelativePoint p1 (v [gradientPoint1]), p2 (v [gradientPoint2]), p3 (v [gradientPoint3]); | |||
ColourGradient g; | |||
if (gp1 != 0) *gp1 = p1; | |||
if (gp2 != 0) *gp2 = p2; | |||
if (gp3 != 0) *gp3 = p3; | |||
g.point1 = p1.resolve (nameFinder); | |||
g.point2 = p2.resolve (nameFinder); | |||
g.isRadial = v[radial]; | |||
StringArray colourSteps; | |||
colourSteps.addTokens (v[colours].toString(), false); | |||
for (int i = 0; i < colourSteps.size() / 2; ++i) | |||
g.addColour (colourSteps[i * 2].getDoubleValue(), | |||
Colour ((uint32) colourSteps[i * 2 + 1].getHexValue32())); | |||
FillType fillType (g); | |||
if (g.isRadial) | |||
{ | |||
const Point<float> point3 (p3.resolve (nameFinder)); | |||
const Point<float> point3Source (g.point1.getX() + g.point2.getY() - g.point1.getY(), | |||
g.point1.getY() + g.point1.getX() - g.point2.getX()); | |||
fillType.transform = AffineTransform::fromTargetPoints (g.point1.getX(), g.point1.getY(), g.point1.getX(), g.point1.getY(), | |||
g.point2.getX(), g.point2.getY(), g.point2.getX(), g.point2.getY(), | |||
point3Source.getX(), point3Source.getY(), point3.getX(), point3.getY()); | |||
} | |||
return fillType; | |||
} | |||
else if (newType == "image") | |||
{ | |||
Image im; | |||
if (imageProvider != 0) | |||
im = imageProvider->getImageForIdentifier (v[imageId]); | |||
FillType f (im, AffineTransform::identity); | |||
f.setOpacity ((float) v.getProperty (imageOpacity, 1.0f)); | |||
return f; | |||
} | |||
jassertfalse; | |||
return FillType(); | |||
} | |||
static const Point<float> calcThirdGradientPoint (const FillType& fillType) | |||
{ | |||
const ColourGradient& g = *fillType.gradient; | |||
const Point<float> point3Source (g.point1.getX() + g.point2.getY() - g.point1.getY(), | |||
g.point1.getY() + g.point1.getX() - g.point2.getX()); | |||
return point3Source.transformedBy (fillType.transform); | |||
} | |||
void Drawable::ValueTreeWrapperBase::writeFillType (ValueTree& v, const FillType& fillType, | |||
const RelativePoint* const gp1, const RelativePoint* const gp2, const RelativePoint* gp3, | |||
ImageProvider* imageProvider, UndoManager* const undoManager) | |||
{ | |||
if (fillType.isColour()) | |||
{ | |||
v.setProperty (type, "solid", undoManager); | |||
v.setProperty (colour, String::toHexString ((int) fillType.colour.getARGB()), undoManager); | |||
} | |||
else if (fillType.isGradient()) | |||
{ | |||
v.setProperty (type, "gradient", undoManager); | |||
v.setProperty (gradientPoint1, gp1 != 0 ? gp1->toString() : fillType.gradient->point1.toString(), undoManager); | |||
v.setProperty (gradientPoint2, gp2 != 0 ? gp2->toString() : fillType.gradient->point2.toString(), undoManager); | |||
v.setProperty (gradientPoint3, gp3 != 0 ? gp3->toString() : calcThirdGradientPoint (fillType).toString(), undoManager); | |||
v.setProperty (radial, fillType.gradient->isRadial, undoManager); | |||
String s; | |||
for (int i = 0; i < fillType.gradient->getNumColours(); ++i) | |||
s << ' ' << fillType.gradient->getColourPosition (i) | |||
<< ' ' << String::toHexString ((int) fillType.gradient->getColour(i).getARGB()); | |||
v.setProperty (colours, s.trimStart(), undoManager); | |||
} | |||
else if (fillType.isTiledImage()) | |||
{ | |||
v.setProperty (type, "image", undoManager); | |||
if (imageProvider != 0) | |||
v.setProperty (imageId, imageProvider->getIdentifierForImage (fillType.image), undoManager); | |||
if (fillType.getOpacity() < 1.0f) | |||
v.setProperty (imageOpacity, fillType.getOpacity(), undoManager); | |||
else | |||
v.removeProperty (imageOpacity, undoManager); | |||
} | |||
else | |||
{ | |||
jassertfalse; | |||
} | |||
} | |||
END_JUCE_NAMESPACE |
@@ -242,19 +242,7 @@ public: | |||
void setID (const String& newID, UndoManager* undoManager); | |||
static const Identifier idProperty; | |||
static const FillType readFillType (const ValueTree& v, RelativePoint* gradientPoint1, | |||
RelativePoint* gradientPoint2, RelativePoint* gradientPoint3, | |||
Expression::EvaluationContext* nameFinder, | |||
ImageProvider* imageProvider); | |||
static void writeFillType (ValueTree& v, const FillType& fillType, | |||
const RelativePoint* gradientPoint1, const RelativePoint* gradientPoint2, | |||
const RelativePoint* gradientPoint3, ImageProvider* imageProvider, | |||
UndoManager* undoManager); | |||
ValueTree state; | |||
static const Identifier type, gradientPoint1, gradientPoint2, gradientPoint3, | |||
colour, radial, colours, imageId, imageOpacity; | |||
}; | |||
//============================================================================== | |||
@@ -262,9 +250,11 @@ public: | |||
protected: | |||
friend class DrawableComposite; | |||
/** @internal */ | |||
DrawableComposite* parent; | |||
/** @internal */ | |||
virtual void invalidatePoints() = 0; | |||
/** @internal */ | |||
static Drawable* createChildFromValueTree (DrawableComposite* parent, const ValueTree& tree, ImageProvider* imageProvider); | |||
private: | |||
@@ -119,16 +119,16 @@ public: | |||
void bringToFront (int index); | |||
//============================================================================== | |||
/** Changes the main content area. | |||
/** Returns the main content rectangle. | |||
The content area is actually defined by the markers named "left", "right", "top" and | |||
"bottom", but this method is a shortcut that sets them all at once. | |||
"bottom", but this method is a shortcut that returns them all at once. | |||
@see contentLeftMarkerName, contentRightMarkerName, contentTopMarkerName, contentBottomMarkerName | |||
*/ | |||
const RelativeRectangle getContentArea() const; | |||
/** Returns the main content rectangle. | |||
/** Changes the main content area. | |||
The content area is actually defined by the markers named "left", "right", "top" and | |||
"bottom", but this method is a shortcut that returns them all at once. | |||
"bottom", but this method is a shortcut that sets them all at once. | |||
@see setBoundingBox, contentLeftMarkerName, contentRightMarkerName, contentTopMarkerName, contentBottomMarkerName | |||
*/ | |||
void setContentArea (const RelativeRectangle& newArea); | |||
@@ -233,11 +233,10 @@ public: | |||
void setMarker (bool xAxis, const Marker& marker, UndoManager* undoManager); | |||
void removeMarker (bool xAxis, const ValueTree& state, UndoManager* undoManager); | |||
static const Identifier nameProperty, posProperty; | |||
static const Identifier nameProperty, posProperty, topLeft, topRight, bottomLeft; | |||
private: | |||
static const Identifier topLeft, topRight, bottomLeft, childGroupTag, markerGroupTagX, | |||
markerGroupTagY, markerTag; | |||
static const Identifier childGroupTag, markerGroupTagX, markerGroupTagY, markerTag; | |||
ValueTree getChildList() const; | |||
ValueTree getChildListCreating (UndoManager* undoManager); | |||
@@ -29,170 +29,63 @@ BEGIN_JUCE_NAMESPACE | |||
#include "juce_DrawablePath.h" | |||
#include "juce_DrawableComposite.h" | |||
#include "../../../io/streams/juce_MemoryOutputStream.h" | |||
//============================================================================== | |||
DrawablePath::DrawablePath() | |||
: mainFill (Colours::black), | |||
strokeFill (Colours::black), | |||
strokeType (0.0f), | |||
pathNeedsUpdating (true), | |||
strokeNeedsUpdating (true) | |||
{ | |||
} | |||
DrawablePath::DrawablePath (const DrawablePath& other) | |||
: mainFill (other.mainFill), | |||
strokeFill (other.strokeFill), | |||
strokeType (other.strokeType), | |||
pathNeedsUpdating (true), | |||
strokeNeedsUpdating (true) | |||
: DrawableShape (other) | |||
{ | |||
if (other.relativePath != 0) | |||
relativePath = new RelativePointPath (*other.relativePath); | |||
else | |||
path = other.path; | |||
cachedPath = other.cachedPath; | |||
} | |||
DrawablePath::~DrawablePath() | |||
{ | |||
} | |||
//============================================================================== | |||
void DrawablePath::setPath (const Path& newPath) | |||
{ | |||
path = newPath; | |||
strokeNeedsUpdating = true; | |||
} | |||
void DrawablePath::setFill (const FillType& newFill) | |||
{ | |||
mainFill = newFill; | |||
} | |||
void DrawablePath::setStrokeFill (const FillType& newFill) | |||
{ | |||
strokeFill = newFill; | |||
} | |||
void DrawablePath::setStrokeType (const PathStrokeType& newStrokeType) | |||
{ | |||
strokeType = newStrokeType; | |||
strokeNeedsUpdating = true; | |||
} | |||
void DrawablePath::setStrokeThickness (const float newThickness) | |||
{ | |||
setStrokeType (PathStrokeType (newThickness, strokeType.getJointStyle(), strokeType.getEndStyle())); | |||
} | |||
void DrawablePath::updatePath() const | |||
Drawable* DrawablePath::createCopy() const | |||
{ | |||
if (pathNeedsUpdating) | |||
{ | |||
pathNeedsUpdating = false; | |||
if (relativePath != 0) | |||
{ | |||
path.clear(); | |||
relativePath->createPath (path, parent); | |||
strokeNeedsUpdating = true; | |||
} | |||
} | |||
return new DrawablePath (*this); | |||
} | |||
void DrawablePath::updateStroke() const | |||
//============================================================================== | |||
void DrawablePath::setPath (const Path& newPath) | |||
{ | |||
if (strokeNeedsUpdating) | |||
{ | |||
strokeNeedsUpdating = false; | |||
updatePath(); | |||
stroke.clear(); | |||
strokeType.createStrokedPath (stroke, path, AffineTransform::identity, 4.0f); | |||
} | |||
cachedPath = newPath; | |||
strokeChanged(); | |||
} | |||
const Path& DrawablePath::getPath() const | |||
{ | |||
updatePath(); | |||
return path; | |||
return getCachedPath(); | |||
} | |||
const Path& DrawablePath::getStrokePath() const | |||
{ | |||
updateStroke(); | |||
return stroke; | |||
} | |||
bool DrawablePath::isStrokeVisible() const throw() | |||
{ | |||
return strokeType.getStrokeThickness() > 0.0f && ! strokeFill.isInvisible(); | |||
} | |||
void DrawablePath::invalidatePoints() | |||
{ | |||
pathNeedsUpdating = true; | |||
strokeNeedsUpdating = true; | |||
return getCachedStrokePath(); | |||
} | |||
//============================================================================== | |||
void DrawablePath::render (const Drawable::RenderingContext& context) const | |||
bool DrawablePath::rebuildPath (Path& path) const | |||
{ | |||
if (relativePath != 0) | |||
{ | |||
FillType f (mainFill); | |||
if (f.isGradient()) | |||
f.gradient->multiplyOpacity (context.opacity); | |||
else | |||
f.setOpacity (f.getOpacity() * context.opacity); | |||
f.transform = f.transform.followedBy (context.transform); | |||
context.g.setFillType (f); | |||
context.g.fillPath (getPath(), context.transform); | |||
} | |||
if (isStrokeVisible()) | |||
{ | |||
FillType f (strokeFill); | |||
if (f.isGradient()) | |||
f.gradient->multiplyOpacity (context.opacity); | |||
else | |||
f.setOpacity (f.getOpacity() * context.opacity); | |||
f.transform = f.transform.followedBy (context.transform); | |||
context.g.setFillType (f); | |||
context.g.fillPath (getStrokePath(), context.transform); | |||
path.clear(); | |||
relativePath->createPath (path, parent); | |||
return true; | |||
} | |||
} | |||
const Rectangle<float> DrawablePath::getBounds() const | |||
{ | |||
if (isStrokeVisible()) | |||
return getStrokePath().getBounds(); | |||
else | |||
return getPath().getBounds(); | |||
} | |||
bool DrawablePath::hitTest (float x, float y) const | |||
{ | |||
return getPath().contains (x, y) | |||
|| (isStrokeVisible() && getStrokePath().contains (x, y)); | |||
} | |||
Drawable* DrawablePath::createCopy() const | |||
{ | |||
return new DrawablePath (*this); | |||
return false; | |||
} | |||
//============================================================================== | |||
const Identifier DrawablePath::valueTreeType ("Path"); | |||
const Identifier DrawablePath::ValueTreeWrapper::fill ("Fill"); | |||
const Identifier DrawablePath::ValueTreeWrapper::stroke ("Stroke"); | |||
const Identifier DrawablePath::ValueTreeWrapper::path ("Path"); | |||
const Identifier DrawablePath::ValueTreeWrapper::jointStyle ("jointStyle"); | |||
const Identifier DrawablePath::ValueTreeWrapper::capStyle ("capStyle"); | |||
const Identifier DrawablePath::ValueTreeWrapper::strokeWidth ("strokeWidth"); | |||
const Identifier DrawablePath::ValueTreeWrapper::nonZeroWinding ("nonZeroWinding"); | |||
const Identifier DrawablePath::ValueTreeWrapper::point1 ("p1"); | |||
const Identifier DrawablePath::ValueTreeWrapper::point2 ("p2"); | |||
@@ -200,7 +93,7 @@ const Identifier DrawablePath::ValueTreeWrapper::point3 ("p3"); | |||
//============================================================================== | |||
DrawablePath::ValueTreeWrapper::ValueTreeWrapper (const ValueTree& state_) | |||
: ValueTreeWrapperBase (state_) | |||
: FillAndStrokeState (state_) | |||
{ | |||
jassert (state.hasType (valueTreeType)); | |||
} | |||
@@ -210,77 +103,6 @@ ValueTree DrawablePath::ValueTreeWrapper::getPathState() | |||
return state.getOrCreateChildWithName (path, 0); | |||
} | |||
ValueTree DrawablePath::ValueTreeWrapper::getMainFillState() | |||
{ | |||
ValueTree v (state.getChildWithName (fill)); | |||
if (v.isValid()) | |||
return v; | |||
setMainFill (Colours::black, 0, 0, 0, 0, 0); | |||
return getMainFillState(); | |||
} | |||
ValueTree DrawablePath::ValueTreeWrapper::getStrokeFillState() | |||
{ | |||
ValueTree v (state.getChildWithName (stroke)); | |||
if (v.isValid()) | |||
return v; | |||
setStrokeFill (Colours::black, 0, 0, 0, 0, 0); | |||
return getStrokeFillState(); | |||
} | |||
const FillType DrawablePath::ValueTreeWrapper::getMainFill (Expression::EvaluationContext* nameFinder, | |||
ImageProvider* imageProvider) const | |||
{ | |||
return readFillType (state.getChildWithName (fill), 0, 0, 0, nameFinder, imageProvider); | |||
} | |||
void DrawablePath::ValueTreeWrapper::setMainFill (const FillType& newFill, const RelativePoint* gp1, | |||
const RelativePoint* gp2, const RelativePoint* gp3, | |||
ImageProvider* imageProvider, UndoManager* undoManager) | |||
{ | |||
ValueTree v (state.getOrCreateChildWithName (fill, undoManager)); | |||
writeFillType (v, newFill, gp1, gp2, gp3, imageProvider, undoManager); | |||
} | |||
const FillType DrawablePath::ValueTreeWrapper::getStrokeFill (Expression::EvaluationContext* nameFinder, | |||
ImageProvider* imageProvider) const | |||
{ | |||
return readFillType (state.getChildWithName (stroke), 0, 0, 0, nameFinder, imageProvider); | |||
} | |||
void DrawablePath::ValueTreeWrapper::setStrokeFill (const FillType& newFill, const RelativePoint* gp1, | |||
const RelativePoint* gp2, const RelativePoint* gp3, | |||
ImageProvider* imageProvider, UndoManager* undoManager) | |||
{ | |||
ValueTree v (state.getOrCreateChildWithName (stroke, undoManager)); | |||
writeFillType (v, newFill, gp1, gp2, gp3, imageProvider, undoManager); | |||
} | |||
const PathStrokeType DrawablePath::ValueTreeWrapper::getStrokeType() const | |||
{ | |||
const String jointStyleString (state [jointStyle].toString()); | |||
const String capStyleString (state [capStyle].toString()); | |||
return PathStrokeType (state [strokeWidth], | |||
jointStyleString == "curved" ? PathStrokeType::curved | |||
: (jointStyleString == "bevel" ? PathStrokeType::beveled | |||
: PathStrokeType::mitered), | |||
capStyleString == "square" ? PathStrokeType::square | |||
: (capStyleString == "round" ? PathStrokeType::rounded | |||
: PathStrokeType::butt)); | |||
} | |||
void DrawablePath::ValueTreeWrapper::setStrokeType (const PathStrokeType& newStrokeType, UndoManager* undoManager) | |||
{ | |||
state.setProperty (strokeWidth, (double) newStrokeType.getStrokeThickness(), undoManager); | |||
state.setProperty (jointStyle, newStrokeType.getJointStyle() == PathStrokeType::mitered | |||
? "miter" : (newStrokeType.getJointStyle() == PathStrokeType::curved ? "curved" : "bevel"), undoManager); | |||
state.setProperty (capStyle, newStrokeType.getEndStyle() == PathStrokeType::butt | |||
? "butt" : (newStrokeType.getEndStyle() == PathStrokeType::square ? "square" : "round"), undoManager); | |||
} | |||
bool DrawablePath::ValueTreeWrapper::usesNonZeroWinding() const | |||
{ | |||
return state [nonZeroWinding]; | |||
@@ -620,24 +442,7 @@ const Rectangle<float> DrawablePath::refreshFromValueTree (const ValueTree& tree | |||
ValueTreeWrapper v (tree); | |||
setName (v.getID()); | |||
bool needsRedraw = false; | |||
const FillType newFill (v.getMainFill (parent, imageProvider)); | |||
if (mainFill != newFill) | |||
{ | |||
needsRedraw = true; | |||
mainFill = newFill; | |||
} | |||
const FillType newStrokeFill (v.getStrokeFill (parent, imageProvider)); | |||
if (strokeFill != newStrokeFill) | |||
{ | |||
needsRedraw = true; | |||
strokeFill = newStrokeFill; | |||
} | |||
const PathStrokeType newStroke (v.getStrokeType()); | |||
bool needsRedraw = refreshFillTypes (v, parent, imageProvider); | |||
ScopedPointer<RelativePointPath> newRelativePath (new RelativePointPath (tree)); | |||
@@ -647,11 +452,12 @@ const Rectangle<float> DrawablePath::refreshFromValueTree (const ValueTree& tree | |||
if (! newRelativePath->containsAnyDynamicPoints()) | |||
newRelativePath = 0; | |||
if (strokeType != newStroke || path != newPath) | |||
const PathStrokeType newStroke (v.getStrokeType()); | |||
if (strokeType != newStroke || cachedPath != newPath) | |||
{ | |||
damageRect = getBounds(); | |||
path.swapWithPath (newPath); | |||
strokeNeedsUpdating = true; | |||
cachedPath.swapWithPath (newPath); | |||
strokeChanged(); | |||
strokeType = newStroke; | |||
needsRedraw = true; | |||
} | |||
@@ -670,9 +476,7 @@ const ValueTree DrawablePath::createValueTree (ImageProvider* imageProvider) con | |||
ValueTreeWrapper v (tree); | |||
v.setID (getName(), 0); | |||
v.setMainFill (mainFill, 0, 0, 0, imageProvider, 0); | |||
v.setStrokeFill (strokeFill, 0, 0, 0, imageProvider, 0); | |||
v.setStrokeType (strokeType, 0); | |||
writeTo (v, imageProvider, 0); | |||
if (relativePath != 0) | |||
{ | |||
@@ -680,7 +484,7 @@ const ValueTree DrawablePath::createValueTree (ImageProvider* imageProvider) con | |||
} | |||
else | |||
{ | |||
RelativePointPath rp (path); | |||
RelativePointPath rp (getCachedPath()); | |||
rp.writeTo (tree, 0); | |||
} | |||
@@ -26,18 +26,18 @@ | |||
#ifndef __JUCE_DRAWABLEPATH_JUCEHEADER__ | |||
#define __JUCE_DRAWABLEPATH_JUCEHEADER__ | |||
#include "juce_Drawable.h" | |||
#include "../colour/juce_ColourGradient.h" | |||
#include "../contexts/juce_FillType.h" | |||
#include "juce_DrawableShape.h" | |||
//============================================================================== | |||
/** | |||
A drawable object which renders a filled or outlined shape. | |||
@see Drawable | |||
For details on how to change the fill and stroke, see the DrawableShape class. | |||
@see Drawable, DrawableShape | |||
*/ | |||
class JUCE_API DrawablePath : public Drawable | |||
class JUCE_API DrawablePath : public DrawableShape | |||
{ | |||
public: | |||
//============================================================================== | |||
@@ -50,52 +50,10 @@ public: | |||
//============================================================================== | |||
/** Changes the path that will be drawn. | |||
@see setFillColour, setStrokeType | |||
*/ | |||
void setPath (const Path& newPath); | |||
/** Sets a fill type for the path. | |||
This colour is used to fill the path - if you don't want the path to be | |||
filled (e.g. if you're just drawing an outline), set this to a transparent | |||
colour. | |||
@see setPath, setStrokeFill | |||
*/ | |||
void setFill (const FillType& newFill); | |||
/** Returns the current fill type. | |||
@see setFill | |||
*/ | |||
const FillType& getFill() const throw() { return mainFill; } | |||
/** Sets the fill type with which the outline will be drawn. | |||
@see setFill | |||
*/ | |||
void setStrokeFill (const FillType& newStrokeFill); | |||
/** Returns the current stroke fill. | |||
@see setStrokeFill | |||
*/ | |||
const FillType& getStrokeFill() const throw() { return strokeFill; } | |||
/** Changes the properties of the outline that will be drawn around the path. | |||
If the stroke has 0 thickness, no stroke will be drawn. | |||
@see setStrokeThickness, setStrokeColour | |||
*/ | |||
void setStrokeType (const PathStrokeType& newStrokeType); | |||
/** Changes the stroke thickness. | |||
This is a shortcut for calling setStrokeType. | |||
*/ | |||
void setStrokeThickness (float newThickness); | |||
/** Returns the current outline style. */ | |||
const PathStrokeType& getStrokeType() const throw() { return strokeType; } | |||
//============================================================================== | |||
/** Returns the current path. */ | |||
const Path& getPath() const; | |||
@@ -104,16 +62,8 @@ public: | |||
//============================================================================== | |||
/** @internal */ | |||
void render (const Drawable::RenderingContext& context) const; | |||
/** @internal */ | |||
const Rectangle<float> getBounds() const; | |||
/** @internal */ | |||
bool hitTest (float x, float y) const; | |||
/** @internal */ | |||
Drawable* createCopy() const; | |||
/** @internal */ | |||
void invalidatePoints(); | |||
/** @internal */ | |||
const Rectangle<float> refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider); | |||
/** @internal */ | |||
const ValueTree createValueTree (ImageProvider* imageProvider) const; | |||
@@ -124,28 +74,11 @@ public: | |||
//============================================================================== | |||
/** Internally-used class for wrapping a DrawablePath's state into a ValueTree. */ | |||
class ValueTreeWrapper : public ValueTreeWrapperBase | |||
class ValueTreeWrapper : public FillAndStrokeState | |||
{ | |||
public: | |||
ValueTreeWrapper (const ValueTree& state); | |||
const FillType getMainFill (Expression::EvaluationContext* nameFinder, | |||
ImageProvider* imageProvider) const; | |||
ValueTree getMainFillState(); | |||
void setMainFill (const FillType& newFill, const RelativePoint* gradientPoint1, | |||
const RelativePoint* gradientPoint2, const RelativePoint* gradientPoint3, | |||
ImageProvider* imageProvider, UndoManager* undoManager); | |||
const FillType getStrokeFill (Expression::EvaluationContext* nameFinder, | |||
ImageProvider* imageProvider) const; | |||
ValueTree getStrokeFillState(); | |||
void setStrokeFill (const FillType& newFill, const RelativePoint* gradientPoint1, | |||
const RelativePoint* gradientPoint2, const RelativePoint* gradientPoint3, | |||
ImageProvider* imageProvider, UndoManager* undoManager); | |||
const PathStrokeType getStrokeType() const; | |||
void setStrokeType (const PathStrokeType& newStrokeType, UndoManager* undoManager); | |||
bool usesNonZeroWinding() const; | |||
void setUsesNonZeroWinding (bool b, UndoManager* undoManager); | |||
@@ -189,23 +122,17 @@ public: | |||
ValueTree getPathState(); | |||
static const Identifier fill, stroke, path, jointStyle, capStyle, strokeWidth, | |||
nonZeroWinding, point1, point2, point3; | |||
static const Identifier nonZeroWinding, point1, point2, point3; | |||
}; | |||
//============================================================================== | |||
juce_UseDebuggingNewOperator | |||
protected: | |||
bool rebuildPath (Path& path) const; | |||
private: | |||
FillType mainFill, strokeFill; | |||
PathStrokeType strokeType; | |||
ScopedPointer<RelativePointPath> relativePath; | |||
mutable Path path, stroke; | |||
mutable bool pathNeedsUpdating, strokeNeedsUpdating; | |||
void updatePath() const; | |||
void updateStroke() const; | |||
bool isStrokeVisible() const throw(); | |||
DrawablePath& operator= (const DrawablePath&); | |||
}; | |||
@@ -0,0 +1,189 @@ | |||
/* | |||
============================================================================== | |||
This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||
Copyright 2004-10 by Raw Material Software Ltd. | |||
------------------------------------------------------------------------------ | |||
JUCE can be redistributed and/or modified under the terms of the GNU General | |||
Public License (Version 2), as published by the Free Software Foundation. | |||
A copy of the license is included in the JUCE distribution, or can be found | |||
online at www.gnu.org/licenses. | |||
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY | |||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||
A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||
------------------------------------------------------------------------------ | |||
To release a closed-source product which uses JUCE, commercial licenses are | |||
available: visit www.rawmaterialsoftware.com/juce for more information. | |||
============================================================================== | |||
*/ | |||
#include "../../../core/juce_StandardHeader.h" | |||
BEGIN_JUCE_NAMESPACE | |||
#include "juce_DrawableRectangle.h" | |||
#include "juce_DrawableComposite.h" | |||
//============================================================================== | |||
DrawableRectangle::DrawableRectangle() | |||
{ | |||
} | |||
DrawableRectangle::DrawableRectangle (const DrawableRectangle& other) | |||
: DrawableShape (other) | |||
{ | |||
} | |||
DrawableRectangle::~DrawableRectangle() | |||
{ | |||
} | |||
Drawable* DrawableRectangle::createCopy() const | |||
{ | |||
return new DrawableRectangle (*this); | |||
} | |||
//============================================================================== | |||
void DrawableRectangle::setRectangle (const RelativeParallelogram& newBounds) | |||
{ | |||
bounds = newBounds; | |||
pathChanged(); | |||
strokeChanged(); | |||
} | |||
void DrawableRectangle::setCornerSize (const RelativePoint& newSize) | |||
{ | |||
cornerSize = newSize; | |||
pathChanged(); | |||
strokeChanged(); | |||
} | |||
//============================================================================== | |||
bool DrawableRectangle::rebuildPath (Path& path) const | |||
{ | |||
Point<float> points[3]; | |||
bounds.resolveThreePoints (points, parent); | |||
const float w = Line<float> (points[0], points[1]).getLength(); | |||
const float h = Line<float> (points[0], points[2]).getLength(); | |||
const float cornerSizeX = cornerSize.x.resolve (parent); | |||
const float cornerSizeY = cornerSize.y.resolve (parent); | |||
path.clear(); | |||
if (cornerSizeX > 0 && cornerSizeY > 0) | |||
path.addRoundedRectangle (0, 0, w, h, cornerSizeX, cornerSizeY); | |||
else | |||
path.addRectangle (0, 0, w, h); | |||
path.applyTransform (AffineTransform::fromTargetPoints (0, 0, points[0].getX(), points[0].getY(), | |||
w, 0, points[1].getX(), points[1].getY(), | |||
0, h, points[2].getX(), points[2].getY())); | |||
return true; | |||
} | |||
const AffineTransform DrawableRectangle::calculateTransform() const | |||
{ | |||
Point<float> resolved[3]; | |||
bounds.resolveThreePoints (resolved, parent); | |||
return AffineTransform::fromTargetPoints (resolved[0].getX(), resolved[0].getY(), | |||
resolved[1].getX(), resolved[1].getY(), | |||
resolved[2].getX(), resolved[2].getY()); | |||
} | |||
//============================================================================== | |||
const Identifier DrawableRectangle::valueTreeType ("Rectangle"); | |||
const Identifier DrawableRectangle::ValueTreeWrapper::topLeft ("topLeft"); | |||
const Identifier DrawableRectangle::ValueTreeWrapper::topRight ("topRight"); | |||
const Identifier DrawableRectangle::ValueTreeWrapper::bottomLeft ("bottomLeft"); | |||
const Identifier DrawableRectangle::ValueTreeWrapper::cornerSize ("cornerSize"); | |||
//============================================================================== | |||
DrawableRectangle::ValueTreeWrapper::ValueTreeWrapper (const ValueTree& state_) | |||
: FillAndStrokeState (state_) | |||
{ | |||
jassert (state.hasType (valueTreeType)); | |||
} | |||
const RelativeParallelogram DrawableRectangle::ValueTreeWrapper::getRectangle() const | |||
{ | |||
return RelativeParallelogram (state.getProperty (topLeft, "0, 0"), | |||
state.getProperty (topRight, "100, 0"), | |||
state.getProperty (bottomLeft, "0, 100")); | |||
} | |||
void DrawableRectangle::ValueTreeWrapper::setRectangle (const RelativeParallelogram& newBounds, UndoManager* undoManager) | |||
{ | |||
state.setProperty (topLeft, newBounds.topLeft.toString(), undoManager); | |||
state.setProperty (topRight, newBounds.topRight.toString(), undoManager); | |||
state.setProperty (bottomLeft, newBounds.bottomLeft.toString(), undoManager); | |||
} | |||
void DrawableRectangle::ValueTreeWrapper::setCornerSize (const RelativePoint& newSize, UndoManager* undoManager) | |||
{ | |||
state.setProperty (cornerSize, newSize.toString(), undoManager); | |||
} | |||
const RelativePoint DrawableRectangle::ValueTreeWrapper::getCornerSize() const | |||
{ | |||
return RelativePoint (state [cornerSize]); | |||
} | |||
Value DrawableRectangle::ValueTreeWrapper::getCornerSizeValue (UndoManager* undoManager) const | |||
{ | |||
return state.getPropertyAsValue (cornerSize, undoManager); | |||
} | |||
//============================================================================== | |||
const Rectangle<float> DrawableRectangle::refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider) | |||
{ | |||
Rectangle<float> damageRect; | |||
ValueTreeWrapper v (tree); | |||
setName (v.getID()); | |||
bool needsRedraw = refreshFillTypes (v, parent, imageProvider); | |||
RelativeParallelogram newBounds (v.getRectangle()); | |||
const PathStrokeType newStroke (v.getStrokeType()); | |||
const RelativePoint newCornerSize (v.getCornerSize()); | |||
if (strokeType != newStroke || newBounds != bounds || newCornerSize != cornerSize) | |||
{ | |||
damageRect = getBounds(); | |||
bounds = newBounds; | |||
strokeType = newStroke; | |||
cornerSize = newCornerSize; | |||
pathChanged(); | |||
strokeChanged(); | |||
needsRedraw = true; | |||
} | |||
if (needsRedraw) | |||
damageRect = damageRect.getUnion (getBounds()); | |||
return damageRect; | |||
} | |||
const ValueTree DrawableRectangle::createValueTree (ImageProvider* imageProvider) const | |||
{ | |||
ValueTree tree (valueTreeType); | |||
ValueTreeWrapper v (tree); | |||
v.setID (getName(), 0); | |||
writeTo (v, imageProvider, 0); | |||
v.setRectangle (bounds, 0); | |||
v.setCornerSize (cornerSize, 0); | |||
return tree; | |||
} | |||
END_JUCE_NAMESPACE |
@@ -0,0 +1,109 @@ | |||
/* | |||
============================================================================== | |||
This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||
Copyright 2004-10 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_DRAWABLERECTANGLE_JUCEHEADER__ | |||
#define __JUCE_DRAWABLERECTANGLE_JUCEHEADER__ | |||
#include "juce_DrawableShape.h" | |||
//============================================================================== | |||
/** | |||
A Drawable object which draws a rectangle. | |||
For details on how to change the fill and stroke, see the DrawableShape class. | |||
@see Drawable, DrawableShape | |||
*/ | |||
class JUCE_API DrawableRectangle : public DrawableShape | |||
{ | |||
public: | |||
//============================================================================== | |||
DrawableRectangle(); | |||
DrawableRectangle (const DrawableRectangle& other); | |||
/** Destructor. */ | |||
~DrawableRectangle(); | |||
//============================================================================== | |||
/** Sets the rectangle's bounds. */ | |||
void setRectangle (const RelativeParallelogram& newBounds); | |||
/** Returns the rectangle's bounds. */ | |||
const RelativeParallelogram& getRectangle() const throw() { return bounds; } | |||
/** Returns the corner size to be used. */ | |||
const RelativePoint getCornerSize() const { return cornerSize; } | |||
/** Sets a new corner size for the rectangle */ | |||
void setCornerSize (const RelativePoint& newSize); | |||
//============================================================================== | |||
/** @internal */ | |||
Drawable* createCopy() const; | |||
/** @internal */ | |||
const Rectangle<float> refreshFromValueTree (const ValueTree& tree, ImageProvider* imageProvider); | |||
/** @internal */ | |||
const ValueTree createValueTree (ImageProvider* imageProvider) const; | |||
/** @internal */ | |||
static const Identifier valueTreeType; | |||
/** @internal */ | |||
const Identifier getValueTreeType() const { return valueTreeType; } | |||
//============================================================================== | |||
/** Internally-used class for wrapping a DrawableRectangle's state into a ValueTree. */ | |||
class ValueTreeWrapper : public FillAndStrokeState | |||
{ | |||
public: | |||
ValueTreeWrapper (const ValueTree& state); | |||
const RelativeParallelogram getRectangle() const; | |||
void setRectangle (const RelativeParallelogram& newBounds, UndoManager* undoManager); | |||
void setCornerSize (const RelativePoint& cornerSize, UndoManager* undoManager); | |||
const RelativePoint getCornerSize() const; | |||
Value getCornerSizeValue (UndoManager* undoManager) const; | |||
static const Identifier topLeft, topRight, bottomLeft, cornerSize; | |||
}; | |||
//============================================================================== | |||
juce_UseDebuggingNewOperator | |||
protected: | |||
/** @internal */ | |||
bool rebuildPath (Path& path) const; | |||
private: | |||
RelativeParallelogram bounds; | |||
RelativePoint cornerSize; | |||
const AffineTransform calculateTransform() const; | |||
DrawableRectangle& operator= (const DrawableRectangle&); | |||
}; | |||
#endif // __JUCE_DRAWABLERECTANGLE_JUCEHEADER__ |
@@ -0,0 +1,405 @@ | |||
/* | |||
============================================================================== | |||
This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||
Copyright 2004-10 by Raw Material Software Ltd. | |||
------------------------------------------------------------------------------ | |||
JUCE can be redistributed and/or modified under the terms of the GNU General | |||
Public License (Version 2), as published by the Free Software Foundation. | |||
A copy of the license is included in the JUCE distribution, or can be found | |||
online at www.gnu.org/licenses. | |||
JUCE is distributed in the hope that it will be useful, but WITHOUT ANY | |||
WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||
A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||
------------------------------------------------------------------------------ | |||
To release a closed-source product which uses JUCE, commercial licenses are | |||
available: visit www.rawmaterialsoftware.com/juce for more information. | |||
============================================================================== | |||
*/ | |||
#include "../../../core/juce_StandardHeader.h" | |||
BEGIN_JUCE_NAMESPACE | |||
#include "juce_DrawableShape.h" | |||
#include "juce_DrawableComposite.h" | |||
//============================================================================== | |||
DrawableShape::DrawableShape() | |||
: strokeType (0.0f), | |||
mainFill (Colours::black), | |||
strokeFill (Colours::black), | |||
pathNeedsUpdating (true), | |||
strokeNeedsUpdating (true) | |||
{ | |||
} | |||
DrawableShape::DrawableShape (const DrawableShape& other) | |||
: strokeType (other.strokeType), | |||
mainFill (other.mainFill), | |||
strokeFill (other.strokeFill), | |||
pathNeedsUpdating (true), | |||
strokeNeedsUpdating (true) | |||
{ | |||
} | |||
DrawableShape::~DrawableShape() | |||
{ | |||
} | |||
void DrawableShape::setFill (const FillType& newFill) | |||
{ | |||
mainFill = newFill; | |||
} | |||
void DrawableShape::setStrokeFill (const FillType& newFill) | |||
{ | |||
strokeFill = newFill; | |||
} | |||
void DrawableShape::setStrokeType (const PathStrokeType& newStrokeType) | |||
{ | |||
strokeType = newStrokeType; | |||
strokeNeedsUpdating = true; | |||
} | |||
void DrawableShape::setStrokeThickness (const float newThickness) | |||
{ | |||
setStrokeType (PathStrokeType (newThickness, strokeType.getJointStyle(), strokeType.getEndStyle())); | |||
} | |||
bool DrawableShape::isStrokeVisible() const throw() | |||
{ | |||
return strokeType.getStrokeThickness() > 0.0f && ! strokeFill.isInvisible(); | |||
} | |||
void DrawableShape::setBrush (const Drawable::RenderingContext& context, const FillType& type) | |||
{ | |||
FillType f (type); | |||
if (f.isGradient()) | |||
f.gradient->multiplyOpacity (context.opacity); | |||
else | |||
f.setOpacity (f.getOpacity() * context.opacity); | |||
f.transform = f.transform.followedBy (context.transform); | |||
context.g.setFillType (f); | |||
} | |||
bool DrawableShape::refreshFillTypes (const FillAndStrokeState& newState, | |||
Expression::EvaluationContext* nameFinder, | |||
ImageProvider* imageProvider) | |||
{ | |||
bool hasChanged = false; | |||
{ | |||
const FillType f (newState.getMainFill (parent, imageProvider)); | |||
if (mainFill != f) | |||
{ | |||
hasChanged = true; | |||
mainFill = f; | |||
} | |||
} | |||
{ | |||
const FillType f (newState.getStrokeFill (parent, imageProvider)); | |||
if (strokeFill != f) | |||
{ | |||
hasChanged = true; | |||
strokeFill = f; | |||
} | |||
} | |||
return hasChanged; | |||
} | |||
void DrawableShape::writeTo (FillAndStrokeState& state, ImageProvider* imageProvider, UndoManager* undoManager) const | |||
{ | |||
state.setMainFill (mainFill, 0, 0, 0, imageProvider, undoManager); | |||
state.setStrokeFill (strokeFill, 0, 0, 0, imageProvider, undoManager); | |||
state.setStrokeType (strokeType, undoManager); | |||
} | |||
//============================================================================== | |||
void DrawableShape::render (const Drawable::RenderingContext& context) const | |||
{ | |||
setBrush (context, mainFill); | |||
context.g.fillPath (getCachedPath(), context.transform); | |||
if (isStrokeVisible()) | |||
{ | |||
setBrush (context, strokeFill); | |||
context.g.fillPath (getCachedStrokePath(), context.transform); | |||
} | |||
} | |||
void DrawableShape::pathChanged() | |||
{ | |||
pathNeedsUpdating = true; | |||
} | |||
void DrawableShape::strokeChanged() | |||
{ | |||
strokeNeedsUpdating = true; | |||
} | |||
void DrawableShape::invalidatePoints() | |||
{ | |||
pathNeedsUpdating = true; | |||
strokeNeedsUpdating = true; | |||
} | |||
const Path& DrawableShape::getCachedPath() const | |||
{ | |||
if (pathNeedsUpdating) | |||
{ | |||
pathNeedsUpdating = false; | |||
if (rebuildPath (cachedPath)) | |||
strokeNeedsUpdating = true; | |||
} | |||
return cachedPath; | |||
} | |||
const Path& DrawableShape::getCachedStrokePath() const | |||
{ | |||
if (strokeNeedsUpdating) | |||
{ | |||
cachedStroke.clear(); | |||
strokeType.createStrokedPath (cachedStroke, getCachedPath(), AffineTransform::identity, 4.0f); | |||
strokeNeedsUpdating = false; // (must be called after getCachedPath) | |||
} | |||
return cachedStroke; | |||
} | |||
const Rectangle<float> DrawableShape::getBounds() const | |||
{ | |||
if (isStrokeVisible()) | |||
return getCachedStrokePath().getBounds(); | |||
else | |||
return getCachedPath().getBounds(); | |||
} | |||
bool DrawableShape::hitTest (float x, float y) const | |||
{ | |||
return getCachedPath().contains (x, y) | |||
|| (isStrokeVisible() && getCachedStrokePath().contains (x, y)); | |||
} | |||
//============================================================================== | |||
const Identifier DrawableShape::FillAndStrokeState::type ("type"); | |||
const Identifier DrawableShape::FillAndStrokeState::colour ("colour"); | |||
const Identifier DrawableShape::FillAndStrokeState::colours ("colours"); | |||
const Identifier DrawableShape::FillAndStrokeState::fill ("Fill"); | |||
const Identifier DrawableShape::FillAndStrokeState::stroke ("Stroke"); | |||
const Identifier DrawableShape::FillAndStrokeState::path ("Path"); | |||
const Identifier DrawableShape::FillAndStrokeState::jointStyle ("jointStyle"); | |||
const Identifier DrawableShape::FillAndStrokeState::capStyle ("capStyle"); | |||
const Identifier DrawableShape::FillAndStrokeState::strokeWidth ("strokeWidth"); | |||
const Identifier DrawableShape::FillAndStrokeState::gradientPoint1 ("point1"); | |||
const Identifier DrawableShape::FillAndStrokeState::gradientPoint2 ("point2"); | |||
const Identifier DrawableShape::FillAndStrokeState::gradientPoint3 ("point3"); | |||
const Identifier DrawableShape::FillAndStrokeState::radial ("radial"); | |||
const Identifier DrawableShape::FillAndStrokeState::imageId ("imageId"); | |||
const Identifier DrawableShape::FillAndStrokeState::imageOpacity ("imageOpacity"); | |||
DrawableShape::FillAndStrokeState::FillAndStrokeState (const ValueTree& state_) | |||
: Drawable::ValueTreeWrapperBase (state_) | |||
{ | |||
} | |||
const FillType DrawableShape::FillAndStrokeState::getMainFill (Expression::EvaluationContext* nameFinder, | |||
ImageProvider* imageProvider) const | |||
{ | |||
return readFillType (state.getChildWithName (fill), 0, 0, 0, nameFinder, imageProvider); | |||
} | |||
ValueTree DrawableShape::FillAndStrokeState::getMainFillState() | |||
{ | |||
ValueTree v (state.getChildWithName (fill)); | |||
if (v.isValid()) | |||
return v; | |||
setMainFill (Colours::black, 0, 0, 0, 0, 0); | |||
return getMainFillState(); | |||
} | |||
void DrawableShape::FillAndStrokeState::setMainFill (const FillType& newFill, const RelativePoint* gp1, const RelativePoint* gp2, | |||
const RelativePoint* gp3, ImageProvider* imageProvider, UndoManager* undoManager) | |||
{ | |||
ValueTree v (state.getOrCreateChildWithName (fill, undoManager)); | |||
writeFillType (v, newFill, gp1, gp2, gp3, imageProvider, undoManager); | |||
} | |||
const FillType DrawableShape::FillAndStrokeState::getStrokeFill (Expression::EvaluationContext* nameFinder, | |||
ImageProvider* imageProvider) const | |||
{ | |||
return readFillType (state.getChildWithName (stroke), 0, 0, 0, nameFinder, imageProvider); | |||
} | |||
ValueTree DrawableShape::FillAndStrokeState::getStrokeFillState() | |||
{ | |||
ValueTree v (state.getChildWithName (stroke)); | |||
if (v.isValid()) | |||
return v; | |||
setStrokeFill (Colours::black, 0, 0, 0, 0, 0); | |||
return getStrokeFillState(); | |||
} | |||
void DrawableShape::FillAndStrokeState::setStrokeFill (const FillType& newFill, const RelativePoint* gp1, const RelativePoint* gp2, | |||
const RelativePoint* gp3, ImageProvider* imageProvider, UndoManager* undoManager) | |||
{ | |||
ValueTree v (state.getOrCreateChildWithName (stroke, undoManager)); | |||
writeFillType (v, newFill, gp1, gp2, gp3, imageProvider, undoManager); | |||
} | |||
const PathStrokeType DrawableShape::FillAndStrokeState::getStrokeType() const | |||
{ | |||
const String jointStyleString (state [jointStyle].toString()); | |||
const String capStyleString (state [capStyle].toString()); | |||
return PathStrokeType (state [strokeWidth], | |||
jointStyleString == "curved" ? PathStrokeType::curved | |||
: (jointStyleString == "bevel" ? PathStrokeType::beveled | |||
: PathStrokeType::mitered), | |||
capStyleString == "square" ? PathStrokeType::square | |||
: (capStyleString == "round" ? PathStrokeType::rounded | |||
: PathStrokeType::butt)); | |||
} | |||
void DrawableShape::FillAndStrokeState::setStrokeType (const PathStrokeType& newStrokeType, UndoManager* undoManager) | |||
{ | |||
state.setProperty (strokeWidth, (double) newStrokeType.getStrokeThickness(), undoManager); | |||
state.setProperty (jointStyle, newStrokeType.getJointStyle() == PathStrokeType::mitered | |||
? "miter" : (newStrokeType.getJointStyle() == PathStrokeType::curved ? "curved" : "bevel"), undoManager); | |||
state.setProperty (capStyle, newStrokeType.getEndStyle() == PathStrokeType::butt | |||
? "butt" : (newStrokeType.getEndStyle() == PathStrokeType::square ? "square" : "round"), undoManager); | |||
} | |||
const FillType DrawableShape::FillAndStrokeState::readFillType (const ValueTree& v, RelativePoint* const gp1, RelativePoint* const gp2, RelativePoint* const gp3, | |||
Expression::EvaluationContext* const nameFinder, ImageProvider* imageProvider) | |||
{ | |||
const String newType (v[type].toString()); | |||
if (newType == "solid") | |||
{ | |||
const String colourString (v [colour].toString()); | |||
return FillType (Colour (colourString.isEmpty() ? (uint32) 0xff000000 | |||
: (uint32) colourString.getHexValue32())); | |||
} | |||
else if (newType == "gradient") | |||
{ | |||
RelativePoint p1 (v [gradientPoint1]), p2 (v [gradientPoint2]), p3 (v [gradientPoint3]); | |||
ColourGradient g; | |||
if (gp1 != 0) *gp1 = p1; | |||
if (gp2 != 0) *gp2 = p2; | |||
if (gp3 != 0) *gp3 = p3; | |||
g.point1 = p1.resolve (nameFinder); | |||
g.point2 = p2.resolve (nameFinder); | |||
g.isRadial = v[radial]; | |||
StringArray colourSteps; | |||
colourSteps.addTokens (v[colours].toString(), false); | |||
for (int i = 0; i < colourSteps.size() / 2; ++i) | |||
g.addColour (colourSteps[i * 2].getDoubleValue(), | |||
Colour ((uint32) colourSteps[i * 2 + 1].getHexValue32())); | |||
FillType fillType (g); | |||
if (g.isRadial) | |||
{ | |||
const Point<float> point3 (p3.resolve (nameFinder)); | |||
const Point<float> point3Source (g.point1.getX() + g.point2.getY() - g.point1.getY(), | |||
g.point1.getY() + g.point1.getX() - g.point2.getX()); | |||
fillType.transform = AffineTransform::fromTargetPoints (g.point1.getX(), g.point1.getY(), g.point1.getX(), g.point1.getY(), | |||
g.point2.getX(), g.point2.getY(), g.point2.getX(), g.point2.getY(), | |||
point3Source.getX(), point3Source.getY(), point3.getX(), point3.getY()); | |||
} | |||
return fillType; | |||
} | |||
else if (newType == "image") | |||
{ | |||
Image im; | |||
if (imageProvider != 0) | |||
im = imageProvider->getImageForIdentifier (v[imageId]); | |||
FillType f (im, AffineTransform::identity); | |||
f.setOpacity ((float) v.getProperty (imageOpacity, 1.0f)); | |||
return f; | |||
} | |||
jassert (! v.isValid()); | |||
return FillType(); | |||
} | |||
static const Point<float> calcThirdGradientPoint (const FillType& fillType) | |||
{ | |||
const ColourGradient& g = *fillType.gradient; | |||
const Point<float> point3Source (g.point1.getX() + g.point2.getY() - g.point1.getY(), | |||
g.point1.getY() + g.point1.getX() - g.point2.getX()); | |||
return point3Source.transformedBy (fillType.transform); | |||
} | |||
void DrawableShape::FillAndStrokeState::writeFillType (ValueTree& v, const FillType& fillType, | |||
const RelativePoint* const gp1, const RelativePoint* const gp2, const RelativePoint* gp3, | |||
ImageProvider* imageProvider, UndoManager* const undoManager) | |||
{ | |||
if (fillType.isColour()) | |||
{ | |||
v.setProperty (type, "solid", undoManager); | |||
v.setProperty (colour, String::toHexString ((int) fillType.colour.getARGB()), undoManager); | |||
} | |||
else if (fillType.isGradient()) | |||
{ | |||
v.setProperty (type, "gradient", undoManager); | |||
v.setProperty (gradientPoint1, gp1 != 0 ? gp1->toString() : fillType.gradient->point1.toString(), undoManager); | |||
v.setProperty (gradientPoint2, gp2 != 0 ? gp2->toString() : fillType.gradient->point2.toString(), undoManager); | |||
v.setProperty (gradientPoint3, gp3 != 0 ? gp3->toString() : calcThirdGradientPoint (fillType).toString(), undoManager); | |||
v.setProperty (radial, fillType.gradient->isRadial, undoManager); | |||
String s; | |||
for (int i = 0; i < fillType.gradient->getNumColours(); ++i) | |||
s << ' ' << fillType.gradient->getColourPosition (i) | |||
<< ' ' << String::toHexString ((int) fillType.gradient->getColour(i).getARGB()); | |||
v.setProperty (colours, s.trimStart(), undoManager); | |||
} | |||
else if (fillType.isTiledImage()) | |||
{ | |||
v.setProperty (type, "image", undoManager); | |||
if (imageProvider != 0) | |||
v.setProperty (imageId, imageProvider->getIdentifierForImage (fillType.image), undoManager); | |||
if (fillType.getOpacity() < 1.0f) | |||
v.setProperty (imageOpacity, fillType.getOpacity(), undoManager); | |||
else | |||
v.removeProperty (imageOpacity, undoManager); | |||
} | |||
else | |||
{ | |||
jassertfalse; | |||
} | |||
} | |||
END_JUCE_NAMESPACE |
@@ -0,0 +1,178 @@ | |||
/* | |||
============================================================================== | |||
This file is part of the JUCE library - "Jules' Utility Class Extensions" | |||
Copyright 2004-10 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_DRAWABLESHAPE_JUCEHEADER__ | |||
#define __JUCE_DRAWABLESHAPE_JUCEHEADER__ | |||
#include "juce_Drawable.h" | |||
#include "../contexts/juce_FillType.h" | |||
#include "../colour/juce_ColourGradient.h" | |||
//============================================================================== | |||
/** | |||
A base class implementing common functionality for Drawable classes which | |||
consist of some kind of filled and stroked outline. | |||
@see DrawablePath, DrawableRectangle | |||
*/ | |||
class JUCE_API DrawableShape : public Drawable | |||
{ | |||
protected: | |||
//============================================================================== | |||
DrawableShape(); | |||
DrawableShape (const DrawableShape&); | |||
public: | |||
/** Destructor. */ | |||
~DrawableShape(); | |||
//============================================================================== | |||
/** Sets a fill type for the path. | |||
This colour is used to fill the path - if you don't want the path to be | |||
filled (e.g. if you're just drawing an outline), set this to a transparent | |||
colour. | |||
@see setPath, setStrokeFill | |||
*/ | |||
void setFill (const FillType& newFill); | |||
/** Returns the current fill type. | |||
@see setFill | |||
*/ | |||
const FillType& getFill() const throw() { return mainFill; } | |||
/** Sets the fill type with which the outline will be drawn. | |||
@see setFill | |||
*/ | |||
void setStrokeFill (const FillType& newStrokeFill); | |||
/** Returns the current stroke fill. | |||
@see setStrokeFill | |||
*/ | |||
const FillType& getStrokeFill() const throw() { return strokeFill; } | |||
/** Changes the properties of the outline that will be drawn around the path. | |||
If the stroke has 0 thickness, no stroke will be drawn. | |||
@see setStrokeThickness, setStrokeColour | |||
*/ | |||
void setStrokeType (const PathStrokeType& newStrokeType); | |||
/** Changes the stroke thickness. | |||
This is a shortcut for calling setStrokeType. | |||
*/ | |||
void setStrokeThickness (float newThickness); | |||
/** Returns the current outline style. */ | |||
const PathStrokeType& getStrokeType() const throw() { return strokeType; } | |||
//============================================================================== | |||
/** @internal */ | |||
class FillAndStrokeState : public ValueTreeWrapperBase | |||
{ | |||
public: | |||
FillAndStrokeState (const ValueTree& state); | |||
const FillType getMainFill (Expression::EvaluationContext* nameFinder, | |||
ImageProvider* imageProvider) const; | |||
ValueTree getMainFillState(); | |||
void setMainFill (const FillType& newFill, const RelativePoint* gradientPoint1, | |||
const RelativePoint* gradientPoint2, const RelativePoint* gradientPoint3, | |||
ImageProvider* imageProvider, UndoManager* undoManager); | |||
const FillType getStrokeFill (Expression::EvaluationContext* nameFinder, | |||
ImageProvider* imageProvider) const; | |||
ValueTree getStrokeFillState(); | |||
void setStrokeFill (const FillType& newFill, const RelativePoint* gradientPoint1, | |||
const RelativePoint* gradientPoint2, const RelativePoint* gradientPoint3, | |||
ImageProvider* imageProvider, UndoManager* undoManager); | |||
const PathStrokeType getStrokeType() const; | |||
void setStrokeType (const PathStrokeType& newStrokeType, UndoManager* undoManager); | |||
static const FillType readFillType (const ValueTree& v, RelativePoint* gradientPoint1, | |||
RelativePoint* gradientPoint2, RelativePoint* gradientPoint3, | |||
Expression::EvaluationContext* nameFinder, | |||
ImageProvider* imageProvider); | |||
static void writeFillType (ValueTree& v, const FillType& fillType, | |||
const RelativePoint* gradientPoint1, const RelativePoint* gradientPoint2, | |||
const RelativePoint* gradientPoint3, ImageProvider* imageProvider, | |||
UndoManager* undoManager); | |||
static const Identifier type, colour, colours, fill, stroke, path, jointStyle, capStyle, strokeWidth, | |||
gradientPoint1, gradientPoint2, gradientPoint3, radial, imageId, imageOpacity; | |||
}; | |||
/** @internal */ | |||
void invalidatePoints(); | |||
/** @internal */ | |||
void render (const Drawable::RenderingContext& context) const; | |||
/** @internal */ | |||
const Rectangle<float> getBounds() const; | |||
/** @internal */ | |||
bool hitTest (float x, float y) const; | |||
protected: | |||
//============================================================================== | |||
/** Called when the cached path should be updated. */ | |||
void pathChanged(); | |||
/** Called when the cached stroke should be updated. */ | |||
void strokeChanged(); | |||
/** Implemented by subclasses to regenerate the path. */ | |||
virtual bool rebuildPath (Path& path) const = 0; | |||
/** True if there's a stroke with a non-zero thickness and non-transparent colour. */ | |||
bool isStrokeVisible() const throw(); | |||
/** Updates the details from a FillAndStrokeState object, returning true if something changed. */ | |||
bool refreshFillTypes (const FillAndStrokeState& newState, | |||
Expression::EvaluationContext* nameFinder, | |||
ImageProvider* imageProvider); | |||
/** Writes the stroke and fill details to a FillAndStrokeState object. */ | |||
void writeTo (FillAndStrokeState& state, ImageProvider* imageProvider, UndoManager* undoManager) const; | |||
/** Returns the current cached path outline. */ | |||
const Path& getCachedPath() const; | |||
/** Returns the current cached stroke outline. */ | |||
const Path& getCachedStrokePath() const; | |||
//============================================================================== | |||
PathStrokeType strokeType; | |||
mutable Path cachedPath, cachedStroke; | |||
private: | |||
FillType mainFill, strokeFill; | |||
mutable bool pathNeedsUpdating, strokeNeedsUpdating; | |||
static void setBrush (const Drawable::RenderingContext& context, const FillType& type); | |||
DrawableShape& operator= (const DrawableShape&); | |||
}; | |||
#endif // __JUCE_DRAWABLESHAPE_JUCEHEADER__ |
@@ -106,8 +106,8 @@ void DrawableText::render (const Drawable::RenderingContext& context) const | |||
const float h = Line<float> (points[0], points[2]).getLength(); | |||
const Point<float> fontCoords (bounds.getInternalCoordForPoint (points, fontSizeControlPoint.resolve (parent))); | |||
const float fontHeight = jlimit (1.0f, h, fontCoords.getY()); | |||
const float fontWidth = jlimit (0.01f, w, fontCoords.getX()); | |||
const float fontHeight = jlimit (0.01f, jmax (0.01f, h), fontCoords.getY()); | |||
const float fontWidth = jlimit (0.01f, jmax (0.01f, w), fontCoords.getX()); | |||
Font f (font); | |||
f.setHeight (fontHeight); | |||
@@ -578,6 +578,11 @@ RelativeParallelogram::RelativeParallelogram() | |||
{ | |||
} | |||
RelativeParallelogram::RelativeParallelogram (const Rectangle<float>& r) | |||
: topLeft (r.getTopLeft()), topRight (r.getTopRight()), bottomLeft (r.getBottomLeft()) | |||
{ | |||
} | |||
RelativeParallelogram::RelativeParallelogram (const RelativePoint& topLeft_, const RelativePoint& topRight_, const RelativePoint& bottomLeft_) | |||
: topLeft (topLeft_), topRight (topRight_), bottomLeft (bottomLeft_) | |||
{ | |||
@@ -438,6 +438,7 @@ class JUCE_API RelativeParallelogram | |||
public: | |||
//============================================================================== | |||
RelativeParallelogram(); | |||
RelativeParallelogram (const Rectangle<float>& simpleRectangle); | |||
RelativeParallelogram (const RelativePoint& topLeft, const RelativePoint& topRight, const RelativePoint& bottomLeft); | |||
RelativeParallelogram (const String& topLeft, const String& topRight, const String& bottomLeft); | |||
~RelativeParallelogram(); | |||
@@ -659,6 +659,12 @@ | |||
#ifndef __JUCE_DRAWABLEPATH_JUCEHEADER__ | |||
#include "gui/graphics/drawables/juce_DrawablePath.h" | |||
#endif | |||
#ifndef __JUCE_DRAWABLERECTANGLE_JUCEHEADER__ | |||
#include "gui/graphics/drawables/juce_DrawableRectangle.h" | |||
#endif | |||
#ifndef __JUCE_DRAWABLESHAPE_JUCEHEADER__ | |||
#include "gui/graphics/drawables/juce_DrawableShape.h" | |||
#endif | |||
#ifndef __JUCE_DRAWABLETEXT_JUCEHEADER__ | |||
#include "gui/graphics/drawables/juce_DrawableText.h" | |||
#endif | |||