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