X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Fglyph-metrics-helper.cpp;h=f87555eaa395b8dd947a2f098c4a8ee71862d726;hp=ef9098c11faa5d2d11a6cced7a38923acfc2b779;hb=48000ec3ab1ca2d1f8001d192112e32357bb1dfc;hpb=e42dc155f49bacd9635433efafcfe3004392ddcf diff --git a/dali-toolkit/internal/text/glyph-metrics-helper.cpp b/dali-toolkit/internal/text/glyph-metrics-helper.cpp old mode 100755 new mode 100644 index ef9098c..f87555e --- a/dali-toolkit/internal/text/glyph-metrics-helper.cpp +++ b/dali-toolkit/internal/text/glyph-metrics-helper.cpp @@ -1,6 +1,6 @@ /* - * Copyright (c) 2016 Samsung Electronics Co., Ltd. + * Copyright (c) 2021 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. @@ -21,22 +21,19 @@ namespace Dali { - namespace Toolkit { - namespace Text { - -Length GetNumberOfGlyphsOfGroup( GlyphIndex glyphIndex, - GlyphIndex lastGlyphPlusOne, - const Length* const charactersPerGlyphBuffer ) +Length GetNumberOfGlyphsOfGroup(GlyphIndex glyphIndex, + GlyphIndex lastGlyphPlusOne, + const Length* const charactersPerGlyphBuffer) { Length numberOfGLyphsInGroup = 1u; - for( GlyphIndex index = glyphIndex; index < lastGlyphPlusOne; ++index ) + for(GlyphIndex index = glyphIndex; index < lastGlyphPlusOne; ++index) { - if( 0u == *( charactersPerGlyphBuffer + index ) ) + if(0u == *(charactersPerGlyphBuffer + index)) { ++numberOfGLyphsInGroup; } @@ -49,51 +46,72 @@ Length GetNumberOfGlyphsOfGroup( GlyphIndex glyphIndex, return numberOfGLyphsInGroup; } -void GetGlyphsMetrics( GlyphIndex glyphIndex, - Length numberOfGlyphs, - GlyphMetrics& glyphMetrics, - const GlyphInfo* const glyphsBuffer, - MetricsPtr& metrics ) +void GetGlyphsMetrics(GlyphIndex glyphIndex, + Length numberOfGlyphs, + GlyphMetrics& glyphMetrics, + const GlyphInfo* const glyphsBuffer, + MetricsPtr& metrics) { - const GlyphInfo& firstGlyph = *( glyphsBuffer + glyphIndex ); + const GlyphInfo& firstGlyph = *(glyphsBuffer + glyphIndex); Text::FontMetrics fontMetrics; - if( 0u != firstGlyph.fontId ) + if(0u != firstGlyph.fontId) { - metrics->GetFontMetrics( firstGlyph.fontId, fontMetrics ); + metrics->GetFontMetrics(firstGlyph.fontId, fontMetrics); } - else if( 0u != firstGlyph.index ) + else if(0u != firstGlyph.index) { // It may be an embedded image. - fontMetrics.ascender = firstGlyph.height; + fontMetrics.ascender = firstGlyph.height; fontMetrics.descender = 0.f; - fontMetrics.height = fontMetrics.ascender; + fontMetrics.height = fontMetrics.ascender; } - const bool isItalicFont = metrics->HasItalicStyle( firstGlyph.fontId ); + const bool isItalicFont = metrics->HasItalicStyle(firstGlyph.fontId); - glyphMetrics.fontId = firstGlyph.fontId; + glyphMetrics.fontId = firstGlyph.fontId; glyphMetrics.fontHeight = fontMetrics.height; - glyphMetrics.width = firstGlyph.width + ( ( firstGlyph.isItalicRequired && !isItalicFont ) ? static_cast( TextAbstraction::FontClient::DEFAULT_ITALIC_ANGLE * static_cast( firstGlyph.height ) ) : 0u ); - glyphMetrics.advance = firstGlyph.advance; - glyphMetrics.ascender = fontMetrics.ascender; - glyphMetrics.xBearing = firstGlyph.xBearing; + glyphMetrics.width = firstGlyph.width; + glyphMetrics.advance = firstGlyph.advance; + glyphMetrics.ascender = fontMetrics.ascender; + glyphMetrics.xBearing = firstGlyph.xBearing; - if( 1u < numberOfGlyphs ) + if(1u < numberOfGlyphs) { - const float widthInit = firstGlyph.xBearing; + float maxWidthEdge = firstGlyph.xBearing + firstGlyph.width; - for( unsigned int i = 1u; i < numberOfGlyphs; ++i ) + for(unsigned int i = 1u; i < numberOfGlyphs; ++i) { - const GlyphInfo& glyphInfo = *( glyphsBuffer + glyphIndex + i ); + const GlyphInfo& glyphInfo = *(glyphsBuffer + glyphIndex + i); - glyphMetrics.width = glyphMetrics.advance + glyphInfo.xBearing + glyphInfo.width + ( ( firstGlyph.isItalicRequired && !isItalicFont ) ? static_cast( TextAbstraction::FontClient::DEFAULT_ITALIC_ANGLE * static_cast( firstGlyph.height ) ) : 0u ); - glyphMetrics.advance += glyphInfo.advance; + // update the initial xBearing if smaller. + glyphMetrics.xBearing = std::min(glyphMetrics.xBearing, glyphMetrics.advance + glyphInfo.xBearing); + + // update the max width edge if bigger. + const float currentMaxGlyphWidthEdge = glyphMetrics.advance + glyphInfo.xBearing + glyphInfo.width; + maxWidthEdge = std::max(maxWidthEdge, currentMaxGlyphWidthEdge); + glyphMetrics.advance += glyphInfo.advance; } - glyphMetrics.width -= widthInit; + glyphMetrics.width = maxWidthEdge - glyphMetrics.xBearing; } + + 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) +{ + //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); + + // Get the metrics for the group of glyphs. + GetGlyphsMetrics(glyphIndex, + numberOfGlyphs, + glyphMetrics, + glyphInfoBuffer, + metrics); } } // namespace Text