#include <unistd.h>
#include <libintl.h>
#include <xkbcommon/xkbcommon.h>
+#include <dali/devel-api/images/native-image-interface-extension.h>
namespace Dali
{
//get tbm surface from buffer
tbm_surface_h tbmSurface = static_cast< tbm_surface_h >( wl_buffer_get_user_data( buffer ) );
- widgetView->UpdateImageSource( tbmSurface );
- }
-
- if( preBuffer != NULL && tizen_remote_surface_get_version( surface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION )
- {
- tizen_remote_surface_release( surface, preBuffer );
- tbm_surface_h preTbmSurface = (tbm_surface_h)wl_buffer_get_user_data( preBuffer );
- tbm_surface_internal_unref( preTbmSurface );
- wl_buffer_destroy( preBuffer );
+ widgetView->UpdateImageSource( tbmSurface, buffer, surface);
}
remoteSurface = surface;
return ( mWidgetImageView )? true: false;
}
-void WidgetView::UpdateImageSource( tbm_surface_h source )
+
+class DestructorCallback: public CallbackBase
{
+public:
+ DestructorCallback(void *buffer ,void *surface)
+ :CallbackBase( reinterpret_cast< void* >( this ),
+ NULL, // we get the dispatcher to call function directly
+ reinterpret_cast< CallbackBase::Dispatcher>( &DestructorCallback::Dispatcher) ),
+ mWlBuffer( buffer ),
+ mRemoteSurface( surface ) {
+
+ }
+
+ void RunCallback()
+ {
+ struct wl_buffer *buffer = static_cast< struct wl_buffer* >(mWlBuffer);
+ struct tizen_remote_surface *surface = static_cast< struct tizen_remote_surface* >(mRemoteSurface);
+ if (tizen_remote_surface_get_version( surface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION) {
+ tizen_remote_surface_release( surface, buffer );
+ tbm_surface_h preTbmSurface = (tbm_surface_h)wl_buffer_get_user_data( buffer );
+ tbm_surface_internal_unref( preTbmSurface );
+ wl_buffer_destroy( buffer );
+ }
+ }
+
+ static void Dispatcher( CallbackBase& base )
+ {
+ DestructorCallback& callback( static_cast< DestructorCallback& >( base) );
+ callback.RunCallback();
+ }
+
+ ~DestructorCallback()
+ {
+ }
+
+private:
+ void *mWlBuffer ;
+ void *mRemoteSurface;
+};
+
+
+void WidgetView::UpdateImageSource( tbm_surface_h source , struct wl_buffer *buffer , struct tizen_remote_surface *surface)
+{
+ DestructorCallback* callback = new DestructorCallback( buffer, surface );
+ TriggerEventFactory triggerEventFactory;
+ TriggerEventInterface* notification = triggerEventFactory.CreateTriggerEvent( callback,
+ TriggerEventInterface::DELETE_AFTER_TRIGGER );
+
mImageSource = Dali::NativeImageSource::New( source );
Dali::NativeImage image = Dali::NativeImage::New( *mImageSource );
+ NativeImageInterfacePtr mImageSourcePtr = static_cast< NativeImageInterfacePtr >(mImageSource);
+ NativeImageInterface::Extension* extension = mImageSourcePtr->GetExtension();
+ if( extension )
+ extension->SetDestructorNotification(notification);
+
if( mWidgetImageView )
{
mWidgetImageView.SetImage( image );