AtlasManager::~AtlasManager()
{
- for ( uint32_t i = 0; i < mAtlasList.size(); ++i )
+ for ( SizeType i = 0; i < mAtlasList.size(); ++i )
{
+ mAtlasList[ i ].mAtlas.UploadedSignal().Disconnect( this, &AtlasManager::OnUpload );
delete[] mAtlasList[ i ].mStripBuffer;
}
+
+ // Are there any upload signals pending? Free up those buffer images now.
+ for ( SizeType i = 0; i < mUploadedImages.Size(); ++i )
+ {
+ delete[] mUploadedImages[ i ];
+ }
+}
+
+void AtlasManager::OnUpload( Image image )
+{
+ if ( mUploadedImages.Size() )
+ {
+ delete[] mUploadedImages[ 0 ];
+ mUploadedImages.Erase( mUploadedImages.Begin() );
+ }
+ else
+ {
+ DALI_LOG_ERROR("Atlas Image Upload List should not be empty\n");
+ }
}
Toolkit::AtlasManager::AtlasId AtlasManager::CreateAtlas( const Toolkit::AtlasManager::AtlasSize& size, Pixel::Format pixelformat )
atlasDescriptor.mSize = size;
atlasDescriptor.mPixelFormat = pixelformat;
atlasDescriptor.mNextFreeBlock = 1u; // indicate next free block will be the first ( +1 )
+ atlas.UploadedSignal().Connect( this, &AtlasManager::OnUpload );
// What size do we need for this atlas' strip buffer ( assume 32bit pixel format )?
- uint32_t neededStripSize =( blockWidth > blockHeight - DOUBLE_PIXEL_PADDING ? blockWidth : blockHeight - DOUBLE_PIXEL_PADDING ) << 2;
+ SizeType neededStripSize =( blockWidth > blockHeight - DOUBLE_PIXEL_PADDING ? blockWidth : blockHeight - DOUBLE_PIXEL_PADDING ) << 2;
atlasDescriptor.mStripBuffer = new PixelBuffer[ neededStripSize ];
memset( atlasDescriptor.mStripBuffer, 0, neededStripSize );
SINGLE_PIXEL_PADDING,
blockHeight - DOUBLE_PIXEL_PADDING,
pixelformat );
+ mUploadedImages.PushBack( NULL );
atlasDescriptor.mFilledPixelImage = BufferImage::New( reinterpret_cast< PixelBuffer* >( &mFilledPixel ), 1, 1, pixelformat );
atlas.Upload( atlasDescriptor.mFilledPixelImage, 0, 0 );
{
DALI_LOG_ERROR("Uploading image to Atlas Failed!.\n");
}
+ else
+ {
+ mUploadedImages.PushBack( const_cast< BufferImage& >( image ).GetBuffer() );
+ }
// If this is the first block then we need to keep the first pixel free for underline texture
if ( block )
{
DALI_LOG_ERROR("Uploading top strip to Atlas Failed!\n");
}
+ else
+ {
+ mUploadedImages.PushBack( NULL );
+ }
// Blit left strip
if ( !mAtlasList[ atlas ].mAtlas.Upload( mAtlasList[ atlas ].mVerticalStrip,
{
DALI_LOG_ERROR("Uploading left strip to Atlas Failed!\n");
}
+ else
+ {
+ mUploadedImages.PushBack( NULL );
+ }
}
// Blit bottom strip
{
DALI_LOG_ERROR("Uploading bottom strip to Atlas Failed!.\n");
}
+ else
+ {
+ mUploadedImages.PushBack( NULL );
+ }
}
// Blit right strip
{
DALI_LOG_ERROR("Uploading right strip to Atlas Failed!.\n");
}
+ else
+ {
+ mUploadedImages.PushBack( NULL );
+ }
}
}
class AtlasManager;
typedef IntrusivePtr<AtlasManager> AtlasManagerPtr;
-class AtlasManager : public Dali::BaseObject
+class AtlasManager : public Dali::BaseObject, public ConnectionTracker
{
public:
private:
- std::vector< AtlasDescriptor > mAtlasList; // List of atlases created
- std::vector< AtlasSlotDescriptor > mImageList; // List of bitmaps store in atlases
+ std::vector< AtlasDescriptor > mAtlasList; // List of atlases created
+ std::vector< AtlasSlotDescriptor > mImageList; // List of bitmaps store in atlases
+ Vector< PixelBuffer* > mUploadedImages; // List of PixelBuffers passed to UploadedSignal
+ Toolkit::AtlasManager::AtlasSize mNewAtlasSize; // Atlas size to use in next creation
+ Toolkit::AtlasManager::AddFailPolicy mAddFailPolicy; // Policy for faling to add an Image
+ SizeType mFilledPixel; // 32Bit pixel image for underlining
SizeType CheckAtlas( SizeType atlas,
SizeType width,
void PrintMeshData( const Toolkit::AtlasManager::Mesh2D& mesh );
- Toolkit::AtlasManager::AtlasSize mNewAtlasSize;
- Toolkit::AtlasManager::AddFailPolicy mAddFailPolicy;
- uint32_t mFilledPixel;
+ void OnUpload( Image image );
+
};
} // namespace Internal