From 42a61237c2ecc17d977fbf9596603da2ff221be7 Mon Sep 17 00:00:00 2001 From: JunsuChoi Date: Thu, 21 Oct 2021 17:46:12 +0900 Subject: [PATCH 1/1] CanvasView: Refactoring to get rasterized buffer When the rasterized buffer is fetched after the task is rasterized, it is received as a texture, not as pixel data. This makes the buffer in dali-adaptor not dependent on whether to use NativeImageQueue's tbm_surface or PixelData. Change-Id: I80338ea2454847ce88a8f79fa67e38a842cf67f2 --- .../toolkit-canvas-renderer.cpp | 19 ++++----- .../src/dali-toolkit/utc-Dali-CanvasView.cpp | 48 +++------------------- .../controls/canvas-view/canvas-view-impl.cpp | 44 +++++--------------- .../controls/canvas-view/canvas-view-impl.h | 4 +- .../canvas-view/canvas-view-rasterize-thread.cpp | 26 +++--------- .../canvas-view/canvas-view-rasterize-thread.h | 16 ++------ 6 files changed, 37 insertions(+), 120 deletions(-) diff --git a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-canvas-renderer.cpp b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-canvas-renderer.cpp index 56c0cd8..43aa8ce 100644 --- a/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-canvas-renderer.cpp +++ b/automated-tests/src/dali-toolkit/dali-toolkit-test-utils/toolkit-canvas-renderer.cpp @@ -39,7 +39,7 @@ class CanvasRenderer: public Dali::BaseObject public: CanvasRenderer( const Vector2& size ) : mDrawable(nullptr), - mPixelBuffer( Devel::PixelBuffer::New(size.width, size.height, Dali::Pixel::RGBA8888) ), + mTexture ( Dali::Texture::New( Dali::TextureType::TEXTURE_2D, Pixel::RGBA8888, size.width, size.height ) ), mSize(size), mViewBox(size) { @@ -59,6 +59,11 @@ public: return true; } + Dali::Texture GetRasterizedTexture() + { + return mTexture; + } + bool Rasterize() { return true; @@ -97,12 +102,6 @@ public: return false; } - Devel::PixelBuffer GetPixelBuffer() - { - return mPixelBuffer; - } - - bool SetSize(Vector2 size) { mSize = size; @@ -137,7 +136,7 @@ public: public: Dali::CanvasRenderer::Drawable* mDrawable; - Devel::PixelBuffer mPixelBuffer; + Dali::Texture mTexture; Vector2 mSize; Vector2 mViewBox; }; @@ -200,9 +199,9 @@ bool CanvasRenderer::Rasterize() return Internal::Adaptor::GetImplementation(*this).Rasterize(); } -Devel::PixelBuffer CanvasRenderer::GetPixelBuffer() +Dali::Texture CanvasRenderer::GetRasterizedTexture() { - return Internal::Adaptor::GetImplementation(*this).GetPixelBuffer(); + return Internal::Adaptor::GetImplementation(*this).GetRasterizedTexture(); } bool CanvasRenderer::AddDrawable(Dali::CanvasRenderer::Drawable& drawable) diff --git a/automated-tests/src/dali-toolkit/utc-Dali-CanvasView.cpp b/automated-tests/src/dali-toolkit/utc-Dali-CanvasView.cpp index 36cf1df..cee41e0 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-CanvasView.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-CanvasView.cpp @@ -302,42 +302,6 @@ int UtcDaliCanvasViewRasterizeTaskGetCanvasViewP(void) END_TEST; } -int UtcDaliCanvasViewRasterizeTaskGetBufferSizeP(void) -{ - ToolkitTestApplication application; - - Dali::Toolkit::Internal::CanvasView* dummyInternalCanvasView = new Dali::Toolkit::Internal::CanvasView(Vector2(100,100)); - DALI_TEST_CHECK( dummyInternalCanvasView ); - - Dali::CanvasRenderer dummyCanvasRenderer = Dali::CanvasRenderer::New(Vector2(100, 100)); - DALI_TEST_CHECK( dummyCanvasRenderer ); - - IntrusivePtr task = new Dali::Toolkit::Internal::CanvasRendererRasterizingTask(dummyInternalCanvasView, dummyCanvasRenderer); - DALI_TEST_CHECK( task ); - - //There is no rasterized buffer. - DALI_TEST_EQUALS( task->GetBufferSize(), Vector2(0, 0), TEST_LOCATION ); - - END_TEST; -} - -int UtcDaliCanvasViewRasterizeTaskGetPixelDataP(void) -{ - - Dali::Toolkit::Internal::CanvasView* dummyInternalCanvasView = new Dali::Toolkit::Internal::CanvasView(Vector2(100,100)); - DALI_TEST_CHECK( dummyInternalCanvasView ); - - Dali::CanvasRenderer dummyCanvasRenderer = Dali::CanvasRenderer::New(Vector2(100, 100)); - DALI_TEST_CHECK( dummyCanvasRenderer ); - - IntrusivePtr task = new Dali::Toolkit::Internal::CanvasRendererRasterizingTask(dummyInternalCanvasView, dummyCanvasRenderer); - DALI_TEST_CHECK( task ); - - DALI_TEST_EQUALS( task->GetPixelData(), PixelData(), TEST_LOCATION ); - - END_TEST; -} - int UtcDaliCanvasViewRasterizeThreadP(void) { ToolkitTestApplication application; @@ -488,13 +452,13 @@ int UtcDaliCanvasViewRasterizeThreadRasterizationCompletedSignalP(void) { ToolkitTestApplication application; - Dali::Toolkit::Internal::CanvasView* dummyInternalCanvasView = new Dali::Toolkit::Internal::CanvasView(Vector2(100,100)); - DALI_TEST_CHECK( dummyInternalCanvasView ); + Dali::Toolkit::CanvasView canvasView = Dali::Toolkit::CanvasView::New(Vector2(100, 100)); + Dali::Toolkit::Internal::CanvasView& dummyInternalCanvasView = GetImpl(canvasView); Dali::CanvasRenderer dummyCanvasRenderer = Dali::CanvasRenderer::New(Vector2(100, 100)); DALI_TEST_CHECK( dummyCanvasRenderer ); - IntrusivePtr task = new Dali::Toolkit::Internal::CanvasRendererRasterizingTask(dummyInternalCanvasView, dummyCanvasRenderer); + IntrusivePtr task = new Dali::Toolkit::Internal::CanvasRendererRasterizingTask(&dummyInternalCanvasView, dummyCanvasRenderer); DALI_TEST_CHECK( task ); Dali::Toolkit::Internal::CanvasViewRasterizeThread *dummyThread = new Dali::Toolkit::Internal::CanvasViewRasterizeThread(); @@ -504,10 +468,10 @@ int UtcDaliCanvasViewRasterizeThreadRasterizationCompletedSignalP(void) dummyThread->Process(false); - PixelData pixelData = CreatePixelData( 100, 100 ); + auto texture = Texture::New( Dali::TextureType::TEXTURE_2D, Pixel::RGBA8888, 100, 100 ); - dummyThread->RasterizationCompletedSignal().Connect(dummyInternalCanvasView, &Dali::Toolkit::Internal::CanvasView::ApplyRasterizedImage); - dummyThread->RasterizationCompletedSignal().Emit(pixelData); + dummyThread->RasterizationCompletedSignal().Connect(&dummyInternalCanvasView, &Dali::Toolkit::Internal::CanvasView::ApplyRasterizedImage); + dummyThread->RasterizationCompletedSignal().Emit(texture); application.SendNotification(); application.Render(); 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 5741a42..1540b02 100644 --- a/dali-toolkit/internal/controls/canvas-view/canvas-view-impl.cpp +++ b/dali-toolkit/internal/controls/canvas-view/canvas-view-impl.cpp @@ -196,43 +196,21 @@ void CanvasView::AddRasterizationTask() } } -void CanvasView::ApplyRasterizedImage(PixelData rasterizedPixelData) +void CanvasView::ApplyRasterizedImage(Texture rasterizedTexture) { - if(rasterizedPixelData) + if (rasterizedTexture && rasterizedTexture.GetWidth() != 0 && rasterizedTexture.GetHeight() != 0) { - auto rasterizedPixelDataWidth = rasterizedPixelData.GetWidth(); - auto rasterizedPixelDataHeight = rasterizedPixelData.GetHeight(); - - if(rasterizedPixelDataWidth > 0 && rasterizedPixelDataHeight > 0) + if(!mTextureSet) { - if(!mTexture || mTexture.GetWidth() != rasterizedPixelDataWidth || mTexture.GetHeight() != rasterizedPixelDataHeight) - { - mTexture = Texture::New(TextureType::TEXTURE_2D, rasterizedPixelData.GetPixelFormat(), rasterizedPixelDataWidth, rasterizedPixelDataHeight); - mTexture.Upload(rasterizedPixelData); - - if(!mTextureSet) - { - 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(mTextureSet); - renderer.SetProperty(Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA, true); - - Actor actor = Self(); - if(actor) - { - actor.AddRenderer(renderer); - } - } - mTextureSet.SetTexture(0, mTexture); - } - else - { - //Update texture - mTexture.Upload(rasterizedPixelData); - } + 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(mTextureSet); + renderer.SetProperty(Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA, true); + Self().AddRenderer(renderer); } + mTextureSet.SetTexture(0, rasterizedTexture); } //If there are accumulated changes to CanvasRenderer during Rasterize, Rasterize once again. diff --git a/dali-toolkit/internal/controls/canvas-view/canvas-view-impl.h b/dali-toolkit/internal/controls/canvas-view/canvas-view-impl.h index 6b6cf93..4e492eb 100644 --- a/dali-toolkit/internal/controls/canvas-view/canvas-view-impl.h +++ b/dali-toolkit/internal/controls/canvas-view/canvas-view-impl.h @@ -135,9 +135,9 @@ public: /** * @bried Apply the rasterized image to the canvas view * - * @param[in] rasterizedPixelData The pixel buffer with the rasterized pixels + * @param[in] rasterizedTexture The texture with the rasterized pixels */ - void ApplyRasterizedImage(PixelData rasterizedPixelData); + void ApplyRasterizedImage(Texture rasterizedTexture); private: CanvasView(const CanvasView&) = delete; diff --git a/dali-toolkit/internal/controls/canvas-view/canvas-view-rasterize-thread.cpp b/dali-toolkit/internal/controls/canvas-view/canvas-view-rasterize-thread.cpp index 97835c5..ba3daae 100644 --- a/dali-toolkit/internal/controls/canvas-view/canvas-view-rasterize-thread.cpp +++ b/dali-toolkit/internal/controls/canvas-view/canvas-view-rasterize-thread.cpp @@ -31,8 +31,7 @@ namespace Internal CanvasRendererRasterizingTask::CanvasRendererRasterizingTask(CanvasView* canvasView, CanvasRenderer canvasRenderer) : mCanvasView(canvasView), mCanvasRenderer(canvasRenderer), - mPixelData(PixelData()), - mBufferSize(0, 0) + mRasterizedTexture() { } @@ -40,17 +39,7 @@ bool CanvasRendererRasterizingTask::Rasterize() { if(mCanvasRenderer && mCanvasRenderer.Rasterize()) { - Devel::PixelBuffer pixbuf = mCanvasRenderer.GetPixelBuffer(); - auto width = pixbuf.GetWidth(); - auto height = pixbuf.GetHeight(); - if(width > 0 && height > 0) - { - mBufferSize.width = width; - mBufferSize.height = height; - - mPixelData = Devel::PixelBuffer::Convert(pixbuf); - return true; - } + return true; } return false; } @@ -60,14 +49,9 @@ CanvasView* CanvasRendererRasterizingTask::GetCanvasView() const return mCanvasView.Get(); } -PixelData CanvasRendererRasterizingTask::GetPixelData() const -{ - return mPixelData; -} - -Vector2 CanvasRendererRasterizingTask::GetBufferSize() const +Texture CanvasRendererRasterizingTask::GetRasterizedTexture() { - return mBufferSize; + return mCanvasRenderer.GetRasterizedTexture(); } CanvasViewRasterizeThread::CanvasViewRasterizeThread() @@ -220,7 +204,7 @@ void CanvasViewRasterizeThread::ApplyRasterized() { while(CanvasRendererRasterizingTaskPtr task = NextCompletedTask()) { - RasterizationCompletedSignal().Emit(task->GetPixelData()); + RasterizationCompletedSignal().Emit(task->GetRasterizedTexture()); // Here texture get } UnregisterProcessor(); diff --git a/dali-toolkit/internal/controls/canvas-view/canvas-view-rasterize-thread.h b/dali-toolkit/internal/controls/canvas-view/canvas-view-rasterize-thread.h index 0c16fd9..f89bb91 100644 --- a/dali-toolkit/internal/controls/canvas-view/canvas-view-rasterize-thread.h +++ b/dali-toolkit/internal/controls/canvas-view/canvas-view-rasterize-thread.h @@ -25,7 +25,6 @@ #include #include #include -#include #include #include #include @@ -81,15 +80,9 @@ public: /** * Get the rasterization result. - * @return The pixel data with the rasterized pixels. + * @return The texture with the rasterized pixels. */ - PixelData GetPixelData() const; - - /** - * Get size of rasterization result. - * @return The size of the pixel data. - */ - Vector2 GetBufferSize() const; + Texture GetRasterizedTexture(); private: // Undefined @@ -101,8 +94,7 @@ private: private: CanvasViewPtr mCanvasView; CanvasRenderer mCanvasRenderer; - PixelData mPixelData; - Vector2 mBufferSize; + Texture mRasterizedTexture; }; /** @@ -112,7 +104,7 @@ class CanvasViewRasterizeThread : public Thread, Integration::Processor { public: /// @brief ApplyRasterizedImage Event signal type - using RasterizationCompletedSignalType = Signal; + using RasterizationCompletedSignalType = Signal; public: /** -- 2.7.4