Browse Source

Fix RTL hit testing after bidi mirror changes

Benedikt Stebner 3 years ago
parent
commit
3e127d70a1

+ 5 - 2
src/Avalonia.Base/Media/GlyphRun.cs

@@ -361,7 +361,9 @@ namespace Avalonia.Media
 
                     characterIndex = cluster;
 
-                    if (currentX - advance < distance)
+                    var offsetX = currentX - advance;
+
+                    if (offsetX < distance)
                     {
                         break;
                     }
@@ -375,7 +377,8 @@ namespace Avalonia.Media
             var characterHit = FindNearestCharacterHit(characterIndex, out var width);
 
             var delta = width / 2;
-            var offset = IsLeftToRight ? distance - currentX : currentX - distance;
+            
+            var offset = IsLeftToRight ? Math.Round(distance - currentX, 3) : Math.Round(currentX - distance, 3);
 
             var isTrailing = offset > delta;
 

+ 4 - 1
tests/Avalonia.Skia.UnitTests/Media/TextFormatting/TextLayoutTests.cs

@@ -1009,7 +1009,10 @@ namespace Avalonia.Skia.UnitTests.Media.TextFormatting
 
                         currentX += glyphAdvance;
 
-                        cluster = clusters[j];
+                        if(glyphAdvance > 0)
+                        {
+                            cluster = clusters[j];
+                        }
                     }
                 }
             }