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 "alpha_image.h"
16 #include <multimedia/image_framework/image_mdk_common.h>
17 #include <native_drawing/drawing_color.h>
18 #include <native_drawing/drawing_brush.h>
19 #include <native_drawing/drawing_color_filter.h>
20 #include <native_drawing/drawing_filter.h>
21 #include <native_drawing/drawing_image.h>
22 #include <native_drawing/drawing_mask_filter.h>
23 #include <native_drawing/drawing_matrix.h>
24 #include <native_drawing/drawing_path.h>
25 #include <native_drawing/drawing_pen.h>
26 #include <native_drawing/drawing_round_rect.h>
27 #include <native_drawing/drawing_round_rect.h>
28 #include <native_drawing/drawing_shader_effect.h>
29 #include <native_drawing/drawing_point.h>
30 #include <native_drawing/drawing_sampling_options.h>
31 #include "test_common.h"
32 #include "common/log_common.h"
33 
34 enum {
35     K_W = 152,
36     K_H = 80,
37 };
38 
make_color_filter()39 OH_Drawing_ColorFilter *make_color_filter()
40 {
41     float colorMatrix[20] = {
42         1, 0, 0, 0, 0,
43         0, 1, 0, 0, 0,
44         0, 0, 0.5, 0.5, 0,
45         0, 0, 0.5, 0.5, 0
46     }; // mix G and A.
47     return OH_Drawing_ColorFilterCreateMatrix(colorMatrix);
48 }
49 
make_alpha_image(int w,int h)50 OH_Drawing_Image *make_alpha_image(int w, int h)
51 {
52     OH_Drawing_Bitmap *bm = OH_Drawing_BitmapCreate();
53     OH_Drawing_BitmapFormat format = { OH_Drawing_ColorFormat::COLOR_FORMAT_ALPHA_8,
54                                        OH_Drawing_AlphaFormat::ALPHA_FORMAT_OPAQUE };
55     OH_Drawing_BitmapBuild(bm, w, h, &format);
56     OH_Drawing_Canvas *bmpCanvas = OH_Drawing_CanvasCreate();
57     OH_Drawing_CanvasBind(bmpCanvas, bm);
58     OH_Drawing_CanvasClear(bmpCanvas, OH_Drawing_ColorSetArgb(10, 0, 0, 0)); // 10 color
59 
60     for (int y = 0; y < h; ++y) {
61         for (int x = y; x < w; ++x) {
62             *DrawBitmapGetAddr8(bm, x, y) = 0xFF;
63         }
64     }
65     OH_Drawing_Image *image = OH_Drawing_ImageCreate();
66     OH_Drawing_ImageBuildFromBitmap(image, bm);
67     OH_Drawing_CanvasDestroy(bmpCanvas);
68     OH_Drawing_BitmapDestroy(bm);
69     return image;
70 }
71 
AlphaImage()72 AlphaImage::AlphaImage()
73 {
74     // file gm/fontregen.cpp
75     bitmapWidth_ = 256;  // 256宽度
76     bitmapHeight_ = 256; // 256高度
77     fileName_ = "alpha_image";
78 }
79 
~AlphaImage()80 AlphaImage::~AlphaImage() {}
81 
OnTestFunction(OH_Drawing_Canvas * canvas)82 void AlphaImage::OnTestFunction(OH_Drawing_Canvas *canvas)
83 {
84     auto image = make_alpha_image(kSize, kSize);
85 
86     OH_Drawing_MaskFilter *maskFilter = OH_Drawing_MaskFilterCreateBlur(OH_Drawing_BlurType::NORMAL, 10.f, true);
87     OH_Drawing_SamplingOptions *option = OH_Drawing_SamplingOptionsCreate(OH_Drawing_FilterMode::FILTER_MODE_NEAREST,
88         OH_Drawing_MipmapMode::MIPMAP_MODE_NONE);
89     OH_Drawing_ColorFilter *colorFilter = make_color_filter();
90     OH_Drawing_FilterSetColorFilter(filter, colorFilter);
91     OH_Drawing_BrushSetFilter(brush, filter);
92     OH_Drawing_FilterSetMaskFilter(filter, maskFilter);
93     OH_Drawing_BrushSetFilter(brush, filter);
94     OH_Drawing_CanvasAttachBrush(canvas, brush);
95     OH_Drawing_Rect *dst = DrawCreateRect({ 16, 16, 16 + kSize, 16 + kSize });
96     OH_Drawing_CanvasDrawImageRect(canvas, image, dst, option);
97 
98     OH_Drawing_FilterSetColorFilter(filter, nullptr);
99     OH_Drawing_BrushSetFilter(brush, filter);
100     OH_Drawing_Point *startPt = OH_Drawing_PointCreate(144, 16);
101     OH_Drawing_Point *endPt = OH_Drawing_PointCreate(144 + kSize, 16 + kSize);
102     uint32_t colors[] = {DRAW_COLORCYAN, DRAW_COLORCYAN};
103     float pos[] = {0.f, 1.f};
104     OH_Drawing_ShaderEffect *effect =
105         OH_Drawing_ShaderEffectCreateLinearGradient(startPt, endPt, colors, pos, 2, OH_Drawing_TileMode::CLAMP);
106     OH_Drawing_BrushSetShaderEffect(brush, effect);
107     OH_Drawing_CanvasAttachBrush(canvas, brush);
108     dst = DrawCreateRect({ 144, 16, 144 + kSize, 16 + kSize });
109     OH_Drawing_CanvasDrawImageRect(canvas, image, dst, option);
110     OH_Drawing_PointDestroy(startPt);
111     OH_Drawing_PointDestroy(endPt);
112     OH_Drawing_RectDestroy(dst);
113 
114     OH_Drawing_FilterSetColorFilter(filter, colorFilter);
115     OH_Drawing_BrushSetFilter(brush, filter);
116     OH_Drawing_CanvasAttachBrush(canvas, brush);
117     dst = DrawCreateRect({ 16, 144, 16 + kSize, 144 + kSize });
118     OH_Drawing_CanvasDrawImageRect(canvas, image, dst, option);
119     OH_Drawing_RectDestroy(dst);
120 
121     OH_Drawing_FilterSetMaskFilter(filter, nullptr);
122     OH_Drawing_BrushSetFilter(brush, filter);
123     OH_Drawing_CanvasAttachBrush(canvas, brush);
124     dst = DrawCreateRect({ 144, 144, 144 + kSize, 144 + kSize });
125     OH_Drawing_CanvasDrawImageRect(canvas, image, dst, option);
126     OH_Drawing_RectDestroy(dst);
127 
128     OH_Drawing_FilterDestroy(filter);
129     OH_Drawing_ImageDestroy(image);
130     OH_Drawing_SamplingOptionsDestroy(option);
131     OH_Drawing_MaskFilterDestroy(maskFilter);
132     OH_Drawing_ColorFilterDestroy(colorFilter);
133     OH_Drawing_CanvasDetachBrush(canvas);
134     OH_Drawing_BrushDestroy(brush);
135 }
136 
AlphaImageAlphaTint()137 AlphaImageAlphaTint::AlphaImageAlphaTint()
138 {
139     // file gm/fontregen.cpp
140     bitmapWidth_ = K_W;
141     bitmapHeight_ = K_H;
142     fileName_ = "alpha_image_alpha_tint";
143 }
144 
~AlphaImageAlphaTint()145 AlphaImageAlphaTint::~AlphaImageAlphaTint() {}
146 
OnTestFunction(OH_Drawing_Canvas * canvas)147 void AlphaImageAlphaTint::OnTestFunction(OH_Drawing_Canvas *canvas)
148 {
149     uint32_t w = 64;
150     uint32_t h = 64;
151     OH_Drawing_CanvasClear(canvas, DRAW_COLORGRAY);
152     OH_Drawing_Bitmap *bm = OH_Drawing_BitmapCreate();
153     OH_Drawing_BitmapFormat format = { OH_Drawing_ColorFormat::COLOR_FORMAT_ALPHA_8,
154                                        OH_Drawing_AlphaFormat::ALPHA_FORMAT_OPAQUE };
155     OH_Drawing_BitmapBuild(bm, w, h, &format);
156     for (int y = 0; y < h; ++y) {
157         for (int x = 0; x < w; ++x) {
158             *DrawBitmapGetAddr8(bm, x, y) = y * 4; // 4 cout
159         }
160     }
161 
162     OH_Drawing_Image *image = OH_Drawing_ImageCreate();
163     OH_Drawing_ImageBuildFromBitmap(image, bm);
164     OH_Drawing_Brush *brush = OH_Drawing_BrushCreate();
165 
166     OH_Drawing_BrushSetColor(brush, 0x8000FF00);
167     OH_Drawing_CanvasAttachBrush(canvas, brush);
168     OH_Drawing_CanvasTranslate(canvas, 8, 8); // 8平移距离
169     OH_Drawing_Rect *rect = OH_Drawing_RectCreate(0, 0, w, h);
170     OH_Drawing_SamplingOptions *option = OH_Drawing_SamplingOptionsCreate(OH_Drawing_FilterMode::FILTER_MODE_NEAREST,
171         OH_Drawing_MipmapMode::MIPMAP_MODE_NONE);
172     OH_Drawing_CanvasDrawImageRect(canvas, image, rect, option);
173 
174     OH_Drawing_CanvasTranslate(canvas, 72, 0); // 72平移距离
175     OH_Drawing_ShaderEffect *effect = OH_Drawing_ShaderEffectCreateImageShader(image, OH_Drawing_TileMode::CLAMP,
176         OH_Drawing_TileMode::CLAMP, option, nullptr);
177     OH_Drawing_BrushSetShaderEffect(brush, effect);
178     OH_Drawing_CanvasAttachBrush(canvas, brush);
179     OH_Drawing_CanvasDrawRect(canvas, rect);
180 
181     OH_Drawing_CanvasDetachBrush(canvas);
182     OH_Drawing_RectDestroy(rect);
183     OH_Drawing_BrushDestroy(brush);
184     OH_Drawing_ImageDestroy(image);
185     OH_Drawing_BitmapDestroy(bm);
186     OH_Drawing_SamplingOptionsDestroy(option);
187     OH_Drawing_ShaderEffectDestroy(effect);
188 
189     brush = nullptr;
190 }
191