• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022-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_CANVAS_IMAGE_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_RENDER_CANVAS_IMAGE_H
18 
19 #include <memory>
20 
21 #include "base/geometry/ng/rect_t.h"
22 #include "base/geometry/matrix4.h"
23 #include "base/image/drawing_color_filter.h"
24 #include "base/image/drawing_lattice.h"
25 #include "base/image/pixel_map.h"
26 #include "base/memory/ace_type.h"
27 #include "base/utils/noncopyable.h"
28 #include "core/components/common/layout/constants.h"
29 #include "core/components/common/properties/color.h"
30 #include "core/components_ng/pattern/image/image_dfx.h"
31 #include "core/components_ng/render/drawing_forward.h"
32 
33 namespace OHOS::Ace::NG {
34 using BorderRadiusArray = std::array<PointF, 4>;
35 
36 struct ImageColorFilter {
37     std::shared_ptr<std::vector<float>> colorFilterMatrix_;
38     RefPtr<DrawingColorFilter> colorFilterDrawing_;
ResetImageColorFilter39     void Reset()
40     {
41         colorFilterMatrix_.reset();
42         colorFilterDrawing_.Reset();
43     }
44 };
45 
46 struct ImagePaintConfig {
47     float scaleX_ = 1.0f;
48     float scaleY_ = 1.0f;
49     float smoothEdge_ = 0.0f;
50     bool flipHorizontally_ = false;
51     bool isSvg_ = false;
52     int32_t frameCount_ = 1;
53     RectF srcRect_;
54     RectF dstRect_;
55     std::optional<Color> svgFillColor_;
56     ImageColorFilter colorFilter_;
57     ImageRenderMode renderMode_ = ImageRenderMode::ORIGINAL;
58     ImageInterpolation imageInterpolation_ = ImageInterpolation::NONE;
59     ImageRepeat imageRepeat_ = ImageRepeat::NO_REPEAT;
60     ImageFit imageFit_ = ImageFit::COVER;
61     ImageRotateOrientation orientation_ = ImageRotateOrientation::UP;
62     DynamicRangeMode dynamicMode = DynamicRangeMode::STANDARD;
63     std::vector<ObscuredReasons> obscuredReasons_;
64     ImageResizableSlice resizableSlice_;
65     std::shared_ptr<BorderRadiusArray> borderRadiusXY_ = nullptr;
66     RefPtr<DrawingLattice> resizableLattice_ = nullptr;
67     Matrix4 imageMatrix_;
68 };
69 
70 // CanvasImage is interface for drawing image.
71 class CanvasImage : public virtual AceType {
72     DECLARE_ACE_TYPE(CanvasImage, AceType);
73 
74 public:
75     CanvasImage() = default;
76     ~CanvasImage() override = default;
77     virtual void DrawToRSCanvas(
78         RSCanvas& canvas, const RSRect& srcRect, const RSRect& dstRect, const BorderRadiusArray& radiusXY) = 0;
DrawRect(RSCanvas & canvas,const RSRect & srcRect,const RSRect & dstRect)79     virtual void DrawRect(RSCanvas& canvas, const RSRect& srcRect, const RSRect& dstRect) {}
80 
81     static RefPtr<CanvasImage> Create(void* rawImage);
82     static RefPtr<CanvasImage> Create();
83     static RefPtr<CanvasImage> Create(const RefPtr<PixelMap>& pixelMap);
84 
GetPixelMap()85     virtual RefPtr<PixelMap> GetPixelMap() const
86     {
87         return nullptr;
88     }
89 
90     virtual int32_t GetWidth() const = 0;
91     virtual int32_t GetHeight() const = 0;
92 
Clone()93     virtual RefPtr<CanvasImage> Clone()
94     {
95         return Claim(this);
96     }
97 
HasData()98     virtual bool HasData() const
99     {
100         return false;
101     }
102 
103     // cache this CanvasImage
Cache(const std::string & key)104     virtual void Cache(const std::string& key) {}
105 
SetPaintConfig(const ImagePaintConfig & config)106     void SetPaintConfig(const ImagePaintConfig& config)
107     {
108         paintConfig_ = std::make_unique<ImagePaintConfig>(config);
109     }
110 
SetIsDrawAnimate(bool isDrawAnimate)111     void SetIsDrawAnimate(bool isDrawAnimate)
112     {
113         isDrawAnimate_ = isDrawAnimate;
114     }
115 
GetPaintConfig()116     inline ImagePaintConfig& GetPaintConfig()
117     {
118         if (!paintConfig_) {
119             paintConfig_ = std::make_unique<ImagePaintConfig>();
120         }
121         return *paintConfig_;
122     }
123 
GetImageDfxConfig()124     inline ImageDfxConfig& GetImageDfxConfig()
125     {
126         return imageDfxConfig_;
127     }
128 
IsStatic()129     virtual bool IsStatic()
130     {
131         return true;
132     }
SetRedrawCallback(std::function<void ()> && callback)133     virtual void SetRedrawCallback(std::function<void()>&& callback) {}
134 
SetOnFinishCallback(std::function<void ()> && callback)135     virtual void SetOnFinishCallback(std::function<void()>&& callback) {}
136 
ControlAnimation(bool play)137     virtual void ControlAnimation(bool play) {}
138 
SetRawCompressData(void * dataPtr,int32_t w,int32_t h)139     virtual void SetRawCompressData(void* dataPtr, int32_t w, int32_t h) {}
140 
SetImageDfxConfig(const ImageDfxConfig & imageDfxConfig)141     inline void SetImageDfxConfig(const ImageDfxConfig& imageDfxConfig)
142     {
143         imageDfxConfig_ = imageDfxConfig;
144     }
145 
SetDrawCompleteCallback(std::function<void (const RenderedImageInfo &)> && drawCompleteCallback)146     void SetDrawCompleteCallback(std::function<void(const RenderedImageInfo&)>&& drawCompleteCallback)
147     {
148         drawCompleteCallback_ = std::move(drawCompleteCallback);
149     }
150 
FireDrawCompleteCallback(const RenderedImageInfo & renderedImageInfo)151     void FireDrawCompleteCallback(const RenderedImageInfo& renderedImageInfo)
152     {
153         if (drawCompleteCallback_) {
154             drawCompleteCallback_(renderedImageInfo);
155         }
156     }
157 
IsHdrPixelMap()158     virtual bool IsHdrPixelMap()
159     {
160         return false;
161     }
162 
163 protected:
164     bool isDrawAnimate_ = false;
165 
166 private:
167     std::unique_ptr<ImagePaintConfig> paintConfig_;
168     ImageDfxConfig imageDfxConfig_;
169     // Callback function executed after the graphics rendering is complete.
170     std::function<void(const RenderedImageInfo&)> drawCompleteCallback_ = nullptr;
171 
172     ACE_DISALLOW_COPY_AND_MOVE(CanvasImage);
173 };
174 
175 class CanvasImageModifierWrapper final {
176 public:
177     CanvasImageModifierWrapper() = default;
178     ~CanvasImageModifierWrapper() = default;
179 
CanvasImageModifierWrapper(const RefPtr<CanvasImage> & canvasImage)180     explicit CanvasImageModifierWrapper(const RefPtr<CanvasImage>& canvasImage) : canvasImage_(canvasImage) {}
181 
SetCanvasImage(const RefPtr<CanvasImage> & canvasImage)182     void SetCanvasImage(const RefPtr<CanvasImage>& canvasImage)
183     {
184         canvasImage_ = canvasImage;
185     }
186 
GetCanvasImage()187     RefPtr<CanvasImage> GetCanvasImage() const
188     {
189         return canvasImage_;
190     }
191 
192     CanvasImageModifierWrapper operator+(const CanvasImageModifierWrapper& /* other */) const
193     {
194         return CanvasImageModifierWrapper(canvasImage_);
195     }
196 
197     CanvasImageModifierWrapper operator-(const CanvasImageModifierWrapper& /* other */) const
198     {
199         return CanvasImageModifierWrapper(canvasImage_);
200     }
201 
202     CanvasImageModifierWrapper operator*(const CanvasImageModifierWrapper& /* other */) const
203     {
204         return CanvasImageModifierWrapper(canvasImage_);
205     }
206 
207     bool operator==(const CanvasImageModifierWrapper& /* other */) const
208     {
209         return false;
210     }
211 
212 private:
213     RefPtr<CanvasImage> canvasImage_;
214 };
215 
216 } // namespace OHOS::Ace::NG
217 
218 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_RENDER_CANVAS_IMAGE_H
219