if(mSize != size)
{
mSize = size;
- if(mController->GetRenderMode() != DevelTextLabel::Render::SYNC)
- {
- mTextUpdateNeeded = true;
- mIsPropertyUpdated = true;
- }
+ mIsSizeChanged = true;
+ }
+ break;
+ }
+ case Dali::Actor::Property::SIZE_WIDTH:
+ {
+ const float width = propertyValue.Get<float>();
+ if(mSize.width != width)
+ {
+ mSize.width = width;
+ mIsSizeChanged = true;
+ }
+ break;
+ }
+ case Dali::Actor::Property::SIZE_HEIGHT:
+ {
+ const float height = propertyValue.Get<float>();
+ if(mSize.height != height)
+ {
+ mSize.height = height;
+ mIsSizeChanged = true;
}
break;
}
void TextLabel::OnRelayout(const Vector2& size, RelayoutContainer& container)
{
DALI_LOG_INFO(gLogFilter, Debug::General, "TextLabel::OnRelayout\n");
+ bool sizeChanged = mIsSizeChanged;
+ bool manualRendered = mIsManualRendered;
+ mIsSizeChanged = false;
+ mIsManualRendered = false;
if(mController->GetRenderMode() == DevelTextLabel::Render::ASYNC_MANUAL)
{
if(mController->GetRenderMode() == DevelTextLabel::Render::ASYNC_AUTO ||
mController->GetRenderMode() == DevelTextLabel::Render::ASYNC_MANUAL)
{
- if(mController->GetRenderMode() == DevelTextLabel::Render::ASYNC_AUTO && mTextScroller && mTextScroller->IsScrolling() && !mTextUpdateNeeded)
+ if(mController->GetRenderMode() == DevelTextLabel::Render::ASYNC_AUTO && mTextScroller && mTextScroller->IsScrolling() && !(mTextUpdateNeeded || sizeChanged))
{
// When auto scroll is playing, a text load request is made only if a text update is absolutely necessary.
return;
}
- if(!mIsPropertyUpdated || mIsManualRendering)
+ if(mIsManualRender || !(sizeChanged || mIsPropertyUpdated))
+ {
+ // Do not request async render if the manual render is still ongoing or if there are no size or property updates.
+ return;
+ }
+
+ if(manualRendered && sizeChanged && !mIsPropertyUpdated)
{
+ // Do not request async render if only the size has changed when manual render is completed.
+ // Users may attempt to change the size inside the completed callback post manual render.
+ // In case of ASYNC_AUTO, this could potentially trigger relayout and engender further computation.
+ // This is needed to avoid recomputations, but it may have some limitations.
return;
}
Extents padding;
padding = self.GetProperty<Extents>(Toolkit::Control::Property::PADDING);
- if(mIsManualRendering)
+ if(mIsManualRender)
{
- mIsManualRendering = false;
+ mIsManualRender = false;
+ mIsManualRendered = true;
}
EmitAsyncTextRenderedSignal(renderInfo.renderedSize.width + (padding.start + padding.end), renderInfo.renderedSize.height + (padding.top + padding.bottom));
mLastAutoScrollEnabled(false),
mControlBackgroundEnabeld(true),
mIsPropertyUpdated(false),
- mIsManualRendering(false)
+ mIsSizeChanged(false),
+ mIsManualRender(false),
+ mIsManualRendered(false)
{
}
return;
}
- mIsManualRendering = true;
+ mIsManualRender = true;
Actor self = Self();
return;
}
- mIsManualRendering = true;
+ mIsManualRender = true;
Actor self = Self();
return;
}
- mIsManualRendering = true;
+ mIsManualRender = true;
Actor self = Self();
Toolkit::DevelTextLabel::AsyncTextRenderedSignalType mAsyncTextRenderedSignal;
std::string mLocale;
- Vector2 mSize;
+ Vector2 mSize;
int mRenderingBackend;
- bool mTextUpdateNeeded : 1;
- bool mLastAutoScrollEnabled : 1;
+ bool mTextUpdateNeeded : 1;
+ bool mLastAutoScrollEnabled : 1;
bool mControlBackgroundEnabeld : 1;
- bool mIsPropertyUpdated : 1;
- bool mIsManualRendering : 1;
+ bool mIsPropertyUpdated : 1; // true if a render request is required in ASYNC_AUTO mode, otherwise false.
+ bool mIsSizeChanged : 1; // whether the size has been changed or not.
+ bool mIsManualRender : 1; // whether an async manual render has been requested, returns false when completed.
+ bool mIsManualRendered : 1; // whether an async manual render has been completed, returns false on the next relayout.
protected:
/**