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