diff --git a/common/eda_text.cpp b/common/eda_text.cpp
index 8fabd00e44..e73a78e9d9 100644
--- a/common/eda_text.cpp
+++ b/common/eda_text.cpp
@@ -95,9 +95,7 @@ GR_TEXT_V_ALIGN_T EDA_TEXT::MapVertJustify( int aVertJustify )
 EDA_TEXT::EDA_TEXT( const EDA_IU_SCALE& aIuScale, const wxString& aText ) :
         m_text( aText ),
         m_IuScale( aIuScale ),
-        m_render_cache_font( nullptr ),
-        m_bounding_box_cache_valid( false ),
-        m_bounding_box_cache_line( -1 )
+        m_render_cache_font( nullptr )
 {
     SetTextSize( VECTOR2I( EDA_UNIT_UTILS::Mils2IU( m_IuScale, DEFAULT_SIZE_TEXT ),
                            EDA_UNIT_UTILS::Mils2IU( m_IuScale, DEFAULT_SIZE_TEXT ) ) );
@@ -140,9 +138,7 @@ EDA_TEXT::EDA_TEXT( const EDA_TEXT& aText ) :
             m_render_cache.emplace_back( std::make_unique<KIFONT::STROKE_GLYPH>( *stroke ) );
     }
 
-    m_bounding_box_cache_valid = aText.m_bounding_box_cache_valid;
-    m_bounding_box_cache = aText.m_bounding_box_cache;
-    m_bounding_box_cache_line = aText.m_bounding_box_cache_line;
+    m_bbox_cache = aText.m_bbox_cache;
 
     m_unresolvedFontName = aText.m_unresolvedFontName;
 }
@@ -177,8 +173,7 @@ EDA_TEXT& EDA_TEXT::operator=( const EDA_TEXT& aText )
             m_render_cache.emplace_back( std::make_unique<KIFONT::STROKE_GLYPH>( *stroke ) );
     }
 
-    m_bounding_box_cache_valid = aText.m_bounding_box_cache_valid;
-    m_bounding_box_cache = aText.m_bounding_box_cache;
+    m_bbox_cache = aText.m_bbox_cache;
 
     m_unresolvedFontName = aText.m_unresolvedFontName;
 
@@ -288,7 +283,7 @@ void EDA_TEXT::SetTextThickness( int aWidth )
 {
     m_attributes.m_StrokeWidth = aWidth;
     ClearRenderCache();
-    m_bounding_box_cache_valid = false;
+    ClearBoundingBoxCache();
 }
 
 
@@ -296,7 +291,7 @@ void EDA_TEXT::SetTextAngle( const EDA_ANGLE& aAngle )
 {
     m_attributes.m_Angle = aAngle;
     ClearRenderCache();
-    m_bounding_box_cache_valid = false;
+    ClearBoundingBoxCache();
 }
 
 
@@ -324,7 +319,7 @@ void EDA_TEXT::SetItalicFlag( bool aItalic )
 {
     m_attributes.m_Italic = aItalic;
     ClearRenderCache();
-    m_bounding_box_cache_valid = false;
+    ClearBoundingBoxCache();
 }
 
 
@@ -375,7 +370,7 @@ void EDA_TEXT::SetBoldFlag( bool aBold )
 {
     m_attributes.m_Bold = aBold;
     ClearRenderCache();
-    m_bounding_box_cache_valid = false;
+    ClearBoundingBoxCache();
 }
 
 
@@ -390,7 +385,7 @@ void EDA_TEXT::SetMirrored( bool isMirrored )
 {
     m_attributes.m_Mirrored = isMirrored;
     ClearRenderCache();
-    m_bounding_box_cache_valid = false;
+    ClearBoundingBoxCache();
 }
 
 
@@ -398,7 +393,7 @@ void EDA_TEXT::SetMultilineAllowed( bool aAllow )
 {
     m_attributes.m_Multiline = aAllow;
     ClearRenderCache();
-    m_bounding_box_cache_valid = false;
+    ClearBoundingBoxCache();
 }
 
 
@@ -406,7 +401,7 @@ void EDA_TEXT::SetHorizJustify( GR_TEXT_H_ALIGN_T aType )
 {
     m_attributes.m_Halign = aType;
     ClearRenderCache();
-    m_bounding_box_cache_valid = false;
+    ClearBoundingBoxCache();
 }
 
 
@@ -414,7 +409,7 @@ void EDA_TEXT::SetVertJustify( GR_TEXT_V_ALIGN_T aType )
 {
     m_attributes.m_Valign = aType;
     ClearRenderCache();
-    m_bounding_box_cache_valid = false;
+    ClearBoundingBoxCache();
 }
 
 
@@ -422,7 +417,7 @@ void EDA_TEXT::SetKeepUpright( bool aKeepUpright )
 {
     m_attributes.m_KeepUpright = aKeepUpright;
     ClearRenderCache();
-    m_bounding_box_cache_valid = false;
+    ClearBoundingBoxCache();
 }
 
 
@@ -434,7 +429,7 @@ void EDA_TEXT::SetAttributes( const EDA_TEXT& aSrc, bool aSetPosition )
         m_pos = aSrc.m_pos;
 
     ClearRenderCache();
-    m_bounding_box_cache_valid = false;
+    ClearBoundingBoxCache();
 }
 
 
@@ -453,8 +448,8 @@ void EDA_TEXT::SwapAttributes( EDA_TEXT& aTradingPartner )
     ClearRenderCache();
     aTradingPartner.ClearRenderCache();
 
