1/*
2* Copyright (C) 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#ifndef INTERFACES_INNERKITS_INCLUDE_PIXEL_YUV_H
17#define INTERFACES_INNERKITS_INCLUDE_PIXEL_YUV_H
18
19#include "image_converter.h"
20#include "image_type.h"
21#include "include/core/SkBitmap.h"
22#include "include/core/SkCanvas.h"
23#include "include/core/SkImage.h"
24#include "memory_manager.h"
25#include "pixel_map.h"
26
27namespace OHOS {
28namespace Media {
29
30struct SkTransYuvInfo {
31    SkRect r;
32    SkImageInfo info;
33    SkBitmap bitmap;
34};
35
36class PixelYuv : public PixelMap {
37public:
38    PixelYuv() {}
39    virtual ~PixelYuv();
40    NATIVEEXPORT const uint8_t *GetPixel8(int32_t x, int32_t y) override;
41    NATIVEEXPORT const uint16_t *GetPixel16(int32_t x, int32_t y) override;
42    NATIVEEXPORT const uint32_t *GetPixel32(int32_t x, int32_t y) override;
43    NATIVEEXPORT bool GetARGB32Color(int32_t x, int32_t y, uint32_t &color) override;
44    NATIVEEXPORT uint8_t GetARGB32ColorA(uint32_t color) override;
45    NATIVEEXPORT uint8_t GetARGB32ColorR(uint32_t color) override;
46    NATIVEEXPORT uint8_t GetARGB32ColorG(uint32_t color) override;
47    NATIVEEXPORT uint8_t GetARGB32ColorB(uint32_t color) override;
48    NATIVEEXPORT uint32_t SetAlpha(const float percent) override;
49    NATIVEEXPORT uint32_t getPixelBytesNumber();
50    NATIVEEXPORT int32_t GetByteCount() override;
51    NATIVEEXPORT void rotate(float degrees) override;
52    NATIVEEXPORT uint32_t crop(const Rect &rect) override;
53    NATIVEEXPORT void scale(float xAxis, float yAxis) override;
54    NATIVEEXPORT void scale(float xAxis, float yAxis, const AntiAliasingOption &option) override;
55    NATIVEEXPORT void scale(int32_t dstW, int32_t dstH);
56    NATIVEEXPORT void scale(int32_t dstW, int32_t dstH, const AntiAliasingOption &option);
57    NATIVEEXPORT bool resize(float xAxis, float yAxis) override;
58    NATIVEEXPORT bool resize(int32_t dstW, int32_t dstH);
59    NATIVEEXPORT void flip(bool xAxis, bool yAxis) override;
60    NATIVEEXPORT uint32_t WritePixels(const uint8_t *source, const uint64_t &bufferSize, const uint32_t &offset,
61                                      const uint32_t &stride, const Rect &region) override;
62    NATIVEEXPORT uint32_t WritePixels(const uint8_t *source, const uint64_t &bufferSize) override;
63    NATIVEEXPORT uint32_t ReadPixels(const uint64_t &bufferSize, const uint32_t &offset, const uint32_t &stride,
64                                     const Rect &region, uint8_t *dst) override;
65    NATIVEEXPORT uint32_t ReadPixels(const uint64_t &bufferSize, uint8_t *dst) override;
66    NATIVEEXPORT void translate(float xAxis, float yAxis) override;
67    NATIVEEXPORT uint32_t ReadPixel(const Position &pos, uint32_t &dst) override;
68    NATIVEEXPORT bool WritePixels(const uint32_t &color) override;
69    NATIVEEXPORT uint32_t WritePixel(const Position &pos, const uint32_t &color) override;
70    ColorYuv420 GetYuv420Color(uint32_t x, uint32_t y);
71    NATIVEEXPORT void SetPixelsAddr(void *addr, void *context, uint32_t size, AllocatorType type,
72                                    CustomFreePixelMap func) override;
73    bool YuvRotateConvert(Size &size, int32_t degrees, int32_t &dstWidth, int32_t &dstHeight,
74        OpenSourceLibyuv::RotationMode &rotateNum);
75protected:
76    bool CheckPixelsInput(const uint8_t *dst, const uint64_t &bufferSize, const uint32_t &offset, const Rect &region);
77    void SetRowDataSizeForImageInfo(ImageInfo info);
78    static uint32_t GetImageSize(int32_t width, int32_t height, PixelFormat format);
79    uint32_t SetColorSpace(const OHOS::ColorManager::ColorSpace &grColorSpace, SkTransYuvInfo &src,
80        PixelFormat &format, uint64_t rowStride);
81    std::unique_ptr<AbsMemory> CreateMemory(PixelFormat pixelFormat, std::string memoryTag,
82        int32_t dstWidth, int32_t dstHeight, YUVStrideInfo &dstStrides);
83#ifdef IMAGE_COLORSPACE_FLAG
84    bool CheckColorSpace(const OHOS::ColorManager::ColorSpace &grColorSpace);
85    int32_t ColorSpaceBGRAToYuv(uint8_t *bgraData, SkTransYuvInfo &dst, ImageInfo &imageInfo, PixelFormat &format,
86        const OHOS::ColorManager::ColorSpace &grColorSpace);
87    NATIVEEXPORT uint32_t ApplyColorSpace(const OHOS::ColorManager::ColorSpace &grColorSpace) override;
88#endif
89private:
90    bool IsP010Yuv();
91    void GetYUVInfoForCopyPixels(YUVDataInfo &yuvDataInfo);
92};
93} // namespace Media
94} // namespace OHOS
95
96#endif // INTERFACES_INNERKITS_INCLUDE_PIXEL_YUV_H
97