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