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