#include <dali/public-api/object/type-registry.h>
// INTERNAL INCLUDES
-#include <dali/devel-api/adaptor-framework/pixel-buffer.h>
#include <dali/internal/canvas-renderer/common/drawable-group-impl.h>
#include <dali/internal/canvas-renderer/common/drawable-impl.h>
#include <dali/internal/canvas-renderer/common/gradient-impl.h>
#include <dali/internal/canvas-renderer/common/shape-impl.h>
-#include <dali/internal/imaging/common/pixel-buffer-impl.h>
namespace Dali
{
CanvasRendererTizen::CanvasRendererTizen(const Vector2& viewBox)
:
#ifdef THORVG_SUPPORT
- mPixelBuffer(nullptr),
mRasterizedTexture(),
mMutex(),
mTvgCanvas(nullptr),
mTvgRoot(nullptr),
+ mNativeImageQueue(nullptr),
#endif
mSize(Vector2::ZERO),
mViewBox(Vector2::ZERO),
}
else
{
- if(!mPixelBuffer || !mPixelBuffer.GetBuffer())
- {
- MakeTargetBuffer(mSize);
- mChanged = false;
- }
+ MakeTargetBuffer(mSize);
+ mChanged = false;
}
if(mTvgCanvas->clear() != tvg::Result::Success)
Dali::Texture CanvasRendererTizen::GetRasterizedTexture()
{
#ifdef THORVG_SUPPORT
- if(mPixelBuffer)
+ if(mNativeImageQueue)
{
- auto width = mPixelBuffer.GetWidth();
- auto height = mPixelBuffer.GetHeight();
- if(width <= 0 || height <= 0)
- {
- return Dali::Texture();
- }
-
- Dali::PixelData pixelData = Devel::PixelBuffer::Convert(mPixelBuffer);
-
- if(!mRasterizedTexture || mRasterizedTexture.GetWidth() != width || mRasterizedTexture.GetHeight() != height)
+ if(!mRasterizedTexture)
{
- mRasterizedTexture = Dali::Texture::New(Dali::TextureType::TEXTURE_2D, Dali::Pixel::BGRA8888, width, height);
+ mRasterizedTexture = Dali::Texture::New(*mNativeImageQueue);
}
-
- mRasterizedTexture.Upload(pixelData);
+ return mRasterizedTexture;
+ }
+ else
+ {
+ return Dali::Texture();
}
- return mRasterizedTexture;
#else
return Dali::Texture();
#endif
#ifdef THORVG_SUPPORT
Mutex::ScopedLock lock(mMutex);
- if(mTvgCanvas->draw() != tvg::Result::Success)
+ if(mNativeImageQueue && mNativeImageQueue->CanDequeueBuffer())
+ {
+ uint32_t width, height, stride;
+ uint8_t* buffer = mNativeImageQueue->DequeueBuffer(width, height, stride);
+ if(!buffer)
+ {
+ DALI_LOG_ERROR("Pixel buffer create to fail [%p]\n", this);
+ return false;
+ }
+
+ mTvgCanvas->target(reinterpret_cast<uint32_t*>(buffer), stride / 4, width, height, tvg::SwCanvas::ARGB8888);
+
+ if(mTvgCanvas->draw() != tvg::Result::Success)
+ {
+ DALI_LOG_ERROR("ThorVG Draw fail [%p]\n", this);
+ mNativeImageQueue->EnqueueBuffer(buffer);
+ return false;
+ }
+
+ mTvgCanvas->sync();
+
+ mNativeImageQueue->EnqueueBuffer(buffer);
+ }
+ else
{
- DALI_LOG_ERROR("ThorVG Draw fail [%p]\n", this);
return false;
}
- mTvgCanvas->sync();
-
return true;
#else
return false;
void CanvasRendererTizen::MakeTargetBuffer(const Vector2& size)
{
#ifdef THORVG_SUPPORT
- mPixelBuffer = Devel::PixelBuffer::New(size.width, size.height, Dali::Pixel::BGRA8888);
-
- unsigned char* pBuffer;
- pBuffer = mPixelBuffer.GetBuffer();
-
- if(!pBuffer)
+ if(!mNativeImageQueue)
{
- DALI_LOG_ERROR("Pixel buffer create to fail [%p]\n", this);
- return;
+ mNativeImageQueue = Dali::NativeImageSourceQueue::New(size.width, size.height, Dali::NativeImageSourceQueue::ColorFormat::RGBA8888);
+ }
+ else
+ {
+ mNativeImageQueue->SetSize(static_cast<uint32_t>(size.width), static_cast<uint32_t>(size.height));
}
-
- mTvgCanvas->target(reinterpret_cast<uint32_t*>(pBuffer), size.width, size.width, size.height, tvg::SwCanvas::ARGB8888);
#endif
}
// INTERNAL INCLUDES
#include <dali/devel-api/adaptor-framework/canvas-renderer-drawable.h>
#include <dali/devel-api/adaptor-framework/canvas-renderer.h>
+#include <dali/devel-api/adaptor-framework/native-image-source-queue.h>
#include <dali/internal/canvas-renderer/common/canvas-renderer-impl.h>
#include <dali/internal/canvas-renderer/common/drawable-group-impl.h>
-#include <dali/devel-api/adaptor-framework/pixel-buffer.h>
namespace Dali
{
private:
#ifdef THORVG_SUPPORT
- Devel::PixelBuffer mPixelBuffer;
- Dali::Texture mRasterizedTexture;
- Dali::Mutex mMutex;
- std::unique_ptr<tvg::SwCanvas> mTvgCanvas;
- tvg::Scene* mTvgRoot;
+ Dali::Texture mRasterizedTexture;
+ Dali::Mutex mMutex;
+ std::unique_ptr<tvg::SwCanvas> mTvgCanvas;
+ tvg::Scene* mTvgRoot;
+ Dali::NativeImageSourceQueuePtr mNativeImageQueue;
#endif
DrawableGroup::DrawableVector mDrawables;
{
Internal::Platform::FileReader fileReader(mUrl);
fp = fileReader.GetFile();
- if(fp == NULL)
+ if(fp == nullptr)
{
return false;
}
return false;
}
- // Moveable but not copyable
-
- Impl(const Impl&) = delete;
- Impl& operator=(const Impl&) = delete;
- Impl(Impl&&) = default;
- Impl& operator=(Impl&&) = default;
-
- ~Impl()
+ void ReleaseResource()
{
#ifdef DALI_ANIMATED_WEBP_ENABLED
- if(&mWebPData != NULL)
+ if(&mWebPData != nullptr)
{
mWebPData.bytes = nullptr;
WebPDataInit(&mWebPData);
}
- if(mWebPAnimDecoder)
+ if(mWebPAnimDecoder != nullptr)
{
WebPAnimDecoderDelete(mWebPAnimDecoder);
+ mWebPAnimDecoder = nullptr;
}
#endif
- free((void*)mBuffer);
- mBuffer = nullptr;
+ if(mBuffer != nullptr)
+ {
+ free((void*)mBuffer);
+ mBuffer = nullptr;
+ }
+ }
+
+ // Moveable but not copyable
+
+ Impl(const Impl&) = delete;
+ Impl& operator=(const Impl&) = delete;
+ Impl(Impl&&) = default;
+ Impl& operator=(Impl&&) = default;
+
+ ~Impl()
+ {
+ ReleaseResource();
}
std::string mUrl;
const int32_t imageBufferSize = width * height * sizeof(uint8_t) * channelNumber;
memcpy(pixelBuffer.GetBuffer(), frameBuffer, imageBufferSize);
free((void*)frameBuffer);
- return pixelBuffer;
}
+ mImpl->ReleaseResource();
+ return pixelBuffer;
}
#endif