X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Fnpatch%2Fnpatch-visual.cpp;h=25448994205caba0ccdc064a9cb4bf465d70a2e1;hb=HEAD;hp=8b44d996bfc1c8a681db86759cb283ff20b054a3;hpb=2bba756a645043d8c1c4023a75966401d531827c;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp b/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp index 8b44d99..dba0a16 100644 --- a/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp +++ b/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * Copyright (c) 2024 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. @@ -16,7 +16,7 @@ */ // CLASS HEADER -#include "npatch-visual.h" +#include // EXTERNAL INCLUDES #include @@ -30,6 +30,7 @@ #include #include #include +#include #include #include #include @@ -74,19 +75,19 @@ void NPatchVisual::LoadImages() TextureManager& textureManager = mFactoryCache.GetTextureManager(); bool synchronousLoading = mImpl->mFlags & Impl::IS_SYNCHRONOUS_RESOURCE_LOADING; - if(mId == NPatchData::INVALID_NPATCH_DATA_ID && (mImageUrl.IsLocalResource() || mImageUrl.IsBufferResource())) + if(mId == NPatchData::INVALID_NPATCH_DATA_ID) { bool preMultiplyOnLoad = IsPreMultipliedAlphaEnabled() && !mImpl->mCustomShader ? true : false; mId = mLoader.Load(textureManager, this, mImageUrl, mBorder, preMultiplyOnLoad, synchronousLoading); - const NPatchData* data; + NPatchDataPtr data; if(mLoader.GetNPatchData(mId, data) && data->GetLoadingState() == NPatchData::LoadingState::LOAD_COMPLETE) { EnablePreMultipliedAlpha(data->IsPreMultiplied()); } } - if(mAuxiliaryTextureId == TextureManager::INVALID_TEXTURE_ID && mAuxiliaryUrl.IsValid() && (mAuxiliaryUrl.IsLocalResource() || mAuxiliaryUrl.IsBufferResource())) + if(mAuxiliaryTextureId == TextureManager::INVALID_TEXTURE_ID && mAuxiliaryUrl.IsValid()) { auto preMultiplyOnLoad = IsPreMultipliedAlphaEnabled() && !mImpl->mCustomShader ? TextureManager::MultiplyOnLoad::MULTIPLY_ON_LOAD @@ -104,13 +105,6 @@ void NPatchVisual::LoadImages() // Load the auxiliary image mAuxiliaryTextureSet = textureManager.LoadTexture(mAuxiliaryUrl, Dali::ImageDimensions(), FittingMode::DEFAULT, SamplingMode::BOX_THEN_LINEAR, maskingDataPtr, synchronousLoading, mAuxiliaryTextureId, atlasRect, atlasRectSize, atlasing, loadingStatus, this, nullptr, imageAtlasManagerPtr, true, TextureManager::ReloadPolicy::CACHED, preMultiplyOnLoad); - if(mAuxiliaryTextureSet) - { - Sampler sampler = Sampler::New(); - sampler.SetWrapMode(WrapMode::DEFAULT, WrapMode::DEFAULT); - mAuxiliaryTextureSet.SetSampler(0u, sampler); - } - // If synchronousLoading is true, we can check the auxiliaryResource's status now. if(synchronousLoading) { @@ -125,7 +119,7 @@ void NPatchVisual::GetNaturalSize(Vector2& naturalSize) naturalSize.y = 0u; // load now if not already loaded - const NPatchData* data; + NPatchDataPtr data; if(mLoader.GetNPatchData(mId, data) && data->GetLoadingState() != NPatchData::LoadingState::LOADING) { naturalSize.x = data->GetCroppedWidth(); @@ -222,7 +216,7 @@ void NPatchVisual::DoSetOnScene(Actor& actor) // at this case, we try to SetResouce to mPlaceActor twice. so, we should avoid that case. mPlacementActor = actor; - const NPatchData* data; + NPatchDataPtr data; if(mImpl->mRenderer && mLoader.GetNPatchData(mId, data) && data->GetLoadingState() != NPatchData::LoadingState::LOADING) { // If mAuxiliaryUrl need to be loaded, we should wait it until LoadComplete called. @@ -239,14 +233,14 @@ void NPatchVisual::DoSetOffScene(Actor& actor) { if(mId != NPatchData::INVALID_NPATCH_DATA_ID) { - mLoader.Remove(mId, this); + mLoader.RequestRemove(mId, this); mImpl->mResourceStatus = Toolkit::Visual::ResourceStatus::PREPARING; mId = NPatchData::INVALID_NPATCH_DATA_ID; } if(mAuxiliaryTextureId != TextureManager::INVALID_TEXTURE_ID) { TextureManager& textureManager = mFactoryCache.GetTextureManager(); - textureManager.Remove(mAuxiliaryTextureId, this); + textureManager.RequestRemove(mAuxiliaryTextureId, this); mAuxiliaryTextureId = TextureManager::INVALID_TEXTURE_ID; mAuxiliaryResourceStatus = Toolkit::Visual::ResourceStatus::PREPARING; mAuxiliaryTextureSet.Reset(); @@ -293,7 +287,7 @@ void NPatchVisual::DoCreateInstancePropertyMap(Property::Map& map) const } NPatchVisual::NPatchVisual(VisualFactoryCache& factoryCache, ImageVisualShaderFactory& shaderFactory) -: Visual::Base(factoryCache, Visual::FittingMode::FILL, Toolkit::Visual::N_PATCH), +: Visual::Base(factoryCache, Visual::FittingMode::DONT_CARE, Toolkit::Visual::N_PATCH), mPlacementActor(), mLoader(factoryCache.GetNPatchLoader()), mImageVisualShaderFactory(shaderFactory), @@ -319,13 +313,14 @@ NPatchVisual::~NPatchVisual() { if(mId != NPatchData::INVALID_NPATCH_DATA_ID) { - mLoader.Remove(mId, this); + mLoader.RequestRemove(mId, this); mId = NPatchData::INVALID_NPATCH_DATA_ID; } if(mAuxiliaryTextureId != TextureManager::INVALID_TEXTURE_ID) { TextureManager& textureManager = mFactoryCache.GetTextureManager(); - textureManager.Remove(mAuxiliaryTextureId, this); + + textureManager.RequestRemove(mAuxiliaryTextureId, this); mAuxiliaryTextureId = TextureManager::INVALID_TEXTURE_ID; mAuxiliaryTextureSet.Reset(); } @@ -336,10 +331,11 @@ NPatchVisual::~NPatchVisual() void NPatchVisual::OnInitialize() { // Get basic geometry and shader - Geometry geometry = mFactoryCache.GetGeometry(VisualFactoryCache::QUAD_GEOMETRY); - Shader shader = mImageVisualShaderFactory.GetShader( + Geometry geometry = mFactoryCache.GetGeometry(VisualFactoryCache::QUAD_GEOMETRY); + auto imageVisualShaderFeatureBuilder = ImageVisualShaderFeatureBuilder(); + Shader shader = mImageVisualShaderFactory.GetShader( mFactoryCache, - ImageVisualShaderFeature::FeatureBuilder()); + imageVisualShaderFeatureBuilder); mImpl->mRenderer = VisualRenderer::New(geometry, shader); mImpl->mRenderer.ReserveCustomProperties(CUSTOM_PROPERTY_COUNT); @@ -350,8 +346,8 @@ void NPatchVisual::OnInitialize() Geometry NPatchVisual::CreateGeometry() { - Geometry geometry; - const NPatchData* data; + Geometry geometry; + NPatchDataPtr data; if(mLoader.GetNPatchData(mId, data) && data->GetLoadingState() == NPatchData::LoadingState::LOAD_COMPLETE) { if(data->GetStretchPixelsX().Size() == 1 && data->GetStretchPixelsY().Size() == 1) @@ -405,8 +401,8 @@ Geometry NPatchVisual::CreateGeometry() Shader NPatchVisual::CreateShader() { - Shader shader; - const NPatchData* data; + Shader shader; + NPatchDataPtr data; // 0 is either no data (load failed?) or no stretch regions on image // for both cases we use the default shader NPatchUtility::StretchRanges::SizeType xStretchCount = 0; @@ -414,8 +410,8 @@ Shader NPatchVisual::CreateShader() auto fragmentShader = mAuxiliaryResourceStatus == Toolkit::Visual::ResourceStatus::READY ? SHADER_NPATCH_VISUAL_MASK_SHADER_FRAG : SHADER_NPATCH_VISUAL_SHADER_FRAG; - auto shaderType = mAuxiliaryResourceStatus == Toolkit::Visual::ResourceStatus::READY ? VisualFactoryCache::NINE_PATCH_MASK_SHADER - : VisualFactoryCache::NINE_PATCH_SHADER; + auto shaderType = mAuxiliaryResourceStatus == Toolkit::Visual::ResourceStatus::READY ? VisualFactoryCache::NINE_PATCH_MASK_SHADER + : VisualFactoryCache::NINE_PATCH_SHADER; // ask loader for the regions if(mLoader.GetNPatchData(mId, data)) @@ -432,19 +428,20 @@ Shader NPatchVisual::CreateShader() shader = mFactoryCache.GetShader(shaderType); if(DALI_UNLIKELY(!shader)) { - shader = Shader::New(SHADER_NPATCH_VISUAL_3X3_SHADER_VERT, fragmentShader); - // Only cache vanilla 9 patch shaders - mFactoryCache.SaveShader(shaderType, shader); + shader = mFactoryCache.GenerateAndSaveShader(shaderType, SHADER_NPATCH_VISUAL_3X3_SHADER_VERT, fragmentShader); } } else if(xStretchCount > 0 || yStretchCount > 0) { + std::stringstream shaderName; + shaderName << "N_PATCH_" << xStretchCount << "x" << yStretchCount; + std::stringstream vertexShader; vertexShader << "#define FACTOR_SIZE_X " << xStretchCount + 2 << "\n" << "#define FACTOR_SIZE_Y " << yStretchCount + 2 << "\n" << SHADER_NPATCH_VISUAL_SHADER_VERT; - shader = Shader::New(vertexShader.str(), fragmentShader); + shader = Shader::New(vertexShader.str(), fragmentShader, Dali::Shader::Hint::NONE, shaderName.str()); } } else @@ -471,12 +468,15 @@ Shader NPatchVisual::CreateShader() } else if(xStretchCount > 0 || yStretchCount > 0) { + std::stringstream shaderName; + shaderName << "N_PATCH_" << xStretchCount << "x" << yStretchCount; + std::stringstream vertexShader; vertexShader << "#define FACTOR_SIZE_X " << xStretchCount + 2 << "\n" << "#define FACTOR_SIZE_Y " << yStretchCount + 2 << "\n" << SHADER_NPATCH_VISUAL_SHADER_VERT; - shader = Shader::New(vertexShader.str(), fragmentShader, hints); + shader = Shader::New(vertexShader.str(), fragmentShader, hints, shaderName.str()); } } @@ -485,13 +485,13 @@ Shader NPatchVisual::CreateShader() void NPatchVisual::ApplyTextureAndUniforms() { - const NPatchData* data; - TextureSet textureSet; + NPatchDataPtr data; + TextureSet textureSet; if(mLoader.GetNPatchData(mId, data) && data->GetLoadingState() == NPatchData::LoadingState::LOAD_COMPLETE) { textureSet = data->GetTextures(); - NPatchHelper::ApplyTextureAndUniforms(mImpl->mRenderer, data); + NPatchHelper::ApplyTextureAndUniforms(mImpl->mRenderer, data.Get()); if(mAuxiliaryResourceStatus == Toolkit::Visual::ResourceStatus::READY) { @@ -502,8 +502,8 @@ void NPatchVisual::ApplyTextureAndUniforms() // If we call textureSet.SetTexture(1, texture) directly, the cached TextureSet also be changed. // We should make pass utc-Dali-VisualFactory.cpp UtcDaliNPatchVisualAuxiliaryImage02(). TextureSet tempTextureSet = TextureSet::New(); - tempTextureSet.SetTexture(0, textureSet.GetTexture(0)); tempTextureSet.SetTexture(1, mAuxiliaryTextureSet.GetTexture(0)); + tempTextureSet.SetTexture(0, textureSet.GetTexture(0)); textureSet = tempTextureSet; mImpl->mRenderer.RegisterProperty(DevelImageVisual::Property::AUXILIARY_IMAGE_ALPHA, @@ -548,7 +548,7 @@ Geometry NPatchVisual::GetNinePatchGeometry(VisualFactoryCache::GeometryType sub void NPatchVisual::SetResource() { - const NPatchData* data; + NPatchDataPtr data; if(mImpl->mRenderer && mLoader.GetNPatchData(mId, data)) { Geometry geometry = CreateGeometry(); @@ -606,14 +606,7 @@ void NPatchVisual::LoadComplete(bool loadSuccess, TextureInformation textureInfo } if(loadSuccess) { - mAuxiliaryTextureSet = textureInformation.textureSet; - if(mAuxiliaryTextureSet) - { - Sampler sampler = Sampler::New(); - sampler.SetWrapMode(WrapMode::DEFAULT, WrapMode::DEFAULT); - mAuxiliaryTextureSet.SetSampler(0u, sampler); - } - + mAuxiliaryTextureSet = textureInformation.textureSet; mAuxiliaryResourceStatus = Toolkit::Visual::ResourceStatus::READY; } else @@ -625,7 +618,7 @@ void NPatchVisual::LoadComplete(bool loadSuccess, TextureInformation textureInfo // If auxiliaryUrl didn't required OR auxiliaryUrl load done. if(!mAuxiliaryUrl.IsValid() || mAuxiliaryResourceStatus != Toolkit::Visual::ResourceStatus::PREPARING) { - const NPatchData* data; + NPatchDataPtr data; // and.. If Url loading done. if(mImpl->mRenderer && mLoader.GetNPatchData(mId, data) && data->GetLoadingState() != NPatchData::LoadingState::LOADING) {