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