1 /*
2 * Copyright (c) 2021-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
16 #include "drawing_bitmap.h"
17
18 #include "drawing_canvas_utils.h"
19
20 #include "draw/color.h"
21 #include "image/bitmap.h"
22
23 using namespace OHOS;
24 using namespace Rosen;
25 using namespace Drawing;
26
CastToBitmap(OH_Drawing_Bitmap * cBitmap)27 static Bitmap* CastToBitmap(OH_Drawing_Bitmap* cBitmap)
28 {
29 return reinterpret_cast<Bitmap*>(cBitmap);
30 }
31
OH_Drawing_BitmapCreate()32 OH_Drawing_Bitmap* OH_Drawing_BitmapCreate()
33 {
34 return (OH_Drawing_Bitmap*)new Bitmap;
35 }
36
OH_Drawing_BitmapDestroy(OH_Drawing_Bitmap * cBitmap)37 void OH_Drawing_BitmapDestroy(OH_Drawing_Bitmap* cBitmap)
38 {
39 if (!cBitmap) {
40 return;
41 }
42 delete CastToBitmap(cBitmap);
43 }
44
OH_Drawing_BitmapCreateFromPixels(OH_Drawing_Image_Info * cImageInfo,void * pixels,uint32_t rowBytes)45 OH_Drawing_Bitmap* OH_Drawing_BitmapCreateFromPixels(OH_Drawing_Image_Info* cImageInfo, void* pixels, uint32_t rowBytes)
46 {
47 if (cImageInfo == nullptr || pixels == nullptr || rowBytes == 0) {
48 g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
49 return nullptr;
50 }
51
52 ImageInfo imageInfo(cImageInfo->width, cImageInfo->height,
53 static_cast<ColorType>(cImageInfo->colorType), static_cast<AlphaType>(cImageInfo->alphaType));
54
55 Bitmap* bitmap = new Bitmap;
56 bool ret = bitmap->InstallPixels(imageInfo, pixels, rowBytes);
57 if (!ret) {
58 delete bitmap;
59 return nullptr;
60 }
61 return (OH_Drawing_Bitmap*)bitmap;
62 }
63
OH_Drawing_BitmapBuild(OH_Drawing_Bitmap * cBitmap,const uint32_t width,const uint32_t height,const OH_Drawing_BitmapFormat * cBitmapFormat)64 void OH_Drawing_BitmapBuild(OH_Drawing_Bitmap* cBitmap, const uint32_t width, const uint32_t height,
65 const OH_Drawing_BitmapFormat* cBitmapFormat)
66 {
67 Bitmap* bitmap = CastToBitmap(cBitmap);
68 if (bitmap == nullptr || cBitmapFormat == nullptr) {
69 g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
70 return;
71 }
72
73 BitmapFormat format { static_cast<ColorType>(cBitmapFormat->colorFormat),
74 static_cast<AlphaType>(cBitmapFormat->alphaFormat) };
75 bitmap->Build(width, height, format);
76 }
77
OH_Drawing_BitmapGetWidth(OH_Drawing_Bitmap * cBitmap)78 uint32_t OH_Drawing_BitmapGetWidth(OH_Drawing_Bitmap* cBitmap)
79 {
80 Bitmap* bitmap = CastToBitmap(cBitmap);
81 if (bitmap == nullptr) {
82 g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
83 return 0;
84 }
85 return bitmap->GetWidth();
86 }
87
OH_Drawing_BitmapGetHeight(OH_Drawing_Bitmap * cBitmap)88 uint32_t OH_Drawing_BitmapGetHeight(OH_Drawing_Bitmap* cBitmap)
89 {
90 Bitmap* bitmap = CastToBitmap(cBitmap);
91 if (bitmap == nullptr) {
92 g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
93 return 0;
94 }
95 return bitmap->GetHeight();
96 }
97
OH_Drawing_BitmapGetColorFormat(OH_Drawing_Bitmap * cBitmap)98 OH_Drawing_ColorFormat OH_Drawing_BitmapGetColorFormat(OH_Drawing_Bitmap* cBitmap)
99 {
100 Bitmap* bitmap = CastToBitmap(cBitmap);
101 if (bitmap == nullptr) {
102 g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
103 return COLOR_FORMAT_UNKNOWN;
104 }
105 return static_cast<OH_Drawing_ColorFormat>(bitmap->GetColorType());
106 }
107
OH_Drawing_BitmapGetAlphaFormat(OH_Drawing_Bitmap * cBitmap)108 OH_Drawing_AlphaFormat OH_Drawing_BitmapGetAlphaFormat(OH_Drawing_Bitmap* cBitmap)
109 {
110 Bitmap* bitmap = CastToBitmap(cBitmap);
111 if (bitmap == nullptr) {
112 g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
113 return ALPHA_FORMAT_UNKNOWN;
114 }
115 return static_cast<OH_Drawing_AlphaFormat>(bitmap->GetAlphaType());
116 }
OH_Drawing_BitmapGetPixels(OH_Drawing_Bitmap * cBitmap)117 void* OH_Drawing_BitmapGetPixels(OH_Drawing_Bitmap* cBitmap)
118 {
119 Bitmap* bitmap = CastToBitmap(cBitmap);
120 if (bitmap == nullptr) {
121 g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
122 return nullptr;
123 }
124 return bitmap->GetPixels();
125 }
126
OH_Drawing_BitmapGetImageInfo(OH_Drawing_Bitmap * cBitmap,OH_Drawing_Image_Info * cImageInfo)127 void OH_Drawing_BitmapGetImageInfo(OH_Drawing_Bitmap* cBitmap, OH_Drawing_Image_Info* cImageInfo)
128 {
129 if (cBitmap == nullptr || cImageInfo == nullptr) {
130 g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
131 return;
132 }
133 ImageInfo imageInfo = CastToBitmap(cBitmap)->GetImageInfo();
134
135 cImageInfo->width = imageInfo.GetWidth();
136 cImageInfo->height = imageInfo.GetHeight();
137 cImageInfo->colorType = static_cast<OH_Drawing_ColorFormat>(imageInfo.GetColorType());
138 cImageInfo->alphaType = static_cast<OH_Drawing_AlphaFormat>(imageInfo.GetAlphaType());
139 }
140
OH_Drawing_BitmapReadPixels(OH_Drawing_Bitmap * cBitmap,const OH_Drawing_Image_Info * dstInfo,void * dstPixels,size_t dstRowBytes,int32_t srcX,int32_t srcY)141 bool OH_Drawing_BitmapReadPixels(OH_Drawing_Bitmap* cBitmap, const OH_Drawing_Image_Info* dstInfo,
142 void* dstPixels, size_t dstRowBytes, int32_t srcX, int32_t srcY)
143 {
144 if (cBitmap == nullptr || dstInfo == nullptr || dstPixels == nullptr) {
145 g_drawingErrorCode = OH_DRAWING_ERROR_INVALID_PARAMETER;
146 return false;
147 }
148
149 ImageInfo imageInfo(dstInfo->width, dstInfo->height,
150 static_cast<ColorType>(dstInfo->colorType), static_cast<AlphaType>(dstInfo->alphaType));
151
152 return CastToBitmap(cBitmap)->ReadPixels(imageInfo, dstPixels, dstRowBytes, srcX, srcY);
153 }