2 * Copyright (c) 2014 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.
20 #include <dali-test-suite-utils.h>
21 #include <dali/dali.h>
22 #include <dali/devel-api/text-abstraction/bitmap-font.h>
23 #include <dali/devel-api/text-abstraction/font-client.h>
24 #include <dali/internal/text/text-abstraction/plugin/font-client-utils.h>
32 int UtcDaliFontClient(void)
34 const int ORDERED_VALUES[] = {-1, 50, 63, 75, 87, 100, 113, 125, 150, 200};
36 const unsigned int NUM_OF_ORDERED_VALUES = sizeof(ORDERED_VALUES) / sizeof(int);
38 TestApplication application;
41 tet_infoline("UtcDaliFontClient No table");
42 result = TextAbstraction::Internal::ValueToIndex(100, NULL, 0u);
43 DALI_TEST_EQUALS(-1, result, TEST_LOCATION);
45 tet_infoline("UtcDaliFontClient Non defined values");
46 result = TextAbstraction::Internal::ValueToIndex(-1, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
47 DALI_TEST_EQUALS(0, result, TEST_LOCATION);
48 result = TextAbstraction::Internal::ValueToIndex(-3, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
49 DALI_TEST_EQUALS(0, result, TEST_LOCATION);
51 tet_infoline("UtcDaliFontClient Between non defined and first of range.");
52 result = TextAbstraction::Internal::ValueToIndex(0, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
53 DALI_TEST_EQUALS(1, result, TEST_LOCATION);
54 result = TextAbstraction::Internal::ValueToIndex(30, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
55 DALI_TEST_EQUALS(1, result, TEST_LOCATION);
56 result = TextAbstraction::Internal::ValueToIndex(49, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
57 DALI_TEST_EQUALS(1, result, TEST_LOCATION);
59 tet_infoline("UtcDaliFontClient Defined in range");
60 for(unsigned int index = 1u; index < NUM_OF_ORDERED_VALUES; ++index)
62 result = TextAbstraction::Internal::ValueToIndex(ORDERED_VALUES[index], ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
63 DALI_TEST_EQUALS(index, result, TEST_LOCATION);
66 tet_infoline("UtcDaliFontClient Non defined in range");
67 result = TextAbstraction::Internal::ValueToIndex(51, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
68 DALI_TEST_EQUALS(1, result, TEST_LOCATION);
69 result = TextAbstraction::Internal::ValueToIndex(55, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
70 DALI_TEST_EQUALS(1, result, TEST_LOCATION);
71 result = TextAbstraction::Internal::ValueToIndex(62, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
72 DALI_TEST_EQUALS(2, result, TEST_LOCATION);
73 result = TextAbstraction::Internal::ValueToIndex(64, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
74 DALI_TEST_EQUALS(2, result, TEST_LOCATION);
75 result = TextAbstraction::Internal::ValueToIndex(151, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
76 DALI_TEST_EQUALS(8, result, TEST_LOCATION);
77 result = TextAbstraction::Internal::ValueToIndex(175, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
78 DALI_TEST_EQUALS(9, result, TEST_LOCATION);
79 result = TextAbstraction::Internal::ValueToIndex(176, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
80 DALI_TEST_EQUALS(9, result, TEST_LOCATION);
81 result = TextAbstraction::Internal::ValueToIndex(199, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
82 DALI_TEST_EQUALS(9, result, TEST_LOCATION);
84 tet_infoline("UtcDaliFontClient above of range");
85 result = TextAbstraction::Internal::ValueToIndex(220, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
86 DALI_TEST_EQUALS(9, result, TEST_LOCATION);
87 result = TextAbstraction::Internal::ValueToIndex(500, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
88 DALI_TEST_EQUALS(9, result, TEST_LOCATION);
93 int UtcDaliFontClientNew(void)
95 TestApplication application;
97 TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
98 fontClient.SetDpi(30, 40);
99 TextAbstraction::FontClient anotherClient = TextAbstraction::FontClient::New(50, 60);
101 uint32_t horizontalDpi;
102 uint32_t verticalDpi;
104 tet_printf("Check default font client set dpi well\n");
105 fontClient.GetDpi(horizontalDpi, verticalDpi);
107 DALI_TEST_EQUALS(30, horizontalDpi, TEST_LOCATION);
108 DALI_TEST_EQUALS(40, verticalDpi, TEST_LOCATION);
110 tet_printf("Check another font client set dpi well\n");
111 anotherClient.GetDpi(horizontalDpi, verticalDpi);
113 DALI_TEST_EQUALS(50, horizontalDpi, TEST_LOCATION);
114 DALI_TEST_EQUALS(60, verticalDpi, TEST_LOCATION);
118 int UtcDaliFontClientAtlasLimitation(void)
120 TestApplication application;
122 TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
124 tet_infoline("UtcDaliFontClientAtlasLimitation Default");
125 result = fontClient.IsAtlasLimitationEnabled();
126 DALI_TEST_EQUALS(TextAbstraction::FontClient::DEFAULT_ATLAS_LIMITATION_ENABLED, result, TEST_LOCATION);
128 tet_infoline("UtcDaliFontClientAtlasLimitation Enabled");
129 fontClient.EnableAtlasLimitation(true);
130 result = fontClient.IsAtlasLimitationEnabled();
131 DALI_TEST_EQUALS(true, result, TEST_LOCATION);
133 tet_infoline("UtcDaliFontClientAtlasLimitation Disabled");
134 fontClient.EnableAtlasLimitation(false);
135 result = fontClient.IsAtlasLimitationEnabled();
136 DALI_TEST_EQUALS(false, result, TEST_LOCATION);
140 const std::string DEFAULT_FONT_DIR("/resources/fonts");
141 const uint32_t MAX_WIDTH_FIT_IN_ATLAS = TextAbstraction::FontClient::MAX_TEXT_ATLAS_WIDTH - TextAbstraction::FontClient::PADDING_TEXT_ATLAS_BLOCK;
142 const uint32_t MAX_HEIGHT_FIT_IN_ATLAS = TextAbstraction::FontClient::MAX_TEXT_ATLAS_HEIGHT - TextAbstraction::FontClient::PADDING_TEXT_ATLAS_BLOCK;
144 int UtcDaliFontClientAtlasLimitationEnabled(void)
146 TestApplication application;
148 char* pathNamePtr = get_current_dir_name();
149 const std::string pathName(pathNamePtr);
152 TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
153 fontClient.EnableAtlasLimitation(true);
155 // The font file "DejaVuSans.ttf" is copied from Toolkit to Adaptor to make test-case of specific font-family.
156 // Note the block size depends on font-family.
157 // This is to create FontDescription and pass it to GetFontId with point-size (various cases).
158 TextAbstraction::FontDescription fontDescription;
159 fontDescription.path = pathName + DEFAULT_FONT_DIR + "/dejavu/DejaVuSans.ttf";
160 fontDescription.family = "DejaVuSans";
161 fontDescription.width = TextAbstraction::FontWidth::NONE;
162 fontDescription.weight = TextAbstraction::FontWeight::NORMAL;
163 fontDescription.slant = TextAbstraction::FontSlant::NONE;
165 // Block's width or height are less than 512
166 tet_infoline("UtcDaliFontClientAtlasLimitationEnabled PointSize=200");
167 uint32_t pointSize200 = 200 * TextAbstraction::FontClient::NUMBER_OF_POINTS_PER_ONE_UNIT_OF_POINT_SIZE;
168 TextAbstraction::FontId fontId200 = fontClient.GetFontId(fontDescription, pointSize200);
169 TextAbstraction::GlyphBufferData glyphBufferData200;
170 glyphBufferData200.width = 0;
171 glyphBufferData200.height = 0;
172 fontClient.CreateBitmap(fontId200, 68, false, false, glyphBufferData200, 0);
174 DALI_TEST_GREATER(MAX_WIDTH_FIT_IN_ATLAS, glyphBufferData200.width, TEST_LOCATION);
175 DALI_TEST_GREATER(MAX_HEIGHT_FIT_IN_ATLAS, glyphBufferData200.height, TEST_LOCATION);
177 // Block's width or height are greater than 512 and less than 1024
178 uint32_t pointSize1000 = 1000 * TextAbstraction::FontClient::NUMBER_OF_POINTS_PER_ONE_UNIT_OF_POINT_SIZE;
179 tet_infoline("UtcDaliFontClientAtlasLimitationEnabled PointSize=1000");
180 TextAbstraction::FontId fontId1000 = fontClient.GetFontId(fontDescription, pointSize1000);
181 TextAbstraction::GlyphBufferData glyphBufferData1000;
182 glyphBufferData1000.width = 0;
183 glyphBufferData1000.height = 0;
184 fontClient.CreateBitmap(fontId1000, 68, false, false, glyphBufferData1000, 0);
186 DALI_TEST_GREATER(MAX_WIDTH_FIT_IN_ATLAS, glyphBufferData1000.width, TEST_LOCATION);
187 DALI_TEST_GREATER(MAX_HEIGHT_FIT_IN_ATLAS, glyphBufferData1000.height, TEST_LOCATION);
189 // Block's width or height are greater than 1024 and less than 2048
190 uint32_t pointSize2000 = 2000 * TextAbstraction::FontClient::NUMBER_OF_POINTS_PER_ONE_UNIT_OF_POINT_SIZE;
191 tet_infoline("UtcDaliFontClientAtlasLimitationEnabled PointSize=2000");
192 TextAbstraction::FontId fontId2000 = fontClient.GetFontId(fontDescription, pointSize2000);
193 TextAbstraction::GlyphBufferData glyphBufferData2000;
194 glyphBufferData2000.width = 0;
195 glyphBufferData2000.height = 0;
196 fontClient.CreateBitmap(fontId2000, 68, false, false, glyphBufferData2000, 0);
198 DALI_TEST_GREATER(MAX_WIDTH_FIT_IN_ATLAS, glyphBufferData2000.width, TEST_LOCATION);
199 DALI_TEST_GREATER(MAX_HEIGHT_FIT_IN_ATLAS, glyphBufferData2000.height, TEST_LOCATION);
204 int UtcDaliFontClientAtlasLimitationDisabled(void)
206 TestApplication application;
208 char* pathNamePtr = get_current_dir_name();
209 const std::string pathName(pathNamePtr);
212 TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
213 fontClient.EnableAtlasLimitation(false);
215 TextAbstraction::FontDescription fontDescription;
216 fontDescription.path = pathName + DEFAULT_FONT_DIR + "/dejavu/DejaVuSans.ttf";
217 fontDescription.family = "DejaVuSans";
218 fontDescription.width = TextAbstraction::FontWidth::NONE;
219 fontDescription.weight = TextAbstraction::FontWeight::NORMAL;
220 fontDescription.slant = TextAbstraction::FontSlant::NONE;
222 // Block's width or height are less than 512
223 tet_infoline("UtcDaliFontClientAtlasLimitationDisabled PointSize=200");
224 uint32_t pointSize200 = 200 * TextAbstraction::FontClient::NUMBER_OF_POINTS_PER_ONE_UNIT_OF_POINT_SIZE;
225 TextAbstraction::FontId fontId200 = fontClient.GetFontId(fontDescription, pointSize200);
226 TextAbstraction::GlyphBufferData glyphBufferData200;
227 glyphBufferData200.width = 0;
228 glyphBufferData200.height = 0;
229 fontClient.CreateBitmap(fontId200, 68, false, false, glyphBufferData200, 0);
231 DALI_TEST_GREATER(512u, glyphBufferData200.width, TEST_LOCATION); //93u
232 DALI_TEST_GREATER(512u, glyphBufferData200.height, TEST_LOCATION); //115u
234 // Block's width or height are greater than 512 and less than 1024
235 tet_infoline("UtcDaliFontClientAtlasLimitationDisabled PointSize=1000");
236 uint32_t pointSize1000 = 1000 * TextAbstraction::FontClient::NUMBER_OF_POINTS_PER_ONE_UNIT_OF_POINT_SIZE;
237 TextAbstraction::FontId fontId1000 = fontClient.GetFontId(fontDescription, pointSize1000);
238 TextAbstraction::GlyphBufferData glyphBufferData1000;
239 glyphBufferData1000.width = 0;
240 glyphBufferData1000.height = 0;
241 fontClient.CreateBitmap(fontId1000, 68, false, false, glyphBufferData1000, 0);
243 DALI_TEST_GREATER(512u, glyphBufferData1000.width, TEST_LOCATION); //462u
244 DALI_TEST_GREATER(glyphBufferData1000.height, 512u, TEST_LOCATION); //574u
246 // Block's width or height are greater than 1024 and less than 2048
247 tet_infoline("UtcDaliFontClientAtlasLimitationDisabled PointSize=2000");
248 uint32_t pointSize2000 = 2000 * TextAbstraction::FontClient::NUMBER_OF_POINTS_PER_ONE_UNIT_OF_POINT_SIZE;
249 TextAbstraction::FontId fontId2000 = fontClient.GetFontId(fontDescription, pointSize2000);
250 TextAbstraction::GlyphBufferData glyphBufferData2000;
251 glyphBufferData2000.width = 0;
252 glyphBufferData2000.height = 0;
253 fontClient.CreateBitmap(fontId2000, 68, false, false, glyphBufferData2000, 0);
255 DALI_TEST_GREATER(1024u, glyphBufferData2000.width, TEST_LOCATION); //924u
256 DALI_TEST_GREATER(glyphBufferData2000.height, 1024u, TEST_LOCATION); //1148u
258 // Test GlyphBufferData move
259 TextAbstraction::GlyphBufferData movedGlyphBufferData2000 = std::move(glyphBufferData2000);
261 for(int i = 0; i < 50; ++i)
263 TextAbstraction::GlyphBufferData dummy = std::move(movedGlyphBufferData2000);
264 movedGlyphBufferData2000 = std::move(dummy);
266 // Test moved GlyphBufferData destruct well
269 DALI_TEST_GREATER(1024u, movedGlyphBufferData2000.width, TEST_LOCATION); //924u
270 DALI_TEST_GREATER(movedGlyphBufferData2000.height, 1024u, TEST_LOCATION); //1148u
275 int UtcDaliFontClientCurrentMaximumBlockSizeFitInAtlas(void)
277 TestApplication application;
278 tet_infoline(" UtcDaliFontClientCurrentMaximumBlockSizeFitInAtlas ");
281 TextAbstraction::FontClient fontClient;
282 fontClient = TextAbstraction::FontClient::Get();
284 Size defaultTextAtlasSize = fontClient.GetDefaultTextAtlasSize();
285 Size maximumTextAtlasSize = fontClient.GetMaximumTextAtlasSize();
286 Size currentMaximumBlockSizeFitInAtlas = fontClient.GetCurrentMaximumBlockSizeFitInAtlas();
288 // TODO : This UTC pass only if we don't create fontClient plugin. Currently we always create plugin at Get API, due to performance
289 //tet_infoline("CurrentMaximumBlockSizeFitInAtlas start with default ");
290 //DALI_TEST_EQUALS(currentMaximumBlockSizeFitInAtlas, defaultTextAtlasSize, TEST_LOCATION);
292 currentMaximumBlockSizeFitInAtlas = defaultTextAtlasSize;
294 tet_infoline("SetCurrentMaximumBlockSizeFitInAtlas is changed with current ");
295 isChanged = fontClient.SetCurrentMaximumBlockSizeFitInAtlas(currentMaximumBlockSizeFitInAtlas);
296 DALI_TEST_CHECK(isChanged);
298 Size decreaseOnlyWidth(currentMaximumBlockSizeFitInAtlas.width - 1u, currentMaximumBlockSizeFitInAtlas.height);
299 tet_infoline("SetCurrentMaximumBlockSizeFitInAtlas is changed with width < current ");
300 isChanged = fontClient.SetCurrentMaximumBlockSizeFitInAtlas(decreaseOnlyWidth);
301 DALI_TEST_CHECK(isChanged);
303 Size decreaseOnlyHeigth(currentMaximumBlockSizeFitInAtlas.width, currentMaximumBlockSizeFitInAtlas.height - 1u);
304 tet_infoline("SetCurrentMaximumBlockSizeFitInAtlas is changed with height < current ");
305 isChanged = fontClient.SetCurrentMaximumBlockSizeFitInAtlas(decreaseOnlyHeigth);
306 DALI_TEST_CHECK(isChanged);
308 Size decreaseBoth(currentMaximumBlockSizeFitInAtlas.width - 1u, currentMaximumBlockSizeFitInAtlas.height - 1u);
309 tet_infoline("SetCurrentMaximumBlockSizeFitInAtlas is changed with size < current ");
310 isChanged = fontClient.SetCurrentMaximumBlockSizeFitInAtlas(decreaseBoth);
311 DALI_TEST_CHECK(isChanged);
313 Size increaseOnlyWidth(maximumTextAtlasSize.width + 1u, currentMaximumBlockSizeFitInAtlas.height);
314 tet_infoline("SetCurrentMaximumBlockSizeFitInAtlas is not changed with width > max ");
315 isChanged = fontClient.SetCurrentMaximumBlockSizeFitInAtlas(increaseOnlyWidth);
316 DALI_TEST_CHECK(!isChanged);
318 Size increaseOnlyHeigth(currentMaximumBlockSizeFitInAtlas.width, maximumTextAtlasSize.height + 1u);
319 tet_infoline("SetCurrentMaximumBlockSizeFitInAtlas is not changed with height > max ");
320 isChanged = fontClient.SetCurrentMaximumBlockSizeFitInAtlas(increaseOnlyHeigth);
321 DALI_TEST_CHECK(!isChanged);
323 Size increaseBoth(maximumTextAtlasSize.width + 1u, maximumTextAtlasSize.height + 1u);
324 tet_infoline("SetCurrentMaximumBlockSizeFitInAtlas is not changed with size > max ");
325 isChanged = fontClient.SetCurrentMaximumBlockSizeFitInAtlas(increaseBoth);
326 DALI_TEST_CHECK(!isChanged);
328 currentMaximumBlockSizeFitInAtlas = fontClient.GetCurrentMaximumBlockSizeFitInAtlas();
329 if(currentMaximumBlockSizeFitInAtlas.width < maximumTextAtlasSize.width && currentMaximumBlockSizeFitInAtlas.height < maximumTextAtlasSize.height)
331 tet_infoline("SetCurrentMaximumBlockSizeFitInAtlas is changed with current < size < max ");
332 Size increaseWidth = Size(currentMaximumBlockSizeFitInAtlas.width + 1u, currentMaximumBlockSizeFitInAtlas.height);
333 isChanged = fontClient.SetCurrentMaximumBlockSizeFitInAtlas(increaseWidth);
334 DALI_TEST_CHECK(isChanged);
335 currentMaximumBlockSizeFitInAtlas = fontClient.GetCurrentMaximumBlockSizeFitInAtlas();
337 Size increaseHeigth = Size(currentMaximumBlockSizeFitInAtlas.width, currentMaximumBlockSizeFitInAtlas.height + 1u);
338 isChanged = fontClient.SetCurrentMaximumBlockSizeFitInAtlas(increaseHeigth);
339 DALI_TEST_CHECK(isChanged);
340 currentMaximumBlockSizeFitInAtlas = fontClient.GetCurrentMaximumBlockSizeFitInAtlas();
342 Size sizeLessThanMax = Size(currentMaximumBlockSizeFitInAtlas.width + 1u, currentMaximumBlockSizeFitInAtlas.height + 1u);
343 isChanged = fontClient.SetCurrentMaximumBlockSizeFitInAtlas(sizeLessThanMax);
345 if(currentMaximumBlockSizeFitInAtlas.width < maximumTextAtlasSize.width && currentMaximumBlockSizeFitInAtlas.height < maximumTextAtlasSize.height)
347 DALI_TEST_CHECK(isChanged);
351 DALI_TEST_CHECK(!isChanged);
354 currentMaximumBlockSizeFitInAtlas = fontClient.GetCurrentMaximumBlockSizeFitInAtlas();
356 DALI_TEST_NOT_EQUALS(currentMaximumBlockSizeFitInAtlas, defaultTextAtlasSize, 0.0f, TEST_LOCATION);
357 DALI_TEST_EQUALS(currentMaximumBlockSizeFitInAtlas, sizeLessThanMax, TEST_LOCATION);
359 tet_infoline("SetCurrentMaximumBlockSizeFitInAtlas is not changed with size == max ");
360 isChanged = fontClient.SetCurrentMaximumBlockSizeFitInAtlas(maximumTextAtlasSize);
361 DALI_TEST_CHECK(!isChanged);
364 currentMaximumBlockSizeFitInAtlas = fontClient.GetCurrentMaximumBlockSizeFitInAtlas();
365 DALI_TEST_NOT_EQUALS(currentMaximumBlockSizeFitInAtlas, maximumTextAtlasSize, 0.0f, TEST_LOCATION);
370 int UtcDaliFontClientTextAtlasConstants(void)
372 TestApplication application;
373 tet_infoline(" UtcDaliFontClientTextAtlasConstants ");
375 TextAbstraction::FontClient fontClient;
376 fontClient = TextAbstraction::FontClient::Get();
378 Size defaultTextAtlasSize = fontClient.GetDefaultTextAtlasSize();
379 Size defaultTextAtlasWidthHeight(TextAbstraction::FontClient::DEFAULT_TEXT_ATLAS_WIDTH, TextAbstraction::FontClient::DEFAULT_TEXT_ATLAS_HEIGHT);
380 DALI_TEST_EQUALS(defaultTextAtlasSize, TextAbstraction::FontClient::DEFAULT_TEXT_ATLAS_SIZE, TEST_LOCATION);
381 DALI_TEST_EQUALS(defaultTextAtlasSize, defaultTextAtlasWidthHeight, TEST_LOCATION);
383 Size maximumTextAtlasSize = fontClient.GetMaximumTextAtlasSize();
384 Size maxTextAtlasWidthHeight(TextAbstraction::FontClient::MAX_TEXT_ATLAS_WIDTH, TextAbstraction::FontClient::MAX_TEXT_ATLAS_HEIGHT);
385 DALI_TEST_EQUALS(maximumTextAtlasSize, TextAbstraction::FontClient::MAX_TEXT_ATLAS_SIZE, TEST_LOCATION);
386 DALI_TEST_EQUALS(maximumTextAtlasSize, maxTextAtlasWidthHeight, TEST_LOCATION);
388 uint32_t numberOfPointsPerOneUnitOfPointSize = fontClient.GetNumberOfPointsPerOneUnitOfPointSize();
389 DALI_TEST_EQUALS(numberOfPointsPerOneUnitOfPointSize, TextAbstraction::FontClient::NUMBER_OF_POINTS_PER_ONE_UNIT_OF_POINT_SIZE, TEST_LOCATION);
394 using namespace Dali::TextAbstraction;
396 int UtcDaliFontClientGetDefaultFonts(void)
398 TestApplication application;
399 tet_infoline(" UtcDaliFontClientGetDefaultFonts ");
401 FontClient fontClient;
402 fontClient = FontClient::Get();
405 fontClient.GetDefaultFonts(fontList);
407 std::ostringstream oss;
408 oss << fontList << std::endl;
410 tet_printf("FontList: %s", oss.str().c_str());
411 DALI_TEST_CHECK(fontList.size() > 0);
416 int UtcDaliFontClientGetSystemFonts(void)
418 TestApplication application;
419 tet_infoline(" UtcDaliFontClientGetSystemFonts ");
421 FontClient fontClient;
422 fontClient = FontClient::Get();
425 fontClient.GetSystemFonts(fontList);
427 std::ostringstream oss;
428 oss << fontList << std::endl;
430 tet_printf("FontList: %s", oss.str().c_str());
431 DALI_TEST_CHECK(fontList.size() > 0);
433 const PointSize26Dot6 pointSize = fontClient.GetPointSize(fontList.size());
434 DALI_TEST_EQUALS(pointSize, FontClient::DEFAULT_POINT_SIZE, TEST_LOCATION);
439 std::ostream& operator<<(std::ostream& o, const FontDescription& description)
441 o << "Font path: " << description.path << " family: "
442 << " width : " << description.width << " weight : " << description.weight << " slant : " << description.slant << std::endl;
446 int UtcDaliFontClientGetDefaultPlatformFontDescription(void)
448 TestApplication application;
449 tet_infoline(" UtcDaliFontClientGetDefaultPlatformFontDescription");
451 FontClient fontClient;
452 fontClient = FontClient::Get();
454 FontDescription fontDescription;
455 fontClient.GetDefaultPlatformFontDescription(fontDescription);
457 std::ostringstream oss;
458 oss << fontDescription;
459 tet_printf("%s", oss.str().c_str());
461 DALI_TEST_CHECK(fontDescription.path.empty() == false);
463 FontId fontId = fontClient.FindFallbackFont('A',
465 FontClient::DEFAULT_POINT_SIZE,
468 bool supported = fontClient.IsCharacterSupportedByFont(fontId, 'A');
469 DALI_TEST_EQUALS(supported, true, TEST_LOCATION);
475 constexpr uint8_t U1 = 1u;
476 constexpr uint8_t U2 = 2u;
477 constexpr uint8_t U3 = 3u;
478 constexpr uint8_t U4 = 4u;
479 constexpr uint8_t U5 = 5u;
480 constexpr uint8_t U6 = 6u;
481 constexpr uint8_t U0 = 0u;
482 constexpr uint8_t UTF8_LENGTH[256] = {
483 U1, U1, U1, U1, U1, U1, U1, U1, U1, U1, //
563 U1, // lead byte = 0xxx xxxx (U+0000 - U+007F + some extended ascii characters)
686 U2, // lead byte = 110x xxxx (U+0080 - U+07FF)
709 U3, // lead byte = 1110 xxxx (U+0800 - U+FFFF)
724 U4, // lead byte = 1111 0xxx (U+10000 - U+1FFFFF)
729 U5, // lead byte = 1111 10xx (U+200000 - U+3FFFFFF)
732 U6, // lead byte = 1111 110x (U+4000000 - U+7FFFFFFF)
738 constexpr uint8_t CR = 0xd;
739 constexpr uint8_t LF = 0xa;
741 uint8_t GetUtf8Length(uint8_t utf8LeadByte)
743 return UTF8_LENGTH[utf8LeadByte];
746 uint32_t Utf8ToUtf32(const uint8_t* const utf8, uint32_t length, uint32_t* utf32)
748 uint32_t numberOfCharacters = 0u;
750 const uint8_t* begin = utf8;
751 const uint8_t* end = utf8 + length;
753 for(; begin < end; ++numberOfCharacters)
755 const uint8_t leadByte = *begin;
757 switch(UTF8_LENGTH[leadByte])
763 // Replace CR+LF or CR by LF
766 // Look ahead if the next one is a LF.
786 uint32_t& code = *utf32++;
787 code = leadByte & 0x1fu;
790 code |= *begin++ & 0x3fu;
796 uint32_t& code = *utf32++;
797 code = leadByte & 0x0fu;
800 code |= *begin++ & 0x3fu;
802 code |= *begin++ & 0x3fu;
808 uint32_t& code = *utf32++;
809 code = leadByte & 0x07u;
812 code |= *begin++ & 0x3fu;
814 code |= *begin++ & 0x3fu;
816 code |= *begin++ & 0x3fu;
822 uint32_t& code = *utf32++;
823 code = leadByte & 0x03u;
826 code |= *begin++ & 0x3fu;
828 code |= *begin++ & 0x3fu;
830 code |= *begin++ & 0x3fu;
832 code |= *begin++ & 0x3fu;
838 uint32_t& code = *utf32++;
839 code = leadByte & 0x01u;
842 code |= *begin++ & 0x3fu;
844 code |= *begin++ & 0x3fu;
846 code |= *begin++ & 0x3fu;
848 code |= *begin++ & 0x3fu;
850 code |= *begin++ & 0x3fu;
854 case U0: // Invalid case
857 *utf32++ = 0x20; // Use white space
863 return numberOfCharacters;
866 TextAbstraction::FontId SetupBitmapFont()
873 GlyphDesc(const std::string& url, const std::string& utf8)
877 DALI_ASSERT_ALWAYS(utf8.size() <= 6u);
879 #pragma GCC diagnostic push
880 #pragma GCC diagnostic ignored "-Wstringop-overflow"
881 std::copy(utf8.begin(), utf8.end(), this->utf8);
882 #pragma GCC diagnostic pop
887 std::vector<GlyphDesc> glyphs;
889 glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0030.png", ":"});
890 glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0031.png", "0"});
891 glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0032.png", "1"});
892 glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0033.png", "2"});
893 glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0034.png", "3"});
894 glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0035.png", "4"});
895 glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0036.png", "5"});
896 glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0037.png", "6"});
897 glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0038.png", "7"});
898 glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u0039.png", "8"});
899 glyphs.push_back({TEST_RESOURCE_DIR "/fonts/bitmap/u003a.png", "9"});
901 TextAbstraction::BitmapFont bitmapFont;
902 bitmapFont.glyphs.reserve(glyphs.size());
903 bitmapFont.name = "Digits";
904 bitmapFont.underlinePosition = 0.f;
905 bitmapFont.underlineThickness = 0.f;
906 bitmapFont.isColorFont = true;
908 for(const auto& glyph : glyphs)
911 Utf8ToUtf32(glyph.utf8, GetUtf8Length(glyph.utf8[0u]), &c);
912 TextAbstraction::BitmapGlyph bitmapGlyph(glyph.url, c, 34.f, 0.f);
913 bitmapFont.glyphs.push_back(std::move(bitmapGlyph));
916 TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
917 return fontClient.GetFontId(bitmapFont);
922 int UtcDaliFontClientTestBitmapFont(void)
924 TestApplication application;
925 tet_infoline(" UtcDaliFontClientTestBitmapFont");
927 FontClient fontClient;
928 fontClient = FontClient::Get();
930 auto bitmapFontId = SetupBitmapFont();
932 FontDescription fontDescription;
933 fontClient.GetDescription(bitmapFontId, fontDescription);
934 std::ostringstream oss;
935 oss << fontDescription;
936 tet_printf("Found: %d: %s", bitmapFontId, oss.str().c_str());
938 bool color = fontClient.IsColorGlyph(bitmapFontId, fontClient.GetGlyphIndex(bitmapFontId, '2'));
939 DALI_TEST_EQUALS(color, true, TEST_LOCATION);
941 DALI_TEST_EQUALS(fontClient.GetPointSize(bitmapFontId), FontClient::DEFAULT_POINT_SIZE, TEST_LOCATION);
943 DALI_TEST_EQUALS(fontClient.IsCharacterSupportedByFont(bitmapFontId, '3'), true, TEST_LOCATION);
944 DALI_TEST_EQUALS(fontClient.IsCharacterSupportedByFont(bitmapFontId, 'a'), false, TEST_LOCATION);