• 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/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 
SetImageMatrix(const Matrix4 & value)418 void ImageModelNG::SetImageMatrix(const Matrix4 &value)
419 {
420     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ImageMatrix, value);
421 }
422 
SetMatchTextDirection(bool value)423 void ImageModelNG::SetMatchTextDirection(bool value)
424 {
425     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, MatchTextDirection, value);
426 }
427 
SetFitOriginSize(bool value)428 void ImageModelNG::SetFitOriginSize(bool value)
429 {
430     ACE_UPDATE_LAYOUT_PROPERTY(ImageLayoutProperty, FitOriginalSize, value);
431 }
432 
SetOnComplete(std::function<void (const LoadImageSuccessEvent & info)> && callback)433 void ImageModelNG::SetOnComplete(std::function<void(const LoadImageSuccessEvent& info)>&& callback)
434 {
435     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
436     CHECK_NULL_VOID(frameNode);
437     auto eventHub = frameNode->GetEventHub<ImageEventHub>();
438     CHECK_NULL_VOID(eventHub);
439     eventHub->SetOnComplete(std::move(callback));
440 }
441 
SetOnError(std::function<void (const LoadImageFailEvent & info)> && callback)442 void ImageModelNG::SetOnError(std::function<void(const LoadImageFailEvent& info)>&& callback)
443 {
444     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
445     CHECK_NULL_VOID(frameNode);
446     auto eventHub = frameNode->GetEventHub<ImageEventHub>();
447     CHECK_NULL_VOID(eventHub);
448     eventHub->SetOnError(std::move(callback));
449 }
450 
SetSvgAnimatorFinishEvent(std::function<void ()> && callback)451 void ImageModelNG::SetSvgAnimatorFinishEvent(std::function<void()>&& callback)
452 {
453     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
454     CHECK_NULL_VOID(frameNode);
455     auto eventHub = frameNode->GetEventHub<ImageEventHub>();
456     CHECK_NULL_VOID(eventHub);
457     eventHub->SetOnFinish(std::move(callback));
458 }
459 
SetImageSourceSize(const std::pair<Dimension,Dimension> & size)460 void ImageModelNG::SetImageSourceSize(const std::pair<Dimension, Dimension>& size)
461 {
462     SizeF sourceSize =
463         SizeF(static_cast<float>(size.first.ConvertToPx()), static_cast<float>(size.second.ConvertToPx()));
464     ACE_UPDATE_LAYOUT_PROPERTY(ImageLayoutProperty, SourceSize, sourceSize);
465 }
466 
SetImageFill(const Color & color)467 void ImageModelNG::SetImageFill(const Color& color)
468 {
469     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, SvgFillColor, color);
470     ACE_UPDATE_RENDER_CONTEXT(ForegroundColor, color);
471 }
472 
ResetImageFill()473 void ImageModelNG::ResetImageFill()
474 {
475     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(ImageRenderProperty, SvgFillColor, PROPERTY_UPDATE_RENDER);
476     ACE_RESET_RENDER_CONTEXT(RenderContext, ForegroundColor);
477 }
478 
ResetImageFill(FrameNode * frameNode)479 void ImageModelNG::ResetImageFill(FrameNode *frameNode)
480 {
481     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(ImageRenderProperty, SvgFillColor, PROPERTY_UPDATE_RENDER, frameNode);
482     ACE_RESET_NODE_RENDER_CONTEXT(RenderContext, ForegroundColor, frameNode);
483 }
484 
SetImageInterpolation(ImageInterpolation interpolation)485 void ImageModelNG::SetImageInterpolation(ImageInterpolation interpolation)
486 {
487     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ImageInterpolation, interpolation);
488 }
489 
SetImageRepeat(ImageRepeat imageRepeat)490 void ImageModelNG::SetImageRepeat(ImageRepeat imageRepeat)
491 {
492     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ImageRepeat, imageRepeat);
493 }
494 
SetImageRenderMode(ImageRenderMode imageRenderMode)495 void ImageModelNG::SetImageRenderMode(ImageRenderMode imageRenderMode)
496 {
497     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ImageRenderMode, imageRenderMode);
498 }
499 
IsSrcSvgImage()500 bool ImageModelNG::IsSrcSvgImage()
501 {
502     return false;
503 }
504 
SetAutoResize(bool autoResize)505 void ImageModelNG::SetAutoResize(bool autoResize)
506 {
507     ACE_UPDATE_LAYOUT_PROPERTY(ImageLayoutProperty, AutoResize, autoResize);
508 }
509 
SetSyncMode(bool syncMode)510 void ImageModelNG::SetSyncMode(bool syncMode)
511 {
512     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
513     CHECK_NULL_VOID(pattern);
514     pattern->SetSyncLoad(syncMode);
515 }
516 
SetColorFilterMatrix(const std::vector<float> & matrix)517 void ImageModelNG::SetColorFilterMatrix(const std::vector<float>& matrix)
518 {
519     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ColorFilter, matrix);
520     ACE_RESET_PAINT_PROPERTY(ImageRenderProperty, DrawingColorFilter);
521 }
522 
SetDrawingColorFilter(RefPtr<DrawingColorFilter> & colorFilter)523 void ImageModelNG::SetDrawingColorFilter(RefPtr<DrawingColorFilter> &colorFilter)
524 {
525     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, DrawingColorFilter, colorFilter);
526     ACE_RESET_PAINT_PROPERTY(ImageRenderProperty, ColorFilter);
527 }
528 
SetDraggable(bool draggable)529 void ImageModelNG::SetDraggable(bool draggable)
530 {
531     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
532     CHECK_NULL_VOID(frameNode);
533     auto gestureHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeGestureEventHub();
534     CHECK_NULL_VOID(gestureHub);
535     if (draggable) {
536         if (!frameNode->IsDraggable()) {
537             gestureHub->InitDragDropEvent();
538         }
539     } else {
540         gestureHub->RemoveDragEvent();
541     }
542     CHECK_NULL_VOID(frameNode);
543     frameNode->SetCustomerDraggable(draggable);
544 }
545 
SetOnDragStart(OnDragStartFunc && onDragStart)546 void ImageModelNG::SetOnDragStart(OnDragStartFunc&& onDragStart)
547 {
548 #ifndef ACE_UNITTEST
549     auto dragStart = [dragStartFunc = std::move(onDragStart)](
550                          const RefPtr<OHOS::Ace::DragEvent>& event, const std::string& extraParams) -> DragDropInfo {
551         auto dragInfo = dragStartFunc(event, extraParams);
552         DragDropInfo info;
553         info.extraInfo = dragInfo.extraInfo;
554         info.pixelMap = dragInfo.pixelMap;
555         info.customNode = AceType::DynamicCast<UINode>(dragInfo.node);
556         return info;
557     };
558     ViewAbstract::SetOnDragStart(std::move(dragStart));
559 #endif
560 }
561 
SetOnDragEnter(OnDragDropFunc && onDragEnter)562 void ImageModelNG::SetOnDragEnter(OnDragDropFunc&& onDragEnter) {}
563 
SetOnDragLeave(OnDragDropFunc && onDragLeave)564 void ImageModelNG::SetOnDragLeave(OnDragDropFunc&& onDragLeave) {}
565 
SetOnDragMove(OnDragDropFunc && onDragMove)566 void ImageModelNG::SetOnDragMove(OnDragDropFunc&& onDragMove) {}
567 
SetOnDrop(OnDragDropFunc && onDrop)568 void ImageModelNG::SetOnDrop(OnDragDropFunc&& onDrop) {}
569 
SetCopyOption(const CopyOptions & copyOption)570 void ImageModelNG::SetCopyOption(const CopyOptions& copyOption)
571 {
572     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
573     CHECK_NULL_VOID(pattern);
574     pattern->SetCopyOption(copyOption);
575 }
576 
UpdateDragItemInfo(DragItemInfo & itemInfo)577 bool ImageModelNG::UpdateDragItemInfo(DragItemInfo& itemInfo)
578 {
579     return false;
580 }
581 
InitImage(FrameNode * frameNode,std::string & src)582 void ImageModelNG::InitImage(FrameNode *frameNode, std::string& src)
583 {
584     std::string bundleName;
585     std::string moduleName;
586     RefPtr<OHOS::Ace::PixelMap> pixMapPtr;
587     auto srcInfo = CreateSourceInfo(src, pixMapPtr, bundleName, moduleName);
588     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, srcInfo, frameNode);
589 }
590 
591 
SetPixelMap(FrameNode * frameNode,void * drawableDescriptor)592 void ImageModelNG::SetPixelMap(FrameNode* frameNode, void* drawableDescriptor)
593 {
594 #ifndef ACE_UNITTEST
595     CHECK_NULL_VOID(drawableDescriptor);
596     RefPtr<PixelMap> pixelMapPtr = PixelMap::GetFromDrawable(drawableDescriptor);
597     auto srcInfo = CreateSourceInfo("", pixelMapPtr, "", "");
598     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, srcInfo, frameNode);
599 #endif
600 }
601 
SetPixelMapArray(FrameNode * frameNode,void * animatedDrawableDescriptor)602 void ImageModelNG::SetPixelMapArray(FrameNode* frameNode, void* animatedDrawableDescriptor)
603 {
604 #ifndef ACE_UNITTEST
605     CHECK_NULL_VOID(animatedDrawableDescriptor);
606     std::vector<RefPtr<PixelMap>> pixelMaps;
607     int32_t duration = -1;
608     int32_t iterations = 1;
609     if (!PixelMap::GetPxielMapListFromAnimatedDrawable(animatedDrawableDescriptor, pixelMaps, duration, iterations)) {
610         return;
611     }
612     std::vector<ImageProperties> images;
613     for (int32_t i = 0; i < static_cast<int32_t>(pixelMaps.size()); i++) {
614         ImageProperties image;
615         image.pixelMap = pixelMaps[i];
616         images.push_back(image);
617     }
618 
619     if (frameNode->GetChildren().empty()) {
620         auto imageNode = FrameNode::CreateFrameNode(V2::IMAGE_ETS_TAG, -1, AceType::MakeRefPtr<ImagePattern>());
621         CHECK_NULL_VOID(imageNode);
622         auto imageLayoutProperty = AceType::DynamicCast<ImageLayoutProperty>(imageNode->GetLayoutProperty());
623         CHECK_NULL_VOID(imageLayoutProperty);
624         imageLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT);
625         frameNode->GetLayoutProperty()->UpdateAlignment(Alignment::TOP_LEFT);
626         frameNode->AddChild(imageNode);
627     }
628 
629     auto pattern = AceType::DynamicCast<ImagePattern>(frameNode->GetPattern());
630     CHECK_NULL_VOID(pattern);
631 
632     pattern->StopAnimation();
633     pattern->SetImageType(ImagePattern::ImageType::ANIMATION);
634     pattern->SetImages(std::move(images));
635     pattern->SetDuration(duration);
636     pattern->SetIteration(iterations);
637     pattern->StartAnimation();
638 #endif
639 }
640 
SetResource(FrameNode * frameNode,void * resource)641 void ImageModelNG::SetResource(FrameNode* frameNode, void* resource)
642 {
643     auto res = reinterpret_cast<ArkUI_Resource*>(resource);
644     CHECK_NULL_VOID(res);
645     RefPtr<PixelMap> pixMapPtr;
646     auto srcInfo = CreateSourceInfo(res->src, pixMapPtr, res->bundleName, res->moduleName);
647     srcInfo.SetIsUriPureNumber(res->resId == -1);
648     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, srcInfo, frameNode);
649 }
650 
SetDrawingColorFilter(FrameNode * frameNode,RefPtr<DrawingColorFilter> & colorFilter)651 void ImageModelNG::SetDrawingColorFilter(FrameNode *frameNode, RefPtr<DrawingColorFilter> &colorFilter)
652 {
653     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, DrawingColorFilter, colorFilter, frameNode);
654     ACE_RESET_NODE_PAINT_PROPERTY(ImageRenderProperty, ColorFilter, frameNode);
655 }
656 
SetCopyOption(FrameNode * frameNode,CopyOptions copyOption)657 void ImageModelNG::SetCopyOption(FrameNode *frameNode, CopyOptions copyOption)
658 {
659     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>(frameNode);
660     CHECK_NULL_VOID(pattern);
661     pattern->SetCopyOption(copyOption);
662 }
663 
SetAutoResize(FrameNode * frameNode,bool autoResize)664 void ImageModelNG::SetAutoResize(FrameNode *frameNode, bool autoResize)
665 {
666     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, AutoResize, autoResize, frameNode);
667 }
668 
ResetAutoResize(FrameNode * frameNode)669 void ImageModelNG::ResetAutoResize(FrameNode *frameNode)
670 {
671     CHECK_NULL_VOID(frameNode);
672     auto imagePattern = frameNode->GetPattern<ImagePattern>();
673     CHECK_NULL_VOID(imagePattern);
674     auto defaultAutoResize = imagePattern->GetDefaultAutoResize();
675     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, AutoResize, defaultAutoResize, frameNode);
676 }
677 
SetResizableSlice(const ImageResizableSlice & slice)678 void ImageModelNG::SetResizableSlice(const ImageResizableSlice& slice)
679 {
680     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ImageResizableSlice, slice);
681 }
682 
SetResizableSlice(FrameNode * frameNode,const ImageResizableSlice & slice)683 void ImageModelNG::SetResizableSlice(FrameNode *frameNode, const ImageResizableSlice& slice)
684 {
685     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageResizableSlice, slice, frameNode);
686 }
687 
SetResizableLattice(const RefPtr<DrawingLattice> & lattice)688 void ImageModelNG::SetResizableLattice(const RefPtr<DrawingLattice>& lattice)
689 {
690     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ImageResizableLattice, lattice);
691 }
692 
SetResizableLattice(FrameNode * frameNode,const RefPtr<DrawingLattice> & lattice)693 void ImageModelNG::SetResizableLattice(FrameNode* frameNode, const RefPtr<DrawingLattice>& lattice)
694 {
695     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageResizableLattice, lattice, frameNode);
696 }
697 
ResetResizableLattice()698 void ImageModelNG::ResetResizableLattice()
699 {
700     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ImageResizableLattice, nullptr);
701 }
702 
ResetResizableLattice(FrameNode * frameNode)703 void ImageModelNG::ResetResizableLattice(FrameNode *frameNode)
704 {
705     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageResizableLattice, nullptr, frameNode);
706 }
707 
SetImageRepeat(FrameNode * frameNode,ImageRepeat imageRepeat)708 void ImageModelNG::SetImageRepeat(FrameNode *frameNode, ImageRepeat imageRepeat)
709 {
710     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageRepeat, imageRepeat, frameNode);
711 }
712 
SetImageRenderMode(FrameNode * frameNode,ImageRenderMode imageRenderMode)713 void ImageModelNG::SetImageRenderMode(FrameNode *frameNode, ImageRenderMode imageRenderMode)
714 {
715     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageRenderMode, imageRenderMode, frameNode);
716 }
717 
SetImageMatrix(FrameNode * frameNode,const Matrix4 & value)718 void ImageModelNG::SetImageMatrix(FrameNode *frameNode, const Matrix4 &value)
719 {
720     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageMatrix, value, frameNode);
721 }
722 
SetImageFit(FrameNode * frameNode,ImageFit value)723 void ImageModelNG::SetImageFit(FrameNode *frameNode, ImageFit value)
724 {
725     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageFit, value, frameNode);
726     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageFit, value, frameNode);
727 }
728 
SetFitOriginSize(FrameNode * frameNode,bool value)729 void ImageModelNG::SetFitOriginSize(FrameNode *frameNode, bool value)
730 {
731     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, FitOriginalSize, value, frameNode);
732 }
733 
SetSyncMode(FrameNode * frameNode,bool syncMode)734 void ImageModelNG::SetSyncMode(FrameNode *frameNode, bool syncMode)
735 {
736     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>(frameNode);
737     CHECK_NULL_VOID(pattern);
738     pattern->SetSyncLoad(syncMode);
739 }
740 
SetImageSourceSize(FrameNode * frameNode,const std::pair<Dimension,Dimension> & size)741 void ImageModelNG::SetImageSourceSize(FrameNode *frameNode, const std::pair<Dimension, Dimension> &size)
742 {
743     SizeF sourceSize =
744         SizeF(static_cast<float>(size.first.ConvertToPx()), static_cast<float>(size.second.ConvertToPx()));
745     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, SourceSize, sourceSize, frameNode);
746 }
747 
SetMatchTextDirection(FrameNode * frameNode,bool value)748 void ImageModelNG::SetMatchTextDirection(FrameNode *frameNode, bool value)
749 {
750     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, MatchTextDirection, value, frameNode);
751 }
752 
SetImageFill(FrameNode * frameNode,const Color & color)753 void ImageModelNG::SetImageFill(FrameNode *frameNode, const Color &color)
754 {
755     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, SvgFillColor, color, frameNode);
756     ACE_UPDATE_NODE_RENDER_CONTEXT(ForegroundColor, color, frameNode);
757 }
758 
SetAlt(FrameNode * frameNode,const ImageSourceInfo & src)759 void ImageModelNG::SetAlt(FrameNode *frameNode, const ImageSourceInfo &src)
760 {
761     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, Alt, src, frameNode);
762 }
763 
SetAltResource(FrameNode * frameNode,void * resource)764 void ImageModelNG::SetAltResource(FrameNode* frameNode, void* resource)
765 {
766     CHECK_NULL_VOID(frameNode);
767     auto res = reinterpret_cast<ArkUI_Resource*>(resource);
768     CHECK_NULL_VOID(res);
769     RefPtr<PixelMap> pixMapPtr = nullptr;
770     auto srcInfo = CreateSourceInfo(res->src, pixMapPtr, res->bundleName, res->moduleName);
771     srcInfo.SetIsUriPureNumber(res->resId == -1);
772     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, Alt, srcInfo, frameNode);
773 }
774 
SetAltPixelMap(FrameNode * frameNode,void * pixelMap)775 void ImageModelNG::SetAltPixelMap(FrameNode* frameNode, void* pixelMap)
776 {
777     CHECK_NULL_VOID(frameNode);
778     CHECK_NULL_VOID(pixelMap);
779     #ifndef ACE_UNITTEST
780     RefPtr<PixelMap> pixelMapPtr = PixelMap::GetFromDrawable(pixelMap);
781     auto srcInfo = CreateSourceInfo("", pixelMapPtr, "", "");
782     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, Alt, srcInfo, frameNode);
783     #endif
784 }
785 
SetImageInterpolation(FrameNode * frameNode,ImageInterpolation interpolation)786 void ImageModelNG::SetImageInterpolation(FrameNode *frameNode, ImageInterpolation interpolation)
787 {
788     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageInterpolation, interpolation, frameNode);
789     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
790     CHECK_NULL_VOID(pattern);
791     pattern->SetImageInterpolation(interpolation);
792 }
793 
ResetImageInterpolation(FrameNode * frameNode)794 void ImageModelNG::ResetImageInterpolation(FrameNode *frameNode)
795 {
796     CHECK_NULL_VOID(frameNode);
797     auto imagePattern = frameNode->GetPattern<ImagePattern>();
798     CHECK_NULL_VOID(imagePattern);
799     auto defaultInterpolation = imagePattern->GetDefaultInterpolation();
800     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageInterpolation, defaultInterpolation, frameNode);
801 }
802 
SetColorFilterMatrix(FrameNode * frameNode,const std::vector<float> & matrix)803 void ImageModelNG::SetColorFilterMatrix(FrameNode *frameNode, const std::vector<float> &matrix)
804 {
805     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ColorFilter, matrix, frameNode);
806     ACE_RESET_NODE_PAINT_PROPERTY(ImageRenderProperty, DrawingColorFilter, frameNode);
807 }
808 
SetDraggable(FrameNode * frameNode,bool draggable)809 void ImageModelNG::SetDraggable(FrameNode *frameNode, bool draggable)
810 {
811     auto gestureHub = frameNode->GetOrCreateGestureEventHub();
812     CHECK_NULL_VOID(gestureHub);
813     if (draggable) {
814         if (!frameNode->IsDraggable()) {
815             gestureHub->InitDragDropEvent();
816         }
817     } else {
818         gestureHub->RemoveDragEvent();
819     }
820     frameNode->SetCustomerDraggable(draggable);
821 }
822 
EnableAnalyzer(bool isEnableAnalyzer)823 void ImageModelNG::EnableAnalyzer(bool isEnableAnalyzer)
824 {
825     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
826     CHECK_NULL_VOID(pattern);
827     pattern->EnableAnalyzer(isEnableAnalyzer);
828 }
829 
SetImageAnalyzerConfig(const ImageAnalyzerConfig & config)830 void ImageModelNG::SetImageAnalyzerConfig(const ImageAnalyzerConfig& config)
831 {
832     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
833     CHECK_NULL_VOID(pattern);
834     pattern->SetImageAnalyzerConfig(config);
835 }
836 
SetImageAnalyzerConfig(void * config)837 void ImageModelNG::SetImageAnalyzerConfig(void* config)
838 {
839     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
840     CHECK_NULL_VOID(pattern);
841     pattern->SetImageAnalyzerConfig(config);
842 }
843 
SetImageAIOptions(void * options)844 void ImageModelNG::SetImageAIOptions(void* options)
845 {
846     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
847     CHECK_NULL_VOID(pattern);
848     pattern->SetImageAIOptions(options);
849 }
850 
SetOnComplete(FrameNode * frameNode,std::function<void (const LoadImageSuccessEvent & info)> && callback)851 void ImageModelNG::SetOnComplete(
852     FrameNode* frameNode, std::function<void(const LoadImageSuccessEvent& info)>&& callback)
853 {
854     CHECK_NULL_VOID(frameNode);
855     auto eventHub = frameNode->GetEventHub<ImageEventHub>();
856     CHECK_NULL_VOID(eventHub);
857     eventHub->SetOnComplete(std::move(callback));
858 }
859 
SetOnError(FrameNode * frameNode,std::function<void (const LoadImageFailEvent & info)> && callback)860 void ImageModelNG::SetOnError(FrameNode* frameNode, std::function<void(const LoadImageFailEvent& info)>&& callback)
861 {
862     CHECK_NULL_VOID(frameNode);
863     auto eventHub = frameNode->GetEventHub<ImageEventHub>();
864     CHECK_NULL_VOID(eventHub);
865     eventHub->SetOnError(std::move(callback));
866 }
867 
SetOnSvgPlayFinish(FrameNode * frameNode,std::function<void ()> && callback)868 void ImageModelNG::SetOnSvgPlayFinish(FrameNode* frameNode, std::function<void()>&& callback)
869 {
870     CHECK_NULL_VOID(frameNode);
871     auto eventHub = frameNode->GetEventHub<ImageEventHub>();
872     CHECK_NULL_VOID(eventHub);
873     eventHub->SetOnFinish(std::move(callback));
874 }
875 
SetOnDownloadProgress(FrameNode * frameNode,std::function<void (const uint32_t & dlNow,const uint32_t & dlTotal)> && callback)876 void ImageModelNG::SetOnDownloadProgress(FrameNode* frameNode,
877     std::function<void(const uint32_t& dlNow, const uint32_t& dlTotal)>&& callback)
878 {
879     CHECK_NULL_VOID(frameNode);
880     auto imagePattern = frameNode->GetPattern<ImagePattern>();
881     CHECK_NULL_VOID(imagePattern);
882     imagePattern->SetOnProgressCallback(std::move(callback));
883 }
884 
GetSrc(FrameNode * frameNode)885 ImageSourceInfo ImageModelNG::GetSrc(FrameNode* frameNode)
886 {
887     ImageSourceInfo defaultImageSourceInfo;
888     CHECK_NULL_RETURN(frameNode, defaultImageSourceInfo);
889     auto layoutProperty = frameNode->GetLayoutProperty<ImageLayoutProperty>();
890     CHECK_NULL_RETURN(layoutProperty, defaultImageSourceInfo);
891     return layoutProperty->GetImageSourceInfo().value_or(defaultImageSourceInfo);
892 }
893 
GetObjectFit(FrameNode * frameNode)894 ImageFit ImageModelNG::GetObjectFit(FrameNode* frameNode)
895 {
896     CHECK_NULL_RETURN(frameNode, ImageFit::COVER);
897     auto layoutProperty = frameNode->GetLayoutProperty<ImageLayoutProperty>();
898     CHECK_NULL_RETURN(layoutProperty, ImageFit::COVER);
899     return layoutProperty->GetImageFit().value_or(ImageFit::COVER);
900 }
901 
GetInterpolation(FrameNode * frameNode)902 ImageInterpolation ImageModelNG::GetInterpolation(FrameNode* frameNode)
903 {
904     CHECK_NULL_RETURN(frameNode, ImageInterpolation::NONE);
905     auto imagePattern = frameNode->GetPattern<ImagePattern>();
906     CHECK_NULL_RETURN(imagePattern, ImageInterpolation::NONE);
907     auto defaultInterpolation = imagePattern->GetDefaultInterpolation();
908     auto paintProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
909     CHECK_NULL_RETURN(paintProperty, defaultInterpolation);
910     CHECK_NULL_RETURN(paintProperty->GetImagePaintStyle(), defaultInterpolation);
911     return paintProperty->GetImagePaintStyle()->GetImageInterpolation().value_or(defaultInterpolation);
912 }
913 
GetObjectRepeat(FrameNode * frameNode)914 ImageRepeat ImageModelNG::GetObjectRepeat(FrameNode* frameNode)
915 {
916     CHECK_NULL_RETURN(frameNode, ImageRepeat::NO_REPEAT);
917     auto paintProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
918     CHECK_NULL_RETURN(paintProperty, ImageRepeat::NO_REPEAT);
919     CHECK_NULL_RETURN(paintProperty->GetImagePaintStyle(), ImageRepeat::NO_REPEAT);
920     return paintProperty->GetImagePaintStyle()->GetImageRepeat().value_or(ImageRepeat::NO_REPEAT);
921 }
922 
GetColorFilter(FrameNode * frameNode)923 std::vector<float> ImageModelNG::GetColorFilter(FrameNode* frameNode)
924 {
925     CHECK_NULL_RETURN(frameNode, DEFAULT_COLOR_FILTER);
926     auto paintProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
927     CHECK_NULL_RETURN(paintProperty, DEFAULT_COLOR_FILTER);
928     CHECK_NULL_RETURN(paintProperty->GetImagePaintStyle(), DEFAULT_COLOR_FILTER);
929     return paintProperty->GetImagePaintStyle()->GetColorFilter().value_or(DEFAULT_COLOR_FILTER);
930 }
931 
GetDrawingColorFilter(FrameNode * frameNode)932 RefPtr<DrawingColorFilter> ImageModelNG::GetDrawingColorFilter(FrameNode* frameNode)
933 {
934     CHECK_NULL_RETURN(frameNode, nullptr);
935     auto paintProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
936     CHECK_NULL_RETURN(paintProperty, nullptr);
937     CHECK_NULL_RETURN(paintProperty->GetImagePaintStyle(), nullptr);
938     return paintProperty->GetImagePaintStyle()->GetDrawingColorFilter().value_or(nullptr);
939 }
940 
GetAutoResize(FrameNode * frameNode)941 bool ImageModelNG::GetAutoResize(FrameNode* frameNode)
942 {
943     CHECK_NULL_RETURN(frameNode, true);
944     auto imagePattern = frameNode->GetPattern<ImagePattern>();
945     CHECK_NULL_RETURN(imagePattern, true);
946     auto defaultAutoResize = imagePattern->GetDefaultAutoResize();
947     auto layoutProperty = frameNode->GetLayoutProperty<ImageLayoutProperty>();
948     CHECK_NULL_RETURN(layoutProperty, defaultAutoResize);
949     CHECK_NULL_RETURN(layoutProperty->GetImageSizeStyle(), defaultAutoResize);
950     return layoutProperty->GetImageSizeStyle()->GetAutoResize().value_or(defaultAutoResize);
951 }
952 
GetAlt(FrameNode * frameNode)953 ImageSourceInfo ImageModelNG::GetAlt(FrameNode* frameNode)
954 {
955     ImageSourceInfo defaultImageSourceInfo;
956     CHECK_NULL_RETURN(frameNode, defaultImageSourceInfo);
957     auto layoutProperty = frameNode->GetLayoutProperty<ImageLayoutProperty>();
958     CHECK_NULL_RETURN(layoutProperty, defaultImageSourceInfo);
959     return layoutProperty->GetAlt().value_or(defaultImageSourceInfo);
960 }
961 
IsSrcSvgImage(FrameNode * frameNode)962 bool ImageModelNG::IsSrcSvgImage(FrameNode* frameNode)
963 {
964     return false;
965 }
966 
GetFitOriginalSize(FrameNode * frameNode)967 bool ImageModelNG::GetFitOriginalSize(FrameNode* frameNode)
968 {
969     CHECK_NULL_RETURN(frameNode, false);
970     auto layoutProperty = frameNode->GetLayoutProperty<ImageLayoutProperty>();
971     CHECK_NULL_RETURN(layoutProperty, false);
972     return layoutProperty->GetImageSizeStyle()->GetFitOriginalSize().value_or(false);
973 }
974 
GetFillColor(FrameNode * frameNode)975 uint32_t ImageModelNG::GetFillColor(FrameNode *frameNode)
976 {
977     uint32_t errorCode = -1;
978     CHECK_NULL_RETURN(frameNode, errorCode);
979     auto paintProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
980     CHECK_NULL_RETURN(paintProperty, errorCode);
981     CHECK_NULL_RETURN(paintProperty->GetImagePaintStyle(), errorCode);
982     Color color = paintProperty->GetImagePaintStyle()->GetSvgFillColor().value_or(Color());
983     return color.GetValue();
984 }
985 
GetDraggable(FrameNode * frameNode)986 bool ImageModelNG::GetDraggable(FrameNode* frameNode)
987 {
988     CHECK_NULL_RETURN(frameNode, false);
989     return frameNode->IsDraggable();
990 }
991 
GetImageRenderMode(FrameNode * frameNode)992 ImageRenderMode ImageModelNG::GetImageRenderMode(FrameNode* frameNode)
993 {
994     CHECK_NULL_RETURN(frameNode, ImageRenderMode::ORIGINAL);
995     auto paintProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
996     CHECK_NULL_RETURN(paintProperty, ImageRenderMode::ORIGINAL);
997     CHECK_NULL_RETURN(paintProperty->GetImagePaintStyle(), ImageRenderMode::ORIGINAL);
998     return paintProperty->GetImagePaintStyle()->GetImageRenderMode().value_or(ImageRenderMode::ORIGINAL);
999 }
1000 
GetIsAnimation()1001 bool ImageModelNG::GetIsAnimation()
1002 {
1003     auto pattern = GetImagePattern();
1004     CHECK_NULL_RETURN(pattern, false);
1005     return pattern->GetIsAnimation();
1006 }
1007 
GetImagePattern()1008 ImagePattern* ImageModelNG::GetImagePattern()
1009 {
1010     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1011     CHECK_NULL_RETURN(frameNode, nullptr);
1012     return frameNode->GetPatternPtr<ImagePattern>();
1013 }
1014 
GetResizableSlice(FrameNode * frameNode)1015 ImageResizableSlice ImageModelNG::GetResizableSlice(FrameNode *frameNode)
1016 {
1017     ImageResizableSlice resizable;
1018     CHECK_NULL_RETURN(frameNode, resizable);
1019     auto renderProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
1020     CHECK_NULL_RETURN(renderProperty, resizable);
1021     return renderProperty->GetImageResizableSlice().value_or(resizable);
1022 }
1023 
EnableAnalyzer(FrameNode * frameNode,bool isEnableAnalyzer)1024 void ImageModelNG::EnableAnalyzer(FrameNode* frameNode, bool isEnableAnalyzer)
1025 {
1026     CHECK_NULL_VOID(frameNode);
1027     auto imagePattern = frameNode->GetPattern<ImagePattern>();
1028     CHECK_NULL_VOID(imagePattern);
1029     imagePattern->EnableAnalyzer(isEnableAnalyzer);
1030 }
1031 
SetImageAnalyzerConfig(FrameNode * frameNode,void * config)1032 void ImageModelNG::SetImageAnalyzerConfig(FrameNode* frameNode, void* config)
1033 {
1034     CHECK_NULL_VOID(frameNode);
1035     auto imagePattern = frameNode->GetPattern<ImagePattern>();
1036     CHECK_NULL_VOID(imagePattern);
1037     imagePattern->SetImageAnalyzerConfig(config);
1038 }
1039 
ResetImageSrc(FrameNode * frameNode)1040 void ImageModelNG::ResetImageSrc(FrameNode* frameNode)
1041 {
1042     CHECK_NULL_VOID(frameNode);
1043     ImageSourceInfo sourceInfo("");
1044     sourceInfo.SetIsFromReset(true);
1045     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, sourceInfo, frameNode);
1046     frameNode->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
1047     auto pattern = frameNode->GetPattern<ImagePattern>();
1048     CHECK_NULL_VOID(pattern);
1049     pattern->ResetImage();
1050     if (pattern->GetImageType() == ImagePattern::ImageType::ANIMATION) {
1051         if (pattern->GetHasSizeChanged()) {
1052             pattern->ResetPictureSize();
1053         }
1054         pattern->StopAnimation();
1055         pattern->ResetImages();
1056         if (!frameNode->GetChildren().empty()) {
1057             auto imageFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1058             ACE_RESET_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, imageFrameNode);
1059             frameNode->RemoveChild(imageFrameNode);
1060         }
1061         pattern->SetImageType(ImagePattern::ImageType::BASE);
1062     }
1063 }
1064 
ResetImageAlt(FrameNode * frameNode)1065 void ImageModelNG::ResetImageAlt(FrameNode* frameNode)
1066 {
1067     CHECK_NULL_VOID(frameNode);
1068     ImageSourceInfo sourceInfo("");
1069     sourceInfo.SetIsFromReset(true);
1070     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, Alt, sourceInfo, frameNode);
1071     frameNode->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
1072     auto pattern = frameNode->GetPattern<ImagePattern>();
1073     CHECK_NULL_VOID(pattern);
1074     pattern->ResetAltImage();
1075 }
1076 
SetOrientation(ImageRotateOrientation orientation)1077 void ImageModelNG::SetOrientation(ImageRotateOrientation orientation)
1078 {
1079     ACE_UPDATE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageRotateOrientation, orientation);
1080     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
1081     CHECK_NULL_VOID(pattern);
1082     pattern->SetOrientation(orientation);
1083 }
1084 
SetOrientation(FrameNode * frameNode,ImageRotateOrientation orientation)1085 void ImageModelNG::SetOrientation(FrameNode *frameNode, ImageRotateOrientation orientation)
1086 {
1087     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageRotateOrientation, orientation, frameNode);
1088     auto pattern = frameNode->GetPattern<ImagePattern>();
1089     CHECK_NULL_VOID(pattern);
1090     pattern->SetOrientation(orientation);
1091 }
1092 } // namespace OHOS::Ace::NG
1093 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_IMAGE_IMAGE_MODEL_NG_CPP
1094