1 /* 2 * Copyright (c) 2022-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_COMPONENTS_NG_RENDER_CANVAS_IMAGE_H 17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_RENDER_CANVAS_IMAGE_H 18 19 #include <memory> 20 21 #include "base/geometry/ng/rect_t.h" 22 #include "base/geometry/matrix4.h" 23 #include "base/image/drawing_color_filter.h" 24 #include "base/image/drawing_lattice.h" 25 #include "base/image/pixel_map.h" 26 #include "base/memory/ace_type.h" 27 #include "base/utils/noncopyable.h" 28 #include "core/components/common/layout/constants.h" 29 #include "core/components/common/properties/color.h" 30 #include "core/components_ng/pattern/image/image_dfx.h" 31 #include "core/components_ng/render/drawing_forward.h" 32 33 namespace OHOS::Ace::NG { 34 using BorderRadiusArray = std::array<PointF, 4>; 35 36 struct ImageColorFilter { 37 std::shared_ptr<std::vector<float>> colorFilterMatrix_; 38 RefPtr<DrawingColorFilter> colorFilterDrawing_; ResetImageColorFilter39 void Reset() 40 { 41 colorFilterMatrix_.reset(); 42 colorFilterDrawing_.Reset(); 43 } 44 }; 45 46 struct ImagePaintConfig { 47 float scaleX_ = 1.0f; 48 float scaleY_ = 1.0f; 49 float smoothEdge_ = 0.0f; 50 bool flipHorizontally_ = false; 51 bool isSvg_ = false; 52 int32_t frameCount_ = 1; 53 RectF srcRect_; 54 RectF dstRect_; 55 std::optional<Color> svgFillColor_; 56 ImageColorFilter colorFilter_; 57 ImageRenderMode renderMode_ = ImageRenderMode::ORIGINAL; 58 ImageInterpolation imageInterpolation_ = ImageInterpolation::NONE; 59 ImageRepeat imageRepeat_ = ImageRepeat::NO_REPEAT; 60 ImageFit imageFit_ = ImageFit::COVER; 61 ImageRotateOrientation orientation_ = ImageRotateOrientation::UP; 62 DynamicRangeMode dynamicMode = DynamicRangeMode::STANDARD; 63 std::vector<ObscuredReasons> obscuredReasons_; 64 ImageResizableSlice resizableSlice_; 65 std::shared_ptr<BorderRadiusArray> borderRadiusXY_ = nullptr; 66 RefPtr<DrawingLattice> resizableLattice_ = nullptr; 67 Matrix4 imageMatrix_; 68 }; 69 70 // CanvasImage is interface for drawing image. 71 class CanvasImage : public virtual AceType { 72 DECLARE_ACE_TYPE(CanvasImage, AceType); 73 74 public: 75 CanvasImage() = default; 76 ~CanvasImage() override = default; 77 virtual void DrawToRSCanvas( 78 RSCanvas& canvas, const RSRect& srcRect, const RSRect& dstRect, const BorderRadiusArray& radiusXY) = 0; DrawRect(RSCanvas & canvas,const RSRect & srcRect,const RSRect & dstRect)79 virtual void DrawRect(RSCanvas& canvas, const RSRect& srcRect, const RSRect& dstRect) {} 80 81 static RefPtr<CanvasImage> Create(void* rawImage); 82 static RefPtr<CanvasImage> Create(); 83 static RefPtr<CanvasImage> Create(const RefPtr<PixelMap>& pixelMap); 84 GetPixelMap()85 virtual RefPtr<PixelMap> GetPixelMap() const 86 { 87 return nullptr; 88 } 89 90 virtual int32_t GetWidth() const = 0; 91 virtual int32_t GetHeight() const = 0; 92 Clone()93 virtual RefPtr<CanvasImage> Clone() 94 { 95 return Claim(this); 96 } 97 HasData()98 virtual bool HasData() const 99 { 100 return false; 101 } 102 103 // cache this CanvasImage Cache(const std::string & key)104 virtual void Cache(const std::string& key) {} 105 SetPaintConfig(const ImagePaintConfig & config)106 void SetPaintConfig(const ImagePaintConfig& config) 107 { 108 paintConfig_ = std::make_unique<ImagePaintConfig>(config); 109 } 110 SetIsDrawAnimate(bool isDrawAnimate)111 void SetIsDrawAnimate(bool isDrawAnimate) 112 { 113 isDrawAnimate_ = isDrawAnimate; 114 } 115 GetPaintConfig()116 inline ImagePaintConfig& GetPaintConfig() 117 { 118 if (!paintConfig_) { 119 paintConfig_ = std::make_unique<ImagePaintConfig>(); 120 } 121 return *paintConfig_; 122 } 123 GetImageDfxConfig()124 inline ImageDfxConfig& GetImageDfxConfig() 125 { 126 return imageDfxConfig_; 127 } 128 IsStatic()129 virtual bool IsStatic() 130 { 131 return true; 132 } SetRedrawCallback(std::function<void ()> && callback)133 virtual void SetRedrawCallback(std::function<void()>&& callback) {} 134 SetOnFinishCallback(std::function<void ()> && callback)135 virtual void SetOnFinishCallback(std::function<void()>&& callback) {} 136 ControlAnimation(bool play)137 virtual void ControlAnimation(bool play) {} 138 SetRawCompressData(void * dataPtr,int32_t w,int32_t h)139 virtual void SetRawCompressData(void* dataPtr, int32_t w, int32_t h) {} 140 SetImageDfxConfig(const ImageDfxConfig & imageDfxConfig)141 inline void SetImageDfxConfig(const ImageDfxConfig& imageDfxConfig) 142 { 143 imageDfxConfig_ = imageDfxConfig; 144 } 145 SetDrawCompleteCallback(std::function<void (const RenderedImageInfo &)> && drawCompleteCallback)146 void SetDrawCompleteCallback(std::function<void(const RenderedImageInfo&)>&& drawCompleteCallback) 147 { 148 drawCompleteCallback_ = std::move(drawCompleteCallback); 149 } 150 FireDrawCompleteCallback(const RenderedImageInfo & renderedImageInfo)151 void FireDrawCompleteCallback(const RenderedImageInfo& renderedImageInfo) 152 { 153 if (drawCompleteCallback_) { 154 drawCompleteCallback_(renderedImageInfo); 155 } 156 } 157 IsHdrPixelMap()158 virtual bool IsHdrPixelMap() 159 { 160 return false; 161 } 162 163 protected: 164 bool isDrawAnimate_ = false; 165 166 private: 167 std::unique_ptr<ImagePaintConfig> paintConfig_; 168 ImageDfxConfig imageDfxConfig_; 169 // Callback function executed after the graphics rendering is complete. 170 std::function<void(const RenderedImageInfo&)> drawCompleteCallback_ = nullptr; 171 172 ACE_DISALLOW_COPY_AND_MOVE(CanvasImage); 173 }; 174 175 class CanvasImageModifierWrapper final { 176 public: 177 CanvasImageModifierWrapper() = default; 178 ~CanvasImageModifierWrapper() = default; 179 CanvasImageModifierWrapper(const RefPtr<CanvasImage> & canvasImage)180 explicit CanvasImageModifierWrapper(const RefPtr<CanvasImage>& canvasImage) : canvasImage_(canvasImage) {} 181 SetCanvasImage(const RefPtr<CanvasImage> & canvasImage)182 void SetCanvasImage(const RefPtr<CanvasImage>& canvasImage) 183 { 184 canvasImage_ = canvasImage; 185 } 186 GetCanvasImage()187 RefPtr<CanvasImage> GetCanvasImage() const 188 { 189 return canvasImage_; 190 } 191 192 CanvasImageModifierWrapper operator+(const CanvasImageModifierWrapper& /* other */) const 193 { 194 return CanvasImageModifierWrapper(canvasImage_); 195 } 196 197 CanvasImageModifierWrapper operator-(const CanvasImageModifierWrapper& /* other */) const 198 { 199 return CanvasImageModifierWrapper(canvasImage_); 200 } 201 202 CanvasImageModifierWrapper operator*(const CanvasImageModifierWrapper& /* other */) const 203 { 204 return CanvasImageModifierWrapper(canvasImage_); 205 } 206 207 bool operator==(const CanvasImageModifierWrapper& /* other */) const 208 { 209 return false; 210 } 211 212 private: 213 RefPtr<CanvasImage> canvasImage_; 214 }; 215 216 } // namespace OHOS::Ace::NG 217 218 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_RENDER_CANVAS_IMAGE_H 219