// INTERNAL INCLUDES
#include <dali/public-api/object/type-registry.h>
+#include <dali/public-api/images/pixel-data.h>
#include <dali/internal/event/common/thread-local-storage.h>
-#include <dali/internal/event/resources/resource-client.h>
#include <dali/internal/update/manager/update-manager.h>
-#include <dali/internal/event/images/image-factory.h>
using namespace Dali::Integration;
{
BufferImagePtr internal = new BufferImage( width, height, pixelformat );
internal->Initialize();
+ internal->Update( RectArea() );
return internal;
}
{
BufferImagePtr internal = new BufferImage( pixBuf, width, height, pixelformat, stride );
internal->Initialize();
+ internal->Update( RectArea() );
return internal;
}
: Image(),
mInternalBuffer( NULL ),
mExternalBuffer( NULL ),
- mResourceClient( NULL ),
mBufferSize( 0 ),
mByteStride( 0 ),
mBytesPerPixel( 0 ),
: Image(),
mInternalBuffer( NULL ),
mExternalBuffer( pixBuf ),
- mResourceClient( NULL ),
mBufferSize( 0 ),
mByteStride( 0 ),
mBytesPerPixel( 0 ),
BufferImage::~BufferImage()
{
- if( mTicket )
- {
- mTicket->RemoveObserver(*this);
- mTicket.Reset();
- }
-
delete[] mInternalBuffer;
}
Pixel::Format pixelformat,
unsigned int byteStride )
{
- ThreadLocalStorage& tls = ThreadLocalStorage::Get();
- mResourceClient = &tls.GetResourceClient();
mWidth = width;
mHeight = height;
mPixelFormat = pixelformat;
return ( mExternalBuffer ? true : false );
}
-void BufferImage::Update( RectArea& updateArea )
+void BufferImage::Update( const RectArea& updateArea )
{
- if ( !mTicket )
+ if ( !mTexture )
{
- CreateHostBitmap();
+ mTexture = Texture::New( Dali::TextureType::TEXTURE_2D, mPixelFormat, mWidth, mHeight );
}
DALI_ASSERT_DEBUG( updateArea.x + updateArea.width <= mWidth && updateArea.y + updateArea.height <= mHeight );
- UploadArea( mTicket->GetId(), updateArea );
+ UploadArea( updateArea );
}
-void BufferImage::CreateHostBitmap()
+void BufferImage::UploadArea( const RectArea& area )
{
- Integration::Bitmap* bitmap = Bitmap::New( Bitmap::BITMAP_2D_PACKED_PIXELS, mResourcePolicy );
- Bitmap::PackedPixelsProfile* const packedBitmap = bitmap->GetPackedPixelsProfile();
- DALI_ASSERT_DEBUG(packedBitmap);
-
- packedBitmap->ReserveBuffer( mPixelFormat, mWidth, mHeight );
- DALI_ASSERT_DEBUG(bitmap->GetBuffer() != 0);
- DALI_ASSERT_DEBUG(bitmap->GetBufferSize() >= mHeight * mWidth * mBytesPerPixel );
-
- mTicket = mResourceClient->AddBitmapImage( bitmap );
- mTicket->AddObserver(*this);
-}
-
-void BufferImage::UploadArea( ResourceId destId, const RectArea& area )
-{
- Integration::Bitmap* bitmap = Bitmap::New( Bitmap::BITMAP_2D_PACKED_PIXELS, mResourcePolicy );
- Bitmap::PackedPixelsProfile* const packedBitmap = bitmap->GetPackedPixelsProfile();
- DALI_ASSERT_DEBUG(packedBitmap);
DALI_ASSERT_DEBUG( area.width <= mWidth && area.height <= mHeight );
mBufferWidth = area.width ? area.width : mWidth;
- packedBitmap->ReserveBuffer( mPixelFormat, mBufferWidth, area.height ? area.height : mHeight );
- DALI_ASSERT_DEBUG(bitmap->GetBuffer() != 0);
- DALI_ASSERT_DEBUG(bitmap->GetBufferSize() >= mBufferWidth * ( area.height ? area.height : mHeight ) * mBytesPerPixel );
+ uint32_t bufferHeight = area.height ? area.height : mHeight;
+ size_t bufferSize = mBytesPerPixel * mBufferWidth * bufferHeight;
+ unsigned char* buffer = reinterpret_cast< Dali::Integration::PixelBuffer* >( malloc( bufferSize ) );
+ DALI_ASSERT_DEBUG(buffer != 0);
// Are we uploading from an external or internal buffer ?
if ( mExternalBuffer )
// Check if we're doing the entire area without stride mismatch between source and dest ?
if( ( mByteStride == mWidth * mBytesPerPixel ) && area.IsEmpty() )
{
- memcpy( bitmap->GetBuffer(), mExternalBuffer, mBufferSize );
+ memcpy( buffer, mExternalBuffer, mBufferSize );
}
else
{
- UpdateBufferArea( mExternalBuffer, bitmap->GetBuffer(), area );
+ UpdateBufferArea( mExternalBuffer, buffer, area );
}
}
else
// Check if we're doing the entire internal buffer ?
if( area.IsEmpty() )
{
- memcpy( bitmap->GetBuffer(), mInternalBuffer, bitmap->GetBufferSize() );
+ memcpy( buffer, mInternalBuffer, bufferSize );
}
else
{
- UpdateBufferArea( mInternalBuffer, bitmap->GetBuffer(), area );
+ UpdateBufferArea( mInternalBuffer, buffer, area );
}
}
- mResourceClient->UploadBitmap( destId, bitmap, area.x, area.y );
-
-}
-
-void BufferImage::UploadBitmap( ResourceId destId, std::size_t xOffset, std::size_t yOffset )
-{
- RectArea area( xOffset, yOffset, 0, 0 );
- if ( !mTicket )
- {
- CreateHostBitmap();
- }
+ PixelDataPtr pixelData = PixelData::New( buffer, bufferSize, mBufferWidth, bufferHeight, mPixelFormat, Dali::PixelData::FREE );
+ mTexture->Upload( pixelData, 0u, 0u, area.x, area.y, mBufferWidth, bufferHeight );
- UploadArea( destId, area );
+ UploadedSignal().Emit( Dali::Image( this ) );
}
void BufferImage::UpdateBufferArea( PixelBuffer* src, PixelBuffer* dest, const RectArea& area )
}
}
-void BufferImage::Connect()
-{
- if ( !mConnectionCount++ && !mTicket )
- {
- RectArea area;
- Update( area );
- }
-}
-
-void BufferImage::Disconnect()
-{
- --mConnectionCount;
-}
-
} // namespace Internal
} // namespace Dali