[Tizen] Restore Uploaded signal for BufferImage and ResourceImage
[platform/core/uifw/dali-core.git] / dali / internal / event / images / buffer-image-impl.cpp
index 0ea5cd1..c34dede 100644 (file)
@@ -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.
 
 // 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;
 
@@ -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