X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali%2Finternal%2Fcanvas-renderer%2Ftizen%2Fcanvas-renderer-impl-tizen.cpp;h=bc4583717e9aae6110bc1e3a925e06fbe2905255;hb=21f8be59ca7d18faa05d1a4b49f65ca33c2a9af6;hp=422ef2d434c05e278bafb79b8a1697d437c5bd9b;hpb=9c36a5902b28db99a5c5fcb61ec8045943242f12;p=platform%2Fcore%2Fuifw%2Fdali-adaptor.git diff --git a/dali/internal/canvas-renderer/tizen/canvas-renderer-impl-tizen.cpp b/dali/internal/canvas-renderer/tizen/canvas-renderer-impl-tizen.cpp index 422ef2d..bc45837 100644 --- a/dali/internal/canvas-renderer/tizen/canvas-renderer-impl-tizen.cpp +++ b/dali/internal/canvas-renderer/tizen/canvas-renderer-impl-tizen.cpp @@ -26,6 +26,8 @@ #include #include #include +#include +#include #include namespace Dali @@ -52,13 +54,16 @@ CanvasRendererTizen* CanvasRendererTizen::New(const Vector2& viewBox) } CanvasRendererTizen::CanvasRendererTizen(const Vector2& viewBox) -: mPixelBuffer(nullptr), +: #ifdef THORVG_SUPPORT + mPixelBuffer(nullptr), + mRasterizedTexture(), + mMutex(), mTvgCanvas(nullptr), mTvgRoot(nullptr), #endif - mSize(0, 0), - mViewBox(0, 0), + mSize(Vector2::ZERO), + mViewBox(Vector2::ZERO), mChanged(false) { Initialize(viewBox); @@ -96,15 +101,22 @@ void CanvasRendererTizen::Initialize(const Vector2& viewBox) bool CanvasRendererTizen::Commit() { #ifdef THORVG_SUPPORT + Mutex::ScopedLock lock(mMutex); + + if(mSize.width < 1.0f || mSize.height < 1.0f) + { + DALI_LOG_ERROR("Size is zero [%p]\n", this); + return false; + } + bool changed = false; for(auto& it : mDrawables) { - Internal::Adaptor::Drawable& drawableImpl = GetImplementation(it); - if(drawableImpl.GetChanged()) + if(HaveDrawablesChanged(it)) { + UpdateDrawablesChanged(it, false); changed = true; - drawableImpl.SetChanged(false); } } @@ -114,19 +126,13 @@ bool CanvasRendererTizen::Commit() } else { - if(!mPixelBuffer.GetBuffer()) + if(!mPixelBuffer || !mPixelBuffer.GetBuffer()) { MakeTargetBuffer(mSize); mChanged = false; } } - if(mSize.width < 1.0f || mSize.height < 1.0f) - { - DALI_LOG_ERROR("Size is zero [%p]\n", this); - return false; - } - if(mTvgCanvas->clear() != tvg::Result::Success) { DALI_LOG_ERROR("ThorVG canvas clear fail [%p]\n", this); @@ -140,38 +146,50 @@ bool CanvasRendererTizen::Commit() PushDrawableToGroup(it, mTvgRoot); } - if(mTvgCanvas->push(move(scene)) != tvg::Result::Success) - { - DALI_LOG_ERROR("ThorVG canvas push fail [%p]\n", this); - return false; - } - - if(mViewBox != mSize) + if(mViewBox != mSize && mViewBox.width > 0 && mViewBox.height > 0) { auto scaleX = mSize.width / mViewBox.width; auto scaleY = mSize.height / mViewBox.height; mTvgRoot->scale(scaleX < scaleY ? scaleX : scaleY); } - mTvgCanvas->update(mTvgRoot); - - if(mTvgCanvas->draw() != tvg::Result::Success) + if(mTvgCanvas->push(move(scene)) != tvg::Result::Success) { - DALI_LOG_ERROR("ThorVG Draw fail [%p]\n", this); + DALI_LOG_ERROR("ThorVG canvas push fail [%p]\n", this); return false; } - mTvgCanvas->sync(); - return true; #else return false; #endif } -Devel::PixelBuffer CanvasRendererTizen::GetPixelBuffer() +Dali::Texture CanvasRendererTizen::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 CanvasRendererTizen::AddDrawable(Dali::CanvasRenderer::Drawable& drawable) @@ -184,14 +202,183 @@ bool CanvasRendererTizen::AddDrawable(Dali::CanvasRenderer::Drawable& drawable) return false; } - if(mSize.width < 1.0f || mSize.height < 1.0f) + drawableImpl.SetAdded(true); + mDrawables.push_back(drawable); + mChanged = true; + + return true; +#else + return false; +#endif +} + +#ifdef THORVG_SUPPORT +bool CanvasRendererTizen::HaveDrawablesChanged(const Dali::CanvasRenderer::Drawable& drawable) const +{ + const Internal::Adaptor::Drawable& drawableImpl = GetImplementation(drawable); + if(drawableImpl.GetChanged()) { - DALI_LOG_ERROR("Size is zero [%p]\n", this); + return true; + } + Dali::CanvasRenderer::Drawable compositeDrawable = drawableImpl.GetCompositionDrawable(); + if(DALI_UNLIKELY(compositeDrawable)) + { + Internal::Adaptor::Drawable& compositeDrawableImpl = Dali::GetImplementation(compositeDrawable); + if(compositeDrawableImpl.GetChanged()) + { + return true; + } + } + + if(drawableImpl.GetType() == Drawable::Types::DRAWABLE_GROUP) + { + const Dali::CanvasRenderer::DrawableGroup& group = static_cast(drawable); + const Internal::Adaptor::DrawableGroup& drawableGroupImpl = Dali::GetImplementation(group); + DrawableGroup::DrawableVector drawables = drawableGroupImpl.GetDrawables(); + for(auto& it : drawables) + { + if(HaveDrawablesChanged(it)) + { + return true; + } + } + } + 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; +} + +void CanvasRendererTizen::UpdateDrawablesChanged(Dali::CanvasRenderer::Drawable& drawable, bool changed) +{ + Internal::Adaptor::Drawable& drawableImpl = GetImplementation(drawable); + drawableImpl.SetChanged(changed); + + Dali::CanvasRenderer::Drawable compositeDrawable = drawableImpl.GetCompositionDrawable(); + if(DALI_UNLIKELY(compositeDrawable)) + { + Internal::Adaptor::Drawable& compositeDrawableImpl = Dali::GetImplementation(compositeDrawable); + compositeDrawableImpl.SetChanged(changed); + } + + if(drawableImpl.GetType() == Drawable::Types::DRAWABLE_GROUP) + { + Dali::CanvasRenderer::DrawableGroup& group = static_cast(drawable); + Internal::Adaptor::DrawableGroup& drawableGroupImpl = Dali::GetImplementation(group); + DrawableGroup::DrawableVector drawables = drawableGroupImpl.GetDrawables(); + for(auto& it : drawables) + { + 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 + +bool CanvasRendererTizen::IsCanvasChanged() const +{ +#ifdef THORVG_SUPPORT + if(mChanged) + { + return true; + } + + for(auto& it : mDrawables) + { + if(HaveDrawablesChanged(it)) + { + return true; + } + } +#endif + return false; +} + +bool CanvasRendererTizen::Rasterize() +{ +#ifdef THORVG_SUPPORT + Mutex::ScopedLock lock(mMutex); + + if(mTvgCanvas->draw() != tvg::Result::Success) + { + DALI_LOG_ERROR("ThorVG Draw fail [%p]\n", this); return false; } - drawableImpl.SetAdded(true); - mDrawables.push_back(drawable); + mTvgCanvas->sync(); + + return true; +#else + return false; +#endif +} + +bool CanvasRendererTizen::RemoveDrawable(Dali::CanvasRenderer::Drawable& drawable) +{ +#ifdef THORVG_SUPPORT + DrawableGroup::DrawableVector::iterator it = std::find(mDrawables.begin(), mDrawables.end(), drawable); + if(it != mDrawables.end()) + { + Internal::Adaptor::Drawable& drawableImpl = GetImplementation(drawable); + drawableImpl.SetAdded(false); + + mDrawables.erase(it); + mChanged = true; + + return true; + } + +#endif + return false; +} + +bool CanvasRendererTizen::RemoveAllDrawables() +{ +#ifdef THORVG_SUPPORT + for(auto& it : mDrawables) + { + Internal::Adaptor::Drawable& drawableImpl = GetImplementation(it); + drawableImpl.SetAdded(false); + } + + mDrawables.clear(); mChanged = true; return true; @@ -200,7 +387,7 @@ bool CanvasRendererTizen::AddDrawable(Dali::CanvasRenderer::Drawable& drawable) #endif } -bool CanvasRendererTizen::SetSize(const Vector2& size) +bool CanvasRendererTizen::SetSize(Vector2 size) { if(size.width < 1.0f || size.height < 1.0f) { @@ -209,24 +396,43 @@ bool CanvasRendererTizen::SetSize(const Vector2& size) if(size != mSize) { - mSize = size; - MakeTargetBuffer(size); + mSize = size; + mChanged = true; } - mChanged = true; - return true; } -const Vector2& CanvasRendererTizen::GetSize() +Vector2 CanvasRendererTizen::GetSize() const { return mSize; } +bool CanvasRendererTizen::SetViewBox(const Vector2& viewBox) +{ + if(viewBox.width < 1.0f || viewBox.height < 1.0f) + { + return false; + } + + if(viewBox != mViewBox) + { + mViewBox = viewBox; + mChanged = true; + } + + return true; +} + +const Vector2& CanvasRendererTizen::GetViewBox() +{ + return mViewBox; +} + void CanvasRendererTizen::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(); @@ -237,7 +443,7 @@ void CanvasRendererTizen::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 } @@ -263,6 +469,45 @@ void CanvasRendererTizen::PushDrawableToGroup(Dali::CanvasRenderer::Drawable& dr 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))