From: seungho Date: Tue, 23 Mar 2021 12:26:29 +0000 (+0900) Subject: [Tizen] Make possible to capture on the old driver devices. X-Git-Tag: accepted/tizen/6.0/unified/20210324.210342^0 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git;a=commitdiff_plain;h=ec1f6aac4d9169d96b6dabf992a38d067541fc4b [Tizen] Make possible to capture on the old driver devices. Change-Id: I1fd531d08b62ebe049c3219a68d0e78f323b7eb4 Signed-off-by: seungho --- diff --git a/dali/internal/system/common/capture-impl.cpp b/dali/internal/system/common/capture-impl.cpp index 7f0fa9b..5bf9b55 100644 --- a/dali/internal/system/common/capture-impl.cpp +++ b/dali/internal/system/common/capture-impl.cpp @@ -29,11 +29,9 @@ #include #include #include - -namespace -{ -unsigned int TIME_OUT_DURATION = 1000; -} +#include +#include +#include namespace Dali { @@ -44,12 +42,19 @@ namespace Internal namespace Adaptor { +namespace +{ +constexpr int32_t VERSION_NATIVE_IMAGE_SOURCE = 30; +constexpr uint32_t TIME_OUT_DURATION = 1000; +} + Capture::Capture() : mQuality( DEFAULT_QUALITY ), mTimer(), mPath(), mNativeImageSourcePtr( NULL ), - mFileSave( false ) + mFileSave( false ), + mIsNativeImageSourcePossible(true) { } @@ -59,13 +64,15 @@ Capture::Capture( Dali::CameraActor cameraActor ) mTimer(), mPath(), mNativeImageSourcePtr( NULL ), - mFileSave( false ) + mFileSave( false ), + mIsNativeImageSourcePossible(true) { } Capture::~Capture() { DeleteNativeImageSource(); + mTexture.Reset(); } CapturePtr Capture::New() @@ -117,45 +124,51 @@ Dali::NativeImageSourcePtr Capture::GetNativeImageSource() const return mNativeImageSourcePtr; } +Dali::Texture Capture::GetTexture() +{ + return mTexture; +} + Dali::Capture::CaptureFinishedSignalType& Capture::FinishedSignal() { return mFinishedSignal; } -void Capture::CreateNativeImageSource( const Vector2& size ) +void Capture::CreateTexture(const Vector2& size) { Dali::Adaptor& adaptor = Dali::Adaptor::Get(); DALI_ASSERT_ALWAYS(adaptor.IsAvailable() && "Dali::Adaptor is not available."); - DALI_ASSERT_ALWAYS(!mNativeImageSourcePtr && "NativeImageSource is already created."); - - // create the NativeImageSource object with our surface - mNativeImageSourcePtr = Dali::NativeImageSource::New( size.width, size.height, Dali::NativeImageSource::COLOR_DEPTH_DEFAULT ); + if(mIsNativeImageSourcePossible) + { + DALI_ASSERT_ALWAYS(!mNativeImageSourcePtr && "NativeImageSource is already created."); + // create the NativeImageSource object with our surface + mNativeImageSourcePtr = Dali::NativeImageSource::New(size.width, size.height, Dali::NativeImageSource::COLOR_DEPTH_DEFAULT); + mTexture = Dali::Texture::New(*mNativeImageSourcePtr); + } + else + { + mTexture = Dali::Texture::New(TextureType::TEXTURE_2D, Pixel::RGB888, unsigned(size.width), unsigned(size.height)); + } } void Capture::DeleteNativeImageSource() { - mNativeImageSourcePtr.Reset(); -} - -bool Capture::IsNativeImageSourceCreated() -{ - return mNativeImageSourcePtr; + if(mNativeImageSourcePtr) + { + mNativeImageSourcePtr.Reset(); + } } void Capture::CreateFrameBuffer() { - DALI_ASSERT_ALWAYS(mNativeImageSourcePtr && "NativeImageSource is NULL."); - DALI_ASSERT_ALWAYS(!mFrameBuffer && "FrameBuffer is already created."); - mNativeTexture = Dali::Texture::New( *mNativeImageSourcePtr ); - // Create a FrameBuffer object with depth attachments. - mFrameBuffer = Dali::FrameBuffer::New( mNativeTexture.GetWidth(), mNativeTexture.GetHeight(), Dali::FrameBuffer::Attachment::DEPTH ); + mFrameBuffer = Dali::FrameBuffer::New(mTexture.GetWidth(), mTexture.GetHeight(), Dali::FrameBuffer::Attachment::DEPTH); // Add a color attachment to the FrameBuffer object. - mFrameBuffer.AttachColorTexture( mNativeTexture ); + mFrameBuffer.AttachColorTexture(mTexture); } void Capture::DeleteFrameBuffer() @@ -163,7 +176,6 @@ void Capture::DeleteFrameBuffer() DALI_ASSERT_ALWAYS(mFrameBuffer && "FrameBuffer is NULL."); mFrameBuffer.Reset(); - mNativeTexture.Reset(); } bool Capture::IsFrameBufferCreated() @@ -214,6 +226,10 @@ void Capture::SetupRenderTask( const Dali::Vector2& position, const Dali::Vector mRenderTask.SetProperty( Dali::RenderTask::Property::REQUIRES_SYNC, true ); mRenderTask.FinishedSignal().Connect( this, &Capture::OnRenderFinished ); mRenderTask.GetCameraActor().SetInvertYAxis( true ); + if(!mIsNativeImageSourcePossible) + { + mFrameBuffer.CaptureRenderedResult(); + } mTimer = Dali::Timer::New( TIME_OUT_DURATION ); mTimer.TickSignal().Connect( this, &Capture::OnTimeOut ); @@ -243,9 +259,18 @@ bool Capture::IsRenderTaskSetup() return mCameraActor && mRenderTask; } -void Capture::SetupResources( const Dali::Vector2& position, const Dali::Vector2& size, const Dali::Vector4& clearColor, Dali::Actor source ) +void Capture::SetupResources(const Dali::Vector2& position, const Dali::Vector2& size, const Dali::Vector4& clearColor, Dali::Actor source) { - CreateNativeImageSource( size ); + Dali::Internal::Adaptor::Adaptor& adaptor = Internal::Adaptor::Adaptor::GetImplementation(Internal::Adaptor::Adaptor::Get()); + GraphicsInterface* graphics = &adaptor.GetGraphicsInterface(); + auto eglGraphics = static_cast(graphics); + + if(eglGraphics->GetEglImplementation().GetGlesVersion() < VERSION_NATIVE_IMAGE_SOURCE) + { + mIsNativeImageSourcePossible = false; + } + + CreateTexture(size); CreateFrameBuffer(); @@ -306,9 +331,16 @@ bool Capture::OnTimeOut() bool Capture::SaveFile() { - DALI_ASSERT_ALWAYS(mNativeImageSourcePtr && "mNativeImageSourcePtr is NULL"); - - return Dali::DevelNativeImageSource::EncodeToFile( *mNativeImageSourcePtr, mPath, mQuality ); + if(mIsNativeImageSourcePossible) + { + DALI_ASSERT_ALWAYS(mNativeImageSourcePtr && "mNativeImageSourcePtr is NULL"); + return Dali::DevelNativeImageSource::EncodeToFile(*mNativeImageSourcePtr, mPath, mQuality); + } + else + { + uint8_t* buffer = mFrameBuffer.GetRenderedBuffer(); + return Dali::EncodeToFile(buffer, mPath, Dali::Pixel::RGBA8888, mTexture.GetWidth(), mTexture.GetHeight(), mQuality); + } } } // End of namespace Adaptor diff --git a/dali/internal/system/common/capture-impl.h b/dali/internal/system/common/capture-impl.h index 00281e1..273e8f0 100644 --- a/dali/internal/system/common/capture-impl.h +++ b/dali/internal/system/common/capture-impl.h @@ -24,7 +24,6 @@ #include #include #include -#include #include // INTERNAL INCLUDES @@ -89,6 +88,11 @@ public: Dali::NativeImageSourcePtr GetNativeImageSource() const; /** + * @copydoc Dali::Capture::GetTexture + */ + Dali::Texture GetTexture(); + + /** * @copydoc Dali::Capture::FinishedSignal */ Dali::Capture::CaptureFinishedSignalType& FinishedSignal(); @@ -104,7 +108,7 @@ private: /** * @brief Create native image source. */ - void CreateNativeImageSource( const Dali::Vector2& size ); + void CreateTexture( const Dali::Vector2& size ); /** * @brief Delete native image source. @@ -112,13 +116,6 @@ private: void DeleteNativeImageSource(); /** - * @brief Query whether native image source is created or not. - * - * @return True is native image source is created. - */ - bool IsNativeImageSourceCreated(); - - /** * @brief Create frame buffer. */ void CreateFrameBuffer(); @@ -205,16 +202,17 @@ private: private: uint32_t mQuality; - Dali::Texture mNativeTexture; + Dali::Texture mTexture; Dali::FrameBuffer mFrameBuffer; Dali::RenderTask mRenderTask; Dali::Actor mSource; Dali::CameraActor mCameraActor; - Dali::Timer mTimer; ///< For timeout. + Dali::Timer mTimer; ///< For timeout. Dali::Capture::CaptureFinishedSignalType mFinishedSignal; std::string mPath; - Dali::NativeImageSourcePtr mNativeImageSourcePtr; ///< pointer to surface image + Dali::NativeImageSourcePtr mNativeImageSourcePtr; ///< pointer to surface image bool mFileSave; + bool mIsNativeImageSourcePossible; }; } // End of namespace Adaptor diff --git a/dali/public-api/capture/capture.cpp b/dali/public-api/capture/capture.cpp index d8cb4f7..9e19bab 100644 --- a/dali/public-api/capture/capture.cpp +++ b/dali/public-api/capture/capture.cpp @@ -88,6 +88,11 @@ Dali::NativeImageSourcePtr Capture::GetNativeImageSource() const return GetImpl(*this).GetNativeImageSource(); } +Dali::Texture Capture::GetTexture() +{ + return GetImpl(*this).GetTexture(); +} + Capture::CaptureFinishedSignalType& Capture::FinishedSignal() { return GetImpl(*this).FinishedSignal(); diff --git a/dali/public-api/capture/capture.h b/dali/public-api/capture/capture.h index 3a96515..7bd6f93 100644 --- a/dali/public-api/capture/capture.h +++ b/dali/public-api/capture/capture.h @@ -21,6 +21,7 @@ // EXTERNAL HEADERS #include #include +#include #include // INTERNAL INCLUDES @@ -260,6 +261,13 @@ public: Dali::NativeImageSourcePtr GetNativeImageSource() const; /** + * @brief Get Texture of captured image. + * + * @return Texture Captured result + */ + Dali::Texture GetTexture(); + + /** * @brief Get finished signal. * * @SINCE_1_3_4