Merge "Merge branch 'devel/master' into devel/graphics" into devel/master
[platform/core/uifw/dali-adaptor.git] / automated-tests / src / dali-adaptor-internal / utc-Dali-FontClient.cpp
1 /*
2  * Copyright (c) 2014 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 #include <iostream>
19
20 #include <dali-test-suite-utils.h>
21 #include <dali/dali.h>
22 #include <dali/devel-api/text-abstraction/font-client.h>
23 #include <dali/internal/text/text-abstraction/font-client-helper.h>
24 #include <stdint.h>
25 #include <stdlib.h>
26 #include <unistd.h>
27
28 using namespace Dali;
29
30 int UtcDaliFontClient(void)
31 {
32   const int ORDERED_VALUES[] = {-1, 50, 63, 75, 87, 100, 113, 125, 150, 200};
33
34   const unsigned int NUM_OF_ORDERED_VALUES = sizeof(ORDERED_VALUES) / sizeof(int);
35
36   TestApplication application;
37   int             result = 0;
38
39   tet_infoline("UtcDaliFontClient No table");
40   result = TextAbstraction::Internal::ValueToIndex(100, NULL, 0u);
41   DALI_TEST_EQUALS(-1, result, TEST_LOCATION);
42
43   tet_infoline("UtcDaliFontClient Non defined values");
44   result = TextAbstraction::Internal::ValueToIndex(-1, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
45   DALI_TEST_EQUALS(0, result, TEST_LOCATION);
46   result = TextAbstraction::Internal::ValueToIndex(-3, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
47   DALI_TEST_EQUALS(0, result, TEST_LOCATION);
48
49   tet_infoline("UtcDaliFontClient Between non defined and first of range.");
50   result = TextAbstraction::Internal::ValueToIndex(0, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
51   DALI_TEST_EQUALS(1, result, TEST_LOCATION);
52   result = TextAbstraction::Internal::ValueToIndex(30, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
53   DALI_TEST_EQUALS(1, result, TEST_LOCATION);
54   result = TextAbstraction::Internal::ValueToIndex(49, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
55   DALI_TEST_EQUALS(1, result, TEST_LOCATION);
56
57   tet_infoline("UtcDaliFontClient Defined in range");
58   for(unsigned int index = 1u; index < NUM_OF_ORDERED_VALUES; ++index)
59   {
60     result = TextAbstraction::Internal::ValueToIndex(ORDERED_VALUES[index], ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
61     DALI_TEST_EQUALS(index, result, TEST_LOCATION);
62   }
63
64   tet_infoline("UtcDaliFontClient Non defined in range");
65   result = TextAbstraction::Internal::ValueToIndex(51, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
66   DALI_TEST_EQUALS(1, result, TEST_LOCATION);
67   result = TextAbstraction::Internal::ValueToIndex(55, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
68   DALI_TEST_EQUALS(1, result, TEST_LOCATION);
69   result = TextAbstraction::Internal::ValueToIndex(62, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
70   DALI_TEST_EQUALS(2, result, TEST_LOCATION);
71   result = TextAbstraction::Internal::ValueToIndex(64, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
72   DALI_TEST_EQUALS(2, result, TEST_LOCATION);
73   result = TextAbstraction::Internal::ValueToIndex(151, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
74   DALI_TEST_EQUALS(8, result, TEST_LOCATION);
75   result = TextAbstraction::Internal::ValueToIndex(175, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
76   DALI_TEST_EQUALS(9, result, TEST_LOCATION);
77   result = TextAbstraction::Internal::ValueToIndex(176, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
78   DALI_TEST_EQUALS(9, result, TEST_LOCATION);
79   result = TextAbstraction::Internal::ValueToIndex(199, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
80   DALI_TEST_EQUALS(9, result, TEST_LOCATION);
81
82   tet_infoline("UtcDaliFontClient above of range");
83   result = TextAbstraction::Internal::ValueToIndex(220, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
84   DALI_TEST_EQUALS(9, result, TEST_LOCATION);
85   result = TextAbstraction::Internal::ValueToIndex(500, ORDERED_VALUES, NUM_OF_ORDERED_VALUES - 1u);
86   DALI_TEST_EQUALS(9, result, TEST_LOCATION);
87
88   END_TEST;
89 }
90
91 int UtcDaliFontClientAtlasLimitation(void)
92 {
93   TestApplication             application;
94   bool                        result     = 0;
95   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
96
97   tet_infoline("UtcDaliFontClientAtlasLimitation Default");
98   result = fontClient.IsAtlasLimitationEnabled();
99   DALI_TEST_EQUALS(TextAbstraction::FontClient::DEFAULT_ATLAS_LIMITATION_ENABLED, result, TEST_LOCATION);
100
101   tet_infoline("UtcDaliFontClientAtlasLimitation Enabled");
102   fontClient.EnableAtlasLimitation(true);
103   result = fontClient.IsAtlasLimitationEnabled();
104   DALI_TEST_EQUALS(true, result, TEST_LOCATION);
105
106   tet_infoline("UtcDaliFontClientAtlasLimitation Disabled");
107   fontClient.EnableAtlasLimitation(false);
108   result = fontClient.IsAtlasLimitationEnabled();
109   DALI_TEST_EQUALS(false, result, TEST_LOCATION);
110   END_TEST;
111 }
112
113 const std::string DEFAULT_FONT_DIR("/resources/fonts");
114 const uint32_t    MAX_WIDTH_FIT_IN_ATLAS  = TextAbstraction::FontClient::MAX_TEXT_ATLAS_WIDTH - TextAbstraction::FontClient::PADDING_TEXT_ATLAS_BLOCK;
115 const uint32_t    MAX_HEIGHT_FIT_IN_ATLAS = TextAbstraction::FontClient::MAX_TEXT_ATLAS_HEIGHT - TextAbstraction::FontClient::PADDING_TEXT_ATLAS_BLOCK;
116
117 int UtcDaliFontClientAtlasLimitationEnabled(void)
118 {
119   TestApplication application;
120
121   char*             pathNamePtr = get_current_dir_name();
122   const std::string pathName(pathNamePtr);
123   free(pathNamePtr);
124
125   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
126   fontClient.EnableAtlasLimitation(true);
127
128   // The font file "DejaVuSans.ttf" is copied from Toolkit to Adaptor to make test-case of specific font-family.
129   // Note the block size depends on font-family.
130   // This is to create FontDescription and pass it to GetFontId with point-size (various cases).
131   TextAbstraction::FontDescription fontDescription;
132   fontDescription.path   = pathName + DEFAULT_FONT_DIR + "/dejavu/DejaVuSans.ttf";
133   fontDescription.family = "DejaVuSans";
134   fontDescription.width  = TextAbstraction::FontWidth::NONE;
135   fontDescription.weight = TextAbstraction::FontWeight::NORMAL;
136   fontDescription.slant  = TextAbstraction::FontSlant::NONE;
137
138   // Block's width or height are less than 512
139   tet_infoline("UtcDaliFontClientAtlasLimitationEnabled PointSize=200");
140   uint32_t                                     pointSize200 = 200 * TextAbstraction::FontClient::NUMBER_OF_POINTS_PER_ONE_UNIT_OF_POINT_SIZE;
141   TextAbstraction::FontId                      fontId200    = fontClient.GetFontId(fontDescription, pointSize200);
142   TextAbstraction::FontClient::GlyphBufferData glyphBufferData200;
143   glyphBufferData200.width  = 0;
144   glyphBufferData200.height = 0;
145   fontClient.CreateBitmap(fontId200, 68, false, false, glyphBufferData200, 0);
146
147   DALI_TEST_GREATER(MAX_WIDTH_FIT_IN_ATLAS, glyphBufferData200.width, TEST_LOCATION);
148   DALI_TEST_GREATER(MAX_HEIGHT_FIT_IN_ATLAS, glyphBufferData200.height, TEST_LOCATION);
149
150   // Block's width or height are  greater than 512 and less than 1024
151   uint32_t pointSize1000 = 1000 * TextAbstraction::FontClient::NUMBER_OF_POINTS_PER_ONE_UNIT_OF_POINT_SIZE;
152   tet_infoline("UtcDaliFontClientAtlasLimitationEnabled PointSize=1000");
153   TextAbstraction::FontId                      fontId1000 = fontClient.GetFontId(fontDescription, pointSize1000);
154   TextAbstraction::FontClient::GlyphBufferData glyphBufferData1000;
155   glyphBufferData1000.width  = 0;
156   glyphBufferData1000.height = 0;
157   fontClient.CreateBitmap(fontId1000, 68, false, false, glyphBufferData1000, 0);
158
159   DALI_TEST_GREATER(MAX_WIDTH_FIT_IN_ATLAS, glyphBufferData1000.width, TEST_LOCATION);
160   DALI_TEST_GREATER(MAX_HEIGHT_FIT_IN_ATLAS, glyphBufferData1000.height, TEST_LOCATION);
161
162   // Block's width or height are greater than 1024 and less than 2048
163   uint32_t pointSize2000 = 2000 * TextAbstraction::FontClient::NUMBER_OF_POINTS_PER_ONE_UNIT_OF_POINT_SIZE;
164   tet_infoline("UtcDaliFontClientAtlasLimitationEnabled PointSize=2000");
165   TextAbstraction::FontId                      fontId2000 = fontClient.GetFontId(fontDescription, pointSize2000);
166   TextAbstraction::FontClient::GlyphBufferData glyphBufferData2000;
167   glyphBufferData2000.width  = 0;
168   glyphBufferData2000.height = 0;
169   fontClient.CreateBitmap(fontId2000, 68, false, false, glyphBufferData2000, 0);
170
171   DALI_TEST_GREATER(MAX_WIDTH_FIT_IN_ATLAS, glyphBufferData2000.width, TEST_LOCATION);
172   DALI_TEST_GREATER(MAX_HEIGHT_FIT_IN_ATLAS, glyphBufferData2000.height, TEST_LOCATION);
173
174   END_TEST;
175 }
176
177 int UtcDaliFontClientAtlasLimitationDisabled(void)
178 {
179   TestApplication application;
180
181   char*             pathNamePtr = get_current_dir_name();
182   const std::string pathName(pathNamePtr);
183   free(pathNamePtr);
184
185   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
186   fontClient.EnableAtlasLimitation(false);
187
188   TextAbstraction::FontDescription fontDescription;
189   fontDescription.path   = pathName + DEFAULT_FONT_DIR + "/dejavu/DejaVuSans.ttf";
190   fontDescription.family = "DejaVuSans";
191   fontDescription.width  = TextAbstraction::FontWidth::NONE;
192   fontDescription.weight = TextAbstraction::FontWeight::NORMAL;
193   fontDescription.slant  = TextAbstraction::FontSlant::NONE;
194
195   // Block's width or height are less than 512
196   tet_infoline("UtcDaliFontClientAtlasLimitationDisabled PointSize=200");
197   uint32_t                                     pointSize200 = 200 * TextAbstraction::FontClient::NUMBER_OF_POINTS_PER_ONE_UNIT_OF_POINT_SIZE;
198   TextAbstraction::FontId                      fontId200    = fontClient.GetFontId(fontDescription, pointSize200);
199   TextAbstraction::FontClient::GlyphBufferData glyphBufferData200;
200   glyphBufferData200.width  = 0;
201   glyphBufferData200.height = 0;
202   fontClient.CreateBitmap(fontId200, 68, false, false, glyphBufferData200, 0);
203
204   DALI_TEST_GREATER(512u, glyphBufferData200.width, TEST_LOCATION);  //93u
205   DALI_TEST_GREATER(512u, glyphBufferData200.height, TEST_LOCATION); //115u
206
207   // Block's width or height are  greater than 512 and less than 1024
208   tet_infoline("UtcDaliFontClientAtlasLimitationDisabled PointSize=1000");
209   uint32_t                                     pointSize1000 = 1000 * TextAbstraction::FontClient::NUMBER_OF_POINTS_PER_ONE_UNIT_OF_POINT_SIZE;
210   TextAbstraction::FontId                      fontId1000    = fontClient.GetFontId(fontDescription, pointSize1000);
211   TextAbstraction::FontClient::GlyphBufferData glyphBufferData1000;
212   glyphBufferData1000.width  = 0;
213   glyphBufferData1000.height = 0;
214   fontClient.CreateBitmap(fontId1000, 68, false, false, glyphBufferData1000, 0);
215
216   DALI_TEST_GREATER(512u, glyphBufferData1000.width, TEST_LOCATION);  //462u
217   DALI_TEST_GREATER(glyphBufferData1000.height, 512u, TEST_LOCATION); //574u
218
219   // Block's width or height are greater than 1024 and less than 2048
220   tet_infoline("UtcDaliFontClientAtlasLimitationDisabled PointSize=2000");
221   uint32_t                                     pointSize2000 = 2000 * TextAbstraction::FontClient::NUMBER_OF_POINTS_PER_ONE_UNIT_OF_POINT_SIZE;
222   TextAbstraction::FontId                      fontId2000    = fontClient.GetFontId(fontDescription, pointSize2000);
223   TextAbstraction::FontClient::GlyphBufferData glyphBufferData2000;
224   glyphBufferData2000.width  = 0;
225   glyphBufferData2000.height = 0;
226   fontClient.CreateBitmap(fontId2000, 68, false, false, glyphBufferData2000, 0);
227
228   DALI_TEST_GREATER(1024u, glyphBufferData2000.width, TEST_LOCATION);  //924u
229   DALI_TEST_GREATER(glyphBufferData2000.height, 1024u, TEST_LOCATION); //1148u
230
231   END_TEST;
232 }
233
234 int UtcDaliFontClientCurrentMaximumBlockSizeFitInAtlas(void)
235 {
236   TestApplication application;
237   tet_infoline(" UtcDaliFontClientCurrentMaximumBlockSizeFitInAtlas ");
238
239   bool                        isChanged;
240   TextAbstraction::FontClient fontClient;
241   fontClient = TextAbstraction::FontClient::Get();
242
243   Size defaultTextAtlasSize              = fontClient.GetDefaultTextAtlasSize();
244   Size maximumTextAtlasSize              = fontClient.GetMaximumTextAtlasSize();
245   Size currentMaximumBlockSizeFitInAtlas = fontClient.GetCurrentMaximumBlockSizeFitInAtlas();
246
247   tet_infoline("CurrentMaximumBlockSizeFitInAtlas start with default ");
248   DALI_TEST_EQUALS(currentMaximumBlockSizeFitInAtlas, defaultTextAtlasSize, TEST_LOCATION);
249
250   tet_infoline("SetCurrentMaximumBlockSizeFitInAtlas is changed with current ");
251   isChanged = fontClient.SetCurrentMaximumBlockSizeFitInAtlas(currentMaximumBlockSizeFitInAtlas);
252   DALI_TEST_CHECK(isChanged);
253
254   Size decreaseOnlyWidth(currentMaximumBlockSizeFitInAtlas.width - 1u, currentMaximumBlockSizeFitInAtlas.height);
255   tet_infoline("SetCurrentMaximumBlockSizeFitInAtlas is changed with width < current ");
256   isChanged = fontClient.SetCurrentMaximumBlockSizeFitInAtlas(decreaseOnlyWidth);
257   DALI_TEST_CHECK(isChanged);
258
259   Size decreaseOnlyHeigth(currentMaximumBlockSizeFitInAtlas.width, currentMaximumBlockSizeFitInAtlas.height - 1u);
260   tet_infoline("SetCurrentMaximumBlockSizeFitInAtlas is changed with height < current ");
261   isChanged = fontClient.SetCurrentMaximumBlockSizeFitInAtlas(decreaseOnlyHeigth);
262   DALI_TEST_CHECK(isChanged);
263
264   Size decreaseBoth(currentMaximumBlockSizeFitInAtlas.width - 1u, currentMaximumBlockSizeFitInAtlas.height - 1u);
265   tet_infoline("SetCurrentMaximumBlockSizeFitInAtlas is changed with size < current ");
266   isChanged = fontClient.SetCurrentMaximumBlockSizeFitInAtlas(decreaseBoth);
267   DALI_TEST_CHECK(isChanged);
268
269   Size increaseOnlyWidth(maximumTextAtlasSize.width + 1u, currentMaximumBlockSizeFitInAtlas.height);
270   tet_infoline("SetCurrentMaximumBlockSizeFitInAtlas is not changed with width > max ");
271   isChanged = fontClient.SetCurrentMaximumBlockSizeFitInAtlas(increaseOnlyWidth);
272   DALI_TEST_CHECK(!isChanged);
273
274   Size increaseOnlyHeigth(currentMaximumBlockSizeFitInAtlas.width, maximumTextAtlasSize.height + 1u);
275   tet_infoline("SetCurrentMaximumBlockSizeFitInAtlas is not changed with height > max ");
276   isChanged = fontClient.SetCurrentMaximumBlockSizeFitInAtlas(increaseOnlyHeigth);
277   DALI_TEST_CHECK(!isChanged);
278
279   Size increaseBoth(maximumTextAtlasSize.width + 1u, maximumTextAtlasSize.height + 1u);
280   tet_infoline("SetCurrentMaximumBlockSizeFitInAtlas is not changed with size > max ");
281   isChanged = fontClient.SetCurrentMaximumBlockSizeFitInAtlas(increaseBoth);
282   DALI_TEST_CHECK(!isChanged);
283
284   currentMaximumBlockSizeFitInAtlas = fontClient.GetCurrentMaximumBlockSizeFitInAtlas();
285   if(currentMaximumBlockSizeFitInAtlas.width < maximumTextAtlasSize.width && currentMaximumBlockSizeFitInAtlas.height < maximumTextAtlasSize.height)
286   {
287     tet_infoline("SetCurrentMaximumBlockSizeFitInAtlas is changed with current < size < max ");
288     Size increaseWidth = Size(currentMaximumBlockSizeFitInAtlas.width + 1u, currentMaximumBlockSizeFitInAtlas.height);
289     isChanged          = fontClient.SetCurrentMaximumBlockSizeFitInAtlas(increaseWidth);
290     DALI_TEST_CHECK(isChanged);
291     currentMaximumBlockSizeFitInAtlas = fontClient.GetCurrentMaximumBlockSizeFitInAtlas();
292
293     Size increaseHeigth = Size(currentMaximumBlockSizeFitInAtlas.width, currentMaximumBlockSizeFitInAtlas.height + 1u);
294     isChanged           = fontClient.SetCurrentMaximumBlockSizeFitInAtlas(increaseHeigth);
295     DALI_TEST_CHECK(isChanged);
296     currentMaximumBlockSizeFitInAtlas = fontClient.GetCurrentMaximumBlockSizeFitInAtlas();
297
298     Size sizeLessThanMax = Size(currentMaximumBlockSizeFitInAtlas.width + 1u, currentMaximumBlockSizeFitInAtlas.height + 1u);
299     isChanged            = fontClient.SetCurrentMaximumBlockSizeFitInAtlas(sizeLessThanMax);
300
301     if(currentMaximumBlockSizeFitInAtlas.width < maximumTextAtlasSize.width && currentMaximumBlockSizeFitInAtlas.height < maximumTextAtlasSize.height)
302     {
303       DALI_TEST_CHECK(isChanged);
304     }
305     else
306     {
307       DALI_TEST_CHECK(!isChanged);
308     }
309
310     currentMaximumBlockSizeFitInAtlas = fontClient.GetCurrentMaximumBlockSizeFitInAtlas();
311
312     DALI_TEST_NOT_EQUALS(currentMaximumBlockSizeFitInAtlas, defaultTextAtlasSize, 0.0f, TEST_LOCATION);
313     DALI_TEST_EQUALS(currentMaximumBlockSizeFitInAtlas, sizeLessThanMax, TEST_LOCATION);
314
315     tet_infoline("SetCurrentMaximumBlockSizeFitInAtlas is not changed with size == max ");
316     isChanged = fontClient.SetCurrentMaximumBlockSizeFitInAtlas(maximumTextAtlasSize);
317     DALI_TEST_CHECK(!isChanged);
318   }
319
320   currentMaximumBlockSizeFitInAtlas = fontClient.GetCurrentMaximumBlockSizeFitInAtlas();
321   DALI_TEST_NOT_EQUALS(currentMaximumBlockSizeFitInAtlas, maximumTextAtlasSize, 0.0f, TEST_LOCATION);
322
323   END_TEST;
324 }
325
326 int UtcDaliFontClientTextAtlasConstants(void)
327 {
328   TestApplication application;
329   tet_infoline(" UtcDaliFontClientTextAtlasConstants ");
330
331   TextAbstraction::FontClient fontClient;
332   fontClient = TextAbstraction::FontClient::Get();
333
334   Size defaultTextAtlasSize = fontClient.GetDefaultTextAtlasSize();
335   Size defaultTextAtlasWidthHeight(TextAbstraction::FontClient::DEFAULT_TEXT_ATLAS_WIDTH, TextAbstraction::FontClient::DEFAULT_TEXT_ATLAS_HEIGHT);
336   DALI_TEST_EQUALS(defaultTextAtlasSize, TextAbstraction::FontClient::DEFAULT_TEXT_ATLAS_SIZE, TEST_LOCATION);
337   DALI_TEST_EQUALS(defaultTextAtlasSize, defaultTextAtlasWidthHeight, TEST_LOCATION);
338
339   Size maximumTextAtlasSize = fontClient.GetMaximumTextAtlasSize();
340   Size maxTextAtlasWidthHeight(TextAbstraction::FontClient::MAX_TEXT_ATLAS_WIDTH, TextAbstraction::FontClient::MAX_TEXT_ATLAS_HEIGHT);
341   DALI_TEST_EQUALS(maximumTextAtlasSize, TextAbstraction::FontClient::MAX_TEXT_ATLAS_SIZE, TEST_LOCATION);
342   DALI_TEST_EQUALS(maximumTextAtlasSize, maxTextAtlasWidthHeight, TEST_LOCATION);
343
344   uint32_t numberOfPointsPerOneUnitOfPointSize = fontClient.GetNumberOfPointsPerOneUnitOfPointSize();
345   DALI_TEST_EQUALS(numberOfPointsPerOneUnitOfPointSize, TextAbstraction::FontClient::NUMBER_OF_POINTS_PER_ONE_UNIT_OF_POINT_SIZE, TEST_LOCATION);
346
347   END_TEST;
348 }