Resolve cases for strikethrough when using multiple <s> tags
[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 float GetCurrentStrikethroughHeight(const Vector<StrikethroughGlyphRun>&         strikethroughRuns,
49                                     Vector<StrikethroughGlyphRun>::ConstIterator currentStrikethroughGlyphRunIt,
50                                     const float                                  strikethroughHeight)
51 {
52   if(currentStrikethroughGlyphRunIt == strikethroughRuns.End())
53   {
54     return strikethroughHeight;
55   }
56
57   const StrikethroughGlyphRun& strikethroughGlyphRun = *currentStrikethroughGlyphRunIt;
58   return (strikethroughGlyphRun.properties.heightDefined ? strikethroughGlyphRun.properties.height : strikethroughHeight);
59 }
60
61 StrikethroughStyleProperties GetCurrentStrikethroughProperties(const bool&                                  isGlyphStrikethrough,
62                                                                const Vector<StrikethroughGlyphRun>&         strikethroughRuns,
63                                                                Vector<StrikethroughGlyphRun>::ConstIterator currentStrikethroughGlyphRunIt,
64                                                                const StrikethroughStyleProperties&          commonStrikethroughProperties)
65 {
66   return (isGlyphStrikethrough && (currentStrikethroughGlyphRunIt != strikethroughRuns.End()))
67            ? currentStrikethroughGlyphRunIt->properties
68            : commonStrikethroughProperties;
69 }
70
71 /// Helper method to fetch the strikethrough metrics for the specified font glyph
72 void CalcualteStrikethroughHeight(float& currentStrikethroughHeight, float& maxStrikethroughHeight)
73 {
74   //Height of strikethrough represents the thickness of line.
75
76   // Ensure strikethrough will be at least a pixel high
77   if(currentStrikethroughHeight < 1.0f)
78   {
79     currentStrikethroughHeight = 1.0f;
80   }
81   else
82   {
83     currentStrikethroughHeight = ceil(currentStrikethroughHeight);
84   }
85
86   // The strikethrough height should be the max strikethrough height of all glyphs of the line.
87   if(currentStrikethroughHeight > maxStrikethroughHeight)
88   {
89     maxStrikethroughHeight = currentStrikethroughHeight;
90   }
91 }
92
93 } // namespace Text
94
95 } // namespace Toolkit
96
97 } // namespace Dali