• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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