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