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 
16 #include "path_interior.h"
17 
18 #include <native_drawing/drawing_brush.h>
19 #include <native_drawing/drawing_color.h>
20 #include <native_drawing/drawing_matrix.h>
21 #include <native_drawing/drawing_path.h>
22 #include <native_drawing/drawing_pen.h>
23 #include <native_drawing/drawing_point.h>
24 #include <native_drawing/drawing_round_rect.h>
25 #include <native_drawing/drawing_shader_effect.h>
26 #include <rdma/bnxt_re-abi.h>
27 
28 #include "test_common.h"
29 
30 #include "common/log_common.h"
31 
32 enum {
33     K_W = 770, // 770 是位图宽度
34     K_H = 770, // 770 是位图高度
35 };
36 
37 typedef struct {
38     int insetFirst;
39     int doEvenOdd;
40     int outerRR;
41     int innerRR;
42     int outerCW;
43     int innerCW;
44 } DRAW_PARAM;
45 
46 namespace {
show(OH_Drawing_Canvas * canvas,OH_Drawing_Path * path)47 void show(OH_Drawing_Canvas* canvas, OH_Drawing_Path* path)
48 {
49     OH_Drawing_Brush* brush = OH_Drawing_BrushCreate();
50     OH_Drawing_BrushSetAntiAlias(brush, true);
51     bool hasInterior = false;
52     OH_Drawing_BrushSetColor(brush, hasInterior ? color_to_565(0xFF8888FF) : 0xFF888888); // gray
53     OH_Drawing_CanvasAttachBrush(canvas, brush);
54     OH_Drawing_CanvasDrawPath(canvas, path);
55     OH_Drawing_CanvasDetachBrush(canvas);
56 
57     OH_Drawing_Pen* pen = OH_Drawing_PenCreate();
58     OH_Drawing_PenSetAntiAlias(pen, true);
59     OH_Drawing_PenSetColor(pen, 0xFFFF0000);
60     OH_Drawing_CanvasAttachPen(canvas, pen);
61     OH_Drawing_CanvasDrawPath(canvas, path);
62     OH_Drawing_CanvasDetachPen(canvas);
63 
64     OH_Drawing_BrushDestroy(brush);
65     OH_Drawing_PenDestroy(pen);
66 }
67 
inset(DrawRect & r)68 DrawRect inset(DrawRect& r)
69 {
70     DrawRect rect = r;
71     rect.Inset(r.Width() / 8, r.Height() / 8); // 8  rect控制
72     return rect;
73 }
74 
draw_sence(OH_Drawing_Canvas * canvas,DRAW_PARAM & param,int & i)75 void draw_sence(OH_Drawing_Canvas* canvas, DRAW_PARAM& param, int& i)
76 {
77     DrawRect rect = { 0, 0, 80, 80 };   // 0, 0, 80, 80 矩形参数
78     const float rad = rect.Width() / 8; // 8 用于计算矩形的内边距
79     int insetFirst = param.insetFirst;
80     int doEvenOdd = param.doEvenOdd;
81     int outerRR = param.outerRR;
82     int innerRR = param.innerRR;
83     int outerCW = param.outerCW;
84     int innerCW = param.innerCW;
85 
86     OH_Drawing_Path* path = OH_Drawing_PathCreate();
87     OH_Drawing_PathSetFillType(path, doEvenOdd ? PATH_FILL_TYPE_EVEN_ODD : PATH_FILL_TYPE_WINDING);
88     OH_Drawing_PathDirection outerDir = outerCW ? PATH_DIRECTION_CW : PATH_DIRECTION_CCW;
89     OH_Drawing_PathDirection innerDir = innerCW ? PATH_DIRECTION_CW : PATH_DIRECTION_CCW;
90 
91     DrawRect rc = insetFirst ? inset(rect) : rect;
92     OH_Drawing_Rect* r = OH_Drawing_RectCreate(rc.left, rc.top, rc.right, rc.bottom);
93     OH_Drawing_RoundRect* rr = OH_Drawing_RoundRectCreate(r, rad, rad);
94     if (outerRR) {
95         OH_Drawing_PathAddRoundRect(path, rr, outerDir);
96     } else {
97         OH_Drawing_PathAddRect(path, rc.left, rc.top, rc.right, rc.bottom, outerDir);
98     }
99     OH_Drawing_RoundRectDestroy(rr);
100     OH_Drawing_RectDestroy(r);
101 
102     rc = insetFirst ? rect : inset(rect);
103     r = OH_Drawing_RectCreate(rc.left, rc.top, rc.right, rc.bottom);
104     rr = OH_Drawing_RoundRectCreate(r, rad, rad);
105     if (innerRR) {
106         OH_Drawing_PathAddRoundRect(path, rr, innerDir);
107     } else {
108         OH_Drawing_PathAddRect(path, rc.left, rc.top, rc.right, rc.bottom, innerDir);
109     }
110     OH_Drawing_RoundRectDestroy(rr);
111     OH_Drawing_RectDestroy(r);
112 
113     float dx = (i / 8) * rect.Width() * 6 / 5; //   (i / 8) * rect.Width() * 6 / 5 用于计算路径在画布上的偏移量
114     float dy = (i % 8) * rect.Height() * 6 / 5; //   (i / 8) * rect.Height() * 6 / 5 用于计算路径在画布上的偏移量
115     i++;
116     OH_Drawing_PathOffset(path, path, dx, dy);
117     show(canvas, path);
118     OH_Drawing_PathDestroy(path);
119 }
120 
draw_sence_innerCW(OH_Drawing_Canvas * canvas,DRAW_PARAM & param,int & i)121 void draw_sence_innerCW(OH_Drawing_Canvas* canvas, DRAW_PARAM& param, int& i)
122 {
123     for (int innerCW = 0; innerCW <= 1; ++innerCW) { // 1 模式选择
124         param.innerCW = innerCW;
125         draw_sence(canvas, param, i);
126     }
127 }
128 
draw_sence_outerCW(OH_Drawing_Canvas * canvas,DRAW_PARAM & param,int & i)129 void draw_sence_outerCW(OH_Drawing_Canvas* canvas, DRAW_PARAM& param, int& i)
130 {
131     for (int outerCW = 0; outerCW <= 1; ++outerCW) { // 1 模式选择
132         param.outerCW = outerCW;
133         draw_sence_innerCW(canvas, param, i);
134     }
135 }
136 
draw_sence_innerRR(OH_Drawing_Canvas * canvas,DRAW_PARAM & param,int & i)137 void draw_sence_innerRR(OH_Drawing_Canvas* canvas, DRAW_PARAM& param, int& i)
138 {
139     for (int innerRR = 0; innerRR <= 1; ++innerRR) { // 1 模式选择
140         param.innerRR = innerRR;
141         draw_sence_outerCW(canvas, param, i);
142     }
143 }
144 
draw_sence_outerRR(OH_Drawing_Canvas * canvas,DRAW_PARAM & param,int & i)145 void draw_sence_outerRR(OH_Drawing_Canvas* canvas, DRAW_PARAM& param, int& i)
146 {
147     for (int outerRR = 0; outerRR <= 1; ++outerRR) { // 1 模式选择
148         param.outerRR = outerRR;
149         draw_sence_innerRR(canvas, param, i);
150     }
151 }
152 
draw_sence_doEvenOdd(OH_Drawing_Canvas * canvas,DRAW_PARAM & param,int & i)153 void draw_sence_doEvenOdd(OH_Drawing_Canvas* canvas, DRAW_PARAM& param, int& i)
154 {
155     for (int doEvenOdd = 0; doEvenOdd <= 1; ++doEvenOdd) { // 1 模式选择
156         param.doEvenOdd = doEvenOdd;
157         draw_sence_outerRR(canvas, param, i);
158     }
159 }
160 
draw_sence_insetFirst(OH_Drawing_Canvas * canvas,DRAW_PARAM & param,int & i)161 void draw_sence_insetFirst(OH_Drawing_Canvas* canvas, DRAW_PARAM& param, int& i)
162 {
163     for (int insetFirst = 0; insetFirst <= 1; ++insetFirst) { // 1 模式选择
164         param.insetFirst = insetFirst;
165         draw_sence_doEvenOdd(canvas, param, i);
166     }
167 }
168 
169 } // namespace
170 
PathInterior()171 PathInterior::PathInterior()
172 {
173     bitmapWidth_ = K_W;
174     bitmapHeight_ = K_H;
175     fileName_ = "pathinterior";
176 }
177 
OnTestFunction(OH_Drawing_Canvas * canvas)178 void PathInterior::OnTestFunction(OH_Drawing_Canvas* canvas)
179 {
180     OH_Drawing_CanvasClear(canvas, 0xFFDDDDDD);     // gray
181     OH_Drawing_CanvasTranslate(canvas, 8.5f, 8.5f); // 8.5f 定义了画布的平移量
182 
183     int i = 0; // 0 PathOffset
184 
185     DRAW_PARAM param = { 0 };
186     draw_sence_insetFirst(canvas, param, i);
187 }
188