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