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 }