[dali_2.3.20] Merge branch 'devel/master'
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit / utc-Dali-NPatchUtilities.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 #include <dali-toolkit-test-suite-utils.h>
18 #include <dali-toolkit/dali-toolkit.h>
19 #include <dali-toolkit/devel-api/utility/npatch-utilities.h>
20 #include <stdlib.h>
21 #include <iostream>
22
23 using namespace Dali;
24 using namespace Dali::Toolkit;
25
26 namespace
27 {
28 void InitialiseRegionsToZeroAlpha(Dali::Devel::PixelBuffer pixelBuffer, uint32_t width, uint32_t height, Pixel::Format pixelFormat)
29 {
30   unsigned char* buffer        = pixelBuffer.GetBuffer();
31   uint32_t       bytesPerPixel = GetBytesPerPixel(pixelFormat);
32
33   for(uint32_t row = 0; row < width; ++row)
34   {
35     uint32_t pixelOffset    = row * bytesPerPixel;
36     buffer[pixelOffset + 3] = 0x00;
37     pixelOffset += (height - 1) * width * bytesPerPixel;
38     buffer[pixelOffset + 3] = 0x00;
39   }
40
41   for(unsigned int column = 0; column < height; ++column)
42   {
43     uint32_t pixelOffset    = column * width * bytesPerPixel;
44     buffer[pixelOffset + 3] = 0x00;
45     pixelOffset += (width - 1) * bytesPerPixel;
46     buffer[pixelOffset + 3] = 0x00;
47   }
48 }
49
50 void AddStretchRegionsToImage(Dali::Devel::PixelBuffer pixelBuffer, uint32_t width, uint32_t height, const Vector4& requiredStretchBorder, Pixel::Format pixelFormat)
51 {
52   unsigned char* buffer        = pixelBuffer.GetBuffer();
53   uint32_t       bytesPerPixel = GetBytesPerPixel(pixelFormat);
54
55   for(uint32_t column = requiredStretchBorder.x; column < width - requiredStretchBorder.z; ++column)
56   {
57     uint32_t pixelOffset    = column * bytesPerPixel;
58     buffer[pixelOffset]     = 0x00;
59     buffer[pixelOffset + 1] = 0x00;
60     buffer[pixelOffset + 2] = 0x00;
61     buffer[pixelOffset + 3] = 0xFF;
62   }
63
64   for(uint32_t row = requiredStretchBorder.y; row < height - requiredStretchBorder.w; ++row)
65   {
66     unsigned int pixelOffset = row * width * bytesPerPixel;
67     buffer[pixelOffset]      = 0x00;
68     buffer[pixelOffset + 1]  = 0x00;
69     buffer[pixelOffset + 2]  = 0x00;
70     buffer[pixelOffset + 3]  = 0xFF;
71   }
72 }
73
74 Dali::Devel::PixelBuffer CustomizeNPatch(uint32_t width, uint32_t height, const Vector4& requiredStretchBorder)
75 {
76   Pixel::Format            pixelFormat = Pixel::RGBA8888;
77   Dali::Devel::PixelBuffer pixelBuffer = Dali::Devel::PixelBuffer::New(width, height, pixelFormat);
78
79   unsigned char* buffer = pixelBuffer.GetBuffer();
80   memset(buffer, 0, width * height * Dali::Pixel::GetBytesPerPixel(pixelFormat));
81
82   InitialiseRegionsToZeroAlpha(pixelBuffer, width, height, pixelFormat);
83
84   AddStretchRegionsToImage(pixelBuffer, width, height, requiredStretchBorder, pixelFormat);
85
86   return pixelBuffer;
87 }
88
89 } //namespace
90
91 void dali_npatch_utilities_startup(void)
92 {
93   test_return_value = TET_UNDEF;
94 }
95
96 void dali_npatch_utilities_cleanup(void)
97 {
98   test_return_value = TET_PASS;
99 }
100
101 int UtcDaliNPatchUtilityGetRedOffsetAndMask(void)
102 {
103   TestApplication application;
104
105   tet_infoline("UtcDaliNPatchUtilityGetRedOffsetAndMask");
106
107   int32_t byteOffset = 0;
108   int32_t bitMask    = 0;
109
110   NPatchUtility::GetRedOffsetAndMask(Pixel::A8, byteOffset, bitMask);
111   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
112   NPatchUtility::GetRedOffsetAndMask(Pixel::L8, byteOffset, bitMask);
113   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
114   NPatchUtility::GetRedOffsetAndMask(Pixel::LA88, byteOffset, bitMask);
115   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
116
117   NPatchUtility::GetRedOffsetAndMask(Pixel::RGB888, byteOffset, bitMask);
118   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0xff);
119   NPatchUtility::GetRedOffsetAndMask(Pixel::RGB8888, byteOffset, bitMask);
120   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0xff);
121   NPatchUtility::GetRedOffsetAndMask(Pixel::RGBA8888, byteOffset, bitMask);
122   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0xff);
123
124   NPatchUtility::GetRedOffsetAndMask(Pixel::BGR8888, byteOffset, bitMask);
125   DALI_TEST_CHECK(byteOffset == 2 && bitMask == 0xff);
126   NPatchUtility::GetRedOffsetAndMask(Pixel::BGRA8888, byteOffset, bitMask);
127   DALI_TEST_CHECK(byteOffset == 2 && bitMask == 0xff);
128
129   NPatchUtility::GetRedOffsetAndMask(Pixel::RGB565, byteOffset, bitMask);
130   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0xf8);
131
132   NPatchUtility::GetRedOffsetAndMask(Pixel::BGR565, byteOffset, bitMask);
133   DALI_TEST_CHECK(byteOffset == 1 && bitMask == 0x1f);
134
135   NPatchUtility::GetRedOffsetAndMask(Pixel::RGBA4444, byteOffset, bitMask);
136   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0xf0);
137
138   NPatchUtility::GetRedOffsetAndMask(Pixel::BGRA4444, byteOffset, bitMask);
139   DALI_TEST_CHECK(byteOffset == 1 && bitMask == 0xf0);
140
141   NPatchUtility::GetRedOffsetAndMask(Pixel::RGBA5551, byteOffset, bitMask);
142   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0xf8);
143
144   NPatchUtility::GetRedOffsetAndMask(Pixel::BGRA5551, byteOffset, bitMask);
145   DALI_TEST_CHECK(byteOffset == 1 && bitMask == 0x1e);
146
147   // Compressed formats are not supported
148   NPatchUtility::GetRedOffsetAndMask(Pixel::INVALID, byteOffset, bitMask);
149   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
150   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_R11_EAC, byteOffset, bitMask);
151   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
152   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_SIGNED_R11_EAC, byteOffset, bitMask);
153   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
154   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_RG11_EAC, byteOffset, bitMask);
155   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
156   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_SIGNED_RG11_EAC, byteOffset, bitMask);
157   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
158   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_RGB8_ETC2, byteOffset, bitMask);
159   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
160   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_SRGB8_ETC2, byteOffset, bitMask);
161   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
162   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_RGB8_ETC1, byteOffset, bitMask);
163   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
164   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_RGB_PVRTC_4BPPV1, byteOffset, bitMask);
165   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
166   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2, byteOffset, bitMask);
167   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
168   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2, byteOffset, bitMask);
169   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
170   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_RGBA8_ETC2_EAC, byteOffset, bitMask);
171   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
172   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_SRGB8_ALPHA8_ETC2_EAC, byteOffset, bitMask);
173   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
174   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_RGBA_ASTC_4x4_KHR, byteOffset, bitMask);
175   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
176   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_RGBA_ASTC_5x4_KHR, byteOffset, bitMask);
177   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
178   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_RGBA_ASTC_5x5_KHR, byteOffset, bitMask);
179   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
180   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_RGBA_ASTC_6x5_KHR, byteOffset, bitMask);
181   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
182   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_RGBA_ASTC_6x6_KHR, byteOffset, bitMask);
183   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
184   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_RGBA_ASTC_8x5_KHR, byteOffset, bitMask);
185   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
186   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_RGBA_ASTC_8x6_KHR, byteOffset, bitMask);
187   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
188   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_RGBA_ASTC_8x8_KHR, byteOffset, bitMask);
189   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
190   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_RGBA_ASTC_10x5_KHR, byteOffset, bitMask);
191   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
192   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_RGBA_ASTC_10x6_KHR, byteOffset, bitMask);
193   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
194   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_RGBA_ASTC_10x8_KHR, byteOffset, bitMask);
195   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
196   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_RGBA_ASTC_10x10_KHR, byteOffset, bitMask);
197   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
198   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_RGBA_ASTC_12x10_KHR, byteOffset, bitMask);
199   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
200   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_RGBA_ASTC_12x12_KHR, byteOffset, bitMask);
201   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
202   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_4x4_KHR, byteOffset, bitMask);
203   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
204   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_5x4_KHR, byteOffset, bitMask);
205   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
206   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_5x5_KHR, byteOffset, bitMask);
207   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
208   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_6x5_KHR, byteOffset, bitMask);
209   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
210   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_6x6_KHR, byteOffset, bitMask);
211   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
212   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_8x5_KHR, byteOffset, bitMask);
213   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
214   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_8x6_KHR, byteOffset, bitMask);
215   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
216   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_8x8_KHR, byteOffset, bitMask);
217   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
218   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x5_KHR, byteOffset, bitMask);
219   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
220   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x6_KHR, byteOffset, bitMask);
221   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
222   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x8_KHR, byteOffset, bitMask);
223   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
224   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_10x10_KHR, byteOffset, bitMask);
225   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
226   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_12x10_KHR, byteOffset, bitMask);
227   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
228   NPatchUtility::GetRedOffsetAndMask(Pixel::COMPRESSED_SRGB8_ALPHA8_ASTC_12x12_KHR, byteOffset, bitMask);
229   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
230
231   // Not supported
232   NPatchUtility::GetRedOffsetAndMask(Pixel::RGB16F, byteOffset, bitMask);
233   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
234   NPatchUtility::GetRedOffsetAndMask(Pixel::RGB32F, byteOffset, bitMask);
235   DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0);
236
237   END_TEST;
238 }
239
240 int UtcDaliNPatchUtilityParseBorders(void)
241 {
242   TestApplication application;
243   tet_infoline("UtcDaliNPatchUtilityParseBorders");
244
245   /* Stretch region left(2) top(2) right (2) bottom (2)
246     *    ss
247     *  OOOOOO
248     *  OOOOOOc
249     * sOOooOOc
250     * sOOooOOc
251     *  OOOOOOc
252     *  OOOOOO
253     *   cccc
254     */
255
256   const unsigned int imageHeight = 18;
257   const unsigned int imageWidth  = 28;
258   const Vector4      requiredStretchBorder(3, 4, 5, 6);
259
260   Dali::Devel::PixelBuffer pixelBuffer = CustomizeNPatch(imageHeight, imageWidth, requiredStretchBorder);
261   DALI_TEST_CHECK(pixelBuffer);
262
263   if(pixelBuffer)
264   {
265     NPatchUtility::StretchRanges stretchPixelsX;
266     NPatchUtility::StretchRanges stretchPixelsY;
267
268     NPatchUtility::ParseBorders(pixelBuffer, stretchPixelsX, stretchPixelsY);
269
270     DALI_TEST_CHECK(stretchPixelsX.Size() == 1);
271     DALI_TEST_CHECK(stretchPixelsY.Size() == 1);
272
273     Vector4 stretchBorders;
274     //The NPatch image stretch pixels are in the cropped image space, inset by 1 to get it to uncropped image space
275     stretchBorders.x = stretchPixelsX[0].GetX() + 1;
276     stretchBorders.y = stretchPixelsY[0].GetX() + 1;
277     stretchBorders.z = imageHeight - stretchPixelsX[0].GetY() - 1;
278     stretchBorders.w = imageWidth - stretchPixelsY[0].GetY() - 1;
279
280     DALI_TEST_EQUALS(stretchBorders, requiredStretchBorder, 0.001, TEST_LOCATION);
281   }
282   else
283   {
284     test_return_value = TET_FAIL;
285   }
286
287   END_TEST;
288 }
289
290 int UtcDaliNPatchUtilityIsNinePatchUrl(void)
291 {
292   tet_infoline("UtcDaliNPatchUtilityIsNinePatchUrl");
293
294   DALI_TEST_CHECK(NPatchUtility::IsNinePatchUrl("test.9.jpg"));
295   DALI_TEST_CHECK(NPatchUtility::IsNinePatchUrl("test.#.jpg"));
296   DALI_TEST_CHECK(!NPatchUtility::IsNinePatchUrl("test.9"));
297   DALI_TEST_CHECK(!NPatchUtility::IsNinePatchUrl("test.#"));
298   DALI_TEST_CHECK(!NPatchUtility::IsNinePatchUrl("test"));
299
300   END_TEST;
301 }