#include <dali/integration-api/debug.h>
#include <dali/integration-api/gl-defines.h>
#include <cstring>
+#include <tbm_surface_internal.h>
// INTERNAL INCLUDES
#include <gl/egl-image-extensions.h>
mHeight( height ),
mOwnTbmSurface( false ),
mTbmSurface( NULL ),
+ mTbmFormat( 0 ),
mBlendingRequired( false ),
mColorDepth( depth ),
mEglImageKHR( NULL ),
if( mTbmSurface != NULL )
{
+ tbm_surface_internal_ref( mTbmSurface );
mBlendingRequired = CheckBlending( tbm_surface_get_format( mTbmSurface ) );
mWidth = tbm_surface_get_width( mTbmSurface );
mHeight = tbm_surface_get_height( mTbmSurface );
NativeImageSource::~NativeImageSource()
{
- if( mOwnTbmSurface && mTbmSurface != NULL )
+ if( mOwnTbmSurface )
{
- if( tbm_surface_destroy( mTbmSurface ) != TBM_SURFACE_ERROR_NONE )
+ if( mTbmSurface != NULL && tbm_surface_destroy( mTbmSurface ) != TBM_SURFACE_ERROR_NONE )
{
DALI_LOG_ERROR( "Failed to destroy tbm_surface\n" );
}
}
+ else
+ {
+ if( mTbmSurface != NULL )
+ {
+ tbm_surface_internal_unref( mTbmSurface );
+ }
+ }
}
Any NativeImageSource::GetNativeImageSource() const
{
cOffset = c*3;
offset = cOffset + r*stride;
- *(bufptr) = ptr[offset+2];
+ *(bufptr+cOffset) = ptr[offset+2];
*(bufptr+cOffset+1) = ptr[offset+1];
*(bufptr+cOffset+2) = ptr[offset];
}
{
cOffset = c*4;
offset = cOffset + r*stride;
- *(bufptr) = ptr[offset+3];
+ *(bufptr+cOffset) = ptr[offset+3];
*(bufptr+cOffset+1) = ptr[offset+2];
*(bufptr+cOffset+2) = ptr[offset+1];
*(bufptr+cOffset+3) = ptr[offset];
}
default:
{
- DALI_LOG_WARNING( "Tbm surface has unsupported pixel format.\n" );
-
- pixbuf.resize( 0 );
- width = 0;
- height = 0;
+ DALI_ASSERT_ALWAYS( 0 && "Tbm surface has unsupported pixel format.\n" );
return false;
}
void NativeImageSource::SetSource( Any source )
{
- if( mOwnTbmSurface && mTbmSurface != NULL )
+ if( mOwnTbmSurface )
{
- if( tbm_surface_destroy( mTbmSurface ) != TBM_SURFACE_ERROR_NONE )
+ if( mTbmSurface != NULL && tbm_surface_destroy( mTbmSurface ) != TBM_SURFACE_ERROR_NONE )
{
DALI_LOG_ERROR( "Failed to destroy tbm_surface\n" );
}
mTbmSurface = NULL;
mOwnTbmSurface = false;
}
+ else
+ {
+ if( mTbmSurface != NULL )
+ {
+ tbm_surface_internal_unref( mTbmSurface );
+ mTbmSurface = NULL;
+ }
+ }
mTbmSurface = GetSurfaceFromAny( source );
- mSetSource = true;
if( mTbmSurface != NULL )
{
+ mSetSource = true;
+ tbm_surface_internal_ref( mTbmSurface );
mBlendingRequired = CheckBlending( tbm_surface_get_format( mTbmSurface ) );
mWidth = tbm_surface_get_width( mTbmSurface );
mHeight = tbm_surface_get_height( mTbmSurface );
}
-
- if( mEglImageKHRContainer.Size() > 2 )
- {
- mEglImageExtensions->DestroyImageKHR(mEglImageKHRContainer[0]);
- mEglImageKHRContainer.Erase( mEglImageKHRContainer.Begin() );
- }
-
- mEglImageKHRContainer.PushBack( mEglImageKHR );
}
bool NativeImageSource::IsColorDepthSupported( Dali::NativeImageSource::ColorDepth colorDepth )
{
// casting from an unsigned int to a void *, which should then be cast back
// to an unsigned int in the driver.
- EGLClientBuffer eglBuffer = reinterpret_cast< EGLClientBuffer > (mTbmSurface);
+ EGLClientBuffer eglBuffer = reinterpret_cast< EGLClientBuffer >(mTbmSurface);
+ if( !eglBuffer )
+ {
+ return false;
+ }
mEglImageKHR = mEglImageExtensions->CreateImageKHR( eglBuffer );
void NativeImageSource::GlExtensionDestroy()
{
- mEglImageExtensions->DestroyImageKHR(mEglImageKHR);
+ if( mEglImageKHR )
+ {
+ mEglImageExtensions->DestroyImageKHR(mEglImageKHR);
- mEglImageKHR = NULL;
+ mEglImageKHR = NULL;
+ }
}
unsigned int NativeImageSource::TargetTexture()
void NativeImageSource::PrepareTexture()
{
- if( mSetSource && GlExtensionCreate() )
+ if( mSetSource )
{
- TargetTexture();
+ void* eglImage = mEglImageKHR;
+
+ if( GlExtensionCreate() )
+ {
+ TargetTexture();
+ }
+
+ mEglImageExtensions->DestroyImageKHR( eglImage );
+
mSetSource = false;
}
}