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