X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fcanvas-renderer%2Fubuntu%2Fcanvas-renderer-impl-ubuntu.cpp;h=42f972d9aff284777c8ed25f7670f4580aac8fc6;hb=21f8be59ca7d18faa05d1a4b49f65ca33c2a9af6;hp=a7566733059a67d4cbb565dc477c18e383720522;hpb=3817b53ec5c5e6450932f37be0c4e0f54b1c44e8;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git diff --git a/dali/internal/canvas-renderer/ubuntu/canvas-renderer-impl-ubuntu.cpp b/dali/internal/canvas-renderer/ubuntu/canvas-renderer-impl-ubuntu.cpp index a756673..42f972d 100644 --- a/dali/internal/canvas-renderer/ubuntu/canvas-renderer-impl-ubuntu.cpp +++ b/dali/internal/canvas-renderer/ubuntu/canvas-renderer-impl-ubuntu.cpp @@ -26,6 +26,8 @@ #include #include #include +#include +#include #include namespace Dali @@ -52,8 +54,11 @@ CanvasRendererUbuntu* CanvasRendererUbuntu::New(const Vector2& viewBox) } CanvasRendererUbuntu::CanvasRendererUbuntu(const Vector2& viewBox) -: mPixelBuffer(nullptr), +: #ifdef THORVG_SUPPORT + mPixelBuffer(nullptr), + mRasterizedTexture(), + mMutex(), mTvgCanvas(nullptr), mTvgRoot(nullptr), #endif @@ -160,9 +165,31 @@ bool CanvasRendererUbuntu::Commit() #endif } -Devel::PixelBuffer CanvasRendererUbuntu::GetPixelBuffer() +Dali::Texture CanvasRendererUbuntu::GetRasterizedTexture() { - return mPixelBuffer; +#ifdef THORVG_SUPPORT + if(mPixelBuffer) + { + 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) + { + mRasterizedTexture = Dali::Texture::New(Dali::TextureType::TEXTURE_2D, Dali::Pixel::BGRA8888, width, height); + } + + mRasterizedTexture.Upload(pixelData); + } + return mRasterizedTexture; +#else + return Dali::Texture(); +#endif } bool CanvasRendererUbuntu::AddDrawable(Dali::CanvasRenderer::Drawable& drawable) @@ -216,6 +243,29 @@ bool CanvasRendererUbuntu::HaveDrawablesChanged(const Dali::CanvasRenderer::Draw } } } + else if(drawableImpl.GetType() == Drawable::Types::SHAPE) + { + const Dali::CanvasRenderer::Shape& shape = static_cast(drawable); + Dali::CanvasRenderer::Gradient fillGradient = shape.GetFillGradient(); + if(DALI_UNLIKELY(fillGradient)) + { + Internal::Adaptor::Gradient& fillGradientImpl = Dali::GetImplementation(fillGradient); + if(fillGradientImpl.GetChanged()) + { + return true; + } + } + + Dali::CanvasRenderer::Gradient strokeGradient = shape.GetStrokeGradient(); + if(DALI_UNLIKELY(strokeGradient)) + { + Internal::Adaptor::Gradient& strokeGradientImpl = Dali::GetImplementation(strokeGradient); + if(strokeGradientImpl.GetChanged()) + { + return true; + } + } + } return false; } @@ -242,6 +292,23 @@ void CanvasRendererUbuntu::UpdateDrawablesChanged(Dali::CanvasRenderer::Drawable UpdateDrawablesChanged(it, changed); } } + else if(drawableImpl.GetType() == Drawable::Types::SHAPE) + { + Dali::CanvasRenderer::Shape& shape = static_cast(drawable); + Dali::CanvasRenderer::Gradient fillGradient = shape.GetFillGradient(); + if(DALI_UNLIKELY(fillGradient)) + { + Internal::Adaptor::Gradient& fillGradientImpl = Dali::GetImplementation(fillGradient); + fillGradientImpl.SetChanged(changed); + } + + Dali::CanvasRenderer::Gradient strokeGradient = shape.GetStrokeGradient(); + if(DALI_UNLIKELY(strokeGradient)) + { + Internal::Adaptor::Gradient& strokeGradientImpl = Dali::GetImplementation(strokeGradient); + strokeGradientImpl.SetChanged(changed); + } + } } #endif @@ -365,7 +432,7 @@ const Vector2& CanvasRendererUbuntu::GetViewBox() void CanvasRendererUbuntu::MakeTargetBuffer(const Vector2& size) { #ifdef THORVG_SUPPORT - mPixelBuffer = Devel::PixelBuffer::New(size.width, size.height, Dali::Pixel::RGBA8888); + mPixelBuffer = Devel::PixelBuffer::New(size.width, size.height, Dali::Pixel::BGRA8888); unsigned char* pBuffer; pBuffer = mPixelBuffer.GetBuffer(); @@ -376,7 +443,7 @@ void CanvasRendererUbuntu::MakeTargetBuffer(const Vector2& size) return; } - mTvgCanvas->target(reinterpret_cast(pBuffer), size.width, size.width, size.height, tvg::SwCanvas::ABGR8888); + mTvgCanvas->target(reinterpret_cast(pBuffer), size.width, size.width, size.height, tvg::SwCanvas::ARGB8888); #endif } @@ -402,6 +469,45 @@ void CanvasRendererUbuntu::PushDrawableToGroup(Dali::CanvasRenderer::Drawable& d PushDrawableToGroup(it, static_cast(tvgDuplicatedObject)); } } + else if(type == Drawable::Types::SHAPE) + { + //FillGradient + Dali::CanvasRenderer::Shape& shape = static_cast(drawable); + Dali::CanvasRenderer::Gradient fillGradient = shape.GetFillGradient(); + if(DALI_UNLIKELY(fillGradient)) + { + Internal::Adaptor::Gradient& fillGradientImpl = Dali::GetImplementation(fillGradient); + tvg::Fill* tvgDuplicatedFillGradient = static_cast(fillGradientImpl.GetObject())->duplicate(); + if(!tvgDuplicatedFillGradient) + { + DALI_LOG_ERROR("Invalid gradient object [%p]\n", this); + return; + } + if(static_cast(tvgDuplicatedObject)->fill(std::unique_ptr(tvgDuplicatedFillGradient)) != tvg::Result::Success) + { + DALI_LOG_ERROR("Tvg gradient set fail [%p]\n", this); + return; + } + } + + //StrokeGradient + Dali::CanvasRenderer::Gradient strokeGradient = shape.GetStrokeGradient(); + if(DALI_UNLIKELY(strokeGradient)) + { + Internal::Adaptor::Gradient& strokeGradientImpl = Dali::GetImplementation(strokeGradient); + tvg::Fill* tvgDuplicatedStrokeGradient = static_cast(strokeGradientImpl.GetObject())->duplicate(); + if(!tvgDuplicatedStrokeGradient) + { + DALI_LOG_ERROR("Invalid gradient object [%p]\n", this); + return; + } + if(static_cast(tvgDuplicatedObject)->stroke(std::unique_ptr(tvgDuplicatedStrokeGradient)) != tvg::Result::Success) + { + DALI_LOG_ERROR("Tvg gradient set fail [%p]\n", this); + return; + } + } + } Dali::CanvasRenderer::Drawable compositeDrawable = drawableImpl.GetCompositionDrawable(); if(DALI_UNLIKELY(compositeDrawable))