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 #ifndef FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_RENDER_ADAPTER_ROSEN_DRAWING_IMAGE_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_RENDER_ADAPTER_ROSEN_DRAWING_IMAGE_H
18 
19 #include <stdint.h>
20 
21 #include "core/components_ng/render/canvas_image.h"
22 #include "core/components_ng/render/drawing.h"
23 #include "core/components_ng/render/drawing_forward.h"
24 
25 namespace OHOS::Ace::NG {
26 class DrawingImage : public virtual CanvasImage {
DECLARE_ACE_TYPE(DrawingImage,CanvasImage)27     DECLARE_ACE_TYPE(DrawingImage, CanvasImage)
28 public:
29     explicit DrawingImage(const std::shared_ptr<RSImage>& image) : image_(image) {}
30     DrawingImage() = default;
31     ~DrawingImage() override = default;
32 
GetImage()33     virtual std::shared_ptr<RSImage> GetImage() const
34     {
35         return image_;
36     }
37 
GetCompressData()38     virtual std::shared_ptr<RSData> GetCompressData() const
39     {
40         return compressData_;
41     }
42 
HasData()43     bool HasData() const override
44     {
45         return GetCompressData() || GetImage();
46     }
47 
SetCompressData(std::shared_ptr<RSData> data,int32_t w,int32_t h)48     void SetCompressData(std::shared_ptr<RSData> data, int32_t w, int32_t h)
49     {
50         compressData_ = data;
51         compressWidth_ = w;
52         compressHeight_ = h;
53         uniqueId_ = image_->GetUniqueID();
54     }
55 
SetRawCompressData(void * dataPtr,int32_t w,int32_t h)56     void SetRawCompressData(void* dataPtr, int32_t w, int32_t h) override
57     {
58         auto* rsData = reinterpret_cast<std::shared_ptr<RSData>*>(dataPtr);
59         SetCompressData(*rsData, w, h);
60     }
61 
GetCompressWidth()62     virtual int32_t GetCompressWidth() const
63     {
64         return compressWidth_;
65     }
66 
GetCompressHeight()67     virtual int32_t GetCompressHeight() const
68     {
69         return compressHeight_;
70     }
71 
GetUniqueID()72     virtual uint32_t GetUniqueID() const
73     {
74         return uniqueId_;
75     }
76 
SetUniqueID(uint32_t id)77     virtual void SetUniqueID(uint32_t id)
78     {
79         uniqueId_ = id;
80     }
81 
82     RefPtr<CanvasImage> Clone() override;
83 
84     void Cache(const std::string& key) override;
85 
86     RefPtr<PixelMap> GetPixelMap() const override;
87 
88     void ReplaceRSImage(std::shared_ptr<RSImage> image);
89     int32_t GetWidth() const override;
90     int32_t GetHeight() const override;
91 
92     void DrawToRSCanvas(
93         RSCanvas& canvas, const RSRect& srcRect, const RSRect& dstRect, const BorderRadiusArray& radiusXY) override;
94     bool DrawImageNine(
95         RSCanvas& canvas, const RSRect& srcRect, const RSRect& dstRect, const BorderRadiusArray& radiusXY);
96     bool DrawImageLattice(
97         RSCanvas& canvas, const RSRect& srcRect, const RSRect& dstRect, const BorderRadiusArray& radiusXY);
98     void DrawRect(RSCanvas& canvas, const RSRect& srcRect, const RSRect& dstRect) override;
99     static RefPtr<CanvasImage> QueryFromCache(const std::string& key);
100 
101     static std::shared_ptr<RSImage> MakeRSImageFromPixmap(const RefPtr<PixelMap>& pixmap);
102     static std::shared_ptr<RSColorSpace> ColorSpaceToRSColorSpace(const RefPtr<PixelMap>& pixmap);
103     static RSAlphaType AlphaTypeToRSAlphaType(const RefPtr<PixelMap>& pixmap);
104     static RSColorType PixelFormatToRSColorType(const RefPtr<PixelMap>& pixmap);
105 
106 private:
107     void ClipRRect(RSCanvas& canvas, const RSRect& dstRect, const BorderRadiusArray& radiusXY);
108     bool DrawWithRecordingCanvas(RSCanvas& canvas, const BorderRadiusArray& radiusXY);
109 
110     uint32_t uniqueId_ = 0;
111     std::shared_ptr<RSImage> image_;
112     std::shared_ptr<RSData> compressData_;
113     int32_t compressWidth_ = 0;
114     int32_t compressHeight_ = 0;
115 };
116 } // namespace OHOS::Ace::NG
117 
118 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_RENDER_ADAPTER_ROSEN_DRAWING_IMAGE_H
119