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