• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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 "render/rs_pixel_map_util.h"
17 #include <memory>
18 
19 #include "pixel_map.h"
20 #ifndef USE_ROSEN_DRAWING
21 #include "include/core/SkImage.h"
22 #else
23 #include "drawing/engine_adapter/impl_interface/bitmap_impl.h"
24 #endif
25 
26 namespace OHOS {
27 namespace Rosen {
28 using namespace Media;
29 
30 #ifndef USE_ROSEN_DRAWING
ColorSpaceToSkColorSpace(ColorSpace colorSpace)31 static sk_sp<SkColorSpace> ColorSpaceToSkColorSpace(ColorSpace colorSpace)
32 {
33     switch (colorSpace) {
34         case ColorSpace::LINEAR_SRGB:
35             return SkColorSpace::MakeSRGBLinear();
36         case ColorSpace::SRGB:
37         default:
38             return SkColorSpace::MakeSRGB();
39     }
40 }
41 #else
ColorSpaceToDrawingColorSpace(ColorSpace colorSpace)42 static std::shared_ptr<Drawing::ColorSpace> ColorSpaceToDrawingColorSpace(ColorSpace colorSpace)
43 {
44     switch (colorSpace) {
45         case ColorSpace::LINEAR_SRGB:
46             return Drawing::ColorSpace::CreateSRGBLinear();
47         case ColorSpace::SRGB:
48         default:
49             return Drawing::ColorSpace::CreateSRGB();
50     }
51 }
52 #endif
53 
54 #ifndef USE_ROSEN_DRAWING
PixelFormatToSkColorType(PixelFormat pixelFormat)55 static SkColorType PixelFormatToSkColorType(PixelFormat pixelFormat)
56 {
57     switch (pixelFormat) {
58         case PixelFormat::RGB_565:
59             return SkColorType::kRGB_565_SkColorType;
60         case PixelFormat::RGBA_8888:
61             return SkColorType::kRGBA_8888_SkColorType;
62         case PixelFormat::BGRA_8888:
63             return SkColorType::kBGRA_8888_SkColorType;
64         case PixelFormat::ALPHA_8:
65             return SkColorType::kAlpha_8_SkColorType;
66         case PixelFormat::RGBA_F16:
67             return SkColorType::kRGBA_F16_SkColorType;
68         case PixelFormat::UNKNOWN:
69         case PixelFormat::ARGB_8888:
70         case PixelFormat::RGB_888:
71         case PixelFormat::NV21:
72         case PixelFormat::NV12:
73         case PixelFormat::CMYK:
74         default:
75             return SkColorType::kUnknown_SkColorType;
76     }
77 }
78 #else
PixelFormatToDrawingColorType(PixelFormat pixelFormat)79 static Drawing::ColorType PixelFormatToDrawingColorType(PixelFormat pixelFormat)
80 {
81     switch (pixelFormat) {
82         case PixelFormat::RGB_565:
83             return Drawing::ColorType::COLORTYPE_RGB_565;
84         case PixelFormat::RGBA_8888:
85             return Drawing::ColorType::COLORTYPE_RGBA_8888;
86         case PixelFormat::BGRA_8888:
87             return Drawing::ColorType::COLORTYPE_BGRA_8888;
88         case PixelFormat::ALPHA_8:
89             return Drawing::ColorType::COLORTYPE_ALPHA_8;
90         case PixelFormat::RGBA_F16:
91         case PixelFormat::UNKNOWN:
92         case PixelFormat::ARGB_8888:
93         case PixelFormat::RGB_888:
94         case PixelFormat::NV21:
95         case PixelFormat::NV12:
96         case PixelFormat::CMYK:
97         default:
98             return Drawing::ColorType::COLORTYPE_UNKNOWN;
99     }
100 }
101 #endif
102 
103 #ifndef USE_ROSEN_DRAWING
AlphaTypeToSkAlphaType(AlphaType alphaType)104 static SkAlphaType AlphaTypeToSkAlphaType(AlphaType alphaType)
105 {
106     switch (alphaType) {
107         case AlphaType::IMAGE_ALPHA_TYPE_UNKNOWN:
108             return SkAlphaType::kUnknown_SkAlphaType;
109         case AlphaType::IMAGE_ALPHA_TYPE_OPAQUE:
110             return SkAlphaType::kOpaque_SkAlphaType;
111         case AlphaType::IMAGE_ALPHA_TYPE_PREMUL:
112             return SkAlphaType::kPremul_SkAlphaType;
113         case AlphaType::IMAGE_ALPHA_TYPE_UNPREMUL:
114             return SkAlphaType::kUnpremul_SkAlphaType;
115         default:
116             return SkAlphaType::kUnknown_SkAlphaType;
117     }
118 }
119 #else
AlphaTypeToDrawingAlphaType(AlphaType alphaType)120 static Drawing::AlphaType AlphaTypeToDrawingAlphaType(AlphaType alphaType)
121 {
122     switch (alphaType) {
123         case AlphaType::IMAGE_ALPHA_TYPE_UNKNOWN:
124             return Drawing::AlphaType::ALPHATYPE_UNKNOWN;
125         case AlphaType::IMAGE_ALPHA_TYPE_OPAQUE:
126             return Drawing::AlphaType::ALPHATYPE_OPAQUE;
127         case AlphaType::IMAGE_ALPHA_TYPE_PREMUL:
128             return Drawing::AlphaType::ALPHATYPE_PREMUL;
129         case AlphaType::IMAGE_ALPHA_TYPE_UNPREMUL:
130             return Drawing::AlphaType::ALPHATYPE_UNPREMUL;
131         default:
132             return Drawing::AlphaType::ALPHATYPE_UNKNOWN;
133     }
134 }
135 #endif
136 
137 #ifndef USE_ROSEN_DRAWING
MakeSkImageInfo(const ImageInfo & imageInfo)138 static SkImageInfo MakeSkImageInfo(const ImageInfo& imageInfo)
139 {
140     SkColorType ct = PixelFormatToSkColorType(imageInfo.pixelFormat);
141     SkAlphaType at = AlphaTypeToSkAlphaType(imageInfo.alphaType);
142     sk_sp<SkColorSpace> cs = ColorSpaceToSkColorSpace(imageInfo.colorSpace);
143     return SkImageInfo::Make(imageInfo.size.width, imageInfo.size.height, ct, at, cs);
144 }
145 #else
MakeDrawingBitmapFormat(const ImageInfo & imageInfo)146 static Drawing::BitmapFormat MakeDrawingBitmapFormat(const ImageInfo& imageInfo)
147 {
148     Drawing::ColorType ct = PixelFormatToDrawingColorType(imageInfo.pixelFormat);
149     Drawing::AlphaType at = AlphaTypeToDrawingAlphaType(imageInfo.alphaType);
150     std::shared_ptr<Drawing::ColorSpace> cs = ColorSpaceToDrawingColorSpace(imageInfo.colorSpace);
151     return Drawing::BitmapFormat { ct, at };
152 }
153 #endif
154 
155 struct PixelMapReleaseContext {
PixelMapReleaseContextOHOS::Rosen::PixelMapReleaseContext156     explicit PixelMapReleaseContext(std::shared_ptr<PixelMap> pixelMap) : pixelMap_(pixelMap) {}
157 
~PixelMapReleaseContextOHOS::Rosen::PixelMapReleaseContext158     ~PixelMapReleaseContext()
159     {
160         pixelMap_ = nullptr;
161     }
162 
163 private:
164     std::shared_ptr<PixelMap> pixelMap_;
165 };
166 
167 #ifndef USE_ROSEN_DRAWING
PixelMapReleaseProc(const void *,void * context)168 static void PixelMapReleaseProc(const void* /* pixels */, void* context)
169 {
170     PixelMapReleaseContext* ctx = static_cast<PixelMapReleaseContext*>(context);
171     if (ctx) {
172         delete ctx;
173         ctx = nullptr;
174     }
175 }
176 
ExtractSkImage(std::shared_ptr<Media::PixelMap> pixelMap)177 sk_sp<SkImage> RSPixelMapUtil::ExtractSkImage(std::shared_ptr<Media::PixelMap> pixelMap)
178 {
179     if (!pixelMap) {
180         return nullptr;
181     }
182     ImageInfo imageInfo;
183     pixelMap->GetImageInfo(imageInfo);
184     auto skImageInfo = MakeSkImageInfo(imageInfo);
185     SkPixmap skPixmap(skImageInfo, reinterpret_cast<const void*>(pixelMap->GetPixels()), pixelMap->GetRowBytes());
186     return SkImage::MakeFromRaster(skPixmap, PixelMapReleaseProc, new PixelMapReleaseContext(pixelMap));
187 }
188 #else
ExtractDrawingImage(std::shared_ptr<Media::PixelMap> pixelMap)189 std::shared_ptr<Drawing::Image> RSPixelMapUtil::ExtractDrawingImage(
190     std::shared_ptr<Media::PixelMap> pixelMap)
191 {
192     if (!pixelMap) {
193         return nullptr;
194     }
195     ImageInfo imageInfo;
196     pixelMap->GetImageInfo(imageInfo);
197 
198     Drawing::BitmapFormat format = MakeDrawingBitmapFormat(imageInfo);
199     Drawing::Bitmap bitmap;
200     bitmap.Build(imageInfo.size.width, imageInfo.size.height, format);
201     bitmap.SetPixels((void*)pixelMap->GetPixels());
202 
203     auto image = std::make_shared<Drawing::Image>();
204     image->BuildFromBitmap(bitmap);
205     return image;
206 }
207 
208 #endif
209 } // namespace Rosen
210 } // namespace OHOS
211