From 605680d1f0680352550f9720bed55b5571070bea Mon Sep 17 00:00:00 2001 From: wangjin_123 Date: Wed, 16 Jul 2025 20:47:40 +0800 Subject: [PATCH] =?UTF-8?q?=E5=8A=A8=E6=80=81=E7=85=A7=E7=89=87=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E6=94=AF=E6=8C=81=E8=BE=B9=E6=92=AD=E8=BE=B9=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: wangjin_123 --- .../movingphoto/movingphoto_model_ng.cpp | 8 ++++++ .../movingphoto/movingphoto_model_ng.h | 1 + .../movingphoto/movingphoto_napi.cpp | 21 +++++++++++++++ component_ext/movingphoto/movingphoto_napi.h | 1 + .../movingphoto/movingphoto_pattern.cpp | 26 ++++++++++++++++--- .../movingphoto/movingphoto_pattern.h | 13 ++++++++++ .../movingphoto/multimedia_movingphotoview.js | 4 +++ .../render/adapter/rosen_media_player.cpp | 14 ++++++++++ .../render/adapter/rosen_media_player.h | 2 ++ .../core/components_ng/render/media_player.h | 8 ++++++ .../movingphoto/movingphoto_test_ng.cpp | 1 - 11 files changed, 95 insertions(+), 4 deletions(-) diff --git a/component_ext/movingphoto/movingphoto_model_ng.cpp b/component_ext/movingphoto/movingphoto_model_ng.cpp index e3a59442c59..39aec35fde4 100644 --- a/component_ext/movingphoto/movingphoto_model_ng.cpp +++ b/component_ext/movingphoto/movingphoto_model_ng.cpp @@ -105,6 +105,14 @@ void MovingPhotoModelNG::SetHdrBrightness(float hdrBrightness) movingPhotoPattern->SetHdrBrightness(hdrBrightness); } +void MovingPhotoModelNG::SetEnableCameraPostprocessing(bool isEnabled) +{ + auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); + CHECK_NULL_VOID(frameNode); + auto movingPhotoPattern = AceType::DynamicCast(frameNode->GetPattern()); + movingPhotoPattern->SetEnableCameraPostprocessing(isEnabled); +} + void MovingPhotoModelNG::SetMuted(bool value) { auto frameNode = ViewStackProcessor::GetInstance()->GetMainFrameNode(); diff --git a/component_ext/movingphoto/movingphoto_model_ng.h b/component_ext/movingphoto/movingphoto_model_ng.h index 50b710c5dcd..23187acaa09 100644 --- a/component_ext/movingphoto/movingphoto_model_ng.h +++ b/component_ext/movingphoto/movingphoto_model_ng.h @@ -32,6 +32,7 @@ public: void SetImageSrcByPixelMap(RefPtr& pixMap); void SetMuted(bool muted); void SetHdrBrightness(float hdrBrightness); + void SetEnableCameraPostprocessing(bool isEnabled); void SetObjectFit(ImageFit objectFit); void SetOnComplete(MovingPhotoEventFunc&& onComplete); void SetOnStart(MovingPhotoEventFunc&& onStart); diff --git a/component_ext/movingphoto/movingphoto_napi.cpp b/component_ext/movingphoto/movingphoto_napi.cpp index 56456f5ecdb..6ad64e7fd58 100644 --- a/component_ext/movingphoto/movingphoto_napi.cpp +++ b/component_ext/movingphoto/movingphoto_napi.cpp @@ -312,6 +312,7 @@ napi_value InitView(napi_env env, napi_value exports) DECLARE_NAPI_FUNCTION("repeatPlay", JsRepeatPlay), DECLARE_NAPI_FUNCTION("enableAnalyzer", JsEnableAnalyzer), DECLARE_NAPI_FUNCTION("hdrBrightness", JsHdrBrightness), + DECLARE_NAPI_FUNCTION("setPlaybackStrategy", JsSetPlaybackStrategy), }; NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc)); return exports; @@ -576,6 +577,26 @@ napi_value JsHdrBrightness(napi_env env, napi_callback_info info) return ExtNapiUtils::CreateNull(env); } +napi_value JsSetPlaybackStrategy(napi_env env, napi_callback_info info) +{ + size_t argc = MAX_ARG_NUM; + napi_value argv[MAX_ARG_NUM] = { nullptr }; + NAPI_CALL(env, napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr)); + NAPI_ASSERT(env, argc >= ARG_NUM_ONE, "Wrong number of arguments"); + + if (!ExtNapiUtils::CheckTypeForNapiValue(env, argv[0], napi_object)) { + return ExtNapiUtils::CreateNull(env); + } + napi_value jsEnabled = nullptr; + if (napi_get_named_property(env, argv[0], "enableCameraPostprocessing", &jsEnabled) != napi_ok) { + return ExtNapiUtils::CreateNull(env); + } + bool isEnabled = ExtNapiUtils::GetBool(env, jsEnabled); + NG::MovingPhotoModelNG::GetInstance()->SetEnableCameraPostprocessing(isEnabled); + TAG_LOGI(AceLogTag::ACE_MOVING_PHOTO, "napi SetEnableCameraPostprocessing = %{public}d.", isEnabled); + return ExtNapiUtils::CreateNull(env); +} + napi_value JsRepeatPlay(napi_env env, napi_callback_info info) { size_t argc = MAX_ARG_NUM; diff --git a/component_ext/movingphoto/movingphoto_napi.h b/component_ext/movingphoto/movingphoto_napi.h index 4e0352c890b..25092d8a5bf 100644 --- a/component_ext/movingphoto/movingphoto_napi.h +++ b/component_ext/movingphoto/movingphoto_napi.h @@ -26,6 +26,7 @@ napi_value SetDynamicRangeMode(napi_env env, napi_value object); napi_value SetMovingPhotoFormat(napi_env env, napi_value object); napi_value JsMuted(napi_env env, napi_callback_info info); napi_value JsHdrBrightness(napi_env env, napi_callback_info info); +napi_value JsSetPlaybackStrategy(napi_env env, napi_callback_info info); napi_value JsObjectFit(napi_env env, napi_callback_info info); napi_value JsOnComplete(napi_env env, napi_callback_info info); napi_value JsOnStart(napi_env env, napi_callback_info info); diff --git a/component_ext/movingphoto/movingphoto_pattern.cpp b/component_ext/movingphoto/movingphoto_pattern.cpp index 29eeac4dd7a..81a138144ce 100644 --- a/component_ext/movingphoto/movingphoto_pattern.cpp +++ b/component_ext/movingphoto/movingphoto_pattern.cpp @@ -366,6 +366,7 @@ void MovingPhotoPattern::HandleLongPress(GestureEvent& info) mediaPlayer_->GetDuration(duration); SetAutoPlayPeriod(PERIOD_START, duration * US_CONVERT); } + isGestureTriggeredLongPress_ = true; Start(); } @@ -1204,7 +1205,7 @@ void MovingPhotoPattern::GetXmageHeight() std::string modeValue = imageSrc->GetProperty(HW_MNOTE_XMAGE_MODE); SizeF imageSize = SizeF(-1, -1); - if (!modeValue.empty() && modeValue != DEFAULT_EXIF_VALUE) { + if (!modeValue.empty() && modeValue != DEFAULT_EXIF_VALUE && !IsAllZeroPositionInXmage(imageSrc)) { isXmageMode_ = true; std::string bottomValue = imageSrc->GetProperty(HW_MNOTE_XMAGE_BOTTOM); if (bottomValue.empty() || bottomValue == DEFAULT_EXIF_VALUE) { @@ -1252,7 +1253,7 @@ void MovingPhotoPattern::SetXmagePosition() std::string modeValue = imageSrc->GetProperty(HW_MNOTE_XMAGE_MODE); SizeF imageSize = SizeF(-1, -1); - if (!modeValue.empty() && modeValue != DEFAULT_EXIF_VALUE) { + if (!modeValue.empty() && modeValue != DEFAULT_EXIF_VALUE && !IsAllZeroPositionInXmage(imageSrc)) { isXmageMode_ = true; xmageModeValue_ = StringUtils::StringToInt(modeValue); TAG_LOGI(AceLogTag::ACE_MOVING_PHOTO, "movingPhoto xmageModeValue_ = %{public}d", xmageModeValue_); @@ -1277,7 +1278,15 @@ void MovingPhotoPattern::SetXmagePosition() TAG_LOGI(AceLogTag::ACE_MOVING_PHOTO, "movingPhoto imageSize imageW.%{public}f, imageL %{public}f", imageSize.Width(), imageSize.Height()); } - + +bool MovingPhotoPattern::IsAllZeroPositionInXmage(const RefPtr& imageSrc) +{ + return imageSrc->GetProperty(HW_MNOTE_XMAGE_LEFT) == "0" && + imageSrc->GetProperty(HW_MNOTE_XMAGE_TOP) == "0" && + imageSrc->GetProperty(HW_MNOTE_XMAGE_RIGHT) == "0" && + imageSrc->GetProperty(HW_MNOTE_XMAGE_BOTTOM) == "0"; +} + void MovingPhotoPattern::UpdateRoundXmageProperty( RefPtr imageSrc, SizeF& imageSize, float imageW, float imageL, RefPtr& host) { @@ -1428,6 +1437,9 @@ void MovingPhotoPattern::OnMediaPlayerInitialized() } isAutoChangePlayMode_ = false; PrepareSurface(); + if (cameraPostprocessingEnabled_) { + mediaPlayer_->EnableCameraPostprocessing(); + } if (mediaPlayer_->PrepareAsync() != PREPARE_RETURN) { TAG_LOGW(AceLogTag::ACE_MOVING_PHOTO, "prepare MediaPlayer failed."); } @@ -2030,6 +2042,14 @@ void MovingPhotoPattern::Start() ContainerScope scope(instanceId_); auto context = PipelineContext::GetCurrentContext(); CHECK_NULL_VOID(context); + if (cameraPostprocessingEnabled_) { + if (isGestureTriggeredLongPress_) { + mediaPlayer_->SetCameraPostprocessing(true); + isGestureTriggeredLongPress_ = false; + } else { + mediaPlayer_->SetCameraPostprocessing(false); + } + } auto platformTask = SingleTaskExecutor::Make(context->GetTaskExecutor(), TaskExecutor::TaskType::BACKGROUND); platformTask.PostTask( diff --git a/component_ext/movingphoto/movingphoto_pattern.h b/component_ext/movingphoto/movingphoto_pattern.h index 878ad38a8a5..677d599e548 100644 --- a/component_ext/movingphoto/movingphoto_pattern.h +++ b/component_ext/movingphoto/movingphoto_pattern.h @@ -85,6 +85,11 @@ public: return hdrBrightness_; } + bool GetCameraPostprocessingEnabled() + { + return cameraPostprocessingEnabled_; + } + void SetHdrBrightness(float hdrBrightness); void OnVisibleChange(bool isVisible) override; @@ -127,6 +132,11 @@ public: return isPlayWithMask_; } + void SetEnableCameraPostprocessing(bool isEnabled) + { + cameraPostprocessingEnabled_ = isEnabled; + } + int64_t GetCurrentDateModified() { return currentDateModified_; @@ -283,6 +293,7 @@ private: bool IsSupportImageAnalyzer(); bool ShouldUpdateImageAnalyzer(); + bool IsAllZeroPositionInXmage(const RefPtr& imageSrc); void StartImageAnalyzer(); void StartUpdateImageAnalyzer(); void CreateAnalyzerOverlay(); @@ -323,6 +334,8 @@ private: bool isPlayWithMask_ = false; bool isEnableTransition_ = true; bool isStopAnimation_ = false; + bool cameraPostprocessingEnabled_ = false; + bool isGestureTriggeredLongPress_ = false; PlaybackStatus currentPlayStatus_ = PlaybackStatus::NONE; PlaybackMode autoAndRepeatLevel_ = PlaybackMode::NONE; PlaybackMode historyAutoAndRepeatLevel_ = PlaybackMode::NONE; diff --git a/component_ext/movingphoto/multimedia_movingphotoview.js b/component_ext/movingphoto/multimedia_movingphotoview.js index b319cfe0f9b..5c4afb5fede 100644 --- a/component_ext/movingphoto/multimedia_movingphotoview.js +++ b/component_ext/movingphoto/multimedia_movingphotoview.js @@ -43,6 +43,10 @@ class MovingPhotoView extends JSViewAbstract { __MovingPhotoView__.hdrBrightness(value); } + static setPlaybackStrategy(value) { + __MovingPhotoView__.setPlaybackStrategy(value); + } + static objectFit(value) { __MovingPhotoView__.objectFit(value); } diff --git a/frameworks/core/components_ng/render/adapter/rosen_media_player.cpp b/frameworks/core/components_ng/render/adapter/rosen_media_player.cpp index 1ccbd8513da..185eb2acab8 100755 --- a/frameworks/core/components_ng/render/adapter/rosen_media_player.cpp +++ b/frameworks/core/components_ng/render/adapter/rosen_media_player.cpp @@ -548,6 +548,20 @@ int32_t RosenMediaPlayer::SetPlayRangeUsWithMode(int64_t startTime, int64_t endT return mediaPlayer_->SetPlayRangeUsWithMode(startTime, endTime, ConvertToMediaSeekMode(mode)); } +int32_t RosenMediaPlayer::EnableCameraPostprocessing() +{ + LOGI("Media player start to EnableCameraPostprocessing."); + CHECK_NULL_RETURN(mediaPlayer_, -1); + return mediaPlayer_->EnableCameraPostprocessing(); +} + +int32_t RosenMediaPlayer::SetCameraPostprocessing(bool isOpen) +{ + LOGI("Media player start to SetCameraPostprocessing %{public}d.", isOpen); + CHECK_NULL_RETURN(mediaPlayer_, -1); + return mediaPlayer_->SetCameraPostprocessing(isOpen); +} + int32_t RosenMediaPlayer::SetParameter(const std::string& key, int64_t value) { LOGI("Media player start to SetParameter."); diff --git a/frameworks/core/components_ng/render/adapter/rosen_media_player.h b/frameworks/core/components_ng/render/adapter/rosen_media_player.h index b6abe2e9503..e8af23adc01 100644 --- a/frameworks/core/components_ng/render/adapter/rosen_media_player.h +++ b/frameworks/core/components_ng/render/adapter/rosen_media_player.h @@ -62,6 +62,8 @@ public: int32_t SetPlayRangeWithMode(int64_t startTime, int64_t endTime, OHOS::Ace::SeekMode mode) override; int32_t SetPlayRangeUsWithMode(int64_t startTime, int64_t endTime, SeekMode mode) override; int32_t SetParameter(const std::string& key, int64_t value) override; + int32_t EnableCameraPostprocessing() override; + int32_t SetCameraPostprocessing(bool isOpen) override; private: // Interim programme diff --git a/frameworks/core/components_ng/render/media_player.h b/frameworks/core/components_ng/render/media_player.h index 6fa8c8dcc9e..cc2e9f5f9b1 100644 --- a/frameworks/core/components_ng/render/media_player.h +++ b/frameworks/core/components_ng/render/media_player.h @@ -161,6 +161,14 @@ public: { return -1; } + virtual int32_t EnableCameraPostprocessing() + { + return -1; + } + virtual int32_t SetCameraPostprocessing(bool isOpen) + { + return -1; + } protected: diff --git a/test/unittest/core/pattern/movingphoto/movingphoto_test_ng.cpp b/test/unittest/core/pattern/movingphoto/movingphoto_test_ng.cpp index d809e6cef82..9d7e97ee661 100644 --- a/test/unittest/core/pattern/movingphoto/movingphoto_test_ng.cpp +++ b/test/unittest/core/pattern/movingphoto/movingphoto_test_ng.cpp @@ -46,7 +46,6 @@ #include "core/components_ng/pattern/text/text_pattern.h" #include "core/image/image_source_info.h" - #include "component_ext/movingphoto/movingphoto_styles.h" #include "component_ext/movingphoto/movingphoto_pattern.h" #include "component_ext/movingphoto/movingphoto_node.h" -- Gitee