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