/*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
{
namespace Text
{
-bool GetNextLine(GlyphIndex index, LineIndex& lineIndex, LineRun*& lineRun, GlyphIndex& lastGlyphOfLine, Length numberOfLines)
+bool GetNextLine(GlyphIndex index, LineIndex& lineIndex, LineRun*& lineRun, GlyphIndex& lastGlyphOfLine, Length numberOfLines, bool& isLastLine)
{
if(index == lastGlyphOfLine)
{
++lineIndex;
if(lineIndex < numberOfLines)
{
+ isLastLine = (lineIndex + 1 == numberOfLines);
++lineRun;
return true;
}
return false;
}
-void UpdateLineInfo(const LineRun* lineRun, float& currentLineOffset, float& currentLineHeight, GlyphIndex& lastGlyphOfLine)
+void UpdateLineInfo(const LineRun* lineRun, float& currentLineOffset, float& currentLineHeight, GlyphIndex& lastGlyphOfLine, bool isLastLine)
{
lastGlyphOfLine = lineRun->glyphRun.glyphIndex + lineRun->glyphRun.numberOfGlyphs - 1u;
currentLineOffset = currentLineOffset + currentLineHeight;
- currentLineHeight = GetLineHeight(*lineRun);
+ currentLineHeight = GetLineHeight(*lineRun, isLastLine);
}
void GetTextGeometry(ModelPtr textModel, CharacterIndex startIndex, CharacterIndex endIndex, Vector<Vector2>& sizesList, Vector<Vector2>& positionsList)
const CharacterIndex* const glyphToCharacterBuffer = visualModel->mGlyphsToCharacters.Begin();
const CharacterDirection* const modelCharacterDirectionsBuffer = (0u != logicalModel->mCharacterDirections.Count()) ? logicalModel->mCharacterDirections.Begin() : NULL;
- if((startIndex < 0 && endIndex < 0) || (startIndex >= logicalModel->mText.Count() && endIndex >= logicalModel->mText.Count()))
+ if(startIndex >= logicalModel->mText.Count() && endIndex >= logicalModel->mText.Count())
return;
- if(startIndex < 0)
- startIndex = 0;
-
- if(endIndex < 0)
- endIndex = 0;
-
if(startIndex >= logicalModel->mText.Count())
startIndex = logicalModel->mText.Count() - 1;
GlyphIndex glyphEnd = *(charactersToGlyphBuffer + endIndex) + ((numberOfGlyphs > 0) ? numberOfGlyphs - 1u : 0u);
LineIndex lineIndex = visualModel->GetLineOfCharacter(startIndex);
Length numberOfLines = visualModel->GetTotalNumberOfLines();
+ bool isLastLine = lineIndex + 1 == numberOfLines;
LineIndex firstLineIndex = lineIndex;
Size textInLineSize;
//get the first line and its vertical offset
float currentLineOffset = CalculateLineOffset(visualModel->mLines, firstLineIndex);
- float currentLineHeight = GetLineHeight(*lineRun);
+ float currentLineHeight = GetLineHeight(*lineRun, isLastLine);
GlyphIndex lastGlyphOfLine = lineRun->glyphRun.glyphIndex + lineRun->glyphRun.numberOfGlyphs - 1;
// Check if the first/last glyph is a ligature that needs be splitted like English fi or Arabic ﻻ.
positionsList.PushBack(blockPos);
}
- if(GetNextLine(index, lineIndex, lineRun, lastGlyphOfLine, numberOfLines))
+ if(GetNextLine(index, lineIndex, lineRun, lastGlyphOfLine, numberOfLines, isLastLine))
{
- UpdateLineInfo(lineRun, currentLineOffset, currentLineHeight, lastGlyphOfLine);
+ UpdateLineInfo(lineRun, currentLineOffset, currentLineHeight, lastGlyphOfLine, isLastLine);
}
// Ignore any glyph that was removed
continue;
}
else
{
- if((ellipsisPosition == DevelText::EllipsisPosition::END) && (index >= endIndexOfGlyphs))
+ if((ellipsisPosition == DevelText::EllipsisPosition::END) && (index > endIndexOfGlyphs))
{
//skip remaining elided glyphs
break;
}
else if((ellipsisPosition == DevelText::EllipsisPosition::START) && (index <= startIndexOfGlyphs))
{
- if(GetNextLine(index, lineIndex, lineRun, lastGlyphOfLine, numberOfLines))
+ if(GetNextLine(index, lineIndex, lineRun, lastGlyphOfLine, numberOfLines, isLastLine))
{
- UpdateLineInfo(lineRun, currentLineOffset, currentLineHeight, lastGlyphOfLine);
+ UpdateLineInfo(lineRun, currentLineOffset, currentLineHeight, lastGlyphOfLine, isLastLine);
}
continue;
currentSize.y = currentLineHeight;
// if there is next line to retrieve.
- if(GetNextLine(index, lineIndex, lineRun, lastGlyphOfLine, numberOfLines))
+ if(GetNextLine(index, lineIndex, lineRun, lastGlyphOfLine, numberOfLines, isLastLine))
{
- UpdateLineInfo(lineRun, currentLineOffset, currentLineHeight, lastGlyphOfLine);
+ UpdateLineInfo(lineRun, currentLineOffset, currentLineHeight, lastGlyphOfLine, isLastLine);
}
}