void Framebuffer::DiscardResource()
{
mController.DiscardResource(this);
+
+ mCaptureRenderedResult = false;
+ mCapturedBuffer = nullptr;
+ mCapturedCallback = nullptr;
}
void Framebuffer::Bind() const
return mStencilBufferId;
}
+void Framebuffer::CaptureRenderingResult(CallbackBase* capturedCallback, uint8_t* capturedBuffer)
+{
+ // Let we make to capture the result.
+ mCaptureRenderedResult = true;
+
+ mCapturedCallback = capturedCallback;
+ mCapturedBuffer = capturedBuffer;
+}
+
+void Framebuffer::DrawRenderedBuffer()
+{
+ auto gl = mController.GetGL();
+ if(gl && mCaptureRenderedResult && mCapturedCallback && mCapturedBuffer != nullptr)
+ {
+ gl->ReadPixels(0, 0, mCreateInfo.size.width, mCreateInfo.size.height, GL_RGBA, GL_UNSIGNED_BYTE, mCapturedBuffer);
+
+ CallbackBase::Execute(*mCapturedCallback, mCapturedBuffer);
+
+ mCaptureRenderedResult = false;
+ mCapturedBuffer = nullptr;
+ mCapturedCallback = nullptr;
+ }
+}
+
} //namespace Dali::Graphics::GLES
[[nodiscard]] uint32_t GetGlStencilBufferId() const;
+ void CaptureRenderingResult(CallbackBase* capturedCallback, uint8_t* capturedBuffer);
+
+ void DrawRenderedBuffer();
+
+ bool CaptureRequested() const
+ {
+ return mCaptureRenderedResult;
+ }
+
private:
/**
* Attach a texture to the specified attachment point
uint32_t mStencilBufferId{0u};
uint32_t mMultisamples{1u};
bool mInitialized{false};
+
+ uint8_t* mCapturedBuffer{nullptr}; ///< not owned
+ Dali::CallbackBase* mCapturedCallback{nullptr}; ///< not owned
+ bool mCaptureRenderedResult{false};
};
} // namespace Dali::Graphics::GLES
{
if(!mPixelBuffer || (mPixelBuffer && !mPixelBuffer.GetBuffer()))
{
- std::vector<uint8_t> buffer;
uint32_t width, height;
Dali::Pixel::Format pixelFormat;
- if(!mNativeImageSourcePtr->GetPixels(buffer, width, height, pixelFormat))
+ if(mIsNativeImageSourcePossible)
{
- return Dali::Devel::PixelBuffer();
+ std::vector<uint8_t> buffer;
+ if(!mNativeImageSourcePtr || !mNativeImageSourcePtr->GetPixels(buffer, width, height, pixelFormat))
+ {
+ return Dali::Devel::PixelBuffer();
+ }
+ mPixelBuffer = Dali::Devel::PixelBuffer::New(width, height, pixelFormat);
+ memcpy(mPixelBuffer.GetBuffer(), &buffer[0], width * height * Dali::Pixel::GetBytesPerPixel(pixelFormat));
+ }
+ else
+ {
+ if(!mFrameBuffer || !mTexture)
+ {
+ DALI_LOG_ERROR("Capture is not started yet.");
+ return Dali::Devel::PixelBuffer();
+ }
+ uint8_t* buffer = mFrameBuffer.GetRenderedBuffer();
+ if(buffer == nullptr)
+ {
+ DALI_LOG_ERROR("Capture is not finished.");
+ return Dali::Devel::PixelBuffer();
+ }
+ width = mTexture.GetWidth();
+ height = mTexture.GetHeight();
+ pixelFormat = mTexture.GetPixelFormat();
+ mPixelBuffer = Dali::Devel::PixelBuffer::New(width, height, pixelFormat);
+ memcpy(mPixelBuffer.GetBuffer(), buffer, width * height * Dali::Pixel::GetBytesPerPixel(pixelFormat));
}
- mPixelBuffer = Dali::Devel::PixelBuffer::New(width, height, pixelFormat);
- memcpy(mPixelBuffer.GetBuffer(), &buffer[0], width * height * Dali::Pixel::GetBytesPerPixel(pixelFormat));
}
return mPixelBuffer;
}
}
else
{
- mTexture = Dali::Texture::New(TextureType::TEXTURE_2D, Pixel::RGB888, unsigned(size.width), unsigned(size.height));
+ mTexture = Dali::Texture::New(TextureType::TEXTURE_2D, Pixel::RGBA8888, unsigned(size.width), unsigned(size.height));
}
}
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);
}
else
{
- DALI_LOG_ERROR("can't use Capture::SavceFile(). we don't support this function in gles 2.0 \n");
+ uint8_t* buffer = mFrameBuffer.GetRenderedBuffer();
+ return Dali::EncodeToFile(buffer, mPath, Dali::Pixel::RGBA8888, mTexture.GetWidth(), mTexture.GetHeight(), mQuality);
}
return false;