• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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