/*
- * Copyright (c) 2021 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2024 Samsung Electronics Co., Ltd.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include "canvas-view-impl.h"
// EXTERNAL INCLUDES
+#include <dali/devel-api/rendering/texture-devel.h>
#include <dali/devel-api/scripting/scripting.h>
#include <dali/integration-api/adaptor-framework/adaptor.h>
#include <dali/public-api/object/type-registry-helper.h>
#include <dali/public-api/object/type-registry.h>
-#include <dali/devel-api/rendering/texture-devel.h>
// INTERNAL INCLUDES
#include <dali-toolkit/devel-api/controls/control-devel.h>
-#include <dali-toolkit/internal/controls/canvas-view/canvas-view-rasterize-thread.h>
#include <dali-toolkit/internal/controls/control/control-data-impl.h>
#include <dali-toolkit/internal/graphics/builtin-shader-extern-gen.h>
#include <dali-toolkit/internal/visuals/visual-factory-cache.h>
mCanvasRenderer(CanvasRenderer::New(viewBox)),
mTexture(),
mTextureSet(),
- mSize(viewBox),
- mCanvasViewRasterizeThread(nullptr)
+ mSize(viewBox)
{
}
CanvasView::~CanvasView()
{
- if(mCanvasViewRasterizeThread)
- {
- mCanvasViewRasterizeThread->RemoveTask(this);
-
- CanvasViewRasterizeThread::TerminateThread(mCanvasViewRasterizeThread);
- }
-
if(Adaptor::IsAvailable())
{
- Adaptor::Get().UnregisterProcessor(*this);
+ Dali::AsyncTaskManager::Get().RemoveTask(mRasterizingTask);
+ mRasterizingTask.Reset();
+ Adaptor::Get().UnregisterProcessor(*this, true);
}
}
// CanvasView can relayout in the OnImageReady, alternative to a signal would be to have a upcall from the Control to CanvasView
Dali::Toolkit::Control handle(GetOwner());
- DevelControl::SetAccessibilityConstructor(Self(), [](Dali::Actor actor) {
- return std::unique_ptr<Dali::Accessibility::Accessible>(
- new DevelControl::ControlAccessible(actor, Dali::Accessibility::Role::IMAGE));
- });
+ Self().SetProperty(DevelControl::Property::ACCESSIBILITY_ROLE, Dali::Accessibility::Role::IMAGE);
Adaptor::Get().RegisterProcessor(*this, true);
}
void CanvasView::AddRasterizationTask()
{
- CanvasRendererRasterizingTaskPtr newTask = new CanvasRendererRasterizingTask(this, mCanvasRenderer);
-
- if(!mCanvasViewRasterizeThread)
- {
- mCanvasViewRasterizeThread = new CanvasViewRasterizeThread();
- mCanvasViewRasterizeThread->RasterizationCompletedSignal().Connect(this, &CanvasView::ApplyRasterizedImage);
- mCanvasViewRasterizeThread->Start();
- }
+ mRasterizingTask = new CanvasRendererRasterizingTask(mCanvasRenderer, MakeCallback(this, &CanvasView::ApplyRasterizedImage));
if(mCanvasRenderer.Commit())
{
- mCanvasViewRasterizeThread->AddTask(newTask);
+ AsyncTaskManager::Get().AddTask(mRasterizingTask);
}
}
-void CanvasView::ApplyRasterizedImage(Texture rasterizedTexture)
+void CanvasView::ApplyRasterizedImage(CanvasRendererRasterizingTaskPtr task)
{
- if (rasterizedTexture && rasterizedTexture.GetWidth() != 0 && rasterizedTexture.GetHeight() != 0)
+ if(task->IsRasterized())
{
- if(!mTextureSet)
+ Texture rasterizedTexture = task->GetRasterizedTexture();
+ if(rasterizedTexture && rasterizedTexture.GetWidth() != 0 && rasterizedTexture.GetHeight() != 0)
{
- std::string fragmentShader = SHADER_CANVAS_VIEW_FRAG.data();
- DevelTexture::ApplyNativeFragmentShader(rasterizedTexture, fragmentShader);
+ if(!mTextureSet)
+ {
+ std::string fragmentShader = SHADER_CANVAS_VIEW_FRAG.data();
+ DevelTexture::ApplyNativeFragmentShader(rasterizedTexture, fragmentShader);
- mTextureSet = TextureSet::New();
- Geometry geometry = VisualFactoryCache::CreateQuadGeometry();
- Shader shader = Shader::New(SHADER_CANVAS_VIEW_VERT, fragmentShader);
- Renderer renderer = Renderer::New(geometry, shader);
+ mTextureSet = TextureSet::New();
+ Geometry geometry = VisualFactoryCache::CreateQuadGeometry();
+ Shader shader = Shader::New(SHADER_CANVAS_VIEW_VERT, fragmentShader, Shader::Hint::NONE, "CANVAS_VIEW");
+ Renderer renderer = Renderer::New(geometry, shader);
- renderer.SetTextures(mTextureSet);
- renderer.SetProperty(Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA, true);
- Self().AddRenderer(renderer);
+ renderer.SetTextures(mTextureSet);
+ renderer.SetProperty(Renderer::Property::BLEND_PRE_MULTIPLIED_ALPHA, true);
+ Self().AddRenderer(renderer);
+ }
+ mTextureSet.SetTexture(0, rasterizedTexture);
}
- mTextureSet.SetTexture(0, rasterizedTexture);
}
+ mRasterizingTask.Reset(); // We don't need it anymore
+
//If there are accumulated changes to CanvasRenderer during Rasterize, Rasterize once again.
if(mCanvasRenderer && mCanvasRenderer.IsCanvasChanged())
{