diff --git a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
index 2701be6ff0..213b9fb32b 100644
--- a/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
+++ b/examples/DemoRunner/Builds/Android/app/CMakeLists.txt
@@ -1821,6 +1821,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_graphics/fonts/juce_FunctionPointerDestructor.h"
"../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp"
"../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h"
+ "../../../../../modules/juce_graphics/fonts/juce_LruCache.h"
"../../../../../modules/juce_graphics/fonts/juce_TextLayout.cpp"
"../../../../../modules/juce_graphics/fonts/juce_TextLayout.h"
"../../../../../modules/juce_graphics/fonts/juce_Typeface.cpp"
@@ -4284,6 +4285,7 @@ set_source_files_properties(
"../../../../../modules/juce_graphics/fonts/juce_FunctionPointerDestructor.h"
"../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp"
"../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h"
+ "../../../../../modules/juce_graphics/fonts/juce_LruCache.h"
"../../../../../modules/juce_graphics/fonts/juce_TextLayout.cpp"
"../../../../../modules/juce_graphics/fonts/juce_TextLayout.h"
"../../../../../modules/juce_graphics/fonts/juce_Typeface.cpp"
diff --git a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj
index 5eec35f268..409bed9e2b 100644
--- a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj
@@ -4135,6 +4135,7 @@
+
diff --git a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters
index 491d11e512..1310a4b55b 100644
--- a/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2017/DemoRunner_App.vcxproj.filters
@@ -7137,6 +7137,9 @@
JUCE Modules\juce_graphics\fonts
+
+ JUCE Modules\juce_graphics\fonts
+
JUCE Modules\juce_graphics\fonts
diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
index e27808acf1..7bc2f31cc7 100644
--- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj
@@ -4135,6 +4135,7 @@
+
diff --git a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
index 90e8fbeb7f..10cb5d602b 100644
--- a/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2019/DemoRunner_App.vcxproj.filters
@@ -7137,6 +7137,9 @@
JUCE Modules\juce_graphics\fonts
+
+ JUCE Modules\juce_graphics\fonts
+
JUCE Modules\juce_graphics\fonts
diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
index 7703651909..d034adfd40 100644
--- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
+++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj
@@ -4135,6 +4135,7 @@
+
diff --git a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
index f1a7954b7e..832d8fd8da 100644
--- a/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
+++ b/examples/DemoRunner/Builds/VisualStudio2022/DemoRunner_App.vcxproj.filters
@@ -7137,6 +7137,9 @@
JUCE Modules\juce_graphics\fonts
+
+ JUCE Modules\juce_graphics\fonts
+
JUCE Modules\juce_graphics\fonts
diff --git a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
index ee894e8676..3cb52b0dfb 100644
--- a/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
+++ b/extras/AudioPerformanceTest/Builds/Android/app/CMakeLists.txt
@@ -1583,6 +1583,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_graphics/fonts/juce_FunctionPointerDestructor.h"
"../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp"
"../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h"
+ "../../../../../modules/juce_graphics/fonts/juce_LruCache.h"
"../../../../../modules/juce_graphics/fonts/juce_TextLayout.cpp"
"../../../../../modules/juce_graphics/fonts/juce_TextLayout.h"
"../../../../../modules/juce_graphics/fonts/juce_Typeface.cpp"
@@ -3728,6 +3729,7 @@ set_source_files_properties(
"../../../../../modules/juce_graphics/fonts/juce_FunctionPointerDestructor.h"
"../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp"
"../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h"
+ "../../../../../modules/juce_graphics/fonts/juce_LruCache.h"
"../../../../../modules/juce_graphics/fonts/juce_TextLayout.cpp"
"../../../../../modules/juce_graphics/fonts/juce_TextLayout.h"
"../../../../../modules/juce_graphics/fonts/juce_Typeface.cpp"
diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
index 29a78ff88e..b2b87cf479 100644
--- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
+++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj
@@ -3606,6 +3606,7 @@
+
diff --git a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
index d1b6ca7e51..181041210a 100644
--- a/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
+++ b/extras/AudioPerformanceTest/Builds/VisualStudio2022/AudioPerformanceTest_App.vcxproj.filters
@@ -6192,6 +6192,9 @@
JUCE Modules\juce_graphics\fonts
+
+ JUCE Modules\juce_graphics\fonts
+
JUCE Modules\juce_graphics\fonts
diff --git a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
index 5836a2c403..39a284b2b2 100644
--- a/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
+++ b/extras/AudioPluginHost/Builds/Android/app/CMakeLists.txt
@@ -1713,6 +1713,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_graphics/fonts/juce_FunctionPointerDestructor.h"
"../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp"
"../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h"
+ "../../../../../modules/juce_graphics/fonts/juce_LruCache.h"
"../../../../../modules/juce_graphics/fonts/juce_TextLayout.cpp"
"../../../../../modules/juce_graphics/fonts/juce_TextLayout.h"
"../../../../../modules/juce_graphics/fonts/juce_Typeface.cpp"
@@ -4011,6 +4012,7 @@ set_source_files_properties(
"../../../../../modules/juce_graphics/fonts/juce_FunctionPointerDestructor.h"
"../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp"
"../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h"
+ "../../../../../modules/juce_graphics/fonts/juce_LruCache.h"
"../../../../../modules/juce_graphics/fonts/juce_TextLayout.cpp"
"../../../../../modules/juce_graphics/fonts/juce_TextLayout.h"
"../../../../../modules/juce_graphics/fonts/juce_Typeface.cpp"
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj
index 7274a0ec43..34e5bd94e2 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj
@@ -3839,6 +3839,7 @@
+
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters
index ad9cc580ec..43d7ced166 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2017/AudioPluginHost_App.vcxproj.filters
@@ -6627,6 +6627,9 @@
JUCE Modules\juce_graphics\fonts
+
+ JUCE Modules\juce_graphics\fonts
+
JUCE Modules\juce_graphics\fonts
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
index 59d788a62a..932ac849a3 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj
@@ -3839,6 +3839,7 @@
+
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
index b7958f9f03..2b2dc9a272 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2019/AudioPluginHost_App.vcxproj.filters
@@ -6627,6 +6627,9 @@
JUCE Modules\juce_graphics\fonts
+
+ JUCE Modules\juce_graphics\fonts
+
JUCE Modules\juce_graphics\fonts
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
index 4346f8bab0..58b6da112f 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
+++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj
@@ -3839,6 +3839,7 @@
+
diff --git a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
index 003ef7864b..e54be8ba21 100644
--- a/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
+++ b/extras/AudioPluginHost/Builds/VisualStudio2022/AudioPluginHost_App.vcxproj.filters
@@ -6627,6 +6627,9 @@
JUCE Modules\juce_graphics\fonts
+
+ JUCE Modules\juce_graphics\fonts
+
JUCE Modules\juce_graphics\fonts
diff --git a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
index acea45e7ff..7b770e2113 100644
--- a/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
+++ b/extras/NetworkGraphicsDemo/Builds/Android/app/CMakeLists.txt
@@ -1602,6 +1602,7 @@ add_library( ${BINARY_NAME}
"../../../../../modules/juce_graphics/fonts/juce_FunctionPointerDestructor.h"
"../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp"
"../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h"
+ "../../../../../modules/juce_graphics/fonts/juce_LruCache.h"
"../../../../../modules/juce_graphics/fonts/juce_TextLayout.cpp"
"../../../../../modules/juce_graphics/fonts/juce_TextLayout.h"
"../../../../../modules/juce_graphics/fonts/juce_Typeface.cpp"
@@ -3827,6 +3828,7 @@ set_source_files_properties(
"../../../../../modules/juce_graphics/fonts/juce_FunctionPointerDestructor.h"
"../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.cpp"
"../../../../../modules/juce_graphics/fonts/juce_GlyphArrangement.h"
+ "../../../../../modules/juce_graphics/fonts/juce_LruCache.h"
"../../../../../modules/juce_graphics/fonts/juce_TextLayout.cpp"
"../../../../../modules/juce_graphics/fonts/juce_TextLayout.h"
"../../../../../modules/juce_graphics/fonts/juce_Typeface.cpp"
diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
index 1116fa49a0..bba04587c3 100644
--- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
+++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj
@@ -3704,6 +3704,7 @@
+
diff --git a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
index 12796b1747..e84dfcd2d1 100644
--- a/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
+++ b/extras/NetworkGraphicsDemo/Builds/VisualStudio2022/NetworkGraphicsDemo_App.vcxproj.filters
@@ -6354,6 +6354,9 @@
JUCE Modules\juce_graphics\fonts
+
+ JUCE Modules\juce_graphics\fonts
+
JUCE Modules\juce_graphics\fonts
diff --git a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj
index 0e7f58e592..e32fdb2ceb 100644
--- a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj
+++ b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj
@@ -2521,6 +2521,7 @@
+
diff --git a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters
index 3253030f02..5b68dbba75 100644
--- a/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters
+++ b/extras/Projucer/Builds/VisualStudio2017/Projucer_App.vcxproj.filters
@@ -4332,6 +4332,9 @@
JUCE Modules\juce_graphics\fonts
+
+ JUCE Modules\juce_graphics\fonts
+
JUCE Modules\juce_graphics\fonts
diff --git a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj
index 9c034564dd..f5f1fa8bea 100644
--- a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj
+++ b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj
@@ -2521,6 +2521,7 @@
+
diff --git a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
index 27ff30dbc5..57cc299aa9 100644
--- a/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
+++ b/extras/Projucer/Builds/VisualStudio2019/Projucer_App.vcxproj.filters
@@ -4332,6 +4332,9 @@
JUCE Modules\juce_graphics\fonts
+
+ JUCE Modules\juce_graphics\fonts
+
JUCE Modules\juce_graphics\fonts
diff --git a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj
index a6fd888f10..f593e05a18 100644
--- a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj
+++ b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj
@@ -2521,6 +2521,7 @@
+
diff --git a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters
index 44c0153f5e..a9ebc0ba85 100644
--- a/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters
+++ b/extras/Projucer/Builds/VisualStudio2022/Projucer_App.vcxproj.filters
@@ -4332,6 +4332,9 @@
JUCE Modules\juce_graphics\fonts
+
+ JUCE Modules\juce_graphics\fonts
+
JUCE Modules\juce_graphics\fonts
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj
index aa44f67a72..cfc1e8944b 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj
@@ -3935,6 +3935,7 @@
+
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters
index dce8dbe962..e8891893e4 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2017/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -6741,6 +6741,9 @@
JUCE Modules\juce_graphics\fonts
+
+ JUCE Modules\juce_graphics\fonts
+
JUCE Modules\juce_graphics\fonts
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
index 5b513e4bbf..37318296d2 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj
@@ -3935,6 +3935,7 @@
+
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
index 78aa21314c..ab2d5f5570 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2019/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -6741,6 +6741,9 @@
JUCE Modules\juce_graphics\fonts
+
+ JUCE Modules\juce_graphics\fonts
+
JUCE Modules\juce_graphics\fonts
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
index 60bba34113..cac9e8a8e6 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
+++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj
@@ -3935,6 +3935,7 @@
+
diff --git a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
index 76c7151150..c3066925f9 100644
--- a/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
+++ b/extras/UnitTestRunner/Builds/VisualStudio2022/UnitTestRunner_ConsoleApp.vcxproj.filters
@@ -6741,6 +6741,9 @@
JUCE Modules\juce_graphics\fonts
+
+ JUCE Modules\juce_graphics\fonts
+
JUCE Modules\juce_graphics\fonts
diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj
index 989161a28a..d756c649f7 100644
--- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj
+++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj
@@ -3680,6 +3680,7 @@
+
diff --git a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters
index 868c703321..0421b160a0 100644
--- a/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters
+++ b/extras/WindowsDLL/Builds/VisualStudio2022/WindowsDLL_StaticLibrary.vcxproj.filters
@@ -6321,6 +6321,9 @@
JUCE Modules\juce_graphics\fonts
+
+ JUCE Modules\juce_graphics\fonts
+
JUCE Modules\juce_graphics\fonts
diff --git a/modules/juce_graphics/contexts/juce_GraphicsContext.cpp b/modules/juce_graphics/contexts/juce_GraphicsContext.cpp
index 294ccd1038..205697c78f 100644
--- a/modules/juce_graphics/contexts/juce_GraphicsContext.cpp
+++ b/modules/juce_graphics/contexts/juce_GraphicsContext.cpp
@@ -62,7 +62,10 @@ namespace
{
struct ConfiguredArrangement
{
- void draw (const Graphics& g) const { arrangement.draw (g, transform); }
+ void draw (const Graphics& g) const
+ {
+ arrangement.draw (g, transform);
+ }
GlyphArrangement arrangement;
AffineTransform transform;
@@ -80,56 +83,17 @@ namespace
}
template
- void draw (const Graphics& g, ArrangementArgs&& args, ConfigureArrangement&& configureArrangement)
+ [[nodiscard]] auto get (ArrangementArgs&& args, ConfigureArrangement&& configureArrangement)
{
const ScopedTryLock stl (lock);
-
- if (! stl.isLocked())
- {
- configureArrangement (args).draw (g);
- return;
- }
-
- const auto cached = [&]
- {
- const auto iter = cache.find (args);
-
- if (iter != cache.end())
- {
- if (iter->second.cachePosition != cacheOrder.begin())
- cacheOrder.splice (cacheOrder.begin(), cacheOrder, iter->second.cachePosition);
-
- return iter;
- }
-
- auto result = cache.emplace (std::move (args), CachedGlyphArrangement { configureArrangement (args), {} }).first;
- cacheOrder.push_front (result);
- return result;
- }();
-
- cached->second.cachePosition = cacheOrder.begin();
- cached->second.configured.draw (g);
-
- while (cache.size() > cacheSize)
- {
- cache.erase (cacheOrder.back());
- cacheOrder.pop_back();
- }
+ return stl.isLocked() ? cache.get (args, std::forward (configureArrangement))
+ : configureArrangement (args);
}
JUCE_DECLARE_SINGLETON (GlyphArrangementCache, false)
private:
- struct CachedGlyphArrangement
- {
- using CachePtr = typename std::map::const_iterator;
- ConfiguredArrangement configured;
- typename std::list::const_iterator cachePosition;
- };
-
- static constexpr size_t cacheSize = 128;
- std::map cache;
- std::list cacheOrder;
+ LruCache cache;
CriticalSection lock;
};
@@ -383,9 +347,9 @@ void Graphics::drawSingleLineText (const String& text, const int startX, const i
return ConfiguredArrangement { std::move (arrangement), std::move (transform) };
};
- GlyphArrangementCache::getInstance()->draw (*this,
- { context.getFont(), text, startX, baselineY, flags },
- std::move (configureArrangement));
+ GlyphArrangementCache::getInstance()->get ({ context.getFont(), text, startX, baselineY, flags },
+ std::move (configureArrangement))
+ .draw (*this);
}
void Graphics::drawMultiLineText (const String& text, const int startX,
@@ -416,9 +380,9 @@ void Graphics::drawMultiLineText (const String& text, const int startX,
return ConfiguredArrangement { std::move (arrangement), {} };
};
- GlyphArrangementCache::getInstance()->draw (*this,
- { context.getFont(), text, startX, baselineY, maximumLineWidth, justification, leading },
- std::move (configureArrangement));
+ GlyphArrangementCache::getInstance()->get ({ context.getFont(), text, startX, baselineY, maximumLineWidth, justification, leading },
+ std::move (configureArrangement))
+ .draw (*this);
}
void Graphics::drawText (const String& text, Rectangle area,
@@ -451,9 +415,9 @@ void Graphics::drawText (const String& text, Rectangle area,
return ConfiguredArrangement { std::move (arrangement), {} };
};
- GlyphArrangementCache::getInstance()->draw (*this,
- { context.getFont(), text, area, justificationType, useEllipsesIfTooBig },
- std::move (configureArrangement));
+ GlyphArrangementCache::getInstance()->get ({ context.getFont(), text, area, justificationType, useEllipsesIfTooBig },
+ std::move (configureArrangement))
+ .draw (*this);
}
void Graphics::drawText (const String& text, Rectangle area,
@@ -501,9 +465,9 @@ void Graphics::drawFittedText (const String& text, Rectangle area,
return ConfiguredArrangement { std::move (arrangement), {} };
};
- GlyphArrangementCache::getInstance()->draw (*this,
- { context.getFont(), text, area.toFloat(), justification, maximumNumberOfLines, minimumHorizontalScale },
- std::move (configureArrangement));
+ GlyphArrangementCache::getInstance()->get ({ context.getFont(), text, area.toFloat(), justification, maximumNumberOfLines, minimumHorizontalScale },
+ std::move (configureArrangement))
+ .draw (*this);
}
void Graphics::drawFittedText (const String& text, int x, int y, int width, int height,
diff --git a/modules/juce_graphics/fonts/juce_LruCache.h b/modules/juce_graphics/fonts/juce_LruCache.h
new file mode 100644
index 0000000000..96ab860533
--- /dev/null
+++ b/modules/juce_graphics/fonts/juce_LruCache.h
@@ -0,0 +1,84 @@
+/*
+ ==============================================================================
+
+ 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
+{
+
+template
+class LruCache
+{
+public:
+ template
+ Value get (Key key, Fn&& fn)
+ {
+ if (const auto iter = map.find (key); iter != map.end())
+ {
+ list.erase (iter->second.listIterator);
+ iter->second.listIterator = list.insert (list.end(), iter);
+ return iter->second.value;
+ }
+
+ while (list.size() >= maxEntries)
+ {
+ const auto toRemove = list.begin();
+ map.erase (*toRemove);
+ list.erase (toRemove);
+ }
+
+ auto value = fn (key);
+ const auto mapIteratorPair = map.emplace (std::move (key), Pair { std::move (value), {} });
+
+ jassert (mapIteratorPair.second);
+
+ mapIteratorPair.first->second.listIterator = list.insert (list.end(), mapIteratorPair.first);
+ return mapIteratorPair.first->second.value;
+ }
+
+private:
+ struct Pair
+ {
+ using Map = std::map;
+ using MapIterator = typename Map::const_iterator;
+ using List = std::list;
+ using ListIterator = typename List::const_iterator;
+
+ Value value;
+ ListIterator listIterator;
+ };
+
+ typename Pair::Map map;
+ typename Pair::List list;
+};
+
+} // namespace juce
diff --git a/modules/juce_graphics/juce_graphics.cpp b/modules/juce_graphics/juce_graphics.cpp
index 681f339844..d0e103765e 100644
--- a/modules/juce_graphics/juce_graphics.cpp
+++ b/modules/juce_graphics/juce_graphics.cpp
@@ -105,6 +105,7 @@
//==============================================================================
#include "fonts/juce_FunctionPointerDestructor.h"
+#include "fonts/juce_LruCache.h"
#include "colour/juce_Colour.cpp"
#include "colour/juce_ColourGradient.cpp"