Removed some redundant methods from TextController & Moved some code to other files
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / text / glyph-metrics-helper.cpp
1
2 /*
3  * Copyright (c) 2021 Samsung Electronics Co., Ltd.
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * http://www.apache.org/licenses/LICENSE-2.0
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  */
18
19 // FILE HEADER
20 #include <dali-toolkit/internal/text/glyph-metrics-helper.h>
21
22 namespace Dali
23 {
24 namespace Toolkit
25 {
26 namespace Text
27 {
28 Length GetNumberOfGlyphsOfGroup(GlyphIndex          glyphIndex,
29                                 GlyphIndex          lastGlyphPlusOne,
30                                 const Length* const charactersPerGlyphBuffer)
31 {
32   Length numberOfGLyphsInGroup = 1u;
33
34   for(GlyphIndex index = glyphIndex; index < lastGlyphPlusOne; ++index)
35   {
36     if(0u == *(charactersPerGlyphBuffer + index))
37     {
38       ++numberOfGLyphsInGroup;
39     }
40     else
41     {
42       break;
43     }
44   }
45
46   return numberOfGLyphsInGroup;
47 }
48
49 void GetGlyphsMetrics(GlyphIndex             glyphIndex,
50                       Length                 numberOfGlyphs,
51                       GlyphMetrics&          glyphMetrics,
52                       const GlyphInfo* const glyphsBuffer,
53                       MetricsPtr&            metrics)
54 {
55   const GlyphInfo& firstGlyph = *(glyphsBuffer + glyphIndex);
56
57   Text::FontMetrics fontMetrics;
58   if(0u != firstGlyph.fontId)
59   {
60     metrics->GetFontMetrics(firstGlyph.fontId, fontMetrics);
61   }
62   else if(0u != firstGlyph.index)
63   {
64     // It may be an embedded image.
65     fontMetrics.ascender  = firstGlyph.height;
66     fontMetrics.descender = 0.f;
67     fontMetrics.height    = fontMetrics.ascender;
68   }
69
70   const bool isItalicFont = metrics->HasItalicStyle(firstGlyph.fontId);
71
72   glyphMetrics.fontId     = firstGlyph.fontId;
73   glyphMetrics.fontHeight = fontMetrics.height;
74   glyphMetrics.width      = firstGlyph.width;
75   glyphMetrics.advance    = firstGlyph.advance;
76   glyphMetrics.ascender   = fontMetrics.ascender;
77   glyphMetrics.xBearing   = firstGlyph.xBearing;
78
79   if(1u < numberOfGlyphs)
80   {
81     float maxWidthEdge = firstGlyph.xBearing + firstGlyph.width;
82
83     for(unsigned int i = 1u; i < numberOfGlyphs; ++i)
84     {
85       const GlyphInfo& glyphInfo = *(glyphsBuffer + glyphIndex + i);
86
87       // update the initial xBearing if smaller.
88       glyphMetrics.xBearing = std::min(glyphMetrics.xBearing, glyphMetrics.advance + glyphInfo.xBearing);
89
90       // update the max width edge if bigger.
91       const float currentMaxGlyphWidthEdge = glyphMetrics.advance + glyphInfo.xBearing + glyphInfo.width;
92       maxWidthEdge                         = std::max(maxWidthEdge, currentMaxGlyphWidthEdge);
93
94       glyphMetrics.advance += glyphInfo.advance;
95     }
96
97     glyphMetrics.width = maxWidthEdge - glyphMetrics.xBearing;
98   }
99
100   glyphMetrics.width += (firstGlyph.isItalicRequired && !isItalicFont) ? TextAbstraction::FontClient::DEFAULT_ITALIC_ANGLE * firstGlyph.height : 0.f;
101 }
102
103 } // namespace Text
104
105 } // namespace Toolkit
106
107 } // namespace Dali