1 /*
2 * Copyright (c) 2025 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
16 #include <multimedia/image_framework/image/pixelmap_native.h>
17 #include <native_drawing/drawing_image.h>
18 #include <native_drawing/drawing_text_typography.h>
19 #include <native_drawing/drawing_rect.h>
20 #include <native_drawing/drawing_point.h>
21 #include <native_drawing/drawing_region.h>
22 #include <native_drawing/drawing_round_rect.h>
23 #include <native_drawing/drawing_sampling_options.h>
24 #include <native_drawing/drawing_pixel_map.h>
25 #include <native_drawing/drawing_text_blob.h>
26 #include <native_drawing/drawing_shader_effect.h>
27 #include <native_drawing/drawing_gpu_context.h>
28 #include <native_drawing/drawing_surface.h>
29 #include <native_drawing/drawing_path_effect.h>
30 #include <native_drawing/drawing_color_filter.h>
31 #include <native_drawing/drawing_filter.h>
32 #include <native_drawing/drawing_image_filter.h>
33 #include <native_drawing/drawing_mask_filter.h>
34 #include <native_drawing/drawing_matrix.h>
35 #include "sample_graphics.h"
36 #include "common/log_common.h"
37
DrawCustomPixelMap(OH_Drawing_Canvas * canvas)38 void SampleGraphics::DrawCustomPixelMap(OH_Drawing_Canvas *canvas)
39 {
40 uint32_t width = 600;
41 uint32_t height = 400;
42 // 字节长度,RGBA_8888每个像素占4字节
43 size_t bufferSize = width * height * 4;
44 uint8_t *pixels = new uint8_t[bufferSize];
45 for (uint32_t i = 0; i < width * height; ++i) {
46 // 遍历并编辑每个像素,从而形成红绿蓝相间的条纹,间隔20
47 uint32_t n = i / 20 % 3;
48 pixels[i * rgbaSize_] = rgbaMin_;
49 pixels[i * rgbaSize_ + indexOne_] = rgbaMin_;
50 pixels[i * rgbaSize_ + indexTwo_] = rgbaMin_;
51 pixels[i * rgbaSize_ + indexThree_] = rgbaMax_;
52 if (n == 0) {
53 pixels[i * rgbaSize_] = rgbaMax_;
54 } else if (n == 1) {
55 pixels[i * rgbaSize_ + indexOne_] = rgbaMax_;
56 } else {
57 pixels[i * rgbaSize_ + indexTwo_] = rgbaMax_;
58 }
59 }
60 // 设置位图格式(长、宽、颜色类型、透明度类型)
61 OH_Pixelmap_InitializationOptions *createOps = nullptr;
62 OH_PixelmapInitializationOptions_Create(&createOps);
63 OH_PixelmapInitializationOptions_SetWidth(createOps, width);
64 OH_PixelmapInitializationOptions_SetHeight(createOps, height);
65 OH_PixelmapInitializationOptions_SetPixelFormat(createOps, PIXEL_FORMAT_RGBA_8888);
66 OH_PixelmapInitializationOptions_SetAlphaType(createOps, PIXELMAP_ALPHA_TYPE_UNKNOWN);
67 // 创建OH_PixelmapNative对象
68 OH_PixelmapNative *pixelMapNative = nullptr;
69 OH_PixelmapNative_CreatePixelmap(pixels, bufferSize, createOps, &pixelMapNative);
70 // 利用OH_PixelmapNative对象创建PixelMap对象
71 OH_Drawing_PixelMap *pixelMap = OH_Drawing_PixelMapGetFromOhPixelMapNative(pixelMapNative);
72 OH_Drawing_Rect *src = OH_Drawing_RectCreate(0, 0, width, height);
73 OH_Drawing_Rect *dst = OH_Drawing_RectCreate(value200_, value200_, value800_, value600_);
74 OH_Drawing_SamplingOptions* samplingOptions = OH_Drawing_SamplingOptionsCreate(
75 OH_Drawing_FilterMode::FILTER_MODE_LINEAR, OH_Drawing_MipmapMode::MIPMAP_MODE_LINEAR);
76 // 绘制PixelMap
77 OH_Drawing_CanvasDrawPixelMapRect(canvas, pixelMap, src, dst, samplingOptions);
78 OH_PixelmapNative_Release(pixelMapNative);
79 OH_Drawing_PixelMapDissolve(pixelMap);
80 OH_Drawing_RectDestroy(src);
81 OH_Drawing_RectDestroy(dst);
82 OH_Drawing_SamplingOptionsDestroy(samplingOptions);
83 delete[] pixels;
84 }
85
DrawPixelMapRect(OH_Drawing_Canvas * canvas)86 void SampleGraphics::DrawPixelMapRect(OH_Drawing_Canvas *canvas)
87 {
88 // 从NativePixelMap中获取PixelMap对象
89 OH_Drawing_PixelMap *pixelMap = OH_Drawing_PixelMapGetFromNativePixelMap(nativePixelMap_);
90 OH_Drawing_SamplingOptions *sampling = OH_Drawing_SamplingOptionsCreate(FILTER_MODE_LINEAR, MIPMAP_MODE_NONE);
91 float width = value400_;
92 float height = value400_;
93 OH_Drawing_Rect *src = OH_Drawing_RectCreate(0, 0, width, height);
94 OH_Drawing_Rect *dst = OH_Drawing_RectCreate(value100_, value100_, value700_, value700_);
95 // 绘制PixelMap
96 OH_Drawing_CanvasDrawPixelMapRect(canvas, pixelMap, src, dst, sampling);
97 // 解除NativePixelMap和PixelMap的关联
98 OH_Drawing_PixelMapDissolve(pixelMap);
99 OH_Drawing_SamplingOptionsDestroy(sampling);
100 OH_Drawing_RectDestroy(src);
101 OH_Drawing_RectDestroy(dst);
102 }
103
DrawBitmap(OH_Drawing_Canvas * canvas)104 void SampleGraphics::DrawBitmap(OH_Drawing_Canvas *canvas)
105 {
106 // 创建一个bitmap对象
107 OH_Drawing_Bitmap* bitmap1 = OH_Drawing_BitmapCreate();
108 OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
109 uint64_t width = width_ / 2;
110 uint64_t height = height_ / 2;
111 // 构建bitmap对象
112 OH_Drawing_BitmapBuild(bitmap1, width, height, &cFormat);
113 OH_Drawing_Canvas* newCanvas = OH_Drawing_CanvasCreate();
114 OH_Drawing_CanvasBind(newCanvas, bitmap1);
115 OH_Drawing_CanvasClear(newCanvas, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
116 // 获取位图宽高
117 SAMPLE_LOGI("Bitmap-->width=%{public}d,height=%{public}d", OH_Drawing_BitmapGetWidth(bitmap1),
118 OH_Drawing_BitmapGetHeight(bitmap1));
119 // 获取像素
120 void *pixels = OH_Drawing_BitmapGetPixels(bitmap1);
121 OH_Drawing_Image_Info imageInfo;
122 imageInfo.width = width;
123 imageInfo.height = height;
124 imageInfo.colorType = COLOR_FORMAT_RGBA_8888;
125 imageInfo.alphaType = ALPHA_FORMAT_OPAQUE;
126 // 通过像素创建一个bitmap对象
127 OH_Drawing_Bitmap* bitmap2 = OH_Drawing_BitmapCreateFromPixels(&imageInfo, pixels, width * 4);
128 OH_Drawing_CanvasDrawBitmap(canvas, bitmap1, 0, 0);
129 OH_Drawing_CanvasDrawBitmap(canvas, bitmap2, width, height);
130 OH_Drawing_CanvasDestroy(newCanvas);
131 OH_Drawing_BitmapDestroy(bitmap1);
132 OH_Drawing_BitmapDestroy(bitmap2);
133 }
134
DrawImage(OH_Drawing_Canvas * canvas)135 void SampleGraphics::DrawImage(OH_Drawing_Canvas *canvas)
136 {
137 // 创建一个bitmap对象
138 OH_Drawing_Bitmap* bitmap = OH_Drawing_BitmapCreate();
139 OH_Drawing_BitmapFormat cFormat{COLOR_FORMAT_RGBA_8888, ALPHA_FORMAT_OPAQUE};
140 uint64_t width = width_ / 2;
141 uint64_t height = height_ / 2;
142 OH_Drawing_BitmapBuild(bitmap, width, height, &cFormat);
143 OH_Drawing_Canvas* newCanvas = OH_Drawing_CanvasCreate();
144 OH_Drawing_CanvasBind(newCanvas, bitmap);
145 OH_Drawing_CanvasClear(newCanvas, OH_Drawing_ColorSetArgb(rgbaMax_, rgbaMax_, rgbaMin_, rgbaMin_));
146 // 创建image对象
147 OH_Drawing_Image* image = OH_Drawing_ImageCreate();
148 // 从bitmap构建image
149 OH_Drawing_ImageBuildFromBitmap(image, bitmap);
150 // 获取Image宽高
151 SAMPLE_LOGI("Image-->width=%{public}d,height=%{public}d", OH_Drawing_ImageGetWidth(image),
152 OH_Drawing_ImageGetHeight(image));
153 OH_Drawing_Rect* rect = OH_Drawing_RectCreate(0, 0, width / 2, height / 2);
154 OH_Drawing_SamplingOptions* options = OH_Drawing_SamplingOptionsCreate(
155 OH_Drawing_FilterMode::FILTER_MODE_LINEAR, OH_Drawing_MipmapMode::MIPMAP_MODE_LINEAR);
156 OH_Drawing_CanvasDrawImageRect(canvas, image, rect, options);
157 // 销毁对象
158 OH_Drawing_CanvasDestroy(newCanvas);
159 OH_Drawing_BitmapDestroy(bitmap);
160 OH_Drawing_ImageDestroy(image);
161 OH_Drawing_RectDestroy(rect);
162 OH_Drawing_SamplingOptionsDestroy(options);
163 }
164