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