X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fcanvas-view%2Fcanvas-view-impl.cpp;h=1540b02ea37a62c6c08f093dc6dc95ac1ee719d2;hp=07c77d936e8f9fe5e8a931c534efc1cf52eaa5b4;hb=42a61237c2ecc17d977fbf9596603da2ff221be7;hpb=4ac6c8f30c89b605f18ad7dd3e0e5a1f13b1d416 diff --git a/dali-toolkit/internal/controls/canvas-view/canvas-view-impl.cpp b/dali-toolkit/internal/controls/canvas-view/canvas-view-impl.cpp index 07c77d9..1540b02 100644 --- a/dali-toolkit/internal/controls/canvas-view/canvas-view-impl.cpp +++ b/dali-toolkit/internal/controls/canvas-view/canvas-view-impl.cpp @@ -25,8 +25,8 @@ #include // INTERNAL INCLUDES -#include #include +#include #include #include #include @@ -45,6 +45,7 @@ BaseHandle Create() } // Setup properties, signals and actions using the type-registry. DALI_TYPE_REGISTRATION_BEGIN(Toolkit::CanvasView, Toolkit::Control, Create); +DALI_PROPERTY_REGISTRATION(Toolkit, CanvasView, "viewBox", VECTOR2, VIEW_BOX) DALI_TYPE_REGISTRATION_END() } // anonymous namespace @@ -54,12 +55,21 @@ CanvasView::CanvasView(const Vector2& viewBox) : Control(ControlBehaviour(CONTROL_BEHAVIOUR_DEFAULT)), mCanvasRenderer(CanvasRenderer::New(viewBox)), mTexture(), - mChanged(false) + mTextureSet(), + mSize(viewBox), + mCanvasViewRasterizeThread(nullptr) { } CanvasView::~CanvasView() { + if(mCanvasViewRasterizeThread) + { + mCanvasViewRasterizeThread->RemoveTask(this); + + CanvasViewRasterizeThread::TerminateThread(mCanvasViewRasterizeThread); + } + if(Adaptor::IsAvailable()) { Adaptor::Get().UnregisterProcessor(*this); @@ -91,20 +101,17 @@ void CanvasView::OnInitialize() new DevelControl::AccessibleImpl(actor, Dali::Accessibility::Role::IMAGE)); }); - Self().SetProperty(Toolkit::DevelControl::Property::ACCESSIBILITY_HIGHLIGHTABLE, true); - - Adaptor::Get().RegisterProcessor(*this); + Adaptor::Get().RegisterProcessor(*this, true); } void CanvasView::OnRelayout(const Vector2& size, RelayoutContainer& container) { if(!mCanvasRenderer || - mCanvasRenderer.GetSize() == size || !mCanvasRenderer.SetSize(size)) { return; } - mChanged = true; + mSize = size; } void CanvasView::OnSizeSet(const Vector3& targetSize) @@ -112,57 +119,104 @@ void CanvasView::OnSizeSet(const Vector3& targetSize) Control::OnSizeSet(targetSize); if(!mCanvasRenderer || - mCanvasRenderer.GetSize() == Vector2(targetSize) || !mCanvasRenderer.SetSize(Vector2(targetSize))) { return; } - mChanged = true; + mSize.width = targetSize.width; + mSize.height = targetSize.height; } -void CanvasView::Process() +void CanvasView::SetProperty(BaseObject* object, Property::Index propertyIndex, const Property::Value& value) { - if(!mCanvasRenderer) + Toolkit::CanvasView canvasView = Toolkit::CanvasView::DownCast(Dali::BaseHandle(object)); + if(canvasView) { - return; + CanvasView& canvasViewImpl(GetImpl(canvasView)); + + switch(propertyIndex) + { + case Toolkit::CanvasView::Property::VIEW_BOX: + { + Vector2 valueVector2; + if(value.Get(valueVector2)) + { + canvasViewImpl.SetViewBox(valueVector2); + } + break; + } + } } - Commit(); } -void CanvasView::Commit() +Property::Value CanvasView::GetProperty(BaseObject* object, Property::Index propertyIndex) { - if(mCanvasRenderer && mCanvasRenderer.Commit()) + Property::Value value; + + Toolkit::CanvasView canvasView = Toolkit::CanvasView::DownCast(Dali::BaseHandle(object)); + + if(canvasView) { - Devel::PixelBuffer pixbuf = mCanvasRenderer.GetPixelBuffer(); - auto width = pixbuf.GetWidth(); - auto height = pixbuf.GetHeight(); + CanvasView& canvasViewImpl(GetImpl(canvasView)); - Dali::PixelData pixelData = Devel::PixelBuffer::Convert(pixbuf); - if(!pixelData) + switch(propertyIndex) { - return; + case Toolkit::CanvasView::Property::VIEW_BOX: + { + value = canvasViewImpl.GetViewBox(); + break; + } } + } + return value; +} - if(!mTexture || mChanged) +void CanvasView::Process(bool postProcessor) +{ + if(mCanvasRenderer && mCanvasRenderer.IsCanvasChanged() && mSize.width > 0 && mSize.height > 0) + { + AddRasterizationTask(); + } +} + +void CanvasView::AddRasterizationTask() +{ + CanvasRendererRasterizingTaskPtr newTask = new CanvasRendererRasterizingTask(this, mCanvasRenderer); + + if(!mCanvasViewRasterizeThread) + { + mCanvasViewRasterizeThread = new CanvasViewRasterizeThread(); + mCanvasViewRasterizeThread->RasterizationCompletedSignal().Connect(this, &CanvasView::ApplyRasterizedImage); + mCanvasViewRasterizeThread->Start(); + } + + if(mCanvasRenderer.Commit()) + { + mCanvasViewRasterizeThread->AddTask(newTask); + } +} + +void CanvasView::ApplyRasterizedImage(Texture rasterizedTexture) +{ + if (rasterizedTexture && rasterizedTexture.GetWidth() != 0 && rasterizedTexture.GetHeight() != 0) + { + if(!mTextureSet) { - mTexture = Texture::New(TextureType::TEXTURE_2D, Dali::Pixel::RGBA8888, width, height); - mTexture.Upload(pixelData); - TextureSet textureSet = TextureSet::New(); - textureSet.SetTexture(0, mTexture); + mTextureSet = TextureSet::New(); Geometry geometry = VisualFactoryCache::CreateQuadGeometry(); Shader shader = Shader::New(SHADER_CANVAS_VIEW_VERT, SHADER_CANVAS_VIEW_FRAG); Renderer renderer = Renderer::New(geometry, shader); - renderer.SetTextures(textureSet); + renderer.SetTextures(mTextureSet); renderer.SetProperty(Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA, true); - Self().AddRenderer(renderer); - mChanged = false; - } - else - { - //Update texture - mTexture.Upload(pixelData); } + mTextureSet.SetTexture(0, rasterizedTexture); + } + + //If there are accumulated changes to CanvasRenderer during Rasterize, Rasterize once again. + if(mCanvasRenderer && mCanvasRenderer.IsCanvasChanged()) + { + AddRasterizationTask(); } } @@ -174,6 +228,42 @@ bool CanvasView::AddDrawable(Dali::CanvasRenderer::Drawable& drawable) } return false; } + +bool CanvasView::RemoveDrawable(Dali::CanvasRenderer::Drawable& drawable) +{ + if(mCanvasRenderer && mCanvasRenderer.RemoveDrawable(drawable)) + { + return true; + } + return false; +} + +bool CanvasView::RemoveAllDrawables() +{ + if(mCanvasRenderer && mCanvasRenderer.RemoveAllDrawables()) + { + return true; + } + return false; +} + +bool CanvasView::SetViewBox(const Vector2& viewBox) +{ + if(mCanvasRenderer && mCanvasRenderer.SetViewBox(viewBox)) + { + return true; + } + return false; +} + +const Vector2& CanvasView::GetViewBox() +{ + if(mCanvasRenderer) + { + return mCanvasRenderer.GetViewBox(); + } + return Vector2::ZERO; +} } // namespace Internal } // namespace Toolkit } // namespace Dali