1 /*
2  * Copyright (c) 2024 Shenzhen Kaihong Digital Industry Development 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 "gtest/gtest.h"
17 
18 #include "DrawingNativeCanvasCommon.h"
19 #include "drawing_bitmap.h"
20 #include "drawing_brush.h"
21 #include "drawing_canvas.h"
22 #include "drawing_color.h"
23 #include "drawing_color_filter.h"
24 #include "drawing_filter.h"
25 #include "drawing_font.h"
26 #include "drawing_image.h"
27 #include "drawing_mask_filter.h"
28 #include "drawing_matrix.h"
29 #include "drawing_memory_stream.h"
30 #include "drawing_path.h"
31 #include "drawing_pen.h"
32 #include "drawing_point.h"
33 #include "drawing_rect.h"
34 #include "drawing_region.h"
35 #include "drawing_round_rect.h"
36 #include "drawing_sampling_options.h"
37 #include "drawing_shader_effect.h"
38 #include "drawing_text_blob.h"
39 #include "drawing_typeface.h"
40 
41 using namespace testing;
42 using namespace testing::ext;
43 
44 namespace OHOS {
45 namespace Rosen {
46 namespace Drawing {
47 
48 /*
49  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2900
50  * @tc.name: testCanvasSkewNormal
51  * @tc.desc: test for testCanvasSkewNormal.
52  * @tc.size  : SmallTest
53  * @tc.type  : Function
54  * @tc.level : Level 0
55  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasSkewNormal, TestSize.Level0)56 HWTEST_F(DrawingNativeCanvasTest, testCanvasSkewNormal, TestSize.Level0) {
57     // 1. OH_Drawing_CanvasCreate
58     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
59     // 2. OH_Drawing_CanvasSkew with positive skew values on the x and y axes
60     OH_Drawing_CanvasSkew(canvas, 1.0, 1.0);
61     // 3. Call drawing class interface
62     OH_Drawing_Rect *rect1 = OH_Drawing_RectCreate(0, 0, 100, 100);
63     OH_Drawing_CanvasDrawRect(canvas, rect1);
64     // 4. OH_Drawing_CanvasSkew with negative skew values on the x and y axes
65     OH_Drawing_CanvasSkew(canvas, -1.0, -1.0);
66     // 5. Call drawing class interface
67     OH_Drawing_Rect *rect2 = OH_Drawing_RectCreate(0, 0, 100, 100);
68     OH_Drawing_CanvasDrawRect(canvas, rect2);
69     // 6. OH_Drawing_CanvasSkew with positive skew value on the x-axis and negative skew value on the y-axis
70     OH_Drawing_CanvasSkew(canvas, 1.0, -1.0);
71     // 7. Call drawing class interface
72     OH_Drawing_Rect *rect3 = OH_Drawing_RectCreate(0, 0, 100, 100);
73     OH_Drawing_CanvasDrawRect(canvas, rect3);
74     // 8. Free memory
75     OH_Drawing_RectDestroy(rect1);
76     OH_Drawing_RectDestroy(rect2);
77     OH_Drawing_RectDestroy(rect3);
78     OH_Drawing_CanvasDestroy(canvas);
79 }
80 
81 /*
82  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2901
83  * @tc.name: testCanvasSkewNull
84  * @tc.desc: test for testCanvasSkewNull.
85  * @tc.size  : SmallTest
86  * @tc.type  : Function
87  * @tc.level : Level 3
88  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasSkewNull, TestSize.Level3)89 HWTEST_F(DrawingNativeCanvasTest, testCanvasSkewNull, TestSize.Level3) {
90     // 1. OH_Drawing_CanvasCreate
91     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
92     // 2. OH_Drawing_CanvasSkew with the first parameter as null
93     OH_Drawing_CanvasSkew(nullptr, 2, 2);
94     // 3. OH_Drawing_CanvasSkew with the second parameter as 0
95     OH_Drawing_CanvasSkew(canvas, 0, 2);
96     // 4. OH_Drawing_CanvasSkew with the third parameter as 0
97     OH_Drawing_CanvasSkew(canvas, 2, 0);
98     // 5. Free memory
99     OH_Drawing_CanvasDestroy(canvas);
100 }
101 
102 /*
103  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2903
104  * @tc.name: testCanvasSkewMaximum
105  * @tc.desc: test for testCanvasSkewMaximum.
106  * @tc.size  : SmallTest
107  * @tc.type  : Function
108  * @tc.level : Level 3
109  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasSkewMaximum, TestSize.Level3)110 HWTEST_F(DrawingNativeCanvasTest, testCanvasSkewMaximum, TestSize.Level3) {
111     // 1. OH_Drawing_CanvasCreate
112     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
113     // 2. OH_Drawing_CanvasSkew with the skew amount sx on the x-axis as the maximum value
114     OH_Drawing_CanvasSkew(canvas, FLT_MAX, 1);
115     // 3. OH_Drawing_CanvasSkew with the skew amount sy on the y-axis as the maximum value
116     OH_Drawing_CanvasSkew(canvas, 1, FLT_MAX);
117     // 4. Free memory
118     OH_Drawing_CanvasDestroy(canvas);
119 }
120 
121 /*
122  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2904
123  * @tc.name: testCanvasSkewInputDestroyed
124  * @tc.desc: test for testCanvasSkewInputDestroyed.
125  * @tc.size  : SmallTest
126  * @tc.type  : Function
127  * @tc.level : Level 3
128  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasSkewInputDestroyed, TestSize.Level3)129 HWTEST_F(DrawingNativeCanvasTest, testCanvasSkewInputDestroyed, TestSize.Level3) {
130     // Deprecated
131 }
132 
133 /*
134  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_2905
135  * @tc.name: testCanvasSkewMultipleCalls
136  * @tc.desc: test for testCanvasSkewMultipleCalls.
137  * @tc.size  : SmallTest
138  * @tc.type  : Function
139  * @tc.level : Level 3
140  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasSkewMultipleCalls, TestSize.Level3)141 HWTEST_F(DrawingNativeCanvasTest, testCanvasSkewMultipleCalls, TestSize.Level3) {
142     // 1. OH_Drawing_CanvasCreate
143     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
144     // 2. Call OH_Drawing_CanvasSkew 10 times, each time with a different skew value
145     for (int i = 0; i < 10; i++) {
146         float skew = i * 0.1;
147         OH_Drawing_CanvasSkew(canvas, skew, skew);
148     }
149     // 3. Call drawing class interface
150     OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
151     OH_Drawing_CanvasDrawRect(canvas, rect);
152     // 4. Free memory
153     OH_Drawing_RectDestroy(rect);
154     OH_Drawing_CanvasDestroy(canvas);
155 }
156 
157 /*
158  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3000
159  * @tc.name: testCanvasGetWidthtestCanvasGetHeightNormal
160  * @tc.desc: test for testCanvasGetWidthtestCanvasGetHeightNormal.
161  * @tc.size  : SmallTest
162  * @tc.type  : Function
163  * @tc.level : Level 0
164  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasGetWidthtestCanvasGetHeightNormal, TestSize.Level0)165 HWTEST_F(DrawingNativeCanvasTest, testCanvasGetWidthtestCanvasGetHeightNormal, TestSize.Level0) {
166     // 1. OH_Drawing_CanvasCreate
167     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
168     // 2. Switch the binding to a bitmap canvas using OH_Drawing_CanvasBind, and verify the canvas information by
169     // calling OH_Drawing_CanvasGetHeight and OH_Drawing_CanvasGetWidth
170     OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
171     OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
172     constexpr uint32_t width = 200;
173     constexpr uint32_t height = 200;
174     OH_Drawing_BitmapBuild(bitmap, width, height, &cFormat);
175     OH_Drawing_CanvasBind(canvas, bitmap);
176     int32_t canvasWidth = OH_Drawing_CanvasGetWidth(canvas);
177     int32_t canvasHeight = OH_Drawing_CanvasGetHeight(canvas);
178     EXPECT_EQ(canvasWidth, width);
179     EXPECT_EQ(canvasHeight, height);
180     // 3. Free memory
181     OH_Drawing_BitmapDestroy(bitmap);
182     OH_Drawing_CanvasDestroy(canvas);
183 }
184 
185 /*
186  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3001
187  * @tc.name: testCanvasGetWidthtestCanvasGetHeightNull
188  * @tc.desc: test for testCanvasGetWidthtestCanvasGetHeightNull.
189  * @tc.size  : SmallTest
190  * @tc.type  : Function
191  * @tc.level : Level 3
192  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasGetWidthtestCanvasGetHeightNull, TestSize.Level3)193 HWTEST_F(DrawingNativeCanvasTest, testCanvasGetWidthtestCanvasGetHeightNull, TestSize.Level3) {
194     // 1. OH_Drawing_CanvasCreate
195     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
196     // 2. OH_Drawing_CanvasGetHeight with null input
197     int32_t canvasHeight = OH_Drawing_CanvasGetHeight(nullptr);
198     EXPECT_EQ(canvasHeight, 0);
199     // 3. OH_Drawing_CanvasGetWidth with null input
200     int32_t canvasWidth = OH_Drawing_CanvasGetWidth(nullptr);
201     EXPECT_EQ(canvasWidth, 0);
202     // 4. Free memory
203     OH_Drawing_CanvasDestroy(canvas);
204 }
205 
206 /*
207  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3002
208  * @tc.name: testCanvasGetWidthtestCanvasGetHeightMultipleCalls
209  * @tc.desc: test for testCanvasGetWidthtestCanvasGetHeightMultipleCalls.
210  * @tc.size  : SmallTest
211  * @tc.type  : Function
212  * @tc.level : Level 3
213  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasGetWidthtestCanvasGetHeightMultipleCalls, TestSize.Level3)214 HWTEST_F(DrawingNativeCanvasTest, testCanvasGetWidthtestCanvasGetHeightMultipleCalls, TestSize.Level3) {
215     // 1. OH_Drawing_CanvasCreate
216     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
217     // 2. Switch the binding to a bitmap canvas with different widths and heights 10 times, and verify the canvas
218     // information by calling OH_Drawing_CanvasGetHeight and OH_Drawing_CanvasGetWidth after each switch
219     for (int i = 0; i < 10; i++) {
220         OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
221         OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
222         uint32_t width = 200 + i * 10;
223         uint32_t height = 200 + i * 10;
224         OH_Drawing_BitmapBuild(bitmap, width, height, &cFormat);
225         OH_Drawing_CanvasBind(canvas, bitmap);
226         int32_t canvasWidth = OH_Drawing_CanvasGetWidth(canvas);
227         int32_t canvasHeight = OH_Drawing_CanvasGetHeight(canvas);
228         EXPECT_EQ(canvasWidth, width);
229         EXPECT_EQ(canvasHeight, height);
230         OH_Drawing_BitmapDestroy(bitmap);
231     }
232     // 3. Switch the binding to different widths and heights of bitmap canvas 10 times
233     for (int i = 0; i < 10; i++) {
234         OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
235         OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
236         uint32_t width = 200 + i * 10;
237         uint32_t height = 200 + i * 10;
238         OH_Drawing_BitmapBuild(bitmap, width, height, &cFormat);
239         OH_Drawing_CanvasBind(canvas, bitmap);
240         OH_Drawing_BitmapDestroy(bitmap);
241     }
242 
243     // 4. Call OH_Drawing_CanvasGetHeight and OH_Drawing_CanvasGetWidth 10 times to verify the canvas
244     for (int i = 0; i < 10; i++) {
245         int32_t canvasWidth = OH_Drawing_CanvasGetWidth(canvas);
246         int32_t canvasHeight = OH_Drawing_CanvasGetHeight(canvas);
247         EXPECT_EQ(canvasWidth, 200 + 90);
248         EXPECT_EQ(canvasHeight, 200 + 90);
249     }
250 
251     // 5. Free memory
252     OH_Drawing_CanvasDestroy(canvas);
253 }
254 
255 /*
256  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3003
257  * @tc.name: testCanvasGetWidthtestCanvasGetHeightInputDestroyed
258  * @tc.desc: test for testCanvasGetWidthtestCanvasGetHeightInputDestroyed.
259  * @tc.size  : SmallTest
260  * @tc.type  : Function
261  * @tc.level : Level 3
262  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasGetWidthtestCanvasGetHeightInputDestroyed, TestSize.Level3)263 HWTEST_F(DrawingNativeCanvasTest, testCanvasGetWidthtestCanvasGetHeightInputDestroyed, TestSize.Level3) {
264     // Deprecated
265 }
266 
267 /*
268  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3004
269  * @tc.name: testCanvasGetWidthtestCanvasGetHeightMultipleCallsBoudary
270  * @tc.desc: test for testCanvasGetWidthtestCanvasGetHeightMultipleCallsBoudary.
271  * @tc.size  : SmallTest
272  * @tc.type  : Function
273  * @tc.level : Level 3
274  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasGetWidthtestCanvasGetHeightMultipleCallsBoudary, TestSize.Level3)275 HWTEST_F(DrawingNativeCanvasTest, testCanvasGetWidthtestCanvasGetHeightMultipleCallsBoudary, TestSize.Level3) {
276     // 1. OH_Drawing_CanvasCreate
277     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
278     // 2. Switch the binding to a bitmap canvas with different widths and heights 10 times, and verify the canvas
279     // information by calling OH_Drawing_CanvasGetHeight and OH_Drawing_CanvasGetWidth after each switch
280     constexpr uint32_t width = 4096;
281     constexpr uint32_t height = 2160;
282     for (int i = 0; i < 10; i++) {
283         OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
284         OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
285         OH_Drawing_BitmapBuild(bitmap, width, height, &cFormat);
286         OH_Drawing_CanvasBind(canvas, bitmap);
287         int32_t canvasWidth = OH_Drawing_CanvasGetWidth(canvas);
288         int32_t canvasHeight = OH_Drawing_CanvasGetHeight(canvas);
289         EXPECT_EQ(canvasWidth, width);
290         EXPECT_EQ(canvasHeight, height);
291         OH_Drawing_BitmapDestroy(bitmap);
292     }
293     // 3. Switch the binding to different widths and heights of bitmap canvas 10 times
294     for (int i = 0; i < 10; i++) {
295         OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
296         OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
297         OH_Drawing_BitmapBuild(bitmap, width, height, &cFormat);
298         OH_Drawing_CanvasBind(canvas, bitmap);
299         OH_Drawing_BitmapDestroy(bitmap);
300     }
301 
302     // 4. Call OH_Drawing_CanvasGetHeight and OH_Drawing_CanvasGetWidth 10 times to verify the canvas
303     for (int i = 0; i < 10; i++) {
304         int32_t canvasWidth = OH_Drawing_CanvasGetWidth(canvas);
305         int32_t canvasHeight = OH_Drawing_CanvasGetHeight(canvas);
306         EXPECT_EQ(canvasWidth, width);
307         EXPECT_EQ(canvasHeight, height);
308     }
309 
310     // 5. Free memory
311     OH_Drawing_CanvasDestroy(canvas);
312 }
313 
314 /*
315  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3100
316  * @tc.name: testCanvasGetLocalClipBoundsNormal
317  * @tc.desc: test for testCanvasGetLocalClipBoundsNormal.
318  * @tc.size  : SmallTest
319  * @tc.type  : Function
320  * @tc.level : Level 0
321  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasGetLocalClipBoundsNormal, TestSize.Level0)322 HWTEST_F(DrawingNativeCanvasTest, testCanvasGetLocalClipBoundsNormal, TestSize.Level0) {
323     // 1. OH_Drawing_CanvasCreate
324     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
325     // 2. OH_Drawing_RectCreate
326     OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
327     // 3. OH_Drawing_CanvasGetLocalClipBounds
328     OH_Drawing_CanvasGetLocalClipBounds(canvas, rect);
329     // 4. OH_Drawing_CanvasDrawRect
330     OH_Drawing_CanvasDrawRect(canvas, rect);
331     // 5. Free memory
332     OH_Drawing_RectDestroy(rect);
333     OH_Drawing_CanvasDestroy(canvas);
334 }
335 
336 /*
337  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3101
338  * @tc.name: testCanvasGetLocalClipBoundsNull
339  * @tc.desc: test for testCanvasGetLocalClipBoundsNull.
340  * @tc.size  : SmallTest
341  * @tc.type  : Function
342  * @tc.level : Level 3
343  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasGetLocalClipBoundsNull, TestSize.Level3)344 HWTEST_F(DrawingNativeCanvasTest, testCanvasGetLocalClipBoundsNull, TestSize.Level3) {
345     // 1. OH_Drawing_CanvasCreate
346     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
347     // 2. OH_Drawing_RectCreate
348     OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
349     // 3. OH_Drawing_CanvasGetLocalClipBounds with the first parameter as null
350     OH_Drawing_CanvasGetLocalClipBounds(nullptr, rect);
351     // 4. OH_Drawing_CanvasGetLocalClipBounds with the second parameter as null
352     OH_Drawing_CanvasGetLocalClipBounds(canvas, nullptr);
353     // 5. OH_Drawing_CanvasGetLocalClipBounds with OH_Drawing_Rect created with left, top, right, bottom as 0
354     rect = OH_Drawing_RectCreate(0, 100, 100, 100);
355     OH_Drawing_CanvasGetLocalClipBounds(canvas, rect);
356     rect = OH_Drawing_RectCreate(100, 0, 100, 100);
357     OH_Drawing_CanvasGetLocalClipBounds(canvas, rect);
358     rect = OH_Drawing_RectCreate(100, 100, 0, 100);
359     OH_Drawing_CanvasGetLocalClipBounds(canvas, rect);
360     rect = OH_Drawing_RectCreate(100, 100, 100, 0);
361     OH_Drawing_CanvasGetLocalClipBounds(canvas, rect);
362     // 6. OH_Drawing_CanvasGetLocalClipBounds with OH_Drawing_Rect created with all values as 0
363     rect = OH_Drawing_RectCreate(0, 0, 0, 0);
364     OH_Drawing_CanvasGetLocalClipBounds(canvas, rect);
365     // 7. Free memory
366     OH_Drawing_RectDestroy(rect);
367 }
368 
369 /*
370  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3102
371  * @tc.name: testCanvasGetLocalClipBoundsAbnormal
372  * @tc.desc: test for testCanvasGetLocalClipBoundsAbnormal.
373  * @tc.size  : SmallTest
374  * @tc.type  : Function
375  * @tc.level : Level 3
376  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasGetLocalClipBoundsAbnormal, TestSize.Level3)377 HWTEST_F(DrawingNativeCanvasTest, testCanvasGetLocalClipBoundsAbnormal, TestSize.Level3) {
378     // 1. OH_Drawing_CanvasCreate
379     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
380     // 2. OH_Drawing_CanvasGetLocalClipBounds with OH_Drawing_Rect created with negative values for left, top, right,
381     // and bottom
382     OH_Drawing_Rect *rect1 = OH_Drawing_RectCreate(-100, 100, 100, 100);
383     OH_Drawing_CanvasGetLocalClipBounds(canvas, rect1);
384     OH_Drawing_Rect *rect2 = OH_Drawing_RectCreate(100, -100, 100, 100);
385     OH_Drawing_CanvasGetLocalClipBounds(canvas, rect2);
386     OH_Drawing_Rect *rect3 = OH_Drawing_RectCreate(100, 100, -100, 100);
387     OH_Drawing_CanvasGetLocalClipBounds(canvas, rect3);
388     OH_Drawing_Rect *rect4 = OH_Drawing_RectCreate(100, 100, 100, -100);
389     OH_Drawing_CanvasGetLocalClipBounds(canvas, rect4);
390     // 3. OH_Drawing_CanvasGetLocalClipBounds with OH_Drawing_Rect src created with the top-left coordinate equal to the
391     // bottom-right coordinate or the top-left coordinate equal to the bottom-right coordinate
392     OH_Drawing_Rect *rect5 = OH_Drawing_RectCreate(100, 200, 200, 200);
393     OH_Drawing_CanvasGetLocalClipBounds(canvas, rect5);
394     OH_Drawing_Rect *rect6 = OH_Drawing_RectCreate(200, 100, 200, 200);
395     OH_Drawing_CanvasGetLocalClipBounds(canvas, rect6);
396     // 4. OH_Drawing_CanvasGetLocalClipBounds with OH_Drawing_Rect src created with the top-left coordinate equal to the
397     // bottom-right coordinate
398     OH_Drawing_Rect *rect7 = OH_Drawing_RectCreate(100, 100, 100, 100);
399     OH_Drawing_CanvasGetLocalClipBounds(canvas, rect7);
400     // 5. OH_Drawing_CanvasGetLocalClipBounds with OH_Drawing_Rect src created with the top-left coordinate greater than
401     // the bottom-right coordinate
402     OH_Drawing_Rect *rect8 = OH_Drawing_RectCreate(200, 200, 100, 100);
403     OH_Drawing_CanvasGetLocalClipBounds(canvas, rect8);
404     // 6. Free memory
405     OH_Drawing_RectDestroy(rect1);
406     OH_Drawing_RectDestroy(rect2);
407     OH_Drawing_RectDestroy(rect3);
408     OH_Drawing_RectDestroy(rect4);
409     OH_Drawing_RectDestroy(rect5);
410     OH_Drawing_RectDestroy(rect6);
411     OH_Drawing_RectDestroy(rect7);
412     OH_Drawing_RectDestroy(rect8);
413     OH_Drawing_CanvasDestroy(canvas);
414 }
415 
416 /*
417  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3103
418  * @tc.name: testCanvasGetLocalClipBoundsMultipleCalls
419  * @tc.desc: test for testCanvasGetLocalClipBoundsMultipleCalls.
420  * @tc.size  : SmallTest
421  * @tc.type  : Function
422  * @tc.level : Level 3
423  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasGetLocalClipBoundsMultipleCalls, TestSize.Level3)424 HWTEST_F(DrawingNativeCanvasTest, testCanvasGetLocalClipBoundsMultipleCalls, TestSize.Level3) {
425     // 1. OH_Drawing_CanvasCreate
426     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
427     // 2. Switch the binding to a bitmap canvas with different widths and heights 10 times, and verify the canvas
428     // information by calling OH_Drawing_CanvasGetLocalClipBounds after each switch
429     for (int i = 0; i < 10; i++) {
430         OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
431         OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
432         uint32_t width = 200;
433         uint32_t height = 200;
434         OH_Drawing_BitmapBuild(bitmap, width, height, &cFormat);
435         OH_Drawing_CanvasBind(canvas, bitmap);
436         OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, width, height);
437         OH_Drawing_CanvasGetLocalClipBounds(canvas, rect);
438         OH_Drawing_RectDestroy(rect);
439         OH_Drawing_BitmapDestroy(bitmap);
440     }
441     // 3. Switch the binding to different widths and heights of bitmap canvas 10 times
442     for (int i = 0; i < 10; i++) {
443         OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
444         OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
445         uint32_t width = 200 + i * 10;
446         uint32_t height = 200 + i * 10;
447         OH_Drawing_BitmapBuild(bitmap, width, height, &cFormat);
448         OH_Drawing_CanvasBind(canvas, bitmap);
449         OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, width, height);
450         OH_Drawing_CanvasGetLocalClipBounds(canvas, rect);
451         OH_Drawing_RectDestroy(rect);
452         OH_Drawing_BitmapDestroy(bitmap);
453     }
454     // 4. Call OH_Drawing_CanvasGetLocalClipBounds 10 times to verify the canvas
455     OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 200, 200);
456     for (int i = 0; i < 10; i++) {
457         OH_Drawing_CanvasGetLocalClipBounds(canvas, rect);
458     }
459     // 5. Free memory
460     OH_Drawing_RectDestroy(rect);
461     OH_Drawing_CanvasDestroy(canvas);
462 }
463 
464 /*
465  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3104
466  * @tc.name: testCanvasGetLocalClipBoundsInputDestroyed
467  * @tc.desc: test for testCanvasGetLocalClipBoundsInputDestroyed.
468  * @tc.size  : SmallTest
469  * @tc.type  : Function
470  * @tc.level : Level 3
471  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasGetLocalClipBoundsInputDestroyed, TestSize.Level3)472 HWTEST_F(DrawingNativeCanvasTest, testCanvasGetLocalClipBoundsInputDestroyed, TestSize.Level3) {
473     // Deprecated
474 }
475 
476 /*
477  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3105
478  * @tc.name: testCanvasGetLocalClipBoundsMultipleCallsBoundary
479  * @tc.desc: test for testCanvasGetLocalClipBoundsMultipleCallsBoundary.
480  * @tc.size  : SmallTest
481  * @tc.type  : Function
482  * @tc.level : Level 3
483  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasGetLocalClipBoundsMultipleCallsBoundary, TestSize.Level3)484 HWTEST_F(DrawingNativeCanvasTest, testCanvasGetLocalClipBoundsMultipleCallsBoundary, TestSize.Level3) {
485     // 1. OH_Drawing_CanvasCreate
486     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
487     // 2. Switch the binding to a bitmap canvas with different widths and heights 10 times, and verify the canvas
488     // information by calling OH_Drawing_CanvasGetLocalClipBounds after each switch
489     uint32_t width = 4096;
490     uint32_t height = 2160;
491     for (int i = 0; i < 10; i++) {
492         OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
493         OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
494         OH_Drawing_BitmapBuild(bitmap, width, height, &cFormat);
495         OH_Drawing_CanvasBind(canvas, bitmap);
496         OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, width, height);
497         OH_Drawing_CanvasGetLocalClipBounds(canvas, rect);
498         OH_Drawing_RectDestroy(rect);
499         OH_Drawing_BitmapDestroy(bitmap);
500     }
501     // 3. Switch the binding to different widths and heights of bitmap canvas 10 times
502     for (int i = 0; i < 10; i++) {
503         OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
504         OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
505         OH_Drawing_BitmapBuild(bitmap, width, height, &cFormat);
506         OH_Drawing_CanvasBind(canvas, bitmap);
507         OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, width, height);
508         OH_Drawing_CanvasGetLocalClipBounds(canvas, rect);
509         OH_Drawing_RectDestroy(rect);
510         OH_Drawing_BitmapDestroy(bitmap);
511     }
512     // 4. Call OH_Drawing_CanvasGetLocalClipBounds 10 times to verify the canvas
513     OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 200, 200);
514     for (int i = 0; i < 10; i++) {
515         OH_Drawing_CanvasGetLocalClipBounds(canvas, rect);
516     }
517     // 5. Free memory
518     OH_Drawing_RectDestroy(rect);
519     OH_Drawing_CanvasDestroy(canvas);
520 }
521 
522 /*
523  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3200
524  * @tc.name: testCanvasConcatMatrixtestCanvasGetTotalMatrixNormal
525  * @tc.desc: test for testCanvasConcatMatrixtestCanvasGetTotalMatrixNormal.
526  * @tc.size  : SmallTest
527  * @tc.type  : Function
528  * @tc.level : Level 0
529  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasConcatMatrixtestCanvasGetTotalMatrixNormal, TestSize.Level0)530 HWTEST_F(DrawingNativeCanvasTest, testCanvasConcatMatrixtestCanvasGetTotalMatrixNormal, TestSize.Level0) {
531     // 1. OH_Drawing_CanvasCreate
532     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
533     // 2. OH_Drawing_MatrixCreate
534     OH_Drawing_Matrix *matrix = OH_Drawing_MatrixCreate();
535     OH_Drawing_MatrixSetMatrix(matrix, 1, 0, 0, 0, -1, 0, 0, 0, 1);
536     // 3. Call OH_Drawing_CanvasConcatMatrix to get the 3x3 matrix of the canvas by calling
537     // OH_Drawing_CanvasGetTotalMatrix
538     OH_Drawing_CanvasConcatMatrix(canvas, matrix);
539     OH_Drawing_Matrix *totalMatrix = OH_Drawing_MatrixCreate();
540     OH_Drawing_CanvasGetTotalMatrix(canvas, totalMatrix);
541     EXPECT_NE(totalMatrix, nullptr);
542     // 4. Free memory
543     OH_Drawing_MatrixDestroy(matrix);
544     OH_Drawing_MatrixDestroy(totalMatrix);
545     OH_Drawing_CanvasDestroy(canvas);
546 }
547 
548 /*
549  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3201
550  * @tc.name: testCanvasConcatMatrixNull
551  * @tc.desc: test for testCanvasConcatMatrixNull.
552  * @tc.size  : SmallTest
553  * @tc.type  : Function
554  * @tc.level : Level 3
555  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasConcatMatrixNull, TestSize.Level3)556 HWTEST_F(DrawingNativeCanvasTest, testCanvasConcatMatrixNull, TestSize.Level3) {
557     // 1. OH_Drawing_CanvasCreate
558     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
559     // 2. OH_Drawing_MatrixCreate
560     OH_Drawing_Matrix *matrix = OH_Drawing_MatrixCreate();
561     OH_Drawing_MatrixSetMatrix(matrix, 1, 0, 0, 0, -1, 0, 0, 0, 1);
562     // 3. OH_Drawing_CanvasConcatMatrix with the first parameter as null
563     OH_Drawing_CanvasConcatMatrix(nullptr, matrix);
564     // 4. OH_Drawing_CanvasConcatMatrix with the second parameter as null
565     OH_Drawing_CanvasConcatMatrix(canvas, nullptr);
566     // 5. Free memory
567     OH_Drawing_MatrixDestroy(matrix);
568     OH_Drawing_CanvasDestroy(canvas);
569 }
570 
571 /*
572  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3202
573  * @tc.name: testCanvasGetTotalMatrixNull
574  * @tc.desc: test for testCanvasGetTotalMatrixNull.
575  * @tc.size  : SmallTest
576  * @tc.type  : Function
577  * @tc.level : Level 3
578  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasGetTotalMatrixNull, TestSize.Level3)579 HWTEST_F(DrawingNativeCanvasTest, testCanvasGetTotalMatrixNull, TestSize.Level3) {
580     // 1. OH_Drawing_CanvasCreate
581     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
582     // 2. OH_Drawing_MatrixCreate
583     OH_Drawing_Matrix *matrix = OH_Drawing_MatrixCreate();
584     // 3. OH_Drawing_CanvasGetTotalMatrix with the first parameter as null
585     OH_Drawing_CanvasGetTotalMatrix(nullptr, matrix);
586     // 4. OH_Drawing_CanvasGetTotalMatrix with the second parameter as null
587     OH_Drawing_CanvasGetTotalMatrix(canvas, nullptr);
588     // 5. Free memory
589     OH_Drawing_MatrixDestroy(matrix);
590 }
591 
592 /*
593  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3203
594  * @tc.name: testCanvasConcatMatrixtestCanvasGetTotalMatrixMultipleCalls
595  * @tc.desc: test for testCanvasConcatMatrixtestCanvasGetTotalMatrixMultipleCalls.
596  * @tc.size  : SmallTest
597  * @tc.type  : Function
598  * @tc.level : Level 3
599  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasConcatMatrixtestCanvasGetTotalMatrixMultipleCalls, TestSize.Level3)600 HWTEST_F(DrawingNativeCanvasTest, testCanvasConcatMatrixtestCanvasGetTotalMatrixMultipleCalls, TestSize.Level3) {
601     // 1. OH_Drawing_CanvasCreate
602     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
603     // 2. OH_Drawing_MatrixCreateScale
604     OH_Drawing_Matrix *matrix = OH_Drawing_MatrixCreateScale(10, 10, 10, 10);
605     // 3. Call OH_Drawing_CanvasConcatMatrix to get the 3x3 matrix of the canvas by calling
606     // OH_Drawing_CanvasGetTotalMatrix
607     OH_Drawing_CanvasConcatMatrix(canvas, matrix);
608     OH_Drawing_Matrix *totalMatrix = OH_Drawing_MatrixCreate();
609     OH_Drawing_CanvasGetTotalMatrix(canvas, totalMatrix);
610     // 4. OH_Drawing_MatrixCreateRotation
611     OH_Drawing_Matrix *matrix2 = OH_Drawing_MatrixCreateRotation(180, 1, 1);
612     // 5. Call OH_Drawing_CanvasConcatMatrix to get the 3x3 matrix of the canvas by calling
613     // OH_Drawing_CanvasGetTotalMatrix
614     OH_Drawing_CanvasConcatMatrix(canvas, matrix2);
615     OH_Drawing_Matrix *totalMatrix2 = OH_Drawing_MatrixCreate();
616     OH_Drawing_CanvasGetTotalMatrix(canvas, totalMatrix2);
617     // 6. OH_Drawing_MatrixCreateTranslation
618     OH_Drawing_Matrix *matrix3 = OH_Drawing_MatrixCreateTranslation(10, 10);
619     // 7. Call OH_Drawing_CanvasConcatMatrix to get the 3x3 matrix of the canvas by calling
620     // OH_Drawing_CanvasGetTotalMatrix
621     OH_Drawing_CanvasConcatMatrix(canvas, matrix3);
622     OH_Drawing_Matrix *totalMatrix3 = OH_Drawing_MatrixCreate();
623     OH_Drawing_CanvasGetTotalMatrix(canvas, totalMatrix3);
624     // 8. Repeat steps 2-7 10 times
625     for (int i = 0; i < 10; i++) {
626         OH_Drawing_Matrix *matrix = OH_Drawing_MatrixCreateScale(10, 10, 10, 10);
627         OH_Drawing_CanvasConcatMatrix(canvas, matrix);
628         OH_Drawing_Matrix *totalMatrix = OH_Drawing_MatrixCreate();
629         OH_Drawing_CanvasGetTotalMatrix(canvas, totalMatrix);
630 
631         OH_Drawing_Matrix *matrix2 = OH_Drawing_MatrixCreateRotation(180, 1, 1);
632         OH_Drawing_CanvasConcatMatrix(canvas, matrix2);
633         OH_Drawing_Matrix *totalMatrix2 = OH_Drawing_MatrixCreate();
634         OH_Drawing_CanvasGetTotalMatrix(canvas, totalMatrix2);
635 
636         OH_Drawing_Matrix *matrix3 = OH_Drawing_MatrixCreateTranslation(10, 10);
637         OH_Drawing_CanvasConcatMatrix(canvas, matrix3);
638         OH_Drawing_Matrix *totalMatrix3 = OH_Drawing_MatrixCreate();
639         OH_Drawing_CanvasGetTotalMatrix(canvas, totalMatrix3);
640 
641         OH_Drawing_MatrixDestroy(matrix);
642         OH_Drawing_MatrixDestroy(matrix2);
643         OH_Drawing_MatrixDestroy(matrix3);
644         OH_Drawing_MatrixDestroy(totalMatrix);
645         OH_Drawing_MatrixDestroy(totalMatrix2);
646         OH_Drawing_MatrixDestroy(totalMatrix3);
647     }
648     // 9. Call OH_Drawing_CanvasConcatMatrix 10 times
649     for (int i = 0; i < 10; i++) {
650         OH_Drawing_CanvasConcatMatrix(canvas, matrix);
651     }
652 
653     // 10. Free memory
654     OH_Drawing_MatrixDestroy(matrix);
655     OH_Drawing_MatrixDestroy(matrix2);
656     OH_Drawing_MatrixDestroy(matrix3);
657     OH_Drawing_MatrixDestroy(totalMatrix);
658 }
659 
660 /*
661  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3204
662  * @tc.name: testCanvasConcatMatrixtestCanvasGetTotalMatrixInputDestroyed
663  * @tc.desc: test for testCanvasConcatMatrixtestCanvasGetTotalMatrixInputDestroyed.
664  * @tc.size  : SmallTest
665  * @tc.type  : Function
666  * @tc.level : Level 3
667  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasConcatMatrixtestCanvasGetTotalMatrixInputDestroyed, TestSize.Level3)668 HWTEST_F(DrawingNativeCanvasTest, testCanvasConcatMatrixtestCanvasGetTotalMatrixInputDestroyed, TestSize.Level3) {
669     // Deprecated
670 }
671 
672 /*
673  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3300
674  * @tc.name: testCanvasDrawShadowNormal
675  * @tc.desc: test for testCanvasDrawShadowNormal.
676  * @tc.size  : SmallTest
677  * @tc.type  : Function
678  * @tc.level : Level 0
679  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawShadowNormal, TestSize.Level0)680 HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawShadowNormal, TestSize.Level0) {
681     // 1. OH_Drawing_CanvasCreate
682     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
683     EXPECT_NE(canvas, nullptr);
684     // 2. OH_Drawing_PathCreate
685     OH_Drawing_Path *path = OH_Drawing_PathCreate();
686     EXPECT_NE(path, nullptr);
687     // 3. OH_Drawing_CanvasDrawShadow, iterate through the OH_Drawing_CanvasShadowFlags enumeration values
688     OH_Drawing_CanvasShadowFlags flags[] = {
689         SHADOW_FLAGS_NONE,
690         SHADOW_FLAGS_TRANSPARENT_OCCLUDER,
691         SHADOW_FLAGS_GEOMETRIC_ONLY,
692         SHADOW_FLAGS_ALL,
693     };
694     OH_Drawing_Point3D p1{0.0, 0.0, 0.0};
695     OH_Drawing_Point3D p2{10.0, 10.0, 10.0};
696     for (int i = 0; i < 4; i++) {
697         OH_Drawing_CanvasDrawShadow(canvas, path, p1, p2, 10, 0xFF000000, 0xFF000000, flags[i]);
698     }
699     // 4. Free memory
700     OH_Drawing_PathDestroy(path);
701     OH_Drawing_CanvasDestroy(canvas);
702 }
703 
704 /*
705  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3301
706  * @tc.name: testCanvasDrawShadowNull
707  * @tc.desc: test for testCanvasDrawShadowNull.
708  * @tc.size  : SmallTest
709  * @tc.type  : Function
710  * @tc.level : Level 3
711  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawShadowNull, TestSize.Level3)712 HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawShadowNull, TestSize.Level3) {
713     // 1. OH_Drawing_CanvasCreate
714     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
715     // 2. OH_Drawing_PathCreate
716     OH_Drawing_Path *path = OH_Drawing_PathCreate();
717     // 3. OH_Drawing_CanvasDrawShadow with the first parameter as null
718     OH_Drawing_Point3D p1{0.0, 0.0, 0.0};
719     OH_Drawing_Point3D p2{10.0, 10.0, 10.0};
720     OH_Drawing_CanvasDrawShadow(nullptr, path, p1, p2, 10, 0xFF000000, 0xFF000000, SHADOW_FLAGS_ALL);
721     // 4. OH_Drawing_CanvasDrawShadow with the second parameter as null
722     OH_Drawing_CanvasDrawShadow(canvas, nullptr, p1, p2, 10, 0xFF000000, 0xFF000000, SHADOW_FLAGS_ALL);
723     // 5. OH_Drawing_CanvasDrawShadow with the third parameter as null
724     // Unable to test, compilation error
725     // 6. OH_Drawing_CanvasDrawShadow with the fourth parameter as null
726     // Unable to test, compilation error
727     // 7. OH_Drawing_CanvasDrawShadow with the fifth parameter as 0
728     OH_Drawing_CanvasDrawShadow(canvas, path, p1, p2, 0, 0xFF000000, 0xFF000000, SHADOW_FLAGS_ALL);
729     // 8. OH_Drawing_CanvasDrawShadow with the sixth parameter as 0
730     OH_Drawing_CanvasDrawShadow(canvas, path, p1, p2, 10, 0, 0xFF000000, SHADOW_FLAGS_ALL);
731     // 9. OH_Drawing_CanvasDrawShadow with the seventh parameter as 0
732     OH_Drawing_CanvasDrawShadow(canvas, path, p1, p2, 10, 0xFF000000, 0, SHADOW_FLAGS_ALL);
733     // 10. Free memory
734     OH_Drawing_PathDestroy(path);
735     OH_Drawing_CanvasDestroy(canvas);
736 }
737 
738 /*
739  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3302
740  * @tc.name: testCanvasDrawShadowAbnormal
741  * @tc.desc: test for testCanvasDrawShadowAbnormal.
742  * @tc.size  : SmallTest
743  * @tc.type  : Function
744  * @tc.level : Level 3
745  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawShadowAbnormal, TestSize.Level3)746 HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawShadowAbnormal, TestSize.Level3) {
747     // 1. OH_Drawing_CanvasCreate
748     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
749     // 2. OH_Drawing_PathCreate
750     OH_Drawing_Path *path = OH_Drawing_PathCreate();
751     // 3. OH_Drawing_CanvasDrawShadow, the third parameter planeParams x, y, z are set to negative values
752     OH_Drawing_Point3D p1{-1.0, -1.0, -1.0};
753     OH_Drawing_Point3D p2{10.0, 10.0, 10.0};
754     OH_Drawing_CanvasDrawShadow(canvas, path, p1, p2, 10, 0xFF000000, 0xFF000000, SHADOW_FLAGS_ALL);
755     // 4. OH_Drawing_CanvasDrawShadow, the fourth parameter devLightPos x, y, z are set to negative values
756     OH_Drawing_Point3D p3{0.0, 0.0, 0.0};
757     OH_Drawing_Point3D p4{-10.0, -10.0, -10.0};
758     OH_Drawing_CanvasDrawShadow(canvas, path, p3, p4, 10, 0xFF000000, 0xFF000000, SHADOW_FLAGS_ALL);
759     // 5. OH_Drawing_CanvasDrawShadow, the fifth parameter lightRadius is set to a negative value
760     OH_Drawing_CanvasDrawShadow(canvas, path, p3, p4, -10, 0xFF000000, 0xFF000000, SHADOW_FLAGS_ALL);
761     // 6. OH_Drawing_CanvasDrawShadow, the sixth parameter ambientColor is set to a negative value
762     OH_Drawing_CanvasDrawShadow(canvas, path, p3, p4, 10, -0xFF000000, 0xFF000000, SHADOW_FLAGS_ALL);
763     // 7. OH_Drawing_CanvasDrawShadow, the seventh parameter spotColor is set to a negative value
764     OH_Drawing_CanvasDrawShadow(canvas, path, p3, p4, 10, 0xFF000000, -0xFF000000, SHADOW_FLAGS_ALL);
765     // 8. Free memory
766     OH_Drawing_PathDestroy(path);
767     OH_Drawing_CanvasDestroy(canvas);
768 }
769 
770 /*
771  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3303
772  * @tc.name: testCanvasDrawShadowMaximum
773  * @tc.desc: test for testCanvasDrawShadowMaximum.
774  * @tc.size  : SmallTest
775  * @tc.type  : Function
776  * @tc.level : Level 3
777  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawShadowMaximum, TestSize.Level3)778 HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawShadowMaximum, TestSize.Level3) {
779     // 1. OH_Drawing_CanvasCreate
780     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
781     // 2. OH_Drawing_PathCreate
782     OH_Drawing_Path *path = OH_Drawing_PathCreate();
783     OH_Drawing_Point3D p1{1.0, 1.0, 1.0};
784     OH_Drawing_Point3D p2{10.0, 10.0, 10.0};
785     // 3. OH_Drawing_CanvasDrawShadow, set the x, y, z values in the planeParams parameter to maximum values
786     p1 = {FLT_MAX, FLT_MAX, FLT_MAX};
787     OH_Drawing_CanvasDrawShadow(canvas, path, p1, p2, 10, 0xFFFFFFFF, 0xFFFFFFFF, SHADOW_FLAGS_ALL);
788     // 4. OH_Drawing_CanvasDrawShadow, set the x, y, z values in the devLightPos parameter to maximum values
789     p1 = {1.0, 1.0, 1.0};
790     p2 = {FLT_MAX, FLT_MAX, FLT_MAX};
791     OH_Drawing_CanvasDrawShadow(canvas, path, p1, p2, 10, 0xFFFFFFFF, 0xFFFFFFFF, SHADOW_FLAGS_ALL);
792     // 5. OH_Drawing_CanvasDrawShadow, set the lightRadius parameter to maximum value
793     OH_Drawing_CanvasDrawShadow(canvas, path, p1, p2, FLT_MAX, 0xFFFFFFFF, 0xFFFFFFFF, SHADOW_FLAGS_ALL);
794     // 6. OH_Drawing_CanvasDrawShadow, set the ambientColor parameter to maximum value
795     OH_Drawing_CanvasDrawShadow(canvas, path, p1, p2, 10, 0xFFFFFFFF, 0xFFFFFFFF, SHADOW_FLAGS_ALL);
796     // 7. OH_Drawing_CanvasDrawShadow, set the spotColor parameter to maximum value
797     OH_Drawing_CanvasDrawShadow(canvas, path, p1, p2, 10, 0xFFFFFFFF, 0xFFFFFFFF, SHADOW_FLAGS_ALL);
798     // 8. Free memory
799     OH_Drawing_PathDestroy(path);
800     OH_Drawing_CanvasDestroy(canvas);
801 }
802 
803 /*
804  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3304
805  * @tc.name: testCanvasDrawShadowInputDestroyed
806  * @tc.desc: test for testCanvasDrawShadowInputDestroyed.
807  * @tc.size  : SmallTest
808  * @tc.type  : Function
809  * @tc.level : Level 3
810  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawShadowInputDestroyed, TestSize.Level3)811 HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawShadowInputDestroyed, TestSize.Level3) {
812     // Deprecated
813 }
814 
815 /*
816  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3400
817  * @tc.name: testCanvasClearNormal
818  * @tc.desc: test for testCanvasClearNormal.
819  * @tc.size  : SmallTest
820  * @tc.type  : Function
821  * @tc.level : Level 0
822  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasClearNormal, TestSize.Level0)823 HWTEST_F(DrawingNativeCanvasTest, testCanvasClearNormal, TestSize.Level0) {
824     // 1. OH_Drawing_CanvasCreate
825     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
826     // 2. OH_Drawing_CanvasClear, covering the minimum value 0x00000000 and the maximum value 0xFFFFFFFF for color
827     OH_Drawing_CanvasClear(canvas, 0x00000000);
828     OH_Drawing_CanvasClear(canvas, 0xFFFFFFFF);
829     // 3. Free memory
830     OH_Drawing_CanvasDestroy(canvas);
831 }
832 
833 /*
834  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3401
835  * @tc.name: testCanvasClearNull
836  * @tc.desc: test for testCanvasClearNull.
837  * @tc.size  : SmallTest
838  * @tc.type  : Function
839  * @tc.level : Level 3
840  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasClearNull, TestSize.Level3)841 HWTEST_F(DrawingNativeCanvasTest, testCanvasClearNull, TestSize.Level3) {
842     // 1. OH_Drawing_CanvasCreate
843     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
844     // 2. OH_Drawing_CanvasClear with the first parameter as null
845     OH_Drawing_CanvasClear(nullptr, 0x00000000);
846     // 3. Free memory
847     OH_Drawing_CanvasDestroy(canvas);
848 }
849 
850 /*
851  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3402
852  * @tc.name: testCanvasClearAbnormal
853  * @tc.desc: test for testCanvasClearAbnormal.
854  * @tc.size  : SmallTest
855  * @tc.type  : Function
856  * @tc.level : Level 3
857  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasClearAbnormal, TestSize.Level3)858 HWTEST_F(DrawingNativeCanvasTest, testCanvasClearAbnormal, TestSize.Level3) {
859     // 1. OH_Drawing_CanvasCreate
860     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
861     // 2. OH_Drawing_CanvasClear with the parameter color set to a negative value
862     OH_Drawing_CanvasClear(canvas, -1);
863     // 3. OH_Drawing_CanvasClear with the parameter color set to a floating-point value
864     // compile error, ignore
865     // 4. Free memory
866     OH_Drawing_CanvasDestroy(canvas);
867 }
868 
869 /*
870  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3403
871  * @tc.name: testCanvasClearMultipleCalls
872  * @tc.desc: test for testCanvasClearMultipleCalls.
873  * @tc.size  : SmallTest
874  * @tc.type  : Function
875  * @tc.level : Level 3
876  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasClearMultipleCalls, TestSize.Level3)877 HWTEST_F(DrawingNativeCanvasTest, testCanvasClearMultipleCalls, TestSize.Level3) {
878     // 1. OH_Drawing_CanvasCreate
879     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
880     // 2. Call OH_Drawing_CanvasClear 10 times, each time with a different color
881     for (int i = 0; i < 10; i++) {
882         OH_Drawing_CanvasClear(canvas, 0x11111111 + i * 10);
883     }
884     // 3. Free memory
885     OH_Drawing_CanvasDestroy(canvas);
886 }
887 
888 /*
889  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3404
890  * @tc.name: testCanvasClearInputDestroyed
891  * @tc.desc: test for testCanvasClearInputDestroyed.
892  * @tc.size  : SmallTest
893  * @tc.type  : Function
894  * @tc.level : Level 3
895  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasClearInputDestroyed, TestSize.Level3)896 HWTEST_F(DrawingNativeCanvasTest, testCanvasClearInputDestroyed, TestSize.Level3) {
897     // Deprecated
898 }
899 
900 /*
901  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3405
902  * @tc.name: testCanvasClearMaximum
903  * @tc.desc: test for testCanvasClearMaximum.
904  * @tc.size  : SmallTest
905  * @tc.type  : Function
906  * @tc.level : Level 3
907  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasClearMaximum, TestSize.Level3)908 HWTEST_F(DrawingNativeCanvasTest, testCanvasClearMaximum, TestSize.Level3) {
909     // 1. OH_Drawing_CanvasCreate
910     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
911     // 2. OH_Drawing_CanvasClear with the parameter color set to the maximum value
912     OH_Drawing_CanvasClear(canvas, 0xFFFFFFFF);
913     // 3. Free memory
914     OH_Drawing_CanvasDestroy(canvas);
915 }
916 
917 /*
918  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3500
919  * @tc.name: testCanvasSetMatrixNormal
920  * @tc.desc: test for testCanvasSetMatrixNormal.
921  * @tc.size  : SmallTest
922  * @tc.type  : Function
923  * @tc.level : Level 0
924  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasSetMatrixNormal, TestSize.Level0)925 HWTEST_F(DrawingNativeCanvasTest, testCanvasSetMatrixNormal, TestSize.Level0) {
926     // 1. OH_Drawing_CanvasCreate
927     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
928     // 2. OH_Drawing_MatrixCreate
929     OH_Drawing_Matrix *matrix = OH_Drawing_MatrixCreate();
930     OH_Drawing_MatrixSetMatrix(matrix, 1, 0, 0, 0, -1, 0, 0, 0, 1);
931     // 3. Call OH_Drawing_CanvasSetMatrix and use OH_Drawing_MatrixGetValue to get the matrix information
932     OH_Drawing_CanvasSetMatrix(canvas, matrix);
933     float val = OH_Drawing_MatrixGetValue(matrix, 0);
934     EXPECT_EQ(val, 1);
935 
936     // 4. Free memory
937     OH_Drawing_MatrixDestroy(matrix);
938     OH_Drawing_CanvasDestroy(canvas);
939 }
940 
941 /*
942  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3501
943  * @tc.name: testCanvasSetMatrixNull
944  * @tc.desc: test for testCanvasSetMatrixNull.
945  * @tc.size  : SmallTest
946  * @tc.type  : Function
947  * @tc.level : Level 3
948  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasSetMatrixNull, TestSize.Level3)949 HWTEST_F(DrawingNativeCanvasTest, testCanvasSetMatrixNull, TestSize.Level3) {
950     // 1. OH_Drawing_CanvasCreate
951     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
952     // 2. OH_Drawing_MatrixCreate
953     OH_Drawing_Matrix *matrix = OH_Drawing_MatrixCreate();
954     OH_Drawing_MatrixSetMatrix(matrix, 1, 0, 0, 0, -1, 0, 0, 0, 1);
955     // 3. OH_Drawing_CanvasSetMatrix with the first parameter as null
956     OH_Drawing_CanvasSetMatrix(nullptr, matrix);
957     // 4. OH_Drawing_CanvasSetMatrix with the second parameter as null
958     OH_Drawing_CanvasSetMatrix(canvas, nullptr);
959     // 5. Free memory
960     OH_Drawing_MatrixDestroy(matrix);
961     OH_Drawing_CanvasDestroy(canvas);
962 }
963 
964 /*
965  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3502
966  * @tc.name: testCanvasSetMatrixMultipleCalls
967  * @tc.desc: test for testCanvasSetMatrixMultipleCalls.
968  * @tc.size  : SmallTest
969  * @tc.type  : Function
970  * @tc.level : Level 3
971  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasSetMatrixMultipleCalls, TestSize.Level3)972 HWTEST_F(DrawingNativeCanvasTest, testCanvasSetMatrixMultipleCalls, TestSize.Level3) {
973     // 1. OH_Drawing_CanvasCreate
974     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
975     // 2. OH_Drawing_MatrixCreate
976     OH_Drawing_Matrix *matrix = OH_Drawing_MatrixCreate();
977     OH_Drawing_MatrixSetMatrix(matrix, 1, 0, 0, 0, -1, 0, 0, 0, 1);
978     // 3. Call OH_Drawing_CanvasSetMatrix 10 times, and after each call, call OH_Drawing_MatrixGetValue to get the
979     // matrix information
980     for (int i = 0; i < 10; i++) {
981         OH_Drawing_CanvasSetMatrix(canvas, matrix);
982         float val = OH_Drawing_MatrixGetValue(matrix, 0);
983         EXPECT_EQ(val, 1);
984     }
985     // 4. Free memory
986     OH_Drawing_MatrixDestroy(matrix);
987     OH_Drawing_CanvasDestroy(canvas);
988 }
989 
990 /*
991  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3503
992  * @tc.name: testCanvasSetMatrixInputDestroyed
993  * @tc.desc: test for testCanvasSetMatrixInputDestroyed.
994  * @tc.size  : SmallTest
995  * @tc.type  : Function
996  * @tc.level : Level 3
997  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasSetMatrixInputDestroyed, TestSize.Level3)998 HWTEST_F(DrawingNativeCanvasTest, testCanvasSetMatrixInputDestroyed, TestSize.Level3) {
999     // Deprecated
1000 }
1001 
1002 /*
1003  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3600
1004  * @tc.name: testCanvasResetMatrixNormal
1005  * @tc.desc: test for testCanvasResetMatrixNormal.
1006  * @tc.size  : SmallTest
1007  * @tc.type  : Function
1008  * @tc.level : Level 0
1009  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasResetMatrixNormal, TestSize.Level0)1010 HWTEST_F(DrawingNativeCanvasTest, testCanvasResetMatrixNormal, TestSize.Level0) {
1011     // 1. Call OH_Drawing_CanvasCreate to create a canvas object
1012     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1013     // 2. Call OH_Drawing_CanvasResetMatrix
1014     OH_Drawing_CanvasResetMatrix(canvas);
1015     // 3. Free memory
1016     OH_Drawing_CanvasDestroy(canvas);
1017 }
1018 
1019 /*
1020  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3601
1021  * @tc.name: testCanvasResetMatrixNull
1022  * @tc.desc: test for testCanvasResetMatrixNull.
1023  * @tc.size  : SmallTest
1024  * @tc.type  : Function
1025  * @tc.level : Level 3
1026  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasResetMatrixNull, TestSize.Level3)1027 HWTEST_F(DrawingNativeCanvasTest, testCanvasResetMatrixNull, TestSize.Level3) {
1028     // 1. Call OH_Drawing_CanvasResetMatrix with a null parameter
1029     OH_Drawing_CanvasResetMatrix(nullptr);
1030 }
1031 
1032 /*
1033  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3603
1034  * @tc.name: testCanvasResetMatrixMultipleCalls
1035  * @tc.desc: test for testCanvasResetMatrixMultipleCalls.
1036  * @tc.size  : SmallTest
1037  * @tc.type  : Function
1038  * @tc.level : Level 3
1039  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasResetMatrixMultipleCalls, TestSize.Level3)1040 HWTEST_F(DrawingNativeCanvasTest, testCanvasResetMatrixMultipleCalls, TestSize.Level3) {
1041     // 1. Call OH_Drawing_CanvasCreate to create a canvas object
1042     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1043     // 2. Call OH_Drawing_MatrixCreate
1044     OH_Drawing_Matrix *matrix = OH_Drawing_MatrixCreate();
1045     OH_Drawing_MatrixSetMatrix(matrix, 1, 0, 0, 0, -1, 0, 0, 0, 1);
1046     // 3. Call OH_Drawing_CanvasSetMatrix 10 times, call OH_Drawing_CanvasResetMatrix 10 times, and get matrix
1047     // information using OH_Drawing_MatrixGetValue
1048     for (int i = 0; i < 10; i++) {
1049         OH_Drawing_CanvasSetMatrix(canvas, matrix);
1050     }
1051     for (int i = 0; i < 10; i++) {
1052         OH_Drawing_CanvasResetMatrix(canvas);
1053     }
1054     // 4. Call OH_Drawing_CanvasSetMatrix, OH_Drawing_CanvasResetMatrix, and get matrix information using
1055     // OH_Drawing_MatrixGetValue
1056     OH_Drawing_CanvasSetMatrix(canvas, matrix);
1057     OH_Drawing_CanvasResetMatrix(canvas);
1058     float val = OH_Drawing_MatrixGetValue(matrix, 0);
1059     EXPECT_EQ(val, 1);
1060     // 5. Repeat steps 4 for 10 times
1061     for (int i = 0; i < 10; i++) {
1062         OH_Drawing_CanvasSetMatrix(canvas, matrix);
1063         OH_Drawing_CanvasResetMatrix(canvas);
1064         EXPECT_EQ(OH_Drawing_MatrixGetValue(matrix, 0), 1);
1065     }
1066     // 6. Free memory
1067     OH_Drawing_MatrixDestroy(matrix);
1068     OH_Drawing_CanvasDestroy(canvas);
1069 }
1070 
1071 /*
1072  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3700
1073  * @tc.name: testCanvasDrawImageRectWithSrcNormal
1074  * @tc.desc: test for testCanvasDrawImageRectWithSrcNormal.
1075  * @tc.size  : SmallTest
1076  * @tc.type  : Function
1077  * @tc.level : Level 0
1078  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawImageRectWithSrcNormal, TestSize.Level0)1079 HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawImageRectWithSrcNormal, TestSize.Level0) {
1080     // 1. Call OH_Drawing_CanvasCreate to create a canvas object
1081     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1082     EXPECT_NE(canvas, nullptr);
1083     // 2. Call OH_Drawing_ImageCreate to create an image object
1084     OH_Drawing_Image *image = OH_Drawing_ImageCreate();
1085     EXPECT_NE(image, nullptr);
1086     // 3. Call OH_Drawing_RectCreate to create a rectangle object
1087     OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
1088     // 4. Call OH_Drawing_RectCreate to create a rectangle object
1089     OH_Drawing_Rect *rect2 = OH_Drawing_RectCreate(0, 0, 100, 100);
1090     // 5. Call OH_Drawing_SamplingOptionsCreate to create a sampling options object
1091     OH_Drawing_SamplingOptions *options = OH_Drawing_SamplingOptionsCreate(OH_Drawing_FilterMode::FILTER_MODE_NEAREST,
1092                                                                            OH_Drawing_MipmapMode::MIPMAP_MODE_NEAREST);
1093     EXPECT_NE(options, nullptr);
1094     // 6. Call OH_Drawing_CanvasDrawImageRectWithSrc with the sixth parameter iterating through the enumeration
1095     OH_Drawing_CanvasDrawImageRectWithSrc(canvas, image, rect, rect2, options, STRICT_SRC_RECT_CONSTRAINT);
1096     OH_Drawing_CanvasDrawImageRectWithSrc(canvas, image, rect, rect2, options, FAST_SRC_RECT_CONSTRAINT);
1097     // 7. Free memory
1098     OH_Drawing_RectDestroy(rect);
1099     OH_Drawing_RectDestroy(rect2);
1100     OH_Drawing_SamplingOptionsDestroy(options);
1101     OH_Drawing_ImageDestroy(image);
1102     OH_Drawing_CanvasDestroy(canvas);
1103 }
1104 
1105 /*
1106  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3701
1107  * @tc.name: testCanvasDrawImageRectWithSrcNull
1108  * @tc.desc: test for testCanvasDrawImageRectWithSrcNull.
1109  * @tc.size  : SmallTest
1110  * @tc.type  : Function
1111  * @tc.level : Level 3
1112  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawImageRectWithSrcNull, TestSize.Level3)1113 HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawImageRectWithSrcNull, TestSize.Level3) {
1114     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1115     EXPECT_NE(canvas, nullptr);
1116     OH_Drawing_Image *image = OH_Drawing_ImageCreate();
1117     EXPECT_NE(image, nullptr);
1118     OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
1119     OH_Drawing_Rect *rect2 = OH_Drawing_RectCreate(0, 0, 100, 100);
1120     OH_Drawing_SamplingOptions *options = OH_Drawing_SamplingOptionsCreate(OH_Drawing_FilterMode::FILTER_MODE_NEAREST,
1121                                                                            OH_Drawing_MipmapMode::MIPMAP_MODE_NEAREST);
1122     // 1. Call OH_Drawing_CanvasDrawImageRectWithSrc with the first parameter being nullptr
1123     OH_Drawing_CanvasDrawImageRectWithSrc(nullptr, image, rect, rect2, options, STRICT_SRC_RECT_CONSTRAINT);
1124     // 2. Call OH_Drawing_CanvasDrawImageRectWithSrc with the second parameter being nullptr
1125     OH_Drawing_CanvasDrawImageRectWithSrc(canvas, nullptr, rect, rect2, options, STRICT_SRC_RECT_CONSTRAINT);
1126     // 3. Call OH_Drawing_CanvasDrawImageRectWithSrc with the third parameter being nullptr
1127     OH_Drawing_CanvasDrawImageRectWithSrc(canvas, image, nullptr, rect2, options, STRICT_SRC_RECT_CONSTRAINT);
1128     // 4. Call OH_Drawing_CanvasDrawImageRectWithSrc with the fourth parameter being nullptr
1129     OH_Drawing_CanvasDrawImageRectWithSrc(canvas, image, rect, nullptr, options, STRICT_SRC_RECT_CONSTRAINT);
1130     // 5. Call OH_Drawing_CanvasDrawImageRectWithSrc with the fifth parameter being nullptr
1131     OH_Drawing_CanvasDrawImageRectWithSrc(canvas, image, rect, rect2, nullptr, STRICT_SRC_RECT_CONSTRAINT);
1132     // 6. Free memory
1133     OH_Drawing_RectDestroy(rect);
1134     OH_Drawing_RectDestroy(rect2);
1135     OH_Drawing_SamplingOptionsDestroy(options);
1136     OH_Drawing_ImageDestroy(image);
1137     OH_Drawing_CanvasDestroy(canvas);
1138 }
1139 
1140 /*
1141  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3800
1142  * @tc.name: testCanvasDrawImageRectNormal
1143  * @tc.desc: test for testCanvasDrawImageRectNormal.
1144  * @tc.size  : SmallTest
1145  * @tc.type  : Function
1146  * @tc.level : Level 0
1147  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawImageRectNormal, TestSize.Level0)1148 HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawImageRectNormal, TestSize.Level0) {
1149     // 1. Create a canvas object using OH_Drawing_CanvasCreate
1150     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1151     // 2. Create an image object using OH_Drawing_ImageCreate
1152     OH_Drawing_Image *image = OH_Drawing_ImageCreate();
1153     // 3. Create a rectangle object using OH_Drawing_RectCreate
1154     OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
1155     // 4. Create a sampling options object using OH_Drawing_SamplingOptionsCreate
1156     OH_Drawing_SamplingOptions *options = OH_Drawing_SamplingOptionsCreate(OH_Drawing_FilterMode::FILTER_MODE_NEAREST,
1157                                                                            OH_Drawing_MipmapMode::MIPMAP_MODE_NEAREST);
1158     // 5. Call OH_Drawing_CanvasDrawImageRect
1159     OH_Drawing_CanvasDrawImageRect(canvas, image, rect, options);
1160     // 6. Free memory
1161     OH_Drawing_RectDestroy(rect);
1162     OH_Drawing_SamplingOptionsDestroy(options);
1163     OH_Drawing_ImageDestroy(image);
1164     OH_Drawing_CanvasDestroy(canvas);
1165 }
1166 
1167 /*
1168  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3801
1169  * @tc.name: testCanvasDrawImageRectNull
1170  * @tc.desc: test for testCanvasDrawImageRectNull.
1171  * @tc.size  : SmallTest
1172  * @tc.type  : Function
1173  * @tc.level : Level 3
1174  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawImageRectNull, TestSize.Level3)1175 HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawImageRectNull, TestSize.Level3) {
1176     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1177     OH_Drawing_Image *image = OH_Drawing_ImageCreate();
1178     OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
1179     OH_Drawing_SamplingOptions *options = OH_Drawing_SamplingOptionsCreate(OH_Drawing_FilterMode::FILTER_MODE_NEAREST,
1180                                                                            OH_Drawing_MipmapMode::MIPMAP_MODE_NEAREST);
1181     // 1. Call OH_Drawing_CanvasDrawImageRect with the first parameter as null
1182     OH_Drawing_CanvasDrawImageRect(nullptr, image, rect, options);
1183     // 2. Call OH_Drawing_CanvasDrawImageRect with the second parameter as null
1184     OH_Drawing_CanvasDrawImageRect(canvas, nullptr, rect, options);
1185     // 3. Call OH_Drawing_CanvasDrawImageRect with the third parameter as null
1186     OH_Drawing_CanvasDrawImageRect(canvas, image, nullptr, options);
1187     // 4. Call OH_Drawing_CanvasDrawImageRect with the fourth parameter as null
1188     OH_Drawing_CanvasDrawImageRect(canvas, image, rect, nullptr);
1189     // 5. Free memory
1190     OH_Drawing_RectDestroy(rect);
1191     OH_Drawing_SamplingOptionsDestroy(options);
1192     OH_Drawing_ImageDestroy(image);
1193     OH_Drawing_CanvasDestroy(canvas);
1194 }
1195 
1196 /*
1197  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3900
1198  * @tc.name: testCanvasDrawVerticesNormal
1199  * @tc.desc: test for testCanvasDrawVerticesNormal.
1200  * @tc.size  : SmallTest
1201  * @tc.type  : Function
1202  * @tc.level : Level 0
1203  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawVerticesNormal, TestSize.Level0)1204 HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawVerticesNormal, TestSize.Level0) {
1205     OH_Drawing_Point2D point_one = {0, 0};
1206     OH_Drawing_Point2D point_two = {100, 100};
1207     OH_Drawing_Point2D point_three = {300, 100};
1208     OH_Drawing_Point2D points_vertices[3] = {point_one, point_two, point_three};
1209 
1210     OH_Drawing_Point2D texs_one = {0, 0};
1211     OH_Drawing_Point2D texs_two = {1, 1};
1212     OH_Drawing_Point2D texs_three = {2, 0};
1213     OH_Drawing_Point2D texs_vertices[3] = {texs_one, texs_two, texs_three};
1214     uint32_t colors[3] = {0xFFFF0000, 0xFFFF0000, 0xFFFF0000};
1215     uint16_t indices[3] = {0, 1, 2};
1216     // 1. Call OH_Drawing_CanvasCreate to create a canvas object
1217     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1218     // 2. Call OH_Drawing_CanvasDrawVertices with the second parameter iterating through the enum
1219     OH_Drawing_VertexMode mode[] = {VERTEX_MODE_TRIANGLES, VERTEX_MODE_TRIANGLES_STRIP, VERTEX_MODE_TRIANGLE_FAN};
1220     for (int i = 0; i < 3; i++) {
1221         OH_Drawing_CanvasDrawVertices(canvas, mode[i], 3, points_vertices, texs_vertices, colors, 3, indices,
1222                                       BLEND_MODE_COLOR);
1223     }
1224     // 3. Call OH_Drawing_CanvasDrawVertices with the ninth parameter iterating through the enum
1225     OH_Drawing_BlendMode blendMode[] = {
1226         BLEND_MODE_CLEAR,      BLEND_MODE_SRC,        BLEND_MODE_DST,         BLEND_MODE_SRC_OVER,
1227         BLEND_MODE_DST_OVER,   BLEND_MODE_SRC_IN,     BLEND_MODE_DST_IN,      BLEND_MODE_SRC_OUT,
1228         BLEND_MODE_DST_OUT,    BLEND_MODE_SRC_ATOP,   BLEND_MODE_DST_ATOP,    BLEND_MODE_XOR,
1229         BLEND_MODE_PLUS,       BLEND_MODE_MODULATE,   BLEND_MODE_SCREEN,      BLEND_MODE_OVERLAY,
1230         BLEND_MODE_DARKEN,     BLEND_MODE_LIGHTEN,    BLEND_MODE_COLOR_DODGE, BLEND_MODE_COLOR_BURN,
1231         BLEND_MODE_HARD_LIGHT, BLEND_MODE_SOFT_LIGHT, BLEND_MODE_DIFFERENCE,  BLEND_MODE_EXCLUSION,
1232         BLEND_MODE_MULTIPLY,   BLEND_MODE_HUE,        BLEND_MODE_SATURATION,  BLEND_MODE_COLOR,
1233         BLEND_MODE_LUMINOSITY,
1234     };
1235     for (int i = 0; i < 30; i++) {
1236         OH_Drawing_CanvasDrawVertices(canvas, VERTEX_MODE_TRIANGLES, 3, points_vertices, texs_vertices, colors, 3,
1237                                       indices, blendMode[i]);
1238     }
1239     // 4. Free memory
1240     OH_Drawing_CanvasDestroy(canvas);
1241 }
1242 
1243 /*
1244  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3901
1245  * @tc.name: testCanvasDrawVerticesNull
1246  * @tc.desc: test for testCanvasDrawVerticesNull.
1247  * @tc.size  : SmallTest
1248  * @tc.type  : Function
1249  * @tc.level : Level 3
1250  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawVerticesNull, TestSize.Level3)1251 HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawVerticesNull, TestSize.Level3) {
1252     OH_Drawing_Point2D point_one = {0, 0};
1253     OH_Drawing_Point2D point_two = {100, 100};
1254     OH_Drawing_Point2D point_three = {300, 100};
1255     OH_Drawing_Point2D points_vertices[3] = {point_one, point_two, point_three};
1256 
1257     OH_Drawing_Point2D texs_one = {0, 0};
1258     OH_Drawing_Point2D texs_two = {1, 1};
1259     OH_Drawing_Point2D texs_three = {2, 0};
1260     OH_Drawing_Point2D texs_vertices[3] = {texs_one, texs_two, texs_three};
1261     uint32_t colors[3] = {0xFFFF0000, 0xFFFF0000, 0xFFFF0000};
1262     uint16_t indices[3] = {0, 1, 2};
1263 
1264     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1265 
1266     // 1. Call OH_Drawing_CanvasDrawVertices with the first parameter as nullptr
1267     OH_Drawing_CanvasDrawVertices(nullptr, VERTEX_MODE_TRIANGLES, 3, points_vertices, texs_vertices, colors, 3, indices,
1268                                   BLEND_MODE_COLOR);
1269     // 2. Call OH_Drawing_CanvasDrawVertices with the third parameter as 0
1270     OH_Drawing_CanvasDrawVertices(canvas, VERTEX_MODE_TRIANGLES, 0, points_vertices, texs_vertices, colors, 3, indices,
1271                                   BLEND_MODE_COLOR);
1272     // 3. Call OH_Drawing_CanvasDrawVertices with the fourth parameter as nullptr
1273     OH_Drawing_CanvasDrawVertices(canvas, VERTEX_MODE_TRIANGLES, 3, nullptr, texs_vertices, colors, 3, indices,
1274                                   BLEND_MODE_COLOR);
1275     // 4. Call OH_Drawing_CanvasDrawVertices with the fifth parameter as nullptr
1276     OH_Drawing_CanvasDrawVertices(canvas, VERTEX_MODE_TRIANGLES, 3, points_vertices, nullptr, colors, 3, indices,
1277                                   BLEND_MODE_COLOR);
1278     // 5. Call OH_Drawing_CanvasDrawVertices with the sixth parameter as nullptr
1279     OH_Drawing_CanvasDrawVertices(canvas, VERTEX_MODE_TRIANGLES, 3, points_vertices, texs_vertices, nullptr, 3, indices,
1280                                   BLEND_MODE_COLOR);
1281     // 6. Call OH_Drawing_CanvasDrawVertices with the seventh parameter as 0
1282     OH_Drawing_CanvasDrawVertices(canvas, VERTEX_MODE_TRIANGLES, 3, points_vertices, texs_vertices, colors, 0, indices,
1283                                   BLEND_MODE_COLOR);
1284     // 7. Call OH_Drawing_CanvasDrawVertices with the eighth parameter as nullptr
1285     OH_Drawing_CanvasDrawVertices(canvas, VERTEX_MODE_TRIANGLES, 3, points_vertices, texs_vertices, colors, 3, nullptr,
1286                                   BLEND_MODE_COLOR);
1287     // 8. Free memory
1288     OH_Drawing_CanvasDestroy(canvas);
1289 }
1290 
1291 /*
1292  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3902
1293  * @tc.name: testCanvasDrawVerticesAbnormal
1294  * @tc.desc: test for testCanvasDrawVerticesAbnormal.
1295  * @tc.size  : SmallTest
1296  * @tc.type  : Function
1297  * @tc.level : Level 3
1298  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawVerticesAbnormal, TestSize.Level3)1299 HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawVerticesAbnormal, TestSize.Level3) {
1300     // 1. Create a canvas object by calling OH_Drawing_CanvasCreate
1301     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1302 
1303     // 2. Call OH_Drawing_CanvasDrawVertices with a floating-point number as the third parameter
1304     // Compilation error, cannot pass a floating-point number
1305 
1306     // 3. Call OH_Drawing_CanvasDrawVertices with a floating-point number as the seventh parameter
1307     // Compilation error, cannot pass a floating-point number
1308 
1309     // 4. Free memory
1310     OH_Drawing_CanvasDestroy(canvas);
1311 }
1312 
1313 /*
1314  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_3903
1315  * @tc.name: testCanvasDrawVerticesMaximum
1316  * @tc.desc: test for testCanvasDrawVerticesMaximum.
1317  * @tc.size  : SmallTest
1318  * @tc.type  : Function
1319  * @tc.level : Level 3
1320  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawVerticesMaximum, TestSize.Level3)1321 HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawVerticesMaximum, TestSize.Level3) {
1322     // 1. Create a canvas object by calling OH_Drawing_CanvasCreate
1323     OH_Drawing_Point2D point_one = {0, 0};
1324     OH_Drawing_Point2D point_two = {100, 100};
1325     OH_Drawing_Point2D point_three = {300, 100};
1326     OH_Drawing_Point2D points_vertices[3] = {point_one, point_two, point_three};
1327 
1328     OH_Drawing_Point2D texs_one = {0, 0};
1329     OH_Drawing_Point2D texs_two = {1, 1};
1330     OH_Drawing_Point2D texs_three = {2, 0};
1331     OH_Drawing_Point2D texs_vertices[3] = {texs_one, texs_two, texs_three};
1332     uint32_t colors[3] = {0xFFFF0000, 0xFFFF0000, 0xFFFF0000};
1333     uint16_t indices[3] = {0, 1, 2};
1334 
1335     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1336 
1337     if (0) {
1338         // todo cpp crash
1339         // 2. Call OH_Drawing_CanvasDrawVertices with the third parameter as the maximum value 0x7FFFFFFF
1340         OH_Drawing_CanvasDrawVertices(canvas, VERTEX_MODE_TRIANGLES, 0x7FFFFFFF, points_vertices, texs_vertices, colors,
1341                                       3, indices, BLEND_MODE_COLOR);
1342         // 3. Call OH_Drawing_CanvasDrawVertices with the seventh parameter as the maximum value 0x7FFFFFFF
1343         OH_Drawing_CanvasDrawVertices(canvas, VERTEX_MODE_TRIANGLES, 3, points_vertices, texs_vertices, colors,
1344                                       0x7FFFFFFF, indices, BLEND_MODE_COLOR);
1345     }
1346 
1347     // 4. Free memory
1348     OH_Drawing_CanvasDestroy(canvas);
1349 }
1350 
1351 /*
1352  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4000
1353  * @tc.name: testCanvasReadPixelsNormal
1354  * @tc.desc: test for testCanvasReadPixelsNormal.
1355  * @tc.size  : SmallTest
1356  * @tc.type  : Function
1357  * @tc.level : Level 0
1358  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasReadPixelsNormal, TestSize.Level0)1359 HWTEST_F(DrawingNativeCanvasTest, testCanvasReadPixelsNormal, TestSize.Level0) {
1360     // 1. Create a canvas object by calling OH_Drawing_CanvasCreate
1361     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1362     // 2. Call OH_Drawing_CanvasReadPixels
1363     OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
1364     OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
1365     constexpr uint32_t width = 200;
1366     constexpr uint32_t height = 200;
1367     OH_Drawing_BitmapBuild(bitmap, width, height, &cFormat);
1368     void *pixels = OH_Drawing_BitmapGetPixels(bitmap);
1369     OH_Drawing_Image_Info imageInfo;
1370     OH_Drawing_CanvasReadPixels(canvas, &imageInfo, pixels, 0, 0, 0);
1371     // 3. Free memory
1372     OH_Drawing_BitmapDestroy(bitmap);
1373     OH_Drawing_CanvasDestroy(canvas);
1374 }
1375 
1376 /*
1377  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4001
1378  * @tc.name: testCanvasReadPixelsNull
1379  * @tc.desc: test for testCanvasReadPixelsNull.
1380  * @tc.size  : SmallTest
1381  * @tc.type  : Function
1382  * @tc.level : Level 3
1383  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasReadPixelsNull, TestSize.Level3)1384 HWTEST_F(DrawingNativeCanvasTest, testCanvasReadPixelsNull, TestSize.Level3) {
1385     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1386     // 1. Call OH_Drawing_CanvasReadPixels with the first parameter as nullptr
1387     OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
1388     OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
1389     constexpr uint32_t width = 200;
1390     constexpr uint32_t height = 200;
1391     OH_Drawing_BitmapBuild(bitmap, width, height, &cFormat);
1392     void *pixels = OH_Drawing_BitmapGetPixels(bitmap);
1393     OH_Drawing_Image_Info imageInfo;
1394     OH_Drawing_CanvasReadPixels(nullptr, &imageInfo, pixels, 0, 0, 0);
1395     // 2. Call OH_Drawing_CanvasReadPixels with the second parameter as nullptr
1396     OH_Drawing_CanvasReadPixels(canvas, nullptr, pixels, 0, 0, 0);
1397     // 3. Call OH_Drawing_CanvasReadPixels with the third parameter as nullptr
1398     OH_Drawing_CanvasReadPixels(canvas, &imageInfo, nullptr, 0, 0, 0);
1399     // 4. Free memory
1400     OH_Drawing_BitmapDestroy(bitmap);
1401     OH_Drawing_CanvasDestroy(canvas);
1402 }
1403 
1404 /*
1405  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4002
1406  * @tc.name: testCanvasReadPixelsMismatch
1407  * @tc.desc: test for testCanvasReadPixelsMismatch.
1408  * @tc.size  : SmallTest
1409  * @tc.type  : Function
1410  * @tc.level : Level 3
1411  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasReadPixelsMismatch, TestSize.Level3)1412 HWTEST_F(DrawingNativeCanvasTest, testCanvasReadPixelsMismatch, TestSize.Level3) {
1413     // Deprecated
1414 }
1415 
1416 /*
1417  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4003
1418  * @tc.name: testCanvasReadPixelsAbnormal
1419  * @tc.desc: test for testCanvasReadPixelsAbnormal.
1420  * @tc.size  : SmallTest
1421  * @tc.type  : Function
1422  * @tc.level : Level 3
1423  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasReadPixelsAbnormal, TestSize.Level3)1424 HWTEST_F(DrawingNativeCanvasTest, testCanvasReadPixelsAbnormal, TestSize.Level3) {
1425     // 1. Create a canvas object by calling OH_Drawing_CanvasCreate
1426     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1427     // 2. Call OH_Drawing_CanvasReadPixels with the fourth parameter as a negative number or a floating-point number
1428     OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
1429     OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
1430     constexpr uint32_t width = 200;
1431     constexpr uint32_t height = 200;
1432     OH_Drawing_BitmapBuild(bitmap, width, height, &cFormat);
1433     void *pixels = OH_Drawing_BitmapGetPixels(bitmap);
1434     OH_Drawing_Image_Info imageInfo;
1435     OH_Drawing_CanvasReadPixels(canvas, &imageInfo, pixels, -1, 0, 0);
1436     OH_Drawing_CanvasReadPixels(canvas, &imageInfo, pixels, 1.0f, 0, 0);
1437     // 3. Call OH_Drawing_CanvasReadPixels with the fifth parameter as a floating-point number
1438     OH_Drawing_CanvasReadPixels(canvas, &imageInfo, pixels, 0, 1.0f, 0);
1439     // 4. Call OH_Drawing_CanvasReadPixels with the sixth parameter as a floating-point number
1440     OH_Drawing_CanvasReadPixels(canvas, &imageInfo, pixels, 0, 0, 1.0f);
1441     // 5. Free memory
1442     OH_Drawing_BitmapDestroy(bitmap);
1443     OH_Drawing_CanvasDestroy(canvas);
1444 }
1445 
1446 /*
1447  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4004
1448  * @tc.name: testCanvasReadPixelsMaximum
1449  * @tc.desc: test for testCanvasReadPixelsMaximum.
1450  * @tc.size  : SmallTest
1451  * @tc.type  : Function
1452  * @tc.level : Level 3
1453  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasReadPixelsMaximum, TestSize.Level3)1454 HWTEST_F(DrawingNativeCanvasTest, testCanvasReadPixelsMaximum, TestSize.Level3) {
1455     // 1. Create a canvas object by calling OH_Drawing_CanvasCreate
1456     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1457     // 2. Call OH_Drawing_CanvasReadPixels with the fourth parameter as the maximum value 0xFFFFFFFF
1458     OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
1459     OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
1460     constexpr uint32_t width = 200;
1461     constexpr uint32_t height = 200;
1462     OH_Drawing_BitmapBuild(bitmap, width, height, &cFormat);
1463     void *pixels = OH_Drawing_BitmapGetPixels(bitmap);
1464     OH_Drawing_Image_Info imageInfo;
1465     OH_Drawing_CanvasReadPixels(canvas, &imageInfo, pixels, 0xFFFFFFFF, 0, 0);
1466     // 3. Call OH_Drawing_CanvasReadPixels with the fifth parameter as the maximum value 0x7FFFFFFF
1467     OH_Drawing_CanvasReadPixels(canvas, &imageInfo, pixels, 0, 0x7FFFFFFF, 0);
1468     // 4. Call OH_Drawing_CanvasReadPixels with the sixth parameter as the maximum value 0x7FFFFFFF
1469     OH_Drawing_CanvasReadPixels(canvas, &imageInfo, pixels, 0, 0, 0x7FFFFFFF);
1470     // 5. Free memory
1471     OH_Drawing_BitmapDestroy(bitmap);
1472     OH_Drawing_CanvasDestroy(canvas);
1473 }
1474 
1475 /*
1476  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4005
1477  * @tc.name: testCanvasReadPixelsBoundary
1478  * @tc.desc: test for testCanvasReadPixelsBoundary.
1479  * @tc.size  : SmallTest
1480  * @tc.type  : Function
1481  * @tc.level : Level 0
1482  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasReadPixelsBoundary, TestSize.Level0)1483 HWTEST_F(DrawingNativeCanvasTest, testCanvasReadPixelsBoundary, TestSize.Level0) {
1484     // 1. Create a canvas object by calling OH_Drawing_CanvasCreate
1485     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1486     // 2. Call OH_Drawing_CanvasReadPixels
1487     OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
1488     OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
1489     constexpr uint32_t width = 4096;
1490     constexpr uint32_t height = 2160;
1491     OH_Drawing_BitmapBuild(bitmap, width, height, &cFormat);
1492     void *pixels = OH_Drawing_BitmapGetPixels(bitmap);
1493     OH_Drawing_Image_Info imageInfo;
1494     OH_Drawing_CanvasReadPixels(canvas, &imageInfo, pixels, 0, 0, 0);
1495     // 3. Free memory
1496     OH_Drawing_BitmapDestroy(bitmap);
1497     OH_Drawing_CanvasDestroy(canvas);
1498 }
1499 
1500 /*
1501  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4100
1502  * @tc.name: testCanvasReadPixelsToBitmapNormal
1503  * @tc.desc: test for testCanvasReadPixelsToBitmapNormal.
1504  * @tc.size  : SmallTest
1505  * @tc.type  : Function
1506  * @tc.level : Level 0
1507  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasReadPixelsToBitmapNormal, TestSize.Level0)1508 HWTEST_F(DrawingNativeCanvasTest, testCanvasReadPixelsToBitmapNormal, TestSize.Level0) {
1509     // 1. Create a canvas object by calling OH_Drawing_CanvasCreate
1510     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1511     // 2. Create a bitmap object by calling OH_Drawing_BitmapCreate
1512     OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
1513     // 3. Call OH_Drawing_CanvasReadPixelsToBitmap
1514     OH_Drawing_CanvasReadPixelsToBitmap(canvas, bitmap, 1, 1);
1515     // 4. Free memory
1516     OH_Drawing_BitmapDestroy(bitmap);
1517     OH_Drawing_CanvasDestroy(canvas);
1518 }
1519 
1520 /*
1521  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4101
1522  * @tc.name: testCanvasReadPixelsToBitmapNull
1523  * @tc.desc: test for testCanvasReadPixelsToBitmapNull.
1524  * @tc.size  : SmallTest
1525  * @tc.type  : Function
1526  * @tc.level : Level 3
1527  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasReadPixelsToBitmapNull, TestSize.Level3)1528 HWTEST_F(DrawingNativeCanvasTest, testCanvasReadPixelsToBitmapNull, TestSize.Level3) {
1529     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1530     OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
1531     // 1. Call OH_Drawing_CanvasReadPixelsToBitmap with the first parameter as null
1532     OH_Drawing_CanvasReadPixelsToBitmap(nullptr, bitmap, 1, 1);
1533     // 2. Call OH_Drawing_CanvasReadPixelsToBitmap with the second parameter as null
1534     OH_Drawing_CanvasReadPixelsToBitmap(canvas, nullptr, 1, 1);
1535     // 3. Call OH_Drawing_CanvasReadPixelsToBitmap with the third parameter as 0
1536     OH_Drawing_CanvasReadPixelsToBitmap(canvas, bitmap, 0, 1);
1537     // 4. Call OH_Drawing_CanvasReadPixelsToBitmap with the fourth parameter as 0
1538     OH_Drawing_CanvasReadPixelsToBitmap(canvas, bitmap, 1, 0);
1539     // 5. Free memory
1540     OH_Drawing_BitmapDestroy(bitmap);
1541     OH_Drawing_CanvasDestroy(canvas);
1542 }
1543 
1544 /*
1545  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4102
1546  * @tc.name: testCanvasReadPixelsToBitmapAbnormal
1547  * @tc.desc: test for testCanvasReadPixelsToBitmapAbnormal.
1548  * @tc.size  : SmallTest
1549  * @tc.type  : Function
1550  * @tc.level : Level 3
1551  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasReadPixelsToBitmapAbnormal, TestSize.Level3)1552 HWTEST_F(DrawingNativeCanvasTest, testCanvasReadPixelsToBitmapAbnormal, TestSize.Level3) {
1553     // 1. Create a canvas object by calling OH_Drawing_CanvasCreate
1554     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1555     // 2. Create a bitmap object by calling OH_Drawing_BitmapCreate
1556     OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
1557     // 3. Call OH_Drawing_CanvasReadPixelsToBitmap with the third parameter as a floating-point number
1558     OH_Drawing_CanvasReadPixelsToBitmap(canvas, bitmap, 1.0f, 0);
1559     // 4. Call OH_Drawing_CanvasReadPixelsToBitmap with the fourth parameter as a floating-point number
1560     OH_Drawing_CanvasReadPixelsToBitmap(canvas, bitmap, 1, 1.0f);
1561     // 5. Free memory
1562     OH_Drawing_BitmapDestroy(bitmap);
1563     OH_Drawing_CanvasDestroy(canvas);
1564 }
1565 
1566 /*
1567  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4103
1568  * @tc.name: testCanvasReadPixelsToBitmapMaximum
1569  * @tc.desc: test for testCanvasReadPixelsToBitmapMaximum.
1570  * @tc.size  : SmallTest
1571  * @tc.type  : Function
1572  * @tc.level : Level 3
1573  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasReadPixelsToBitmapMaximum, TestSize.Level3)1574 HWTEST_F(DrawingNativeCanvasTest, testCanvasReadPixelsToBitmapMaximum, TestSize.Level3) {
1575     // 1. Create a canvas object by calling OH_Drawing_CanvasCreate
1576     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1577     // 2. Create a bitmap object by calling OH_Drawing_BitmapCreate
1578     OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
1579     // 3. Call OH_Drawing_CanvasReadPixelsToBitmap with the third parameter set to the maximum value 0x7FFFFFFF
1580     OH_Drawing_CanvasReadPixelsToBitmap(canvas, bitmap, 0x7FFFFFFF, 0);
1581     // 4. Call OH_Drawing_CanvasReadPixelsToBitmap with the fourth parameter set to the maximum value 0x7FFFFFFF
1582     OH_Drawing_CanvasReadPixelsToBitmap(canvas, bitmap, 1, 0x7FFFFFFF);
1583     // 5. Free memory
1584     OH_Drawing_BitmapDestroy(bitmap);
1585     OH_Drawing_CanvasDestroy(canvas);
1586 }
1587 /*
1588  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4104
1589  * @tc.name: testCanvasDrawSingleCharacter
1590  * @tc.desc: test for testCanvasDrawSingleCharacter.
1591  * @tc.size  : SmallTest
1592  * @tc.type  : Function
1593  * @tc.level : Level 1
1594  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawSingleCharacter, TestSize.Level1)1595 HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawSingleCharacter, TestSize.Level1)
1596 {
1597     // 1. Create a canvas object by calling OH_Drawing_CanvasCreate
1598     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1599     const char* strOne = "a";
1600     const char* strTwo = "你好";
1601     OH_Drawing_Font *font = OH_Drawing_FontCreate();
1602     EXPECT_NE(font, nullptr);
1603     float x = 0.f;
1604     float y = 0.f;
1605     EXPECT_EQ(OH_Drawing_CanvasDrawSingleCharacter(canvas, strOne, font, x, y), OH_DRAWING_SUCCESS);
1606     EXPECT_EQ(OH_Drawing_CanvasDrawSingleCharacter(canvas, strTwo, font, x, y), OH_DRAWING_SUCCESS);
1607     EXPECT_EQ(OH_Drawing_CanvasDrawSingleCharacter(nullptr, strOne, font, x, y), OH_DRAWING_ERROR_INVALID_PARAMETER);
1608     EXPECT_EQ(OH_Drawing_CanvasDrawSingleCharacter(canvas, nullptr, font, x, y), OH_DRAWING_ERROR_INVALID_PARAMETER);
1609     EXPECT_EQ(OH_Drawing_CanvasDrawSingleCharacter(canvas, strOne, nullptr, x, y),
1610         OH_DRAWING_ERROR_INVALID_PARAMETER);
1611     const char* strThree = "";
1612     EXPECT_EQ(OH_Drawing_CanvasDrawSingleCharacter(canvas, strThree, font, x, y), OH_DRAWING_ERROR_INVALID_PARAMETER);
1613     OH_Drawing_FontDestroy(font);
1614     OH_Drawing_CanvasDestroy(canvas);
1615 }
1616 
1617 /*
1618  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4200
1619  * @tc.name: testCanvasDrawSingleCharacterNormal
1620  * @tc.desc: test for testCanvasDrawSingleCharacterNormal.
1621  * @tc.size  : SmallTest
1622  * @tc.type  : Function
1623  * @tc.level : Level 0
1624  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawSingleCharacterNormal, TestSize.Level0)1625 HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawSingleCharacterNormal, TestSize.Level0) {
1626     //1. OH_Drawing_CanvasCreate
1627     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1628     //2. OH_Drawing_BrushCreate
1629     OH_Drawing_Brush *brush = OH_Drawing_BrushCreate();
1630     //3. OH_Drawing_BrushSetColor
1631     OH_Drawing_BrushSetColor(brush, 0xFFFFFFFF);
1632     //4. OH_Drawing_FontCreate
1633     OH_Drawing_Font *font = OH_Drawing_FontCreate();
1634     //5. OH_Drawing_FontSetTextSize
1635     const float textSize = 10.f;
1636     OH_Drawing_FontSetTextSize(font, textSize);
1637     //6. OH_Drawing_CanvasDrawSingleCharacter parameter is normal, where str is a single character,UTF-8 encoded, and
1638     // Chinese/English characters are passed
1639     float x = 0.f;
1640     float y = 0.f;
1641     const char* str = "a";
1642     const char* str1 = "我";
1643     OH_Drawing_CanvasDrawSingleCharacter(canvas, str, font, x, y);
1644     OH_Drawing_CanvasDrawSingleCharacter(canvas, str1, font, x, y);
1645     //7. OH_Drawing_CanvasDrawSingleCharacter parameters are entered normally, where str is a multi-character, UTF-8
1646     // encoded, and English/Chinese characters are in
1647     str = "abc";
1648     str1 = "你是谁";
1649     OH_Drawing_CanvasDrawSingleCharacter(canvas, str, font, x, y);
1650     OH_Drawing_CanvasDrawSingleCharacter(canvas, str1, font, x, y);
1651     //8. free memory
1652     OH_Drawing_CanvasDestroy(canvas);
1653     OH_Drawing_BrushDestroy(brush);
1654     OH_Drawing_FontDestroy(font);
1655 }
1656 
1657 /*
1658  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4201
1659  * @tc.name: testCanvasDrawSingleCharacterNull
1660  * @tc.desc: test for testCanvasDrawSingleCharacterNull.
1661  * @tc.size  : SmallTest
1662  * @tc.type  : Function
1663  * @tc.level : Level 3
1664  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawSingleCharacterNull, TestSize.Level3)1665 HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawSingleCharacterNull, TestSize.Level3) {
1666     //1. OH_Drawing_CanvasCreate
1667     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1668     //2. OH_Drawing_BrushCreate
1669     OH_Drawing_Brush *brush = OH_Drawing_BrushCreate();
1670     //3. OH_Drawing_BrushSetColor
1671     OH_Drawing_BrushSetColor(brush, 0xFFFFFFFF);
1672     //4. OH_Drawing_FontCreate
1673     OH_Drawing_Font *font = OH_Drawing_FontCreate();
1674     //5. OH_Drawing_FontSetTextSize
1675     const float textSize = 10.f;
1676     OH_Drawing_FontSetTextSize(font, textSize);
1677     //6. OH_Drawing_CanvasDrawSingleCharacter parameter canvas is empty
1678     float x = 0.f;
1679     float y = 0.f;
1680     const char *str = "a";
1681     OH_Drawing_CanvasDrawSingleCharacter(nullptr, str, font, x, y);
1682     //7. OH_Drawing_CanvasDrawSingleCharacter parameter str is empty
1683     str = "";
1684     OH_Drawing_CanvasDrawSingleCharacter(canvas, str, font, x, y);
1685     //8. OH_Drawing_CanvasDrawSingleCharacter parameter font is empty
1686     str = "a";
1687     OH_Drawing_CanvasDrawSingleCharacter(canvas, str, nullptr, x, y);
1688     //9. OH_Drawing_CanvasDrawSingleCharacter parameter str to 0 characters
1689     OH_Drawing_CanvasDrawSingleCharacter(canvas, str, font, x, y);
1690     //10.free memory
1691     OH_Drawing_CanvasDestroy(canvas);
1692     OH_Drawing_BrushDestroy(brush);
1693     OH_Drawing_FontDestroy(font);
1694 }
1695 
1696 /*
1697  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4300
1698  * @tc.name: testCanvasDrawPointNormal
1699  * @tc.desc: test for testCanvasDrawPointNormal.
1700  * @tc.size  : SmallTest
1701  * @tc.type  : Function
1702  * @tc.level : Level 0
1703  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawPointNormal, TestSize.Level0)1704 HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawPointNormal, TestSize.Level0) {
1705     //1. OH_Drawing_CanvasCreate
1706     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1707     //2. OH_Drawing_Point2D create an array of points
1708     OH_Drawing_Point2D texs_one = {0.0f, 0.0f};
1709     OH_Drawing_Point2D texs_two = {1.0f, 1.0f};
1710     OH_Drawing_Point2D texs_three = {2.0f, 2.0f};
1711     OH_Drawing_Point2D point_vertices[1] = {texs_one};
1712     for (int i = 0; i < 1; i++) {
1713         OH_Drawing_CanvasDrawPoint(canvas, &point_vertices[i]);
1714     }
1715     //3. OH_Drawing_Point2D create an array of multiple points
1716     OH_Drawing_Point2D texs_vertices[3] = {texs_one, texs_two, texs_three};
1717     for (int i = 0; i < 3; i++) {
1718         OH_Drawing_CanvasDrawPoint(canvas, &texs_vertices[i]);
1719     }
1720     //4. free memory
1721     OH_Drawing_CanvasDestroy(canvas);
1722 }
1723 
1724 /*
1725  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4301
1726  * @tc.name: testCanvasDrawPointNull
1727  * @tc.desc: test for testCanvasDrawPointNull.
1728  * @tc.size  : SmallTest
1729  * @tc.type  : Function
1730  * @tc.level : Level 3
1731  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawPointNull, TestSize.Level3)1732 HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawPointNull, TestSize.Level3) {
1733     //1. OH_Drawing_CanvasCreate
1734     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1735     //2. OH_Drawing_CanvasDrawPoint the first parameter is empty
1736     const OH_Drawing_Point2D point = {0.0f, 0.0f};
1737     OH_Drawing_CanvasDrawPoint(nullptr, &point);
1738     //3. OH_Drawing_CanvasDrawPoint the second parameter is empty
1739     OH_Drawing_CanvasDrawPoint(canvas, nullptr);
1740     //4.free memory
1741     OH_Drawing_CanvasDestroy(canvas);
1742 }
1743 
1744 /*
1745  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4302
1746  * @tc.name: testCanvasDrawPointMultipleCalls
1747  * @tc.desc: test for testCanvasDrawPointMultipleCalls.
1748  * @tc.size  : SmallTest
1749  * @tc.type  : Function
1750  * @tc.level : Level 3
1751  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawPointMultipleCalls, TestSize.Level3)1752 HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawPointMultipleCalls, TestSize.Level3) {
1753     //1. OH_Drawing_CanvasCreate
1754     OH_Drawing_Canvas *canvases[10];
1755     for (int i = 0; i < 10; i++) {
1756         canvases[i]= OH_Drawing_CanvasCreate();
1757     }
1758     //2. Call OH_Drawing_CanvasDrawPoint 10 times
1759     OH_Drawing_Point2D point1 = {0.0f, 0.0f};
1760     for (int i = 0; i < 10; i++) {
1761         OH_Drawing_CanvasDrawPoint(canvases[i], &point1);
1762     }
1763 }
1764 
1765 /*
1766  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4400
1767  * @tc.name: testCanvasDrawColorNormal
1768  * @tc.desc: test for testCanvasDrawColorNormal.
1769  * @tc.size  : SmallTest
1770  * @tc.type  : Function
1771  * @tc.level : Level 0
1772  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawColorNormal, TestSize.Level0)1773 HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawColorNormal, TestSize.Level0) {
1774     //1. OH_Drawing_CanvasCreate
1775     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1776     //2. OH_Drawing_CanvasDrawColor enumeration traversal
1777     uint32_t color[3] = {0xFFFF0000, 0xFFFF0000, 0xFFFF0000};
1778     OH_Drawing_BlendMode blendMode[] = {
1779         BLEND_MODE_CLEAR,      BLEND_MODE_SRC,        BLEND_MODE_DST,         BLEND_MODE_SRC_OVER,
1780         BLEND_MODE_DST_OVER,   BLEND_MODE_SRC_IN,     BLEND_MODE_DST_IN,      BLEND_MODE_SRC_OUT,
1781         BLEND_MODE_DST_OUT,    BLEND_MODE_SRC_ATOP,   BLEND_MODE_DST_ATOP,    BLEND_MODE_XOR,
1782         BLEND_MODE_PLUS,       BLEND_MODE_MODULATE,   BLEND_MODE_SCREEN,      BLEND_MODE_OVERLAY,
1783         BLEND_MODE_DARKEN,     BLEND_MODE_LIGHTEN,    BLEND_MODE_COLOR_DODGE, BLEND_MODE_COLOR_BURN,
1784         BLEND_MODE_HARD_LIGHT, BLEND_MODE_SOFT_LIGHT, BLEND_MODE_DIFFERENCE,  BLEND_MODE_EXCLUSION,
1785         BLEND_MODE_MULTIPLY,   BLEND_MODE_HUE,        BLEND_MODE_SATURATION,  BLEND_MODE_COLOR,
1786         BLEND_MODE_LUMINOSITY,
1787     };
1788     for (int i = 0; i < 29; i++) {
1789         for (int j = 0; j < 3; j++) {
1790             OH_Drawing_CanvasDrawColor(canvas, color[j], blendMode[i]);
1791         }
1792     }
1793 }
1794 
1795 /*
1796  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4401
1797  * @tc.name: testCanvasDrawColorNull
1798  * @tc.desc: test for testCanvasDrawColorNull.
1799  * @tc.size  : SmallTest
1800  * @tc.type  : Function
1801  * @tc.level : Level 3
1802  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawColorNull, TestSize.Level3)1803 HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawColorNull, TestSize.Level3) {
1804     //1. OH_Drawing_CanvasCreate
1805     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1806     //2. OH_Drawing_CanvasDrawColor with the first parameter as nullptr
1807     OH_Drawing_BlendMode blendMode[] = {
1808         BLEND_MODE_CLEAR,      BLEND_MODE_SRC,        BLEND_MODE_DST,         BLEND_MODE_SRC_OVER,
1809         BLEND_MODE_DST_OVER,   BLEND_MODE_SRC_IN,     BLEND_MODE_DST_IN,      BLEND_MODE_SRC_OUT,
1810         BLEND_MODE_DST_OUT,    BLEND_MODE_SRC_ATOP,   BLEND_MODE_DST_ATOP,    BLEND_MODE_XOR,
1811         BLEND_MODE_PLUS,       BLEND_MODE_MODULATE,   BLEND_MODE_SCREEN,      BLEND_MODE_OVERLAY,
1812         BLEND_MODE_DARKEN,     BLEND_MODE_LIGHTEN,    BLEND_MODE_COLOR_DODGE, BLEND_MODE_COLOR_BURN,
1813         BLEND_MODE_HARD_LIGHT, BLEND_MODE_SOFT_LIGHT, BLEND_MODE_DIFFERENCE,  BLEND_MODE_EXCLUSION,
1814         BLEND_MODE_MULTIPLY,   BLEND_MODE_HUE,        BLEND_MODE_SATURATION,  BLEND_MODE_COLOR,
1815         BLEND_MODE_LUMINOSITY,
1816     };
1817     uint32_t color = 0xFFFF0000;
1818     for (int i = 0; i < 29; i++) {
1819     OH_Drawing_CanvasDrawColor(nullptr, color, blendMode[i]);
1820     }
1821     //3. OH_Drawing_CanvasDrawColor with the first parameter as 0
1822     for (int i = 0; i < 29; i++) {
1823     OH_Drawing_CanvasDrawColor(canvas, 0, blendMode[i]);
1824     }
1825     //4. free memory
1826     OH_Drawing_CanvasDestroy(canvas);
1827 }
1828 
1829 /*
1830  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4402
1831  * @tc.name: testCanvasDrawColorMaximum
1832  * @tc.desc: test for testCanvasDrawColorMaximum.
1833  * @tc.size  : SmallTest
1834  * @tc.type  : Function
1835  * @tc.level : Level 3
1836  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawColorMaximum, TestSize.Level3)1837 HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawColorMaximum, TestSize.Level3) {
1838     //1. OH_Drawing_CanvasCreate
1839     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1840     //2. OH_Drawing_CanvasDrawColor with the second parameter set to the maximum value
1841     OH_Drawing_BlendMode blendMode[] = {
1842         BLEND_MODE_CLEAR,      BLEND_MODE_SRC,        BLEND_MODE_DST,         BLEND_MODE_SRC_OVER,
1843         BLEND_MODE_DST_OVER,   BLEND_MODE_SRC_IN,     BLEND_MODE_DST_IN,      BLEND_MODE_SRC_OUT,
1844         BLEND_MODE_DST_OUT,    BLEND_MODE_SRC_ATOP,   BLEND_MODE_DST_ATOP,    BLEND_MODE_XOR,
1845         BLEND_MODE_PLUS,       BLEND_MODE_MODULATE,   BLEND_MODE_SCREEN,      BLEND_MODE_OVERLAY,
1846         BLEND_MODE_DARKEN,     BLEND_MODE_LIGHTEN,    BLEND_MODE_COLOR_DODGE, BLEND_MODE_COLOR_BURN,
1847         BLEND_MODE_HARD_LIGHT, BLEND_MODE_SOFT_LIGHT, BLEND_MODE_DIFFERENCE,  BLEND_MODE_EXCLUSION,
1848         BLEND_MODE_MULTIPLY,   BLEND_MODE_HUE,        BLEND_MODE_SATURATION,  BLEND_MODE_COLOR,
1849         BLEND_MODE_LUMINOSITY,
1850     };
1851     uint32_t color = 0x00000000;
1852     for (int i = 0; i < 29; i++) {
1853         OH_Drawing_CanvasDrawColor(nullptr, color, blendMode[i]);
1854     }
1855     //3. free memory
1856     OH_Drawing_CanvasDestroy(canvas);
1857 }
1858 
1859 /*
1860  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4403
1861  * @tc.name: testCanvasDrawColorMultipleCalls
1862  * @tc.desc: test for testCanvasDrawColorMultipleCalls.
1863  * @tc.size  : SmallTest
1864  * @tc.type  : Function
1865  * @tc.level : Level 3
1866  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawColorMultipleCalls, TestSize.Level3)1867 HWTEST_F(DrawingNativeCanvasTest, testCanvasDrawColorMultipleCalls, TestSize.Level3) {
1868     //1. OH_Drawing_CanvasCreate
1869     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1870     //2. Call OH_Drawing_CanvasDrawColor 10 times
1871     uint32_t color = 0xFFFF0000;
1872     OH_Drawing_BlendMode blendMode[] = {
1873         BLEND_MODE_CLEAR,      BLEND_MODE_SRC,        BLEND_MODE_DST,         BLEND_MODE_SRC_OVER,
1874         BLEND_MODE_DST_OVER,   BLEND_MODE_SRC_IN,     BLEND_MODE_DST_IN,      BLEND_MODE_SRC_OUT,
1875         BLEND_MODE_DST_OUT,    BLEND_MODE_SRC_ATOP,
1876     };
1877     for (int i = 0; i < 10; i++) {
1878         OH_Drawing_CanvasDrawColor(canvas, color, blendMode[i]);
1879     }
1880     //3. free memory
1881     OH_Drawing_CanvasDestroy(canvas);
1882 }
1883 
1884 /*
1885  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4500
1886  * @tc.name: testCanvasIsClipEmptyNormal
1887  * @tc.desc: test for testCanvasIsClipEmptyNormal.
1888  * @tc.size  : SmallTest
1889  * @tc.type  : Function
1890  * @tc.level : Level 0
1891  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasIsClipEmptyNormal, TestSize.Level0)1892 HWTEST_F(DrawingNativeCanvasTest, testCanvasIsClipEmptyNormal, TestSize.Level0) {
1893     //1. OH_Drawing_RectCreate
1894     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1895     OH_Drawing_Rect  *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
1896     //2. OH_Drawing_RoundRectCreate
1897     OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, 1.0f, 1.0f);
1898     //3. OH_Drawing_CanvasClipRoundRect with the parameter clipOp set DIFFERENCE
1899     OH_Drawing_CanvasClipOp clipOp = {OH_Drawing_CanvasClipOp::DIFFERENCE};
1900     bool doAntiAlias[] = {true, false};
1901     for (int i = 0; i < 2; i++) {
1902         OH_Drawing_CanvasClipRoundRect(canvas, roundRect, clipOp, doAntiAlias[i]);
1903     }
1904     //4. OH_Drawing_CanvasIsClipEmpty
1905     bool isClipEmpty[] = {true, false};
1906     for (int i = 0; i < 2; i++) {
1907         OH_Drawing_CanvasIsClipEmpty(canvas, &isClipEmpty[i]);
1908     }
1909     //5. free memory
1910     OH_Drawing_CanvasDestroy(canvas);
1911     OH_Drawing_RectDestroy(rect);
1912     OH_Drawing_RoundRectDestroy(roundRect);
1913 }
1914 
1915 /*
1916  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4501
1917  * @tc.name: testCanvasIsClipEmptyNull
1918  * @tc.desc: test for testCanvasIsClipEmptyNull.
1919  * @tc.size  : SmallTest
1920  * @tc.type  : Function
1921  * @tc.level : Level 3
1922  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasIsClipEmptyNull, TestSize.Level3)1923 HWTEST_F(DrawingNativeCanvasTest, testCanvasIsClipEmptyNull, TestSize.Level3) {
1924     //1. OH_Drawing_RectCreate
1925     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1926     OH_Drawing_Rect  *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
1927     //2. OH_Drawing_RoundRectCreate
1928     OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, 1.0f, 1.0f);
1929     //3. OH_Drawing_CanvasClipRoundRect with the parameter clipOp set DIFFERENCE
1930     OH_Drawing_CanvasClipOp clipOp = {OH_Drawing_CanvasClipOp::DIFFERENCE};
1931     bool doAntiAlias[] = {true, false};
1932     for (int i = 0; i < 2; i++) {
1933         OH_Drawing_CanvasClipRoundRect(canvas, roundRect, clipOp, doAntiAlias[i]);
1934     }
1935     //4. OH_Drawing_CanvasIsClipEmpty with the first parameter as null
1936     bool isClipEmpty[] = {true, false};
1937     for (int i = 0; i < 2; i++) {
1938         OH_Drawing_CanvasIsClipEmpty(nullptr, &isClipEmpty[i]);
1939     }
1940     //5. OH_Drawing_CanvasIsClipEmpty with the second parameter as null
1941     OH_Drawing_CanvasIsClipEmpty(canvas, nullptr);
1942     //6. free memory
1943     OH_Drawing_CanvasDestroy(canvas);
1944     OH_Drawing_RectDestroy(rect);
1945     OH_Drawing_RoundRectDestroy(roundRect);
1946 }
1947 
1948 /*
1949  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4502
1950  * @tc.name: testCanvasIsClipEmptyMultipleCalls
1951  * @tc.desc: test for testCanvasIsClipEmptyMultipleCalls.
1952  * @tc.size  : SmallTest
1953  * @tc.type  : Function
1954  * @tc.level : Level 3
1955  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasIsClipEmptyMultipleCalls, TestSize.Level3)1956 HWTEST_F(DrawingNativeCanvasTest, testCanvasIsClipEmptyMultipleCalls, TestSize.Level3) {
1957     //1. OH_Drawing_RectCreate
1958     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
1959     OH_Drawing_Rect  *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
1960     //2. OH_Drawing_RoundRectCreate
1961     OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rect, 1.0f, 1.0f);
1962     //3. OH_Drawing_CanvasClipRoundRect with the parameter clipOp set DIFFERENCE
1963     OH_Drawing_CanvasClipOp clipOp = {OH_Drawing_CanvasClipOp::DIFFERENCE};
1964     bool doAntiAlias[] = {true, false};
1965     for (int i = 0; i < 2; i++) {
1966         OH_Drawing_CanvasClipRoundRect(canvas, roundRect, clipOp, doAntiAlias[i]);
1967     }
1968     //4. Call OH_Drawing_CanvasIsClipEmpty 10 times
1969     bool isClipEmpty = true;
1970     OH_Drawing_Canvas *canvases[10];
1971     for (int i = 0; i < 10; i++) {
1972         canvases[i]= OH_Drawing_CanvasCreate();
1973     }
1974     for (int i = 0; i < 10; i++) {
1975         OH_Drawing_CanvasIsClipEmpty(canvases[i], &isClipEmpty);
1976     }
1977     //5. free memory
1978     OH_Drawing_CanvasDestroy(canvas);
1979     for (int i = 0; i < 10; i++) {
1980         OH_Drawing_CanvasDestroy(canvases[i]);
1981     }
1982     OH_Drawing_RectDestroy(rect);
1983     OH_Drawing_RoundRectDestroy(roundRect);
1984 }
1985 
1986 /*
1987  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4600
1988  * @tc.name: testCanvasGetImageInfoNormal
1989  * @tc.desc: test for testCanvasGetImageInfoNormal.
1990  * @tc.size  : SmallTest
1991  * @tc.type  : Function
1992  * @tc.level : Level 0
1993  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasGetImageInfoNormal, TestSize.Level0)1994 HWTEST_F(DrawingNativeCanvasTest, testCanvasGetImageInfoNormal, TestSize.Level0) {
1995     //1. OH_Drawing_BitmapCreate
1996     OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
1997     //2. OH_Drawing_BitmapGetPixels
1998     void *pixels = OH_Drawing_BitmapGetPixels(bitmap);
1999     //3. OH_Drawing_BitmapBuild
2000     OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
2001     constexpr uint32_t width = 200;
2002     constexpr uint32_t height = 200;
2003     OH_Drawing_BitmapBuild(bitmap, width, height, &cFormat);
2004     //4. OH_Drawing_BitmapCreateFromPixels
2005     const uint32_t bytesPerPixel = 3;
2006     const uint32_t padding = 32;
2007     const uint32_t rowBytes = width * bytesPerPixel + padding;
2008     OH_Drawing_Image_Info imageInfo;
2009     OH_Drawing_Bitmap *frompixels = OH_Drawing_BitmapCreateFromPixels(&imageInfo, pixels, rowBytes);
2010     //5. OH_Drawing_CanvasBind
2011     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
2012     OH_Drawing_CanvasBind(canvas, bitmap);
2013     //6. OH_Drawing_CanvasGetImageInfo
2014     OH_Drawing_CanvasGetImageInfo(canvas, &imageInfo);
2015     //7. free memory
2016     OH_Drawing_CanvasDestroy(canvas);
2017     OH_Drawing_BitmapDestroy(bitmap);
2018     OH_Drawing_BitmapDestroy(frompixels);
2019 }
2020 
2021 /*
2022  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4601
2023  * @tc.name: testCanvasGetImageInfoNull
2024  * @tc.desc: test for testCanvasGetImageInfoNull.
2025  * @tc.size  : SmallTest
2026  * @tc.type  : Function
2027  * @tc.level : Level 3
2028  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasGetImageInfoNull, TestSize.Level3)2029 HWTEST_F(DrawingNativeCanvasTest, testCanvasGetImageInfoNull, TestSize.Level3) {
2030     //1. OH_Drawing_BitmapCreate
2031     OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
2032     //2. OH_Drawing_BitmapGetPixels
2033     void *pixels = OH_Drawing_BitmapGetPixels(bitmap);
2034     //3. OH_Drawing_BitmapBuild
2035     OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
2036     constexpr uint32_t width = 200;
2037     constexpr uint32_t height = 200;
2038     OH_Drawing_BitmapBuild(bitmap, width, height, &cFormat);
2039     //4. OH_Drawing_BitmapCreateFromPixels
2040     const uint32_t bytesPerPixel = 3;
2041     const uint32_t padding = 32;
2042     const uint32_t rowBytes = width * bytesPerPixel + padding;
2043     OH_Drawing_Image_Info imageInfo;
2044     OH_Drawing_Bitmap *frompixels = OH_Drawing_BitmapCreateFromPixels(&imageInfo, pixels, rowBytes);
2045     //5. OH_Drawing_CanvasBind
2046     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
2047     OH_Drawing_CanvasBind(canvas, bitmap);
2048     //6. OH_Drawing_CanvasGetImageInfo with the first parameter as null
2049     OH_Drawing_CanvasGetImageInfo(nullptr, &imageInfo);
2050     //7. OH_Drawing_CanvasGetImageInfo with the second parameter as null
2051     OH_Drawing_CanvasGetImageInfo(canvas, nullptr);
2052     //8. free memory
2053     OH_Drawing_CanvasDestroy(canvas);
2054     OH_Drawing_BitmapDestroy(bitmap);
2055     OH_Drawing_BitmapDestroy(frompixels);
2056 }
2057 
2058 /*
2059  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4602
2060  * @tc.name: testCanvasGetImageInfoMultipleCalls
2061  * @tc.desc: test for testCanvasGetImageInfoMultipleCalls.
2062  * @tc.size  : SmallTest
2063  * @tc.type  : Function
2064  * @tc.level : Level 3
2065  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasGetImageInfoMultipleCalls, TestSize.Level3)2066 HWTEST_F(DrawingNativeCanvasTest, testCanvasGetImageInfoMultipleCalls, TestSize.Level3) {
2067     //1. OH_Drawing_BitmapCreate
2068     OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
2069     //2. OH_Drawing_BitmapGetPixels
2070     void *pixels = OH_Drawing_BitmapGetPixels(bitmap);
2071     //3. OH_Drawing_BitmapBuild
2072     OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
2073     constexpr uint32_t width = 200;
2074     constexpr uint32_t height = 200;
2075     OH_Drawing_BitmapBuild(bitmap, width, height, &cFormat);
2076     //4. OH_Drawing_BitmapCreateFromPixels
2077     const uint32_t bytesPerPixel = 3;
2078     const uint32_t padding = 32;
2079     const uint32_t rowBytes = width * bytesPerPixel + padding;
2080     OH_Drawing_Image_Info imageInfo;
2081     OH_Drawing_Bitmap *frompixels = OH_Drawing_BitmapCreateFromPixels(&imageInfo, pixels, rowBytes);
2082     //5. OH_Drawing_CanvasBind
2083     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
2084     OH_Drawing_CanvasBind(canvas, bitmap);
2085     //6. Call OH_Drawing_CanvasGetImageInfo 10 times
2086     OH_Drawing_Canvas *canvases[10];
2087     for (int i = 0; i < 10; i++) {
2088         canvases[i]= OH_Drawing_CanvasCreate();
2089     }
2090     for (int i = 0; i < 10; i++) {
2091         OH_Drawing_CanvasGetImageInfo(canvases[i], &imageInfo);
2092     }
2093     //7. free memory
2094     OH_Drawing_CanvasDestroy(canvas);
2095     for (int i = 0; i < 10; i++) {
2096         OH_Drawing_CanvasDestroy(canvases[i]);
2097     }
2098     OH_Drawing_BitmapDestroy(bitmap);
2099     OH_Drawing_BitmapDestroy(frompixels);
2100 }
2101 
2102 /*
2103  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4700
2104  * @tc.name: testCanvasClipRegionNormal
2105  * @tc.desc: test for testCanvasClipRegionNormal.
2106  * @tc.size  : SmallTest
2107  * @tc.type  : Function
2108  * @tc.level : Level 0
2109  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasClipRegionNormal, TestSize.Level0)2110 HWTEST_F(DrawingNativeCanvasTest, testCanvasClipRegionNormal, TestSize.Level0) {
2111     //1. OH_Drawing_RectCreate
2112     OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
2113     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
2114     OH_Drawing_CanvasClipOp clipOp = {OH_Drawing_CanvasClipOp::DIFFERENCE};
2115     //2. OH_Drawing_RegionCreate
2116     OH_Drawing_Region *region = OH_Drawing_RegionCreate();
2117     //3. OH_Drawing_RegionSetRect
2118     OH_Drawing_RegionSetRect(region, rect);
2119     //4. OH_Drawing_CanvasClipRegion
2120     OH_Drawing_CanvasClipRegion(canvas, region, clipOp);
2121     //5. free memory
2122     OH_Drawing_CanvasDestroy(canvas);
2123     OH_Drawing_RectDestroy(rect);
2124     OH_Drawing_RegionDestroy(region);
2125 }
2126 
2127 /*
2128  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4701
2129  * @tc.name: testCanvasClipRegionNull
2130  * @tc.desc: test for testCanvasClipRegionNull.
2131  * @tc.size  : SmallTest
2132  * @tc.type  : Function
2133  * @tc.level : Level 3
2134  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasClipRegionNull, TestSize.Level3)2135 HWTEST_F(DrawingNativeCanvasTest, testCanvasClipRegionNull, TestSize.Level3) {
2136     //1. OH_Drawing_RectCreate
2137     OH_Drawing_Canvas *canvas = OH_Drawing_CanvasCreate();
2138     OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
2139     OH_Drawing_CanvasClipOp clipOp = {OH_Drawing_CanvasClipOp::DIFFERENCE};
2140     //2. OH_Drawing_RegionCreate
2141     OH_Drawing_Region *region = OH_Drawing_RegionCreate();
2142     //3. OH_Drawing_RegionSetRect
2143     OH_Drawing_RegionSetRect(region, rect);
2144     //4. OH_Drawing_CanvasClipRegion with the first parameter as nullptr
2145     OH_Drawing_CanvasClipRegion(nullptr, region, clipOp);
2146     //5. OH_Drawing_CanvasClipRegion with the second parameter as nullptr
2147     OH_Drawing_CanvasClipRegion(canvas, nullptr, clipOp);
2148     //6. free memory
2149     OH_Drawing_CanvasDestroy(canvas);
2150     OH_Drawing_RectDestroy(rect);
2151     OH_Drawing_RegionDestroy(region);
2152 }
2153 
2154 /*
2155  * @tc.number: SUB_BASIC_GRAPHICS_SPECIAL_API_C_DRAWING_CANVAS_4702
2156  * @tc.name: testCanvasClipRegionMultipleCalls
2157  * @tc.desc: test for testCanvasClipRegionMultipleCalls.
2158  * @tc.size  : SmallTest
2159  * @tc.type  : Function
2160  * @tc.level : Level 3
2161  */
HWTEST_F(DrawingNativeCanvasTest, testCanvasClipRegionMultipleCalls, TestSize.Level3)2162 HWTEST_F(DrawingNativeCanvasTest, testCanvasClipRegionMultipleCalls, TestSize.Level3) {
2163     //1. OH_Drawing_RectCreate
2164     OH_Drawing_Canvas *canvases[10];
2165     for (int i = 0; i < 10; i++) {
2166         canvases[i]= OH_Drawing_CanvasCreate();
2167     }
2168     OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, 100, 100);
2169     OH_Drawing_CanvasClipOp clipOp = {OH_Drawing_CanvasClipOp::DIFFERENCE};
2170     //2. OH_Drawing_RegionCreate
2171     OH_Drawing_Region *region = OH_Drawing_RegionCreate();
2172     //3. OH_Drawing_RegionSetRect
2173     OH_Drawing_RegionSetRect(region, rect);
2174     //4. Call OH_Drawing_CanvasClipRegion 10 times
2175     for (int i = 0; i < 10; i++) {
2176         OH_Drawing_CanvasClipRegion(canvases[i], region, clipOp);
2177     }
2178     //5. free memory
2179     for (int i = 0; i < 10; i++) {
2180         OH_Drawing_CanvasDestroy(canvases[i]);
2181     }
2182     OH_Drawing_RectDestroy(rect);
2183     OH_Drawing_RegionDestroy(region);
2184 }
2185 
2186 } // namespace Drawing
2187 } // namespace Rosen
2188 } // namespace OHOS