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
DrawMatrixBasic(OH_Drawing_Canvas * canvas)37 void SampleGraphics::DrawMatrixBasic(OH_Drawing_Canvas *canvas)
38 {
39 OH_Drawing_Pen* pen = OH_Drawing_PenCreate();
40 OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
41 OH_Drawing_PenSetWidth(pen, value10_);
42 OH_Drawing_CanvasAttachPen(canvas, pen);
43 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(value300_, value300_, value600_, value500_);
44 // 绘制原始矩形
45 OH_Drawing_CanvasDrawRect(canvas, rect);
46 // 创建矩阵对象
47 OH_Drawing_Matrix *matrix = OH_Drawing_MatrixCreate();
48 // 设置矩阵(平移)
49 OH_Drawing_MatrixSetMatrix(matrix, indexOne_, 0, value300_, 0, indexOne_, value300_, 0, 0, indexOne_);
50 OH_Drawing_Point2D src{value300_, value300_};
51 OH_Drawing_Point2D dst;
52 // 源点坐标变换为目标点坐标
53 OH_Drawing_MatrixMapPoints(matrix, &src, &dst, indexOne_);
54 SAMPLE_LOGI("DrawMatrixBasic-->point(src) x=%{public}f,y=%{public}f", src.x, src.y);
55 SAMPLE_LOGI("DrawMatrixBasic-->point(dst) x=%{public}f,y=%{public}f", dst.x, dst.y);
56 OH_Drawing_Rect *rect2 = OH_Drawing_RectCreate(0, 0, 0, 0);
57 // 源矩形变换为目标矩形
58 OH_Drawing_MatrixMapRect(matrix, rect, rect2);
59 SAMPLE_LOGI("DrawMatrixBasic-->rect(src) left=%{public}f,top=%{public}f,right=%{public}f,bottom=%{public}f",
60 OH_Drawing_RectGetLeft(rect), OH_Drawing_RectGetTop(rect), OH_Drawing_RectGetRight(rect),
61 OH_Drawing_RectGetBottom(rect));
62 SAMPLE_LOGI("DrawMatrixBasic-->rect(dst) left=%{public}f,top=%{public}f,right=%{public}f,bottom=%{public}f",
63 OH_Drawing_RectGetLeft(rect2), OH_Drawing_RectGetTop(rect2), OH_Drawing_RectGetRight(rect2),
64 OH_Drawing_RectGetBottom(rect2));
65 OH_Drawing_CanvasConcatMatrix(canvas, matrix);
66 // 绘制变换后的矩形
67 OH_Drawing_CanvasDrawRect(canvas, rect);
68 OH_Drawing_Matrix *matrix2 = OH_Drawing_MatrixCreate();
69 // 逆矩阵
70 OH_Drawing_MatrixInvert(matrix2, matrix);
71 SAMPLE_LOGI(
72 "matrix2(%{public}f,%{public}f,%{public}f,%{public}f,%{public}f,%{public}f,%{public}f,%{public}f,%{public}f)",
73 OH_Drawing_MatrixGetValue(matrix, 0), OH_Drawing_MatrixGetValue(matrix, indexOne_),
74 OH_Drawing_MatrixGetValue(matrix, indexTwo_), OH_Drawing_MatrixGetValue(matrix, indexThree_),
75 OH_Drawing_MatrixGetValue(matrix, indexFour_), OH_Drawing_MatrixGetValue(matrix, indexFive_),
76 OH_Drawing_MatrixGetValue(matrix, indexSix_), OH_Drawing_MatrixGetValue(matrix, indexSeven_),
77 OH_Drawing_MatrixGetValue(matrix, indexNine_));
78 // 重置矩阵
79 OH_Drawing_MatrixReset(matrix);
80 OH_Drawing_CanvasDetachBrush(canvas);
81 // 释放对象
82 OH_Drawing_RectDestroy(rect);
83 OH_Drawing_RectDestroy(rect2);
84 OH_Drawing_MatrixDestroy(matrix);
85 OH_Drawing_MatrixDestroy(matrix2);
86 OH_Drawing_PenDestroy(pen);
87 }
88
DrawTranslationOperation(OH_Drawing_Canvas * canvas)89 void SampleGraphics::DrawTranslationOperation(OH_Drawing_Canvas *canvas)
90 {
91 OH_Drawing_Pen* pen = OH_Drawing_PenCreate();
92 OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
93 OH_Drawing_PenSetWidth(pen, value10_);
94 OH_Drawing_CanvasAttachPen(canvas, pen);
95 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(value300_, value300_, value600_, value500_);
96 // 绘制原始矩形
97 OH_Drawing_CanvasDrawRect(canvas, rect);
98 // 创建在水平和垂直方向分别平移300px的矩阵对象
99 OH_Drawing_Matrix *matrix = OH_Drawing_MatrixCreateTranslation(value300_, value300_);
100 OH_Drawing_CanvasConcatMatrix(canvas, matrix);
101 // 绘制变换后的矩形
102 OH_Drawing_CanvasDrawRect(canvas, rect);
103 OH_Drawing_CanvasDetachBrush(canvas);
104 OH_Drawing_RectDestroy(rect);
105 OH_Drawing_MatrixDestroy(matrix);
106 OH_Drawing_PenDestroy(pen);
107 }
108
DrawPreTranslationOperation(OH_Drawing_Canvas * canvas)109 void SampleGraphics::DrawPreTranslationOperation(OH_Drawing_Canvas *canvas)
110 {
111 OH_Drawing_Pen* pen = OH_Drawing_PenCreate();
112 OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
113 OH_Drawing_PenSetWidth(pen, value10_);
114 OH_Drawing_CanvasAttachPen(canvas, pen);
115 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(value300_, value300_, value600_, value500_);
116 // 绘制原始矩形
117 OH_Drawing_CanvasDrawRect(canvas, rect);
118 OH_Drawing_Matrix *matrix = OH_Drawing_MatrixCreate();
119 // 旋转
120 OH_Drawing_MatrixRotate(matrix, value45_, value300_, value300_);
121 // 左乘平移(先平移后旋转)
122 OH_Drawing_MatrixPreTranslate(matrix, value200_, value200_);
123 OH_Drawing_CanvasConcatMatrix(canvas, matrix);
124 // 绘制变换后的矩形
125 OH_Drawing_CanvasDrawRect(canvas, rect);
126 OH_Drawing_CanvasDetachBrush(canvas);
127 OH_Drawing_RectDestroy(rect);
128 OH_Drawing_MatrixDestroy(matrix);
129 OH_Drawing_PenDestroy(pen);
130 }
131
DrawPostTranslationOperation(OH_Drawing_Canvas * canvas)132 void SampleGraphics::DrawPostTranslationOperation(OH_Drawing_Canvas *canvas)
133 {
134 OH_Drawing_Pen* pen = OH_Drawing_PenCreate();
135 OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
136 OH_Drawing_PenSetWidth(pen, value10_);
137 OH_Drawing_CanvasAttachPen(canvas, pen);
138 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(value300_, value300_, value600_, value500_);
139 // 绘制原始矩形
140 OH_Drawing_CanvasDrawRect(canvas, rect);
141 OH_Drawing_Matrix *matrix = OH_Drawing_MatrixCreate();
142 // 旋转
143 OH_Drawing_MatrixRotate(matrix, value45_, value300_, value300_);
144 // 右乘平移(先旋转后平移)
145 OH_Drawing_MatrixPostTranslate(matrix, value200_, value200_);
146 OH_Drawing_CanvasConcatMatrix(canvas, matrix);
147 // 绘制变换后的矩形
148 OH_Drawing_CanvasDrawRect(canvas, rect);
149 OH_Drawing_CanvasDetachBrush(canvas);
150 OH_Drawing_RectDestroy(rect);
151 OH_Drawing_MatrixDestroy(matrix);
152 OH_Drawing_PenDestroy(pen);
153 }
154
DrawRotationOperation(OH_Drawing_Canvas * canvas)155 void SampleGraphics::DrawRotationOperation(OH_Drawing_Canvas *canvas)
156 {
157 OH_Drawing_Pen* pen = OH_Drawing_PenCreate();
158 OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
159 OH_Drawing_PenSetWidth(pen, value10_);
160 OH_Drawing_CanvasAttachPen(canvas, pen);
161 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(value300_, value300_, value600_, value500_);
162 // 绘制原始矩形
163 OH_Drawing_CanvasDrawRect(canvas, rect);
164 // 创建旋转的矩阵对象
165 OH_Drawing_Matrix* matrix = OH_Drawing_MatrixCreateRotation(value45_, value300_, value300_);
166 OH_Drawing_CanvasConcatMatrix(canvas, matrix);
167 // 绘制变换后的矩形
168 OH_Drawing_CanvasDrawRect(canvas, rect);
169 OH_Drawing_CanvasDetachBrush(canvas);
170 OH_Drawing_RectDestroy(rect);
171 OH_Drawing_MatrixDestroy(matrix);
172 OH_Drawing_PenDestroy(pen);
173 }
174
DrawPreRotationOperation(OH_Drawing_Canvas * canvas)175 void SampleGraphics::DrawPreRotationOperation(OH_Drawing_Canvas *canvas)
176 {
177 OH_Drawing_Pen* pen = OH_Drawing_PenCreate();
178 OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
179 OH_Drawing_PenSetWidth(pen, value10_);
180 OH_Drawing_CanvasAttachPen(canvas, pen);
181 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(value300_, value300_, value600_, value500_);
182 // 绘制原始矩形
183 OH_Drawing_CanvasDrawRect(canvas, rect);
184 OH_Drawing_Matrix* matrix = OH_Drawing_MatrixCreate();
185 // 平移
186 OH_Drawing_MatrixTranslate(matrix, value200_, value200_);
187 // 左乘旋转(先旋转后平移)
188 OH_Drawing_MatrixPreRotate(matrix, value45_, value300_, value300_);
189 OH_Drawing_CanvasConcatMatrix(canvas, matrix);
190 // 绘制变换后的矩形
191 OH_Drawing_CanvasDrawRect(canvas, rect);
192 OH_Drawing_CanvasDetachBrush(canvas);
193 OH_Drawing_RectDestroy(rect);
194 OH_Drawing_MatrixDestroy(matrix);
195 OH_Drawing_PenDestroy(pen);
196 }
197
DrawPostRotationOperation(OH_Drawing_Canvas * canvas)198 void SampleGraphics::DrawPostRotationOperation(OH_Drawing_Canvas *canvas)
199 {
200 OH_Drawing_Pen* pen = OH_Drawing_PenCreate();
201 OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
202 OH_Drawing_PenSetWidth(pen, value10_);
203 OH_Drawing_CanvasAttachPen(canvas, pen);
204 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(value300_, value300_, value600_, value500_);
205 // 绘制原始矩形
206 OH_Drawing_CanvasDrawRect(canvas, rect);
207 OH_Drawing_Matrix* matrix = OH_Drawing_MatrixCreate();
208 // 平移
209 OH_Drawing_MatrixTranslate(matrix, value200_, value200_);
210 // 右乘旋转(先平移后旋转)
211 OH_Drawing_MatrixPostRotate(matrix, value45_, value300_, value300_);
212 OH_Drawing_CanvasConcatMatrix(canvas, matrix);
213 // 绘制变换后的矩形
214 OH_Drawing_CanvasDrawRect(canvas, rect);
215 OH_Drawing_CanvasDetachBrush(canvas);
216 OH_Drawing_RectDestroy(rect);
217 OH_Drawing_MatrixDestroy(matrix);
218 OH_Drawing_PenDestroy(pen);
219 }
220
DrawScaleOperation(OH_Drawing_Canvas * canvas)221 void SampleGraphics::DrawScaleOperation(OH_Drawing_Canvas *canvas)
222 {
223 OH_Drawing_Pen* pen = OH_Drawing_PenCreate();
224 OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
225 OH_Drawing_PenSetWidth(pen, value10_);
226 OH_Drawing_CanvasAttachPen(canvas, pen);
227 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(value300_, value300_, value600_, value500_);
228 // 绘制原始矩形
229 OH_Drawing_CanvasDrawRect(canvas, rect);
230 // 创建缩放的矩阵对象
231 OH_Drawing_Matrix* matrix = OH_Drawing_MatrixCreateScale(2, 2, value300_, value300_);
232 OH_Drawing_CanvasConcatMatrix(canvas, matrix);
233 // 绘制变换后的矩形
234 OH_Drawing_CanvasDrawRect(canvas, rect);
235 OH_Drawing_CanvasDetachPen(canvas);
236 OH_Drawing_RectDestroy(rect);
237 OH_Drawing_PenDestroy(pen);
238 OH_Drawing_MatrixDestroy(matrix);
239 }
240
DrawPreScaleOperation(OH_Drawing_Canvas * canvas)241 void SampleGraphics::DrawPreScaleOperation(OH_Drawing_Canvas *canvas)
242 {
243 OH_Drawing_Pen* pen = OH_Drawing_PenCreate();
244 OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
245 OH_Drawing_PenSetWidth(pen, value10_);
246 OH_Drawing_CanvasAttachPen(canvas, pen);
247 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(value300_, value300_, value600_, value500_);
248 // 绘制原始矩形
249 OH_Drawing_CanvasDrawRect(canvas, rect);
250 OH_Drawing_Matrix* matrix = OH_Drawing_MatrixCreateTranslation(value100_, value100_);
251 // 左乘缩放(先缩放后平移)
252 OH_Drawing_MatrixPreScale(matrix, indexTwo_, indexTwo_, value300_, value300_);
253 OH_Drawing_CanvasConcatMatrix(canvas, matrix);
254 // 绘制变换后的矩形
255 OH_Drawing_CanvasDrawRect(canvas, rect);
256 OH_Drawing_CanvasDetachPen(canvas);
257 OH_Drawing_RectDestroy(rect);
258 OH_Drawing_PenDestroy(pen);
259 OH_Drawing_MatrixDestroy(matrix);
260 }
261
DrawPostScaleOperation(OH_Drawing_Canvas * canvas)262 void SampleGraphics::DrawPostScaleOperation(OH_Drawing_Canvas *canvas)
263 {
264 OH_Drawing_Pen* pen = OH_Drawing_PenCreate();
265 OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
266 OH_Drawing_PenSetWidth(pen, value10_);
267 OH_Drawing_CanvasAttachPen(canvas, pen);
268 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(value300_, value300_, value600_, value500_);
269 // 绘制原始矩形
270 OH_Drawing_CanvasDrawRect(canvas, rect);
271 OH_Drawing_Matrix* matrix = OH_Drawing_MatrixCreateTranslation(value100_, value100_);
272 // 右乘缩放(先平移后缩放)
273 OH_Drawing_MatrixPostScale(matrix, indexTwo_, indexTwo_, value300_, value300_);
274 OH_Drawing_CanvasConcatMatrix(canvas, matrix);
275 // 绘制变换后的矩形
276 OH_Drawing_CanvasDrawRect(canvas, rect);
277 OH_Drawing_CanvasDetachPen(canvas);
278 OH_Drawing_RectDestroy(rect);
279 OH_Drawing_PenDestroy(pen);
280 OH_Drawing_MatrixDestroy(matrix);
281 }
282
DrawConcatOperation(OH_Drawing_Canvas * canvas)283 void SampleGraphics::DrawConcatOperation(OH_Drawing_Canvas *canvas)
284 {
285 OH_Drawing_Pen* pen = OH_Drawing_PenCreate();
286 OH_Drawing_PenSetColor(pen, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
287 OH_Drawing_PenSetWidth(pen, value10_);
288 OH_Drawing_CanvasAttachPen(canvas, pen);
289 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(value300_, value300_, value600_, value500_);
290 // 绘制原始矩形
291 OH_Drawing_CanvasDrawRect(canvas, rect);
292 OH_Drawing_Matrix* matrix1 = OH_Drawing_MatrixCreateTranslation(value100_, value100_);
293 OH_Drawing_Matrix* matrix2 = OH_Drawing_MatrixCreate();
294 OH_Drawing_Matrix* matrix3 = OH_Drawing_MatrixCreate();
295 OH_Drawing_MatrixScale(matrix2, indexTwo_, indexTwo_, value300_, value300_);
296 OH_Drawing_MatrixConcat(matrix3, matrix2, matrix1);
297 OH_Drawing_CanvasConcatMatrix(canvas, matrix3);
298 // 绘制变换后的矩形
299 OH_Drawing_CanvasDrawRect(canvas, rect);
300 OH_Drawing_CanvasDetachPen(canvas);
301 OH_Drawing_RectDestroy(rect);
302 OH_Drawing_PenDestroy(pen);
303 OH_Drawing_MatrixDestroy(matrix1);
304 OH_Drawing_MatrixDestroy(matrix2);
305 OH_Drawing_MatrixDestroy(matrix3);
306 }
307