1 /*
2  * Copyright (C) 2021 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 #ifndef WEBP_ENCODER_H
16 #define WEBP_ENCODER_H
17 #include <vector>
18 #include "abs_image_encoder.h"
19 #include "plugin_class_base.h"
20 #include "webp/encode.h"
21 #include "src/images/SkImageEncoderFns.h"
22 #include "include/core/SkStream.h"
23 namespace OHOS {
24 namespace ImagePlugin {
25 class WebpEncoder : public AbsImageEncoder, public OHOS::MultimediaPlugin::PluginClassBase {
26 public:
27     WebpEncoder();
28     ~WebpEncoder() override;
29     uint32_t StartEncode(OutputDataStream &outputStream, PlEncodeOptions &option) override;
30     uint32_t AddImage(Media::PixelMap &pixelMap) override;
31     uint32_t AddPicture(Media::Picture &picture) override;
32     uint32_t FinalizeEncode() override;
33     bool Write(const uint8_t* data, size_t data_size);
34 
35 private:
36     DISALLOW_COPY_AND_MOVE(WebpEncoder);
37     bool CheckEncodeFormat(Media::PixelMap &pixelMap);
38     uint32_t SetEncodeConfig(Media::PixelMap &pixelMap, WebPConfig &webpConfig, WebPPicture &webpPicture);
39     uint32_t DoEncode(Media::PixelMap &pixelMap, WebPConfig &webpConfig, WebPPicture &webpPicture);
40     uint32_t DoEncodeForICC(Media::PixelMap &pixelMap);
41     bool DoTransform(Media::PixelMap &pixelMap, char* dst, int componentsNum);
42 
43 private:
44     Media::ColorSpace GetColorSpace(Media::PixelMap &pixelMap);
45     Media::PixelFormat GetPixelFormat(Media::PixelMap &pixelMap);
46     Media::AlphaType GetAlphaType(Media::PixelMap &pixelMap);
47     bool GetIcc(Media::PixelMap &pixelMap);
48     bool IsOpaque(Media::PixelMap &pixelMap);
49 
50 private:
51     static bool DoTransformMemcpy(Media::PixelMap &pixelMap, char* dst, int componentsNum);
52     static bool DoTransformRGBX(Media::PixelMap &pixelMap, char* dst, int componentsNum);
53     static bool DoTransformRgbA(Media::PixelMap &pixelMap, char* dst, int componentsNum);
54     static bool DoTransformBGRX(Media::PixelMap &pixelMap, char* dst, int componentsNum);
55     static bool DoTransformBGRA(Media::PixelMap &pixelMap, char* dst, int componentsNum);
56     static bool DoTransformBgrA(Media::PixelMap &pixelMap, char* dst, int componentsNum);
57     static bool DoTransformF16To8888(Media::PixelMap &pixelMap, char* dst, int componentsNum);
58     static bool DoTransformF16pTo8888(Media::PixelMap &pixelMap, char* dst, int componentsNum);
59     static bool DoTransformArgbToRgb(Media::PixelMap &pixelMap, char* dst, int componentsNum);
60     static bool DoTransformArgbToRgba(Media::PixelMap &pixelMap, char* dst, int componentsNum);
61     static bool DoTransformRGB565(Media::PixelMap &pixelMap, char* dst, int componentsNum);
62     static bool DoTransformGray(Media::PixelMap &pixelMap, char* dst, int componentsNum);
63     static Media::ImageInfo MakeImageInfo(int width, int height, Media::PixelFormat pf, Media::AlphaType at,
64         Media::ColorSpace cs = Media::ColorSpace::SRGB);
65     static void ShowTransformParam(const Media::ImageInfo &srcInfo, const uint32_t &srcRowBytes,
66         const Media::ImageInfo &dstInfo, const uint32_t &dstRowBytes, const int &componentsNum);
67 
68 private:
69     OutputDataStream *outputStream_ {nullptr};
70     SkDynamicMemoryWStream memoryStream_;
71     std::vector<Media::PixelMap *> pixelMaps_;
72     PlEncodeOptions encodeOpts_;
73 
74     int32_t componentsNum_ {0};
75 
76     // ICC data
77     bool iccValid_ {false};
78     uint8_t* iccBytes_ {nullptr};
79     size_t iccSize_ {0};
80 };
81 } // namespace ImagePlugin
82 } // namespace OHOS
83 
84 #endif // WEBP_ENCODER_H
85