X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;ds=sidebyside;f=dali%2Finternal%2Frender%2Fgl-resources%2Fbitmap-texture.cpp;h=58d80c265b67dd7655aad55ffe1edc033e4fbf73;hb=2b10280985738c74efa2aa0fb956a837c69acee6;hp=e45e55342975a30c1fac96df6396575e494c9f11;hpb=d4d24b9faeb37adb170191e6fd2077b8ae6c5428;p=platform%2Fcore%2Fuifw%2Fdali-core.git diff --git a/dali/internal/render/gl-resources/bitmap-texture.cpp b/dali/internal/render/gl-resources/bitmap-texture.cpp index e45e553..58d80c2 100644 --- a/dali/internal/render/gl-resources/bitmap-texture.cpp +++ b/dali/internal/render/gl-resources/bitmap-texture.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2014 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. @@ -18,13 +18,18 @@ // CLASS HEADER #include +// EXTERNAL INCLUDES +#include + // INTERNAL INCLUDES +#include +#include // For PixelBuffer #include -#include #include #include #include + namespace Dali { @@ -42,9 +47,9 @@ BitmapTexture::BitmapTexture( bitmap->GetImageWidth(), bitmap->GetImageHeight()), mBitmap(bitmap), - mClearPixels(false), + mPixelFormat(bitmap->GetPixelFormat()), mDiscardPolicy(policy), - mPixelFormat(bitmap->GetPixelFormat()) + mClearPixels(false) { DALI_LOG_TRACE_METHOD(Debug::Filter::gImage); DALI_LOG_SET_OBJECT_STRING(this, DALI_LOG_GET_OBJECT_STRING(bitmap)); @@ -61,9 +66,9 @@ BitmapTexture::BitmapTexture( width, height, width, height), mBitmap(NULL), - mClearPixels(clearPixels), + mPixelFormat( pixelFormat ), mDiscardPolicy(policy), - mPixelFormat( pixelFormat ) + mClearPixels(clearPixels) { DALI_LOG_TRACE_METHOD(Debug::Filter::gImage); } @@ -76,62 +81,6 @@ BitmapTexture::~BitmapTexture() // on the render thread. (And avoiding a potentially problematic virtual call in the destructor) } -void BitmapTexture::UploadBitmapArray( const BitmapUploadArray& bitmapArray ) -{ - DALI_LOG_TRACE_METHOD(Debug::Filter::gImage); - - if( mId == 0 ) - { - CreateGlTexture(); - } - - mContext.ActiveTexture( TEXTURE_UNIT_UPLOAD ); - mContext.Bind2dTexture(mId); - mContext.PixelStorei(GL_UNPACK_ALIGNMENT, 1); // We always use tightly packed data - - GLenum pixelFormat = GL_RGBA; - GLenum pixelDataType = GL_UNSIGNED_BYTE; - - Integration::ConvertToGlFormat(mPixelFormat, pixelDataType, pixelFormat); - - // go through each bitmap uploading it - - for( BitmapUploadArray::const_iterator iter = bitmapArray.begin(), endIter = bitmapArray.end(); iter != endIter ; ++iter) - { - const BitmapUpload& bitmapItem((*iter)); - - DALI_ASSERT_ALWAYS(bitmapItem.mPixelData); - - const unsigned char* pixels = bitmapItem.mPixelData; - - DALI_ASSERT_DEBUG( (pixels!=NULL) && "bitmap has no data \n"); - - unsigned int bitmapWidth(bitmapItem.mWidth); - unsigned int bitmapHeight(bitmapItem.mHeight); - - DALI_LOG_INFO(Debug::Filter::gImage, Debug::General, "upload bitmap to texture :%d y:%d w:%d h:%d\n", - bitmapItem.mXpos, - bitmapItem.mYpos, - bitmapWidth, - bitmapHeight); - - mContext.TexSubImage2D(GL_TEXTURE_2D, - 0, /* mip map level */ - bitmapItem.mXpos, /* X pos */ - bitmapItem.mYpos, /* Y pos */ - bitmapWidth, /* width */ - bitmapHeight, /* height */ - pixelFormat, /* our bitmap format (should match internal format) */ - pixelDataType, /* pixel data type */ - pixels); /* texture data */ - - if( BitmapUpload::DISCARD_PIXEL_DATA == bitmapItem.mDiscard) - { - delete [] bitmapItem.mPixelData; - } - } -} - bool BitmapTexture::HasAlphaChannel() const { return Pixel::HasAlpha(mPixelFormat); @@ -170,7 +119,7 @@ void BitmapTexture::AreaUpdated( const RectArea& updateArea, const unsigned char updateArea.x, updateArea.y, updateArea.width ,updateArea.height ); const unsigned int pitchPixels = mWidth; - const unsigned int pixelDepth = GetBytesPerPixel( mPixelFormat ); + const unsigned int pixelDepth = Dali::Pixel::GetBytesPerPixel( mPixelFormat ); // If the width of the source update area is the same as the pitch, then can // copy the contents in a single contiguous TexSubImage call. @@ -225,7 +174,13 @@ void BitmapTexture::AssignBitmap( bool generateTexture, const unsigned char* pix mContext.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); mContext.TexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - INCREASE_BY( PerformanceMonitor::TEXTURE_DATA_UPLOADED, GetBytesPerPixel(mPixelFormat) * mWidth * mHeight ); + // If the resource policy is to discard on upload then release buffer + DiscardBitmapBuffer(); + + if( pixels != NULL ) + { + INCREASE_BY( PerformanceMonitor::TEXTURE_DATA_UPLOADED, GetBytesPerPixel(mPixelFormat) * mWidth * mHeight ); + } } void BitmapTexture::Update( Integration::Bitmap* bitmap ) @@ -234,7 +189,7 @@ void BitmapTexture::Update( Integration::Bitmap* bitmap ) DALI_ASSERT_DEBUG( bitmap != 0 ); if( !bitmap ) { - DALI_LOG_ERROR( "Passed a null bitmap to update this bitmap texture." ); + DALI_LOG_ERROR( "Passed a null bitmap to update this bitmap texture.\n" ); return; } @@ -244,7 +199,7 @@ void BitmapTexture::Update( Integration::Bitmap* bitmap ) if( !bitmapPackedPixels ) { ///! This should never happen. - DALI_LOG_ERROR("Passed an incompatible bitmap type to update this bitmap texture."); + DALI_LOG_ERROR("Passed an incompatible bitmap type to update this bitmap texture.\n"); return; } mBitmap = bitmap; @@ -288,34 +243,82 @@ void BitmapTexture::Update( Integration::Bitmap* srcBitmap, std::size_t xOffset, { if( NULL != srcBitmap ) { - GLenum pixelFormat = GL_RGBA; - GLenum pixelDataType = GL_UNSIGNED_BYTE; - Integration::ConvertToGlFormat( mPixelFormat, pixelDataType, pixelFormat ); + Update( srcBitmap->GetBuffer(), srcBitmap->GetImageWidth(), srcBitmap->GetImageHeight(), + srcBitmap->GetPixelFormat(), xOffset, yOffset); + } +} - if( !mId ) - { - mContext.GenTextures( 1, &mId ); +void BitmapTexture::Update( PixelData* srcPixelData, std::size_t xOffset, std::size_t yOffset ) +{ + if( NULL != srcPixelData ) + { + Update( srcPixelData->GetBuffer(), srcPixelData->GetWidth(), srcPixelData->GetHeight(), + srcPixelData->GetPixelFormat(), xOffset, yOffset); + } +} - mContext.ActiveTexture( TEXTURE_UNIT_UPLOAD ); - mContext.Bind2dTexture( mId ); - mContext.PixelStorei( GL_UNPACK_ALIGNMENT, 1 ); +void BitmapTexture::Update( const unsigned char* pixels, std::size_t width, std::size_t height, Pixel::Format pixelFormat, std::size_t xOffset, std::size_t yOffset ) +{ - mContext.TexImage2D( GL_TEXTURE_2D, 0, pixelFormat, mWidth, mHeight, 0, pixelFormat, pixelDataType, NULL ); - mContext.TexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); - mContext.TexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); - } - else + GLenum pixelGLFormat = GL_RGBA; + GLenum pixelDataType = GL_UNSIGNED_BYTE; + Integration::ConvertToGlFormat( mPixelFormat, pixelDataType, pixelGLFormat ); + + if( !mId ) + { + mContext.GenTextures( 1, &mId ); + + mContext.ActiveTexture( TEXTURE_UNIT_UPLOAD ); + mContext.Bind2dTexture( mId ); + mContext.PixelStorei( GL_UNPACK_ALIGNMENT, 1 ); + + mContext.TexImage2D( GL_TEXTURE_2D, 0, pixelGLFormat, mWidth, mHeight, 0, pixelGLFormat, pixelDataType, NULL ); + mContext.TexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE ); + mContext.TexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE ); + } + else + { + mContext.ActiveTexture( TEXTURE_UNIT_UPLOAD ); + mContext.Bind2dTexture( mId ); + mContext.PixelStorei( GL_UNPACK_ALIGNMENT, 1 ); + } + +#if DALI_GLES_VERSION >= 30 + // For GLES 3.0, uploading sub-image with different format is a valid operation. + Integration::ConvertToGlFormat( pixelFormat, pixelDataType, pixelGLFormat ); +#else + // Allows RGB888 source bitmap to be added to RGBA8888 texture, need to convert the bitmap format manually. + if(pixelFormat == Pixel::RGB888 && mPixelFormat == Pixel::RGBA8888 ) + { + std::size_t size = width * height; + + Vector tempBuffer; + tempBuffer.Reserve( size*4u ); + PixelBuffer* data = tempBuffer.Begin(); + + for( std::size_t i=0u; iGetImageWidth(), srcBitmap->GetImageHeight(), - pixelFormat, pixelDataType, srcBitmap->GetBuffer() ); + width, height, + pixelGLFormat, pixelDataType, + data ); + + return; } +#endif + + mContext.TexSubImage2D( GL_TEXTURE_2D, 0, + xOffset, yOffset, + width, height, + pixelGLFormat, pixelDataType, + pixels ); } void BitmapTexture::UpdateArea( const RectArea& updateArea ) @@ -350,53 +353,6 @@ void BitmapTexture::UpdateArea( const RectArea& updateArea ) } } -void BitmapTexture::ClearAreas( const BitmapClearArray& areaArray, std::size_t blockSize, uint32_t color ) -{ - if(mId > 0) - { - DALI_LOG_TRACE_METHOD(Debug::Filter::gImage); - DALI_LOG_INFO(Debug::Filter::gGLResource, Debug::Verbose, "BitmapTexture::AreaUpdated()\n"); - - GLenum pixelFormat = GL_RGBA; - GLenum pixelDataType = GL_UNSIGNED_BYTE; - Integration::ConvertToGlFormat(mPixelFormat, pixelDataType, pixelFormat); - - mContext.ActiveTexture( TEXTURE_UNIT_UPLOAD ); - mContext.Bind2dTexture(mId); - - size_t numPixels = blockSize*blockSize; - size_t bytesPerPixel = Pixel::GetBytesPerPixel(mPixelFormat); - char* clearPixels = (char*)malloc(numPixels * bytesPerPixel); - - for(size_t i=0; i pixelData; - if( ( NULL == pixels ) && ( true == mClearPixels ) ) + Dali::Vector pixelData; // Okay to create outside branch as empty vector has no heap allocation. + if( true == mClearPixels ) { - unsigned int size = mWidth * mHeight * Pixel::GetBytesPerPixel(mPixelFormat); - pixelData.resize(size, 0); + unsigned int size = mWidth * mHeight * Pixel::GetBytesPerPixel( mPixelFormat ); + pixelData.Resize( size, 0 ); pixels = &pixelData[0]; } AssignBitmap( true, pixels ); @@ -467,12 +423,15 @@ unsigned int BitmapTexture::GetHeight() const void BitmapTexture::DiscardBitmapBuffer() { - DALI_LOG_INFO(Debug::Filter::gImage, Debug::General, "BitmapTexture::DiscardBitmapBuffer() DiscardPolicy: %s\n", mDiscardPolicy == ResourcePolicy::DISCARD?"DISCARD":"RETAIN"); + DALI_LOG_INFO(Debug::Filter::gImage, Debug::General, "BitmapTexture::DiscardBitmapBuffer() DiscardPolicy: %s\n", mDiscardPolicy == ResourcePolicy::OWNED_DISCARD?"DISCARD":"RETAIN"); - if( ResourcePolicy::DISCARD == mDiscardPolicy ) + if( ResourcePolicy::OWNED_DISCARD == mDiscardPolicy ) { DALI_LOG_INFO(Debug::Filter::gImage, Debug::General, " Discarding bitmap\n"); - mBitmap->DiscardBuffer(); + if ( mBitmap ) + { + mBitmap->DiscardBuffer(); + } } }