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 }