• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_COMPONENTS_NG_PATTERN_IMAGE_IMAGE_MODEL_NG_CPP
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_IMAGE_IMAGE_MODEL_NG_CPP
18 
19 #include "core/components_ng/pattern/image/image_model_ng.h"
20 
21 #include "core/components/common/layout/constants.h"
22 #include "core/components/image/image_theme.h"
23 #include "core/components_ng/base/frame_node.h"
24 #include "core/components_ng/pattern/image/image_render_property.h"
25 #include "core/image/image_source_info.h"
26 #ifndef ACE_UNITTEST
27 #include "core/components_ng/base/view_abstract.h"
28 #endif
29 #include "interfaces/native/node/resource.h"
30 #include "core/components_ng/pattern/text/span_node.h"
31 
32 #include "core/components_ng/base/view_stack_processor.h"
33 #include "core/components_ng/pattern/image/image_layout_property.h"
34 #include "core/components_ng/pattern/image/image_pattern.h"
35 #include "core/components_v2/inspector/inspector_constants.h"
36 
37 namespace OHOS::Ace::NG {
38 namespace {
39 const std::vector<float> DEFAULT_COLOR_FILTER = { 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0 };
CreateSourceInfo(const std::shared_ptr<std::string> & src,RefPtr<PixelMap> & pixmap,const std::string & bundleName,const std::string & moduleName)40 ImageSourceInfo CreateSourceInfo(const std::shared_ptr<std::string>& src, RefPtr<PixelMap>& pixmap,
41     const std::string& bundleName, const std::string& moduleName)
42 {
43 #if defined(PIXEL_MAP_SUPPORTED)
44     if (pixmap) {
45         return ImageSourceInfo(pixmap);
46     }
47 #endif
48     return { src, bundleName, moduleName };
49 }
50 
CreateSourceInfo(const std::string & src,RefPtr<PixelMap> & pixmap,const std::string & bundleName,const std::string & moduleName)51 ImageSourceInfo CreateSourceInfo(
52     const std::string& src, RefPtr<PixelMap>& pixmap, const std::string& bundleName, const std::string& moduleName)
53 {
54 #if defined(PIXEL_MAP_SUPPORTED)
55     if (pixmap) {
56         return ImageSourceInfo(pixmap);
57     }
58 #endif
59     return { src, bundleName, moduleName };
60 }
61 } // namespace
62 
Create(const ImageInfoConfig & imageInfoConfig,RefPtr<PixelMap> & pixMap)63 void ImageModelNG::Create(const ImageInfoConfig& imageInfoConfig, RefPtr<PixelMap>& pixMap)
64 {
65     auto *stack = ViewStackProcessor::GetInstance();
66     auto nodeId = stack->ClaimNodeId();
67     const std::string& src = imageInfoConfig.src ? *imageInfoConfig.src : "";
68     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d] [src:%s]", V2::IMAGE_ETS_TAG, nodeId, src.c_str());
69     RefPtr<FrameNode> frameNode;
70     if (imageInfoConfig.isImageSpan) {
71         frameNode = ImageSpanNode::GetOrCreateSpanNode(V2::IMAGE_ETS_TAG,
72             nodeId, []() { return AceType::MakeRefPtr<ImagePattern>(); });
73     } else {
74         frameNode = FrameNode::GetOrCreateFrameNode(
75             V2::IMAGE_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<ImagePattern>(); });
76     }
77     stack->Push(frameNode);
78     auto pattern = frameNode->GetPattern<ImagePattern>();
79     CHECK_NULL_VOID(pattern);
80     if (src.empty() && !pixMap && pattern->GetIsAnimation()) {
81         pattern->SetSrcUndefined(true);
82         return;
83     }
84 
85     if (frameNode->IsFirstBuilding() && !imageInfoConfig.isImageSpan) {
86         SetDraggableForFrameNode(frameNode);
87     }
88     auto srcInfo =
89         CreateSourceInfo(imageInfoConfig.src, pixMap, imageInfoConfig.bundleName, imageInfoConfig.moduleName);
90     srcInfo.SetIsUriPureNumber(imageInfoConfig.isUriPureNumber);
91 
92     if (pattern->GetImageType() != ImagePattern::ImageType::BASE) {
93         if (pattern->GetHasSizeChanged()) {
94             pattern->ResetPictureSize();
95         }
96         pattern->StopAnimation();
97         pattern->ResetImages();
98         if (!frameNode->GetChildren().empty()) {
99             auto imageFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
100             ACE_RESET_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, imageFrameNode);
101             frameNode->RemoveChild(imageFrameNode);
102         }
103     }
104     pattern->SetNeedLoadAlt(true);
105     pattern->SetImageType(ImagePattern::ImageType::BASE);
106 
107     ACE_UPDATE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, srcInfo);
108 }
109 
SetDraggableForFrameNode(RefPtr<FrameNode> frameNode)110 void ImageModelNG::SetDraggableForFrameNode(RefPtr<FrameNode> frameNode)
111 {
112     auto pipeline = frameNode->GetContext();
113     CHECK_NULL_VOID(pipeline);
114     auto draggable = pipeline->GetDraggable<ImageTheme>();
115     if (draggable && !frameNode->IsDraggable()) {
116         auto gestureHub = frameNode->GetOrCreateGestureEventHub();
117         CHECK_NULL_VOID(gestureHub);
118         gestureHub->InitDragDropEvent();
119     }
120     frameNode->SetDraggable(draggable);
121 }
122 
ResetImage()123 void ImageModelNG::ResetImage()
124 {
125     auto *stack = ViewStackProcessor::GetInstance();
126     auto nodeId = stack->ClaimNodeId();
127     RefPtr<FrameNode> frameNode;
128     frameNode = FrameNode::GetOrCreateFrameNode(
129         V2::IMAGE_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<ImagePattern>(); });
130     stack->Push(frameNode);
131     ImageSourceInfo sourceInfo("");
132     sourceInfo.SetIsFromReset(true);
133     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, sourceInfo, frameNode);
134     frameNode->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
135     auto pattern = frameNode->GetPattern<ImagePattern>();
136     CHECK_NULL_VOID(pattern);
137     pattern->SetNeedLoadAlt(false);
138     pattern->ResetImageAndAlt();
139     if (pattern->GetImageType() == ImagePattern::ImageType::ANIMATION) {
140         if (pattern->GetHasSizeChanged()) {
141             pattern->ResetPictureSize();
142         }
143         pattern->StopAnimation();
144         pattern->ResetImages();
145         if (!frameNode->GetChildren().empty()) {
146             auto imageFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
147             ACE_RESET_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, imageFrameNode);
148             frameNode->RemoveChild(imageFrameNode);
149         }
150         pattern->SetImageType(ImagePattern::ImageType::BASE);
151     }
152 }
153 
ResetImage(FrameNode * frameNode)154 void ImageModelNG::ResetImage(FrameNode* frameNode)
155 {
156     ImageSourceInfo sourceInfo("");
157     sourceInfo.SetIsFromReset(true);
158     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, sourceInfo, frameNode);
159     frameNode->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
160     auto pattern = frameNode->GetPattern<ImagePattern>();
161     CHECK_NULL_VOID(pattern);
162     pattern->SetNeedLoadAlt(false);
163     pattern->ResetImageAndAlt();
164 }
165 
SetInitialSrc(FrameNode * frameNode,const std::string & src,const std::string & bundleName,const std::string & moduleName,bool isUriPureNumber)166 void ImageModelNG::SetInitialSrc(FrameNode *frameNode, const std::string &src, const std::string &bundleName,
167     const std::string &moduleName, bool isUriPureNumber)
168 {
169     auto srcInfo = ImageSourceInfo{ src, bundleName, moduleName };
170     srcInfo.SetIsUriPureNumber(isUriPureNumber);
171 
172     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, srcInfo, frameNode);
173 }
174 
SetInitialPixelMap(FrameNode * frameNode,RefPtr<PixelMap> & pixMap)175 void ImageModelNG::SetInitialPixelMap(FrameNode* frameNode, RefPtr<PixelMap>& pixMap)
176 {
177     auto srcInfo = ImageSourceInfo(pixMap);
178     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, srcInfo, frameNode);
179 }
180 
CreateAnimation(const std::vector<ImageProperties> & imageList,int32_t duration,int32_t iteration)181 void ImageModelNG::CreateAnimation(const std::vector<ImageProperties>& imageList, int32_t duration, int32_t iteration)
182 {
183     auto* stack = ViewStackProcessor::GetInstance();
184     auto nodeId = stack->ClaimNodeId();
185     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::IMAGE_ETS_TAG, nodeId);
186     auto frameNode = FrameNode::GetOrCreateFrameNode(
187         V2::IMAGE_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<ImagePattern>(); });
188     CHECK_NULL_VOID(frameNode);
189     if (frameNode->GetChildren().empty()) {
190         auto imageNode = FrameNode::CreateFrameNode(
191             V2::IMAGE_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<ImagePattern>());
192         CHECK_NULL_VOID(imageNode);
193         auto imageLayoutProperty = AceType::DynamicCast<ImageLayoutProperty>(imageNode->GetLayoutProperty());
194         CHECK_NULL_VOID(imageLayoutProperty);
195         imageLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT);
196         frameNode->GetLayoutProperty()->UpdateAlignment(Alignment::TOP_LEFT);
197         frameNode->AddChild(imageNode);
198     }
199     stack->Push(frameNode);
200 
201     auto pattern = frameNode->GetPattern<ImagePattern>();
202     CHECK_NULL_VOID(pattern);
203     if (!pattern->GetIsAnimation()) {
204         auto castImageLayoutProperty = frameNode->GetLayoutPropertyPtr<ImageLayoutProperty>();
205         CHECK_NULL_VOID(castImageLayoutProperty);
206         castImageLayoutProperty->Reset();
207         auto castImageRenderProperty = frameNode->GetPaintPropertyPtr<ImageRenderProperty>();
208         CHECK_NULL_VOID(castImageRenderProperty);
209         castImageRenderProperty->Reset();
210         pattern->ResetImageAndAlt();
211         pattern->ResetImageProperties();
212     }
213     // set draggable for framenode
214     auto pipeline = frameNode->GetContext();
215     CHECK_NULL_VOID(pipeline);
216     auto draggable = pipeline->GetDraggable<ImageTheme>();
217     if (draggable && !frameNode->IsDraggable()) {
218         auto gestureHub = frameNode->GetOrCreateGestureEventHub();
219         CHECK_NULL_VOID(gestureHub);
220         gestureHub->InitDragDropEvent();
221     }
222     frameNode->SetDraggable(draggable);
223     pattern->SetSrcUndefined(false);
224     pattern->StopAnimation();
225     pattern->SetImageType(ImagePattern::ImageType::ANIMATION);
226     std::vector<ImageProperties> images = imageList;
227     pattern->SetImages(std::move(images));
228     pattern->SetDuration(duration);
229     pattern->SetIteration(iteration);
230     pattern->StartAnimation();
231 }
232 
CreateFrameNode(int32_t nodeId,const std::string & src,RefPtr<PixelMap> & pixMap,const std::string & bundleName,const std::string & moduleName,bool isUriPureNumber)233 RefPtr<FrameNode> ImageModelNG::CreateFrameNode(int32_t nodeId, const std::string& src, RefPtr<PixelMap>& pixMap,
234     const std::string& bundleName, const std::string& moduleName, bool isUriPureNumber)
235 {
236     auto frameNode = FrameNode::CreateFrameNode(V2::IMAGE_ETS_TAG, nodeId, AceType::MakeRefPtr<ImagePattern>());
237     CHECK_NULL_RETURN(frameNode, nullptr);
238     // set draggable for framenode
239     auto pipeline = PipelineContext::GetCurrentContextSafelyWithCheck();
240     CHECK_NULL_RETURN(pipeline, nullptr);
241     auto draggable = pipeline->GetDraggable<ImageTheme>();
242     if (draggable && !frameNode->IsDraggable()) {
243         auto gestureHub = frameNode->GetOrCreateGestureEventHub();
244         CHECK_NULL_RETURN(gestureHub, nullptr);
245         gestureHub->InitDragDropEvent();
246     }
247     frameNode->SetDraggable(draggable);
248     auto srcInfo = CreateSourceInfo(src, pixMap, bundleName, moduleName);
249     srcInfo.SetIsUriPureNumber(isUriPureNumber);
250     auto layoutProperty = frameNode->GetLayoutProperty<ImageLayoutProperty>();
251     CHECK_NULL_RETURN(layoutProperty, nullptr);
252     layoutProperty->UpdateImageSourceInfo(srcInfo);
253     return frameNode;
254 }
255 
SetAlt(const ImageSourceInfo & src)256 void ImageModelNG::SetAlt(const ImageSourceInfo& src)
257 {
258     ACE_UPDATE_LAYOUT_PROPERTY(ImageLayoutProperty, Alt, src);
259 }
260 
SetSmoothEdge(float value)261 void ImageModelNG::SetSmoothEdge(float value)
262 {
263     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, SmoothEdge, value);
264 }
265 
SetSmoothEdge(FrameNode * frameNode,float value)266 void ImageModelNG::SetSmoothEdge(FrameNode *frameNode, float value)
267 {
268     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, SmoothEdge, value, frameNode);
269 }
270 
SetDynamicRangeMode(DynamicRangeMode dynamicRangeMode)271 void ImageModelNG::SetDynamicRangeMode(DynamicRangeMode dynamicRangeMode)
272 {
273     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, DynamicMode, dynamicRangeMode);
274     ACE_UPDATE_RENDER_CONTEXT(DynamicRangeMode, dynamicRangeMode);
275 }
276 
SetDynamicRangeMode(FrameNode * frameNode,DynamicRangeMode dynamicRangeMode)277 void ImageModelNG::SetDynamicRangeMode(FrameNode* frameNode, DynamicRangeMode dynamicRangeMode)
278 {
279     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, DynamicMode, dynamicRangeMode, frameNode);
280     ACE_UPDATE_NODE_RENDER_CONTEXT(DynamicRangeMode, dynamicRangeMode, frameNode);
281 }
282 
SetEnhancedImageQuality(AIImageQuality imageQuality)283 void ImageModelNG::SetEnhancedImageQuality(AIImageQuality imageQuality)
284 {
285     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
286     CHECK_NULL_VOID(pattern);
287     pattern->SetImageQuality(imageQuality);
288 }
289 
SetEnhancedImageQuality(FrameNode * frameNode,AIImageQuality imageQuality)290 void ImageModelNG::SetEnhancedImageQuality(FrameNode* frameNode, AIImageQuality imageQuality)
291 {
292     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>(frameNode);
293     CHECK_NULL_VOID(pattern);
294     pattern->SetImageQuality(imageQuality);
295 }
296 
SetBorder(const Border & border)297 void ImageModelNG::SetBorder(const Border &border) {}
298 
SetBorderRadius(const Dimension & value)299 void ImageModelNG::SetBorderRadius(const Dimension& value)
300 {
301     BorderRadiusProperty borderRadius;
302     borderRadius.SetRadius(value);
303     borderRadius.multiValued = false;
304     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, NeedBorderRadius, true);
305     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, BorderRadius, borderRadius);
306     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
307     CHECK_NULL_VOID(frameNode);
308     auto pattern = frameNode->GetPattern<ImagePattern>();
309     CHECK_NULL_VOID(pattern);
310     pattern->SetNeedBorderRadius(true);
311 }
312 
SetBorderRadius(const std::optional<Dimension> & radiusTopLeft,const std::optional<Dimension> & radiusTopRight,const std::optional<Dimension> & radiusBottomLeft,const std::optional<Dimension> & radiusBottomRight)313 void ImageModelNG::SetBorderRadius(const std::optional<Dimension>& radiusTopLeft,
314     const std::optional<Dimension>& radiusTopRight, const std::optional<Dimension>& radiusBottomLeft,
315     const std::optional<Dimension>& radiusBottomRight)
316 {
317     NG::BorderRadiusProperty borderRadius;
318     borderRadius.radiusTopLeft = radiusTopLeft;
319     borderRadius.radiusTopRight = radiusTopRight;
320     borderRadius.radiusBottomLeft = radiusBottomLeft;
321     borderRadius.radiusBottomRight = radiusBottomRight;
322     borderRadius.multiValued = true;
323     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, NeedBorderRadius, true);
324     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, BorderRadius, borderRadius);
325     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
326     CHECK_NULL_VOID(frameNode);
327     auto pattern = frameNode->GetPattern<ImagePattern>();
328     CHECK_NULL_VOID(pattern);
329     pattern->SetNeedBorderRadius(true);
330 }
331 
SetBorderRadius(const NG::BorderRadiusProperty & borderRadius)332 void ImageModelNG::SetBorderRadius(const NG::BorderRadiusProperty& borderRadius)
333 {
334     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, NeedBorderRadius, true);
335     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, BorderRadius, borderRadius);
336     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
337     CHECK_NULL_VOID(frameNode);
338     auto pattern = frameNode->GetPattern<ImagePattern>();
339     CHECK_NULL_VOID(pattern);
340     pattern->SetNeedBorderRadius(true);
341 }
342 
SetBorderRadius(FrameNode * frameNode,const Dimension & value)343 void ImageModelNG::SetBorderRadius(FrameNode *frameNode, const Dimension& value)
344 {
345     BorderRadiusProperty borderRadius;
346     borderRadius.SetRadius(value);
347     borderRadius.multiValued = false;
348     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, BorderRadius, borderRadius, frameNode);
349     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, NeedBorderRadius, true, frameNode);
350     auto pattern = frameNode->GetPattern<ImagePattern>();
351     CHECK_NULL_VOID(pattern);
352     pattern->SetNeedBorderRadius(true);
353 }
354 
SetBorderRadius(FrameNode * frameNode,const std::optional<Dimension> & radiusTopLeft,const std::optional<Dimension> & radiusTopRight,const std::optional<Dimension> & radiusBottomLeft,const std::optional<Dimension> & radiusBottomRight)355 void ImageModelNG::SetBorderRadius(FrameNode* frameNode, const std::optional<Dimension>& radiusTopLeft,
356     const std::optional<Dimension>& radiusTopRight, const std::optional<Dimension>& radiusBottomLeft,
357     const std::optional<Dimension>& radiusBottomRight)
358 {
359     NG::BorderRadiusProperty borderRadius;
360     borderRadius.radiusTopLeft = radiusTopLeft;
361     borderRadius.radiusTopRight = radiusTopRight;
362     borderRadius.radiusBottomLeft = radiusBottomLeft;
363     borderRadius.radiusBottomRight = radiusBottomRight;
364     borderRadius.multiValued = true;
365     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, NeedBorderRadius, true, frameNode);
366     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, BorderRadius, borderRadius, frameNode);
367     auto pattern = frameNode->GetPattern<ImagePattern>();
368     CHECK_NULL_VOID(pattern);
369     pattern->SetNeedBorderRadius(true);
370 }
371 
SetBorderRadius(FrameNode * frameNode,const NG::BorderRadiusProperty & borderRadius)372 void ImageModelNG::SetBorderRadius(FrameNode* frameNode, const NG::BorderRadiusProperty& borderRadius)
373 {
374     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, NeedBorderRadius, true, frameNode);
375     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, BorderRadius, borderRadius, frameNode);
376     auto pattern = frameNode->GetPattern<ImagePattern>();
377     CHECK_NULL_VOID(pattern);
378     pattern->SetNeedBorderRadius(true);
379 }
380 
SetBackBorder()381 void ImageModelNG::SetBackBorder()
382 {
383     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, NeedBorderRadius, true);
384     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
385     CHECK_NULL_VOID(frameNode);
386     auto pattern = frameNode->GetPattern<ImagePattern>();
387     CHECK_NULL_VOID(pattern);
388     pattern->SetNeedBorderRadius(true);
389 }
390 
SetBackBorder(FrameNode * frameNode)391 void ImageModelNG::SetBackBorder(FrameNode *frameNode)
392 {
393     CHECK_NULL_VOID(frameNode);
394     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, NeedBorderRadius, true, frameNode);
395     auto pattern = frameNode->GetPattern<ImagePattern>();
396     CHECK_NULL_VOID(pattern);
397     pattern->SetNeedBorderRadius(true);
398 }
399 
ResetBackBorder(FrameNode * frameNode)400 void ImageModelNG::ResetBackBorder(FrameNode *frameNode)
401 {
402     CHECK_NULL_VOID(frameNode);
403     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, NeedBorderRadius, true, frameNode);
404     auto pattern = frameNode->GetPattern<ImagePattern>();
405     CHECK_NULL_VOID(pattern);
406     pattern->SetNeedBorderRadius(false);
407 }
408 
SetBlur(double blur)409 void ImageModelNG::SetBlur(double blur) {}
410 
SetImageFit(ImageFit value)411 void ImageModelNG::SetImageFit(ImageFit value)
412 {
413     ACE_UPDATE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageFit, value);
414     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ImageFit, value);
415 }
416 
SetMatchTextDirection(bool value)417 void ImageModelNG::SetMatchTextDirection(bool value)
418 {
419     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, MatchTextDirection, value);
420 }
421 
SetFitOriginSize(bool value)422 void ImageModelNG::SetFitOriginSize(bool value)
423 {
424     ACE_UPDATE_LAYOUT_PROPERTY(ImageLayoutProperty, FitOriginalSize, value);
425 }
426 
SetOnComplete(std::function<void (const LoadImageSuccessEvent & info)> && callback)427 void ImageModelNG::SetOnComplete(std::function<void(const LoadImageSuccessEvent& info)>&& callback)
428 {
429     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
430     CHECK_NULL_VOID(frameNode);
431     auto eventHub = frameNode->GetEventHub<ImageEventHub>();
432     CHECK_NULL_VOID(eventHub);
433     eventHub->SetOnComplete(std::move(callback));
434 }
435 
SetOnError(std::function<void (const LoadImageFailEvent & info)> && callback)436 void ImageModelNG::SetOnError(std::function<void(const LoadImageFailEvent& info)>&& callback)
437 {
438     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
439     CHECK_NULL_VOID(frameNode);
440     auto eventHub = frameNode->GetEventHub<ImageEventHub>();
441     CHECK_NULL_VOID(eventHub);
442     eventHub->SetOnError(std::move(callback));
443 }
444 
SetSvgAnimatorFinishEvent(std::function<void ()> && callback)445 void ImageModelNG::SetSvgAnimatorFinishEvent(std::function<void()>&& callback)
446 {
447     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
448     CHECK_NULL_VOID(frameNode);
449     auto eventHub = frameNode->GetEventHub<ImageEventHub>();
450     CHECK_NULL_VOID(eventHub);
451     eventHub->SetOnFinish(std::move(callback));
452 }
453 
SetImageSourceSize(const std::pair<Dimension,Dimension> & size)454 void ImageModelNG::SetImageSourceSize(const std::pair<Dimension, Dimension>& size)
455 {
456     SizeF sourceSize =
457         SizeF(static_cast<float>(size.first.ConvertToPx()), static_cast<float>(size.second.ConvertToPx()));
458     ACE_UPDATE_LAYOUT_PROPERTY(ImageLayoutProperty, SourceSize, sourceSize);
459 }
460 
SetImageFill(const Color & color)461 void ImageModelNG::SetImageFill(const Color& color)
462 {
463     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, SvgFillColor, color);
464     ACE_UPDATE_RENDER_CONTEXT(ForegroundColor, color);
465 }
466 
SetImageInterpolation(ImageInterpolation interpolation)467 void ImageModelNG::SetImageInterpolation(ImageInterpolation interpolation)
468 {
469     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ImageInterpolation, interpolation);
470 }
471 
SetImageRepeat(ImageRepeat imageRepeat)472 void ImageModelNG::SetImageRepeat(ImageRepeat imageRepeat)
473 {
474     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ImageRepeat, imageRepeat);
475 }
476 
SetImageRenderMode(ImageRenderMode imageRenderMode)477 void ImageModelNG::SetImageRenderMode(ImageRenderMode imageRenderMode)
478 {
479     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ImageRenderMode, imageRenderMode);
480 }
481 
IsSrcSvgImage()482 bool ImageModelNG::IsSrcSvgImage()
483 {
484     return false;
485 }
486 
SetAutoResize(bool autoResize)487 void ImageModelNG::SetAutoResize(bool autoResize)
488 {
489     ACE_UPDATE_LAYOUT_PROPERTY(ImageLayoutProperty, AutoResize, autoResize);
490 }
491 
SetSyncMode(bool syncMode)492 void ImageModelNG::SetSyncMode(bool syncMode)
493 {
494     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
495     CHECK_NULL_VOID(pattern);
496     pattern->SetSyncLoad(syncMode);
497 }
498 
SetColorFilterMatrix(const std::vector<float> & matrix)499 void ImageModelNG::SetColorFilterMatrix(const std::vector<float>& matrix)
500 {
501     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ColorFilter, matrix);
502     ACE_RESET_PAINT_PROPERTY(ImageRenderProperty, DrawingColorFilter);
503 }
504 
SetDrawingColorFilter(RefPtr<DrawingColorFilter> & colorFilter)505 void ImageModelNG::SetDrawingColorFilter(RefPtr<DrawingColorFilter> &colorFilter)
506 {
507     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, DrawingColorFilter, colorFilter);
508     ACE_RESET_PAINT_PROPERTY(ImageRenderProperty, ColorFilter);
509 }
510 
SetDraggable(bool draggable)511 void ImageModelNG::SetDraggable(bool draggable)
512 {
513     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
514     CHECK_NULL_VOID(frameNode);
515     auto gestureHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeGestureEventHub();
516     CHECK_NULL_VOID(gestureHub);
517     if (draggable) {
518         if (!frameNode->IsDraggable()) {
519             gestureHub->InitDragDropEvent();
520         }
521     } else {
522         gestureHub->RemoveDragEvent();
523     }
524     CHECK_NULL_VOID(frameNode);
525     frameNode->SetCustomerDraggable(draggable);
526 }
527 
SetOnDragStart(OnDragStartFunc && onDragStart)528 void ImageModelNG::SetOnDragStart(OnDragStartFunc&& onDragStart)
529 {
530 #ifndef ACE_UNITTEST
531     auto dragStart = [dragStartFunc = std::move(onDragStart)](
532                          const RefPtr<OHOS::Ace::DragEvent>& event, const std::string& extraParams) -> DragDropInfo {
533         auto dragInfo = dragStartFunc(event, extraParams);
534         DragDropInfo info;
535         info.extraInfo = dragInfo.extraInfo;
536         info.pixelMap = dragInfo.pixelMap;
537         info.customNode = AceType::DynamicCast<UINode>(dragInfo.node);
538         return info;
539     };
540     ViewAbstract::SetOnDragStart(std::move(dragStart));
541 #endif
542 }
543 
SetOnDragEnter(OnDragDropFunc && onDragEnter)544 void ImageModelNG::SetOnDragEnter(OnDragDropFunc&& onDragEnter) {}
545 
SetOnDragLeave(OnDragDropFunc && onDragLeave)546 void ImageModelNG::SetOnDragLeave(OnDragDropFunc&& onDragLeave) {}
547 
SetOnDragMove(OnDragDropFunc && onDragMove)548 void ImageModelNG::SetOnDragMove(OnDragDropFunc&& onDragMove) {}
549 
SetOnDrop(OnDragDropFunc && onDrop)550 void ImageModelNG::SetOnDrop(OnDragDropFunc&& onDrop) {}
551 
SetCopyOption(const CopyOptions & copyOption)552 void ImageModelNG::SetCopyOption(const CopyOptions& copyOption)
553 {
554     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
555     CHECK_NULL_VOID(pattern);
556     pattern->SetCopyOption(copyOption);
557 }
558 
UpdateDragItemInfo(DragItemInfo & itemInfo)559 bool ImageModelNG::UpdateDragItemInfo(DragItemInfo& itemInfo)
560 {
561     return false;
562 }
563 
InitImage(FrameNode * frameNode,std::string & src)564 void ImageModelNG::InitImage(FrameNode *frameNode, std::string& src)
565 {
566     std::string bundleName;
567     std::string moduleName;
568     RefPtr<OHOS::Ace::PixelMap> pixMapPtr;
569     auto srcInfo = CreateSourceInfo(src, pixMapPtr, bundleName, moduleName);
570     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, srcInfo, frameNode);
571 }
572 
573 
SetPixelMap(FrameNode * frameNode,void * drawableDescriptor)574 void ImageModelNG::SetPixelMap(FrameNode* frameNode, void* drawableDescriptor)
575 {
576 #ifndef ACE_UNITTEST
577     CHECK_NULL_VOID(drawableDescriptor);
578     RefPtr<PixelMap> pixelMapPtr = PixelMap::GetFromDrawable(drawableDescriptor);
579     auto srcInfo = CreateSourceInfo("", pixelMapPtr, "", "");
580     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, srcInfo, frameNode);
581 #endif
582 }
583 
SetPixelMapArray(FrameNode * frameNode,void * animatedDrawableDescriptor)584 void ImageModelNG::SetPixelMapArray(FrameNode* frameNode, void* animatedDrawableDescriptor)
585 {
586 #ifndef ACE_UNITTEST
587     CHECK_NULL_VOID(animatedDrawableDescriptor);
588     std::vector<RefPtr<PixelMap>> pixelMaps;
589     int32_t duration = -1;
590     int32_t iterations = 1;
591     if (!PixelMap::GetPxielMapListFromAnimatedDrawable(animatedDrawableDescriptor, pixelMaps, duration, iterations)) {
592         return;
593     }
594     std::vector<ImageProperties> images;
595     for (int32_t i = 0; i < static_cast<int32_t>(pixelMaps.size()); i++) {
596         ImageProperties image;
597         image.pixelMap = pixelMaps[i];
598         images.push_back(image);
599     }
600 
601     if (frameNode->GetChildren().empty()) {
602         auto imageNode = FrameNode::CreateFrameNode(V2::IMAGE_ETS_TAG, -1, AceType::MakeRefPtr<ImagePattern>());
603         CHECK_NULL_VOID(imageNode);
604         auto imageLayoutProperty = AceType::DynamicCast<ImageLayoutProperty>(imageNode->GetLayoutProperty());
605         CHECK_NULL_VOID(imageLayoutProperty);
606         imageLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT);
607         frameNode->GetLayoutProperty()->UpdateAlignment(Alignment::TOP_LEFT);
608         frameNode->AddChild(imageNode);
609     }
610 
611     auto pattern = AceType::DynamicCast<ImagePattern>(frameNode->GetPattern());
612     CHECK_NULL_VOID(pattern);
613 
614     pattern->StopAnimation();
615     pattern->SetImageType(ImagePattern::ImageType::ANIMATION);
616     pattern->SetImages(std::move(images));
617     pattern->SetDuration(duration);
618     pattern->SetIteration(iterations);
619     pattern->StartAnimation();
620 #endif
621 }
622 
SetResource(FrameNode * frameNode,void * resource)623 void ImageModelNG::SetResource(FrameNode* frameNode, void* resource)
624 {
625     auto res = reinterpret_cast<ArkUI_Resource*>(resource);
626     CHECK_NULL_VOID(res);
627     RefPtr<PixelMap> pixMapPtr;
628     auto srcInfo = CreateSourceInfo(res->src, pixMapPtr, res->bundleName, res->moduleName);
629     srcInfo.SetIsUriPureNumber(res->resId == -1);
630     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, srcInfo, frameNode);
631 }
632 
SetDrawingColorFilter(FrameNode * frameNode,RefPtr<DrawingColorFilter> & colorFilter)633 void ImageModelNG::SetDrawingColorFilter(FrameNode *frameNode, RefPtr<DrawingColorFilter> &colorFilter)
634 {
635     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, DrawingColorFilter, colorFilter, frameNode);
636     ACE_RESET_NODE_PAINT_PROPERTY(ImageRenderProperty, ColorFilter, frameNode);
637 }
638 
SetCopyOption(FrameNode * frameNode,CopyOptions copyOption)639 void ImageModelNG::SetCopyOption(FrameNode *frameNode, CopyOptions copyOption)
640 {
641     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>(frameNode);
642     CHECK_NULL_VOID(pattern);
643     pattern->SetCopyOption(copyOption);
644 }
645 
SetAutoResize(FrameNode * frameNode,bool autoResize)646 void ImageModelNG::SetAutoResize(FrameNode *frameNode, bool autoResize)
647 {
648     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, AutoResize, autoResize, frameNode);
649 }
650 
ResetAutoResize(FrameNode * frameNode)651 void ImageModelNG::ResetAutoResize(FrameNode *frameNode)
652 {
653     CHECK_NULL_VOID(frameNode);
654     auto imagePattern = frameNode->GetPattern<ImagePattern>();
655     CHECK_NULL_VOID(imagePattern);
656     auto defaultAutoResize = imagePattern->GetDefaultAutoResize();
657     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, AutoResize, defaultAutoResize, frameNode);
658 }
659 
SetResizableSlice(const ImageResizableSlice & slice)660 void ImageModelNG::SetResizableSlice(const ImageResizableSlice& slice)
661 {
662     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ImageResizableSlice, slice);
663 }
664 
SetResizableSlice(FrameNode * frameNode,const ImageResizableSlice & slice)665 void ImageModelNG::SetResizableSlice(FrameNode *frameNode, const ImageResizableSlice& slice)
666 {
667     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageResizableSlice, slice, frameNode);
668 }
669 
SetResizableLattice(const RefPtr<DrawingLattice> & lattice)670 void ImageModelNG::SetResizableLattice(const RefPtr<DrawingLattice>& lattice)
671 {
672     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ImageResizableLattice, lattice);
673 }
674 
SetResizableLattice(FrameNode * frameNode,const RefPtr<DrawingLattice> & lattice)675 void ImageModelNG::SetResizableLattice(FrameNode* frameNode, const RefPtr<DrawingLattice>& lattice)
676 {
677     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageResizableLattice, lattice, frameNode);
678 }
679 
ResetResizableLattice()680 void ImageModelNG::ResetResizableLattice()
681 {
682     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ImageResizableLattice, nullptr);
683 }
684 
ResetResizableLattice(FrameNode * frameNode)685 void ImageModelNG::ResetResizableLattice(FrameNode *frameNode)
686 {
687     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageResizableLattice, nullptr, frameNode);
688 }
689 
SetImageRepeat(FrameNode * frameNode,ImageRepeat imageRepeat)690 void ImageModelNG::SetImageRepeat(FrameNode *frameNode, ImageRepeat imageRepeat)
691 {
692     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageRepeat, imageRepeat, frameNode);
693 }
694 
SetImageRenderMode(FrameNode * frameNode,ImageRenderMode imageRenderMode)695 void ImageModelNG::SetImageRenderMode(FrameNode *frameNode, ImageRenderMode imageRenderMode)
696 {
697     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageRenderMode, imageRenderMode, frameNode);
698 }
699 
SetImageFit(FrameNode * frameNode,ImageFit value)700 void ImageModelNG::SetImageFit(FrameNode *frameNode, ImageFit value)
701 {
702     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageFit, value, frameNode);
703     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageFit, value, frameNode);
704 }
705 
SetFitOriginSize(FrameNode * frameNode,bool value)706 void ImageModelNG::SetFitOriginSize(FrameNode *frameNode, bool value)
707 {
708     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, FitOriginalSize, value, frameNode);
709 }
710 
SetSyncMode(FrameNode * frameNode,bool syncMode)711 void ImageModelNG::SetSyncMode(FrameNode *frameNode, bool syncMode)
712 {
713     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>(frameNode);
714     CHECK_NULL_VOID(pattern);
715     pattern->SetSyncLoad(syncMode);
716 }
717 
SetImageSourceSize(FrameNode * frameNode,const std::pair<Dimension,Dimension> & size)718 void ImageModelNG::SetImageSourceSize(FrameNode *frameNode, const std::pair<Dimension, Dimension> &size)
719 {
720     SizeF sourceSize =
721         SizeF(static_cast<float>(size.first.ConvertToPx()), static_cast<float>(size.second.ConvertToPx()));
722     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, SourceSize, sourceSize, frameNode);
723 }
724 
SetMatchTextDirection(FrameNode * frameNode,bool value)725 void ImageModelNG::SetMatchTextDirection(FrameNode *frameNode, bool value)
726 {
727     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, MatchTextDirection, value, frameNode);
728 }
729 
SetImageFill(FrameNode * frameNode,const Color & color)730 void ImageModelNG::SetImageFill(FrameNode *frameNode, const Color &color)
731 {
732     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, SvgFillColor, color, frameNode);
733     ACE_UPDATE_NODE_RENDER_CONTEXT(ForegroundColor, color, frameNode);
734 }
735 
SetAlt(FrameNode * frameNode,const ImageSourceInfo & src)736 void ImageModelNG::SetAlt(FrameNode *frameNode, const ImageSourceInfo &src)
737 {
738     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, Alt, src, frameNode);
739 }
740 
SetAltResource(FrameNode * frameNode,void * resource)741 void ImageModelNG::SetAltResource(FrameNode* frameNode, void* resource)
742 {
743     CHECK_NULL_VOID(frameNode);
744     auto res = reinterpret_cast<ArkUI_Resource*>(resource);
745     CHECK_NULL_VOID(res);
746     RefPtr<PixelMap> pixMapPtr = nullptr;
747     auto srcInfo = CreateSourceInfo(res->src, pixMapPtr, res->bundleName, res->moduleName);
748     srcInfo.SetIsUriPureNumber(res->resId == -1);
749     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, Alt, srcInfo, frameNode);
750 }
751 
SetAltPixelMap(FrameNode * frameNode,void * pixelMap)752 void ImageModelNG::SetAltPixelMap(FrameNode* frameNode, void* pixelMap)
753 {
754     CHECK_NULL_VOID(frameNode);
755     CHECK_NULL_VOID(pixelMap);
756     #ifndef ACE_UNITTEST
757     RefPtr<PixelMap> pixelMapPtr = PixelMap::GetFromDrawable(pixelMap);
758     auto srcInfo = CreateSourceInfo("", pixelMapPtr, "", "");
759     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, Alt, srcInfo, frameNode);
760     #endif
761 }
762 
SetImageInterpolation(FrameNode * frameNode,ImageInterpolation interpolation)763 void ImageModelNG::SetImageInterpolation(FrameNode *frameNode, ImageInterpolation interpolation)
764 {
765     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageInterpolation, interpolation, frameNode);
766     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
767     CHECK_NULL_VOID(pattern);
768     pattern->SetImageInterpolation(interpolation);
769 }
770 
ResetImageInterpolation(FrameNode * frameNode)771 void ImageModelNG::ResetImageInterpolation(FrameNode *frameNode)
772 {
773     CHECK_NULL_VOID(frameNode);
774     auto imagePattern = frameNode->GetPattern<ImagePattern>();
775     CHECK_NULL_VOID(imagePattern);
776     auto defaultInterpolation = imagePattern->GetDefaultInterpolation();
777     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageInterpolation, defaultInterpolation, frameNode);
778 }
779 
SetColorFilterMatrix(FrameNode * frameNode,const std::vector<float> & matrix)780 void ImageModelNG::SetColorFilterMatrix(FrameNode *frameNode, const std::vector<float> &matrix)
781 {
782     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ColorFilter, matrix, frameNode);
783     ACE_RESET_NODE_PAINT_PROPERTY(ImageRenderProperty, DrawingColorFilter, frameNode);
784 }
785 
SetDraggable(FrameNode * frameNode,bool draggable)786 void ImageModelNG::SetDraggable(FrameNode *frameNode, bool draggable)
787 {
788     auto gestureHub = frameNode->GetOrCreateGestureEventHub();
789     CHECK_NULL_VOID(gestureHub);
790     if (draggable) {
791         if (!frameNode->IsDraggable()) {
792             gestureHub->InitDragDropEvent();
793         }
794     } else {
795         gestureHub->RemoveDragEvent();
796     }
797     frameNode->SetCustomerDraggable(draggable);
798 }
799 
EnableAnalyzer(bool isEnableAnalyzer)800 void ImageModelNG::EnableAnalyzer(bool isEnableAnalyzer)
801 {
802     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
803     CHECK_NULL_VOID(pattern);
804     pattern->EnableAnalyzer(isEnableAnalyzer);
805 }
806 
SetImageAnalyzerConfig(const ImageAnalyzerConfig & config)807 void ImageModelNG::SetImageAnalyzerConfig(const ImageAnalyzerConfig& config)
808 {
809     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
810     CHECK_NULL_VOID(pattern);
811     pattern->SetImageAnalyzerConfig(config);
812 }
813 
SetImageAnalyzerConfig(void * config)814 void ImageModelNG::SetImageAnalyzerConfig(void* config)
815 {
816     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
817     CHECK_NULL_VOID(pattern);
818     pattern->SetImageAnalyzerConfig(config);
819 }
820 
SetImageAIOptions(void * options)821 void ImageModelNG::SetImageAIOptions(void* options)
822 {
823     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
824     CHECK_NULL_VOID(pattern);
825     pattern->SetImageAIOptions(options);
826 }
827 
SetOnComplete(FrameNode * frameNode,std::function<void (const LoadImageSuccessEvent & info)> && callback)828 void ImageModelNG::SetOnComplete(
829     FrameNode* frameNode, std::function<void(const LoadImageSuccessEvent& info)>&& callback)
830 {
831     CHECK_NULL_VOID(frameNode);
832     auto eventHub = frameNode->GetEventHub<ImageEventHub>();
833     CHECK_NULL_VOID(eventHub);
834     eventHub->SetOnComplete(std::move(callback));
835 }
836 
SetOnError(FrameNode * frameNode,std::function<void (const LoadImageFailEvent & info)> && callback)837 void ImageModelNG::SetOnError(FrameNode* frameNode, std::function<void(const LoadImageFailEvent& info)>&& callback)
838 {
839     CHECK_NULL_VOID(frameNode);
840     auto eventHub = frameNode->GetEventHub<ImageEventHub>();
841     CHECK_NULL_VOID(eventHub);
842     eventHub->SetOnError(std::move(callback));
843 }
844 
SetOnSvgPlayFinish(FrameNode * frameNode,std::function<void ()> && callback)845 void ImageModelNG::SetOnSvgPlayFinish(FrameNode* frameNode, std::function<void()>&& callback)
846 {
847     CHECK_NULL_VOID(frameNode);
848     auto eventHub = frameNode->GetEventHub<ImageEventHub>();
849     CHECK_NULL_VOID(eventHub);
850     eventHub->SetOnFinish(std::move(callback));
851 }
852 
SetOnDownloadProgress(FrameNode * frameNode,std::function<void (const uint32_t & dlNow,const uint32_t & dlTotal)> && callback)853 void ImageModelNG::SetOnDownloadProgress(FrameNode* frameNode,
854     std::function<void(const uint32_t& dlNow, const uint32_t& dlTotal)>&& callback)
855 {
856     CHECK_NULL_VOID(frameNode);
857     auto imagePattern = frameNode->GetPattern<ImagePattern>();
858     CHECK_NULL_VOID(imagePattern);
859     imagePattern->SetOnProgressCallback(std::move(callback));
860 }
861 
GetSrc(FrameNode * frameNode)862 ImageSourceInfo ImageModelNG::GetSrc(FrameNode* frameNode)
863 {
864     ImageSourceInfo defaultImageSourceInfo;
865     CHECK_NULL_RETURN(frameNode, defaultImageSourceInfo);
866     auto layoutProperty = frameNode->GetLayoutProperty<ImageLayoutProperty>();
867     CHECK_NULL_RETURN(layoutProperty, defaultImageSourceInfo);
868     return layoutProperty->GetImageSourceInfo().value_or(defaultImageSourceInfo);
869 }
870 
GetObjectFit(FrameNode * frameNode)871 ImageFit ImageModelNG::GetObjectFit(FrameNode* frameNode)
872 {
873     CHECK_NULL_RETURN(frameNode, ImageFit::COVER);
874     auto layoutProperty = frameNode->GetLayoutProperty<ImageLayoutProperty>();
875     CHECK_NULL_RETURN(layoutProperty, ImageFit::COVER);
876     return layoutProperty->GetImageFit().value_or(ImageFit::COVER);
877 }
878 
GetInterpolation(FrameNode * frameNode)879 ImageInterpolation ImageModelNG::GetInterpolation(FrameNode* frameNode)
880 {
881     CHECK_NULL_RETURN(frameNode, ImageInterpolation::NONE);
882     auto imagePattern = frameNode->GetPattern<ImagePattern>();
883     CHECK_NULL_RETURN(imagePattern, ImageInterpolation::NONE);
884     auto defaultInterpolation = imagePattern->GetDefaultInterpolation();
885     auto paintProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
886     CHECK_NULL_RETURN(paintProperty, defaultInterpolation);
887     CHECK_NULL_RETURN(paintProperty->GetImagePaintStyle(), defaultInterpolation);
888     return paintProperty->GetImagePaintStyle()->GetImageInterpolation().value_or(defaultInterpolation);
889 }
890 
GetObjectRepeat(FrameNode * frameNode)891 ImageRepeat ImageModelNG::GetObjectRepeat(FrameNode* frameNode)
892 {
893     CHECK_NULL_RETURN(frameNode, ImageRepeat::NO_REPEAT);
894     auto paintProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
895     CHECK_NULL_RETURN(paintProperty, ImageRepeat::NO_REPEAT);
896     CHECK_NULL_RETURN(paintProperty->GetImagePaintStyle(), ImageRepeat::NO_REPEAT);
897     return paintProperty->GetImagePaintStyle()->GetImageRepeat().value_or(ImageRepeat::NO_REPEAT);
898 }
899 
GetColorFilter(FrameNode * frameNode)900 std::vector<float> ImageModelNG::GetColorFilter(FrameNode* frameNode)
901 {
902     CHECK_NULL_RETURN(frameNode, DEFAULT_COLOR_FILTER);
903     auto paintProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
904     CHECK_NULL_RETURN(paintProperty, DEFAULT_COLOR_FILTER);
905     CHECK_NULL_RETURN(paintProperty->GetImagePaintStyle(), DEFAULT_COLOR_FILTER);
906     return paintProperty->GetImagePaintStyle()->GetColorFilter().value_or(DEFAULT_COLOR_FILTER);
907 }
908 
GetDrawingColorFilter(FrameNode * frameNode)909 RefPtr<DrawingColorFilter> ImageModelNG::GetDrawingColorFilter(FrameNode* frameNode)
910 {
911     CHECK_NULL_RETURN(frameNode, nullptr);
912     auto paintProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
913     CHECK_NULL_RETURN(paintProperty, nullptr);
914     CHECK_NULL_RETURN(paintProperty->GetImagePaintStyle(), nullptr);
915     return paintProperty->GetImagePaintStyle()->GetDrawingColorFilter().value_or(nullptr);
916 }
917 
GetAutoResize(FrameNode * frameNode)918 bool ImageModelNG::GetAutoResize(FrameNode* frameNode)
919 {
920     CHECK_NULL_RETURN(frameNode, true);
921     auto imagePattern = frameNode->GetPattern<ImagePattern>();
922     CHECK_NULL_RETURN(imagePattern, true);
923     auto defaultAutoResize = imagePattern->GetDefaultAutoResize();
924     auto layoutProperty = frameNode->GetLayoutProperty<ImageLayoutProperty>();
925     CHECK_NULL_RETURN(layoutProperty, defaultAutoResize);
926     CHECK_NULL_RETURN(layoutProperty->GetImageSizeStyle(), defaultAutoResize);
927     return layoutProperty->GetImageSizeStyle()->GetAutoResize().value_or(defaultAutoResize);
928 }
929 
GetAlt(FrameNode * frameNode)930 ImageSourceInfo ImageModelNG::GetAlt(FrameNode* frameNode)
931 {
932     ImageSourceInfo defaultImageSourceInfo;
933     CHECK_NULL_RETURN(frameNode, defaultImageSourceInfo);
934     auto layoutProperty = frameNode->GetLayoutProperty<ImageLayoutProperty>();
935     CHECK_NULL_RETURN(layoutProperty, defaultImageSourceInfo);
936     return layoutProperty->GetAlt().value_or(defaultImageSourceInfo);
937 }
938 
IsSrcSvgImage(FrameNode * frameNode)939 bool ImageModelNG::IsSrcSvgImage(FrameNode* frameNode)
940 {
941     return false;
942 }
943 
GetFitOriginalSize(FrameNode * frameNode)944 bool ImageModelNG::GetFitOriginalSize(FrameNode* frameNode)
945 {
946     CHECK_NULL_RETURN(frameNode, false);
947     auto layoutProperty = frameNode->GetLayoutProperty<ImageLayoutProperty>();
948     CHECK_NULL_RETURN(layoutProperty, false);
949     return layoutProperty->GetImageSizeStyle()->GetFitOriginalSize().value_or(false);
950 }
951 
GetFillColor(FrameNode * frameNode)952 uint32_t ImageModelNG::GetFillColor(FrameNode *frameNode)
953 {
954     uint32_t errorCode = -1;
955     CHECK_NULL_RETURN(frameNode, errorCode);
956     auto paintProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
957     CHECK_NULL_RETURN(paintProperty, errorCode);
958     CHECK_NULL_RETURN(paintProperty->GetImagePaintStyle(), errorCode);
959     Color color = paintProperty->GetImagePaintStyle()->GetSvgFillColor().value_or(Color());
960     return color.GetValue();
961 }
962 
GetDraggable(FrameNode * frameNode)963 bool ImageModelNG::GetDraggable(FrameNode* frameNode)
964 {
965     CHECK_NULL_RETURN(frameNode, false);
966     return frameNode->IsDraggable();
967 }
968 
GetImageRenderMode(FrameNode * frameNode)969 ImageRenderMode ImageModelNG::GetImageRenderMode(FrameNode* frameNode)
970 {
971     CHECK_NULL_RETURN(frameNode, ImageRenderMode::ORIGINAL);
972     auto paintProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
973     CHECK_NULL_RETURN(paintProperty, ImageRenderMode::ORIGINAL);
974     CHECK_NULL_RETURN(paintProperty->GetImagePaintStyle(), ImageRenderMode::ORIGINAL);
975     return paintProperty->GetImagePaintStyle()->GetImageRenderMode().value_or(ImageRenderMode::ORIGINAL);
976 }
977 
GetIsAnimation()978 bool ImageModelNG::GetIsAnimation()
979 {
980     auto pattern = GetImagePattern();
981     CHECK_NULL_RETURN(pattern, false);
982     return pattern->GetIsAnimation();
983 }
984 
GetImagePattern()985 ImagePattern* ImageModelNG::GetImagePattern()
986 {
987     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
988     CHECK_NULL_RETURN(frameNode, nullptr);
989     return frameNode->GetPatternPtr<ImagePattern>();
990 }
991 
GetResizableSlice(FrameNode * frameNode)992 ImageResizableSlice ImageModelNG::GetResizableSlice(FrameNode *frameNode)
993 {
994     ImageResizableSlice resizable;
995     CHECK_NULL_RETURN(frameNode, resizable);
996     auto renderProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
997     CHECK_NULL_RETURN(renderProperty, resizable);
998     return renderProperty->GetImageResizableSlice().value_or(resizable);
999 }
1000 
EnableAnalyzer(FrameNode * frameNode,bool isEnableAnalyzer)1001 void ImageModelNG::EnableAnalyzer(FrameNode* frameNode, bool isEnableAnalyzer)
1002 {
1003     CHECK_NULL_VOID(frameNode);
1004     auto imagePattern = frameNode->GetPattern<ImagePattern>();
1005     CHECK_NULL_VOID(imagePattern);
1006     imagePattern->EnableAnalyzer(isEnableAnalyzer);
1007 }
1008 
SetImageAnalyzerConfig(FrameNode * frameNode,void * config)1009 void ImageModelNG::SetImageAnalyzerConfig(FrameNode* frameNode, void* config)
1010 {
1011     CHECK_NULL_VOID(frameNode);
1012     auto imagePattern = frameNode->GetPattern<ImagePattern>();
1013     CHECK_NULL_VOID(imagePattern);
1014     imagePattern->SetImageAnalyzerConfig(config);
1015 }
1016 
ResetImageSrc(FrameNode * frameNode)1017 void ImageModelNG::ResetImageSrc(FrameNode* frameNode)
1018 {
1019     CHECK_NULL_VOID(frameNode);
1020     ImageSourceInfo sourceInfo("");
1021     sourceInfo.SetIsFromReset(true);
1022     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, sourceInfo, frameNode);
1023     frameNode->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
1024     auto pattern = frameNode->GetPattern<ImagePattern>();
1025     CHECK_NULL_VOID(pattern);
1026     pattern->ResetImage();
1027     if (pattern->GetImageType() == ImagePattern::ImageType::ANIMATION) {
1028         if (pattern->GetHasSizeChanged()) {
1029             pattern->ResetPictureSize();
1030         }
1031         pattern->StopAnimation();
1032         pattern->ResetImages();
1033         if (!frameNode->GetChildren().empty()) {
1034             auto imageFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1035             ACE_RESET_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, imageFrameNode);
1036             frameNode->RemoveChild(imageFrameNode);
1037         }
1038         pattern->SetImageType(ImagePattern::ImageType::BASE);
1039     }
1040 }
1041 
ResetImageAlt(FrameNode * frameNode)1042 void ImageModelNG::ResetImageAlt(FrameNode* frameNode)
1043 {
1044     CHECK_NULL_VOID(frameNode);
1045     ImageSourceInfo sourceInfo("");
1046     sourceInfo.SetIsFromReset(true);
1047     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, Alt, sourceInfo, frameNode);
1048     frameNode->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
1049     auto pattern = frameNode->GetPattern<ImagePattern>();
1050     CHECK_NULL_VOID(pattern);
1051     pattern->ResetAltImage();
1052 }
1053 } // namespace OHOS::Ace::NG
1054 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_IMAGE_IMAGE_MODEL_NG_CPP
1055