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