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