From 6e752e8ee31b52aa78d7bb068dc55b36e262b2aa Mon Sep 17 00:00:00 2001 From: Seth Hillbrand Date: Tue, 27 Jan 2026 05:08:59 -0800 Subject: [PATCH] Include mirrored state in text render cache key The render cache for text glyphs was validated based on font, text, angle, and offset, but not the mirrored state. This caused incorrect rendering when text items had their mirrored state changed Add m_render_cache_mirrored to the cache key so the cache is properly invalidated when the mirrored state changes. This ensures dimension text and other text items render correctly on back layers in the 3D viewer. Fixes https://gitlab.com/kicad/code/kicad/-/issues/19291 --- common/eda_text.cpp | 9 ++++++++- include/eda_text.h | 1 + 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/common/eda_text.cpp b/common/eda_text.cpp index 1eedfdc22e..96fc7545f9 100644 --- a/common/eda_text.cpp +++ b/common/eda_text.cpp @@ -99,6 +99,7 @@ EDA_TEXT::EDA_TEXT( const EDA_IU_SCALE& aIuScale, const wxString& aText ) : m_text( aText ), m_IuScale( aIuScale ), m_render_cache_font( nullptr ), + m_render_cache_mirrored( false ), m_visible( true ) { SetTextSize( VECTOR2I( EDA_UNIT_UTILS::Mils2IU( m_IuScale, DEFAULT_SIZE_TEXT ), @@ -132,6 +133,7 @@ EDA_TEXT::EDA_TEXT( const EDA_TEXT& aText ) : m_render_cache_text = aText.m_render_cache_text; m_render_cache_angle = aText.m_render_cache_angle; m_render_cache_offset = aText.m_render_cache_offset; + m_render_cache_mirrored = aText.m_render_cache_mirrored; m_render_cache.clear(); @@ -174,6 +176,7 @@ EDA_TEXT& EDA_TEXT::operator=( const EDA_TEXT& aText ) m_render_cache_text = aText.m_render_cache_text; m_render_cache_angle = aText.m_render_cache_angle; m_render_cache_offset = aText.m_render_cache_offset; + m_render_cache_mirrored = aText.m_render_cache_mirrored; m_render_cache.clear(); @@ -694,9 +697,11 @@ EDA_TEXT::GetRenderCache( const KIFONT::FONT* aFont, const wxString& forResolved if( aFont->IsOutline() ) { EDA_ANGLE resolvedAngle = GetDrawRotation(); + bool mirrored = IsMirrored(); if( m_render_cache.empty() || m_render_cache_font != aFont || m_render_cache_text != forResolvedText - || m_render_cache_angle != resolvedAngle || m_render_cache_offset != aOffset ) + || m_render_cache_angle != resolvedAngle || m_render_cache_offset != aOffset + || m_render_cache_mirrored != mirrored ) { m_render_cache.clear(); @@ -710,6 +715,7 @@ EDA_TEXT::GetRenderCache( const KIFONT::FONT* aFont, const wxString& forResolved m_render_cache_angle = resolvedAngle; m_render_cache_text = forResolvedText; m_render_cache_offset = aOffset; + m_render_cache_mirrored = mirrored; } return &m_render_cache; @@ -726,6 +732,7 @@ void EDA_TEXT::SetupRenderCache( const wxString& aResolvedText, const KIFONT::FO m_render_cache_font = aFont; m_render_cache_angle = aAngle; m_render_cache_offset = aOffset; + m_render_cache_mirrored = IsMirrored(); m_render_cache.clear(); } diff --git a/include/eda_text.h b/include/eda_text.h index 131e05e0f5..8e2002545c 100644 --- a/include/eda_text.h +++ b/include/eda_text.h @@ -467,6 +467,7 @@ private: mutable const KIFONT::FONT* m_render_cache_font; mutable EDA_ANGLE m_render_cache_angle; mutable VECTOR2I m_render_cache_offset; + mutable bool m_render_cache_mirrored; mutable std::vector> m_render_cache; struct BBOX_CACHE_ENTRY