From: Eunki, Hong Date: Wed, 20 Sep 2023 06:47:59 +0000 (+0900) Subject: Make ImageVisual::Property::PIXEL_AREA animatable X-Git-Tag: dali_2.2.45~2^2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=d770f13ba1f88060fdb7dcd2997cd6d8aa4524cb Make ImageVisual::Property::PIXEL_AREA animatable Since PixelArea was not animatable for visual side, we cannot animate some cases who register image visual hardly. This patch make we allow to animate PixelArea at ImageVisual, instead of ImageView directly. Change-Id: Ib00b771a2db938cf8ece17ffa4566c7b0b9bb800 Signed-off-by: Eunki, Hong --- diff --git a/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp b/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp index 30b0e1e..2186760 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-Visual.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * Copyright (c) 2023 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -5250,6 +5250,7 @@ int UtcDaliVisualGetVisualProperty03(void) static std::vector customUniforms = { + UniformData("pixelArea", Property::Type::VECTOR4), UniformData("cornerRadius", Property::Type::VECTOR4), UniformData("borderlineWidth", Property::Type::FLOAT), UniformData("borderlineColor", Property::Type::VECTOR4), @@ -5279,6 +5280,7 @@ int UtcDaliVisualGetVisualProperty03(void) application.Render(); float targetOpacity = 0.5f; + Vector4 targetPixelArea(0.0f, 1.0f, 2.0f, -0.5f); Vector4 targetCornerRadius(20.0f, 20.0f, 0.0f, 0.0f); float targetBorderlineWidth = 10.0f; Vector4 targetBorderlineColor(1.0f, 0.0f, 1.0f, 0.5f); @@ -5286,6 +5288,7 @@ int UtcDaliVisualGetVisualProperty03(void) Animation animation = Animation::New(1.0f); animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, Visual::Property::OPACITY), targetOpacity); + animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, ImageVisual::Property::PIXEL_AREA), targetPixelArea); animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Property::CORNER_RADIUS), targetCornerRadius); animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Property::BORDERLINE_WIDTH), targetBorderlineWidth); animation.AnimateTo(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, DevelVisual::Property::BORDERLINE_COLOR), targetBorderlineColor); @@ -5304,6 +5307,10 @@ int UtcDaliVisualGetVisualProperty03(void) DALI_TEST_CHECK(colorValue); DALI_TEST_EQUALS(colorValue->Get(), Vector4(1.0f, 1.0f, 1.0f, targetOpacity), TEST_LOCATION); + Property::Value* pixelAreaValue = resultMap.Find(ImageVisual::Property::PIXEL_AREA, Property::VECTOR4); + DALI_TEST_CHECK(pixelAreaValue); + DALI_TEST_EQUALS(pixelAreaValue->Get(), targetPixelArea, TEST_LOCATION); + Property::Value* cornerRadiusValue = resultMap.Find(DevelVisual::Property::CORNER_RADIUS, Property::VECTOR4); DALI_TEST_CHECK(cornerRadiusValue); DALI_TEST_EQUALS(cornerRadiusValue->Get(), targetCornerRadius, TEST_LOCATION); @@ -5321,11 +5328,15 @@ int UtcDaliVisualGetVisualProperty03(void) DALI_TEST_EQUALS(borderlineOffsetValue->Get(), targetBorderlineOffset, TEST_LOCATION); // Test uniform value + DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue("pixelArea", targetPixelArea), true, TEST_LOCATION); DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue("cornerRadius", targetCornerRadius), true, TEST_LOCATION); DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue("borderlineWidth", targetBorderlineWidth), true, TEST_LOCATION); DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue("borderlineColor", targetBorderlineColor), true, TEST_LOCATION); DALI_TEST_EQUALS(application.GetGlAbstraction().CheckUniformValue("borderlineOffset", targetBorderlineOffset), true, TEST_LOCATION); + // Test non-animatable index, for coverage. + DALI_TEST_EQUALS(DevelControl::GetVisualProperty(dummyControl, DummyControl::Property::TEST_VISUAL, ImageVisual::Property::URL).propertyIndex, Property::INVALID_INDEX, TEST_LOCATION); + END_TEST; } diff --git a/dali-toolkit/internal/visuals/image/image-visual.cpp b/dali-toolkit/internal/visuals/image/image-visual.cpp index 2f0e800..e6e07e8 100644 --- a/dali-toolkit/internal/visuals/image/image-visual.cpp +++ b/dali-toolkit/internal/visuals/image/image-visual.cpp @@ -152,6 +152,7 @@ ImageVisual::ImageVisual(VisualFactoryCache& factoryCache, Dali::SamplingMode::Type samplingMode) : Visual::Base(factoryCache, Visual::FittingMode::FILL, Toolkit::Visual::IMAGE), mPixelArea(FULL_TEXTURE_RECT), + mPixelAreaIndex(Property::INVALID_INDEX), mPlacementActor(), mImageUrl(imageUrl), mMaskingData(), @@ -372,6 +373,13 @@ void ImageVisual::DoSetProperty(Property::Index index, const Property::Value& va case Toolkit::ImageVisual::Property::PIXEL_AREA: { value.Get(mPixelArea); + + if(DALI_UNLIKELY(mImpl->mRenderer)) + { + // Unusual case. SetProperty called after OnInitialize(). + // Assume that DoAction call UPDATE_PROPERTY. + mPixelAreaIndex = mImpl->mRenderer.RegisterProperty(mPixelAreaIndex, PIXEL_AREA_UNIFORM_NAME, mPixelArea); + } break; } @@ -864,7 +872,7 @@ void ImageVisual::DoSetOnScene(Actor& actor) if(mPixelArea != FULL_TEXTURE_RECT) { - mImpl->mRenderer.RegisterProperty(PIXEL_AREA_UNIFORM_NAME, mPixelArea); + mPixelAreaIndex = mImpl->mRenderer.RegisterProperty(mPixelAreaIndex, PIXEL_AREA_UNIFORM_NAME, mPixelArea); } if(mLoadState == TextureManager::LoadState::LOAD_FINISHED) @@ -924,7 +932,17 @@ void ImageVisual::DoCreatePropertyMap(Property::Map& map) const map.Insert(Toolkit::ImageVisual::Property::FITTING_MODE, mFittingMode); map.Insert(Toolkit::ImageVisual::Property::SAMPLING_MODE, mSamplingMode); - map.Insert(Toolkit::ImageVisual::Property::PIXEL_AREA, mPixelArea); + if(mImpl->mRenderer && mPixelAreaIndex != Property::INVALID_INDEX) + { + // Update values from Renderer + Vector4 pixelArea = mImpl->mRenderer.GetProperty(mPixelAreaIndex); + map.Insert(Toolkit::ImageVisual::Property::PIXEL_AREA, pixelArea); + } + else + { + map.Insert(Toolkit::ImageVisual::Property::PIXEL_AREA, mPixelArea); + } + map.Insert(Toolkit::ImageVisual::Property::WRAP_MODE_U, mWrapModeU); map.Insert(Toolkit::ImageVisual::Property::WRAP_MODE_V, mWrapModeV); @@ -1329,6 +1347,24 @@ Shader ImageVisual::GenerateShader() const return shader; } +Dali::Property ImageVisual::OnGetPropertyObject(Dali::Property::Key key) +{ + if((key.type == Property::Key::INDEX && key.indexKey == Toolkit::ImageVisual::Property::PIXEL_AREA) || (key.type == Property::Key::STRING && key.stringKey == PIXEL_AREA_UNIFORM_NAME)) + { + if(DALI_LIKELY(mImpl->mRenderer)) + { + if(mPixelAreaIndex == Property::INVALID_INDEX) + { + mPixelAreaIndex = mImpl->mRenderer.RegisterProperty(mPixelAreaIndex, PIXEL_AREA_UNIFORM_NAME, mPixelArea); + } + return Dali::Property(mImpl->mRenderer, mPixelAreaIndex); + } + } + + Handle handle; + return Dali::Property(handle, Property::INVALID_INDEX); +} + void ImageVisual::CheckMaskTexture() { if(mMaskingData && !mMaskingData->mPreappliedMasking) diff --git a/dali-toolkit/internal/visuals/image/image-visual.h b/dali-toolkit/internal/visuals/image/image-visual.h index 7358f8a..0770f03 100644 --- a/dali-toolkit/internal/visuals/image/image-visual.h +++ b/dali-toolkit/internal/visuals/image/image-visual.h @@ -235,6 +235,11 @@ protected: */ Shader GenerateShader() const override; + /** + * @copydoc Visual::Base::OnGetPropertyObject + */ + Dali::Property OnGetPropertyObject(Dali::Property::Key key) override; + public: /** * @copydoc AtlasUploadObserver::UploadCompleted @@ -349,6 +354,7 @@ private: private: Vector4 mPixelArea; + Property::Index mPixelAreaIndex; WeakHandle mPlacementActor; VisualUrl mImageUrl; TextureManager::MaskingDataPointer mMaskingData;