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 "aa_rect_modes.h"
16 #include <native_drawing/drawing_brush.h>
17 #include <native_drawing/drawing_matrix.h>
18 #include <native_drawing/drawing_path.h>
19 #include <native_drawing/drawing_pen.h>
20 #include <native_drawing/drawing_round_rect.h>
21 #include <native_drawing/drawing_shader_effect.h>
22 #include <native_drawing/drawing_point.h>
23 #include <native_drawing/drawing_image.h>
24 #include <native_drawing/drawing_filter.h>
25 #include <native_drawing/drawing_sampling_options.h>
26
27 #include "test_common.h"
28 #include "common/log_common.h"
29
30 char g_verbs[] = {
31 0, 1, 1, 1, 4,
32 0, 1, 1, 1, 4,
33 0, 1, 1, 1, 4,
34 0, 1, 1, 1, 4
35 };
36
test4(OH_Drawing_Canvas * canvas)37 static void test4(OH_Drawing_Canvas *canvas)
38 {
39 OH_Drawing_Brush *brush = OH_Drawing_BrushCreate();
40 OH_Drawing_BrushSetAntiAlias(brush, true);
41 OH_Drawing_CanvasAttachBrush(canvas, brush);
42 OH_Drawing_Point2D pts[] = {
43 {10, 160}, {610, 160}, {610, 160}, {10, 160},
44 {610, 160},
45 {610, 160},
46 {610, 199},
47 {610, 199},
48 {10, 198},
49 {610, 198},
50 {610, 199},
51 {10, 199},
52 {10, 160},
53 {10, 160},
54 {10, 199},
55 {10, 199}
56 };
57
58 OH_Drawing_Path *path = OH_Drawing_PathCreate();
59 OH_Drawing_Point2D *ptPtr = pts;
60 for (size_t i = 0; i < sizeof(g_verbs); ++i) {
61 switch (g_verbs[i]) {
62 case 0: // SkPath::kMove_Verb:
63 OH_Drawing_PathMoveTo(path, ptPtr->x, ptPtr->y);
64 ++ptPtr;
65 break;
66 case 1: // 1 SkPath::kLine_Verb:
67 OH_Drawing_PathLineTo(path, ptPtr->x, ptPtr->y);
68 ++ptPtr;
69 break;
70 case 4: // 4 SkPath::kClose_Verb:
71 OH_Drawing_PathClose(path);
72 break;
73 default:
74 break;
75 }
76 }
77 OH_Drawing_Rect *clip = OH_Drawing_RectCreate(0, 130, 772, 531); // 0, 130, 772, 531正方形
78 OH_Drawing_CanvasClipRect(canvas, clip, OH_Drawing_CanvasClipOp::INTERSECT, true);
79 OH_Drawing_CanvasDrawPath(canvas, path);
80 OH_Drawing_CanvasDetachBrush(canvas);
81 OH_Drawing_RectDestroy(clip);
82 OH_Drawing_BrushDestroy(brush);
83 OH_Drawing_PathDestroy(path);
84 }
85
86 constexpr OH_Drawing_BlendMode gModes[] = {
87 OH_Drawing_BlendMode::BLEND_MODE_CLEAR,
88 OH_Drawing_BlendMode::BLEND_MODE_SRC,
89 OH_Drawing_BlendMode::BLEND_MODE_DST,
90 OH_Drawing_BlendMode::BLEND_MODE_SRC_OVER,
91 OH_Drawing_BlendMode::BLEND_MODE_DST_OVER,
92 OH_Drawing_BlendMode::BLEND_MODE_SRC_IN,
93
94 OH_Drawing_BlendMode::BLEND_MODE_DST_IN,
95 OH_Drawing_BlendMode::BLEND_MODE_SRC_OUT,
96 OH_Drawing_BlendMode::BLEND_MODE_DST_OUT,
97 OH_Drawing_BlendMode::BLEND_MODE_SRC_ATOP,
98 OH_Drawing_BlendMode::BLEND_MODE_DST_ATOP,
99 OH_Drawing_BlendMode::BLEND_MODE_XOR,
100 };
101
102 const float W = 64;
103 const float H = 64;
104
drawCell(OH_Drawing_Canvas * canvas,OH_Drawing_BlendMode mode,uint8_t a0,uint8_t a1)105 static float drawCell(OH_Drawing_Canvas *canvas, OH_Drawing_BlendMode mode, uint8_t a0, uint8_t a1)
106 {
107 OH_Drawing_Brush *brush = OH_Drawing_BrushCreate();
108 OH_Drawing_BrushSetAntiAlias(brush, true);
109
110 OH_Drawing_Rect *r = OH_Drawing_RectCreate(W / 10, H / 10, W - W / 10, H - H / 10); // 10正方形
111
112 OH_Drawing_BrushSetColor(brush, 0xFF0000FF);
113 OH_Drawing_BrushSetAlpha(brush, a0);
114 OH_Drawing_CanvasAttachBrush(canvas, brush);
115 OH_Drawing_CanvasDrawOval(canvas, r);
116
117 OH_Drawing_BrushSetColor(brush, 0xFFFF0000);
118 OH_Drawing_BrushSetAlpha(brush, a1);
119 OH_Drawing_BrushSetBlendMode(brush, mode);
120 OH_Drawing_CanvasAttachBrush(canvas, brush);
121
122 float offset = 1.0 / 3;
123 OH_Drawing_Rect *rect = OH_Drawing_RectCreate(W / 4 + offset, H / 4 + offset, W / 4 + offset + W / 2,
124 H / 4 + offset + H / 2); // 4,2正方形
125 OH_Drawing_CanvasDrawRect(canvas, rect);
126 OH_Drawing_CanvasDetachBrush(canvas);
127 OH_Drawing_BrushDestroy(brush);
128 OH_Drawing_RectDestroy(rect);
129 OH_Drawing_RectDestroy(r);
130 return H;
131 }
132
make_bg_shader()133 OH_Drawing_ShaderEffect *make_bg_shader()
134 {
135 OH_Drawing_BitmapFormat format = { COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE };
136 OH_Drawing_Bitmap *bitmap = OH_Drawing_BitmapCreate();
137 OH_Drawing_BitmapBuild(bitmap, 2, 2, &format); // 2,2 width and height
138 *DrawBitmapGetAddr32(bitmap, 0, 0) = 0xFFFFFFFF;
139 *DrawBitmapGetAddr32(bitmap, 1, 1) = 0xFFFFFFFF;
140 *DrawBitmapGetAddr32(bitmap, 1, 0) = 0xFFCECFCE;
141 *DrawBitmapGetAddr32(bitmap, 0, 1) = 0xFFCECFCE;
142
143 OH_Drawing_Image *image = OH_Drawing_ImageCreate();
144 OH_Drawing_ImageBuildFromBitmap(image, bitmap);
145 OH_Drawing_SamplingOptions *option = OH_Drawing_SamplingOptionsCreate(OH_Drawing_FilterMode::FILTER_MODE_NEAREST,
146 OH_Drawing_MipmapMode::MIPMAP_MODE_NONE);
147
148 OH_Drawing_Matrix *matrix = OH_Drawing_MatrixCreateScale(6, 6, 0, 0);
149 OH_Drawing_ShaderEffect *shaderEffect = OH_Drawing_ShaderEffectCreateImageShader(image, OH_Drawing_TileMode::REPEAT,
150 OH_Drawing_TileMode::REPEAT, option, matrix);
151 OH_Drawing_BitmapDestroy(bitmap);
152 OH_Drawing_ImageDestroy(image);
153 OH_Drawing_MatrixDestroy(matrix);
154
155 return shaderEffect;
156 }
157
AARectModes()158 AARectModes::AARectModes()
159 {
160 bitmapWidth_ = 640; // 640宽度
161 bitmapHeight_ = 480; // 480高度
162 fileName_ = "aarectmodes";
163 }
164
~AARectModes()165 AARectModes::~AARectModes() {}
166
OnTestFunction(OH_Drawing_Canvas * canvas)167 void AARectModes::OnTestFunction(OH_Drawing_Canvas *canvas)
168 {
169 OH_Drawing_Brush *bgBrush = OH_Drawing_BrushCreate();
170 OH_Drawing_ShaderEffect *shaderEffect = make_bg_shader();
171 OH_Drawing_BrushSetShaderEffect(bgBrush, shaderEffect);
172 if (false)
173 test4(canvas);
174
175 OH_Drawing_Rect *bounds = OH_Drawing_RectCreate(0, 0, W, H);
176 uint8_t gAlphaValue[] = {0xFF, 0x88, 0x88};
177 OH_Drawing_CanvasTranslate(canvas, 4.0, 4.0); // 4.0距离
178
179 for (int alpha = 0; alpha < 4; ++alpha) { // 4max
180 OH_Drawing_CanvasSave(canvas);
181 OH_Drawing_CanvasSave(canvas);
182
183 for (size_t i = 0; i < 12; ++i) { // 12 max
184 if (6 == i) { // 6 cout
185 OH_Drawing_CanvasRestore(canvas);
186 OH_Drawing_CanvasTranslate(canvas, W * 5.0, 0); // 5.0距离
187 OH_Drawing_CanvasSave(canvas);
188 }
189 OH_Drawing_CanvasAttachBrush(canvas, bgBrush);
190 OH_Drawing_CanvasDrawRect(canvas, bounds);
191 OH_Drawing_CanvasSaveLayer(canvas, bounds, nullptr);
192 float dy = drawCell(canvas, gModes[i], gAlphaValue[alpha & 1], gAlphaValue[alpha & 2]);
193 OH_Drawing_CanvasRestore(canvas);
194 OH_Drawing_CanvasTranslate(canvas, 0, dy * 5.0f / 4.0f); // dy * 5.0f / 4.0f距离
195 }
196 OH_Drawing_CanvasRestore(canvas);
197 OH_Drawing_CanvasRestore(canvas);
198 OH_Drawing_CanvasTranslate(canvas, W * 5.0f / 4.0f, 0); // W * 5.0f / 4.0f 距离
199 }
200 OH_Drawing_RectDestroy(bounds);
201 OH_Drawing_BrushDestroy(bgBrush);
202 OH_Drawing_ShaderEffectDestroy(shaderEffect);
203 }
204
OnTestStability(OH_Drawing_Canvas * canvas)205 void AARectModes::OnTestStability(OH_Drawing_Canvas *canvas)
206 {
207 for (size_t i = 0; i < testCount_; i++) {
208 OnTestFunction(canvas);
209 }
210 }