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