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 "gradient_dirty_laundry.h"
16
17 #include <array>
18 #include <ctime>
19 #include <native_drawing/drawing_brush.h>
20 #include <native_drawing/drawing_color.h>
21 #include <native_drawing/drawing_font.h>
22 #include <native_drawing/drawing_matrix.h>
23 #include <native_drawing/drawing_path.h>
24 #include <native_drawing/drawing_pen.h>
25 #include <native_drawing/drawing_point.h>
26 #include <native_drawing/drawing_rect.h>
27 #include <native_drawing/drawing_shader_effect.h>
28 #include <native_drawing/drawing_text_blob.h>
29
30 #include "test_common.h"
31
32 #include "common/log_common.h"
33
34 enum { WIDTH = 640, HEIGHT = 615 }; // 640,615 定义了位图的宽度和高度
35
Gradients()36 Gradients::Gradients()
37 {
38 bitmapWidth_ = WIDTH;
39 bitmapHeight_ = HEIGHT;
40 fileName_ = "gradient_dirty_laundry";
41 }
42
43 struct GradData {
44 int fCount = 40; // 40 表示颜色数量
45 const uint32_t* fColors;
46 const float* fPos;
47 };
48
49 constexpr int K_NUM_COLOR_CHOICES = 40; // 40 定义了颜色数组的大小
50 uint32_t g_colors[K_NUM_COLOR_CHOICES] = {
51 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF, 0xFF000000,
52 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF, 0xFF000000,
53 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF, 0xFF000000,
54 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF, 0xFF000000,
55 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF, 0xFF000000,
56 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF, 0xFF000000,
57 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF, 0xFF000000,
58 0xFFFF0000, 0xFF00FF00, 0xFF0000FF, 0xFFFFFFFF, 0xFF000000, // 8 lines, 40 colors
59 };
60
61 constexpr GradData G_GRAD_DATA[] = { { 40, g_colors, nullptr } }; // 40 表示颜色数量
62 GradData g_data = G_GRAD_DATA[0];
63
64 // 定义三种着色器
MakeLinear(const OH_Drawing_Point * firstPoint,const OH_Drawing_Point * secondPoint,const GradData & g_data,OH_Drawing_TileMode tileMode)65 OH_Drawing_ShaderEffect* MakeLinear(const OH_Drawing_Point* firstPoint, const OH_Drawing_Point* secondPoint,
66 const GradData& g_data, OH_Drawing_TileMode tileMode)
67 {
68 DRAWING_LOGI("GradientsGM MakeLinear");
69 OH_Drawing_ShaderEffect* MakeLinear = OH_Drawing_ShaderEffectCreateLinearGradient(
70 firstPoint, secondPoint, g_data.fColors, g_data.fPos, g_data.fCount, tileMode);
71 return MakeLinear;
72 }
MakeRadial(const OH_Drawing_Point * firstPoint,const OH_Drawing_Point * secondPoint,const GradData & g_data,OH_Drawing_TileMode tileMode)73 OH_Drawing_ShaderEffect* MakeRadial(const OH_Drawing_Point* firstPoint, const OH_Drawing_Point* secondPoint,
74 const GradData& g_data, OH_Drawing_TileMode tileMode)
75 {
76 DRAWING_LOGI("GradientsGM MakeRadial");
77
78 // 圆心和圆半径坐标
79 OH_Drawing_Point2D pts[] = { { 0, 0 }, { 100.0, 100.0 } }; // 100.0, 100.0 坐标点
80 OH_Drawing_Point2D Point = { (pts[0].x + pts[1].x) / 2, (pts[0].y + pts[1].y) / 2 }; // 取[0] 和[2] 的元素中点
81 OH_Drawing_Point* centerPt = OH_Drawing_PointCreate(Point.x, Point.y);
82 OH_Drawing_ShaderEffect* MakeRadial = OH_Drawing_ShaderEffectCreateRadialGradient(
83 centerPt, Point.x, g_data.fColors, g_data.fPos, g_data.fCount, tileMode);
84 OH_Drawing_PointDestroy(centerPt);
85 return MakeRadial;
86 }
MakeSweep(const OH_Drawing_Point * firstPoint,const OH_Drawing_Point * secondPoint,const GradData & g_data,OH_Drawing_TileMode tileMode)87 OH_Drawing_ShaderEffect* MakeSweep(const OH_Drawing_Point* firstPoint, const OH_Drawing_Point* secondPoint,
88 const GradData& g_data, OH_Drawing_TileMode tileMode)
89 {
90 DRAWING_LOGI("GradientsGM MakeSweep");
91 // 圆心和圆半径坐标
92 OH_Drawing_Point2D pts[] = { { 0, 0 }, { 100.0, 100.0 } }; // 100 设置点
93 OH_Drawing_Point2D Point = { (pts[0].x + pts[1].x) / 2, (pts[0].y + pts[1].y) / 2 }; // 取[0] 和[2] 的元素中点
94 OH_Drawing_Point* centerPt = OH_Drawing_PointCreate(Point.x, Point.y);
95 OH_Drawing_ShaderEffect* MakeSweep =
96 OH_Drawing_ShaderEffectCreateSweepGradient(centerPt, g_data.fColors, g_data.fPos, g_data.fCount, tileMode);
97 OH_Drawing_PointDestroy(centerPt);
98 return MakeSweep;
99 }
100
101 typedef OH_Drawing_ShaderEffect* (*GradMaker)(
102 const OH_Drawing_Point* firstPoint, const OH_Drawing_Point* secondPoint, const GradData&, OH_Drawing_TileMode);
103 constexpr GradMaker G_GRAD_MAKERS[] = {
104 MakeLinear,
105 MakeRadial,
106 MakeSweep,
107 };
108
OnTestFunction(OH_Drawing_Canvas * canvas)109 void Gradients::OnTestFunction(OH_Drawing_Canvas* canvas)
110 {
111 DRAWING_LOGI("GradientsGM::OnTestFunction start");
112 // 渐变的起点和终点坐标
113 OH_Drawing_Point* firstPoint = OH_Drawing_PointCreate(0, 0); // 0, 0 创建Point
114 OH_Drawing_Point* secondPoint = OH_Drawing_PointCreate(100.0, 100.0); // 100.0, 100.0 创建点
115 // 使用指定颜色设置清空画布底色
116 OH_Drawing_CanvasClear(canvas, 0xFFDDDDDD);
117 // 创建一个画刷brush对象设置抗锯齿属性
118 OH_Drawing_Brush* brush = OH_Drawing_BrushCreate();
119 OH_Drawing_BrushSetAntiAlias(brush, true);
120
121 OH_Drawing_Rect* rectAngLe = OH_Drawing_RectCreate(0, 0, (100), (100)); // 100 创建一个矩形对象
122 // 平移画布
123 OH_Drawing_CanvasTranslate(canvas, 20, 20); // x平移20 y平移20
124
125 for (size_t i = 0; i < sizeof(G_GRAD_DATA) / sizeof(G_GRAD_DATA[0]); i++) {
126 OH_Drawing_CanvasSave(canvas);
127 for (size_t j = 0; j < sizeof(G_GRAD_MAKERS) / sizeof(G_GRAD_MAKERS[0]); j++) {
128 OH_Drawing_ShaderEffect* effect =
129 G_GRAD_MAKERS[j](firstPoint, secondPoint, G_GRAD_DATA[i], OH_Drawing_TileMode::CLAMP);
130 OH_Drawing_BrushSetShaderEffect(brush, effect);
131 OH_Drawing_CanvasAttachBrush(canvas, brush);
132 OH_Drawing_CanvasDrawRect(canvas, rectAngLe);
133 OH_Drawing_CanvasDetachBrush(canvas);
134 OH_Drawing_CanvasTranslate(canvas, 0, 120); // y平移 120
135 OH_Drawing_ShaderEffectDestroy(effect);
136 }
137 OH_Drawing_CanvasRestore(canvas);
138 OH_Drawing_CanvasTranslate(canvas, 120, 0); // x平移 120
139 }
140 DRAWING_LOGI("GradientsGM::OnTestFunction end");
141 OH_Drawing_RectDestroy(rectAngLe);
142 OH_Drawing_BrushDestroy(brush);
143 OH_Drawing_PointDestroy(firstPoint);
144 OH_Drawing_PointDestroy(secondPoint);
145 brush = nullptr;
146 }
147