1 /*
2  * Copyright (c) 2021-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_IMAGE_IMAGE_OBJECT_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_IMAGE_IMAGE_OBJECT_H
18 
19 #include "modules/svg/include/SkSVGDOM.h"
20 
21 #include "base/image/pixel_map.h"
22 #include "core/image/animated_image_player.h"
23 #include "core/image/image_source_info.h"
24 #include "frameworks/core/components/svg/parse/svg_dom.h"
25 
26 namespace OHOS::Ace {
27 
28 class RenderImage;
29 class ImageObject : public virtual AceType {
30     DECLARE_ACE_TYPE(ImageObject, AceType);
31 
32 public:
33 #ifndef USE_ROSEN_DRAWING
34     static RefPtr<ImageObject> BuildImageObject(
35         ImageSourceInfo source, const RefPtr<PipelineBase> context, const sk_sp<SkData>& skData, bool useSkiaSvg);
36 #else
37     static RefPtr<ImageObject> BuildImageObject(ImageSourceInfo source, const RefPtr<PipelineBase> context,
38         const std::shared_ptr<RSData>& rsData, bool useSkiaSvg);
39 #endif
40 
41     ImageObject() = default;
ImageObject(ImageSourceInfo source)42     explicit ImageObject(ImageSourceInfo source) : imageSource_(source) {}
43 
44     ImageObject(ImageSourceInfo source, const Size& imageSize, int32_t frameCount, bool isSvg = false)
45         : imageSource_(source), imageSize_(imageSize), frameCount_(frameCount), isSvg_(isSvg)
46     {}
47     virtual ~ImageObject() = default;
48 
49     static std::string GenerateCacheKey(const ImageSourceInfo& srcInfo, Size targetSize);
50 
GetImageSize()51     Size GetImageSize()
52     {
53         return imageSize_;
54     }
55 
SetImageSize(Size & size)56     void SetImageSize(Size& size)
57     {
58         imageSize_ = size;
59     }
60 
GetFrameCount()61     int32_t GetFrameCount()
62     {
63         return frameCount_;
64     }
65 
SetFrameCount(int32_t frameCount)66     void SetFrameCount(int32_t frameCount)
67     {
68         frameCount_ = frameCount;
69     }
70 
IsSingleFrame()71     bool IsSingleFrame() const
72     {
73         return frameCount_ == 1;
74     }
75 
GetSourceInfo()76     ImageSourceInfo GetSourceInfo()
77     {
78         return imageSource_;
79     }
80 
IsSvg()81     bool IsSvg() const
82     {
83         return isSvg_;
84     }
85 
IsAPng()86     bool IsAPng() const
87     {
88         return isApng_;
89     }
90 
91     virtual void UploadToGpuForRender(const WeakPtr<PipelineBase>& context,
92         const UploadSuccessCallback& successCallback, const FailedCallback& failedCallback, const Size& imageSize,
93         bool forceResize, bool syncMode = false)
94     {}
95 
Pause()96     virtual void Pause() {}
Resume()97     virtual void Resume() {}
ClearData()98     virtual void ClearData() {}
99 
100     // this will be called on ui thread when renderImage do perform layout for different image objects.
PerformLayoutImageObject(RefPtr<RenderImage> image)101     virtual void PerformLayoutImageObject(RefPtr<RenderImage> image) {}
102 
103     // this will be called on ui thread when renderImage do measure for different image objects.
104     virtual Size MeasureForImage(RefPtr<RenderImage> image);
105 
CancelBackgroundTasks()106     virtual bool CancelBackgroundTasks()
107     {
108         return false;
109     }
110 
Clone()111     virtual RefPtr<ImageObject> Clone()
112     {
113         return MakeRefPtr<ImageObject>(imageSource_, imageSize_, frameCount_, isSvg_);
114     }
115 
116 protected:
117     ImageSourceInfo imageSource_;
118     Size imageSize_;
119     int32_t frameCount_ = 1;
120     bool isSvg_ = false;
121     bool isApng_ = false;
122 };
123 
124 class SvgSkiaImageObject : public ImageObject {
125     DECLARE_ACE_TYPE(SvgSkiaImageObject, ImageObject);
126 
127 public:
SvgSkiaImageObject(ImageSourceInfo source,const Size & imageSize,int32_t frameCount,const sk_sp<SkSVGDOM> & skiaDom)128     SvgSkiaImageObject(
129         ImageSourceInfo source, const Size& imageSize, int32_t frameCount, const sk_sp<SkSVGDOM>& skiaDom)
130         : ImageObject(source, imageSize, frameCount, true), skiaDom_(skiaDom)
131     {}
132 
133     ~SvgSkiaImageObject() override = default;
134 
GetSkiaDom()135     const sk_sp<SkSVGDOM>& GetSkiaDom()
136     {
137         return skiaDom_;
138     }
139 
140     void PerformLayoutImageObject(RefPtr<RenderImage> image) override;
141     Size MeasureForImage(RefPtr<RenderImage> image) override;
142 
Clone()143     RefPtr<ImageObject> Clone() override
144     {
145         return MakeRefPtr<SvgSkiaImageObject>(imageSource_, Size(), frameCount_, skiaDom_);
146     }
147 
148 private:
149     sk_sp<SkSVGDOM> skiaDom_;
150 };
151 
152 class SvgImageObject : public ImageObject {
153     DECLARE_ACE_TYPE(SvgImageObject, ImageObject);
154 
155 public:
SvgImageObject(ImageSourceInfo source,const Size & imageSize,int32_t frameCount,const RefPtr<SvgDom> & svgDom)156     SvgImageObject(ImageSourceInfo source, const Size& imageSize, int32_t frameCount, const RefPtr<SvgDom>& svgDom)
157         : ImageObject(source, imageSize, frameCount, true), svgDom_(svgDom)
158     {}
159 
160     ~SvgImageObject() override = default;
161 
GetSvgDom()162     const RefPtr<SvgDom>& GetSvgDom()
163     {
164         return svgDom_;
165     }
166 
167     void PerformLayoutImageObject(RefPtr<RenderImage> image) override;
168     Size MeasureForImage(RefPtr<RenderImage> image) override;
169 
Clone()170     RefPtr<ImageObject> Clone() override
171     {
172         return MakeRefPtr<SvgImageObject>(imageSource_, Size(), frameCount_, svgDom_);
173     }
174 
175 private:
176     RefPtr<SvgDom> svgDom_;
177 };
178 
179 class StaticImageObject : public ImageObject {
180     DECLARE_ACE_TYPE(StaticImageObject, ImageObject);
181 
182 public:
183     using CancelableTask = CancelableCallback<void()>;
184 #ifndef USE_ROSEN_DRAWING
StaticImageObject(ImageSourceInfo source,const Size & imageSize,int32_t frameCount,const sk_sp<SkData> & data)185     StaticImageObject(ImageSourceInfo source, const Size& imageSize, int32_t frameCount, const sk_sp<SkData>& data)
186         : ImageObject(source, imageSize, frameCount), skData_(data)
187     {}
188 #else
StaticImageObject(ImageSourceInfo source,const Size & imageSize,int32_t frameCount,const std::shared_ptr<RSData> & data)189     StaticImageObject(
190         ImageSourceInfo source, const Size& imageSize, int32_t frameCount, const std::shared_ptr<RSData>& data)
191         : ImageObject(source, imageSize, frameCount), data_(data)
192     {}
193 #endif
194 
195     ~StaticImageObject() override = default;
196 
197     void UploadToGpuForRender(const WeakPtr<PipelineBase>& context, const UploadSuccessCallback& successCallback,
198         const FailedCallback& failedCallback, const Size& imageSize, bool forceResize, bool syncMode = false) override;
199 
ClearData()200     void ClearData() override
201     {
202 #ifndef USE_ROSEN_DRAWING
203         skData_ = nullptr;
204 #else
205         data_ = nullptr;
206 #endif
207     }
208 
209     bool CancelBackgroundTasks() override;
210 
Clone()211     RefPtr<ImageObject> Clone() override
212     {
213 #ifndef USE_ROSEN_DRAWING
214         return MakeRefPtr<StaticImageObject>(imageSource_, imageSize_, frameCount_, skData_);
215 #else
216         return MakeRefPtr<StaticImageObject>(imageSource_, imageSize_, frameCount_, data_);
217 #endif
218     }
219 
220 private:
221 #ifndef USE_ROSEN_DRAWING
222     sk_sp<SkData> skData_;
223 #else
224     std::shared_ptr<RSData> data_;
225 #endif
226     CancelableTask uploadForPaintTask_;
227 };
228 
229 #ifndef USE_ROSEN_DRAWING
230 RefPtr<ImageObject> CreateAnimatedImageObject(
231     ImageSourceInfo source, const Size& imageSize, int32_t frameCount, const sk_sp<SkData>& data);
232 #else
233 RefPtr<ImageObject> CreateAnimatedImageObject(
234     ImageSourceInfo source, const Size& imageSize, int32_t frameCount, const std::shared_ptr<RSData>& data);
235 #endif
236 
237 class PixelMapImageObject : public ImageObject {
238     DECLARE_ACE_TYPE(PixelMapImageObject, ImageObject);
239 
240 public:
PixelMapImageObject(const RefPtr<PixelMap> & pixmap)241     explicit PixelMapImageObject(const RefPtr<PixelMap>& pixmap) : pixmap_(pixmap)
242     {
243         imageSize_ = Size(pixmap_->GetWidth(), pixmap_->GetHeight());
244     }
245 
246     ~PixelMapImageObject() override = default;
247 
GetRawPixelMapPtr()248     void* GetRawPixelMapPtr()
249     {
250         return pixmap_->GetRawPixelMapPtr();
251     }
252 
253     void PerformLayoutImageObject(RefPtr<RenderImage> image) override;
254     Size MeasureForImage(RefPtr<RenderImage> image) override;
255 
ClearData()256     void ClearData() override
257     {
258         pixmap_ = nullptr;
259     }
260 
GetPixmap()261     const RefPtr<PixelMap>& GetPixmap() const
262     {
263         return pixmap_;
264     }
265 
Clone()266     RefPtr<ImageObject> Clone() override
267     {
268         return MakeRefPtr<PixelMapImageObject>(pixmap_);
269     }
270 
271 private:
272     RefPtr<PixelMap> pixmap_;
273 };
274 RefPtr<ImageObject> GetImageSvgDomObj(ImageSourceInfo source, const std::unique_ptr<SkMemoryStream>& svgStream,
275     const RefPtr<PipelineBase>& context, std::optional<Color>& color);
276 } // namespace OHOS::Ace
277 
278 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_IMAGE_IMAGE_OBJECT_H
279