Browse Source

Fix(#457): text rendering fails due to incorrect cache usage (very rare)

MarcinZiabek 2 years ago
parent
commit
209a59dffd
1 changed files with 18 additions and 3 deletions
  1. 18 3
      Source/QuestPDF/Elements/Text/Items/TextBlockSpan.cs

+ 18 - 3
Source/QuestPDF/Elements/Text/Items/TextBlockSpan.cs

@@ -15,12 +15,27 @@ namespace QuestPDF.Elements.Text.Items
         private TextShapingResult? TextShapingResult { get; set; }
         private TextShapingResult? TextShapingResult { get; set; }
         private ushort? SpaceCodepoint { get; set; }
         private ushort? SpaceCodepoint { get; set; }
         
         
-        private Dictionary<(int startIndex, float availableWidth), TextMeasurementResult?> MeasureCache = new ();
-        protected virtual bool EnableTextCache => true; 
+        private Dictionary<MeasurementCacheKey, TextMeasurementResult?> MeasureCache = new ();
+        protected virtual bool EnableTextCache => true;
 
 
+        private record struct MeasurementCacheKey
+        {
+            public int StartIndex { get; set; }
+            public float AvailableWidth { get; set; }
+        
+            public bool IsFirstElementInBlock { get; set; }
+            public bool IsFirstElementInLine { get; set; }
+        }
+        
         public virtual TextMeasurementResult? Measure(TextMeasurementRequest request)
         public virtual TextMeasurementResult? Measure(TextMeasurementRequest request)
         {
         {
-            var cacheKey = (request.StartIndex, request.AvailableWidth);
+            var cacheKey = new MeasurementCacheKey
+            {
+                StartIndex = request.StartIndex,
+                AvailableWidth = request.AvailableWidth,
+                IsFirstElementInBlock = request.IsFirstElementInBlock,
+                IsFirstElementInLine = request.IsFirstElementInLine
+            };
              
              
             if (!MeasureCache.ContainsKey(cacheKey))
             if (!MeasureCache.ContainsKey(cacheKey))
                 MeasureCache[cacheKey] = MeasureWithoutCache(request);
                 MeasureCache[cacheKey] = MeasureWithoutCache(request);