X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fvisuals%2Fanimated-image%2Ffixed-image-cache.cpp;h=e751f902b495c52c3362e484936fcf863062971f;hb=HEAD;hp=7cb6ce334a2f08a7ad2dcdb75a8ca1483c323370;hpb=ca51ee97baf5f41ecf741e22d865ff6c9e0bf769;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/visuals/animated-image/fixed-image-cache.cpp b/dali-toolkit/internal/visuals/animated-image/fixed-image-cache.cpp index 7cb6ce3..e51870b 100644 --- a/dali-toolkit/internal/visuals/animated-image/fixed-image-cache.cpp +++ b/dali-toolkit/internal/visuals/animated-image/fixed-image-cache.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. @@ -21,6 +21,7 @@ #include // For ImageAtlasManagerPtr // EXTERNAL HEADERS +#include #include namespace Dali @@ -36,14 +37,18 @@ constexpr uint32_t FIRST_FRAME_INDEX = 0u; } // namespace FixedImageCache::FixedImageCache(TextureManager& textureManager, + ImageDimensions size, + Dali::FittingMode::Type fittingMode, + Dali::SamplingMode::Type samplingMode, UrlList& urlList, TextureManager::MaskingDataPointer& maskingData, ImageCache::FrameReadyObserver& observer, uint32_t batchSize, - uint32_t interval) -: ImageCache(textureManager, maskingData, observer, batchSize, interval), + uint32_t interval, + bool preMultiplyOnLoad) +: ImageCache(textureManager, size, fittingMode, samplingMode, maskingData, observer, batchSize, interval, preMultiplyOnLoad), mImageUrls(urlList), - mFront(FIRST_FRAME_INDEX) + mCurrentFrameIndex(FIRST_FRAME_INDEX) { mReadyFlags.reserve(mImageUrls.size()); } @@ -62,18 +67,26 @@ TextureSet FixedImageCache::Frame(uint32_t frameIndex) return textureSet; } - while(mReadyFlags.size() < mImageUrls.size() && - (frameIndex > mFront || mReadyFlags.empty())) + mCurrentFrameIndex = frameIndex; + + bool batchRequested = false; + + // Make ensure that current frameIndex load requested. + while(mReadyFlags.size() <= frameIndex) { - ++mFront; + batchRequested = true; LoadBatch(); } - mFront = frameIndex; + // Request batch only 1 times for this function. + if(!batchRequested && mReadyFlags.size() < mImageUrls.size()) + { + LoadBatch(); + } - if(IsFrontReady() && mLoadState != TextureManager::LoadState::LOAD_FAILED) + if(IsFrameReady(mCurrentFrameIndex) && mLoadState != TextureManager::LoadState::LOAD_FAILED) { - textureSet = GetFrontTextureSet(); + textureSet = GetTextureSet(mCurrentFrameIndex); } return textureSet; @@ -93,7 +106,7 @@ uint32_t FixedImageCache::GetFrameInterval(uint32_t frameIndex) const int32_t FixedImageCache::GetCurrentFrameIndex() const { - return static_cast(mFront); + return static_cast(mCurrentFrameIndex); } int32_t FixedImageCache::GetTotalFrameCount() const @@ -101,9 +114,9 @@ int32_t FixedImageCache::GetTotalFrameCount() const return mImageUrls.size(); } -bool FixedImageCache::IsFrontReady() const +bool FixedImageCache::IsFrameReady(uint32_t frameIndex) const { - return (mReadyFlags.size() > 0 && mReadyFlags[mFront] == true); + return ((mReadyFlags.size() > 0) && (mReadyFlags[frameIndex] == true)); } void FixedImageCache::LoadBatch() @@ -130,40 +143,38 @@ void FixedImageCache::LoadBatch() ImageAtlasManagerPtr imageAtlasManager = nullptr; Vector4 textureRect; Dali::ImageDimensions textureRectSize; - auto preMultiply = TextureManager::MultiplyOnLoad::LOAD_WITHOUT_MULTIPLY; - mTextureManager.LoadTexture(url, ImageDimensions(), FittingMode::SCALE_TO_FILL, SamplingMode::BOX_THEN_LINEAR, mMaskingData, synchronousLoading, mImageUrls[frameIndex].mTextureId, textureRect, textureRectSize, atlasingStatus, loadingStatus, this, atlasObserver, imageAtlasManager, ENABLE_ORIENTATION_CORRECTION, TextureManager::ReloadPolicy::CACHED, preMultiply); - mRequestingLoad = false; + auto preMultiplyOnLoading = mPreMultiplyOnLoad ? TextureManager::MultiplyOnLoad::MULTIPLY_ON_LOAD + : TextureManager::MultiplyOnLoad::LOAD_WITHOUT_MULTIPLY; + + TextureManager::TextureId loadTextureId = TextureManager::INVALID_TEXTURE_ID; + mTextureManager.LoadTexture(url, mDesiredSize, mFittingMode, mSamplingMode, mMaskingData, synchronousLoading, loadTextureId, textureRect, textureRectSize, atlasingStatus, loadingStatus, this, atlasObserver, imageAtlasManager, ENABLE_ORIENTATION_CORRECTION, TextureManager::ReloadPolicy::CACHED, preMultiplyOnLoading); + mImageUrls[frameIndex].mTextureId = loadTextureId; + mRequestingLoad = false; } } -TextureSet FixedImageCache::GetFrontTextureSet() const +TextureSet FixedImageCache::GetTextureSet(uint32_t frameIndex) const { - TextureSet textureSet = mTextureManager.GetTextureSet(mImageUrls[mFront].mTextureId); - if(textureSet) - { - Sampler sampler = Sampler::New(); - sampler.SetWrapMode(Dali::WrapMode::Type::DEFAULT, Dali::WrapMode::Type::DEFAULT); - textureSet.SetSampler(0u, sampler); - } + TextureSet textureSet = mTextureManager.GetTextureSet(mImageUrls[frameIndex].mTextureId); return textureSet; } -void FixedImageCache::CheckFrontFrame(bool wasReady) +void FixedImageCache::MakeReady(bool wasReady, uint32_t frameIndex, bool preMultiplied) { - if(wasReady == false && IsFrontReady()) + if(wasReady == false && IsFrameReady(frameIndex)) { - mObserver.FrameReady(GetFrontTextureSet(), mInterval); + mObserver.FrameReady(GetTextureSet(frameIndex), mInterval, preMultiplied); } } void FixedImageCache::ClearCache() { - if(mTextureManagerAlive) + if(Dali::Adaptor::IsAvailable()) { for(std::size_t i = 0; i < mImageUrls.size(); ++i) { - mTextureManager.Remove(mImageUrls[i].mTextureId, this); + mTextureManager.RequestRemove(mImageUrls[i].mTextureId, this); mImageUrls[i].mTextureId = TextureManager::INVALID_TEXTURE_ID; } } @@ -179,8 +190,8 @@ void FixedImageCache::LoadComplete(bool loadSuccess, TextureInformation textureI { if(loadSuccess) { - mLoadState = TextureManager::LoadState::LOAD_FINISHED; - bool frontFrameReady = IsFrontReady(); + mLoadState = TextureManager::LoadState::LOAD_FINISHED; + bool wasCurrentFrameReady = IsFrameReady(mCurrentFrameIndex); if(!mRequestingLoad) { for(std::size_t i = 0; i < mImageUrls.size(); ++i) @@ -194,14 +205,20 @@ void FixedImageCache::LoadComplete(bool loadSuccess, TextureInformation textureI } else { - mReadyFlags.back() = true; + DALI_ASSERT_ALWAYS(mReadyFlags.size() > 0u && "Some FixedImageCache::LoadBatch() called mismatched!"); + size_t i = mReadyFlags.size() - 1u; + + // texture id might not setup yet. Update it now. + mImageUrls[i].mTextureId = textureInformation.textureId; + mReadyFlags[i] = true; } - CheckFrontFrame(frontFrameReady); + MakeReady(wasCurrentFrameReady, mCurrentFrameIndex, textureInformation.preMultiplied); } else { mLoadState = TextureManager::LoadState::LOAD_FAILED; - mObserver.FrameReady(TextureSet(), 0); + // preMultiplied should be false because broken image don't premultiply alpha on load + mObserver.FrameReady(TextureSet(), 0, false); } }