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 "canvas_test.h"
17
18 #include <cstdio>
19 #include <cstdlib>
20 #include <ctime>
21 #include <multimedia/image_framework/image_pixel_map_mdk.h>
22 #include <native_drawing/drawing_brush.h>
23 #include <native_drawing/drawing_color.h>
24 #include <native_drawing/drawing_filter.h>
25 #include <native_drawing/drawing_font.h>
26 #include <native_drawing/drawing_image.h>
27 #include <native_drawing/drawing_matrix.h>
28 #include <native_drawing/drawing_path.h>
29 #include <native_drawing/drawing_path_effect.h>
30 #include <native_drawing/drawing_pen.h>
31 #include <native_drawing/drawing_point.h>
32 #include <native_drawing/drawing_rect.h>
33 #include <native_drawing/drawing_region.h>
34 #include <native_drawing/drawing_round_rect.h>
35 #include <native_drawing/drawing_sampling_options.h>
36 #include <native_drawing/drawing_shader_effect.h>
37 #include <native_drawing/drawing_text_blob.h>
38
39 #include "test_common.h"
40
41 #include "common/log_common.h"
42
OnTestPerformance(OH_Drawing_Canvas * canvas)43 void CanvasDrawRect::OnTestPerformance(OH_Drawing_Canvas* canvas)
44 {
45 // 保证性能测试稳定性: 绘制100,100的矩形
46 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 100, 100); // 0, 0, 100, 100 创建矩形
47 for (int i = 0; i < testCount_; i++) {
48 OH_Drawing_CanvasDrawRect(canvas, rect);
49 }
50 OH_Drawing_RectDestroy(rect);
51 }
52
OnTestPerformance(OH_Drawing_Canvas * canvas)53 void CanvasDrawBitmapRect::OnTestPerformance(OH_Drawing_Canvas* canvas)
54 {
55 OH_Drawing_Bitmap* bm = OH_Drawing_BitmapCreate();
56 OH_Drawing_BitmapFormat cFormat { COLOR_FORMAT_BGRA_8888, ALPHA_FORMAT_OPAQUE };
57 OH_Drawing_BitmapBuild(bm, 256, 256, &cFormat); // 256, 256 宽高
58 OH_Drawing_Canvas* bitmapCanvas = OH_Drawing_CanvasCreate();
59 OH_Drawing_CanvasBind(bitmapCanvas, bm);
60 OH_Drawing_CanvasClear(bitmapCanvas, OH_Drawing_ColorSetArgb(0xff, 0x00, 0xff, 0x00));
61
62 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 256, 256); // 0, 0, 256, 256 创建矩形
63 OH_Drawing_Rect* dst = OH_Drawing_RectCreate(100, 100, 256, 256); // 指定区域
64 OH_Drawing_SamplingOptions* sampling = OH_Drawing_SamplingOptionsCreate(
65 OH_Drawing_FilterMode::FILTER_MODE_LINEAR, OH_Drawing_MipmapMode::MIPMAP_MODE_NEAREST);
66 for (int i = 0; i < testCount_; i++) {
67 // 绘制指定区域的纯色bitmap
68 OH_Drawing_CanvasDrawBitmapRect(canvas, bm, rect, dst, sampling);
69 }
70 OH_Drawing_SamplingOptionsDestroy(sampling);
71 OH_Drawing_BitmapDestroy(bm);
72 OH_Drawing_RectDestroy(dst);
73 OH_Drawing_RectDestroy(rect);
74 OH_Drawing_CanvasDestroy(bitmapCanvas);
75 }
76
OnTestPerformance(OH_Drawing_Canvas * canvas)77 void CanvasDrawCircle::OnTestPerformance(OH_Drawing_Canvas* canvas)
78 {
79 OH_Drawing_Point* point = OH_Drawing_PointCreate(200, 200);
80 for (int i = 0; i < testCount_; i++) {
81 // 保证性能测试稳定性: 绘制圆心(200, 200)半径100的圆
82 OH_Drawing_CanvasDrawCircle(canvas, point, 100);
83 }
84 OH_Drawing_PointDestroy(point);
85 }
86
OnTestPerformance(OH_Drawing_Canvas * canvas)87 void CanvasDrawOval::OnTestPerformance(OH_Drawing_Canvas* canvas)
88 {
89 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 100, 100); // 0, 0, 100, 100 创建矩形
90 for (int i = 0; i < testCount_; i++) {
91 OH_Drawing_CanvasDrawOval(canvas, rect);
92 }
93 OH_Drawing_RectDestroy(rect);
94 }
95
OnTestPerformance(OH_Drawing_Canvas * canvas)96 void CanvasDrawArc::OnTestPerformance(OH_Drawing_Canvas* canvas)
97 {
98 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 100, 100); // 0, 0, 100, 100 创建矩形
99 for (int i = 0; i < testCount_; i++) {
100 OH_Drawing_CanvasDrawArc(canvas, rect, 0.f, 180.f);
101 }
102 OH_Drawing_RectDestroy(rect);
103 }
104
OnTestPerformance(OH_Drawing_Canvas * canvas)105 void CanvasDrawRoundRect::OnTestPerformance(OH_Drawing_Canvas* canvas)
106 {
107 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 100, 100); // 0, 0, 100, 100 创建矩形
108 OH_Drawing_RoundRect* roundRect = OH_Drawing_RoundRectCreate(rect, 20, 20);
109 for (int i = 0; i < testCount_; i++) {
110 OH_Drawing_CanvasDrawRoundRect(canvas, roundRect);
111 }
112 OH_Drawing_RectDestroy(rect);
113 }
114
OnTestPerformance(OH_Drawing_Canvas * canvas)115 void CanvasDrawTextBlob::OnTestPerformance(OH_Drawing_Canvas* canvas)
116 {
117 std::string text = "textblob";
118 int len = text.length();
119 OH_Drawing_Font* font = OH_Drawing_FontCreate();
120 OH_Drawing_TextBlob* blob = OH_Drawing_TextBlobCreateFromText(text.c_str(), len, font, TEXT_ENCODING_UTF8);
121 for (int i = 0; i < testCount_; i++) {
122 OH_Drawing_CanvasDrawTextBlob(canvas, blob, 0, 0);
123 }
124 OH_Drawing_TextBlobDestroy(blob);
125 }
126
OnTestPerformance(OH_Drawing_Canvas * canvas)127 void CanvasClipRect::OnTestPerformance(OH_Drawing_Canvas* canvas)
128 {
129 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 100, 100); // 0, 0, 100, 100 创建矩形
130 OH_Drawing_CanvasDrawRect(canvas, rect);
131 for (int i = 0; i < testCount_; i++) {
132 OH_Drawing_CanvasClipRect(canvas, rect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
133 }
134 OH_Drawing_RectDestroy(rect);
135 }
136
OnTestPerformance(OH_Drawing_Canvas * canvas)137 void CanvasClipRoundRect::OnTestPerformance(OH_Drawing_Canvas* canvas)
138 {
139 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 100, 100); // 0, 0, 100, 100 创建矩形
140 OH_Drawing_RoundRect* roundRect = OH_Drawing_RoundRectCreate(rect, 20, 20);
141 OH_Drawing_CanvasDrawRoundRect(canvas, roundRect);
142 for (int i = 0; i < testCount_; i++) {
143 OH_Drawing_CanvasClipRoundRect(canvas, roundRect, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
144 }
145 OH_Drawing_RectDestroy(rect);
146 }
147
OnTestPerformance(OH_Drawing_Canvas * canvas)148 void CanvasRotate::OnTestPerformance(OH_Drawing_Canvas* canvas)
149 {
150 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 100, 100); // 0, 0, 100, 100 创建矩形
151 for (int i = 0; i < testCount_; i++) {
152 OH_Drawing_CanvasRotate(canvas, 120, 50, 50); // 120, 50, 50 旋转平移角度
153 }
154 OH_Drawing_CanvasDrawRect(canvas, rect);
155 OH_Drawing_RectDestroy(rect);
156 }
157
OnTestPerformance(OH_Drawing_Canvas * canvas)158 void CanvasTranslate::OnTestPerformance(OH_Drawing_Canvas* canvas)
159 {
160 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 100, 100); // 0, 0, 100, 100 创建矩形
161 for (int i = 0; i < testCount_; i++) {
162 OH_Drawing_CanvasTranslate(canvas, 100, 100); // 100, 100 平移
163 }
164 OH_Drawing_CanvasDrawRect(canvas, rect);
165 OH_Drawing_RectDestroy(rect);
166 }
167
OnTestPerformance(OH_Drawing_Canvas * canvas)168 void CanvasScale::OnTestPerformance(OH_Drawing_Canvas* canvas)
169 {
170 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 100, 100); // 0, 0, 100, 100 创建矩形
171 for (int i = 0; i < testCount_; i++) {
172 OH_Drawing_CanvasScale(canvas, 2, 2); // 2, 2 缩放比例
173 }
174 OH_Drawing_CanvasDrawRect(canvas, rect);
175 OH_Drawing_RectDestroy(rect);
176 }
177
OnTestPerformance(OH_Drawing_Canvas * canvas)178 void CanvasConcatMatrix::OnTestPerformance(OH_Drawing_Canvas* canvas)
179 {
180 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 100, 100); // 0, 0, 100, 100 创建矩形
181 OH_Drawing_Matrix* matrix = OH_Drawing_MatrixCreateTranslation(100, 100); // 100, 100 平移
182 for (int i = 0; i < testCount_; i++) {
183 OH_Drawing_CanvasConcatMatrix(canvas, matrix);
184 }
185 OH_Drawing_CanvasDrawRect(canvas, rect);
186 OH_Drawing_MatrixDestroy(matrix);
187 OH_Drawing_RectDestroy(rect);
188 }
189
OnTestPerformance(OH_Drawing_Canvas * canvas)190 void CanvasClear::OnTestPerformance(OH_Drawing_Canvas* canvas)
191 {
192 uint32_t color = 0xFF0000FF;
193 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 100, 100); // 0, 0, 100, 100 创建矩形
194 for (int i = 0; i < testCount_; i++) {
195 OH_Drawing_CanvasClear(canvas, color);
196 }
197 OH_Drawing_CanvasDrawRect(canvas, rect);
198 OH_Drawing_RectDestroy(rect);
199 }
200
OnTestPerformance(OH_Drawing_Canvas * canvas)201 void CanvasSetMatrix::OnTestPerformance(OH_Drawing_Canvas* canvas)
202 {
203 OH_Drawing_Matrix* matRix = OH_Drawing_MatrixCreateRotation(45, 100, 100); // 45 矩阵旋转角度,100,100 矩阵偏移量
204 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 100, 100); // 0, 0, 100, 100 创建矩形
205 for (int i = 0; i < testCount_; i++) {
206 OH_Drawing_CanvasSetMatrix(canvas, matRix);
207 }
208 OH_Drawing_CanvasDrawRect(canvas, rect);
209 OH_Drawing_RectDestroy(rect);
210 }
211
OnTestPerformance(OH_Drawing_Canvas * canvas)212 void CanvasResetMatrix::OnTestPerformance(OH_Drawing_Canvas* canvas)
213 {
214 OH_Drawing_Matrix* matRix = OH_Drawing_MatrixCreate();
215 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 100, 100); // 0, 0, 100, 100 创建矩形
216 OH_Drawing_CanvasSetMatrix(canvas, matRix);
217 OH_Drawing_CanvasDrawRect(canvas, rect);
218 for (int i = 0; i < testCount_; i++) {
219 OH_Drawing_CanvasResetMatrix(canvas);
220 }
221 OH_Drawing_RectDestroy(rect);
222 }
223
OnTestPerformance(OH_Drawing_Canvas * canvas)224 void CanvasDrawImageRectWithSrc::OnTestPerformance(OH_Drawing_Canvas* canvas)
225 {
226 OH_Drawing_Image* Image = OH_Drawing_ImageCreate();
227 OH_Drawing_Bitmap* bm = OH_Drawing_BitmapCreate();
228 OH_Drawing_BitmapFormat format = { COLOR_FORMAT_BGRA_8888, ALPHA_FORMAT_OPAQUE };
229 OH_Drawing_BitmapBuild(bm, 256, 256, &format); // 256, 256 宽高
230 OH_Drawing_ImageBuildFromBitmap(Image, bm);
231
232 // 创建采样选项对象
233 OH_Drawing_FilterMode filterMode = FILTER_MODE_LINEAR;
234 OH_Drawing_MipmapMode mipmapMode = MIPMAP_MODE_NEAREST;
235 OH_Drawing_SamplingOptions* samplingOptions = OH_Drawing_SamplingOptionsCreate(filterMode, mipmapMode);
236 OH_Drawing_Rect* recty = OH_Drawing_RectCreate(0, 0, 256, 256); // 0, 0, 256, 256 创建矩形
237 OH_Drawing_Rect* rectm = OH_Drawing_RectCreate(100, 100, 256, 256); // 100, 100, 256, 256 创建矩形
238 for (int i = 0; i < testCount_; i++) {
239 OH_Drawing_CanvasDrawImageRectWithSrc(canvas, Image, recty, rectm, samplingOptions, FAST_SRC_RECT_CONSTRAINT);
240 }
241 OH_Drawing_CanvasDrawRect(canvas, recty);
242 OH_Drawing_CanvasDrawRect(canvas, rectm);
243 OH_Drawing_RectDestroy(recty);
244 OH_Drawing_RectDestroy(rectm);
245 OH_Drawing_ImageDestroy(Image);
246 OH_Drawing_BitmapDestroy(bm);
247 }
248
OnTestPerformance(OH_Drawing_Canvas * canvas)249 void CanvasDrawShadow::OnTestPerformance(OH_Drawing_Canvas* canvas)
250 {
251 OH_Drawing_Path* pathCreate = OH_Drawing_PathCreate(); // 用于创建一个路径对象。
252 OH_Drawing_Point3D planeParams;
253 OH_Drawing_Point3D devLightPos;
254 planeParams.x = 0; // 0 用于坐标计算
255 planeParams.y = 0; // 0 用于坐标计算
256 planeParams.z = 50.f; // 50.f 用于坐标计算
257 devLightPos.x = 100.f; // 100.f 用于坐标计算
258 devLightPos.y = 100.f; // 100.f 用于坐标计算
259 devLightPos.z = 100.f; // 100.f 用于坐标计算
260 float lightRadius = 50.f; // 50.f 用于坐标计算
261 uint32_t ambientColor = 0x19000000;
262 uint32_t spotColor = 0x40000000;
263 OH_Drawing_CanvasShadowFlags flag = SHADOW_FLAGS_TRANSPARENT_OCCLUDER;
264 OH_Drawing_PathAddRect(pathCreate, 0, 0, 100, 100, OH_Drawing_PathDirection::PATH_DIRECTION_CW); // 100 宽高
265 for (int i = 0; i < testCount_; i++) {
266 OH_Drawing_CanvasDrawShadow(
267 canvas, pathCreate, planeParams, devLightPos, lightRadius, ambientColor, spotColor, flag);
268 }
269 // 在使用完路径后销毁它
270 OH_Drawing_PathDestroy(pathCreate);
271 }
272
OnTestPerformance(OH_Drawing_Canvas * canvas)273 void CanvasSkew::OnTestPerformance(OH_Drawing_Canvas* canvas)
274 {
275 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 100, 100); // 0, 0, 100, 100 创建矩形
276 OH_Drawing_CanvasDrawRect(canvas, rect);
277 for (int i = 0; i < testCount_; i++) {
278 OH_Drawing_CanvasSkew(canvas, 50, 50); // 50, 50 斜切值
279 }
280 OH_Drawing_RectDestroy(rect);
281 }
282
OnTestPerformance(OH_Drawing_Canvas * canvas)283 void CanvasDrawImageRect::OnTestPerformance(OH_Drawing_Canvas* canvas)
284 {
285 OH_Drawing_Bitmap* bm = OH_Drawing_BitmapCreate();
286 OH_Drawing_BitmapFormat format = { COLOR_FORMAT_BGRA_8888, ALPHA_FORMAT_OPAQUE };
287 OH_Drawing_BitmapBuild(bm, 256, 256, &format); // 256, 256 宽高
288 OH_Drawing_Image* image = OH_Drawing_ImageCreate();
289 OH_Drawing_ImageBuildFromBitmap(image, bm);
290 OH_Drawing_SamplingOptions* samplingOptions =
291 OH_Drawing_SamplingOptionsCreate(FILTER_MODE_LINEAR, MIPMAP_MODE_NEAREST);
292 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 256, 256); // 0, 0, 256, 256 创建矩形
293 for (int i = 0; i < testCount_; i++) {
294 OH_Drawing_CanvasDrawImageRect(canvas, image, rect, samplingOptions);
295 }
296 OH_Drawing_RectDestroy(rect);
297 OH_Drawing_ImageDestroy(image);
298 OH_Drawing_SamplingOptionsDestroy(samplingOptions);
299 OH_Drawing_BitmapDestroy(bm);
300 }
301
OnTestPerformance(OH_Drawing_Canvas * canvas)302 void CanvasDrawVertices::OnTestPerformance(OH_Drawing_Canvas* canvas)
303 {
304 OH_Drawing_Point2D positions[] = { { 100, 100 }, { 200, 100 },
305 { 150, 200 } }; // 100, 200, 150, 200 这些数字用于指定要在画布上绘制的三角形的顶点位置
306 OH_Drawing_Point2D texs[] = { { 0.0f, 0.0f }, { 1.0f, 0.0f },
307 { 0.5f, 1.0f } }; // 0.0f, 1.0f, 0.5f, 1.0f 这些浮点数值定义了texs数组中三个纹理坐标
308 const uint16_t indices[] = { 0, 1, 2 }; // 0, 1, 2 这些整数定义了indices数组中的索引值
309 uint32_t colors[] = { 0xFFFF0000, 0xFF00FF00, 0xFF0000FF };
310 int32_t indexCount = sizeof(indices) / sizeof(indices[0]);
311 int32_t vertexCount = sizeof(positions) / sizeof(positions[0]);
312 for (int i = 0; i < testCount_; i++) {
313 OH_Drawing_CanvasDrawVertices(canvas, OH_Drawing_VertexMode::VERTEX_MODE_TRIANGLES, vertexCount, positions,
314 texs, colors, indexCount, indices, OH_Drawing_BlendMode::BLEND_MODE_SRC);
315 }
316 }
317
OnTestPerformance(OH_Drawing_Canvas * canvas)318 void CanvasReadPixels::OnTestPerformance(OH_Drawing_Canvas* canvas)
319 {
320 bool res;
321 OH_Drawing_Image_Info imageInfo { 100, 100, COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE }; // 100 用于宽高
322 char* dstPixels = static_cast<char*>(malloc(100 * 100 * 4)); // 100 4 用于像素计算
323 if (dstPixels == nullptr)
324 return;
325 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 100, 100); // 0, 0, 100, 100 创建矩形
326 for (int i = 0; i < testCount_; i++) {
327 // 从画布中拷贝像素数据到指定地址,去掉readPixels接口就只有drawRect接口画的一个矩形,用日志看读数据的结果
328 res = OH_Drawing_CanvasReadPixels(canvas, &imageInfo, dstPixels, 100 * 4, 0, 0); // 100, 4 用于像素计算
329 }
330 free(dstPixels);
331 DRAWING_LOGI("CanvasReadPixels::OnTestPerformance readPixels success=%{public}s", res ? "true" : "false");
332 OH_Drawing_CanvasDrawRect(canvas, rect);
333 OH_Drawing_RectDestroy(rect);
334 }
335
OnTestPerformance(OH_Drawing_Canvas * canvas)336 void CanvasReadPixelsToBitmap::OnTestPerformance(OH_Drawing_Canvas* canvas)
337 {
338 bool res;
339 OH_Drawing_Bitmap* bm = OH_Drawing_BitmapCreate();
340 OH_Drawing_BitmapFormat cFormat { OH_Drawing_ColorFormat::COLOR_FORMAT_RGBA_8888,
341 OH_Drawing_AlphaFormat::ALPHA_FORMAT_OPAQUE };
342 OH_Drawing_BitmapBuild(bm, 100, 100, &cFormat); // 100, 100 矩形宽高
343 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 100, 100); // 0, 0, 100, 100 创建矩形
344 OH_Drawing_CanvasDrawRect(canvas, rect);
345 for (int i = 0; i < testCount_; i++) {
346 // 从画布拷贝像素数据到位图中,去掉readPixels接口就只有drawRect接口画的一个矩形,用日志看读数据的结果
347 res = OH_Drawing_CanvasReadPixelsToBitmap(canvas, bm, 0, 0); // 0, 0 位置
348 }
349 DRAWING_LOGI("CanvasReadPixelsToBitmap::OnTestPerformance readPixels success=%{public}s", res ? "true" : "false");
350 OH_Drawing_RectDestroy(rect);
351 OH_Drawing_BitmapDestroy(bm);
352 }
353
OnTestPerformance(OH_Drawing_Canvas * canvas)354 void CanvasDrawPath::OnTestPerformance(OH_Drawing_Canvas* canvas)
355 {
356 OH_Drawing_Path* path = OH_Drawing_PathCreate();
357 OH_Drawing_PathArcTo(path, 0, 0, 100, 100, 0, 180); // 0, 0, 100, 100, 0, 180 创建Arc
358 OH_Drawing_PathClose(path);
359 for (int i = 0; i < testCount_; i++) {
360 OH_Drawing_CanvasDrawPath(canvas, path);
361 }
362 OH_Drawing_PathDestroy(path);
363 }
364
OnTestPerformance(OH_Drawing_Canvas * canvas)365 void CanvasRestoreToCount::OnTestPerformance(OH_Drawing_Canvas* canvas)
366 {
367 fSave_Count = OH_Drawing_CanvasGetSaveCount(canvas);
368 OH_Drawing_CanvasSave(canvas);
369 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 100, 100); // 0, 0, 100, 100 创建矩形
370 OH_Drawing_CanvasTranslate(canvas, 100, 100); // 100, 100 平移
371 for (int i = 0; i < testCount_; i++) {
372 OH_Drawing_CanvasRestoreToCount(canvas, fSave_Count);
373 }
374 OH_Drawing_CanvasDrawRect(canvas, rect);
375 OH_Drawing_RectDestroy(rect);
376 }
377
OnTestPerformance(OH_Drawing_Canvas * canvas)378 void CanvasDrawPoints::OnTestPerformance(OH_Drawing_Canvas* canvas)
379 {
380 OH_Drawing_Point2D pts[2]; // 2 点个数
381 pts[0].x = 50; // 50 点位置
382 pts[0].y = 50; // 50 点位置
383 pts[1].x = 100; // 100 点位置
384 pts[1].y = 100; // 100 点位置
385 for (int i = 0; i < testCount_; i++) {
386 OH_Drawing_CanvasDrawPoints(canvas, OH_Drawing_PointMode::POINT_MODE_POINTS, 2, pts); // 2 点个数
387 }
388 }
389
OnTestPerformance(OH_Drawing_Canvas * canvas)390 void CanvasDrawLine::OnTestPerformance(OH_Drawing_Canvas* canvas)
391 {
392 for (int i = 0; i < testCount_; i++) {
393 OH_Drawing_CanvasDrawLine(canvas, 0, 0, 100, 100); // 0, 0, 100, 100 创建直线
394 }
395 }
396
OnTestPerformance(OH_Drawing_Canvas * canvas)397 void CanvasDrawLayer::OnTestPerformance(OH_Drawing_Canvas* canvas)
398 {
399 uint32_t color = 0xFF0000FF;
400 OH_Drawing_Rect* bounds = OH_Drawing_RectCreate(0, 0, 100, 100); // 0, 0, 100, 100 创建矩形
401 OH_Drawing_CanvasSave(canvas);
402 for (int i = 0; i < testCount_; i++) {
403 OH_Drawing_CanvasSaveLayer(canvas, bounds, styleBrush_);
404 }
405 OH_Drawing_CanvasClear(canvas, color);
406 OH_Drawing_CanvasRestore(canvas);
407 OH_Drawing_RectDestroy(bounds);
408 }
409
OnTestPerformance(OH_Drawing_Canvas * canvas)410 void CanvasDrawBitmap::OnTestPerformance(OH_Drawing_Canvas* canvas)
411 {
412 OH_Drawing_Bitmap* bitmap = OH_Drawing_BitmapCreate();
413 OH_Drawing_BitmapFormat cFormat { COLOR_FORMAT_BGRA_8888, ALPHA_FORMAT_OPAQUE };
414 OH_Drawing_BitmapBuild(bitmap, 256, 256, &cFormat); // 256 指定了位图(bitmap)的宽度和高度
415 OH_Drawing_Canvas* bitmapCanvas = OH_Drawing_CanvasCreate();
416 OH_Drawing_CanvasBind(bitmapCanvas, bitmap);
417 OH_Drawing_CanvasClear(bitmapCanvas, OH_Drawing_ColorSetArgb(0xff, 0x00, 0xff, 0x00));
418 for (int i = 0; i < testCount_; i++) {
419 OH_Drawing_CanvasDrawBitmap(canvas, bitmap, 0, 0); // 0, 0 位置坐标
420 }
421 OH_Drawing_CanvasDestroy(bitmapCanvas);
422 OH_Drawing_BitmapDestroy(bitmap);
423 }
424
OnTestPerformance(OH_Drawing_Canvas * canvas)425 void CanvasDrawBackground::OnTestPerformance(OH_Drawing_Canvas* canvas)
426 {
427 for (int i = 0; i < testCount_; i++) {
428 OH_Drawing_CanvasDrawBackground(canvas, styleBrush_);
429 }
430 }
431
OnTestPerformance(OH_Drawing_Canvas * canvas)432 void CanvasDrawRegion::OnTestPerformance(OH_Drawing_Canvas* canvas)
433 {
434 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 100, 100); // 0, 0, 100, 100 创建矩形
435 OH_Drawing_Region* region = OH_Drawing_RegionCreate();
436 OH_Drawing_RegionSetRect(region, rect);
437 for (int i = 0; i < testCount_; i++) {
438 OH_Drawing_CanvasDrawRegion(canvas, region);
439 }
440 OH_Drawing_RegionDestroy(region);
441 OH_Drawing_RectDestroy(rect);
442 }
443
OnTestPerformance(OH_Drawing_Canvas * canvas)444 void CanvasDrawPixelMapRect::OnTestPerformance(OH_Drawing_Canvas* canvas)
445 {
446 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 640, 640); // 0, 0, 640, 640 这些数字用于用于创建矩形
447 // 无法获得 OH_Drawing_PixelMap
448 // OH_Drawing_CanvasDrawPixelMapRect(OH_Drawing_Canvas *, OH_Drawing_PixelMap *, const OH_Drawing_Rect *src, const
449 // OH_Drawing_Rect *dst, const OH_Drawing_SamplingOptions *)
450 DRAWING_LOGI("CanvasDrawPixelMapRect cant get OH_Drawing_PixelMap");
451 OH_Drawing_RectDestroy(rect);
452 }
453
OnTestPerformance(OH_Drawing_Canvas * canvas)454 void CanvasSave::OnTestPerformance(OH_Drawing_Canvas* canvas)
455 {
456 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 100, 100); // 0, 0, 100, 100 创建矩形
457 OH_Drawing_CanvasDrawRect(canvas, rect);
458 for (int i = 0; i < testCount_; i++) {
459 OH_Drawing_CanvasSave(canvas);
460 OH_Drawing_CanvasRestore(canvas);
461 }
462 OH_Drawing_Rect* rect1 = OH_Drawing_RectCreate(100, 100, 200, 200); // 100, 100, 200, 200 创建矩形
463 OH_Drawing_CanvasDrawRect(canvas, rect1);
464 OH_Drawing_RectDestroy(rect);
465 OH_Drawing_RectDestroy(rect1);
466 }
467
OnTestPerformance(OH_Drawing_Canvas * canvas)468 void CanvasClipPath::OnTestPerformance(OH_Drawing_Canvas* canvas)
469 {
470 OH_Drawing_Path* path = OH_Drawing_PathCreate();
471 OH_Drawing_PathArcTo(path, 0, 0, 100, 100, 0, 180); // 0, 0, 100, 100, 0, 180 创建Arc
472 OH_Drawing_PathClose(path);
473 OH_Drawing_CanvasDrawPath(canvas, path);
474 for (int i = 0; i < testCount_; i++) {
475 OH_Drawing_CanvasClipPath(canvas, path, OH_Drawing_CanvasClipOp::INTERSECT, true);
476 }
477 OH_Drawing_PathDestroy(path);
478 }
479
OnTestPerformance(OH_Drawing_Canvas * canvas)480 void CanvasGetTotalMatrix::OnTestPerformance(OH_Drawing_Canvas* canvas)
481 {
482 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 100, 100); // 0, 0, 100, 100 创建矩形
483 OH_Drawing_CanvasDrawRect(canvas, rect);
484 OH_Drawing_Matrix* matrix_a = OH_Drawing_MatrixCreateRotation(45, 0, 0); // 45为顺时针旋转角度
485 OH_Drawing_Matrix* matrix_b = OH_Drawing_MatrixCreateTranslation(-10, -10); // -10为水平方向平移距离
486 OH_Drawing_Matrix* total = OH_Drawing_MatrixCreate();
487 OH_Drawing_CanvasSetMatrix(canvas, matrix_a);
488 OH_Drawing_CanvasConcatMatrix(canvas, matrix_b);
489 for (int i = 0; i < testCount_; i++) {
490 OH_Drawing_CanvasGetTotalMatrix(canvas, total);
491 }
492 OH_Drawing_CanvasDrawRect(canvas, rect);
493 OH_Drawing_RectDestroy(rect);
494 OH_Drawing_MatrixDestroy(matrix_a);
495 OH_Drawing_MatrixDestroy(matrix_b);
496 OH_Drawing_MatrixDestroy(total);
497 }
498
OnTestPerformance(OH_Drawing_Canvas * canvas)499 void CanvasRestore::OnTestPerformance(OH_Drawing_Canvas* canvas)
500 {
501 OH_Drawing_CanvasScale(canvas, 2, 2); // 2, 2 缩放比例
502 for (int i = 0; i < testCount_; i++) {
503 OH_Drawing_CanvasSave(canvas);
504 OH_Drawing_CanvasRestore(canvas);
505 }
506 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 100, 100); // 0, 0, 100, 100 创建矩形 // 100, 100 创建矩形
507 OH_Drawing_CanvasDrawRect(canvas, rect);
508 OH_Drawing_RectDestroy(rect);
509 }
510
OnTestPerformance(OH_Drawing_Canvas * canvas)511 void CanvasGetLocalClipBounds::OnTestPerformance(OH_Drawing_Canvas* canvas)
512 {
513 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 400, 400); // 0, 0, 400, 400 创建矩形
514 OH_Drawing_Rect* rect1 = OH_Drawing_RectCreate(100, 100, 200, 200); // 100, 100, 200, 200 剪切矩形
515 OH_Drawing_Rect* rect2 = OH_Drawing_RectCreate(300, 300, 400, 400); // 300, 300, 400, 400 剪切矩形
516 OH_Drawing_CanvasClipRect(canvas, rect1, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
517 OH_Drawing_CanvasDrawRect(canvas, rect);
518 for (int i = 0; i < testCount_; i++) {
519 OH_Drawing_CanvasGetLocalClipBounds(canvas, rect);
520 }
521 OH_Drawing_CanvasClipRect(canvas, rect2, OH_Drawing_CanvasClipOp::DIFFERENCE, true);
522 OH_Drawing_RectDestroy(rect1);
523 OH_Drawing_RectDestroy(rect);
524 OH_Drawing_RectDestroy(rect2);
525 }
526
OnTestPerformance(OH_Drawing_Canvas * canvas)527 void CanvasGetSaveCount::OnTestPerformance(OH_Drawing_Canvas* canvas)
528 {
529 OH_Drawing_CanvasSave(canvas);
530 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 100, 100); // 0, 0, 100, 100 创建矩形 // 0, 0, 100, 100 创建矩形
531 OH_Drawing_CanvasScale(canvas, 2, 2); // 2, 2 缩放因子
532 OH_Drawing_CanvasSave(canvas);
533 OH_Drawing_CanvasScale(canvas, 0.5, 0.5); // 0.5, 0.5 缩放因子
534 OH_Drawing_CanvasSave(canvas);
535 uint32_t fSave_Count = 0;
536 for (int i = 0; i < testCount_; i++) {
537 fSave_Count = OH_Drawing_CanvasGetSaveCount(canvas);
538 }
539 OH_Drawing_CanvasRestoreToCount(canvas, fSave_Count);
540 OH_Drawing_CanvasDrawRect(canvas, rect);
541 OH_Drawing_RectDestroy(rect);
542 }
543
OnTestPerformance(OH_Drawing_Canvas * canvas)544 void CanvasGetWidth::OnTestPerformance(OH_Drawing_Canvas* canvas)
545 {
546 int32_t canvas_width = 0;
547 for (int i = 0; i < testCount_; i++) {
548 canvas_width = OH_Drawing_CanvasGetWidth(canvas);
549 }
550 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, canvas_width, 100); // 100 矩形高度
551 OH_Drawing_CanvasDrawRect(canvas, rect);
552 OH_Drawing_RectDestroy(rect);
553 }
554
OnTestPerformance(OH_Drawing_Canvas * canvas)555 void CanvasGetHeight::OnTestPerformance(OH_Drawing_Canvas* canvas)
556 {
557 int32_t canvas_height = 0;
558 for (int i = 0; i < testCount_; i++) {
559 canvas_height = OH_Drawing_CanvasGetHeight(canvas);
560 }
561 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 100, canvas_height); // 100 矩形宽度
562 OH_Drawing_CanvasDrawRect(canvas, rect);
563 OH_Drawing_RectDestroy(rect);
564 }