#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
{
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)
{
}
mTimer(),
mPath(),
mNativeImageSourcePtr( NULL ),
- mFileSave( false )
+ mFileSave( false ),
+ mIsNativeImageSourcePossible(true)
{
}
Capture::~Capture()
{
DeleteNativeImageSource();
+ mTexture.Reset();
}
CapturePtr Capture::New()
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()
DALI_ASSERT_ALWAYS(mFrameBuffer && "FrameBuffer is NULL.");
mFrameBuffer.Reset();
- mNativeTexture.Reset();
}
bool Capture::IsFrameBufferCreated()
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 );
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();
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
#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
Dali::NativeImageSourcePtr GetNativeImageSource() const;
/**
+ * @copydoc Dali::Capture::GetTexture
+ */
+ Dali::Texture GetTexture();
+
+ /**
* @copydoc Dali::Capture::FinishedSignal
*/
Dali::Capture::CaptureFinishedSignalType& FinishedSignal();
/**
* @brief Create native image source.
*/
- void CreateNativeImageSource( const Dali::Vector2& size );
+ void CreateTexture( const Dali::Vector2& size );
/**
* @brief Delete native image source.
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();
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