+ // Single line case with MIDDLE
+ // In case the Ellipsis in the middle of line,
+ // Then the last index in first half will be firstMiddleIndex.
+ // And the indexOfEllipsis will be secondMiddleIndex, which is the first index in second half.
+ // Example:
+ // A: are laid out glyphs in first half of line.
+ // N: are laid out glyphs in second half of line.
+ // R: are removed glyphs.
+ // L: re removed glyphs when layouting text
+ // AAAAAAALLLLLLLLLLLRRR...NNNNN
+ // firstMiddleIndex (index of last A)
+ // secondMiddleIndex (index before first N)
+
+ firstMiddleIndexOfElidedGlyphs = (ellipsisLine->glyphRun.numberOfGlyphs > 0u) ? (ellipsisLine->glyphRun.glyphIndex + ellipsisLine->glyphRun.numberOfGlyphs - 1u) : (ellipsisLine->glyphRun.glyphIndex);
+ secondMiddleIndexOfElidedGlyphs = indexOfEllipsis;
+ isOnlySecondHalf = ellipsisLine->glyphRun.numberOfGlyphs == 0u && ellipsisLine->glyphRunSecondHalf.numberOfGlyphs > 0u;
+ }
+
+ mImpl->mVisualModel->SetFirstMiddleIndexOfElidedGlyphs(firstMiddleIndexOfElidedGlyphs);
+ mImpl->mVisualModel->SetSecondMiddleIndexOfElidedGlyphs(secondMiddleIndexOfElidedGlyphs);
+
+ // The number of shifted glyphs and shifting positions will be different according to Single-line or Multi-lines.
+ // isOnlySecondHalf will be true when MIDDLE Ellipsis glyph in single line.
+ if(isOnlySecondHalf)
+ {
+ Length numberOfSecondHalfGlyphs = numberOfLaidOutGlyphs - firstMiddleIndexOfElidedGlyphs;
+
+ //Copy elided glyphs after the ellipsis glyph.
+ memcpy(glyphs + firstMiddleIndexOfElidedGlyphs, glyphs + secondMiddleIndexOfElidedGlyphs, numberOfSecondHalfGlyphs * sizeof(GlyphInfo));
+ memcpy(glyphPositions + firstMiddleIndexOfElidedGlyphs, glyphPositions + secondMiddleIndexOfElidedGlyphs, numberOfSecondHalfGlyphs * sizeof(Vector2));