1 /*
2 * Copyright (c) 2025 Huawei Device Co., Ltd.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 */
15
16 #include <native_drawing/drawing_image.h>
17 #include <native_drawing/drawing_text_typography.h>
18 #include <native_drawing/drawing_rect.h>
19 #include <native_drawing/drawing_point.h>
20 #include <native_drawing/drawing_region.h>
21 #include <native_drawing/drawing_round_rect.h>
22 #include <native_drawing/drawing_sampling_options.h>
23 #include <native_drawing/drawing_pixel_map.h>
24 #include <native_drawing/drawing_text_blob.h>
25 #include <native_drawing/drawing_shader_effect.h>
26 #include <native_drawing/drawing_gpu_context.h>
27 #include <native_drawing/drawing_surface.h>
28 #include <native_drawing/drawing_path_effect.h>
29 #include <native_drawing/drawing_color_filter.h>
30 #include <native_drawing/drawing_filter.h>
31 #include <native_drawing/drawing_image_filter.h>
32 #include <native_drawing/drawing_mask_filter.h>
33 #include <native_drawing/drawing_matrix.h>
34 #include "sample_graphics.h"
35 #include "common/log_common.h"
36
DrawPathBasicTriangle(float startX,float startY,int32_t w)37 OH_Drawing_Path* SampleGraphics::DrawPathBasicTriangle(float startX, float startY, int32_t w)
38 {
39 // 创建路径对象
40 OH_Drawing_Path *path = OH_Drawing_PathCreate();
41 // 设置填充路径规则
42 OH_Drawing_PathSetFillType(path, OH_Drawing_PathFillType::PATH_FILL_TYPE_EVEN_ODD);
43 // 移动到起始点
44 OH_Drawing_PathMoveTo(path, startX + value15_, startY);
45 // 添加线段
46 OH_Drawing_PathLineTo(path, startX + value15_, startY + value150_);
47 OH_Drawing_PathLineTo(path, startX + w - value15_, startY + value150_);
48 // 闭合路径
49 OH_Drawing_PathClose(path);
50 // 判断路径是否包含坐标点
51 SAMPLE_LOGI("PathBasic-->contains:%{public}d",
52 OH_Drawing_PathContains(path, startX + value30_, startY + value100_) ? 1 : 0);
53 // 判断路径是否闭合
54 SAMPLE_LOGI("PathBasic-->isClosed:%{public}d", OH_Drawing_PathIsClosed(path, false) ? 1 : 0);
55 // 获取路径长度
56 SAMPLE_LOGI("PathBasic-->getLength:%{public}f", OH_Drawing_PathGetLength(path, false));
57 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, 0, 0);
58 // 获取边界
59 OH_Drawing_PathGetBounds(path, rect);
60 SAMPLE_LOGI("PathBasic-->getBounds:left=%{public}f,top=%{public}f,right=%{public}f,bottom=%{public}f",
61 OH_Drawing_RectGetLeft(rect), OH_Drawing_RectGetTop(rect), OH_Drawing_RectGetRight(rect),
62 OH_Drawing_RectGetBottom(rect));
63 OH_Drawing_Matrix *matrix = OH_Drawing_MatrixCreate();
64 // 获取变换矩阵
65 OH_Drawing_PathGetMatrix(path, false, value50_, matrix, OH_Drawing_PathMeasureMatrixFlags::GET_POSITION_MATRIX);
66 OH_Drawing_Point2D point{startX + value30_, startY + value150_};
67 OH_Drawing_Point2D tangent{0, 0};
68 // 获取坐标点和切线
69 OH_Drawing_PathGetPositionTangent(path, false, 1, &point, &tangent);
70 SAMPLE_LOGI("PathBasic-->tangent.x=%{public}f,tangent.y=%{public}f", tangent.x, tangent.y);
71 OH_Drawing_MatrixDestroy(matrix);
72 return path;
73 }
74
DrawPathBasic(OH_Drawing_Canvas * canvas)75 void SampleGraphics::DrawPathBasic(OH_Drawing_Canvas *canvas)
76 {
77 int32_t w = width_ / indexFive_;
78 float startX = 0;
79 float startY = value100_;
80 OH_Drawing_Pen *pen = OH_Drawing_PenCreate();
81 OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
82 OH_Drawing_PenSetAntiAlias(pen, true);
83 float penWidth = 3.f;
84 OH_Drawing_PenSetWidth(pen, penWidth);
85 OH_Drawing_CanvasAttachPen(canvas, pen);
86
87 // 三角形1
88 OH_Drawing_Path *path = DrawPathBasicTriangle(startX, startY, w);
89 OH_Drawing_CanvasDrawPath(canvas, path);
90
91 // 三角形2
92 // 复制路径
93 OH_Drawing_Path *path_copy = OH_Drawing_PathCopy(path);
94 OH_Drawing_Matrix *matrix_translate = OH_Drawing_MatrixCreateTranslation(w, 0);
95 // 对路径进行矩阵变换
96 OH_Drawing_PathTransform(path_copy, matrix_translate);
97 OH_Drawing_CanvasDrawPath(canvas, path_copy);
98
99 // 三角形3
100 OH_Drawing_Path *path_third = OH_Drawing_PathCreate();
101 // 对路径进行矩阵变换
102 OH_Drawing_PathTransformWithPerspectiveClip(path_copy, matrix_translate, path_third, false);
103 OH_Drawing_CanvasDrawPath(canvas, path_third);
104
105 // 三角形4
106 OH_Drawing_Path *path_fourth = OH_Drawing_PathCreate();
107 OH_Drawing_PathOffset(path, path_fourth, w * indexThree_, 0);
108 OH_Drawing_CanvasDrawPath(canvas, path_fourth);
109
110 // 梯形
111 startX += indexFour_ * w;
112 OH_Drawing_Path *path_fifth = OH_Drawing_PathCreate();
113 OH_Drawing_PathMoveTo(path_fifth, startX + value15_, startY);
114 OH_Drawing_PathLineTo(path_fifth, startX + value15_, startY + value100_);
115 OH_Drawing_PathLineTo(path_fifth, startX + w - value15_, startY + value100_);
116 OH_Drawing_PathTransform(path_fourth, matrix_translate);
117 // 将两个路径合并(取差集)
118 OH_Drawing_PathOp(path_fifth, path_fourth, OH_Drawing_PathOpMode::PATH_OP_MODE_REVERSE_DIFFERENCE);
119 OH_Drawing_CanvasDrawPath(canvas, path_fifth);
120
121 OH_Drawing_CanvasDetachPen(canvas);
122 OH_Drawing_PathDestroy(path);
123 OH_Drawing_PathDestroy(path_copy);
124 OH_Drawing_PathDestroy(path_third);
125 OH_Drawing_PathDestroy(path_fourth);
126 OH_Drawing_PathDestroy(path_fifth);
127 OH_Drawing_MatrixDestroy(matrix_translate);
128 OH_Drawing_PenDestroy(pen);
129 }
130
DrawPathTo1Line(OH_Drawing_Canvas * canvas)131 void SampleGraphics::DrawPathTo1Line(OH_Drawing_Canvas *canvas)
132 {
133 int32_t w = width_ / indexFive_;
134 float startX = 0;
135 float startY = value100_;
136 OH_Drawing_Path *path = OH_Drawing_PathCreate();
137
138 // 线段
139 OH_Drawing_PathMoveTo(path, startX + value15_, startY + value70_);
140 OH_Drawing_PathLineTo(path, startX + w - value15_, startY + value70_);
141 OH_Drawing_CanvasDrawPath(canvas, path);
142
143 // 弧线
144 startX += w;
145 OH_Drawing_PathReset(path);
146 float startDeg = 60;
147 float sweepDeg = -240;
148 OH_Drawing_PathArcTo(path, startX + value15_, startY + value30_, startX + w - value15_, startY + value150_,
149 startDeg, sweepDeg);
150 OH_Drawing_CanvasDrawPath(canvas, path);
151
152 // 二阶贝塞尔曲线
153 startX += w;
154 OH_Drawing_PathReset(path);
155 OH_Drawing_PathMoveTo(path, startX + value15_, startY);
156 OH_Drawing_PathQuadTo(path, startX + value30_, startY + value100_, startX + w - value15_, startY + value150_);
157 OH_Drawing_CanvasDrawPath(canvas, path);
158
159 // 二阶贝塞尔曲线(带权重)
160 startX += w;
161 OH_Drawing_PathReset(path);
162 OH_Drawing_PathMoveTo(path, startX + value15_, startY);
163 float weight = 5.f;
164 OH_Drawing_PathConicTo(path, startX + value30_, startY + value100_, startX + w - value15_, startY + value150_,
165 weight);
166 OH_Drawing_CanvasDrawPath(canvas, path);
167
168 // 三阶贝塞尔曲线
169 startX += w;
170 OH_Drawing_PathReset(path);
171 OH_Drawing_PathMoveTo(path, startX + value15_, startY);
172 OH_Drawing_PathCubicTo(path, startX + value30_, startY + value120_, startX + w - value30_, startY + value30_,
173 startX + w - value15_, startY + value150_);
174 OH_Drawing_CanvasDrawPath(canvas, path);
175
176 OH_Drawing_PathDestroy(path);
177 }
178
DrawPathTo2Line(OH_Drawing_Canvas * canvas)179 void SampleGraphics::DrawPathTo2Line(OH_Drawing_Canvas *canvas)
180 {
181 int32_t w = width_ / indexFive_;
182 float startX = 0;
183 float startY = value300_;
184 OH_Drawing_Path *path = OH_Drawing_PathCreate();
185
186 // 线段
187 OH_Drawing_PathMoveTo(path, startX, startY);
188 OH_Drawing_PathRMoveTo(path, value15_, value70_);
189 OH_Drawing_PathRLineTo(path, w - value30_, 0);
190 OH_Drawing_CanvasDrawPath(canvas, path);
191
192 // 二阶贝塞尔曲线
193 startX += w;
194 OH_Drawing_PathReset(path);
195 OH_Drawing_PathMoveTo(path, startX + value15_, startY);
196 OH_Drawing_PathRQuadTo(path, value30_, value100_, w - value10_, value150_);
197 OH_Drawing_CanvasDrawPath(canvas, path);
198
199 // 二阶贝塞尔曲线(带权重)
200 startX += w;
201 OH_Drawing_PathReset(path);
202 OH_Drawing_PathMoveTo(path, startX + value15_, startY);
203 float weight = 5.f;
204 OH_Drawing_PathRConicTo(path, value30_, value100_, w - value15_, value150_, weight);
205 OH_Drawing_CanvasDrawPath(canvas, path);
206
207 // 三阶贝塞尔曲线
208 startX += w;
209 OH_Drawing_PathReset(path);
210 OH_Drawing_PathMoveTo(path, startX + value15_, startY);
211 OH_Drawing_PathRCubicTo(path, value30_, value120_, w - value30_, value30_, w - value10_, value150_);
212 OH_Drawing_CanvasDrawPath(canvas, path);
213
214 OH_Drawing_PathDestroy(path);
215 }
216
DrawPathTo(OH_Drawing_Canvas * canvas)217 void SampleGraphics::DrawPathTo(OH_Drawing_Canvas *canvas)
218 {
219 OH_Drawing_Pen *pen = OH_Drawing_PenCreate();
220 OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
221 OH_Drawing_PenSetAntiAlias(pen, true);
222 float penWidth = 3.f;
223 OH_Drawing_PenSetWidth(pen, penWidth);
224 OH_Drawing_CanvasAttachPen(canvas, pen);
225
226 DrawPathTo1Line(canvas);
227 OH_Drawing_CanvasTranslate(canvas, 0, value200_);
228 DrawPathTo2Line(canvas);
229
230 OH_Drawing_CanvasDetachPen(canvas);
231 OH_Drawing_PenDestroy(pen);
232 }
233
DrawPathAdd1Line(OH_Drawing_Canvas * canvas)234 void SampleGraphics::DrawPathAdd1Line(OH_Drawing_Canvas *canvas)
235 {
236 int32_t w = width_ / indexFive_;
237 float startX = 0;
238 float startY = value100_;
239 // 圆
240 OH_Drawing_Path *pathCircle = OH_Drawing_PathCreate();
241 float radius = 40;
242 float startYAdded = 60;
243 OH_Drawing_PathAddCircle(pathCircle, startX + w / indexTwo_, startY + startYAdded, radius, PATH_DIRECTION_CCW);
244 OH_Drawing_CanvasDrawPath(canvas, pathCircle);
245 OH_Drawing_PathDestroy(pathCircle);
246 // 矩形
247 startX += w;
248 OH_Drawing_Path *pathRect = OH_Drawing_PathCreate();
249 OH_Drawing_PathAddRect(pathRect, startX + value10_, startY + value30_, startX + w - value10_,
250 startY + value90_, PATH_DIRECTION_CCW);
251 OH_Drawing_CanvasDrawPath(canvas, pathRect);
252 OH_Drawing_PathDestroy(pathRect);
253 // 椭圆
254 startX += w;
255 OH_Drawing_Path *pathOval = OH_Drawing_PathCreate();
256 OH_Drawing_Rect *rectOval = OH_Drawing_RectCreate(startX + value10_, startY + value30_,
257 startX + w - value10_, startY + value90_);
258 OH_Drawing_PathAddOval(pathOval, rectOval, OH_Drawing_PathDirection::PATH_DIRECTION_CW);
259 OH_Drawing_CanvasDrawPath(canvas, pathOval);
260 OH_Drawing_RectDestroy(rectOval);
261 OH_Drawing_PathDestroy(pathOval);
262 // 圆角矩形
263 startX += w;
264 OH_Drawing_Path *pathRoundRect = OH_Drawing_PathCreate();
265 OH_Drawing_Rect *rectRoundRect = OH_Drawing_RectCreate(startX + value10_, startY + value30_,
266 startX + w - value10_, startY + value90_);
267 OH_Drawing_RoundRect *roundRect = OH_Drawing_RoundRectCreate(rectRoundRect, value20_, value20_);
268 OH_Drawing_PathAddRoundRect(pathRoundRect, roundRect, PATH_DIRECTION_CCW);
269 OH_Drawing_CanvasDrawPath(canvas, pathRoundRect);
270 OH_Drawing_RectDestroy(rectRoundRect);
271 OH_Drawing_PathDestroy(pathRoundRect);
272 OH_Drawing_RoundRectDestroy(roundRect);
273 }
274
DrawPathAdd2Line(OH_Drawing_Canvas * canvas)275 void SampleGraphics::DrawPathAdd2Line(OH_Drawing_Canvas *canvas)
276 {
277 int32_t w = width_ / indexFive_;
278 float startX = 0;
279 float startY = value100_;
280 // 多边形
281 OH_Drawing_Path *pathPolygon = OH_Drawing_PathCreate();
282 float leftPointX = startX + value10_;
283 float rightPointX = startX + w - value10_;
284 float middlePointX = (leftPointX + rightPointX) / 2;
285 OH_Drawing_Point2D points[] = {{middlePointX, startY + value30_}, {leftPointX, startY + value90_},
286 {rightPointX, startY + value90_}};
287 OH_Drawing_PathAddPolygon(pathPolygon, points, 3, true); // 3 is the size of point array
288 OH_Drawing_CanvasDrawPath(canvas, pathPolygon);
289 OH_Drawing_PathDestroy(pathPolygon);
290 // 曲线
291 startX += w;
292 OH_Drawing_Rect *rectArc = OH_Drawing_RectCreate(startX - value30_, startY + value30_,
293 startX + w - value10_, startY + value150_);
294 OH_Drawing_Path *pathArc = OH_Drawing_PathCreate();
295 OH_Drawing_PathAddArc(pathArc, rectArc, 0, -value90_);
296 OH_Drawing_CanvasDrawPath(canvas, pathArc);
297 OH_Drawing_RectDestroy(rectArc);
298 OH_Drawing_PathDestroy(pathArc);
299 }
300
DrawPathAdd3Line(OH_Drawing_Canvas * canvas)301 void SampleGraphics::DrawPathAdd3Line(OH_Drawing_Canvas *canvas)
302 {
303 int32_t w = width_ / indexFive_;
304 float startX = 0;
305 float startY = value100_;
306 // 线段1
307 OH_Drawing_Path *pathOuter1 = OH_Drawing_PathCreate();
308 OH_Drawing_Path *pathInner1 = OH_Drawing_PathCreate();
309 OH_Drawing_PathMoveTo(pathInner1, startX + value10_, startY);
310 OH_Drawing_PathLineTo(pathInner1, startX + w - value10_, startY);
311 OH_Drawing_Matrix *matrix1 = OH_Drawing_MatrixCreateTranslation(0, value50_);
312 OH_Drawing_PathAddPath(pathOuter1, pathInner1, matrix1);
313 OH_Drawing_CanvasDrawPath(canvas, pathOuter1);
314 OH_Drawing_PathDestroy(pathOuter1);
315 OH_Drawing_PathDestroy(pathInner1);
316 OH_Drawing_MatrixDestroy(matrix1);
317 // 线段2
318 startX += w;
319 OH_Drawing_Path *pathOuter2 = OH_Drawing_PathCreate();
320 OH_Drawing_Path *pathInner2 = OH_Drawing_PathCreate();
321 OH_Drawing_PathMoveTo(pathInner2, startX + value10_, startY + value50_);
322 OH_Drawing_PathLineTo(pathInner2, startX + w - value10_, startY + value50_);
323 OH_Drawing_PathAddPathWithMode(pathOuter2, pathInner2, OH_Drawing_PathAddMode::PATH_ADD_MODE_APPEND);
324 OH_Drawing_CanvasDrawPath(canvas, pathOuter2);
325 OH_Drawing_PathDestroy(pathOuter2);
326 OH_Drawing_PathDestroy(pathInner2);
327 // 线段3
328 startX += w;
329 OH_Drawing_Path *pathOuter3 = OH_Drawing_PathCreate();
330 OH_Drawing_Path *pathInner3 = OH_Drawing_PathCreate();
331 OH_Drawing_PathMoveTo(pathInner3, startX + value10_, startY);
332 OH_Drawing_PathLineTo(pathInner3, startX + w - value10_, startY);
333 OH_Drawing_PathAddPathWithOffsetAndMode(pathOuter3, pathInner3, 0, value50_,
334 OH_Drawing_PathAddMode::PATH_ADD_MODE_APPEND);
335 OH_Drawing_CanvasDrawPath(canvas, pathOuter3);
336 OH_Drawing_PathDestroy(pathOuter3);
337 OH_Drawing_PathDestroy(pathInner3);
338 // 线段4
339 startX += w;
340 OH_Drawing_Path *pathOuter4 = OH_Drawing_PathCreate();
341 OH_Drawing_Path *pathInner4 = OH_Drawing_PathCreate();
342 OH_Drawing_PathMoveTo(pathInner4, startX + value10_, startY);
343 OH_Drawing_PathLineTo(pathInner4, startX + w - value10_, startY);
344 OH_Drawing_Matrix *matrix2 = OH_Drawing_MatrixCreateTranslation(0, value50_);
345 OH_Drawing_PathAddPathWithMatrixAndMode(pathOuter4, pathInner4, matrix2,
346 OH_Drawing_PathAddMode::PATH_ADD_MODE_APPEND);
347 OH_Drawing_CanvasDrawPath(canvas, pathOuter4);
348 OH_Drawing_PathDestroy(pathOuter4);
349 OH_Drawing_PathDestroy(pathInner4);
350 OH_Drawing_MatrixDestroy(matrix2);
351 }
352
DrawPathAdd4Line(OH_Drawing_Canvas * canvas)353 void SampleGraphics::DrawPathAdd4Line(OH_Drawing_Canvas *canvas)
354 {
355 int32_t w = width_ / indexFive_;
356 float startX = 0;
357 float startY = value100_;
358 // 椭圆
359 OH_Drawing_Path *pathOval = OH_Drawing_PathCreate();
360 OH_Drawing_Rect *rectOval = OH_Drawing_RectCreate(startX + value10_, startY + value30_,
361 startX + w - value10_, startY + value90_);
362 OH_Drawing_PathAddOvalWithInitialPoint(pathOval, rectOval, 1, OH_Drawing_PathDirection::PATH_DIRECTION_CW);
363 OH_Drawing_CanvasDrawPath(canvas, pathOval);
364 OH_Drawing_RectDestroy(rectOval);
365 OH_Drawing_PathDestroy(pathOval);
366 // 矩形
367 startX += w;
368 OH_Drawing_Path *pathRect = OH_Drawing_PathCreate();
369 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(startX + value10_, startY + value30_,
370 startX + w - value10_, startY + value90_);
371 OH_Drawing_PathAddRectWithInitialCorner(pathRect, rect, PATH_DIRECTION_CCW, 1);
372 OH_Drawing_CanvasDrawPath(canvas, pathRect);
373 OH_Drawing_PathDestroy(pathRect);
374 OH_Drawing_RectDestroy(rect);
375 }
376
DrawPathAdd(OH_Drawing_Canvas * canvas)377 void SampleGraphics::DrawPathAdd(OH_Drawing_Canvas *canvas)
378 {
379 OH_Drawing_Pen *pen = OH_Drawing_PenCreate();
380 OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
381 OH_Drawing_PenSetAntiAlias(pen, true);
382 float penWidth = 3.f;
383 OH_Drawing_PenSetWidth(pen, penWidth);
384 OH_Drawing_CanvasAttachPen(canvas, pen);
385
386 DrawPathAdd1Line(canvas);
387 OH_Drawing_CanvasTranslate(canvas, 0, value200_);
388 DrawPathAdd2Line(canvas);
389 OH_Drawing_CanvasTranslate(canvas, 0, value200_);
390 DrawPathAdd3Line(canvas);
391 OH_Drawing_CanvasTranslate(canvas, 0, value200_);
392 DrawPathAdd4Line(canvas);
393
394 OH_Drawing_CanvasDetachPen(canvas);
395 OH_Drawing_PenDestroy(pen);
396 }
397
BuildFromSvgString(OH_Drawing_Canvas * canvas)398 void SampleGraphics::BuildFromSvgString(OH_Drawing_Canvas *canvas)
399 {
400 OH_Drawing_Brush* brush = OH_Drawing_BrushCreate();
401 OH_Drawing_BrushSetColor(brush, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
402 OH_Drawing_CanvasAttachBrush(canvas, brush);
403 char* str = "M150 130L30 300L270 300Z";
404 OH_Drawing_Path* path = OH_Drawing_PathCreate();
405 // 通过svg构建path
406 OH_Drawing_PathBuildFromSvgString(path, str);
407 OH_Drawing_CanvasDrawPath(canvas, path);
408 OH_Drawing_CanvasDetachBrush(canvas);
409 OH_Drawing_BrushDestroy(brush);
410 OH_Drawing_PathDestroy(path);
411 }
412
DrawStar(OH_Drawing_Canvas * canvas)413 void SampleGraphics::DrawStar(OH_Drawing_Canvas *canvas)
414 {
415 OH_Drawing_Pen* pen = OH_Drawing_PenCreate();
416 OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
417 OH_Drawing_PenSetWidth(pen, value10_);
418 OH_Drawing_PenSetJoin(pen, LINE_ROUND_JOIN);
419 OH_Drawing_CanvasAttachPen(canvas, pen);
420 OH_Drawing_Brush *brush = OH_Drawing_BrushCreate();
421 OH_Drawing_BrushSetColor(brush, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMin_, rgbaMax_, rgbaMin_));
422 OH_Drawing_CanvasAttachBrush(canvas, brush);
423 int len = value551_;
424 float aX = value630_;
425 float aY = value551_;
426 float angle = 18.0f;
427 float dX = aX - len * std::sin(angle);
428 float dY = aY + len * std::cos(angle);
429 float cX = aX + len * std::sin(angle);
430 float cY = dY;
431 float bX = aX + (len / 2.0);
432 float bY = aY + std::sqrt((cX - dX) * (cX - dX) + (len / 2.0) * (len / 2.0));
433 float eX = aX - (len / 2.0);
434 float eY = bY;
435 // 创建路径
436 OH_Drawing_Path* path = OH_Drawing_PathCreate();
437 // 到起始点
438 OH_Drawing_PathMoveTo(path, aX, aY);
439 // 绘制直线
440 OH_Drawing_PathLineTo(path, bX, bY);
441 OH_Drawing_PathLineTo(path, cX, cY);
442 OH_Drawing_PathLineTo(path, dX, dY);
443 OH_Drawing_PathLineTo(path, eX, eY);
444 // 直线闭合,形成五角星
445 OH_Drawing_PathClose(path);
446 // 绘制闭合路径
447 OH_Drawing_CanvasDrawPath(canvas, path);
448 OH_Drawing_CanvasDetachPen(canvas);
449 OH_Drawing_CanvasDetachBrush(canvas);
450 OH_Drawing_PenDestroy(pen);
451 OH_Drawing_BrushDestroy(brush);
452 OH_Drawing_PathDestroy(path);
453 }