X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fevent%2Fimages%2Fbuffer-image-impl.cpp;h=c34dede406a3343b26c1e6152d8bf4da432fbb93;hb=d2d43506df25b63d0385270b2cbd6ccc2ca16ccb;hp=0ea5cd1c2485b1e69bea44ddf160cb2d3a584abe;hpb=8b0b50bb14b39e34a119c573cad63fd03c96b09a;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/event/images/buffer-image-impl.cpp b/dali/internal/event/images/buffer-image-impl.cpp index 0ea5cd1..c34dede 100644 --- a/dali/internal/event/images/buffer-image-impl.cpp +++ b/dali/internal/event/images/buffer-image-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * Copyright (c) 2016 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. @@ -23,10 +23,9 @@ // INTERNAL INCLUDES #include +#include #include -#include #include -#include using namespace Dali::Integration; @@ -42,11 +41,11 @@ TypeRegistration mType( typeid( Dali::BufferImage ), typeid( Dali::Image ), NULL BufferImagePtr BufferImage::New( unsigned int width, unsigned int height, - Pixel::Format pixelformat, - ReleasePolicy releasePol ) + Pixel::Format pixelformat ) { - BufferImagePtr internal = new BufferImage( width, height, pixelformat, releasePol ); + BufferImagePtr internal = new BufferImage( width, height, pixelformat ); internal->Initialize(); + internal->Update( RectArea() ); return internal; } @@ -54,19 +53,18 @@ BufferImagePtr BufferImage::New( PixelBuffer* pixBuf, unsigned int width, unsigned int height, Pixel::Format pixelformat, - unsigned int stride, - ReleasePolicy releasePol ) + unsigned int stride ) { - BufferImagePtr internal = new BufferImage( pixBuf, width, height, pixelformat, stride, releasePol ); + BufferImagePtr internal = new BufferImage( pixBuf, width, height, pixelformat, stride ); internal->Initialize(); + internal->Update( RectArea() ); return internal; } -BufferImage::BufferImage(unsigned int width, unsigned int height, Pixel::Format pixelformat, ReleasePolicy releasePol) -: Image( releasePol ), +BufferImage::BufferImage(unsigned int width, unsigned int height, Pixel::Format pixelformat) +: Image(), mInternalBuffer( NULL ), mExternalBuffer( NULL ), - mResourceClient( NULL ), mBufferSize( 0 ), mByteStride( 0 ), mBytesPerPixel( 0 ), @@ -74,7 +72,7 @@ BufferImage::BufferImage(unsigned int width, unsigned int height, Pixel::Format mPixelFormat( pixelformat ), mResourcePolicy( ResourcePolicy::OWNED_DISCARD ) { - SetupBuffer( width, height, pixelformat, width, releasePol ); + SetupBuffer( width, height, pixelformat, width ); // Allocate a persistent internal buffer mInternalBuffer = new PixelBuffer[ mBufferSize ]; @@ -84,12 +82,10 @@ BufferImage::BufferImage(PixelBuffer* pixBuf, unsigned int width, unsigned int height, Pixel::Format pixelformat, - unsigned int stride, - ReleasePolicy releasePol ) -: Image( releasePol ), + unsigned int stride) +: Image(), mInternalBuffer( NULL ), mExternalBuffer( pixBuf ), - mResourceClient( NULL ), mBufferSize( 0 ), mByteStride( 0 ), mBytesPerPixel( 0 ), @@ -97,7 +93,7 @@ BufferImage::BufferImage(PixelBuffer* pixBuf, mPixelFormat( pixelformat ), mResourcePolicy( ResourcePolicy::OWNED_DISCARD ) { - SetupBuffer( width, height, pixelformat, stride ? stride: width, releasePol ); + SetupBuffer( width, height, pixelformat, stride ? stride: width ); } BufferImage::~BufferImage() @@ -108,11 +104,8 @@ BufferImage::~BufferImage() void BufferImage::SetupBuffer( unsigned int width, unsigned int height, Pixel::Format pixelformat, - unsigned int byteStride, - ReleasePolicy releasePol ) + unsigned int byteStride ) { - ThreadLocalStorage& tls = ThreadLocalStorage::Get(); - mResourceClient = &tls.GetResourceClient(); mWidth = width; mHeight = height; mPixelFormat = pixelformat; @@ -122,7 +115,7 @@ void BufferImage::SetupBuffer( unsigned int width, mBufferSize = height * mByteStride; // Respect the desired release policy - mResourcePolicy = releasePol == Dali::Image::UNUSED ? ResourcePolicy::OWNED_DISCARD : ResourcePolicy::OWNED_RETAIN; + mResourcePolicy = ResourcePolicy::OWNED_RETAIN; } bool BufferImage::IsDataExternal() const @@ -130,41 +123,25 @@ bool BufferImage::IsDataExternal() const 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 ); -} - -void BufferImage::CreateHostBitmap() -{ - 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); + UploadArea( updateArea ); } -void BufferImage::UploadArea( ResourceId destId, const RectArea& area ) +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); 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 ) @@ -172,11 +149,11 @@ void BufferImage::UploadArea( ResourceId destId, const RectArea& area ) // 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 @@ -184,26 +161,17 @@ void BufferImage::UploadArea( ResourceId destId, const RectArea& area ) // 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 ) @@ -221,27 +189,6 @@ void BufferImage::UpdateBufferArea( PixelBuffer* src, PixelBuffer* dest, const R } } -void BufferImage::Connect() -{ - if ( !mConnectionCount++ ) - { - RectArea area; - Update( area ); - } -} - -void BufferImage::Disconnect() -{ - if ( mTicket ) - { - if ( !( --mConnectionCount ) && mReleasePolicy == Dali::Image::UNUSED ) - { - mTicket->RemoveObserver(*this); - mTicket.Reset(); - } - } -} - } // namespace Internal } // namespace Dali