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