2 * Copyright (c) 2020 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-test-suite-utils.h>
20 #include <dali-toolkit/dali-toolkit.h>
21 #include <dali-toolkit/devel-api/utility/npatch-utilities.h>
24 using namespace Dali::Toolkit;
29 void InitialiseRegionsToZeroAlpha( Dali::Devel::PixelBuffer pixelBuffer, uint32_t width, uint32_t height, Pixel::Format pixelFormat )
31 unsigned char* buffer = pixelBuffer.GetBuffer();
32 uint32_t bytesPerPixel = GetBytesPerPixel( pixelFormat );
34 for( uint32_t row = 0; row < width; ++row )
36 uint32_t pixelOffset = row * bytesPerPixel;
37 buffer[ pixelOffset + 3 ] = 0x00;
38 pixelOffset += ( height - 1 ) * width * bytesPerPixel;
39 buffer[ pixelOffset + 3 ] = 0x00;
42 for( unsigned int column = 0; column < height; ++column )
44 uint32_t pixelOffset = column * width * bytesPerPixel;
45 buffer[ pixelOffset + 3 ] = 0x00;
46 pixelOffset += ( width -1 ) * bytesPerPixel;
47 buffer[ pixelOffset + 3 ] = 0x00;
51 void AddStretchRegionsToImage( Dali::Devel::PixelBuffer pixelBuffer, uint32_t width, uint32_t height, const Vector4& requiredStretchBorder, Pixel::Format pixelFormat )
53 unsigned char* buffer = pixelBuffer.GetBuffer();
54 uint32_t bytesPerPixel = GetBytesPerPixel( pixelFormat );
56 for( uint32_t column = requiredStretchBorder.x; column < width - requiredStretchBorder.z; ++column )
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;
65 for( uint32_t row = requiredStretchBorder.y; row < height - requiredStretchBorder.w; ++row )
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;
75 Dali::Devel::PixelBuffer CustomizeNPatch( uint32_t width, uint32_t height, const Vector4& requiredStretchBorder )
77 Pixel::Format pixelFormat = Pixel::RGBA8888;
78 Dali::Devel::PixelBuffer pixelBuffer = Dali::Devel::PixelBuffer::New( width, height, pixelFormat );
80 unsigned char* buffer = pixelBuffer.GetBuffer();
81 memset( buffer, 0, width * height * Dali::Pixel::GetBytesPerPixel( pixelFormat ) );
83 InitialiseRegionsToZeroAlpha( pixelBuffer, width, height, pixelFormat );
85 AddStretchRegionsToImage( pixelBuffer, width, height, requiredStretchBorder, pixelFormat );
92 void dali_npatch_utilities_startup(void)
94 test_return_value = TET_UNDEF;
97 void dali_npatch_utilities_cleanup(void)
99 test_return_value = TET_PASS;
102 int UtcDaliNPatchUtilityGetRedOffsetAndMask(void)
104 TestApplication application;
106 tet_infoline("UtcDaliNPatchUtilityGetRedOffsetAndMask");
108 int32_t byteOffset = 0;
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 );
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 );
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 );
130 NPatchUtility::GetRedOffsetAndMask( Pixel::RGB565, byteOffset, bitMask );
131 DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0xf8 );
133 NPatchUtility::GetRedOffsetAndMask( Pixel::BGR565, byteOffset, bitMask );
134 DALI_TEST_CHECK( byteOffset == 1 && bitMask == 0x1f );
136 NPatchUtility::GetRedOffsetAndMask( Pixel::RGBA4444, byteOffset, bitMask );
137 DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0xf0 );
139 NPatchUtility::GetRedOffsetAndMask( Pixel::BGRA4444, byteOffset, bitMask );
140 DALI_TEST_CHECK( byteOffset == 1 && bitMask == 0xf0 );
142 NPatchUtility::GetRedOffsetAndMask( Pixel::RGBA5551, byteOffset, bitMask );
143 DALI_TEST_CHECK( byteOffset == 0 && bitMask == 0xf8 );
145 NPatchUtility::GetRedOffsetAndMask( Pixel::BGRA5551, byteOffset, bitMask );
146 DALI_TEST_CHECK( byteOffset == 1 && bitMask == 0x1e );
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 );
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 );
241 int UtcDaliNPatchUtilityParseBorders(void)
243 TestApplication application;
244 tet_infoline("UtcDaliNPatchUtilityParseBorders");
246 /* Stretch region left(2) top(2) right (2) bottom (2)
257 const unsigned int imageHeight = 18;
258 const unsigned int imageWidth = 28;
259 const Vector4 requiredStretchBorder( 3, 4, 5, 6 );
261 Dali::Devel::PixelBuffer pixelBuffer = CustomizeNPatch( imageHeight, imageWidth, requiredStretchBorder );
262 DALI_TEST_CHECK( pixelBuffer );
266 NPatchUtility::StretchRanges stretchPixelsX;
267 NPatchUtility::StretchRanges stretchPixelsY;
269 NPatchUtility::ParseBorders( pixelBuffer, stretchPixelsX, stretchPixelsY );
271 DALI_TEST_CHECK( stretchPixelsX.Size() == 1 );
272 DALI_TEST_CHECK( stretchPixelsY.Size() == 1 );
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;
281 DALI_TEST_EQUALS( stretchBorders, requiredStretchBorder, 0.001, TEST_LOCATION );
285 test_return_value = TET_FAIL;
291 int UtcDaliNPatchUtilityIsNinePatchUrl(void)
293 tet_infoline( "UtcDaliNPatchUtilityIsNinePatchUrl" );
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" ) );