The observer can be deleted before the load queue is processed.
Remove the load element from the queue when the texture is removed.
Change-Id: I290d82b1f6b77db915f400af4cd2c05e0bd9558b
END_TEST;
}
+
+namespace
+{
+
+static int gResourceReadySignalCounter = 0;
+
+void OnResourceReadySignal( Control control )
+{
+ gResourceReadySignalCounter++;
+
+ if( gResourceReadySignalCounter == 1 )
+ {
+ // Set image twice
+ ImageView::DownCast( control ).SetImage( gImage_34_RGBA );
+ ImageView::DownCast( control ).SetImage( gImage_34_RGBA );
+ }
+}
+
+}
+
+int UtcDaliImageViewSetImageOnResourceReadySignal(void)
+{
+ tet_infoline("Test setting image from within signal handler.");
+
+ ToolkitTestApplication application;
+
+ gResourceReadySignalCounter = 0;
+
+ ImageView imageView = ImageView::New( gImage_34_RGBA );
+ imageView.ResourceReadySignal().Connect( &OnResourceReadySignal );
+
+ Stage::GetCurrent().Add( imageView );
+
+ DALI_TEST_EQUALS( Test::WaitForEventThreadTrigger( 1 ), true, TEST_LOCATION );
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS( gResourceReadySignalCounter, 2, TEST_LOCATION );
+
+ DALI_TEST_EQUALS( imageView.IsResourceReady(), true, TEST_LOCATION );
+
+ END_TEST;
+}
{
for( std::size_t i = 0; i < mImageUrls.size() ; ++i )
{
- mTextureManager.Remove( mImageUrls[i].mTextureId );
+ mTextureManager.Remove( mImageUrls[i].mTextureId, this );
}
}
}
while( !mQueue.IsEmpty() )
{
ImageFrame imageFrame = mQueue.PopFront();
- mTextureManager.Remove( mImageUrls[ imageFrame.mUrlIndex ].mTextureId );
+ mTextureManager.Remove( mImageUrls[ imageFrame.mUrlIndex ].mTextureId, this );
}
}
}
TextureSet textureSet;
ImageFrame imageFrame = mQueue.PopFront();
- mTextureManager.Remove( mImageUrls[ imageFrame.mUrlIndex ].mTextureId );
+ mTextureManager.Remove( mImageUrls[ imageFrame.mUrlIndex ].mTextureId, this );
mImageUrls[ imageFrame.mUrlIndex ].mTextureId = TextureManager::INVALID_TEXTURE_ID;
if( IsFrontReady() == true )
if( mMaskingData->mAlphaMaskId != TextureManager::INVALID_TEXTURE_ID )
{
TextureManager& textureManager = mFactoryCache.GetTextureManager();
- textureManager.Remove( mMaskingData->mAlphaMaskId );
+ textureManager.Remove( mMaskingData->mAlphaMaskId, this );
}
}
{
if( mTextureId != TextureManager::INVALID_TEXTURE_ID )
{
- mFactoryCache.GetTextureManager().Remove( mTextureId );
+ mFactoryCache.GetTextureManager().Remove( mTextureId, this );
mTextureId = TextureManager::INVALID_TEXTURE_ID;
}
else
return textureId;
}
-void TextureManager::Remove( const TextureManager::TextureId textureId )
+void TextureManager::Remove( const TextureManager::TextureId textureId, TextureUploadObserver* observer )
{
int textureInfoIndex = GetCacheIndexFromId( textureId );
if( textureInfoIndex != INVALID_INDEX )
TextureInfo& textureInfo( mTextureInfoContainer[ textureInfoIndex ] );
DALI_LOG_INFO( gTextureManagerLogFilter, Debug::Concise,
- "TextureManager::Remove(%d) url:%s\n cacheIdx:%d loadState:%s\n",
+ "TextureManager::Remove(%d) url:%s\n cacheIdx:%d loadState:%s reference count = %d\n",
textureId, textureInfo.url.GetUrl().c_str(),
- textureInfoIndex, GET_LOAD_STATE_STRING( textureInfo.loadState ) );
+ textureInfoIndex, GET_LOAD_STATE_STRING( textureInfo.loadState ), textureInfo.referenceCount );
// Decrement the reference count and check if this is the last user of this Texture.
if( --textureInfo.referenceCount <= 0 )
mTextureInfoContainer.erase( mTextureInfoContainer.begin() + textureInfoIndex );
}
}
+
+ if( observer )
+ {
+ // Remove element from the LoadQueue
+ for( auto&& element : mLoadQueue )
+ {
+ if( element.mObserver == observer )
+ {
+ mLoadQueue.Erase( &element );
+ break;
+ }
+ }
+ }
}
}
}
else
{
- Remove( textureInfo.textureId );
+ Remove( textureInfo.textureId, nullptr );
}
}
}
* occurrence of a Texture will cause its removal internally.
*
* @param[in] textureId The ID of the Texture to remove.
+ * @param[in] textureObserver The texture observer.
*/
- void Remove( const TextureManager::TextureId textureId );
+ void Remove( const TextureManager::TextureId textureId, TextureUploadObserver* textureObserver );
/**
* @brief Get the visualUrl associated with the texture id.