X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Fcursor-helper-functions.cpp;h=7b08c47eee53e94a045ad3d5588c15a906777547;hp=c2d35d9be5e1731d64384d027632ec637c2a4fba;hb=48000ec3ab1ca2d1f8001d192112e32357bb1dfc;hpb=17655f69059d8b9f766f350501b3f1ba5efb7231 diff --git a/dali-toolkit/internal/text/cursor-helper-functions.cpp b/dali-toolkit/internal/text/cursor-helper-functions.cpp index c2d35d9..7b08c47 100644 --- a/dali-toolkit/internal/text/cursor-helper-functions.cpp +++ b/dali-toolkit/internal/text/cursor-helper-functions.cpp @@ -458,6 +458,7 @@ CharacterIndex GetClosestCursorIndex(VisualModelPtr visualModel, } void GetCursorPosition(GetCursorPositionParameters& parameters, + float defaultFontLineHeight, CursorInfo& cursorInfo) { const LineRun* const modelLines = parameters.visualModel->mLines.Begin(); @@ -479,6 +480,15 @@ void GetCursorPosition(GetCursorPositionParameters& parameters, const LineIndex lineIndex = parameters.visualModel->GetLineOfCharacter(characterOfLine); const LineRun& line = *(modelLines + lineIndex); + const GlyphIndex* const charactersToGlyphBuffer = parameters.visualModel->mCharactersToGlyph.Begin(); + const Length* const glyphsPerCharacterBuffer = parameters.visualModel->mGlyphsPerCharacter.Begin(); + const GlyphInfo* const glyphInfoBuffer = parameters.visualModel->mGlyphs.Begin(); + CharacterIndex index; + GlyphMetrics glyphMetrics; + MetricsPtr& metrics = parameters.metrics; + GlyphIndex glyphIndex = 0u; + Length numberOfGlyphs = 0u; + if(isLastNewParagraph) { // The cursor is in a new line with no characters. Place the cursor in that line. @@ -493,8 +503,14 @@ void GetCursorPosition(GetCursorPositionParameters& parameters, cursorInfo.lineHeight = GetLineHeight(newLine); + const Length totalNumberOfCharacters = parameters.logicalModel->mText.Count(); + index = totalNumberOfCharacters - 1; + + GetGlyphMetricsFromCharacterIndex(index, glyphInfoBuffer, charactersToGlyphBuffer, glyphsPerCharacterBuffer, metrics, glyphMetrics, glyphIndex, numberOfGlyphs); + // Set the primary cursor's height. - cursorInfo.primaryCursorHeight = cursorInfo.lineHeight; + // The primary cursor height will take the font height of the last character and if there are no characters, it'll take the default font line height. + cursorInfo.primaryCursorHeight = (totalNumberOfCharacters > 0) ? (cursorInfo.isSecondaryCursor ? 0.5f * glyphMetrics.fontHeight : glyphMetrics.fontHeight) : defaultFontLineHeight; // Set the primary cursor's position. cursorInfo.primaryPosition.x = (LTR == line.direction) ? newLine.alignmentOffset : parameters.visualModel->mControlSize.width - newLine.alignmentOffset; @@ -541,7 +557,7 @@ void GetCursorPosition(GetCursorPositionParameters& parameters, // Calculate the primary cursor. - CharacterIndex index = characterIndex; + index = characterIndex; if(cursorInfo.isSecondaryCursor) { // If there is a secondary position, the primary cursor may be in a different place than the logical index. @@ -574,26 +590,14 @@ void GetCursorPosition(GetCursorPositionParameters& parameters, } } - const GlyphIndex* const charactersToGlyphBuffer = parameters.visualModel->mCharactersToGlyph.Begin(); - const Length* const glyphsPerCharacterBuffer = parameters.visualModel->mGlyphsPerCharacter.Begin(); const Length* const charactersPerGlyphBuffer = parameters.visualModel->mCharactersPerGlyph.Begin(); const CharacterIndex* const glyphsToCharactersBuffer = parameters.visualModel->mGlyphsToCharacters.Begin(); const Vector2* const glyphPositionsBuffer = parameters.visualModel->mGlyphPositions.Begin(); - const GlyphInfo* const glyphInfoBuffer = parameters.visualModel->mGlyphs.Begin(); - // Convert the cursor position into the glyph position. - const GlyphIndex primaryGlyphIndex = *(charactersToGlyphBuffer + index); - const Length primaryNumberOfGlyphs = *(glyphsPerCharacterBuffer + index); + GetGlyphMetricsFromCharacterIndex(index, glyphInfoBuffer, charactersToGlyphBuffer, glyphsPerCharacterBuffer, metrics, glyphMetrics, glyphIndex, numberOfGlyphs); + const GlyphIndex primaryGlyphIndex = glyphIndex; const Length primaryNumberOfCharacters = *(charactersPerGlyphBuffer + primaryGlyphIndex); - // Get the metrics for the group of glyphs. - GlyphMetrics glyphMetrics; - GetGlyphsMetrics(primaryGlyphIndex, - primaryNumberOfGlyphs, - glyphMetrics, - glyphInfoBuffer, - parameters.metrics); - // Whether to add the glyph's advance to the cursor position. // i.e if the paragraph is left to right and the logical cursor is zero, the position is the position of the first glyph and the advance is not added, // if the logical cursor is one, the position is the position of the first glyph and the advance is added. @@ -676,16 +680,9 @@ void GetCursorPosition(GetCursorPositionParameters& parameters, index = (isRightToLeftParagraph == isCurrentRightToLeft) ? nextCharacterIndex : characterIndex; } - const GlyphIndex secondaryGlyphIndex = *(charactersToGlyphBuffer + index); - const Length secondaryNumberOfGlyphs = *(glyphsPerCharacterBuffer + index); - - const Vector2& secondaryPosition = *(glyphPositionsBuffer + secondaryGlyphIndex); - - GetGlyphsMetrics(secondaryGlyphIndex, - secondaryNumberOfGlyphs, - glyphMetrics, - glyphInfoBuffer, - parameters.metrics); + GetGlyphMetricsFromCharacterIndex(index, glyphInfoBuffer, charactersToGlyphBuffer, glyphsPerCharacterBuffer, metrics, glyphMetrics, glyphIndex, numberOfGlyphs); + const GlyphIndex secondaryGlyphIndex = glyphIndex; + const Vector2& secondaryPosition = *(glyphPositionsBuffer + secondaryGlyphIndex); // Set the secondary cursor's position.