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 }