• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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