• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2021-2025 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 "interfaces/native/node/resource.h"
22 
23 #include "base/image/image_defines.h"
24 #include "core/components/common/layout/constants.h"
25 #include "core/components/image/image_theme.h"
26 #include "core/components_ng/base/frame_node.h"
27 #include "core/components_ng/base/view_stack_processor.h"
28 #include "core/components_ng/pattern/image/image_render_property.h"
29 #include "core/components_ng/pattern/text/span_node.h"
30 #include "core/image/image_source_info.h"
31 #ifndef ACE_UNITTEST
32 #include "core/components_ng/base/view_abstract.h"
33 #endif
34 #include "core/common/resource/resource_manager.h"
35 #include "core/common/resource/resource_parse_utils.h"
36 
37 namespace OHOS::Ace::NG {
38 namespace {
39 const std::vector<float> DEFAULT_COLOR_FILTER = { 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0 };
40 constexpr float DEFAULT_HDR_BRIGHTNESS = 1.0f;
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 
SetFrameNodeDraggable(RefPtr<FrameNode> & frameNode,bool isImageSpan)64 void SetFrameNodeDraggable(RefPtr<FrameNode>& frameNode, bool isImageSpan)
65 {
66     if (!isImageSpan) {
67         auto pipeline = frameNode->GetContext();
68         CHECK_NULL_VOID(pipeline);
69         auto draggable = pipeline->GetDraggable<ImageTheme>();
70         if (draggable && !frameNode->IsDraggable()) {
71             auto gestureHub = frameNode->GetOrCreateGestureEventHub();
72             CHECK_NULL_VOID(gestureHub);
73             gestureHub->InitDragDropEvent();
74         }
75         frameNode->SetDraggable(draggable);
76     }
77 }
78 
Create(const ImageInfoConfig & imageInfoConfig,RefPtr<PixelMap> & pixMap)79 void ImageModelNG::Create(const ImageInfoConfig& imageInfoConfig, RefPtr<PixelMap>& pixMap)
80 {
81     auto* stack = ViewStackProcessor::GetInstance();
82     auto nodeId = stack->ClaimNodeId();
83     const std::string& src = imageInfoConfig.src ? *imageInfoConfig.src : "";
84     ACE_IMAGE_SCOPED_TRACE("Create[%s][self:%d] [src:%s]", V2::IMAGE_ETS_TAG, nodeId, src.c_str());
85     RefPtr<FrameNode> frameNode;
86     if (imageInfoConfig.isImageSpan) {
87         frameNode = ImageSpanNode::GetOrCreateSpanNode(
88             V2::IMAGE_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<ImagePattern>(); });
89     } else {
90         frameNode = FrameNode::GetOrCreateFrameNode(
91             V2::IMAGE_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<ImagePattern>(); });
92     }
93     stack->Push(frameNode);
94     auto pattern = frameNode->GetPattern<ImagePattern>();
95     CHECK_NULL_VOID(pattern);
96     if (src.empty() && !pixMap && pattern->GetIsAnimation()) {
97         pattern->SetSrcUndefined(true);
98         return;
99     }
100 
101     // set draggable for framenode
102     SetFrameNodeDraggable(frameNode, imageInfoConfig.isImageSpan);
103     auto srcInfo =
104         CreateSourceInfo(imageInfoConfig.src, pixMap, imageInfoConfig.bundleName, imageInfoConfig.moduleName);
105     srcInfo.SetIsUriPureNumber(imageInfoConfig.isUriPureNumber);
106 
107     if (pattern->GetImageType() != ImageType::BASE) {
108         if (pattern->GetHasSizeChanged()) {
109             pattern->ResetPictureSize();
110         }
111         pattern->StopAnimation();
112         pattern->ResetImages();
113         if (!frameNode->GetChildren().empty()) {
114             auto imageFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
115             ACE_RESET_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, imageFrameNode);
116             frameNode->RemoveChild(imageFrameNode);
117         }
118     }
119     pattern->SetNeedLoadAlt(true);
120     pattern->SetImageType(ImageType::BASE);
121 
122     ACE_UPDATE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, srcInfo);
123     SetImageFillSetByUser(false);
124 }
125 
ResetImage()126 void ImageModelNG::ResetImage()
127 {
128     auto* stack = ViewStackProcessor::GetInstance();
129     auto nodeId = stack->ClaimNodeId();
130     RefPtr<FrameNode> frameNode;
131     frameNode = FrameNode::GetOrCreateFrameNode(
132         V2::IMAGE_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<ImagePattern>(); });
133     stack->Push(frameNode);
134     ImageSourceInfo sourceInfo("");
135     sourceInfo.SetIsFromReset(true);
136     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, sourceInfo, frameNode);
137     frameNode->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
138     SetFrameNodeDraggable(frameNode, false);
139     auto pattern = frameNode->GetPattern<ImagePattern>();
140     CHECK_NULL_VOID(pattern);
141     pattern->SetNeedLoadAlt(false);
142     pattern->ResetImageAndAlt();
143     if (pattern->GetImageType() == ImageType::ANIMATED_DRAWABLE) {
144         if (pattern->GetHasSizeChanged()) {
145             pattern->ResetPictureSize();
146         }
147         pattern->StopAnimation();
148         pattern->ResetImages();
149         if (!frameNode->GetChildren().empty()) {
150             auto imageFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
151             ACE_RESET_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, imageFrameNode);
152             frameNode->RemoveChild(imageFrameNode);
153         }
154         pattern->SetImageType(ImageType::BASE);
155     }
156 }
157 
ResetImage(FrameNode * frameNode)158 void ImageModelNG::ResetImage(FrameNode* frameNode)
159 {
160     ImageSourceInfo sourceInfo("");
161     sourceInfo.SetIsFromReset(true);
162     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, sourceInfo, frameNode);
163     frameNode->MarkDirtyNode(PROPERTY_UPDATE_RENDER);
164     auto pattern = frameNode->GetPattern<ImagePattern>();
165     CHECK_NULL_VOID(pattern);
166     pattern->SetNeedLoadAlt(false);
167     pattern->ResetImageAndAlt();
168 }
169 
SetInitialSrc(FrameNode * frameNode,const std::string & src,const std::string & bundleName,const std::string & moduleName,bool isUriPureNumber)170 void ImageModelNG::SetInitialSrc(FrameNode* frameNode, const std::string& src, const std::string& bundleName,
171     const std::string& moduleName, bool isUriPureNumber)
172 {
173     auto srcInfo = ImageSourceInfo { src, bundleName, moduleName };
174     srcInfo.SetIsUriPureNumber(isUriPureNumber);
175 
176     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, srcInfo, frameNode);
177 }
178 
SetInitialPixelMap(FrameNode * frameNode,RefPtr<PixelMap> & pixMap)179 void ImageModelNG::SetInitialPixelMap(FrameNode* frameNode, RefPtr<PixelMap>& pixMap)
180 {
181     auto srcInfo = ImageSourceInfo(pixMap);
182     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, srcInfo, frameNode);
183 }
184 
CreateAnimation(const std::vector<ImageProperties> & imageList,int32_t duration,int32_t iteration)185 void ImageModelNG::CreateAnimation(const std::vector<ImageProperties>& imageList, int32_t duration, int32_t iteration)
186 {
187     auto* stack = ViewStackProcessor::GetInstance();
188     auto nodeId = stack->ClaimNodeId();
189     ACE_LAYOUT_SCOPED_TRACE("Create[%s][self:%d]", V2::IMAGE_ETS_TAG, nodeId);
190     auto frameNode = FrameNode::GetOrCreateFrameNode(
191         V2::IMAGE_ETS_TAG, nodeId, []() { return AceType::MakeRefPtr<ImagePattern>(); });
192     CHECK_NULL_VOID(frameNode);
193     if (frameNode->GetChildren().empty()) {
194         auto imageNode = FrameNode::CreateFrameNode(
195             V2::IMAGE_ETS_TAG, ElementRegister::GetInstance()->MakeUniqueId(), AceType::MakeRefPtr<ImagePattern>());
196         CHECK_NULL_VOID(imageNode);
197         auto imageLayoutProperty = AceType::DynamicCast<ImageLayoutProperty>(imageNode->GetLayoutProperty());
198         CHECK_NULL_VOID(imageLayoutProperty);
199         imageLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT);
200         frameNode->GetLayoutProperty()->UpdateAlignment(Alignment::TOP_LEFT);
201         frameNode->AddChild(imageNode);
202     }
203     stack->Push(frameNode);
204 
205     auto pattern = frameNode->GetPattern<ImagePattern>();
206     CHECK_NULL_VOID(pattern);
207     if (!pattern->GetIsAnimation()) {
208         auto castImageLayoutProperty = frameNode->GetLayoutPropertyPtr<ImageLayoutProperty>();
209         CHECK_NULL_VOID(castImageLayoutProperty);
210         castImageLayoutProperty->Reset();
211         auto castImageRenderProperty = frameNode->GetPaintPropertyPtr<ImageRenderProperty>();
212         CHECK_NULL_VOID(castImageRenderProperty);
213         castImageRenderProperty->Reset();
214         pattern->ResetImageAndAlt();
215         pattern->ResetImageProperties();
216     }
217     // set draggable for framenode
218     auto pipeline = frameNode->GetContext();
219     CHECK_NULL_VOID(pipeline);
220     auto draggable = pipeline->GetDraggable<ImageTheme>();
221     if (draggable && !frameNode->IsDraggable()) {
222         auto gestureHub = frameNode->GetOrCreateGestureEventHub();
223         CHECK_NULL_VOID(gestureHub);
224         gestureHub->InitDragDropEvent();
225     }
226     frameNode->SetDraggable(draggable);
227     pattern->SetSrcUndefined(false);
228     pattern->StopAnimation();
229     pattern->SetImageType(ImageType::ANIMATED_DRAWABLE);
230     std::vector<ImageProperties> images = imageList;
231     pattern->SetImages(std::move(images));
232     pattern->SetDuration(duration);
233     pattern->SetIteration(iteration);
234     pattern->StartAnimation();
235 }
236 
CreateFrameNode(int32_t nodeId,const std::string & src,RefPtr<PixelMap> & pixMap,const std::string & bundleName,const std::string & moduleName,bool isUriPureNumber)237 RefPtr<FrameNode> ImageModelNG::CreateFrameNode(int32_t nodeId, const std::string& src, RefPtr<PixelMap>& pixMap,
238     const std::string& bundleName, const std::string& moduleName, bool isUriPureNumber)
239 {
240     auto frameNode = FrameNode::CreateFrameNode(V2::IMAGE_ETS_TAG, nodeId, AceType::MakeRefPtr<ImagePattern>());
241     CHECK_NULL_RETURN(frameNode, nullptr);
242     // set draggable for framenode
243     auto pipeline = PipelineContext::GetCurrentContextSafelyWithCheck();
244     CHECK_NULL_RETURN(pipeline, nullptr);
245     auto draggable = pipeline->GetDraggable<ImageTheme>();
246     if (draggable && !frameNode->IsDraggable()) {
247         auto gestureHub = frameNode->GetOrCreateGestureEventHub();
248         CHECK_NULL_RETURN(gestureHub, nullptr);
249         gestureHub->InitDragDropEvent();
250     }
251     frameNode->SetDraggable(draggable);
252     auto srcInfo = CreateSourceInfo(src, pixMap, bundleName, moduleName);
253     srcInfo.SetIsUriPureNumber(isUriPureNumber);
254     auto layoutProperty = frameNode->GetLayoutProperty<ImageLayoutProperty>();
255     CHECK_NULL_RETURN(layoutProperty, nullptr);
256     layoutProperty->UpdateImageSourceInfo(srcInfo);
257     return frameNode;
258 }
259 
SetAlt(const ImageSourceInfo & src)260 void ImageModelNG::SetAlt(const ImageSourceInfo& src)
261 {
262     ACE_UPDATE_LAYOUT_PROPERTY(ImageLayoutProperty, Alt, src);
263 }
264 
SetSmoothEdge(float value)265 void ImageModelNG::SetSmoothEdge(float value)
266 {
267     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, SmoothEdge, value);
268 }
269 
SetSmoothEdge(FrameNode * frameNode,float value)270 void ImageModelNG::SetSmoothEdge(FrameNode* frameNode, float value)
271 {
272     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, SmoothEdge, value, frameNode);
273 }
274 
SetDynamicRangeMode(DynamicRangeMode dynamicRangeMode)275 void ImageModelNG::SetDynamicRangeMode(DynamicRangeMode dynamicRangeMode)
276 {
277     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, DynamicMode, dynamicRangeMode);
278     ACE_UPDATE_RENDER_CONTEXT(DynamicRangeMode, dynamicRangeMode);
279 }
280 
SetDynamicRangeMode(FrameNode * frameNode,DynamicRangeMode dynamicRangeMode)281 void ImageModelNG::SetDynamicRangeMode(FrameNode* frameNode, DynamicRangeMode dynamicRangeMode)
282 {
283     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, DynamicMode, dynamicRangeMode, frameNode);
284     ACE_UPDATE_NODE_RENDER_CONTEXT(DynamicRangeMode, dynamicRangeMode, frameNode);
285 }
286 
SetHdrBrightness(float hdrBrightness)287 void ImageModelNG::SetHdrBrightness(float hdrBrightness)
288 {
289     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, HdrBrightness, hdrBrightness);
290 }
291 
SetHdrBrightness(FrameNode * frameNode,float hdrBrightness)292 void ImageModelNG::SetHdrBrightness(FrameNode* frameNode, float hdrBrightness)
293 {
294     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, HdrBrightness, hdrBrightness, frameNode);
295 }
296 
SetEnhancedImageQuality(AIImageQuality imageQuality)297 void ImageModelNG::SetEnhancedImageQuality(AIImageQuality imageQuality)
298 {
299     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
300     CHECK_NULL_VOID(pattern);
301     pattern->SetImageQuality(imageQuality);
302 }
303 
SetEnhancedImageQuality(FrameNode * frameNode,AIImageQuality imageQuality)304 void ImageModelNG::SetEnhancedImageQuality(FrameNode* frameNode, AIImageQuality imageQuality)
305 {
306     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>(frameNode);
307     CHECK_NULL_VOID(pattern);
308     pattern->SetImageQuality(imageQuality);
309 }
310 
SetBorder(const Border & border)311 void ImageModelNG::SetBorder(const Border& border) {}
312 
SetBorderRadius(const Dimension & value)313 void ImageModelNG::SetBorderRadius(const Dimension& value)
314 {
315     BorderRadiusProperty borderRadius;
316     borderRadius.SetRadius(value);
317     borderRadius.multiValued = false;
318     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, NeedBorderRadius, true);
319     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, BorderRadius, borderRadius);
320     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
321     CHECK_NULL_VOID(frameNode);
322     auto pattern = frameNode->GetPattern<ImagePattern>();
323     CHECK_NULL_VOID(pattern);
324     pattern->SetNeedBorderRadius(true);
325 }
326 
SetBorderRadius(const std::optional<Dimension> & radiusTopLeft,const std::optional<Dimension> & radiusTopRight,const std::optional<Dimension> & radiusBottomLeft,const std::optional<Dimension> & radiusBottomRight)327 void ImageModelNG::SetBorderRadius(const std::optional<Dimension>& radiusTopLeft,
328     const std::optional<Dimension>& radiusTopRight, const std::optional<Dimension>& radiusBottomLeft,
329     const std::optional<Dimension>& radiusBottomRight)
330 {
331     NG::BorderRadiusProperty borderRadius;
332     borderRadius.radiusTopLeft = radiusTopLeft;
333     borderRadius.radiusTopRight = radiusTopRight;
334     borderRadius.radiusBottomLeft = radiusBottomLeft;
335     borderRadius.radiusBottomRight = radiusBottomRight;
336     borderRadius.multiValued = true;
337     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, NeedBorderRadius, true);
338     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, BorderRadius, borderRadius);
339     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
340     CHECK_NULL_VOID(frameNode);
341     auto pattern = frameNode->GetPattern<ImagePattern>();
342     CHECK_NULL_VOID(pattern);
343     pattern->SetNeedBorderRadius(true);
344 }
345 
SetBorderRadius(const NG::BorderRadiusProperty & borderRadius)346 void ImageModelNG::SetBorderRadius(const NG::BorderRadiusProperty& borderRadius)
347 {
348     if (SystemProperties::ConfigChangePerform()) {
349         std::string key = "image.borderRadius.edges";
350         auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
351         CHECK_NULL_VOID(frameNode);
352         auto pattern = frameNode->GetPattern<ImagePattern>();
353         CHECK_NULL_VOID(pattern);
354         pattern->RemoveResObj(key);
355         RefPtr<ResourceObject> resObj = AceType::MakeRefPtr<ResourceObject>("", "", -1);
356         auto&& updateFunc = [borderRadius, weak = AceType::WeakClaim(frameNode)](const RefPtr<ResourceObject>& resObj) {
357             auto frameNode = weak.Upgrade();
358             CHECK_NULL_VOID(frameNode);
359             BorderRadiusProperty& borderRadiusReload = const_cast<BorderRadiusProperty&>(borderRadius);
360             borderRadiusReload.ReloadResources();
361             ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, NeedBorderRadius, true, frameNode);
362             ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, BorderRadius, borderRadiusReload, frameNode);
363             auto pattern = frameNode->GetPattern<ImagePattern>();
364             CHECK_NULL_VOID(pattern);
365             pattern->SetNeedBorderRadius(true);
366         };
367         pattern->AddResObj(key, resObj, std::move(updateFunc));
368     }
369     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, NeedBorderRadius, true);
370     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, BorderRadius, borderRadius);
371     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
372     CHECK_NULL_VOID(frameNode);
373     auto pattern = frameNode->GetPattern<ImagePattern>();
374     CHECK_NULL_VOID(pattern);
375     pattern->SetNeedBorderRadius(true);
376 }
377 
SetBorderRadius(FrameNode * frameNode,const Dimension & value)378 void ImageModelNG::SetBorderRadius(FrameNode* frameNode, const Dimension& value)
379 {
380     BorderRadiusProperty borderRadius;
381     borderRadius.SetRadius(value);
382     borderRadius.multiValued = false;
383     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, BorderRadius, borderRadius, frameNode);
384     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, NeedBorderRadius, true, frameNode);
385     auto pattern = frameNode->GetPattern<ImagePattern>();
386     CHECK_NULL_VOID(pattern);
387     pattern->SetNeedBorderRadius(true);
388 }
389 
SetBorderRadius(FrameNode * frameNode,const std::optional<Dimension> & radiusTopLeft,const std::optional<Dimension> & radiusTopRight,const std::optional<Dimension> & radiusBottomLeft,const std::optional<Dimension> & radiusBottomRight)390 void ImageModelNG::SetBorderRadius(FrameNode* frameNode, const std::optional<Dimension>& radiusTopLeft,
391     const std::optional<Dimension>& radiusTopRight, const std::optional<Dimension>& radiusBottomLeft,
392     const std::optional<Dimension>& radiusBottomRight)
393 {
394     NG::BorderRadiusProperty borderRadius;
395     borderRadius.radiusTopLeft = radiusTopLeft;
396     borderRadius.radiusTopRight = radiusTopRight;
397     borderRadius.radiusBottomLeft = radiusBottomLeft;
398     borderRadius.radiusBottomRight = radiusBottomRight;
399     borderRadius.multiValued = true;
400     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, NeedBorderRadius, true, frameNode);
401     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, BorderRadius, borderRadius, frameNode);
402     auto pattern = frameNode->GetPattern<ImagePattern>();
403     CHECK_NULL_VOID(pattern);
404     pattern->SetNeedBorderRadius(true);
405 }
406 
SetBorderRadius(FrameNode * frameNode,const NG::BorderRadiusProperty & borderRadius)407 void ImageModelNG::SetBorderRadius(FrameNode* frameNode, const NG::BorderRadiusProperty& borderRadius)
408 {
409     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, NeedBorderRadius, true, frameNode);
410     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, BorderRadius, borderRadius, frameNode);
411     auto pattern = frameNode->GetPattern<ImagePattern>();
412     CHECK_NULL_VOID(pattern);
413     pattern->SetNeedBorderRadius(true);
414 }
415 
SetBackBorder()416 void ImageModelNG::SetBackBorder()
417 {
418     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, NeedBorderRadius, true);
419     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
420     CHECK_NULL_VOID(frameNode);
421     auto pattern = frameNode->GetPattern<ImagePattern>();
422     CHECK_NULL_VOID(pattern);
423     pattern->SetNeedBorderRadius(true);
424 }
425 
SetBackBorder(FrameNode * frameNode)426 void ImageModelNG::SetBackBorder(FrameNode* frameNode)
427 {
428     CHECK_NULL_VOID(frameNode);
429     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, NeedBorderRadius, true, frameNode);
430     auto pattern = frameNode->GetPattern<ImagePattern>();
431     CHECK_NULL_VOID(pattern);
432     pattern->SetNeedBorderRadius(true);
433 }
434 
ResetBackBorder(FrameNode * frameNode)435 void ImageModelNG::ResetBackBorder(FrameNode* frameNode)
436 {
437     CHECK_NULL_VOID(frameNode);
438     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, NeedBorderRadius, true, frameNode);
439     auto pattern = frameNode->GetPattern<ImagePattern>();
440     CHECK_NULL_VOID(pattern);
441     pattern->SetNeedBorderRadius(false);
442 }
443 
SetBlur(double blur)444 void ImageModelNG::SetBlur(double blur) {}
445 
SetImageFit(ImageFit value)446 void ImageModelNG::SetImageFit(ImageFit value)
447 {
448     ACE_UPDATE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageFit, value);
449     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ImageFit, value);
450 }
451 
SetImageMatrix(const Matrix4 & value)452 void ImageModelNG::SetImageMatrix(const Matrix4& value)
453 {
454     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ImageMatrix, value);
455 }
456 
SetMatchTextDirection(bool value)457 void ImageModelNG::SetMatchTextDirection(bool value)
458 {
459     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, MatchTextDirection, value);
460 }
461 
SetFitOriginSize(bool value)462 void ImageModelNG::SetFitOriginSize(bool value)
463 {
464     ACE_UPDATE_LAYOUT_PROPERTY(ImageLayoutProperty, FitOriginalSize, value);
465 }
466 
SetOnComplete(std::function<void (const LoadImageSuccessEvent & info)> && callback)467 void ImageModelNG::SetOnComplete(std::function<void(const LoadImageSuccessEvent& info)>&& callback)
468 {
469     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
470     CHECK_NULL_VOID(frameNode);
471     auto eventHub = frameNode->GetOrCreateEventHub<ImageEventHub>();
472     CHECK_NULL_VOID(eventHub);
473     eventHub->SetOnComplete(std::move(callback));
474 }
475 
SetOnError(std::function<void (const LoadImageFailEvent & info)> && callback)476 void ImageModelNG::SetOnError(std::function<void(const LoadImageFailEvent& info)>&& callback)
477 {
478     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
479     CHECK_NULL_VOID(frameNode);
480     auto eventHub = frameNode->GetOrCreateEventHub<ImageEventHub>();
481     CHECK_NULL_VOID(eventHub);
482     eventHub->SetOnError(std::move(callback));
483 }
484 
SetSvgAnimatorFinishEvent(std::function<void ()> && callback)485 void ImageModelNG::SetSvgAnimatorFinishEvent(std::function<void()>&& callback)
486 {
487     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
488     CHECK_NULL_VOID(frameNode);
489     auto eventHub = frameNode->GetOrCreateEventHub<ImageEventHub>();
490     CHECK_NULL_VOID(eventHub);
491     eventHub->SetOnFinish(std::move(callback));
492 }
493 
SetImageSourceSize(const std::pair<Dimension,Dimension> & size)494 void ImageModelNG::SetImageSourceSize(const std::pair<Dimension, Dimension>& size)
495 {
496     SizeF sourceSize =
497         SizeF(static_cast<float>(size.first.ConvertToPx()), static_cast<float>(size.second.ConvertToPx()));
498     ACE_UPDATE_LAYOUT_PROPERTY(ImageLayoutProperty, SourceSize, sourceSize);
499 }
500 
SetImageFill(const Color & color)501 void ImageModelNG::SetImageFill(const Color& color)
502 {
503     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, SvgFillColor, color);
504     ACE_UPDATE_RENDER_CONTEXT(ForegroundColor, color);
505 }
506 
ResetImageFill()507 void ImageModelNG::ResetImageFill()
508 {
509     ACE_RESET_PAINT_PROPERTY_WITH_FLAG(ImageRenderProperty, SvgFillColor, PROPERTY_UPDATE_RENDER);
510     ACE_RESET_RENDER_CONTEXT(RenderContext, ForegroundColor);
511 }
512 
ResetImageFill(FrameNode * frameNode)513 void ImageModelNG::ResetImageFill(FrameNode* frameNode)
514 {
515     ACE_RESET_NODE_PAINT_PROPERTY_WITH_FLAG(ImageRenderProperty, SvgFillColor, PROPERTY_UPDATE_RENDER, frameNode);
516     ACE_RESET_NODE_RENDER_CONTEXT(RenderContext, ForegroundColor, frameNode);
517 }
518 
SetImageInterpolation(ImageInterpolation interpolation)519 void ImageModelNG::SetImageInterpolation(ImageInterpolation interpolation)
520 {
521     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ImageInterpolation, interpolation);
522 }
523 
SetImageRepeat(ImageRepeat imageRepeat)524 void ImageModelNG::SetImageRepeat(ImageRepeat imageRepeat)
525 {
526     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ImageRepeat, imageRepeat);
527 }
528 
SetImageRenderMode(ImageRenderMode imageRenderMode)529 void ImageModelNG::SetImageRenderMode(ImageRenderMode imageRenderMode)
530 {
531     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ImageRenderMode, imageRenderMode);
532 }
533 
IsSrcSvgImage()534 bool ImageModelNG::IsSrcSvgImage()
535 {
536     return false;
537 }
538 
SetAutoResize(bool autoResize)539 void ImageModelNG::SetAutoResize(bool autoResize)
540 {
541     ACE_UPDATE_LAYOUT_PROPERTY(ImageLayoutProperty, AutoResize, autoResize);
542 }
543 
SetSyncMode(bool syncMode)544 void ImageModelNG::SetSyncMode(bool syncMode)
545 {
546     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
547     CHECK_NULL_VOID(pattern);
548     pattern->SetSyncLoad(syncMode);
549 }
550 
SetColorFilterMatrix(const std::vector<float> & matrix)551 void ImageModelNG::SetColorFilterMatrix(const std::vector<float>& matrix)
552 {
553     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ColorFilter, matrix);
554     ACE_RESET_PAINT_PROPERTY(ImageRenderProperty, DrawingColorFilter);
555 }
556 
SetDrawingColorFilter(RefPtr<DrawingColorFilter> & colorFilter)557 void ImageModelNG::SetDrawingColorFilter(RefPtr<DrawingColorFilter>& colorFilter)
558 {
559     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, DrawingColorFilter, colorFilter);
560     ACE_RESET_PAINT_PROPERTY(ImageRenderProperty, ColorFilter);
561 }
562 
SetDraggable(bool draggable)563 void ImageModelNG::SetDraggable(bool draggable)
564 {
565     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
566     CHECK_NULL_VOID(frameNode);
567     auto gestureHub = ViewStackProcessor::GetInstance()->GetMainFrameNodeGestureEventHub();
568     CHECK_NULL_VOID(gestureHub);
569     if (draggable) {
570         if (!frameNode->IsDraggable()) {
571             gestureHub->InitDragDropEvent();
572         }
573     } else {
574         gestureHub->RemoveDragEvent();
575     }
576     CHECK_NULL_VOID(frameNode);
577     frameNode->SetCustomerDraggable(draggable);
578 }
579 
SetOnDragStart(OnDragStartFunc && onDragStart)580 void ImageModelNG::SetOnDragStart(OnDragStartFunc&& onDragStart)
581 {
582 #ifndef ACE_UNITTEST
583     auto dragStart = [dragStartFunc = std::move(onDragStart)](
584                          const RefPtr<OHOS::Ace::DragEvent>& event, const std::string& extraParams) -> DragDropInfo {
585         auto dragInfo = dragStartFunc(event, extraParams);
586         DragDropInfo info;
587         info.extraInfo = dragInfo.extraInfo;
588         info.pixelMap = dragInfo.pixelMap;
589         info.customNode = AceType::DynamicCast<UINode>(dragInfo.node);
590         return info;
591     };
592     ViewAbstract::SetOnDragStart(std::move(dragStart));
593 #endif
594 }
595 
SetOnDragEnter(OnDragDropFunc && onDragEnter)596 void ImageModelNG::SetOnDragEnter(OnDragDropFunc&& onDragEnter) {}
597 
SetOnDragLeave(OnDragDropFunc && onDragLeave)598 void ImageModelNG::SetOnDragLeave(OnDragDropFunc&& onDragLeave) {}
599 
SetOnDragMove(OnDragDropFunc && onDragMove)600 void ImageModelNG::SetOnDragMove(OnDragDropFunc&& onDragMove) {}
601 
SetOnDrop(OnDragDropFunc && onDrop)602 void ImageModelNG::SetOnDrop(OnDragDropFunc&& onDrop) {}
603 
SetCopyOption(const CopyOptions & copyOption)604 void ImageModelNG::SetCopyOption(const CopyOptions& copyOption)
605 {
606     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
607     CHECK_NULL_VOID(pattern);
608     pattern->SetCopyOption(copyOption);
609 }
610 
UpdateDragItemInfo(DragItemInfo & itemInfo)611 bool ImageModelNG::UpdateDragItemInfo(DragItemInfo& itemInfo)
612 {
613     return false;
614 }
615 
InitImage(FrameNode * frameNode,std::string & src)616 void ImageModelNG::InitImage(FrameNode* frameNode, std::string& src)
617 {
618     std::string bundleName;
619     std::string moduleName;
620     RefPtr<OHOS::Ace::PixelMap> pixMapPtr;
621     auto srcInfo = CreateSourceInfo(src, pixMapPtr, bundleName, moduleName);
622     srcInfo.SetIsUriPureNumber(false);
623     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, srcInfo, frameNode);
624 }
625 
SetPixelMap(FrameNode * frameNode,void * drawableDescriptor)626 void ImageModelNG::SetPixelMap(FrameNode* frameNode, void* drawableDescriptor)
627 {
628 #ifndef ACE_UNITTEST
629     CHECK_NULL_VOID(drawableDescriptor);
630     RefPtr<PixelMap> pixelMapPtr = PixelMap::GetFromDrawable(drawableDescriptor);
631     auto srcInfo = CreateSourceInfo("", pixelMapPtr, "", "");
632     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, srcInfo, frameNode);
633 #endif
634 }
635 
SetPixelMapArray(FrameNode * frameNode,void * animatedDrawableDescriptor)636 void ImageModelNG::SetPixelMapArray(FrameNode* frameNode, void* animatedDrawableDescriptor)
637 {
638 #ifndef ACE_UNITTEST
639     CHECK_NULL_VOID(animatedDrawableDescriptor);
640     std::vector<RefPtr<PixelMap>> pixelMaps;
641     int32_t duration = -1;
642     int32_t iterations = 1;
643     if (!PixelMap::GetPxielMapListFromAnimatedDrawable(animatedDrawableDescriptor, pixelMaps, duration, iterations)) {
644         return;
645     }
646     std::vector<ImageProperties> images;
647     for (int32_t i = 0; i < static_cast<int32_t>(pixelMaps.size()); i++) {
648         ImageProperties image;
649         image.pixelMap = pixelMaps[i];
650         images.push_back(image);
651     }
652 
653     if (frameNode->GetChildren().empty()) {
654         auto imageNode = FrameNode::CreateFrameNode(V2::IMAGE_ETS_TAG, -1, AceType::MakeRefPtr<ImagePattern>());
655         CHECK_NULL_VOID(imageNode);
656         auto imageLayoutProperty = AceType::DynamicCast<ImageLayoutProperty>(imageNode->GetLayoutProperty());
657         CHECK_NULL_VOID(imageLayoutProperty);
658         imageLayoutProperty->UpdateMeasureType(MeasureType::MATCH_PARENT);
659         frameNode->GetLayoutProperty()->UpdateAlignment(Alignment::TOP_LEFT);
660         frameNode->AddChild(imageNode);
661     }
662 
663     auto pattern = AceType::DynamicCast<ImagePattern>(frameNode->GetPattern());
664     CHECK_NULL_VOID(pattern);
665 
666     pattern->StopAnimation();
667     pattern->SetImageType(ImageType::ANIMATED_DRAWABLE);
668     pattern->SetImages(std::move(images));
669     pattern->SetDuration(duration);
670     pattern->SetIteration(iterations);
671     pattern->StartAnimation();
672 #endif
673 }
674 
SetResource(FrameNode * frameNode,void * resource)675 void ImageModelNG::SetResource(FrameNode* frameNode, void* resource)
676 {
677     auto res = reinterpret_cast<ArkUI_Resource*>(resource);
678     CHECK_NULL_VOID(res);
679     RefPtr<PixelMap> pixMapPtr;
680     auto srcInfo = CreateSourceInfo(res->src, pixMapPtr, res->bundleName, res->moduleName);
681     srcInfo.SetIsUriPureNumber(res->resId == -1);
682     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, srcInfo, frameNode);
683 }
684 
SetDrawingColorFilter(FrameNode * frameNode,RefPtr<DrawingColorFilter> & colorFilter)685 void ImageModelNG::SetDrawingColorFilter(FrameNode* frameNode, RefPtr<DrawingColorFilter>& colorFilter)
686 {
687     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, DrawingColorFilter, colorFilter, frameNode);
688     ACE_RESET_NODE_PAINT_PROPERTY(ImageRenderProperty, ColorFilter, frameNode);
689 }
690 
SetCopyOption(FrameNode * frameNode,CopyOptions copyOption)691 void ImageModelNG::SetCopyOption(FrameNode* frameNode, CopyOptions copyOption)
692 {
693     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>(frameNode);
694     CHECK_NULL_VOID(pattern);
695     pattern->SetCopyOption(copyOption);
696 }
697 
GetCopyOption(FrameNode * frameNode)698 CopyOptions ImageModelNG::GetCopyOption(FrameNode* frameNode)
699 {
700     CHECK_NULL_RETURN(frameNode, CopyOptions::None);
701     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>(frameNode);
702     CHECK_NULL_RETURN(pattern, CopyOptions::None);
703     return pattern->GetCopyOption();
704 }
705 
SetAutoResize(FrameNode * frameNode,bool autoResize)706 void ImageModelNG::SetAutoResize(FrameNode* frameNode, bool autoResize)
707 {
708     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, AutoResize, autoResize, frameNode);
709 }
710 
ResetAutoResize(FrameNode * frameNode)711 void ImageModelNG::ResetAutoResize(FrameNode* frameNode)
712 {
713     CHECK_NULL_VOID(frameNode);
714     auto imagePattern = frameNode->GetPattern<ImagePattern>();
715     CHECK_NULL_VOID(imagePattern);
716     auto defaultAutoResize = imagePattern->GetDefaultAutoResize();
717     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, AutoResize, defaultAutoResize, frameNode);
718 }
719 
SetResizableSlice(ImageResizableSlice & slice)720 void ImageModelNG::SetResizableSlice(ImageResizableSlice& slice)
721 {
722     if (SystemProperties::ConfigChangePerform()) {
723         auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
724         CHECK_NULL_VOID(frameNode);
725         auto pattern = frameNode->GetPattern();
726         CHECK_NULL_VOID(pattern);
727         std::string key = "image.ResizableSlice";
728         RefPtr<ResourceObject> resObj = AceType::MakeRefPtr<ResourceObject>("", "", -1);
729         auto&& updateFunc = [slice, weak = AceType::WeakClaim(frameNode)](const RefPtr<ResourceObject>& resObj) {
730             auto frameNode = weak.Upgrade();
731             if (!frameNode) {
732                 return;
733             }
734             ImageResizableSlice& sliceValue = const_cast<ImageResizableSlice&>(slice);
735             sliceValue.ReloadResources();
736             ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageResizableSlice, sliceValue, frameNode);
737         };
738         pattern->AddResObj(key, resObj, std::move(updateFunc));
739     }
740     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ImageResizableSlice, slice);
741 }
742 
SetResizableSlice(FrameNode * frameNode,ImageResizableSlice & slice)743 void ImageModelNG::SetResizableSlice(FrameNode* frameNode, ImageResizableSlice& slice)
744 {
745     CHECK_NULL_VOID(frameNode);
746     if (SystemProperties::ConfigChangePerform()) {
747         auto pattern = frameNode->GetPattern();
748         CHECK_NULL_VOID(pattern);
749         std::string key = "image.ResizableSlice";
750         RefPtr<ResourceObject> resObj = AceType::MakeRefPtr<ResourceObject>("", "", -1);
751         auto&& updateFunc = [slice, weak = AceType::WeakClaim(frameNode)](const RefPtr<ResourceObject>& resObj) {
752             auto frameNode = weak.Upgrade();
753             if (!frameNode) {
754                 return;
755             }
756             ImageResizableSlice& sliceValue = const_cast<ImageResizableSlice&>(slice);
757             sliceValue.ReloadResources();
758             ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageResizableSlice, sliceValue, frameNode);
759         };
760         pattern->AddResObj(key, resObj, std::move(updateFunc));
761     }
762     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageResizableSlice, slice, frameNode);
763 }
764 
SetResizableLattice(const RefPtr<DrawingLattice> & lattice)765 void ImageModelNG::SetResizableLattice(const RefPtr<DrawingLattice>& lattice)
766 {
767     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ImageResizableLattice, lattice);
768 }
769 
SetResizableLattice(FrameNode * frameNode,const RefPtr<DrawingLattice> & lattice)770 void ImageModelNG::SetResizableLattice(FrameNode* frameNode, const RefPtr<DrawingLattice>& lattice)
771 {
772     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageResizableLattice, lattice, frameNode);
773 }
774 
ResetResizableLattice()775 void ImageModelNG::ResetResizableLattice()
776 {
777     ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, ImageResizableLattice, nullptr);
778 }
779 
ResetResizableLattice(FrameNode * frameNode)780 void ImageModelNG::ResetResizableLattice(FrameNode* frameNode)
781 {
782     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageResizableLattice, nullptr, frameNode);
783 }
784 
SetImageRepeat(FrameNode * frameNode,ImageRepeat imageRepeat)785 void ImageModelNG::SetImageRepeat(FrameNode* frameNode, ImageRepeat imageRepeat)
786 {
787     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageRepeat, imageRepeat, frameNode);
788 }
789 
SetImageRenderMode(FrameNode * frameNode,ImageRenderMode imageRenderMode)790 void ImageModelNG::SetImageRenderMode(FrameNode* frameNode, ImageRenderMode imageRenderMode)
791 {
792     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageRenderMode, imageRenderMode, frameNode);
793 }
794 
SetImageMatrix(FrameNode * frameNode,const Matrix4 & value)795 void ImageModelNG::SetImageMatrix(FrameNode* frameNode, const Matrix4& value)
796 {
797     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageMatrix, value, frameNode);
798 }
799 
SetImageFit(FrameNode * frameNode,ImageFit value)800 void ImageModelNG::SetImageFit(FrameNode* frameNode, ImageFit value)
801 {
802     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageFit, value, frameNode);
803     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageFit, value, frameNode);
804 }
805 
SetFitOriginSize(FrameNode * frameNode,bool value)806 void ImageModelNG::SetFitOriginSize(FrameNode* frameNode, bool value)
807 {
808     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, FitOriginalSize, value, frameNode);
809 }
810 
SetSyncMode(FrameNode * frameNode,bool syncMode)811 void ImageModelNG::SetSyncMode(FrameNode* frameNode, bool syncMode)
812 {
813     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>(frameNode);
814     CHECK_NULL_VOID(pattern);
815     pattern->SetSyncLoad(syncMode);
816 }
817 
SetImageSourceSize(FrameNode * frameNode,const std::pair<Dimension,Dimension> & size)818 void ImageModelNG::SetImageSourceSize(FrameNode* frameNode, const std::pair<Dimension, Dimension>& size)
819 {
820     SizeF sourceSize =
821         SizeF(static_cast<float>(size.first.ConvertToPx()), static_cast<float>(size.second.ConvertToPx()));
822     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, SourceSize, sourceSize, frameNode);
823 }
824 
SetMatchTextDirection(FrameNode * frameNode,bool value)825 void ImageModelNG::SetMatchTextDirection(FrameNode* frameNode, bool value)
826 {
827     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, MatchTextDirection, value, frameNode);
828 }
829 
SetImageFill(FrameNode * frameNode,const Color & color)830 void ImageModelNG::SetImageFill(FrameNode* frameNode, const Color& color)
831 {
832     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, SvgFillColor, color, frameNode);
833     ACE_UPDATE_NODE_RENDER_CONTEXT(ForegroundColor, color, frameNode);
834 }
835 
SetAlt(FrameNode * frameNode,const ImageSourceInfo & src)836 void ImageModelNG::SetAlt(FrameNode* frameNode, const ImageSourceInfo& src)
837 {
838     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, Alt, src, frameNode);
839 }
840 
SetAltResource(FrameNode * frameNode,void * resource)841 void ImageModelNG::SetAltResource(FrameNode* frameNode, void* resource)
842 {
843     CHECK_NULL_VOID(frameNode);
844     auto res = reinterpret_cast<ArkUI_Resource*>(resource);
845     CHECK_NULL_VOID(res);
846     RefPtr<PixelMap> pixMapPtr = nullptr;
847     auto srcInfo = CreateSourceInfo(res->src, pixMapPtr, res->bundleName, res->moduleName);
848     srcInfo.SetIsUriPureNumber(res->resId == -1);
849     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, Alt, srcInfo, frameNode);
850 }
851 
SetAltPixelMap(FrameNode * frameNode,void * pixelMap)852 void ImageModelNG::SetAltPixelMap(FrameNode* frameNode, void* pixelMap)
853 {
854     CHECK_NULL_VOID(frameNode);
855     CHECK_NULL_VOID(pixelMap);
856 #ifndef ACE_UNITTEST
857     RefPtr<PixelMap> pixelMapPtr = PixelMap::GetFromDrawable(pixelMap);
858     auto srcInfo = CreateSourceInfo("", pixelMapPtr, "", "");
859     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, Alt, srcInfo, frameNode);
860 #endif
861 }
862 
SetImageInterpolation(FrameNode * frameNode,ImageInterpolation interpolation)863 void ImageModelNG::SetImageInterpolation(FrameNode* frameNode, ImageInterpolation interpolation)
864 {
865     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageInterpolation, interpolation, frameNode);
866 }
867 
ResetImageInterpolation(FrameNode * frameNode)868 void ImageModelNG::ResetImageInterpolation(FrameNode* frameNode)
869 {
870     CHECK_NULL_VOID(frameNode);
871     auto imagePattern = frameNode->GetPattern<ImagePattern>();
872     CHECK_NULL_VOID(imagePattern);
873     auto defaultInterpolation = imagePattern->GetDefaultInterpolation();
874     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ImageInterpolation, defaultInterpolation, frameNode);
875 }
876 
SetColorFilterMatrix(FrameNode * frameNode,const std::vector<float> & matrix)877 void ImageModelNG::SetColorFilterMatrix(FrameNode* frameNode, const std::vector<float>& matrix)
878 {
879     ACE_UPDATE_NODE_PAINT_PROPERTY(ImageRenderProperty, ColorFilter, matrix, frameNode);
880     ACE_RESET_NODE_PAINT_PROPERTY(ImageRenderProperty, DrawingColorFilter, frameNode);
881 }
882 
SetDraggable(FrameNode * frameNode,bool draggable)883 void ImageModelNG::SetDraggable(FrameNode* frameNode, bool draggable)
884 {
885     auto gestureHub = frameNode->GetOrCreateGestureEventHub();
886     CHECK_NULL_VOID(gestureHub);
887     if (draggable) {
888         if (!frameNode->IsDraggable()) {
889             gestureHub->InitDragDropEvent();
890         }
891     } else {
892         gestureHub->RemoveDragEvent();
893     }
894     frameNode->SetCustomerDraggable(draggable);
895 }
896 
EnableAnalyzer(bool isEnableAnalyzer)897 void ImageModelNG::EnableAnalyzer(bool isEnableAnalyzer)
898 {
899     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
900     CHECK_NULL_VOID(pattern);
901     pattern->EnableAnalyzer(isEnableAnalyzer);
902 }
903 
SetImageAnalyzerConfig(const ImageAnalyzerConfig & config)904 void ImageModelNG::SetImageAnalyzerConfig(const ImageAnalyzerConfig& config)
905 {
906     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
907     CHECK_NULL_VOID(pattern);
908     pattern->SetImageAnalyzerConfig(config);
909 }
910 
SetImageAnalyzerConfig(void * config)911 void ImageModelNG::SetImageAnalyzerConfig(void* config)
912 {
913     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
914     CHECK_NULL_VOID(pattern);
915     pattern->SetImageAnalyzerConfig(config);
916 }
917 
SetImageAIOptions(void * options)918 void ImageModelNG::SetImageAIOptions(void* options)
919 {
920     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
921     CHECK_NULL_VOID(pattern);
922     pattern->SetImageAIOptions(options);
923 }
924 
IsSrcSvgImage(FrameNode * frameNode)925 bool ImageModelNG::IsSrcSvgImage(FrameNode* frameNode)
926 {
927     return false;
928 }
929 
SetOnComplete(FrameNode * frameNode,std::function<void (const LoadImageSuccessEvent & info)> && callback)930 void ImageModelNG::SetOnComplete(
931     FrameNode* frameNode, std::function<void(const LoadImageSuccessEvent& info)>&& callback)
932 {
933     CHECK_NULL_VOID(frameNode);
934     auto eventHub = frameNode->GetOrCreateEventHub<ImageEventHub>();
935     CHECK_NULL_VOID(eventHub);
936     eventHub->SetOnComplete(std::move(callback));
937 }
938 
SetOnError(FrameNode * frameNode,std::function<void (const LoadImageFailEvent & info)> && callback)939 void ImageModelNG::SetOnError(FrameNode* frameNode, std::function<void(const LoadImageFailEvent& info)>&& callback)
940 {
941     CHECK_NULL_VOID(frameNode);
942     auto eventHub = frameNode->GetOrCreateEventHub<ImageEventHub>();
943     CHECK_NULL_VOID(eventHub);
944     eventHub->SetOnError(std::move(callback));
945 }
946 
SetOnSvgPlayFinish(FrameNode * frameNode,std::function<void ()> && callback)947 void ImageModelNG::SetOnSvgPlayFinish(FrameNode* frameNode, std::function<void()>&& callback)
948 {
949     CHECK_NULL_VOID(frameNode);
950     auto eventHub = frameNode->GetOrCreateEventHub<ImageEventHub>();
951     CHECK_NULL_VOID(eventHub);
952     eventHub->SetOnFinish(std::move(callback));
953 }
954 
SetOnDownloadProgress(FrameNode * frameNode,std::function<void (const uint32_t & dlNow,const uint32_t & dlTotal)> && callback)955 void ImageModelNG::SetOnDownloadProgress(
956     FrameNode* frameNode, std::function<void(const uint32_t& dlNow, const uint32_t& dlTotal)>&& callback)
957 {
958     CHECK_NULL_VOID(frameNode);
959     auto imagePattern = frameNode->GetPattern<ImagePattern>();
960     CHECK_NULL_VOID(imagePattern);
961     imagePattern->SetOnProgressCallback(std::move(callback));
962 }
963 
GetSrc(FrameNode * frameNode)964 ImageSourceInfo ImageModelNG::GetSrc(FrameNode* frameNode)
965 {
966     ImageSourceInfo defaultImageSourceInfo;
967     CHECK_NULL_RETURN(frameNode, defaultImageSourceInfo);
968     auto layoutProperty = frameNode->GetLayoutProperty<ImageLayoutProperty>();
969     CHECK_NULL_RETURN(layoutProperty, defaultImageSourceInfo);
970     return layoutProperty->GetImageSourceInfo().value_or(defaultImageSourceInfo);
971 }
972 
GetObjectFit(FrameNode * frameNode)973 ImageFit ImageModelNG::GetObjectFit(FrameNode* frameNode)
974 {
975     CHECK_NULL_RETURN(frameNode, ImageFit::COVER);
976     auto layoutProperty = frameNode->GetLayoutProperty<ImageLayoutProperty>();
977     CHECK_NULL_RETURN(layoutProperty, ImageFit::COVER);
978     return layoutProperty->GetImageFit().value_or(ImageFit::COVER);
979 }
980 
GetOrientation(FrameNode * frameNode)981 ImageRotateOrientation ImageModelNG::GetOrientation(FrameNode* frameNode)
982 {
983     CHECK_NULL_RETURN(frameNode, ImageRotateOrientation::UP);
984     auto layoutProperty = frameNode->GetLayoutProperty<ImageLayoutProperty>();
985     CHECK_NULL_RETURN(layoutProperty, ImageRotateOrientation::UP);
986     return layoutProperty->GetImageRotateOrientation().value_or(ImageRotateOrientation::UP);
987 }
988 
GetImageSourceSize(FrameNode * frameNode)989 std::pair<CalcDimension, CalcDimension> ImageModelNG::GetImageSourceSize(FrameNode* frameNode)
990 {
991     auto defaultSourceSize = std::pair<CalcDimension, CalcDimension>();
992     CHECK_NULL_RETURN(frameNode, defaultSourceSize);
993     auto layoutProperty = frameNode->GetLayoutProperty<ImageLayoutProperty>();
994     CHECK_NULL_RETURN(layoutProperty, defaultSourceSize);
995     CHECK_NULL_RETURN(layoutProperty->GetImageSizeStyle(), defaultSourceSize);
996     auto sourceSize = layoutProperty->GetImageSizeStyle()->GetSourceSize().value_or(SizeF());
997     return std::make_pair(CalcDimension(sourceSize.Width()), CalcDimension(sourceSize.Height()));
998 }
999 
GetHdrBrightness(FrameNode * frameNode)1000 float ImageModelNG::GetHdrBrightness(FrameNode* frameNode)
1001 {
1002     CHECK_NULL_RETURN(frameNode, DEFAULT_HDR_BRIGHTNESS);
1003     auto paintProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
1004     CHECK_NULL_RETURN(paintProperty, DEFAULT_HDR_BRIGHTNESS);
1005     CHECK_NULL_RETURN(paintProperty->GetImagePaintStyle(), DEFAULT_HDR_BRIGHTNESS);
1006     return paintProperty->GetImagePaintStyle()->GetHdrBrightness().value_or(DEFAULT_HDR_BRIGHTNESS);
1007 }
1008 
GetMatchTextDirection(FrameNode * frameNode)1009 bool ImageModelNG::GetMatchTextDirection(FrameNode* frameNode)
1010 {
1011     CHECK_NULL_RETURN(frameNode, false);
1012     auto paintProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
1013     CHECK_NULL_RETURN(paintProperty, false);
1014     CHECK_NULL_RETURN(paintProperty->GetImagePaintStyle(), false);
1015     return paintProperty->GetImagePaintStyle()->GetMatchTextDirection().value_or(false);
1016 }
1017 
GetEnableAnalyzer(FrameNode * frameNode)1018 bool ImageModelNG::GetEnableAnalyzer(FrameNode* frameNode)
1019 {
1020     CHECK_NULL_RETURN(frameNode, false);
1021     auto imagePattern = frameNode->GetPattern<ImagePattern>();
1022     CHECK_NULL_RETURN(imagePattern, false);
1023     return imagePattern->IsEnableAnalyzer();
1024 }
1025 
GetDynamicRangeMode(FrameNode * frameNode)1026 DynamicRangeMode ImageModelNG::GetDynamicRangeMode(FrameNode* frameNode)
1027 {
1028     CHECK_NULL_RETURN(frameNode, DynamicRangeMode::STANDARD);
1029     auto paintProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
1030     CHECK_NULL_RETURN(paintProperty, DynamicRangeMode::STANDARD);
1031     CHECK_NULL_RETURN(paintProperty->GetImagePaintStyle(), DynamicRangeMode::STANDARD);
1032     return paintProperty->GetImagePaintStyle()->GetDynamicMode().value_or(DynamicRangeMode::STANDARD);
1033 }
1034 
GetImageMatrix(FrameNode * frameNode)1035 Matrix4 ImageModelNG::GetImageMatrix(FrameNode* frameNode)
1036 {
1037     Matrix4 matrix4;
1038     CHECK_NULL_RETURN(frameNode, matrix4);
1039     auto renderProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
1040     CHECK_NULL_RETURN(renderProperty, matrix4);
1041     return renderProperty->GetImageMatrix().value_or(matrix4);
1042 }
1043 
GetInterpolation(FrameNode * frameNode)1044 ImageInterpolation ImageModelNG::GetInterpolation(FrameNode* frameNode)
1045 {
1046     CHECK_NULL_RETURN(frameNode, ImageInterpolation::NONE);
1047     auto imagePattern = frameNode->GetPattern<ImagePattern>();
1048     CHECK_NULL_RETURN(imagePattern, ImageInterpolation::NONE);
1049     auto defaultInterpolation = imagePattern->GetDefaultInterpolation();
1050     auto paintProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
1051     CHECK_NULL_RETURN(paintProperty, defaultInterpolation);
1052     CHECK_NULL_RETURN(paintProperty->GetImagePaintStyle(), defaultInterpolation);
1053     return paintProperty->GetImagePaintStyle()->GetImageInterpolation().value_or(defaultInterpolation);
1054 }
1055 
GetObjectRepeat(FrameNode * frameNode)1056 ImageRepeat ImageModelNG::GetObjectRepeat(FrameNode* frameNode)
1057 {
1058     CHECK_NULL_RETURN(frameNode, ImageRepeat::NO_REPEAT);
1059     auto paintProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
1060     CHECK_NULL_RETURN(paintProperty, ImageRepeat::NO_REPEAT);
1061     CHECK_NULL_RETURN(paintProperty->GetImagePaintStyle(), ImageRepeat::NO_REPEAT);
1062     return paintProperty->GetImagePaintStyle()->GetImageRepeat().value_or(ImageRepeat::NO_REPEAT);
1063 }
1064 
GetColorFilter(FrameNode * frameNode)1065 std::vector<float> ImageModelNG::GetColorFilter(FrameNode* frameNode)
1066 {
1067     CHECK_NULL_RETURN(frameNode, DEFAULT_COLOR_FILTER);
1068     auto paintProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
1069     CHECK_NULL_RETURN(paintProperty, DEFAULT_COLOR_FILTER);
1070     CHECK_NULL_RETURN(paintProperty->GetImagePaintStyle(), DEFAULT_COLOR_FILTER);
1071     return paintProperty->GetImagePaintStyle()->GetColorFilter().value_or(DEFAULT_COLOR_FILTER);
1072 }
1073 
GetDrawingColorFilter(FrameNode * frameNode)1074 RefPtr<DrawingColorFilter> ImageModelNG::GetDrawingColorFilter(FrameNode* frameNode)
1075 {
1076     CHECK_NULL_RETURN(frameNode, nullptr);
1077     auto paintProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
1078     CHECK_NULL_RETURN(paintProperty, nullptr);
1079     CHECK_NULL_RETURN(paintProperty->GetImagePaintStyle(), nullptr);
1080     return paintProperty->GetImagePaintStyle()->GetDrawingColorFilter().value_or(nullptr);
1081 }
1082 
GetAutoResize(FrameNode * frameNode)1083 bool ImageModelNG::GetAutoResize(FrameNode* frameNode)
1084 {
1085     CHECK_NULL_RETURN(frameNode, true);
1086     auto imagePattern = frameNode->GetPattern<ImagePattern>();
1087     CHECK_NULL_RETURN(imagePattern, true);
1088     auto defaultAutoResize = imagePattern->GetDefaultAutoResize();
1089     auto layoutProperty = frameNode->GetLayoutProperty<ImageLayoutProperty>();
1090     CHECK_NULL_RETURN(layoutProperty, defaultAutoResize);
1091     CHECK_NULL_RETURN(layoutProperty->GetImageSizeStyle(), defaultAutoResize);
1092     return layoutProperty->GetImageSizeStyle()->GetAutoResize().value_or(defaultAutoResize);
1093 }
1094 
GetSyncLoad(FrameNode * frameNode)1095 bool ImageModelNG::GetSyncLoad(FrameNode* frameNode)
1096 {
1097     CHECK_NULL_RETURN(frameNode, false);
1098     auto imagePattern = frameNode->GetPattern<ImagePattern>();
1099     CHECK_NULL_RETURN(imagePattern, false);
1100     return imagePattern->GetSyncLoad();
1101 }
1102 
GetAlt(FrameNode * frameNode)1103 ImageSourceInfo ImageModelNG::GetAlt(FrameNode* frameNode)
1104 {
1105     ImageSourceInfo defaultImageSourceInfo;
1106     CHECK_NULL_RETURN(frameNode, defaultImageSourceInfo);
1107     auto layoutProperty = frameNode->GetLayoutProperty<ImageLayoutProperty>();
1108     CHECK_NULL_RETURN(layoutProperty, defaultImageSourceInfo);
1109     return layoutProperty->GetAlt().value_or(defaultImageSourceInfo);
1110 }
1111 
GetFitOriginalSize(FrameNode * frameNode)1112 bool ImageModelNG::GetFitOriginalSize(FrameNode* frameNode)
1113 {
1114     CHECK_NULL_RETURN(frameNode, false);
1115     auto layoutProperty = frameNode->GetLayoutProperty<ImageLayoutProperty>();
1116     CHECK_NULL_RETURN(layoutProperty, false);
1117     return layoutProperty->GetImageSizeStyle()->GetFitOriginalSize().value_or(false);
1118 }
1119 
GetFillColor(FrameNode * frameNode)1120 uint32_t ImageModelNG::GetFillColor(FrameNode* frameNode)
1121 {
1122     uint32_t errorCode = -1;
1123     CHECK_NULL_RETURN(frameNode, errorCode);
1124     auto paintProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
1125     CHECK_NULL_RETURN(paintProperty, errorCode);
1126     CHECK_NULL_RETURN(paintProperty->GetImagePaintStyle(), errorCode);
1127     Color color = paintProperty->GetImagePaintStyle()->GetSvgFillColor().value_or(Color());
1128     return color.GetValue();
1129 }
1130 
GetDraggable(FrameNode * frameNode)1131 bool ImageModelNG::GetDraggable(FrameNode* frameNode)
1132 {
1133     CHECK_NULL_RETURN(frameNode, false);
1134     return frameNode->IsDraggable();
1135 }
1136 
GetImageRenderMode(FrameNode * frameNode)1137 ImageRenderMode ImageModelNG::GetImageRenderMode(FrameNode* frameNode)
1138 {
1139     CHECK_NULL_RETURN(frameNode, ImageRenderMode::ORIGINAL);
1140     auto paintProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
1141     CHECK_NULL_RETURN(paintProperty, ImageRenderMode::ORIGINAL);
1142     CHECK_NULL_RETURN(paintProperty->GetImagePaintStyle(), ImageRenderMode::ORIGINAL);
1143     return paintProperty->GetImagePaintStyle()->GetImageRenderMode().value_or(ImageRenderMode::ORIGINAL);
1144 }
1145 
GetIsAnimation()1146 bool ImageModelNG::GetIsAnimation()
1147 {
1148     auto pattern = GetImagePattern();
1149     CHECK_NULL_RETURN(pattern, false);
1150     return pattern->GetIsAnimation();
1151 }
1152 
GetImagePattern()1153 ImagePattern* ImageModelNG::GetImagePattern()
1154 {
1155     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1156     CHECK_NULL_RETURN(frameNode, nullptr);
1157     return frameNode->GetPatternPtr<ImagePattern>();
1158 }
1159 
GetResizableSlice(FrameNode * frameNode)1160 ImageResizableSlice ImageModelNG::GetResizableSlice(FrameNode* frameNode)
1161 {
1162     ImageResizableSlice resizable;
1163     CHECK_NULL_RETURN(frameNode, resizable);
1164     auto renderProperty = frameNode->GetPaintProperty<ImageRenderProperty>();
1165     CHECK_NULL_RETURN(renderProperty, resizable);
1166     return renderProperty->GetImageResizableSlice().value_or(resizable);
1167 }
1168 
EnableAnalyzer(FrameNode * frameNode,bool isEnableAnalyzer)1169 void ImageModelNG::EnableAnalyzer(FrameNode* frameNode, bool isEnableAnalyzer)
1170 {
1171     CHECK_NULL_VOID(frameNode);
1172     auto imagePattern = frameNode->GetPattern<ImagePattern>();
1173     CHECK_NULL_VOID(imagePattern);
1174     imagePattern->EnableAnalyzer(isEnableAnalyzer);
1175 }
1176 
SetImageAnalyzerConfig(FrameNode * frameNode,void * config)1177 void ImageModelNG::SetImageAnalyzerConfig(FrameNode* frameNode, void* config)
1178 {
1179     CHECK_NULL_VOID(frameNode);
1180     auto imagePattern = frameNode->GetPattern<ImagePattern>();
1181     CHECK_NULL_VOID(imagePattern);
1182     imagePattern->SetImageAnalyzerConfig(config);
1183 }
1184 
ResetImageSrc(FrameNode * frameNode)1185 void ImageModelNG::ResetImageSrc(FrameNode* frameNode)
1186 {
1187     CHECK_NULL_VOID(frameNode);
1188     ImageSourceInfo sourceInfo("");
1189     sourceInfo.SetIsFromReset(true);
1190     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, sourceInfo, frameNode);
1191     auto pattern = frameNode->GetPattern<ImagePattern>();
1192     CHECK_NULL_VOID(pattern);
1193     pattern->ResetImage();
1194     if (pattern->GetImageType() == ImageType::ANIMATED_DRAWABLE) {
1195         if (pattern->GetHasSizeChanged()) {
1196             pattern->ResetPictureSize();
1197         }
1198         pattern->StopAnimation();
1199         pattern->ResetImages();
1200         if (!frameNode->GetChildren().empty()) {
1201             auto imageFrameNode = AceType::DynamicCast<FrameNode>(frameNode->GetChildren().front());
1202             ACE_RESET_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageSourceInfo, imageFrameNode);
1203             frameNode->RemoveChild(imageFrameNode);
1204         }
1205         pattern->SetImageType(ImageType::BASE);
1206     }
1207 }
1208 
ResetImageAlt(FrameNode * frameNode)1209 void ImageModelNG::ResetImageAlt(FrameNode* frameNode)
1210 {
1211     CHECK_NULL_VOID(frameNode);
1212     ImageSourceInfo sourceInfo("");
1213     sourceInfo.SetIsFromReset(true);
1214     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, Alt, sourceInfo, frameNode);
1215     auto pattern = frameNode->GetPattern<ImagePattern>();
1216     CHECK_NULL_VOID(pattern);
1217     pattern->ResetAltImage();
1218 }
1219 
SetOrientation(ImageRotateOrientation orientation)1220 void ImageModelNG::SetOrientation(ImageRotateOrientation orientation)
1221 {
1222     ACE_UPDATE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageRotateOrientation, orientation);
1223     auto pattern = ViewStackProcessor::GetInstance()->GetMainFrameNodePattern<ImagePattern>();
1224     CHECK_NULL_VOID(pattern);
1225     pattern->SetOrientation(orientation);
1226 }
1227 
SetOrientation(FrameNode * frameNode,ImageRotateOrientation orientation)1228 void ImageModelNG::SetOrientation(FrameNode* frameNode, ImageRotateOrientation orientation)
1229 {
1230     ACE_UPDATE_NODE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageRotateOrientation, orientation, frameNode);
1231     auto pattern = frameNode->GetPattern<ImagePattern>();
1232     CHECK_NULL_VOID(pattern);
1233     pattern->SetOrientation(orientation);
1234 }
1235 
HandleSrcResource(const RefPtr<ResourceObject> & resObj,const RefPtr<ImagePattern> & pattern)1236 void HandleSrcResource(const RefPtr<ResourceObject>& resObj, const RefPtr<ImagePattern>& pattern)
1237 {
1238     std::string key = "image.src";
1239     pattern->RemoveResObj(key);
1240     CHECK_NULL_VOID(resObj);
1241     auto updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern))](const RefPtr<ResourceObject>& resObj) {
1242         auto pattern = weak.Upgrade();
1243         CHECK_NULL_VOID(pattern);
1244         std::string src =
1245             ResourceManager::GetInstance().GetOrCreateResourceAdapter(resObj)->GetMediaPath(resObj->GetId());
1246         if (src.empty() && pattern->GetIsAnimation()) {
1247             pattern->SetSrcUndefined(true);
1248             return;
1249         }
1250         RefPtr<PixelMap> pixmap = nullptr;
1251         auto srcInfo = CreateSourceInfo(src, pixmap, resObj->GetBundleName(), resObj->GetModuleName());
1252         srcInfo.SetIsUriPureNumber(resObj->GetId() == -1);
1253         pattern->UpdateImageSourceinfo(srcInfo);
1254         pattern->OnConfigurationUpdate();
1255     };
1256     pattern->AddResObj(key, resObj, std::move(updateFunc));
1257 }
1258 
HandleAltResource(const RefPtr<ResourceObject> & resObj,const RefPtr<ImagePattern> & pattern)1259 void HandleAltResource(const RefPtr<ResourceObject>& resObj, const RefPtr<ImagePattern>& pattern)
1260 {
1261     std::string key = "image.alt";
1262     pattern->RemoveResObj(key);
1263     CHECK_NULL_VOID(resObj);
1264     auto updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern))](const RefPtr<ResourceObject>& resObj) {
1265         auto pattern = weak.Upgrade();
1266         CHECK_NULL_VOID(pattern);
1267         std::string src =
1268             ResourceManager::GetInstance().GetOrCreateResourceAdapter(resObj)->GetMediaPath(resObj->GetId());
1269         if (src.empty() && pattern->GetIsAnimation()) {
1270             pattern->SetSrcUndefined(true);
1271             return;
1272         }
1273         RefPtr<PixelMap> pixmap = nullptr;
1274         auto srcInfo = CreateSourceInfo(src, pixmap, resObj->GetBundleName(), resObj->GetModuleName());
1275         pattern->UpdateImageAlt(srcInfo);
1276         pattern->OnConfigurationUpdate();
1277     };
1278     pattern->AddResObj(key, resObj, std::move(updateFunc));
1279 }
1280 
HandleFillColorResource(const RefPtr<ResourceObject> & resObj,const RefPtr<ImagePattern> & pattern)1281 void HandleFillColorResource(const RefPtr<ResourceObject>& resObj, const RefPtr<ImagePattern>& pattern)
1282 {
1283     std::string key = "image.fillcolor";
1284     pattern->RemoveResObj(key);
1285     CHECK_NULL_VOID(resObj);
1286     auto updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern))](const RefPtr<ResourceObject>& resObj) {
1287         auto pattern = weak.Upgrade();
1288         CHECK_NULL_VOID(pattern);
1289         Color color;
1290         bool status = ResourceParseUtils::ParseResColor(resObj, color);
1291         if (!status) {
1292             if (Container::LessThanAPITargetVersion(PlatformVersion::VERSION_ELEVEN)) {
1293                 return;
1294             }
1295             auto pipelineContext = PipelineBase::GetCurrentContext();
1296             CHECK_NULL_VOID(pipelineContext);
1297             auto theme = pipelineContext->GetTheme<ImageTheme>();
1298             CHECK_NULL_VOID(theme);
1299             color = theme->GetFillColor();
1300         }
1301         pattern->UpdateImageFill(color);
1302     };
1303     pattern->AddResObj(key, resObj, std::move(updateFunc));
1304 }
1305 
HandleBorderRadiusResource(const RefPtr<ResourceObject> & resObj,const RefPtr<ImagePattern> & pattern)1306 void HandleBorderRadiusResource(const RefPtr<ResourceObject>& resObj, const RefPtr<ImagePattern>& pattern)
1307 {
1308     std::string key = "image.borderRadius";
1309     pattern->RemoveResObj(key);
1310     CHECK_NULL_VOID(resObj);
1311     auto updateFunc = [weak = AceType::WeakClaim(AceType::RawPtr(pattern))](const RefPtr<ResourceObject>& resObj) {
1312         auto pattern = weak.Upgrade();
1313         CHECK_NULL_VOID(pattern);
1314         auto frameNode = pattern->GetHost();
1315         CHECK_NULL_VOID(frameNode);
1316         CalcDimension borderRadiusValue;
1317         bool status = ResourceParseUtils::ParseResDimensionVp(resObj, borderRadiusValue);
1318         if (status) {
1319             BorderRadiusProperty borderRadius;
1320             borderRadius.SetRadius(borderRadiusValue);
1321             borderRadius.multiValued = false;
1322             ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, NeedBorderRadius, true);
1323             ACE_UPDATE_PAINT_PROPERTY(ImageRenderProperty, BorderRadius, borderRadius);
1324             pattern->SetNeedBorderRadius(true);
1325         }
1326     };
1327     pattern->AddResObj(key, resObj, std::move(updateFunc));
1328 }
1329 
CreateWithResourceObj(ImageResourceType resourceType,const RefPtr<ResourceObject> & resObj)1330 void ImageModelNG::CreateWithResourceObj(ImageResourceType resourceType, const RefPtr<ResourceObject>& resObj)
1331 {
1332     auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode();
1333     CHECK_NULL_VOID(frameNode);
1334     CreateWithResourceObj(frameNode , resourceType, resObj);
1335 }
1336 
CreateWithResourceObj(FrameNode * frameNode,ImageResourceType resourceType,const RefPtr<ResourceObject> & resObj)1337 void ImageModelNG::CreateWithResourceObj(
1338     FrameNode* frameNode, ImageResourceType resourceType, const RefPtr<ResourceObject>& resObj)
1339 {
1340     auto pattern = frameNode->GetPattern<ImagePattern>();
1341     CHECK_NULL_VOID(pattern);
1342     switch (resourceType) {
1343         case ImageResourceType::SRC:
1344             HandleSrcResource(resObj, pattern);
1345             break;
1346         case ImageResourceType::FILL_COLOR:
1347             HandleFillColorResource(resObj, pattern);
1348             break;
1349         case ImageResourceType::ALT:
1350             HandleAltResource(resObj, pattern);
1351             break;
1352         case ImageResourceType::BORDER_RADIUS:
1353             HandleBorderRadiusResource(resObj, pattern);
1354             break;
1355         default:
1356             break;
1357     }
1358 }
1359 
SetImageFillSetByUser(bool value)1360 void ImageModelNG::SetImageFillSetByUser(bool value)
1361 {
1362     if (SystemProperties::ConfigChangePerform()) {
1363         ACE_UPDATE_LAYOUT_PROPERTY(ImageLayoutProperty, ImageFillSetByUser, value);
1364     }
1365 }
1366 } // namespace OHOS::Ace::NG
1367 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PATTERN_IMAGE_IMAGE_MODEL_NG_CPP
1368