X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Fglyph-metrics-helper.cpp;h=c46fefd26a014fa49c4ce7597a11d3eeba99510e;hb=702cdc29b907688eef62afbc63f0edb9e2dfb7d2;hp=f87555eaa395b8dd947a2f098c4a8ee71862d726;hpb=48000ec3ab1ca2d1f8001d192112e32357bb1dfc;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/text/glyph-metrics-helper.cpp b/dali-toolkit/internal/text/glyph-metrics-helper.cpp index f87555e..c46fefd 100644 --- a/dali-toolkit/internal/text/glyph-metrics-helper.cpp +++ b/dali-toolkit/internal/text/glyph-metrics-helper.cpp @@ -1,6 +1,6 @@ /* - * 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. @@ -19,6 +19,9 @@ // FILE HEADER #include +// INTERNAL INCLUDES +#include + namespace Dali { namespace Toolkit @@ -50,7 +53,8 @@ void GetGlyphsMetrics(GlyphIndex glyphIndex, Length numberOfGlyphs, GlyphMetrics& glyphMetrics, const GlyphInfo* const glyphsBuffer, - MetricsPtr& metrics) + MetricsPtr& metrics, + float calculatedAdvance) { const GlyphInfo& firstGlyph = *(glyphsBuffer + glyphIndex); @@ -72,7 +76,7 @@ void GetGlyphsMetrics(GlyphIndex glyphIndex, glyphMetrics.fontId = firstGlyph.fontId; glyphMetrics.fontHeight = fontMetrics.height; glyphMetrics.width = firstGlyph.width; - glyphMetrics.advance = firstGlyph.advance; + glyphMetrics.advance = calculatedAdvance; glyphMetrics.ascender = fontMetrics.ascender; glyphMetrics.xBearing = firstGlyph.xBearing; @@ -91,7 +95,7 @@ void GetGlyphsMetrics(GlyphIndex glyphIndex, const float currentMaxGlyphWidthEdge = glyphMetrics.advance + glyphInfo.xBearing + glyphInfo.width; maxWidthEdge = std::max(maxWidthEdge, currentMaxGlyphWidthEdge); - glyphMetrics.advance += glyphInfo.advance; + glyphMetrics.advance += (glyphInfo.advance); } glyphMetrics.width = maxWidthEdge - glyphMetrics.xBearing; @@ -100,18 +104,51 @@ void GetGlyphsMetrics(GlyphIndex glyphIndex, glyphMetrics.width += (firstGlyph.isItalicRequired && !isItalicFont) ? TextAbstraction::FontClient::DEFAULT_ITALIC_ANGLE * firstGlyph.height : 0.f; } -void GetGlyphMetricsFromCharacterIndex(CharacterIndex index, const GlyphInfo* const glyphInfoBuffer, const GlyphIndex* const charactersToGlyphBuffer, const Length* const glyphsPerCharacterBuffer, MetricsPtr& metrics, GlyphMetrics& glyphMetrics, GlyphIndex& glyphIndex, Length& numberOfGlyphs) +void GetGlyphMetricsFromCharacterIndex(CharacterIndex index, + const VisualModelPtr& visualModel, + const LogicalModelPtr& logicalModel, + MetricsPtr& metrics, + GlyphMetrics& glyphMetrics, + GlyphIndex& glyphIndex, + Length& numberOfGlyphs) { + const GlyphIndex* const charactersToGlyphBuffer = visualModel->mCharactersToGlyph.Begin(); + const Length* const glyphsPerCharacterBuffer = visualModel->mGlyphsPerCharacter.Begin(); + const GlyphInfo* const glyphInfoBuffer = visualModel->mGlyphs.Begin(); + Vector& glyphToCharacterMap = visualModel->mGlyphsToCharacters; + const CharacterIndex* glyphToCharacterMapBuffer = glyphToCharacterMap.Begin(); + const float modelCharacterSpacing = visualModel->GetCharacterSpacing(); + + // Get the character-spacing runs. + const Vector& characterSpacingGlyphRuns = visualModel->GetCharacterSpacingGlyphRuns(); + //Takes the character index, obtains the glyph index (and the number of Glyphs) from it and finally gets the glyph metrics. glyphIndex = *(charactersToGlyphBuffer + index); numberOfGlyphs = *(glyphsPerCharacterBuffer + index); + float calculatedAdvance = 0.f; + + const float characterSpacing = GetGlyphCharacterSpacing(glyphIndex, characterSpacingGlyphRuns, modelCharacterSpacing); + calculatedAdvance = GetCalculatedAdvance(*(logicalModel->mText.Begin() + (*(glyphToCharacterMapBuffer + glyphIndex))), characterSpacing, (*(visualModel->mGlyphs.Begin() + glyphIndex)).advance); + // Get the metrics for the group of glyphs. GetGlyphsMetrics(glyphIndex, numberOfGlyphs, glyphMetrics, glyphInfoBuffer, - metrics); + metrics, + calculatedAdvance); +} + +float GetCalculatedAdvance(unsigned int character, float characterSpacing, float advance) +{ + //Gets the final advance value by adding the CharacterSpacing value to it + //In some cases the CharacterSpacing should not be added. Ex: when the glyph is a ZWSP (Zero Width Space) + return (TextAbstraction::IsZeroWidthNonJoiner(character) || TextAbstraction::IsZeroWidthJoiner(character) || + TextAbstraction::IsZeroWidthSpace(character) || TextAbstraction::IsNewParagraph(character) || + TextAbstraction::IsLeftToRightMark(character) || TextAbstraction::IsRightToLeftMark(character)) + ? advance + : advance + characterSpacing; } } // namespace Text