X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Fnpatch%2Fnpatch-visual.cpp;h=f95a7965f782c90605dba5d15f12d5ac5ec685ce;hp=bca8d0376eabf49ad11a01fbd6464578f20fae50;hb=b861f4c549049d55142a0f913bd1fab701511544;hpb=076f84a43592f26ff0aa2bced54583f712800fe3 diff --git a/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp b/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp index bca8d03..f95a796 100644 --- a/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp +++ b/dali-toolkit/internal/visuals/npatch/npatch-visual.cpp @@ -28,6 +28,7 @@ #include #include #include +#include #include #include #include @@ -46,7 +47,7 @@ namespace Internal { namespace { -const int CUSTOM_PROPERTY_COUNT(10); // 5 transform properties + fixed(3),stretch,aux +const int CUSTOM_PROPERTY_COUNT(5); // fixed(3),stretch,aux } /////////////////NPatchVisual//////////////// @@ -85,11 +86,29 @@ void NPatchVisual::LoadImages() } } - if(!mAuxiliaryPixelBuffer && mAuxiliaryUrl.IsValid() && (mAuxiliaryUrl.IsLocalResource() || mAuxiliaryUrl.IsBufferResource())) + if(mAuxiliaryTextureId == TextureManager::INVALID_TEXTURE_ID && mAuxiliaryUrl.IsValid() && (mAuxiliaryUrl.IsLocalResource() || mAuxiliaryUrl.IsBufferResource())) { + auto preMultiplyOnLoad = IsPreMultipliedAlphaEnabled() && !mImpl->mCustomShader + ? TextureManager::MultiplyOnLoad::MULTIPLY_ON_LOAD + : TextureManager::MultiplyOnLoad::LOAD_WITHOUT_MULTIPLY; + + TextureManager::MaskingDataPointer maskingDataPtr = nullptr; + ImageAtlasManagerPtr imageAtlasManagerPtr = nullptr; + + bool atlasing = false; + auto atlasRect = Vector4::ZERO; + auto atlasRectSize = Dali::ImageDimensions(); + + bool loadingStatus = false; + // Load the auxiliary image - auto preMultiplyOnLoading = TextureManager::MultiplyOnLoad::LOAD_WITHOUT_MULTIPLY; - mAuxiliaryPixelBuffer = textureManager.LoadPixelBuffer(mAuxiliaryUrl, Dali::ImageDimensions(), FittingMode::DEFAULT, SamplingMode::BOX_THEN_LINEAR, synchronousLoading, this, true, preMultiplyOnLoading); + mAuxiliaryTextureSet = textureManager.LoadTexture(mAuxiliaryUrl, Dali::ImageDimensions(), FittingMode::DEFAULT, SamplingMode::BOX_THEN_LINEAR, maskingDataPtr, synchronousLoading, mAuxiliaryTextureId, atlasRect, atlasRectSize, atlasing, loadingStatus, WrapMode::DEFAULT, WrapMode::DEFAULT, this, nullptr, imageAtlasManagerPtr, true, TextureManager::ReloadPolicy::CACHED, preMultiplyOnLoad); + + // If synchronousLoading is true, we can check the auxiliaryResource's status now. + if(synchronousLoading) + { + mAuxiliaryResourceStatus = (mAuxiliaryTextureSet && mAuxiliaryTextureSet.GetTextureCount() > 0u) ? Toolkit::Visual::ResourceStatus::READY : Toolkit::Visual::ResourceStatus::FAILED; + } } } @@ -118,10 +137,10 @@ void NPatchVisual::GetNaturalSize(Vector2& naturalSize) } } - if(mAuxiliaryPixelBuffer) + if(mAuxiliaryTextureSet && mAuxiliaryTextureSet.GetTextureCount() > 0u) { - naturalSize.x = std::max(naturalSize.x, float(mAuxiliaryPixelBuffer.GetWidth())); - naturalSize.y = std::max(naturalSize.y, float(mAuxiliaryPixelBuffer.GetHeight())); + naturalSize.x = std::max(naturalSize.x, float(mAuxiliaryTextureSet.GetTexture(0u).GetWidth())); + naturalSize.y = std::max(naturalSize.y, float(mAuxiliaryTextureSet.GetTexture(0u).GetHeight())); } } @@ -192,40 +211,39 @@ void NPatchVisual::DoSetOnScene(Actor& actor) // load when first go on stage LoadImages(); + // Set mPlacementActor now, because some case, LoadImages can use this information in LoadComplete API. + // at this case, we try to SetResouce to mPlaceActor twice. so, we should avoid that case. + mPlacementActor = actor; + const NPatchData* data; - if(mLoader.GetNPatchData(mId, data)) + if(mImpl->mRenderer && mLoader.GetNPatchData(mId, data) && data->GetLoadingState() != NPatchData::LoadingState::LOADING) { - Geometry geometry = CreateGeometry(); - Shader shader = CreateShader(); - - mImpl->mRenderer.SetGeometry(geometry); - mImpl->mRenderer.SetShader(shader); - - mPlacementActor = actor; - if(data->GetLoadingState() != NPatchData::LoadingState::LOADING) + // If mAuxiliaryUrl need to be loaded, we should wait it until LoadComplete called. + if(!mAuxiliaryUrl.IsValid() || mAuxiliaryResourceStatus != Toolkit::Visual::ResourceStatus::PREPARING) { - if(RenderingAddOn::Get().IsValid()) - { - RenderingAddOn::Get().SubmitRenderTask(mImpl->mRenderer, data->GetRenderingMap()); - } - - ApplyTextureAndUniforms(); - actor.AddRenderer(mImpl->mRenderer); - mPlacementActor.Reset(); - - // npatch loaded and ready to display - ResourceReady(Toolkit::Visual::ResourceStatus::READY); + SetResource(); } } } void NPatchVisual::DoSetOffScene(Actor& actor) { - if((mId != NPatchData::INVALID_NPATCH_DATA_ID) && mReleasePolicy == Toolkit::ImageVisual::ReleasePolicy::DETACHED) + if(mReleasePolicy == Toolkit::ImageVisual::ReleasePolicy::DETACHED) { - mLoader.Remove(mId, this); - mImpl->mResourceStatus = Toolkit::Visual::ResourceStatus::PREPARING; - mId = NPatchData::INVALID_NPATCH_DATA_ID; + if(mId != NPatchData::INVALID_NPATCH_DATA_ID) + { + mLoader.Remove(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); + mAuxiliaryTextureId = TextureManager::INVALID_TEXTURE_ID; + mAuxiliaryResourceStatus = Toolkit::Visual::ResourceStatus::PREPARING; + mAuxiliaryTextureSet.Reset(); + } } actor.RemoveRenderer(mImpl->mRenderer); @@ -236,7 +254,7 @@ void NPatchVisual::OnSetTransform() { if(mImpl->mRenderer) { - mImpl->mTransform.RegisterUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT); + mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT); } } @@ -275,6 +293,9 @@ NPatchVisual::NPatchVisual(VisualFactoryCache& factoryCache, ImageVisualShaderFa mImageUrl(), mAuxiliaryUrl(), mId(NPatchData::INVALID_NPATCH_DATA_ID), + mAuxiliaryTextureSet(), + mAuxiliaryTextureId(TextureManager::INVALID_TEXTURE_ID), + mAuxiliaryResourceStatus(Toolkit::Visual::ResourceStatus::PREPARING), mBorderOnly(false), mBorder(), mAuxiliaryImageAlpha(0.0f), @@ -285,10 +306,23 @@ NPatchVisual::NPatchVisual(VisualFactoryCache& factoryCache, ImageVisualShaderFa NPatchVisual::~NPatchVisual() { - if(Stage::IsInstalled() && (mId != NPatchData::INVALID_NPATCH_DATA_ID) && (mReleasePolicy != Toolkit::ImageVisual::ReleasePolicy::NEVER)) + if(Stage::IsInstalled()) { - mLoader.Remove(mId, this); - mId = NPatchData::INVALID_NPATCH_DATA_ID; + if(mReleasePolicy != Toolkit::ImageVisual::ReleasePolicy::NEVER) + { + if(mId != NPatchData::INVALID_NPATCH_DATA_ID) + { + mLoader.Remove(mId, this); + mId = NPatchData::INVALID_NPATCH_DATA_ID; + } + if(mAuxiliaryTextureId != TextureManager::INVALID_TEXTURE_ID) + { + TextureManager& textureManager = mFactoryCache.GetTextureManager(); + textureManager.Remove(mAuxiliaryTextureId, this); + mAuxiliaryTextureId = TextureManager::INVALID_TEXTURE_ID; + mAuxiliaryTextureSet.Reset(); + } + } } } @@ -300,11 +334,11 @@ void NPatchVisual::OnInitialize() mFactoryCache, ImageVisualShaderFeature::FeatureBuilder()); - mImpl->mRenderer = Renderer::New(geometry, shader); + mImpl->mRenderer = VisualRenderer::New(geometry, shader); mImpl->mRenderer.ReserveCustomProperties(CUSTOM_PROPERTY_COUNT); //Register transform properties - mImpl->mTransform.RegisterUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT); + mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT); } Geometry NPatchVisual::CreateGeometry() @@ -371,10 +405,10 @@ Shader NPatchVisual::CreateShader() NPatchUtility::StretchRanges::SizeType xStretchCount = 0; NPatchUtility::StretchRanges::SizeType yStretchCount = 0; - auto fragmentShader = mAuxiliaryPixelBuffer ? SHADER_NPATCH_VISUAL_MASK_SHADER_FRAG - : SHADER_NPATCH_VISUAL_SHADER_FRAG; - auto shaderType = mAuxiliaryPixelBuffer ? VisualFactoryCache::NINE_PATCH_MASK_SHADER - : VisualFactoryCache::NINE_PATCH_SHADER; + 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; // ask loader for the regions if(mLoader.GetNPatchData(mId, data)) @@ -451,49 +485,40 @@ void NPatchVisual::ApplyTextureAndUniforms() { textureSet = data->GetTextures(); NPatchHelper::ApplyTextureAndUniforms(mImpl->mRenderer, data); + + if(mAuxiliaryResourceStatus == Toolkit::Visual::ResourceStatus::READY) + { + DALI_ASSERT_ALWAYS(mAuxiliaryTextureId != TextureManager::INVALID_TEXTURE_ID); + DALI_ASSERT_ALWAYS(mAuxiliaryTextureSet && mAuxiliaryTextureSet.GetTextureCount() > 0u); + + // TODO : This code exist due to the texture cache manager hold TextureSet, not Texture. + // 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)); + textureSet = tempTextureSet; + + mImpl->mRenderer.RegisterProperty(DevelImageVisual::Property::AUXILIARY_IMAGE_ALPHA, + AUXILIARY_IMAGE_ALPHA_NAME, + mAuxiliaryImageAlpha); + } + mImpl->mRenderer.SetTextures(textureSet); } else { DALI_LOG_ERROR("The N patch image '%s' is not a valid N patch image\n", mImageUrl.GetUrl().c_str()); - textureSet = TextureSet::New(); - Actor actor = mPlacementActor.GetHandle(); Vector2 imageSize = Vector2::ZERO; if(actor) { imageSize = actor.GetProperty(Actor::Property::SIZE).Get(); } - mFactoryCache.UpdateBrokenImageRenderer(mImpl->mRenderer, imageSize); - } - - if(mAuxiliaryPixelBuffer) - { - // If the auxiliary image is smaller than the un-stretched NPatch, use CPU resizing to enlarge it to the - // same size as the unstretched NPatch. This will give slightly higher quality results than just relying - // on GL interpolation alone. - if(mAuxiliaryPixelBuffer.GetWidth() < data->GetCroppedWidth() && - mAuxiliaryPixelBuffer.GetHeight() < data->GetCroppedHeight()) - { - mAuxiliaryPixelBuffer.Resize(data->GetCroppedWidth(), data->GetCroppedHeight()); - } - - // Note, this resets mAuxiliaryPixelBuffer handle - auto auxiliaryPixelData = Devel::PixelBuffer::Convert(mAuxiliaryPixelBuffer); - - auto texture = Texture::New(TextureType::TEXTURE_2D, - auxiliaryPixelData.GetPixelFormat(), - auxiliaryPixelData.GetWidth(), - auxiliaryPixelData.GetHeight()); - texture.Upload(auxiliaryPixelData); - textureSet.SetTexture(1, texture); - mImpl->mRenderer.RegisterProperty(DevelImageVisual::Property::AUXILIARY_IMAGE_ALPHA, - AUXILIARY_IMAGE_ALPHA_NAME, - mAuxiliaryImageAlpha); + mFactoryCache.UpdateBrokenImageRenderer(mImpl->mRenderer, imageSize, false); } - mImpl->mRenderer.SetTextures(textureSet); // Register transform properties - mImpl->mTransform.RegisterUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT); + mImpl->mTransform.SetUniforms(mImpl->mRenderer, Direction::LEFT_TO_RIGHT); } Geometry NPatchVisual::GetNinePatchGeometry(VisualFactoryCache::GeometryType subType) @@ -525,14 +550,25 @@ void NPatchVisual::SetResource() mImpl->mRenderer.SetGeometry(geometry); mImpl->mRenderer.SetShader(shader); + if(RenderingAddOn::Get().IsValid()) + { + RenderingAddOn::Get().SubmitRenderTask(mImpl->mRenderer, data->GetRenderingMap()); + } Actor actor = mPlacementActor.GetHandle(); if(actor) { ApplyTextureAndUniforms(); actor.AddRenderer(mImpl->mRenderer); mPlacementActor.Reset(); + } - // npatch loaded and ready to display + // npatch loaded and ready to display + if(data->GetLoadingState() != NPatchData::LoadingState::LOAD_COMPLETE) + { + ResourceReady(Toolkit::Visual::ResourceStatus::FAILED); + } + else + { ResourceReady(Toolkit::Visual::ResourceStatus::READY); } } @@ -540,31 +576,46 @@ void NPatchVisual::SetResource() void NPatchVisual::LoadComplete(bool loadSuccess, TextureInformation textureInformation) { - if(textureInformation.returnType == TextureUploadObserver::ReturnType::TEXTURE) + if(textureInformation.url.length() > 0) // For the Url. { - EnablePreMultipliedAlpha(textureInformation.preMultiplied); - if(!loadSuccess) + if(DALI_UNLIKELY(mId == NPatchData::INVALID_NPATCH_DATA_ID)) { - // Image loaded and ready to display - ResourceReady(Toolkit::Visual::ResourceStatus::FAILED); + // Special case when mLoader.Load call LoadComplete function before mId setup. + // We can overwrite mId. + mId = static_cast(textureInformation.textureId); } - - if(mAuxiliaryPixelBuffer || !mAuxiliaryUrl.IsValid()) + if(loadSuccess) { - SetResource(); + EnablePreMultipliedAlpha(textureInformation.preMultiplied); } } - else // for the ReturnType::PIXEL_BUFFER + else // For the AuxiliaryUrl { - if(loadSuccess && textureInformation.url == mAuxiliaryUrl.GetUrl()) + if(DALI_UNLIKELY(mAuxiliaryTextureId == TextureManager::INVALID_TEXTURE_ID)) { - mAuxiliaryPixelBuffer = textureInformation.pixelBuffer; - SetResource(); + // Special case when TextureManager.LoadTexture call LoadComplete function before mAuxiliaryTextureId setup. + // We can overwrite mAuxiliaryTextureId. + mAuxiliaryTextureId = textureInformation.textureId; + } + if(loadSuccess) + { + mAuxiliaryTextureSet = textureInformation.textureSet; + mAuxiliaryResourceStatus = Toolkit::Visual::ResourceStatus::READY; } else { - // Image loaded and ready to display - ResourceReady(Toolkit::Visual::ResourceStatus::FAILED); + mAuxiliaryResourceStatus = Toolkit::Visual::ResourceStatus::FAILED; + } + } + + // If auxiliaryUrl didn't required OR auxiliaryUrl load done. + if(!mAuxiliaryUrl.IsValid() || mAuxiliaryResourceStatus != Toolkit::Visual::ResourceStatus::PREPARING) + { + const NPatchData* data; + // and.. If Url loading done. + if(mImpl->mRenderer && mLoader.GetNPatchData(mId, data) && data->GetLoadingState() != NPatchData::LoadingState::LOADING) + { + SetResource(); } } }