[Tizen] Make possible to capture on the old driver devices. 78/255778/5 accepted/tizen/6.0/unified/20210324.210342 submit/tizen_6.0/20210324.154322
authorseungho <sbsh.baek@samsung.com>
Tue, 23 Mar 2021 12:26:29 +0000 (21:26 +0900)
committerseungho <sbsh.baek@samsung.com>
Wed, 24 Mar 2021 06:05:05 +0000 (15:05 +0900)
Change-Id: I1fd531d08b62ebe049c3219a68d0e78f323b7eb4
Signed-off-by: seungho <sbsh.baek@samsung.com>
dali/internal/system/common/capture-impl.cpp
dali/internal/system/common/capture-impl.h
dali/public-api/capture/capture.cpp
dali/public-api/capture/capture.h

index 7f0fa9b..5bf9b55 100644 (file)
 #include <dali/integration-api/adaptor-framework/adaptor.h>
 #include <dali/devel-api/adaptor-framework/native-image-source-devel.h>
 #include <dali/devel-api/adaptor-framework/window-devel.h>
-
-namespace
-{
-unsigned int TIME_OUT_DURATION = 1000;
-}
+#include <dali/devel-api/adaptor-framework/bitmap-saver.h>
+#include <dali/internal/adaptor/common/adaptor-impl.h>
+#include <dali/internal/graphics/gles/egl-graphics.h>
 
 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<EglGraphics*>(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
index 00281e1..273e8f0 100644 (file)
@@ -24,7 +24,6 @@
 #include <dali/public-api/object/ref-object.h>
 #include <dali/public-api/object/base-object.h>
 #include <dali/public-api/render-tasks/render-task.h>
-#include <dali/public-api/rendering/texture.h>
 #include <dali/public-api/rendering/frame-buffer.h>
 
 // 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
index d8cb4f7..9e19bab 100644 (file)
@@ -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();
index 3a96515..7bd6f93 100644 (file)
@@ -21,6 +21,7 @@
 // EXTERNAL HEADERS
 #include <dali/public-api/actors/actor.h>
 #include <dali/public-api/actors/camera-actor.h>
+#include <dali/public-api/rendering/texture.h>
 #include <dali/public-api/signals/dali-signal.h>
 
 // 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