diff --git a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
index 7d09a8d777..e9378b2dc3 100644
--- a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
+++ b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
@@ -1488,6 +1488,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_graphics/detail/juce_ShapedText.h"
"../../../../../modules/juce_graphics/detail/juce_SimpleShapedText.cpp"
"../../../../../modules/juce_graphics/detail/juce_SimpleShapedText.h"
+ "../../../../../modules/juce_graphics/detail/juce_Unicode.h"
"../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp"
"../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h"
"../../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp"
@@ -4092,6 +4093,7 @@ set_source_files_properties(
"../../../../../modules/juce_graphics/detail/juce_ShapedText.h"
"../../../../../modules/juce_graphics/detail/juce_SimpleShapedText.cpp"
"../../../../../modules/juce_graphics/detail/juce_SimpleShapedText.h"
+ "../../../../../modules/juce_graphics/detail/juce_Unicode.h"
"../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp"
"../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h"
"../../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp"
diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
index 3fab09bb7b..929faf373b 100644
--- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
@@ -4047,6 +4047,7 @@
+
diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
index 276d765e18..db5fed3a0c 100644
--- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
@@ -6543,6 +6543,9 @@
JUCE Modules\juce_graphics\detail
+
+ JUCE Modules\juce_graphics\detail
+
JUCE Modules\juce_graphics\effects
diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
index 6396281066..7fe4d50a26 100644
--- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
@@ -4047,6 +4047,7 @@
+
diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
index 61a2b6fc37..1962ea3086 100644
--- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
@@ -6543,6 +6543,9 @@
JUCE Modules\juce_graphics\detail
+
+ JUCE Modules\juce_graphics\detail
+
JUCE Modules\juce_graphics\effects
diff --git a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
index ea17b539e0..b5215a84f9 100644
--- a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
+++ b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
@@ -1250,6 +1250,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_graphics/detail/juce_ShapedText.h"
"../../../../../modules/juce_graphics/detail/juce_SimpleShapedText.cpp"
"../../../../../modules/juce_graphics/detail/juce_SimpleShapedText.h"
+ "../../../../../modules/juce_graphics/detail/juce_Unicode.h"
"../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp"
"../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h"
"../../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp"
@@ -3514,6 +3515,7 @@ set_source_files_properties(
"../../../../../modules/juce_graphics/detail/juce_ShapedText.h"
"../../../../../modules/juce_graphics/detail/juce_SimpleShapedText.cpp"
"../../../../../modules/juce_graphics/detail/juce_SimpleShapedText.h"
+ "../../../../../modules/juce_graphics/detail/juce_Unicode.h"
"../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp"
"../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h"
"../../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp"
diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
index 3820dd2448..745d7542a7 100644
--- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
+++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
@@ -3502,6 +3502,7 @@
+
diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
index f6c18101ed..53982d9232 100644
--- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
+++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
@@ -5553,6 +5553,9 @@
JUCE Modules\juce_graphics\detail
+
+ JUCE Modules\juce_graphics\detail
+
JUCE Modules\juce_graphics\effects
diff --git a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
index 01b5d2df93..b8ba9f0141 100644
--- a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
+++ b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
@@ -1380,6 +1380,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_graphics/detail/juce_ShapedText.h"
"../../../../../modules/juce_graphics/detail/juce_SimpleShapedText.cpp"
"../../../../../modules/juce_graphics/detail/juce_SimpleShapedText.h"
+ "../../../../../modules/juce_graphics/detail/juce_Unicode.h"
"../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp"
"../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h"
"../../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp"
@@ -3797,6 +3798,7 @@ set_source_files_properties(
"../../../../../modules/juce_graphics/detail/juce_ShapedText.h"
"../../../../../modules/juce_graphics/detail/juce_SimpleShapedText.cpp"
"../../../../../modules/juce_graphics/detail/juce_SimpleShapedText.h"
+ "../../../../../modules/juce_graphics/detail/juce_Unicode.h"
"../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp"
"../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h"
"../../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp"
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
index e0652288d0..e5238541aa 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
@@ -3735,6 +3735,7 @@
+
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
index a19bae6c76..fbbf3e3027 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
@@ -5988,6 +5988,9 @@
JUCE Modules\juce_graphics\detail
+
+ JUCE Modules\juce_graphics\detail
+
JUCE Modules\juce_graphics\effects
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
index 697e6b3e89..036879efa0 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
@@ -3735,6 +3735,7 @@
+
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
index de14c66afe..d790f141bd 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
@@ -5988,6 +5988,9 @@
JUCE Modules\juce_graphics\detail
+
+ JUCE Modules\juce_graphics\detail
+
JUCE Modules\juce_graphics\effects
diff --git a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
index 778886efbc..f5d1a8bacf 100644
--- a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
+++ b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
@@ -1269,6 +1269,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_graphics/detail/juce_ShapedText.h"
"../../../../../modules/juce_graphics/detail/juce_SimpleShapedText.cpp"
"../../../../../modules/juce_graphics/detail/juce_SimpleShapedText.h"
+ "../../../../../modules/juce_graphics/detail/juce_Unicode.h"
"../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp"
"../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h"
"../../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp"
@@ -3613,6 +3614,7 @@ set_source_files_properties(
"../../../../../modules/juce_graphics/detail/juce_ShapedText.h"
"../../../../../modules/juce_graphics/detail/juce_SimpleShapedText.cpp"
"../../../../../modules/juce_graphics/detail/juce_SimpleShapedText.h"
+ "../../../../../modules/juce_graphics/detail/juce_Unicode.h"
"../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.cpp"
"../../../../../modules/juce_graphics/effects/juce_DropShadowEffect.h"
"../../../../../modules/juce_graphics/effects/juce_GlowEffect.cpp"
diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
index cd3895bdc9..c83ca044e7 100644
--- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
+++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
@@ -3600,6 +3600,7 @@
+
diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
index 958b7e982a..2910982e40 100644
--- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
+++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
@@ -5715,6 +5715,9 @@
JUCE Modules\juce_graphics\detail
+
+ JUCE Modules\juce_graphics\detail
+
JUCE Modules\juce_graphics\effects
diff --git a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj
index 657323bbda..390cddebdb 100644
--- a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj
+++ b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj
@@ -2300,6 +2300,7 @@
+
diff --git a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
index f7c9574861..bc2fbf5b30 100644
--- a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
+++ b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
@@ -3357,6 +3357,9 @@
JUCE Modules\juce_graphics\detail
+
+ JUCE Modules\juce_graphics\detail
+
JUCE Modules\juce_graphics\effects
diff --git a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj
index 37b4e845d6..70dedfbda1 100644
--- a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj
+++ b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj
@@ -2300,6 +2300,7 @@
+
diff --git a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters
index 49d6ad81de..01215fc723 100644
--- a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters
+++ b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters
@@ -3357,6 +3357,9 @@
JUCE Modules\juce_graphics\detail
+
+ JUCE Modules\juce_graphics\detail
+
JUCE Modules\juce_graphics\effects
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
index 452f017650..f3fd43007e 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
@@ -3847,6 +3847,7 @@
+
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
index 962fc80158..0e5bfd87bb 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -6147,6 +6147,9 @@
JUCE Modules\juce_graphics\detail
+
+ JUCE Modules\juce_graphics\detail
+
JUCE Modules\juce_graphics\effects
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
index 649c5f48d6..ca60af9bad 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
@@ -3847,6 +3847,7 @@
+
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
index c06c9377ea..e58172465c 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -6147,6 +6147,9 @@
JUCE Modules\juce_graphics\detail
+
+ JUCE Modules\juce_graphics\detail
+
JUCE Modules\juce_graphics\effects
diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj
index 919ef9fd48..ad0f8c1ffb 100644
--- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj
+++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj
@@ -3576,6 +3576,7 @@
+
diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters
index 1e701fc9da..a45cd5f598 100644
--- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters
+++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_DynamicLibrary.vcxproj.filters
@@ -5682,6 +5682,9 @@
JUCE Modules\juce_graphics\detail
+
+ JUCE Modules\juce_graphics\detail
+
JUCE Modules\juce_graphics\effects
diff --git a/modules/juce_graphics/detail/juce_Unicode.h b/modules/juce_graphics/detail/juce_Unicode.h
new file mode 100644
index 0000000000..271cd79563
--- /dev/null
+++ b/modules/juce_graphics/detail/juce_Unicode.h
@@ -0,0 +1,45 @@
+/*
+ ==============================================================================
+
+ This file is part of the JUCE framework.
+ Copyright (c) Raw Material Software Limited
+
+ JUCE is an open source framework subject to commercial or open source
+ licensing.
+
+ By downloading, installing, or using the JUCE framework, or combining the
+ JUCE framework with any other source code, object code, content or any other
+ copyrightable work, you agree to the terms of the JUCE End User Licence
+ Agreement, and all incorporated terms including the JUCE Privacy Policy and
+ the JUCE Website Terms of Service, as applicable, which will bind you. If you
+ do not agree to the terms of these agreements, we will not license the JUCE
+ framework to you, and you must discontinue the installation or download
+ process and cease use of the JUCE framework.
+
+ JUCE End User Licence Agreement: https://juce.com/legal/juce-8-licence/
+ JUCE Privacy Policy: https://juce.com/juce-privacy-policy
+ JUCE Website Terms of Service: https://juce.com/juce-website-terms-of-service/
+
+ Or:
+
+ You may also use this code under the terms of the AGPLv3:
+ https://www.gnu.org/licenses/agpl-3.0.en.html
+
+ THE JUCE FRAMEWORK IS PROVIDED "AS IS" WITHOUT ANY WARRANTY, AND ALL
+ WARRANTIES, WHETHER EXPRESSED OR IMPLIED, INCLUDING WARRANTY OF
+ MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE, ARE DISCLAIMED.
+
+ ==============================================================================
+*/
+
+namespace juce::detail
+{
+
+struct UnicodeHelpers
+{
+ UnicodeHelpers() = delete;
+
+ static std::vector getLineBreaks (const String& data);
+};
+
+} // namespace juce::detail
diff --git a/modules/juce_graphics/juce_graphics.h b/modules/juce_graphics/juce_graphics.h
index 195d1ae31e..893c1f2d77 100644
--- a/modules/juce_graphics/juce_graphics.h
+++ b/modules/juce_graphics/juce_graphics.h
@@ -152,6 +152,7 @@ namespace juce
#include "effects/juce_ImageEffectFilter.h"
#include "effects/juce_DropShadowEffect.h"
#include "effects/juce_GlowEffect.h"
+#include "detail/juce_Unicode.h"
#if JUCE_GRAPHICS_INCLUDE_COREGRAPHICS_HELPERS && (JUCE_MAC || JUCE_IOS)
#include "native/juce_CoreGraphicsHelpers_mac.h"
diff --git a/modules/juce_graphics/unicode/juce_Unicode.cpp b/modules/juce_graphics/unicode/juce_Unicode.cpp
index f1cef2a07e..83c6d843a6 100644
--- a/modules/juce_graphics/unicode/juce_Unicode.cpp
+++ b/modules/juce_graphics/unicode/juce_Unicode.cpp
@@ -204,4 +204,23 @@ private:
}
};
+namespace detail
+{
+
+std::vector UnicodeHelpers::getLineBreaks (const String& data)
+{
+ std::vector lineBreaks;
+ const auto analysis = Unicode::performAnalysis (data);
+
+ for (const auto [index, codepoint] : enumerate (analysis, int{}))
+ {
+ if (codepoint.breaking == TextBreakType::hard)
+ lineBreaks.push_back (index);
+ }
+
+ return lineBreaks;
+}
+
+} // namespace detail
+
} // namespace juce