[dali_2.3.20] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / text / rendering / styles / strikethrough-helper-functions.cpp
1 /*
2  * Copyright (c) 2022 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include <dali-toolkit/internal/text/rendering/styles/strikethrough-helper-functions.h>
20
21 namespace Dali
22 {
23 namespace Toolkit
24 {
25 namespace Text
26 {
27 bool IsGlyphStrikethrough(GlyphIndex                                    index,
28                           const Vector<StrikethroughGlyphRun>&          strikethroughRuns,
29                           Vector<StrikethroughGlyphRun>::ConstIterator& currentStrikethroughGlyphRunIt)
30 {
31   for(Vector<StrikethroughGlyphRun>::ConstIterator it    = strikethroughRuns.Begin(),
32                                                    endIt = strikethroughRuns.End();
33       it != endIt;
34       ++it)
35   {
36     const StrikethroughGlyphRun& run = *it;
37
38     if((run.glyphRun.glyphIndex <= index) && (index < run.glyphRun.glyphIndex + run.glyphRun.numberOfGlyphs))
39     {
40       currentStrikethroughGlyphRunIt = it;
41       return true;
42     }
43   }
44
45   return false;
46 }
47
48 StrikethroughStyleProperties GetCurrentStrikethroughProperties(GlyphIndex                                    index,
49                                                                const bool&                                   isGlyphStrikethrough,
50                                                                const Vector<StrikethroughGlyphRun>&          strikethroughRuns,
51                                                                Vector<StrikethroughGlyphRun>::ConstIterator& currentStrikethroughGlyphRunIt,
52                                                                const StrikethroughStyleProperties&           commonStrikethroughProperties)
53 {
54   StrikethroughStyleProperties currentStrikethroughStyleProperties = commonStrikethroughProperties;
55
56   if(isGlyphStrikethrough && (currentStrikethroughGlyphRunIt != strikethroughRuns.End()))
57   {
58     // Retrieve the latest run to handle the nested case.
59     for(Vector<StrikethroughGlyphRun>::ConstIterator it    = currentStrikethroughGlyphRunIt + 1,
60                                                      endIt = strikethroughRuns.End();
61         it != endIt;
62         ++it)
63     {
64       const StrikethroughGlyphRun& run = *it;
65
66       if((run.glyphRun.glyphIndex <= index) && (index < (run.glyphRun.glyphIndex + run.glyphRun.numberOfGlyphs)))
67       {
68         currentStrikethroughGlyphRunIt = it;
69       }
70     }
71
72     currentStrikethroughStyleProperties.OverrideByDefinedProperties(currentStrikethroughGlyphRunIt->properties);
73   }
74
75   return currentStrikethroughStyleProperties;
76 }
77
78 /// Helper method to fetch the strikethrough metrics for the specified font glyph
79 void CalcualteStrikethroughHeight(float& currentStrikethroughHeight, float& maxStrikethroughHeight)
80 {
81   //Height of strikethrough represents the thickness of line.
82
83   // Ensure strikethrough will be at least a pixel high
84   if(currentStrikethroughHeight < 1.0f)
85   {
86     currentStrikethroughHeight = 1.0f;
87   }
88   else
89   {
90     currentStrikethroughHeight = ceil(currentStrikethroughHeight);
91   }
92
93   // The strikethrough height should be the max strikethrough height of all glyphs of the line.
94   if(currentStrikethroughHeight > maxStrikethroughHeight)
95   {
96     maxStrikethroughHeight = currentStrikethroughHeight;
97   }
98 }
99
100 } // namespace Text
101
102 } // namespace Toolkit
103
104 } // namespace Dali