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
DrawPenBasic(OH_Drawing_Canvas * canvas)36 void SampleGraphics::DrawPenBasic(OH_Drawing_Canvas *canvas)
37 {
38 // 创建画笔对象
39 OH_Drawing_Pen* pen = OH_Drawing_PenCreate();
40 // 设置画笔描边颜色为红色
41 OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
42 // 设置画笔线宽为20
43 OH_Drawing_PenSetWidth(pen, value20_);
44 // 设置抗锯齿
45 OH_Drawing_PenSetAntiAlias(pen, true);
46 // 在画布中设置画笔
47 OH_Drawing_CanvasAttachPen(canvas, pen);
48 OH_Drawing_Rect* rect1 = OH_Drawing_RectCreate(value100_, value100_, value400_, value400_);
49 // 绘制矩形1
50 OH_Drawing_CanvasDrawRect(canvas, rect1);
51 OH_Drawing_CanvasDetachPen(canvas);
52 // 复制画笔
53 OH_Drawing_Pen* pen_copy = OH_Drawing_PenCopy(pen);
54
55 // 画刷重置
56 OH_Drawing_PenReset(pen);
57 // 设置画笔线宽为20
58 OH_Drawing_PenSetWidth(pen, value20_);
59 // 设置透明度
60 OH_Drawing_PenSetAlpha(pen, rgbaHalf_);
61 OH_Drawing_CanvasAttachPen(canvas, pen);
62 OH_Drawing_Rect* rect2 = OH_Drawing_RectCreate(value500_, value500_, value800_, value800_);
63 // 绘制矩形2
64 OH_Drawing_CanvasDrawRect(canvas, rect2);
65 OH_Drawing_CanvasDetachPen(canvas);
66
67 OH_Drawing_CanvasAttachPen(canvas, pen_copy);
68 OH_Drawing_Rect* rect3 = OH_Drawing_RectCreate(value900_, value900_, value1200_, value1200_);
69 // 绘制矩形3
70 OH_Drawing_CanvasDrawRect(canvas, rect3);
71 OH_Drawing_CanvasDetachBrush(canvas);
72
73 // 销毁各类对象
74 OH_Drawing_PenDestroy(pen);
75 OH_Drawing_PenDestroy(pen_copy);
76 OH_Drawing_RectDestroy(rect1);
77 OH_Drawing_RectDestroy(rect2);
78 OH_Drawing_RectDestroy(rect3);
79 }
80
DrawPenLinearGradient(OH_Drawing_Canvas * canvas)81 void SampleGraphics::DrawPenLinearGradient(OH_Drawing_Canvas *canvas)
82 {
83 OH_Drawing_Point *startPt = OH_Drawing_PointCreate(value120_, value120_);
84 OH_Drawing_Point *endPt = OH_Drawing_PointCreate(value1000_, value1000_);
85 uint32_t colors[] = {
86 OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMax_, rgbaMin_),
87 OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_),
88 OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMin_, rgbaMin_, rgbaMax_)};
89 float pos2 = 0.5f;
90 float pos[] = {0.0f, pos2, 1.0f};
91 // 创建线性渐变着色器效果
92 OH_Drawing_ShaderEffect *shaderEffect =
93 OH_Drawing_ShaderEffectCreateLinearGradient(startPt, endPt, colors, pos, 3, OH_Drawing_TileMode::CLAMP);
94 OH_Drawing_Pen* pen = OH_Drawing_PenCreate();
95 OH_Drawing_PenSetWidth(pen, value150_);
96 // 基于画笔设置着色器效果
97 OH_Drawing_PenSetShaderEffect(pen, shaderEffect);
98 OH_Drawing_CanvasAttachPen(canvas, pen);
99 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(value200_, value200_, value1000_, value1000_);
100 OH_Drawing_CanvasDrawRect(canvas, rect);
101 OH_Drawing_CanvasDetachPen(canvas);
102 // 销毁各类对象
103 OH_Drawing_PenDestroy(pen);
104 OH_Drawing_RectDestroy(rect);
105 OH_Drawing_ShaderEffectDestroy(shaderEffect);
106 OH_Drawing_PointDestroy(startPt);
107 OH_Drawing_PointDestroy(endPt);
108 }
109
DrawMiterLimit(OH_Drawing_Canvas * canvas)110 void SampleGraphics::DrawMiterLimit(OH_Drawing_Canvas *canvas)
111 {
112 OH_Drawing_Pen* pen = OH_Drawing_PenCreate();
113 uint32_t color = OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_);
114 OH_Drawing_PenSetColor(pen, color);
115 float width = value50_;
116 OH_Drawing_PenSetWidth(pen, width);
117 OH_Drawing_PenSetAntiAlias(pen, true);
118 // 设置画笔转角样式
119 OH_Drawing_PenSetJoin(pen, OH_Drawing_PenLineJoinStyle::LINE_MITER_JOIN);
120 // 设置折角尖角的限制值
121 OH_Drawing_PenSetMiterLimit(pen, value15_);
122 OH_Drawing_CanvasAttachPen(canvas, pen);
123 OH_Drawing_Path* path = OH_Drawing_PathCreate();
124 float aX = value100_;
125 float aY = value100_;
126 float bX = value100_;
127 float bY = value800_;
128 float cX = value200_;
129 float cY = value100_;
130 OH_Drawing_PathMoveTo(path, aX, aY);
131 OH_Drawing_PathLineTo(path, bX, bY);
132 OH_Drawing_PathLineTo(path, cX, cY);
133 OH_Drawing_CanvasDrawPath(canvas, path);
134 OH_Drawing_CanvasDetachPen(canvas);
135 OH_Drawing_PenDestroy(pen);
136 OH_Drawing_PathDestroy(path);
137 }
138
DrawStroke(OH_Drawing_Canvas * canvas)139 void SampleGraphics::DrawStroke(OH_Drawing_Canvas *canvas)
140 {
141 OH_Drawing_Pen* pen = OH_Drawing_PenCreate();
142 uint32_t color = OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_);
143 OH_Drawing_PenSetColor(pen, color);
144 float width = value50_;
145 OH_Drawing_PenSetWidth(pen, width);
146 OH_Drawing_PenSetAntiAlias(pen, true);
147 // 设置画笔线帽样式
148 OH_Drawing_PenSetCap(pen, OH_Drawing_PenLineCapStyle::LINE_ROUND_CAP);
149 // 设置画笔转角样式
150 OH_Drawing_PenSetJoin(pen, OH_Drawing_PenLineJoinStyle::LINE_BEVEL_JOIN);
151 OH_Drawing_CanvasAttachPen(canvas, pen);
152 // 创建路径
153 OH_Drawing_Path* path = OH_Drawing_PathCreate();
154 float aX = value100_;
155 float aY = value100_;
156 float bX = value100_;
157 float bY = value800_;
158 float cX = value800_;
159 float cY = value800_;
160 float dX = value800_;
161 float dY = value100_;
162 // 到起始点
163 OH_Drawing_PathMoveTo(path, aX, aY);
164 // 绘制直线
165 OH_Drawing_PathLineTo(path, bX, bY);
166 OH_Drawing_PathLineTo(path, cX, cY);
167 OH_Drawing_PathLineTo(path, dX, dY);
168 OH_Drawing_CanvasDrawPath(canvas, path);
169 OH_Drawing_CanvasDetachPen(canvas);
170 OH_Drawing_PenDestroy(pen);
171 OH_Drawing_PathDestroy(path);
172 }
173
DrawPathEffect(OH_Drawing_Canvas * canvas)174 void SampleGraphics::DrawPathEffect(OH_Drawing_Canvas *canvas)
175 {
176 OH_Drawing_Pen *pen = OH_Drawing_PenCreate();
177 OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
178 OH_Drawing_PenSetWidth(pen, value10_);
179 // 表示10px的实线,5px的间隔,2px的实线,5px的间隔,以此循环
180 float intervals[] = {value10_, 5, 2, 5};
181 // 创建虚线路径效果
182 int count = 4;
183 OH_Drawing_PathEffect *pathEffect = OH_Drawing_CreateDashPathEffect(intervals, count, 0.0);
184 OH_Drawing_PenSetPathEffect(pen, pathEffect);
185 OH_Drawing_CanvasAttachPen(canvas, pen);
186 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(value300_, value300_, value900_, value900_);
187 // 绘制矩形
188 OH_Drawing_CanvasDrawRect(canvas, rect);
189 OH_Drawing_CanvasDetachPen(canvas);
190 OH_Drawing_PenDestroy(pen);
191 OH_Drawing_RectDestroy(rect);
192 OH_Drawing_PathEffectDestroy(pathEffect);
193 }
194
DrawImageFilter(OH_Drawing_Canvas * canvas)195 void SampleGraphics::DrawImageFilter(OH_Drawing_Canvas *canvas)
196 {
197 OH_Drawing_Pen *pen = OH_Drawing_PenCreate();
198 OH_Drawing_PenSetAntiAlias(pen, true);
199 OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
200 OH_Drawing_PenSetWidth(pen, value20_);
201 // 创建图像滤波器实现模糊效果
202 OH_Drawing_ImageFilter *imageFilter =
203 OH_Drawing_ImageFilterCreateBlur(value20_, value20_, OH_Drawing_TileMode::CLAMP, nullptr);
204 OH_Drawing_Filter *filter = OH_Drawing_FilterCreate();
205 // 为滤波器对象设置图像滤波器
206 OH_Drawing_FilterSetImageFilter(filter, imageFilter);
207 // 设置画笔的滤波器效果
208 OH_Drawing_PenSetFilter(pen, filter);
209 OH_Drawing_CanvasAttachPen(canvas, pen);
210 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(value300_, value300_, value900_, value900_);
211 // 绘制矩形
212 OH_Drawing_CanvasDrawRect(canvas, rect);
213 OH_Drawing_CanvasDetachPen(canvas);
214 // 销毁各类对象
215 OH_Drawing_PenDestroy(pen);
216 OH_Drawing_ImageFilterDestroy(imageFilter);
217 OH_Drawing_RectDestroy(rect);
218 OH_Drawing_FilterDestroy(filter);
219 }
220
DrawMaskFilterPen(OH_Drawing_Canvas * canvas)221 void SampleGraphics::DrawMaskFilterPen(OH_Drawing_Canvas *canvas)
222 {
223 OH_Drawing_Pen *pen = OH_Drawing_PenCreate();
224 OH_Drawing_PenSetAntiAlias(pen, true);
225 OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
226 OH_Drawing_PenSetWidth(pen, value20_);
227 // 创建蒙版滤波器
228 OH_Drawing_MaskFilter *maskFilter = OH_Drawing_MaskFilterCreateBlur(OH_Drawing_BlurType::NORMAL, value20_, true);
229 OH_Drawing_Filter *filter = OH_Drawing_FilterCreate();
230 OH_Drawing_FilterSetMaskFilter(filter, maskFilter);
231 // 设置画笔的滤波器效果
232 OH_Drawing_PenSetFilter(pen, filter);
233 OH_Drawing_CanvasAttachPen(canvas, pen);
234 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(value300_, value300_, value600_, value600_);
235 // 绘制矩形
236 OH_Drawing_CanvasDrawRect(canvas, rect);
237 OH_Drawing_CanvasDetachPen(canvas);
238 // 销毁各类对象
239 OH_Drawing_PenDestroy(pen);
240 OH_Drawing_MaskFilterDestroy(maskFilter);
241 OH_Drawing_RectDestroy(rect);
242 OH_Drawing_FilterDestroy(filter);
243 }
244