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