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
DrawBrushBasic(OH_Drawing_Canvas * canvas)36 void SampleGraphics::DrawBrushBasic(OH_Drawing_Canvas *canvas)
37 {
38 // 创建画刷
39 OH_Drawing_Brush* brush = OH_Drawing_BrushCreate();
40 // 设置填充颜色为红色
41 OH_Drawing_BrushSetColor(brush, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
42 // 开启抗锯齿效果
43 OH_Drawing_BrushSetAntiAlias(brush, true);
44 OH_Drawing_CanvasAttachBrush(canvas, brush);
45 OH_Drawing_Rect* rect1 = OH_Drawing_RectCreate(0, 0, value300_, value300_);
46 // 绘制矩形1
47 OH_Drawing_CanvasDrawRect(canvas, rect1);
48 OH_Drawing_CanvasDetachBrush(canvas);
49 // 复制画刷
50 OH_Drawing_Brush* brush_copy = OH_Drawing_BrushCopy(brush);
51
52 // 画刷重置
53 OH_Drawing_BrushReset(brush);
54 // 设置透明度
55 OH_Drawing_BrushSetAlpha(brush, rgbaHalf_);
56 OH_Drawing_CanvasAttachBrush(canvas, brush);
57 OH_Drawing_Rect* rect2 = OH_Drawing_RectCreate(value400_, value400_, value700_, value700_);
58 // 绘制矩形2
59 OH_Drawing_CanvasDrawRect(canvas, rect2);
60 OH_Drawing_CanvasDetachBrush(canvas);
61
62 OH_Drawing_CanvasAttachBrush(canvas, brush_copy);
63 OH_Drawing_Rect* rect3 = OH_Drawing_RectCreate(value800_, value800_, value1100_, value1100_);
64 // 绘制矩形3
65 OH_Drawing_CanvasDrawRect(canvas, rect3);
66 OH_Drawing_CanvasDetachBrush(canvas);
67
68 // 销毁各类对象
69 OH_Drawing_BrushDestroy(brush);
70 OH_Drawing_BrushDestroy(brush_copy);
71 OH_Drawing_RectDestroy(rect1);
72 OH_Drawing_RectDestroy(rect2);
73 OH_Drawing_RectDestroy(rect3);
74 }
75
DrawMixedMode(OH_Drawing_Canvas * canvas)76 void SampleGraphics::DrawMixedMode(OH_Drawing_Canvas *canvas)
77 {
78 OH_Drawing_CanvasClear(canvas, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMin_, rgbaMin_, rgbaMin_));
79 OH_Drawing_Brush* brush = OH_Drawing_BrushCreate();
80 OH_Drawing_BrushSetColor(brush, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
81 OH_Drawing_CanvasAttachBrush(canvas, brush);
82 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(value100_, value100_, value600_, value600_);
83 // 绘制矩形(目标像素)
84 OH_Drawing_CanvasDrawRect(canvas, rect);
85 OH_Drawing_BrushSetColor(brush, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMin_, rgbaMin_, 0xFF));
86 // 设置混合模式为叠加模式
87 OH_Drawing_BrushSetBlendMode(brush, OH_Drawing_BlendMode::BLEND_MODE_PLUS);
88 OH_Drawing_CanvasAttachBrush(canvas, brush);
89 OH_Drawing_Point *point = OH_Drawing_PointCreate(value600_, value600_);
90 // 绘制圆(源像素)
91 OH_Drawing_CanvasDrawCircle(canvas, point, value300_);
92 OH_Drawing_CanvasDetachBrush(canvas);
93 OH_Drawing_RectDestroy(rect);
94 OH_Drawing_BrushDestroy(brush);
95 OH_Drawing_PointDestroy(point);
96 }
97
DrawShaderEffect1Line(OH_Drawing_Canvas * canvas)98 void SampleGraphics::DrawShaderEffect1Line(OH_Drawing_Canvas *canvas)
99 {
100 // 线性渐变着色器
101 OH_Drawing_Point *startPt = OH_Drawing_PointCreate(value100_, value100_);
102 OH_Drawing_Point *endPt = OH_Drawing_PointCreate(value300_, value300_);
103 uint32_t colors[] = {
104 OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMax_, rgbaMin_),
105 OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_),
106 OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMin_, rgbaMin_, rgbaMax_)};
107 float pos[] = {0.0f, 0.5f, 1.0f};
108 OH_Drawing_ShaderEffect *linearShaderEffect1 =
109 OH_Drawing_ShaderEffectCreateLinearGradient(startPt, endPt, colors, pos, indexThree_,
110 OH_Drawing_TileMode::CLAMP);
111 OH_Drawing_Brush* brush = OH_Drawing_BrushCreate();
112 // 基于画刷设置着色器
113 OH_Drawing_BrushSetShaderEffect(brush, linearShaderEffect1);
114 OH_Drawing_CanvasAttachBrush(canvas, brush);
115 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(value100_, value100_, value300_, value300_);
116 OH_Drawing_CanvasDrawRect(canvas, rect);
117 OH_Drawing_CanvasDetachBrush(canvas);
118
119 // 使用矩阵创建线性渐变着色器
120 OH_Drawing_CanvasTranslate(canvas, value300_, 0.f);
121 OH_Drawing_Matrix* matrix = OH_Drawing_MatrixCreate();
122 OH_Drawing_MatrixScale(matrix, 2.0f, 1.0f, value200_, value200_);
123 OH_Drawing_Point2D startPt2{value100_, value100_};
124 OH_Drawing_Point2D endPt2{value300_, value300_};
125 OH_Drawing_ShaderEffect *linearShaderEffect2 = OH_Drawing_ShaderEffectCreateLinearGradientWithLocalMatrix(
126 &startPt2, &endPt2, colors, pos, indexThree_, OH_Drawing_TileMode::CLAMP, matrix);
127 OH_Drawing_BrushSetShaderEffect(brush, linearShaderEffect2);
128 OH_Drawing_CanvasAttachBrush(canvas, brush);
129 OH_Drawing_CanvasDrawRect(canvas, rect);
130 OH_Drawing_CanvasDetachBrush(canvas);
131
132 // 销毁各类对象
133 OH_Drawing_BrushDestroy(brush);
134 OH_Drawing_RectDestroy(rect);
135 OH_Drawing_ShaderEffectDestroy(linearShaderEffect1);
136 OH_Drawing_ShaderEffectDestroy(linearShaderEffect2);
137 OH_Drawing_PointDestroy(startPt);
138 OH_Drawing_PointDestroy(endPt);
139 OH_Drawing_MatrixDestroy(matrix);
140 }
141
DrawShaderEffect2Line(OH_Drawing_Canvas * canvas)142 void SampleGraphics::DrawShaderEffect2Line(OH_Drawing_Canvas *canvas)
143 {
144 uint32_t colors[] = {
145 OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMax_, rgbaMin_),
146 OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_),
147 OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMin_, rgbaMin_, rgbaMax_)};
148 float pos[] = {0.0f, 0.5f, 1.0f};
149 OH_Drawing_Brush* brush = OH_Drawing_BrushCreate();
150 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(value100_, value100_, value300_, value300_);
151
152 // 径向渐变着色器
153 OH_Drawing_Point *centerPt = OH_Drawing_PointCreate(value200_, value200_);
154 OH_Drawing_ShaderEffect *radialShaderEffect =
155 OH_Drawing_ShaderEffectCreateRadialGradient(centerPt, value200_, colors, pos, indexThree_,
156 OH_Drawing_TileMode::REPEAT);
157 OH_Drawing_BrushSetShaderEffect(brush, radialShaderEffect);
158 OH_Drawing_CanvasAttachBrush(canvas, brush);
159 OH_Drawing_CanvasDrawRect(canvas, rect);
160 OH_Drawing_CanvasDetachBrush(canvas);
161
162 // 扇形渐变着色器
163 OH_Drawing_CanvasTranslate(canvas, value300_, 0.f);
164 OH_Drawing_ShaderEffect* sweepShaderEffect =
165 OH_Drawing_ShaderEffectCreateSweepGradient(centerPt, colors, pos, indexThree_, OH_Drawing_TileMode::CLAMP);
166 OH_Drawing_BrushSetShaderEffect(brush, sweepShaderEffect);
167 OH_Drawing_CanvasAttachBrush(canvas, brush);
168 OH_Drawing_CanvasDrawRect(canvas, rect);
169 OH_Drawing_CanvasDetachBrush(canvas);
170
171 // 双圆锥渐变着色器
172 OH_Drawing_CanvasTranslate(canvas, value300_, 0.f);
173 OH_Drawing_Point2D pt3{value200_, value200_};
174 OH_Drawing_ShaderEffect *twoPointShaderEffect = OH_Drawing_ShaderEffectCreateTwoPointConicalGradient(
175 &pt3, value30_, &pt3, value100_, colors, pos, indexThree_, OH_Drawing_TileMode::CLAMP, nullptr);
176 OH_Drawing_BrushSetShaderEffect(brush, twoPointShaderEffect);
177 OH_Drawing_CanvasAttachBrush(canvas, brush);
178 OH_Drawing_CanvasDrawRect(canvas, rect);
179 OH_Drawing_CanvasDetachBrush(canvas);
180
181 // 销毁各类对象
182 OH_Drawing_BrushDestroy(brush);
183 OH_Drawing_RectDestroy(rect);
184 OH_Drawing_ShaderEffectDestroy(radialShaderEffect);
185 OH_Drawing_ShaderEffectDestroy(sweepShaderEffect);
186 OH_Drawing_ShaderEffectDestroy(twoPointShaderEffect);
187 }
188
DrawShaderEffect(OH_Drawing_Canvas * canvas)189 void SampleGraphics::DrawShaderEffect(OH_Drawing_Canvas *canvas)
190 {
191 // 线性渐变着色器
192 DrawShaderEffect1Line(canvas);
193 OH_Drawing_CanvasTranslate(canvas, -value300_, value300_);
194 DrawShaderEffect2Line(canvas);
195 }
196
DrawColorFilter(OH_Drawing_Canvas * canvas)197 void SampleGraphics::DrawColorFilter(OH_Drawing_Canvas *canvas)
198 {
199 OH_Drawing_Brush *brush = OH_Drawing_BrushCreate();
200 OH_Drawing_BrushSetAntiAlias(brush, true);
201 OH_Drawing_BrushSetColor(brush, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
202 OH_Drawing_CanvasAttachBrush(canvas, brush);
203 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(value100_, value100_, value300_, value300_);
204 // 绘制原始矩形
205 OH_Drawing_CanvasDrawRect(canvas, rect);
206 OH_Drawing_CanvasDetachBrush(canvas);
207
208 OH_Drawing_CanvasTranslate(canvas, 0.f, value300_);
209 // 创建luma亮度颜色滤波器
210 OH_Drawing_ColorFilter* lumaColorFilter = OH_Drawing_ColorFilterCreateLuma();
211 OH_Drawing_Filter *filter = OH_Drawing_FilterCreate();
212 OH_Drawing_FilterSetColorFilter(filter, lumaColorFilter);
213 OH_Drawing_BrushSetFilter(brush, filter);
214 OH_Drawing_CanvasAttachBrush(canvas, brush);
215 // 绘制经过luma亮度颜色滤波器效果的矩形
216 OH_Drawing_CanvasDrawRect(canvas, rect);
217 OH_Drawing_CanvasDetachBrush(canvas);
218
219 OH_Drawing_CanvasTranslate(canvas, 0.f, value300_);
220 const float matrix[20] = {
221 1, 0, 0, 0, 0,
222 0, 1, 0, 0, 0,
223 0, 0, 0.5f, 0.5f, 0,
224 0, 0, 0.5f, 0.5f, 0
225 };
226 // 创建5*4矩阵颜色滤波器
227 OH_Drawing_ColorFilter* matrixColorFilter = OH_Drawing_ColorFilterCreateMatrix(matrix);
228 // 创建从SRGB转换到线性颜色空间的颜色滤波器
229 OH_Drawing_ColorFilter* s2lColorFilter = OH_Drawing_ColorFilterCreateSrgbGammaToLinear();
230 // 创建从线性颜色空间转换到SRGB的颜色滤波器
231 OH_Drawing_ColorFilter* l2sColorFilter = OH_Drawing_ColorFilterCreateLinearToSrgbGamma();
232 // 创建合成滤波器
233 OH_Drawing_ColorFilter* composeColorFilter1 =
234 OH_Drawing_ColorFilterCreateCompose(matrixColorFilter, s2lColorFilter);
235 OH_Drawing_ColorFilter* composeColorFilter2 =
236 OH_Drawing_ColorFilterCreateCompose(composeColorFilter1, l2sColorFilter);
237 OH_Drawing_FilterSetColorFilter(filter, composeColorFilter1);
238 OH_Drawing_BrushSetFilter(brush, filter);
239 OH_Drawing_CanvasAttachBrush(canvas, brush);
240 // 绘制经过合成颜色滤波器效果的矩形
241 OH_Drawing_CanvasDrawRect(canvas, rect);
242 OH_Drawing_CanvasDetachBrush(canvas);
243
244 // 销毁各类对象
245 OH_Drawing_BrushDestroy(brush);
246 OH_Drawing_ColorFilterDestroy(matrixColorFilter);
247 OH_Drawing_ColorFilterDestroy(lumaColorFilter);
248 OH_Drawing_ColorFilterDestroy(s2lColorFilter);
249 OH_Drawing_ColorFilterDestroy(l2sColorFilter);
250 OH_Drawing_ColorFilterDestroy(composeColorFilter1);
251 OH_Drawing_ColorFilterDestroy(composeColorFilter2);
252 OH_Drawing_RectDestroy(rect);
253 OH_Drawing_FilterDestroy(filter);
254 }
255
DrawMaskFilterBrush(OH_Drawing_Canvas * canvas)256 void SampleGraphics::DrawMaskFilterBrush(OH_Drawing_Canvas *canvas)
257 {
258 OH_Drawing_Brush *brush = OH_Drawing_BrushCreate();
259 OH_Drawing_BrushSetAntiAlias(brush, true);
260 OH_Drawing_BrushSetColor(brush, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
261 // 创建模糊蒙版滤波器
262 OH_Drawing_MaskFilter *maskFilter = OH_Drawing_MaskFilterCreateBlur(OH_Drawing_BlurType::NORMAL, 20, true);
263 OH_Drawing_Filter *filter = OH_Drawing_FilterCreate();
264 OH_Drawing_FilterSetMaskFilter(filter, maskFilter);
265 // 设置画刷的滤波器效果
266 OH_Drawing_BrushSetFilter(brush, filter);
267 OH_Drawing_CanvasAttachBrush(canvas, brush);
268 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(value300_, value300_, value600_, value600_);
269 // 绘制矩形
270 OH_Drawing_CanvasDrawRect(canvas, rect);
271 OH_Drawing_CanvasDetachBrush(canvas);
272 // 销毁各类对象
273 OH_Drawing_BrushDestroy(brush);
274 OH_Drawing_MaskFilterDestroy(maskFilter);
275 OH_Drawing_RectDestroy(rect);
276 OH_Drawing_FilterDestroy(filter);
277 }
278