• 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 
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