2 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
19 #include <dali-toolkit/internal/text/segmentation.h>
22 #include <dali/devel-api/text-abstraction/segmentation.h>
24 #include <dali/integration-api/debug.h>
30 #include <dali-toolkit/internal/text/character-set-conversion.h>
35 #if defined(DEBUG_ENABLED)
36 Debug::Filter* gLogFilter = Debug::Filter::New(Debug::Concise, true, "LOG_TEXT_SEGMENTATION");
47 void SetLineBreakInfo(const Vector<Character>& text,
48 CharacterIndex startIndex,
49 Length numberOfCharacters,
50 Vector<LineBreakInfo>& lineBreakInfo)
52 const Length totalNumberOfCharacters = text.Count();
54 if(0u == totalNumberOfCharacters)
56 // Nothing to do if there are no characters.
60 // Retrieve the line break info.
61 lineBreakInfo.Resize(totalNumberOfCharacters);
63 // Whether the current buffer is being updated or is set from scratch.
64 const bool updateCurrentBuffer = numberOfCharacters < totalNumberOfCharacters;
66 LineBreakInfo* lineBreakInfoBuffer = NULL;
67 Vector<LineBreakInfo> newLineBreakInfo;
69 if(updateCurrentBuffer)
71 newLineBreakInfo.Resize(numberOfCharacters);
72 lineBreakInfoBuffer = newLineBreakInfo.Begin();
76 lineBreakInfoBuffer = lineBreakInfo.Begin();
79 // Retrieve the line break info.
80 TextAbstraction::Segmentation::Get().GetLineBreakPositions(text.Begin() + startIndex,
84 // If the line break info is updated, it needs to be inserted in the model.
85 if(updateCurrentBuffer)
87 lineBreakInfo.Insert(lineBreakInfo.Begin() + startIndex,
88 newLineBreakInfo.Begin(),
89 newLineBreakInfo.End());
90 lineBreakInfo.Resize(totalNumberOfCharacters);
94 if(gLogFilter->IsEnabledFor(Debug::Verbose))
97 Utf32ToUtf8(text.Begin(), numberOfCharacters, utf8);
100 info.reserve(numberOfCharacters);
101 for(unsigned int i = 0; i < lineBreakInfo.Count(); ++i)
103 info.push_back(static_cast<char>('0' + lineBreakInfo[i]));
106 DALI_LOG_INFO(gLogFilter, Debug::Verbose, "SetLineBreakInfo Characters: %s\n", utf8.c_str());
107 DALI_LOG_INFO(gLogFilter, Debug::Verbose, "SetLineBreakInfo Break info: %s\n", info.c_str());
112 void SetWordBreakInfo(const Vector<Character>& text,
113 CharacterIndex startIndex,
114 Length numberOfCharacters,
115 Vector<WordBreakInfo>& wordBreakInfo)
117 const Length totalNumberOfCharacters = text.Count();
119 if(0u == totalNumberOfCharacters)
121 // Nothing to do if there are no characters.
125 // Resize the vector.
126 wordBreakInfo.Resize(totalNumberOfCharacters);
128 // Whether the current buffer is being updated or is set from scratch.
129 const bool updateCurrentBuffer = numberOfCharacters < totalNumberOfCharacters;
131 WordBreakInfo* wordBreakInfoBuffer = NULL;
132 Vector<WordBreakInfo> newWordBreakInfo;
134 if(updateCurrentBuffer)
136 newWordBreakInfo.Resize(numberOfCharacters);
137 wordBreakInfoBuffer = newWordBreakInfo.Begin();
141 wordBreakInfoBuffer = wordBreakInfo.Begin();
144 // Retrieve the word break info.
145 TextAbstraction::Segmentation::Get().GetWordBreakPositions(text.Begin() + startIndex,
147 wordBreakInfoBuffer);
149 // If the word break info is updated, it needs to be inserted in the model.
150 if(updateCurrentBuffer)
152 wordBreakInfo.Insert(wordBreakInfo.Begin() + startIndex,
153 newWordBreakInfo.Begin(),
154 newWordBreakInfo.End());
155 wordBreakInfo.Resize(totalNumberOfCharacters);
159 if(gLogFilter->IsEnabledFor(Debug::Verbose))
162 Utf32ToUtf8(text.Begin(), totalNumberOfCharacters, utf8);
165 info.reserve(totalNumberOfCharacters);
166 for(unsigned int i = 0; i < wordBreakInfo.Count(); ++i)
168 info.push_back(static_cast<char>('0' + wordBreakInfo[i]));
171 DALI_LOG_INFO(gLogFilter, Debug::Verbose, "SetWordBreakInfo Characters: %s\n", utf8.c_str());
172 DALI_LOG_INFO(gLogFilter, Debug::Verbose, "SetWordBreakInfo Break info: %s\n", info.c_str());
179 } // namespace Toolkit