1 /*
2 * Copyright (c) 2024 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 #include "fill_types_persp.h"
16
17 #include <native_drawing/drawing_brush.h>
18 #include <native_drawing/drawing_color.h>
19 #include <native_drawing/drawing_matrix.h>
20 #include <native_drawing/drawing_path.h>
21 #include <native_drawing/drawing_pen.h>
22 #include <native_drawing/drawing_point.h>
23 #include <native_drawing/drawing_round_rect.h>
24 #include <native_drawing/drawing_shader_effect.h>
25
26 #include "test_common.h"
27
28 #include "common/log_common.h"
29
30 enum {
31 K_W = 835, // 835是位图宽度
32 K_H = 840, // 840是位图高度
33 };
34
FillTypePersp()35 FillTypePersp::FillTypePersp()
36 {
37 bitmapWidth_ = K_W;
38 bitmapHeight_ = K_H;
39 fileName_ = "filltypespersp";
40 }
41
MakePath()42 void FillTypePersp::MakePath()
43 {
44 fPath = OH_Drawing_PathCreate();
45 float centerX1 = 50; // 50 创建矩形对象参数
46 float centerY1 = 50; // 40 创建矩形对象参数
47 float radius1 = 45; // 45 创建矩形对象参数
48 float centerX2 = 100; // 100 创建矩形对象参数
49 float centerY2 = 100; // 100 创建矩形对象参数
50 float radius2 = 45; // 45 创建矩形对象参数
51 DrawPathAddCircle(fPath, centerX1, centerY1, radius1);
52 DrawPathAddCircle(fPath, centerX2, centerY2, radius2);
53 }
54
ShowPath(OH_Drawing_Canvas * canvas,DATA_PARAM param,OH_Drawing_Brush * brush)55 void FillTypePersp::ShowPath(OH_Drawing_Canvas* canvas, DATA_PARAM param, OH_Drawing_Brush* brush)
56 {
57 int x = param.x;
58 int y = param.y;
59 OH_Drawing_PathFillType ft = param.ft;
60 float scale = param.scale;
61 DrawRect r = { 0, 0, 150, 150 }; // 0, 0, 150, 150 DrawRect 参数
62 OH_Drawing_Rect* rc = DrawCreateRect(r);
63 OH_Drawing_CanvasSave(canvas);
64 OH_Drawing_CanvasTranslate(canvas, x, y);
65 OH_Drawing_CanvasClipRect(canvas, rc, OH_Drawing_CanvasClipOp::INTERSECT, false);
66 OH_Drawing_CanvasClear(canvas, 0xFFFFFFFF);
67 OH_Drawing_PathSetFillType(fPath, ft);
68 OH_Drawing_CanvasTranslate(canvas, r.CenterX(), r.CenterY());
69 OH_Drawing_CanvasScale(canvas, scale, scale);
70 OH_Drawing_CanvasTranslate(canvas, -r.CenterX(), -r.CenterY());
71 OH_Drawing_CanvasAttachBrush(canvas, brush);
72 OH_Drawing_CanvasDrawPath(canvas, fPath);
73 OH_Drawing_CanvasDetachBrush(canvas);
74 OH_Drawing_RectDestroy(rc);
75 OH_Drawing_CanvasRestore(canvas);
76 }
77
ShowFour(OH_Drawing_Canvas * canvas,float scale,bool aa)78 void FillTypePersp::ShowFour(OH_Drawing_Canvas* canvas, float scale, bool aa)
79 {
80 OH_Drawing_Brush* brush = OH_Drawing_BrushCreate();
81 OH_Drawing_Point* center = OH_Drawing_PointCreate(100, 100); // 100, 100 PointCreate参数值
82 uint32_t colors[] = { DRAW_COLORBLUE, DRAW_COLORRED, DRAW_COLORGREEN };
83 float pos[] = { 0, 0.5, 1.0 }; //{ 0, 0.5, 1.0 } alpha array
84 OH_Drawing_ShaderEffect* effect = OH_Drawing_ShaderEffectCreateRadialGradient(
85 center, 100, colors, pos, 3, OH_Drawing_TileMode::CLAMP); // 100 gradient radius 3 pos count
86 OH_Drawing_BrushSetShaderEffect(brush, effect);
87 OH_Drawing_BrushSetAntiAlias(brush, aa);
88 OH_Drawing_CanvasAttachBrush(canvas, brush);
89
90 float offset = 200.0;
91 DATA_PARAM param;
92 param.x = 0;
93 param.y = 0;
94 param.ft = OH_Drawing_PathFillType::PATH_FILL_TYPE_WINDING;
95 param.scale = scale;
96 ShowPath(canvas, param, brush); // 0 、0是绘制路径时的平移量
97 param.x = offset;
98 param.ft = OH_Drawing_PathFillType::PATH_FILL_TYPE_EVEN_ODD;
99 ShowPath(canvas, param, brush); // 200、 0 是绘制路径时的平移量
100 param.x = 0;
101 param.y = offset;
102 param.ft = OH_Drawing_PathFillType::PATH_FILL_TYPE_INVERSE_WINDING;
103 ShowPath(canvas, param, brush); // 0、200 是绘制路径时的平移量
104 param.x = offset;
105 param.y = offset;
106 param.ft = OH_Drawing_PathFillType::PATH_FILL_TYPE_INVERSE_EVEN_ODD;
107 ShowPath(canvas, param, brush); // 200、200 是绘制路径时的平移量
108
109 OH_Drawing_CanvasDetachBrush(canvas);
110 OH_Drawing_ShaderEffectDestroy(effect);
111 OH_Drawing_BrushDestroy(brush);
112 OH_Drawing_PointDestroy(center);
113 }
114
OnTestFunction(OH_Drawing_Canvas * canvas)115 void FillTypePersp::OnTestFunction(OH_Drawing_Canvas* canvas)
116 {
117 MakePath();
118
119 OH_Drawing_Brush* bkgnrd = OH_Drawing_BrushCreate();
120 OH_Drawing_Point* center = OH_Drawing_PointCreate(100, 100); // 100, 100 PointCreate参数值
121 uint32_t colors[] = { DRAW_COLORBLACK, DRAW_COLORCYAN, DRAW_COLORYELLOW, DRAW_COLORWHITE };
122 float pos[] = { 0, 0.25, 0.75, 1.0 }; //{ 0, 0.25, 0.75, 1.0 } alpha值
123 OH_Drawing_ShaderEffect* effect = OH_Drawing_ShaderEffectCreateRadialGradient(
124 center, 1000, colors, pos, 4, OH_Drawing_TileMode::CLAMP); // 1000 radius ,4 colors and pos count
125 OH_Drawing_BrushSetShaderEffect(bkgnrd, effect);
126 OH_Drawing_CanvasAttachBrush(canvas, bkgnrd);
127
128 OH_Drawing_CanvasSave(canvas);
129 OH_Drawing_CanvasTranslate(canvas, 100, 100); // 100, 100 Indicates the distance to translate on x-axis、y-axis.
130
131 OH_Drawing_Matrix* mat = OH_Drawing_MatrixCreate();
132 OH_Drawing_MatrixSetMatrix(mat, 1, 0, 0, // 1、 0、 0 矩阵参数
133 0, 1, 0, // 0, 1, 0 0, 1, 0
134 0, 1.0 / 1000, 1); // 0, 1.0 / 1000,1 都是矩阵参数
135 OH_Drawing_CanvasConcatMatrix(canvas, mat);
136 OH_Drawing_CanvasDrawBackground(canvas, bkgnrd);
137 OH_Drawing_CanvasRestore(canvas);
138
139 OH_Drawing_Matrix* persp = OH_Drawing_MatrixCreate();
140 OH_Drawing_MatrixSetMatrix(
141 persp, 1, 0, 0, 0, 1, 0, -1.0 / 1800, 1.0 / 500, 1); // 1, 0, 0, 0, 1, 0, -1.0 / 1800, 1.0 / 500, 1 矩阵参数
142 OH_Drawing_CanvasConcatMatrix(canvas, persp);
143 OH_Drawing_CanvasTranslate(canvas, 20, 20); // 20, 20 Translate 参数
144
145 float scale = 5.0 / 4; // 5.0 / 4 ShowFour 参数
146 ShowFour(canvas, 1.0, false); // 1.0 ShowFour
147 OH_Drawing_CanvasTranslate(canvas, 450, 0); // 450, 0 参数
148 ShowFour(canvas, scale, false);
149
150 OH_Drawing_CanvasTranslate(canvas, -450, 450); // -450, 450 Translate参数
151 ShowFour(canvas, 1, true); // 1 ShowFour
152 OH_Drawing_CanvasTranslate(canvas, 450, 0); // 450, 0 Translate参数
153 ShowFour(canvas, scale, true);
154
155 OH_Drawing_CanvasDetachBrush(canvas);
156 OH_Drawing_ShaderEffectDestroy(effect);
157 OH_Drawing_BrushDestroy(bkgnrd);
158 OH_Drawing_MatrixDestroy(mat);
159 OH_Drawing_MatrixDestroy(persp);
160 OH_Drawing_PathDestroy(fPath);
161 OH_Drawing_PointDestroy(center);
162 }
163