2 * Copyright (c) 2022 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.
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>
24 using namespace Dali::Toolkit;
28 void InitialiseRegionsToZeroAlpha(Dali::Devel::PixelBuffer pixelBuffer, uint32_t width, uint32_t height, Pixel::Format pixelFormat)
30 unsigned char* buffer = pixelBuffer.GetBuffer();
31 uint32_t bytesPerPixel = GetBytesPerPixel(pixelFormat);
33 for(uint32_t row = 0; row < width; ++row)
35 uint32_t pixelOffset = row * bytesPerPixel;
36 buffer[pixelOffset + 3] = 0x00;
37 pixelOffset += (height - 1) * width * bytesPerPixel;
38 buffer[pixelOffset + 3] = 0x00;
41 for(unsigned int column = 0; column < height; ++column)
43 uint32_t pixelOffset = column * width * bytesPerPixel;
44 buffer[pixelOffset + 3] = 0x00;
45 pixelOffset += (width - 1) * bytesPerPixel;
46 buffer[pixelOffset + 3] = 0x00;
50 void AddStretchRegionsToImage(Dali::Devel::PixelBuffer pixelBuffer, uint32_t width, uint32_t height, const Vector4& requiredStretchBorder, Pixel::Format pixelFormat)
52 unsigned char* buffer = pixelBuffer.GetBuffer();
53 uint32_t bytesPerPixel = GetBytesPerPixel(pixelFormat);
55 for(uint32_t column = requiredStretchBorder.x; column < width - requiredStretchBorder.z; ++column)
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;
64 for(uint32_t row = requiredStretchBorder.y; row < height - requiredStretchBorder.w; ++row)
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;
74 Dali::Devel::PixelBuffer CustomizeNPatch(uint32_t width, uint32_t height, const Vector4& requiredStretchBorder)
76 Pixel::Format pixelFormat = Pixel::RGBA8888;
77 Dali::Devel::PixelBuffer pixelBuffer = Dali::Devel::PixelBuffer::New(width, height, pixelFormat);
79 unsigned char* buffer = pixelBuffer.GetBuffer();
80 memset(buffer, 0, width * height * Dali::Pixel::GetBytesPerPixel(pixelFormat));
82 InitialiseRegionsToZeroAlpha(pixelBuffer, width, height, pixelFormat);
84 AddStretchRegionsToImage(pixelBuffer, width, height, requiredStretchBorder, pixelFormat);
91 void dali_npatch_utilities_startup(void)
93 test_return_value = TET_UNDEF;
96 void dali_npatch_utilities_cleanup(void)
98 test_return_value = TET_PASS;
101 int UtcDaliNPatchUtilityGetRedOffsetAndMask(void)
103 TestApplication application;
105 tet_infoline("UtcDaliNPatchUtilityGetRedOffsetAndMask");
107 int32_t byteOffset = 0;
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);
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);
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);
129 NPatchUtility::GetRedOffsetAndMask(Pixel::RGB565, byteOffset, bitMask);
130 DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0xf8);
132 NPatchUtility::GetRedOffsetAndMask(Pixel::BGR565, byteOffset, bitMask);
133 DALI_TEST_CHECK(byteOffset == 1 && bitMask == 0x1f);
135 NPatchUtility::GetRedOffsetAndMask(Pixel::RGBA4444, byteOffset, bitMask);
136 DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0xf0);
138 NPatchUtility::GetRedOffsetAndMask(Pixel::BGRA4444, byteOffset, bitMask);
139 DALI_TEST_CHECK(byteOffset == 1 && bitMask == 0xf0);
141 NPatchUtility::GetRedOffsetAndMask(Pixel::RGBA5551, byteOffset, bitMask);
142 DALI_TEST_CHECK(byteOffset == 0 && bitMask == 0xf8);
144 NPatchUtility::GetRedOffsetAndMask(Pixel::BGRA5551, byteOffset, bitMask);
145 DALI_TEST_CHECK(byteOffset == 1 && bitMask == 0x1e);
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);
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);
240 int UtcDaliNPatchUtilityParseBorders(void)
242 TestApplication application;
243 tet_infoline("UtcDaliNPatchUtilityParseBorders");
245 /* Stretch region left(2) top(2) right (2) bottom (2)
256 const unsigned int imageHeight = 18;
257 const unsigned int imageWidth = 28;
258 const Vector4 requiredStretchBorder(3, 4, 5, 6);
260 Dali::Devel::PixelBuffer pixelBuffer = CustomizeNPatch(imageHeight, imageWidth, requiredStretchBorder);
261 DALI_TEST_CHECK(pixelBuffer);
265 NPatchUtility::StretchRanges stretchPixelsX;
266 NPatchUtility::StretchRanges stretchPixelsY;
268 NPatchUtility::ParseBorders(pixelBuffer, stretchPixelsX, stretchPixelsY);
270 DALI_TEST_CHECK(stretchPixelsX.Size() == 1);
271 DALI_TEST_CHECK(stretchPixelsY.Size() == 1);
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;
280 DALI_TEST_EQUALS(stretchBorders, requiredStretchBorder, 0.001, TEST_LOCATION);
284 test_return_value = TET_FAIL;
290 int UtcDaliNPatchUtilityIsNinePatchUrl(void)
292 tet_infoline("UtcDaliNPatchUtilityIsNinePatchUrl");
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"));