Tizen 2.4.0 rev3 SDK Public Release
[framework/graphics/dali.git] / dali / internal / render / renderers / scene-graph-image-renderer.cpp
index 8d31438..af670d2 100644 (file)
@@ -121,12 +121,34 @@ ImageRenderer* ImageRenderer::New( NodeDataProvider& dataProvider )
 
 ImageRenderer::~ImageRenderer()
 {
+  // Note - GL cleanup is done from render-thread in OnRemove()
+}
+
+void ImageRenderer::OnRemove()
+{
   if ( mTextureId > 0 )
   {
     mTextureCacheDELETEME->RemoveObserver(mTextureId, this);
   }
 
   GlCleanup();
+
+  // Set back to defaults
+  mDataProvider = NULL;
+  mShader = NULL;
+  mTexture = NULL;
+  mBorder = Vector4( 0.45, 0.45, 0.1, 0.1 );
+  mPixelArea = PixelArea();
+  mGeometrySize = Vector2();
+  mTextureId =  0;
+  mBlendingOptions.SetBlendFunc( DEFAULT_BLENDING_SRC_FACTOR_RGB, DEFAULT_BLENDING_DEST_FACTOR_RGB, DEFAULT_BLENDING_SRC_FACTOR_ALPHA, DEFAULT_BLENDING_DEST_FACTOR_ALPHA );
+  mBlendingOptions.SetBlendEquation( DEFAULT_BLENDING_EQUATION_RGB, DEFAULT_BLENDING_EQUATION_ALPHA );
+  mBlendingOptions.SetBlendColor( Vector4::ZERO );
+  mMeshType = ImageRenderer::QUAD;
+  mIsMeshGenerated = false;
+  mBorderInPixels = false;
+  mUseBlend = false;
+  mUsePixelArea = false;
 }
 
 void ImageRenderer::SetTextureId( ResourceId textureId )
@@ -159,6 +181,21 @@ void ImageRenderer::SetNinePatchBorder( const Vector4& border, bool inPixels )
   mIsMeshGenerated = false;
 }
 
+void ImageRenderer::SetUseBlend( bool useBlend )
+{
+  mUseBlend = useBlend;
+}
+
+void ImageRenderer::SetBlendingOptions( unsigned int options )
+{
+  mBlendingOptions.SetBitmask( options );
+}
+
+void ImageRenderer::SetBlendColor( const Vector4& color )
+{
+  mBlendingOptions.SetBlendColor( color );
+}
+
 void ImageRenderer::CalculateMeshData( MeshType type, const Vector2& targetSize, bool usePixelArea )
 {
   mMeshType        = type;
@@ -204,6 +241,11 @@ bool ImageRenderer::RequiresDepthTest() const
 
 bool ImageRenderer::CheckResources()
 {
+  if( mDataProvider == NULL )
+  {
+    return false;
+  }
+
   if( mTexture == NULL )
   {
     if ( mTextureCacheDELETEME )
@@ -354,6 +396,34 @@ void ImageRenderer::DoRender( Context& context, TextureCache& textureCache, Buff
   }
 }
 
+void ImageRenderer::DoSetBlending(Context& context, BufferIndex bufferIndex )
+{
+  // Enables/disables blending mode.
+  context.SetBlend( mUseBlend );
+
+  // Set the blend color
+  const Vector4* const customColor = mBlendingOptions.GetBlendColor();
+  if( customColor )
+  {
+    context.SetCustomBlendColor( *customColor );
+  }
+  else
+  {
+    context.SetDefaultBlendColor();
+  }
+
+  // Set blend source & destination factors
+  context.BlendFuncSeparate( mBlendingOptions.GetBlendSrcFactorRgb(),
+                             mBlendingOptions.GetBlendDestFactorRgb(),
+                             mBlendingOptions.GetBlendSrcFactorAlpha(),
+                             mBlendingOptions.GetBlendDestFactorAlpha() );
+
+  // Set blend equations
+  context.BlendEquationSeparate( mBlendingOptions.GetBlendEquationRgb(),
+                                 mBlendingOptions.GetBlendEquationAlpha() );
+
+}
+
 void ImageRenderer::UpdateVertexBuffer( Context& context, GLsizeiptr size, const GLvoid *data )
 {
   // create/destroy if needed/not needed.
@@ -930,6 +1000,7 @@ ImageRenderer::ImageRenderer( NodeDataProvider& dataProvider )
   mMeshType( ImageRenderer::QUAD ),
   mIsMeshGenerated( false ),
   mBorderInPixels( false ),
+  mUseBlend( false ),
   mUsePixelArea( false )
 {
 }