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