Fix wrong glyph calculation when ellipsis enabled 80/320280/5
authorANZ1217 <chihun.jeong@samsung.com>
Tue, 12 Nov 2024 05:20:33 +0000 (14:20 +0900)
committerANZ1217 <chihun.jeong@samsung.com>
Thu, 14 Nov 2024 01:29:15 +0000 (10:29 +0900)
In ElideGlyphs(), it uses x position of glyph to determine whether it is LTR or not.
Fix the problem that referring to the glyph information which position is not calculated in here.

Change-Id: Id9446f4ef66fa16058055060e2530e86bd939c9f

automated-tests/src/dali-toolkit-internal/utc-Dali-Text-Ellipsis.cpp
dali-toolkit/internal/text/layouts/layout-engine-helper-functions.cpp
dali-toolkit/internal/text/layouts/layout-engine.cpp

index e198992dc3d694a0326c0f72a7c4db408a5aab5c..90f710467102e6d0e91eeb16b62627f4c1f02d34 100755 (executable)
@@ -1052,7 +1052,7 @@ int UtcDaliTextFieldlElideTextLocation(void)
   float positions06[] = { 90.0f, 79.0f, 70.0f, 68.0f, 62.0f, 56.0f, 51.0f, 42.0f, 28.0f, 25.0f, 14.0f, 7.0f, 0.0f };
 
   Size  textSize07( 120.0f, 50.0f );
-  float positions07[] = { 0.0f, 12.0f, 22.0f, 32.0f, 42.0f, 55.0f };
+  float positions07[] = { 0.0f, 12.0f, 22.0f, 32.0f, 42.0f, 65.0f };
 
   Size  textSize08( 120.0f, 50.0f );
   float positions08[] = { 0.0f, 11.0f, 22.0f, 26.0f, 29.0f, 38.0f, 44.0f, 56.0f };
index 834ee7f6d547d314bb47127d517a36e2bf821986..785db9e058931b200493c85927045328c260674e 100644 (file)
@@ -51,7 +51,13 @@ void CalculateGlyphPositionsLTR(const VisualModelPtr&  visualModel,
 
   float calculatedAdvance = 0.f;
 
-  for(GlyphIndex i = 0u; i < numberOfGlyphs; ++i)
+  unsigned int numberOfGlyphsToCalculate = numberOfGlyphs;
+  if(startIndexForGlyph + numberOfGlyphs < (unsigned int)visualModel->mGlyphs.Count())
+  {
+    ++numberOfGlyphsToCalculate;
+  }
+
+  for(GlyphIndex i = 0u; i < numberOfGlyphsToCalculate; ++i)
   {
     const GlyphInfo& glyph    = *(glyphsBuffer + startIndexForGlyph + i);
     Vector2&         position = *(glyphPositionsBuffer + startIndexForGlyphPositions + i);
index 328f86ea54425a4eed79d21376b659ab858d2f60..6437a0cfc139f20489f46cc2344380be9337fb7c 100644 (file)
@@ -1760,7 +1760,8 @@ struct Engine::Impl
 
     if(updateCurrentBuffer)
     {
-      newGlyphPositions.Resize(layoutParameters.numberOfGlyphs);
+      // Increase Vector size by 1 to prevent out-of-bounds access during Ellipsis calculation.
+      newGlyphPositions.Resize(layoutParameters.numberOfGlyphs + 1);
       glyphPositionsBuffer = newGlyphPositions.Begin();
 
       newLines.Resize(linesCapacity);
@@ -2070,9 +2071,11 @@ struct Engine::Impl
 
     if(updateCurrentBuffer)
     {
+      // Insert up to newGlyphPositions.Begin() + layoutParameters.numberOfGlyphs (not newGlyphPositions.End())
+      // to avoid duplicating the extra element added for Ellipsis calculation.
       glyphPositions.Insert(glyphPositions.Begin() + layoutParameters.startGlyphIndex,
                             newGlyphPositions.Begin(),
-                            newGlyphPositions.End());
+                            newGlyphPositions.Begin() + layoutParameters.numberOfGlyphs);
       glyphPositions.Resize(totalNumberOfGlyphs);
 
       newLines.Resize(numberOfLines);