1 /*
2 * Copyright (c) 2024 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include "bitmap_test.h"
17
18 #include <cstdint>
19 #include <native_drawing/drawing_brush.h>
20 #include <native_drawing/drawing_color.h>
21 #include <native_drawing/drawing_filter.h>
22 #include <native_drawing/drawing_image.h>
23 #include <native_drawing/drawing_matrix.h>
24 #include <native_drawing/drawing_path.h>
25 #include <native_drawing/drawing_path_effect.h>
26 #include <native_drawing/drawing_pen.h>
27 #include <native_drawing/drawing_point.h>
28 #include <native_drawing/drawing_round_rect.h>
29 #include <native_drawing/drawing_sampling_options.h>
30 #include <native_drawing/drawing_shader_effect.h>
31
32 #include "test_common.h"
33
34 #include "common/log_common.h"
35
36 /*
37 @CaseID:SUB_BASIC_GRAPHICS_SPECIAL_MEMORY_NDK_DRAWING_SURFACE_0100
38 @Description:BitmapCreate-BitmapBuild-相关配置接口全调用-BitmapDestroy循环调用
39 @Step:
40 1、运行脚本,循环执行hidumper命令查询内存
41 2、执行自动化用例:
42 OH_Drawing_BitmapCreate-OH_Drawing_BitmapBuild-OH_Drawing_BitmapDestroy 循环调用1000次
43 3、执行结束后等待3分钟
44 4、结束脚本运行,抓取的内存值转成折线图,观察内存变化
45 @Result:
46 1、程序运行正常,无crash
47 2、内存平稳,没有持续增长,执行后内存回落到执行前;
48 */
OnTestStability(OH_Drawing_Canvas * canvas)49 void StabilityBitmapCreate::OnTestStability(OH_Drawing_Canvas* canvas)
50 {
51 uint32_t width = bitmapWidth_;
52 uint32_t height = bitmapHeight_;
53 void* pixels1 = new uint32_t[width * height];
54 for (int i = 0; i < testCount_; i++) {
55 OH_Drawing_Bitmap* bm = OH_Drawing_BitmapCreate();
56 OH_Drawing_ColorFormat colorFormat = DrawGetEnum(COLOR_FORMAT_ALPHA_8, COLOR_FORMAT_BGRA_8888, i);
57 OH_Drawing_BitmapFormat format = { colorFormat, DrawGetEnum(ALPHA_FORMAT_OPAQUE, ALPHA_FORMAT_UNPREMUL, i) };
58 if (!bm) {
59 continue;
60 }
61 OH_Drawing_BitmapBuild(bm, width, height, &format);
62 OH_Drawing_CanvasDrawBitmap(canvas, bm, 0, 0);
63 OH_Drawing_BitmapDestroy(bm);
64 }
65 delete[] pixels1;
66 }
67
68 /*
69 @CaseID:SUB_BASIC_GRAPHICS_SPECIAL_STABLE_NDK_DRAWING_BITMAP_0200
70 @Description:BitmapCreateFromPixels-相关配置接口全调用-BitmapDestroy循环
71 @Step:
72 1、运行脚本,循环执行hidumper命令查询内存
73 2、执行自动化用例:
74 OH_Drawing_BitmapCreateFromPixels初始化不同参数bitmap-OH_Drawing_BitmapDestroy 循环调用1000次
75 3、执行结束后等待3分钟
76 4、结束脚本运行,抓取的内存值转成折线图,观察内存变化
77 @Result:
78 1、程序运行正常,无crash
79 2、内存平稳,没有持续增长,执行后内存回落到执行前;
80 */
OnTestStability(OH_Drawing_Canvas * canvas)81 void StabilityBitmapCreateFromPixels::OnTestStability(OH_Drawing_Canvas* canvas)
82 {
83 DRAWING_LOGI("StabilityBitmapCreateFromPixels OnTestStability");
84 int32_t width = bitmapWidth_;
85 int32_t height = bitmapHeight_;
86 uint32_t* pixels = new uint32_t[width * height];
87 for (int i = 0; i < width * height; i++) {
88 pixels[i] = 0xFFFF0000;
89 }
90 for (int i = 0; i < testCount_; i++) {
91 OH_Drawing_ColorFormat colorFormat = DrawGetEnum(COLOR_FORMAT_ALPHA_8, COLOR_FORMAT_BGRA_8888, i);
92 OH_Drawing_Image_Info imageInfo { width, height, colorFormat,
93 DrawGetEnum(ALPHA_FORMAT_OPAQUE, ALPHA_FORMAT_UNPREMUL, i) };
94 // 4 rgba
95 OH_Drawing_Bitmap* bm = OH_Drawing_BitmapCreateFromPixels(&imageInfo, pixels, width * 4);
96 if (!bm) {
97 // 会存在报错,format,colorFormat会存在不匹配的情况,正常现象
98 continue;
99 }
100 OH_Drawing_CanvasDrawBitmap(canvas, bm, 0, 0);
101 OH_Drawing_BitmapDestroy(bm);
102 }
103
104 delete[] pixels;
105 }
106
107 /*
108 @CaseID:SUB_BASIC_GRAPHICS_SPECIAL_STABLE_NDK_DRAWING_BITMAP_0300
109 @Description:BitmapBuild多次循环调用
110 @Step:
111 1、运行脚本,循环执行hidumper命令查询内存
112 2、执行自动化用例:
113 OH_Drawing_BitmapCreateFromPixels,OH_Drawing_BitmapBuild循环调用初始化不同bitmap1000次,OH_Drawing_BitmapDestroy
114 3、执行结束后等待3分钟
115 4、结束脚本运行,抓取的内存值转成折线图,观察内存变化
116 @Result:
117 1、程序运行正常,无crash
118 2、内存平稳,没有持续增长,执行后内存回落到执行前;
119 */
OnTestStability(OH_Drawing_Canvas * canvas)120 void StabilityBitmapInit::OnTestStability(OH_Drawing_Canvas* canvas)
121 {
122 DRAWING_LOGI("StabilityBitmapInit OnTestStability");
123 int32_t width = bitmapWidth_;
124 int32_t height = bitmapHeight_;
125 uint32_t* pixels = new uint32_t[width * height];
126 for (int i = 0; i < width * height; i++) {
127 pixels[i] = 0xFFFF0000;
128 }
129 OH_Drawing_Bitmap* bm = nullptr;
130 for (int i = 0; i < testCount_; i++) {
131 OH_Drawing_ColorFormat colorFormat = DrawGetEnum(COLOR_FORMAT_ALPHA_8, COLOR_FORMAT_BGRA_8888, i);
132 OH_Drawing_BitmapFormat format = { colorFormat, DrawGetEnum(ALPHA_FORMAT_OPAQUE, ALPHA_FORMAT_UNPREMUL, i) };
133 OH_Drawing_Image_Info imageInfo { width, height, colorFormat,
134 DrawGetEnum(ALPHA_FORMAT_OPAQUE, ALPHA_FORMAT_UNPREMUL, i) };
135 // 2 for test,rand true or false
136 if (i % 2 == 0) {
137 bm = OH_Drawing_BitmapCreate();
138 OH_Drawing_BitmapBuild(bm, width, height, &format);
139 } else {
140 ////4 rgba, 会存在报错,format,colorFormat会存在不匹配的情况,正常现象
141 bm = OH_Drawing_BitmapCreateFromPixels(&imageInfo, pixels, width * 4);
142 }
143 if (!bm) {
144 // 会存在报错,format,colorFormat会存在不匹配的情况,正常现象
145 continue;
146 }
147 OH_Drawing_CanvasDrawBitmap(canvas, bm, 0, 0);
148 OH_Drawing_BitmapDestroy(bm);
149 bm = nullptr;
150 }
151 delete[] pixels;
152 }
153
BitmapGetWidthTest(OH_Drawing_Bitmap * bitmap)154 void StabilityBitmapRandInvoke::BitmapGetWidthTest(OH_Drawing_Bitmap* bitmap)
155 {
156 OH_Drawing_BitmapGetWidth(bitmap);
157 }
158
BitmapGetHeightTest(OH_Drawing_Bitmap * bitmap)159 void StabilityBitmapRandInvoke::BitmapGetHeightTest(OH_Drawing_Bitmap* bitmap)
160 {
161 OH_Drawing_BitmapGetHeight(bitmap);
162 }
163
BitmapGetColorFormatTest(OH_Drawing_Bitmap * bitmap)164 void StabilityBitmapRandInvoke::BitmapGetColorFormatTest(OH_Drawing_Bitmap* bitmap)
165 {
166 OH_Drawing_BitmapGetColorFormat(bitmap);
167 }
168
BitmapGetAlphaFormatTest(OH_Drawing_Bitmap * bitmap)169 void StabilityBitmapRandInvoke::BitmapGetAlphaFormatTest(OH_Drawing_Bitmap* bitmap)
170 {
171 OH_Drawing_BitmapGetAlphaFormat(bitmap);
172 }
173
BitmapGetPixelsTest(OH_Drawing_Bitmap * bitmap)174 void StabilityBitmapRandInvoke::BitmapGetPixelsTest(OH_Drawing_Bitmap* bitmap)
175 {
176 OH_Drawing_BitmapGetPixels(bitmap);
177 }
178
BitmapGetImageInfoTest(OH_Drawing_Bitmap * bitmap)179 void StabilityBitmapRandInvoke::BitmapGetImageInfoTest(OH_Drawing_Bitmap* bitmap)
180 {
181 OH_Drawing_Image_Info info;
182 OH_Drawing_BitmapGetImageInfo(bitmap, &info);
183 }
184
BitmapReadPixelsTest(OH_Drawing_Bitmap * bitmap)185 void StabilityBitmapRandInvoke::BitmapReadPixelsTest(OH_Drawing_Bitmap* bitmap)
186 {
187 uint32_t* pixels1 = new uint32_t[bitmapWidth_ * bitmapHeight_];
188 OH_Drawing_Image_Info info;
189 OH_Drawing_BitmapGetImageInfo(bitmap, &info);
190 OH_Drawing_BitmapReadPixels(bitmap, &info, pixels1, bitmapWidth_ * 4, 0, 0); //4 rgba
191 delete[] pixels1;
192 }
193
194 /*
195 @CaseID:SUB_BASIC_GRAPHICS_SPECIAL_STABLE_NDK_DRAWING_BITMAP_0400
196 @Description:Bitmap相关操作随机循环调用
197 @Step:
198 1、运行脚本,循环执行hidumper命令查询内存
199 2、执行自动化用例:
200 OH_Drawing_BitmapCreate,OH_Drawing_BitmapBuild
201 bitmap相关设置获取接口调用,循环调用1000次
202 OH_Drawing_BitmapDestroy
203 3、执行结束后等待3分钟
204 4、结束脚本运行,抓取的内存值转成折线图,观察内存变化
205 @Result:
206 1、程序运行正常,无crash
207 2、内存平稳,没有持续增长,执行后内存回落到执行前;
208 */
OnTestStability(OH_Drawing_Canvas * canvas)209 void StabilityBitmapRandInvoke::OnTestStability(OH_Drawing_Canvas* canvas)
210 {
211 DRAWING_LOGE("StabilityBitmapRandInvoke OnTestStability");
212 int32_t width = bitmapWidth_;
213 int32_t height = bitmapHeight_;
214 uint32_t* pixels = new uint32_t[width * height];
215 for (int i = 0; i < width * height; i++) {
216 pixels[i] = 0xFFFF0000;
217 }
218 OH_Drawing_Bitmap* bm = nullptr;
219 TestRend rand;
220 for (int i = 0; i < testCount_; i++) {
221 OH_Drawing_ColorFormat colorFormat = DrawGetEnum(COLOR_FORMAT_ALPHA_8, COLOR_FORMAT_BGRA_8888, i);
222 OH_Drawing_BitmapFormat format = { colorFormat, DrawGetEnum(ALPHA_FORMAT_OPAQUE, ALPHA_FORMAT_UNPREMUL, i) };
223 OH_Drawing_Image_Info imageInfo { width, height, colorFormat,
224 DrawGetEnum(ALPHA_FORMAT_OPAQUE, ALPHA_FORMAT_UNPREMUL, i) };
225 // 2 for test,rand true or false
226 if (i % 2 == 0) {
227 bm = OH_Drawing_BitmapCreate();
228 OH_Drawing_BitmapBuild(bm, width, height, &format);
229 } else {
230 // 4 rgba,会存在报错,format,colorFormat会存在不匹配的情况,正常现象
231 bm = OH_Drawing_BitmapCreateFromPixels(&imageInfo, pixels, width * 4);
232 }
233 uint32_t index = rand.nextRangeU(0, OPERATION_FUNCTION_BITMAP_MAX - 1);
234 handlers_[index](bm);
235 if (!bm) {
236 // 会存在报错,format,colorFormat会存在不匹配的情况,正常现象
237 continue;
238 }
239 OH_Drawing_CanvasDrawBitmap(canvas, bm, 0, 0);
240 OH_Drawing_BitmapDestroy(bm);
241 bm = nullptr;
242 }
243 delete[] pixels;
244 }
245
246 /*
247 @CaseID:SUB_BASIC_GRAPHICS_SPECIAL_MEMORY_NDK_DRAWING_IMAGE_0100
248 @Description:ImageCreate-ImageBuildFromBitmap-ImageDestroy循环
249 @Step:
250 1、运行脚本,循环执行hidumper命令查询内存
251 2、Image和Bitmap相关操作接口循环调用
252 3、执行结束后等待3分钟
253 4、结束脚本运行,抓取的内存值转成折线图,观察内存变化
254 @Result:
255 1、程序运行正常,无crash
256 2、内存平稳,没有持续增长,执行后内存回落到执行前;
257 */
OnTestStability(OH_Drawing_Canvas * canvas)258 void StabilityImageCreate::OnTestStability(OH_Drawing_Canvas* canvas)
259 {
260 uint32_t width = bitmapWidth_;
261 uint32_t height = bitmapHeight_;
262 void* pixels1 = new uint32_t[width * height];
263 for (int i = 0; i < testCount_; i++) {
264 DRAWING_LOGI("StabilityImageCreate %{public}d", i);
265 OH_Drawing_Bitmap* bm = OH_Drawing_BitmapCreate();
266 OH_Drawing_ColorFormat colorFormat = DrawGetEnum(COLOR_FORMAT_ALPHA_8, COLOR_FORMAT_BGRA_8888, i);
267 OH_Drawing_BitmapFormat format = { colorFormat, DrawGetEnum(ALPHA_FORMAT_OPAQUE, ALPHA_FORMAT_UNPREMUL, i) };
268 if (!bm) {
269 DRAWING_LOGE("StabilityImageCreate OnTestStability error, bitmap empty", i);
270 continue;
271 }
272 OH_Drawing_BitmapBuild(bm, width, height, &format);
273 OH_Drawing_Image* image = OH_Drawing_ImageCreate();
274 OH_Drawing_ImageBuildFromBitmap(image, bm);
275 OH_Drawing_ImageDestroy(image);
276 OH_Drawing_BitmapDestroy(bm);
277 }
278 delete[] pixels1;
279 }
280
281 /*
282 @CaseID:SUB_BASIC_GRAPHICS_SPECIAL_MEMORY_NDK_DRAWING_IMAGE_0200
283 @Description:ImageCreate-相关配置接口全调用-ImageDestroy循环
284 @Step:
285 1、运行脚本,循环执行hidumper命令查询内存
286 2、Image和Bitmap相关操作接口循环调用
287 3、执行结束后等待3分钟
288 4、结束脚本运行,抓取的内存值转成折线图,观察内存变化
289 @Result:
290 1、程序运行正常,无crash
291 2、内存平稳,没有持续增长,执行后内存回落到执行前;
292 */
OnTestStability(OH_Drawing_Canvas * canvas)293 void StabilityImageInvoke::OnTestStability(OH_Drawing_Canvas* canvas)
294 {
295 DRAWING_LOGI("StabilityImageInvoke OnTestStability");
296 uint32_t width = bitmapWidth_;
297 uint32_t height = bitmapHeight_;
298 for (int i = 0; i < testCount_; i++) {
299 OH_Drawing_Bitmap* bm = OH_Drawing_BitmapCreate();
300 OH_Drawing_ColorFormat colorFormat = DrawGetEnum(COLOR_FORMAT_ALPHA_8, COLOR_FORMAT_BGRA_8888, i);
301 OH_Drawing_BitmapFormat format = { colorFormat, DrawGetEnum(ALPHA_FORMAT_OPAQUE, ALPHA_FORMAT_UNPREMUL, i) };
302 if (!bm) {
303 DRAWING_LOGE("StabilityImageInvoke OnTestStability error, bitmap empty", i);
304 continue;
305 }
306 OH_Drawing_BitmapBuild(bm, width, height, &format);
307 OH_Drawing_Image* image = OH_Drawing_ImageCreate();
308 OH_Drawing_ImageBuildFromBitmap(image, bm);
309 OH_Drawing_ImageDestroy(image);
310 OH_Drawing_BitmapDestroy(bm);
311 }
312 }
313
ImageGetWidthTest(OH_Drawing_Image * image)314 void StabilityImageRandInvoke::ImageGetWidthTest(OH_Drawing_Image* image)
315 {
316 OH_Drawing_ImageGetWidth(image);
317 }
318
ImageGetHeightTest(OH_Drawing_Image * image)319 void StabilityImageRandInvoke::ImageGetHeightTest(OH_Drawing_Image* image)
320 {
321 OH_Drawing_ImageGetHeight(image);
322 }
323
ImageGetImageInfoTest(OH_Drawing_Image * image)324 void StabilityImageRandInvoke::ImageGetImageInfoTest(OH_Drawing_Image* image)
325 {
326 OH_Drawing_Image_Info info;
327 OH_Drawing_ImageGetImageInfo(image, &info);
328 }
329
330 /*
331 @CaseID:SUB_BASIC_GRAPHICS_SPECIAL_MEMORY_NDK_DRAWING_IMAGE_0300
332 @Description:Image相关操作接口随机循环调用
333 @Step:
334 1、运行脚本,循环执行hidumper命令查询内存
335 2、Image和Bitmap相关操作接口循环调用
336 3、执行结束后等待3分钟
337 4、结束脚本运行,抓取的内存值转成折线图,观察内存变化
338 @Result:
339 1、程序运行正常,无crash
340 2、内存平稳,没有持续增长,执行后内存回落到执行前;
341 */
OnTestStability(OH_Drawing_Canvas * canvas)342 void StabilityImageRandInvoke::OnTestStability(OH_Drawing_Canvas* canvas)
343 {
344 DRAWING_LOGI("StabilityBitmapRandInvoke OnTestStability");
345 int32_t width = bitmapWidth_;
346 int32_t height = bitmapHeight_;
347 uint32_t* pixels = new uint32_t[width * height];
348 for (int i = 0; i < width * height; i++) {
349 pixels[i] = 0xFFFF0000;
350 }
351 OH_Drawing_Bitmap* bm = nullptr;
352 TestRend rand;
353 for (int i = 0; i < testCount_; i++) {
354 OH_Drawing_ColorFormat colorFormat = DrawGetEnum(COLOR_FORMAT_ALPHA_8, COLOR_FORMAT_BGRA_8888, i);
355 OH_Drawing_BitmapFormat format = { colorFormat, DrawGetEnum(ALPHA_FORMAT_OPAQUE, ALPHA_FORMAT_UNPREMUL, i) };
356 OH_Drawing_Image_Info imageInfo { width, height, colorFormat,
357 DrawGetEnum(ALPHA_FORMAT_OPAQUE, ALPHA_FORMAT_UNPREMUL, i) };
358 // 2 for test,rand true or false
359 if (i % 2 == 0) {
360 bm = OH_Drawing_BitmapCreate();
361 OH_Drawing_BitmapBuild(bm, width, height, &format);
362 } else {
363 // 4 rgba,会存在报错,format,colorFormat会存在不匹配的情况,正常现象
364 bm = OH_Drawing_BitmapCreateFromPixels(&imageInfo, pixels, width * 4);
365 }
366 if (!bm) {
367 // 会存在报错,format,colorFormat会存在不匹配的情况,正常现象
368 continue;
369 }
370 OH_Drawing_Image* image = OH_Drawing_ImageCreate();
371 OH_Drawing_ImageBuildFromBitmap(image, bm);
372 uint32_t index = rand.nextRangeU(0, OPERATION_FUNCTION_IMAGE_MAX - 1);
373 handlers_[index](image);
374 OH_Drawing_ImageDestroy(image);
375 OH_Drawing_BitmapDestroy(bm);
376 bm = nullptr;
377 }
378 delete[] pixels;
379 }
380