#include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
#include <dali-toolkit/devel-api/controls/control-devel.h>
#include <dali/integration-api/debug.h>
+#include <dali/devel-api/adaptor-framework/event-thread-callback.h>
#include <string.h>
#ifdef ECORE_WL2
#include <Ecore_Wl2.h>
} // unnamed namespace
+
+WidgetBuffer::WidgetBuffer(wl_buffer* buffer, Dali::WidgetView::Internal::WidgetView& widgetview, Dali::NativeImageSourcePtr source)
+: mBuffer(buffer),
+ mWidgetView(widgetview),
+ mImageSource(source)
+{
+}
+
+WidgetBuffer::~WidgetBuffer()
+{
+ if(mImageSource)
+ {
+ Dali::DevelNativeImageSource::SetResourceDestructionCallback(*mImageSource,NULL);
+ }
+}
+
+void WidgetBuffer::OnResourceDestruction()
+{
+ mWidgetView.DeleteBuffer(mBuffer, this);
+}
+
+wl_buffer* WidgetBuffer::GetBuffer() const
+{
+ return mBuffer;
+}
+
Dali::WidgetView::WidgetView WidgetView::New( const std::string& widgetId, const std::string& contentInfo, int width, int height, float updatePeriod )
{
// Create the implementation, temporarily owned on stack
textureSet.SetTexture( 0u, texture );
mRenderer.SetProperty( Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA, true );
}
+
+ // Register a callback using WidgetBuffer class
+ auto widgetBuffer = new WidgetBuffer(mBuffer,*this,mImageSource);
+ Dali::DevelNativeImageSource::SetResourceDestructionCallback(*mImageSource, new EventThreadCallback(MakeCallback(widgetBuffer, &WidgetBuffer::OnResourceDestruction)));
+ mBufferContainer.push_back(std::unique_ptr<WidgetBuffer>(widgetBuffer));
}
bool WidgetView::OnTouch( Dali::Actor actor, const Dali::TouchEvent& event )
return false;
}
+void WidgetView::DeleteBuffer(wl_buffer* buffer, WidgetBuffer* widgetBuffer)
+{
+ bool findBuffer = false;
+ auto bufferInstance = std::find_if( mBufferContainer.begin(),
+ mBufferContainer.end(),
+ [widgetBuffer]( std::unique_ptr<WidgetBuffer>& instanceBuffer)
+ { return (instanceBuffer->GetBuffer() == widgetBuffer->GetBuffer()); } );
+ if(bufferInstance != mBufferContainer.end())
+ {
+ mBufferContainer.erase(bufferInstance);
+ findBuffer = true;
+ }
+
+ if( findBuffer && mWatcherHandle != NULL )
+ {
+ if( mRemoteSurface != NULL && buffer != NULL && tizen_remote_surface_get_version( mRemoteSurface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION )
+ {
+ screen_connector_toolkit_dispose_buffer( mWatcherHandle , buffer );
+ }
+ }
+}
+
Vector3 WidgetView::GetNaturalSize()
{
Vector3 size;
{
if( mWatcherHandle != NULL )
{
- if( mRemoteSurface != NULL && mBuffer != NULL && tizen_remote_surface_get_version( mRemoteSurface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION )
+ if( mBufferContainer.size() )
{
- screen_connector_toolkit_dispose_buffer( mWatcherHandle , mBuffer );
+ for( std::vector<std::unique_ptr<WidgetBuffer>>::iterator iter = mBufferContainer.begin(), endIter = mBufferContainer.end(); iter != endIter; ++iter )
+ {
+ if( mRemoteSurface != NULL && (*iter)->GetBuffer() != NULL && tizen_remote_surface_get_version( mRemoteSurface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION )
+ {
+ screen_connector_toolkit_dispose_buffer( mWatcherHandle , (*iter)->GetBuffer() );
+ }
+ }
+ mBufferContainer.clear();
mBuffer = NULL;
}
DALI_LOG_ERROR("tbm surface is NULL");
return;
}
- UpdateImageSource( tbmSurface );
- if( mBuffer != NULL && tizen_remote_surface_get_version( surface ) >= TIZEN_REMOTE_SURFACE_RELEASE_SINCE_VERSION )
- {
- if( mWatcherHandle != NULL )
- {
- screen_connector_toolkit_dispose_buffer( mWatcherHandle , mBuffer );
- }
- else
- {
- DALI_LOG_ERROR("WidgetView can't dispose buffer because mWatcherHandle is invalid. ");
- }
- }
-
- mRemoteSurface = surface;
mBuffer = buffer;
+ UpdateImageSource( tbmSurface );
+ mRemoteSurface = surface;
}
bool WidgetView::LaunchWidget()
// EXTERNAL INCLUDES
#include <dali/public-api/rendering/renderer.h>
-#include <dali/public-api/adaptor-framework/native-image-source.h>
#include <dali-toolkit/public-api/controls/control-impl.h>
#include <dali-toolkit/public-api/controls/text-controls/text-label.h>
#include <dali-toolkit/public-api/controls/image-view/image-view.h>
#include <wayland-extension/tizen-remote-surface-client-protocol.h>
#include <tbm_surface.h>
#include <screen_connector_toolkit.h>
+#include <dali/devel-api/adaptor-framework/native-image-source-devel.h>
#include <dali/devel-api/adaptor-framework/window-devel.h>
#include <dali/public-api/object/property-notification.h>
namespace Internal
{
+/**
+ * @brief WidgetBuffer is a class for managing resource the widget's buffer
+ */
+class WidgetBuffer
+{
+public:
+
+ /**
+ * @brief Construct a new Widget Buffer object
+ *
+ */
+ WidgetBuffer( wl_buffer* buffer, Dali::WidgetView::Internal::WidgetView& widgetview, Dali::NativeImageSourcePtr source);
+
+ /**
+ * @brief Destroy the Widget Buffer object
+ *
+ */
+ virtual ~WidgetBuffer();
+
+ /**
+ * @brief Get the wayland buffer
+ *
+ * @return wl_buffer*
+ */
+ wl_buffer* GetBuffer() const;
+
+ /**
+ * @brief Callback for ResourceDestruction
+ *
+ */
+ void OnResourceDestruction();
+
+ WidgetBuffer( const WidgetBuffer& );
+
+ WidgetBuffer& operator= ( const WidgetBuffer& );
+
+private:
+
+ wl_buffer* mBuffer;
+ Dali::WidgetView::Internal::WidgetView& mWidgetView;
+ Dali::NativeImageSourcePtr mImageSource;
+};
+
class WidgetView : public Toolkit::Internal::Control
{
public:
*/
void UpdateImageSource( tbm_surface_h source );
+ /**
+ * @brief Delete a buffer and its resource.
+ *
+ * @param buffer the wayland buffer
+ * @param widgetBuffer a pointer of widgetbuffer
+ */
+ void DeleteBuffer(wl_buffer* buffer, WidgetBuffer* widgetBuffer);
+
/**
* @brief Callback for touch event
*/
screen_connector_toolkit_h mWatcherHandle; ///< Handle for screen connector
tizen_remote_surface* mRemoteSurface; ///< RemoteSurface for controlling events and visibillity
wl_buffer* mBuffer; ///< Buffer for screen_connector. WidgetView need to release previous buffer
+ std::vector<std::unique_ptr<WidgetBuffer>> mBufferContainer;
bool mCreated; ///< Check whether widget instance is created or not
bool mResizeRequired; ///< Check whether widget instance need to resize.
bool mPaused; ///< Check whether widget is paused or not
bool mPausedManually; ///< Check whether widget is paused or not by application
bool mWindowVisible; ///< Check whether window is visible or not
bool mPreviewEnable; ///< Check whether preview is enable or not
-
Dali::Property::Map mEffectPropertyMap; ///< Shader for effect
// Notification for property change confirmation