-    m_bounding_box_cache_valid = false;
-    aTradingPartner.m_bounding_box_cache_valid = false;
+    ClearBoundingBoxCache();
+    aTradingPartner.ClearBoundingBoxCache();
 }
 
 
@@ -486,7 +481,7 @@ bool EDA_TEXT::Replace( const EDA_SEARCH_DATA& aSearchData )
     cacheShownText();
 
     ClearRenderCache();
-    m_bounding_box_cache_valid = false;
+    ClearBoundingBoxCache();
 
     return retval;
 }
@@ -496,7 +491,7 @@ void EDA_TEXT::SetFont( KIFONT::FONT* aFont )
 {
     m_attributes.m_Font = aFont;
     ClearRenderCache();
-    m_bounding_box_cache_valid = false;
+    ClearBoundingBoxCache();
 }
 
 
@@ -522,7 +517,7 @@ void EDA_TEXT::SetLineSpacing( double aLineSpacing )
 {
     m_attributes.m_LineSpacing = aLineSpacing;
     ClearRenderCache();
-    m_bounding_box_cache_valid = false;
+    ClearBoundingBoxCache();
 }
 
 
@@ -545,7 +540,7 @@ void EDA_TEXT::SetTextSize( VECTOR2I aNewSize, bool aEnforceMinTextSize )
     m_attributes.m_Size = aNewSize;
 
     ClearRenderCache();
-    m_bounding_box_cache_valid = false;
+    ClearBoundingBoxCache();
 }
 
 
@@ -556,7 +551,7 @@ void EDA_TEXT::SetTextWidth( int aWidth )
 
     m_attributes.m_Size.x = std::clamp( aWidth, min, max );
     ClearRenderCache();
-    m_bounding_box_cache_valid = false;
+    ClearBoundingBoxCache();
 }
 
 
@@ -567,7 +562,7 @@ void EDA_TEXT::SetTextHeight( int aHeight )
 
     m_attributes.m_Size.y = std::clamp( aHeight, min, max );
     ClearRenderCache();
-    m_bounding_box_cache_valid = false;
+    ClearBoundingBoxCache();
 }
 
 
@@ -604,7 +599,7 @@ void EDA_TEXT::Offset( const VECTOR2I& aOffset )
             glyph = stroke->Transform( { 1.0, 1.0 }, aOffset, 0, ANGLE_0, false, { 0, 0 } );
     }
 
-    m_bounding_box_cache_valid = false;
+    ClearBoundingBoxCache();
 }
 
 
@@ -612,7 +607,7 @@ void EDA_TEXT::Empty()
 {
     m_text.Empty();
     ClearRenderCache();
-    m_bounding_box_cache_valid = false;
+    ClearBoundingBoxCache();
 }
 
 
@@ -630,7 +625,7 @@ void EDA_TEXT::cacheShownText()
     }
 
     ClearRenderCache();
-    m_bounding_box_cache_valid = false;
+    ClearBoundingBoxCache();
 }
 
 
@@ -659,7 +654,7 @@ void EDA_TEXT::ClearRenderCache()
 
 void EDA_TEXT::ClearBoundingBoxCache()
 {
-    m_bounding_box_cache_valid = false;
+    m_bbox_cache.clear();
 }
 
 
@@ -727,12 +722,10 @@ BOX2I EDA_TEXT::GetTextBox( int aLine ) const
 {
     VECTOR2I drawPos = GetDrawPos();
 
-    if( m_bounding_box_cache_valid
-            && m_bounding_box_cache_pos == drawPos
-            && m_bounding_box_cache_line == aLine )
-    {
-        return m_bounding_box_cache;
-    }
+    auto cache_it = m_bbox_cache.find( aLine );
+
+    if( cache_it != m_bbox_cache.end() && cache_it->second.m_pos == drawPos )
+        return cache_it->second.m_bbox;
 
     BOX2I          bbox;
     wxArrayString  strings;
@@ -849,10 +842,7 @@ BOX2I EDA_TEXT::GetTextBox( int aLine ) const
 
     bbox.Normalize();       // Make h and v sizes always >= 0
 
-    m_bounding_box_cache_valid = true;
-    m_bounding_box_cache_pos = drawPos;
-    m_bounding_box_cache_line = aLine;
-    m_bounding_box_cache = bbox;
+    m_bbox_cache[ aLine ] = { drawPos, bbox };
 
     return bbox;
 }
diff --git a/include/eda_text.h b/include/eda_text.h
index c485807512..0bf4d5a05d 100644
--- a/include/eda_text.h
+++ b/include/eda_text.h
@@ -453,10 +453,13 @@ private:
     mutable VECTOR2I                                    m_render_cache_offset;
     mutable std::vector<std::unique_ptr<KIFONT::GLYPH>> m_render_cache;
 
-    mutable bool     m_bounding_box_cache_valid;
-    mutable VECTOR2I m_bounding_box_cache_pos;
-    mutable int      m_bounding_box_cache_line;
-    mutable BOX2I    m_bounding_box_cache;
+    struct BBOX_CACHE_ENTRY
+    {
+        VECTOR2I m_pos;
+        BOX2I    m_bbox;
+    };
+
+    mutable std::map<int, BBOX_CACHE_ENTRY> m_bbox_cache;
 
     TEXT_ATTRIBUTES  m_attributes;
     wxString         m_unresolvedFontName;