return GetImpl(textLabel).AsyncTextRenderedSignal();
}
+AsyncNaturalSizeComputedSignalType& AsyncNaturalSizeComputedSignal(TextLabel textLabel)
+{
+ return GetImpl(textLabel).AsyncNaturalSizeComputedSignal();
+}
+
Vector<Vector2> GetTextSize(TextLabel textLabel, const uint32_t startIndex, const uint32_t endIndex)
{
return GetImpl(textLabel).GetTextSize(startIndex, endIndex);
GetImpl(textLabel).RequestAsyncRenderWithConstraint(widthConstraint, heightConstraint);
}
+void RequestAsyncNaturalSize(TextLabel textLabel)
+{
+ GetImpl(textLabel).RequestAsyncNaturalSize();
+}
+
} // namespace DevelTextLabel
} // namespace Toolkit
DALI_TOOLKIT_API void RequestAsyncRenderWithConstraint(TextLabel textLabel, float widthConstraint, float heightConstraint);
/**
+ * @brief Requests asynchronous text natural size computation.
+ *
+ * @param[in] textLabel The instance of TextLabel.
+ */
+DALI_TOOLKIT_API void RequestAsyncNaturalSize(TextLabel textLabel);
+
+/**
* @brief Anchor clicked signal type.
*
* @note Signal
using AsyncTextRenderedSignalType = Signal<void(TextLabel, float, float)>;
/**
+ * @brief Async natural size computed signal type.
+ *
+ * @note Signal
+ * - float : computed width.
+ * - float : computed height.
+ */
+using AsyncNaturalSizeComputedSignalType = Signal<void(TextLabel, float, float)>;
+
+/**
* @brief This signal is emitted when the anchor is clicked.
*
* A callback of the following type may be connected:
*/
DALI_TOOLKIT_API AsyncTextRenderedSignalType& AsyncTextRenderedSignal(TextLabel textLabel);
+/**
+ * @brief This signal is emitted when the async natural size computed.
+ *
+ * A callback of the following type may be connected:
+ * @code
+ * void YourCallbackName(TextLabel textLabel);
+ * @endcode
+ * @param[in] textLabel The instance of TextLabel.
+ * @return The signal to connect to.
+ */
+DALI_TOOLKIT_API AsyncNaturalSizeComputedSignalType& AsyncNaturalSizeComputedSignal(TextLabel textLabel);
+
} // namespace DevelTextLabel
} // namespace Toolkit
DALI_SIGNAL_REGISTRATION(Toolkit, TextLabel, "anchorClicked", SIGNAL_ANCHOR_CLICKED)
DALI_SIGNAL_REGISTRATION(Toolkit, TextLabel, "textFitChanged", SIGNAL_TEXT_FIT_CHANGED)
DALI_SIGNAL_REGISTRATION(Toolkit, TextLabel, "asyncTextRendered", SIGNAL_ASYNC_TEXT_RENDERED)
+DALI_SIGNAL_REGISTRATION(Toolkit, TextLabel, "asyncNaturalSizeComputed", SIGNAL_ASYNC_NATURAL_SIZE_COMPUTED)
DALI_TYPE_REGISTRATION_END()
// clang-format on
labelImpl.AsyncTextRenderedSignal().Connect(tracker, functor);
}
}
+ else if(0 == strcmp(signalName.c_str(), SIGNAL_ASYNC_NATURAL_SIZE_COMPUTED))
+ {
+ if(label)
+ {
+ Internal::TextLabel& labelImpl(GetImpl(label));
+ labelImpl.AsyncNaturalSizeComputedSignal().Connect(tracker, functor);
+ }
+ }
else
{
// signalName does not match any signal
return mAsyncTextRenderedSignal;
}
+DevelTextLabel::AsyncNaturalSizeComputedSignalType& TextLabel::AsyncNaturalSizeComputedSignal()
+{
+ return mAsyncNaturalSizeComputedSignal;
+}
+
void TextLabel::OnInitialize()
{
Actor self = Self();
}
}
+void TextLabel::AsyncSizeComputed(Text::AsyncTextRenderInfo renderInfo)
+{
+ switch (renderInfo.requestType)
+ {
+ case Async::COMPUTE_NATURAL_SIZE:
+ {
+ DALI_LOG_RELEASE_INFO("Natural size : %f, %f\n", renderInfo.renderedSize.width, renderInfo.renderedSize.height);
+ EmitAsyncNaturalSizeComputedSignal(renderInfo.renderedSize.width, renderInfo.renderedSize.height);
+ }
+ break;
+
+ case Async::COMPUTE_HEIGHT_FOR_WIDTH:
+ {
+ // TODO
+ }
+ break;
+
+ case Async::COMPUTE_LINE_COUNT:
+ {
+ // TODO
+ }
+ break;
+
+ default:
+ {
+ DALI_LOG_ERROR("Unexpected request type recieved : %d\n", renderInfo.requestType);
+ }
+ break;
+ }
+}
+
void TextLabel::AsyncLoadComplete(Text::AsyncTextRenderInfo renderInfo)
{
// Pure Virtual from AsyncTextInterface
mAsyncTextRenderedSignal.Emit(handle, width, height);
}
+void TextLabel::EmitAsyncNaturalSizeComputedSignal(float width, float height)
+{
+ Dali::Toolkit::TextLabel handle(GetOwner());
+ Extents padding;
+ padding = Self().GetProperty<Extents>(Toolkit::Control::Property::PADDING);
+ mAsyncNaturalSizeComputedSignal.Emit(handle, width + (padding.start + padding.end), height + (padding.top + padding.bottom));
+}
+
void TextLabel::OnAccessibilityStatusChanged()
{
CommonTextUtils::SynchronizeTextAnchorsInParent(Self(), mController, mAnchorActors);
}
}
+void TextLabel::RequestAsyncNaturalSize()
+{
+ Actor self = Self();
+ Extents padding(0u, 0u, 0u, 0u);
+ Vector2 contentSize(0.0f, 0.0f);
+ Dali::LayoutDirection::Type layoutDirection = mController->GetLayoutDirection(self);
+
+ AsyncTextParameters parameters = GetAsyncTextParameters(contentSize, padding, layoutDirection);
+ parameters.requestType = Async::COMPUTE_NATURAL_SIZE;
+
+ TextVisual::RequestAsyncSizeComputation(mVisual, parameters);
+}
+
void TextLabel::RequestAsyncRenderWithFixedSize(float width, float height)
{
DALI_LOG_RELEASE_INFO("Request size : %f, %f\n", width, height);
}
AsyncTextParameters parameters = GetAsyncTextParameters(contentSize, padding, layoutDirection);
- parameters.renderType = AsyncTextParameters::FIXED_SIZE;
+ parameters.requestType = Async::RENDER_FIXED_SIZE;
parameters.manualRender = true;
TextVisual::UpdateAsyncRenderer(mVisual, parameters);
}
AsyncTextParameters parameters = GetAsyncTextParameters(contentSize, padding, layoutDirection);
- parameters.renderType = AsyncTextParameters::FIXED_WIDTH;
+ parameters.requestType = Async::RENDER_FIXED_WIDTH;
parameters.manualRender = true;
TextVisual::UpdateAsyncRenderer(mVisual, parameters);
}
AsyncTextParameters parameters = GetAsyncTextParameters(contentSize, padding, layoutDirection);
- parameters.renderType = AsyncTextParameters::CONSTRAINT;
+ parameters.requestType = Async::RENDER_CONSTRAINT;
parameters.manualRender = true;
TextVisual::UpdateAsyncRenderer(mVisual, parameters);
DevelTextLabel::AsyncTextRenderedSignalType& AsyncTextRenderedSignal();
/**
+ * @copydoc Dali::Toollkit::TextLabel::AsyncNaturalSizeComputedSignal()
+ */
+ DevelTextLabel::AsyncNaturalSizeComputedSignalType& AsyncNaturalSizeComputedSignal();
+
+ /**
* Connects a callback function with the object's signals.
* @param[in] object The object providing the signal.
* @param[in] tracker Used to disconnect the signal.
*/
void RequestAsyncRenderWithConstraint(float widthConstraint, float heightConstraint);
+ /**
+ * @brief Requests asynchronous text natural size computation.
+ */
+ void RequestAsyncNaturalSize();
+
private: // From Control
/**
*/
void AsyncLoadComplete(Text::AsyncTextRenderInfo renderInfo);
+ /**
+ * @copydoc Text::AsyncTextInterface::AsyncSizeComputed()
+ */
+ void AsyncSizeComputed(Text::AsyncTextRenderInfo renderInfo);
+
+
private: // Implementation
/**
* Construct a new TextLabel.
*/
void EmitAsyncTextRenderedSignal(float width, float height);
+ /**
+ * @brief Emits AsyncNaturalSizeComputed signal.
+ */
+ void EmitAsyncNaturalSizeComputedSignal(float width, float height);
+
void OnAccessibilityStatusChanged();
private: // Data
Toolkit::DevelTextLabel::AnchorClickedSignalType mAnchorClickedSignal;
Toolkit::DevelTextLabel::TextFitChangedSignalType mTextFitChangedSignal;
Toolkit::DevelTextLabel::AsyncTextRenderedSignalType mAsyncTextRenderedSignal;
+ Toolkit::DevelTextLabel::AsyncNaturalSizeComputedSignalType mAsyncNaturalSizeComputedSignal;
std::string mLocale;
Vector2 mSize;
* @brief Called when the async load complete.
*/
virtual void AsyncLoadComplete(Text::AsyncTextRenderInfo renderInfo) = 0;
+
+ /**
+ * @brief Called when the async size computed.
+ */
+ virtual void AsyncSizeComputed(Text::AsyncTextRenderInfo renderInfo) = 0;
};
} // namespace Text
{
DALI_LOG_RELEASE_INFO("-->AsyncTextLoader::RenderText\n");
- if(parameters.renderType == AsyncTextParameters::CONSTRAINT)
+ if(parameters.requestType == Async::RENDER_CONSTRAINT)
{
Size textNaturalSize = ComputeNaturalSize(parameters);
// textWidth is widthConstraint
}
}
- if(parameters.renderType == AsyncTextParameters::FIXED_WIDTH || parameters.renderType == AsyncTextParameters::CONSTRAINT)
+ if(parameters.requestType == Async::RENDER_FIXED_WIDTH || parameters.requestType == Async::RENDER_CONSTRAINT)
{
// In case of CONSTRAINT, the natural size has already been calculated.
// So we can skip Initialize and Update at this stage.
// Only the layout is newly calculated to obtain the height.
- bool layoutOnly = (parameters.renderType == AsyncTextParameters::CONSTRAINT);
+ bool layoutOnly = (parameters.requestType == Async::RENDER_CONSTRAINT);
float height = ComputeHeightForWidth(parameters, parameters.textWidth, layoutOnly);
// textHeight is heightConstraint.
return naturalSize;
}
+AsyncTextRenderInfo AsyncTextLoader::GetNaturalSize(AsyncTextParameters& parameters)
+{
+ Size textNaturalSize = ComputeNaturalSize(parameters);
+ AsyncTextRenderInfo renderInfo;
+ renderInfo.renderedSize = textNaturalSize;
+ renderInfo.requestType = Async::COMPUTE_NATURAL_SIZE;
+
+ return renderInfo;
+}
+
AsyncTextRenderInfo AsyncTextLoader::RenderAutoScroll(AsyncTextParameters& parameters)
{
DALI_LOG_RELEASE_INFO("-->AsyncTextLoader::RenderAutoScroll\n");
textNaturalSize.width += (parameters.padding.start + parameters.padding.end);
textNaturalSize.height += (parameters.padding.top + parameters.padding.bottom);
- if(parameters.renderType == AsyncTextParameters::FIXED_WIDTH || parameters.renderType == AsyncTextParameters::CONSTRAINT)
+ if(parameters.requestType == Async::RENDER_FIXED_WIDTH || parameters.requestType == Async::RENDER_CONSTRAINT)
{
// The real height calculated during layout should be set.
parameters.textHeight = textNaturalSize.height - (parameters.padding.top + parameters.padding.bottom);
AsyncTextRenderInfo AsyncTextLoader::RenderTextFit(AsyncTextParameters& parameters)
{
- if(parameters.renderType == AsyncTextParameters::CONSTRAINT)
+ if(parameters.requestType == Async::RENDER_CONSTRAINT)
{
Size textNaturalSize = ComputeNaturalSize(parameters);
// textWidth is widthConstraint
}
}
- if(parameters.renderType == AsyncTextParameters::FIXED_WIDTH || parameters.renderType == AsyncTextParameters::CONSTRAINT)
+ if(parameters.requestType == Async::RENDER_FIXED_WIDTH || parameters.requestType == Async::RENDER_CONSTRAINT)
{
// In case of CONSTRAINT, the natural size has already been calculated.
// So we can skip Initialize and Update at this stage.
// Only the layout is newly calculated to obtain the height.
- bool layoutOnly = (parameters.renderType == AsyncTextParameters::CONSTRAINT);
+ bool layoutOnly = (parameters.requestType == Async::RENDER_CONSTRAINT);
float height = ComputeHeightForWidth(parameters, parameters.textWidth, layoutOnly);
// textHeight is heightConstraint
*/
AsyncTextRenderInfo RenderAutoScroll(AsyncTextParameters& parameters);
+ /**
+ * @copydoc Dali::AsyncTextLoader::GetNaturalSize()
+ */
+ AsyncTextRenderInfo GetNaturalSize(AsyncTextParameters& parameters);
+
private:
// Worker thread
/**
return GetImplementation(*this).RenderAutoScroll(parameters);
}
+AsyncTextRenderInfo AsyncTextLoader::GetNaturalSize(AsyncTextParameters& parameters)
+{
+ return GetImplementation(*this).GetNaturalSize(parameters);
+}
+
Text::AsyncTextModule& AsyncTextLoader::GetModule()
{
return GetImplementation(*this).GetModule();
} // namespace DALI_INTERNAL
-struct AsyncTextParameters
+namespace Async
{
- enum RenderType
+ enum RequestType
{
- FIXED_SIZE,
- FIXED_WIDTH,
- CONSTRAINT
+ RENDER_FIXED_SIZE,
+ RENDER_FIXED_WIDTH,
+ RENDER_CONSTRAINT,
+ COMPUTE_NATURAL_SIZE,
+ COMPUTE_HEIGHT_FOR_WIDTH,
+ COMPUTE_LINE_COUNT
};
+} // namespace Async
+struct AsyncTextParameters
+{
AsyncTextParameters()
- : renderType{FIXED_SIZE},
+ : requestType{Async::RENDER_FIXED_SIZE},
manualRender{false},
maxTextureSize{0},
text{},
{
}
- RenderType renderType;
- bool manualRender : 1;
+ Async::RequestType requestType;
+ bool manualRender : 1;
int maxTextureSize; ///< The maximum size of texture.
isOverlayStyle(false),
isTextDirectionRTL(false),
isCutout(false),
- manualRendered(false)
+ manualRendered(false),
+ requestType(Async::RENDER_FIXED_SIZE)
{
}
bool isTextDirectionRTL;
bool isCutout;
bool manualRendered;
+ Async::RequestType requestType;
};
/**
* @return An AsyncTextRenderInfo.
*/
AsyncTextRenderInfo RenderAutoScroll(AsyncTextParameters& parameters);
+
+ /**
+ * @brief Gets the natural size of text.
+ *
+ * @param[in] parameters All options required to compute text.
+ *
+ * @return An AsyncTextRenderInfo.
+ */
+ AsyncTextRenderInfo GetNaturalSize(AsyncTextParameters& parameters);
/**
* @brief Get AsyncTextModule to used in text visual.
#include <dali/integration-api/debug.h>
#include <dali/integration-api/trace.h>
-// FOR TEST
-#include <thread>
namespace Dali
{
void TextLoadingTask::Load()
{
- if(mParameters.isAutoScrollEnabled && !mParameters.isMultiLine)
+ switch (mParameters.requestType)
{
- DALI_LOG_RELEASE_INFO("-->TextLoadingTask::Load RenderAutoScroll\n");
- mRenderInfo = mLoader.RenderAutoScroll(mParameters);
- }
- else if(mParameters.isTextFitEnabled || mParameters.isTextFitArrayEnabled)
- {
- DALI_LOG_RELEASE_INFO("-->TextLoadingTask::Load RenderTextFit\n");
- mRenderInfo = mLoader.RenderTextFit(mParameters);
- }
- else
- {
- DALI_LOG_RELEASE_INFO("-->TextLoadingTask::Load RenderText\n");
- mRenderInfo = mLoader.RenderText(mParameters);
+ case Text::Async::RENDER_FIXED_SIZE:
+ case Text::Async::RENDER_FIXED_WIDTH:
+ case Text::Async::RENDER_CONSTRAINT:
+ {
+ if(mParameters.isAutoScrollEnabled && !mParameters.isMultiLine)
+ {
+ DALI_LOG_RELEASE_INFO("-->TextLoadingTask::Load RenderAutoScroll\n");
+ mRenderInfo = mLoader.RenderAutoScroll(mParameters);
+ }
+ else if(mParameters.isTextFitEnabled || mParameters.isTextFitArrayEnabled)
+ {
+ DALI_LOG_RELEASE_INFO("-->TextLoadingTask::Load RenderTextFit\n");
+ mRenderInfo = mLoader.RenderTextFit(mParameters);
+ }
+ else
+ {
+ DALI_LOG_RELEASE_INFO("-->TextLoadingTask::Load RenderText\n");
+ mRenderInfo = mLoader.RenderText(mParameters);
+ }
+ }
+ break;
+
+ case Text::Async::COMPUTE_NATURAL_SIZE:
+ {
+ DALI_LOG_RELEASE_INFO("-->TextLoadingTask::Load GetNaturalSize\n");
+ mRenderInfo = mLoader.GetNaturalSize(mParameters);
+ }
+ break;
+
+ case Text::Async::COMPUTE_HEIGHT_FOR_WIDTH:
+ {
+ // TODO
+ }
+ break;
+
+ case Text::Async::COMPUTE_LINE_COUNT:
+ {
+ // TODO
+ }
+ break;
+
+ default:
+ {
+ DALI_LOG_ERROR("Unexpected request type recieved : %d\n", mParameters.requestType);
+ }
+ break;
}
}
Text::AsyncTextRenderInfo renderInfo = textInformation.renderInfo;
Text::AsyncTextParameters parameters = textInformation.parameters;
+ if(parameters.requestType == Text::Async::COMPUTE_NATURAL_SIZE ||
+ parameters.requestType == Text::Async::COMPUTE_HEIGHT_FOR_WIDTH ||
+ parameters.requestType == Text::Async::COMPUTE_LINE_COUNT)
+ {
+ if(mAsyncTextInterface)
+ {
+ mAsyncTextInterface->AsyncSizeComputed(renderInfo);
+ return;
+ }
+ }
+
// Calculate the size of the visual that can fit the text.
// The size of the text after it has been laid-out, size of pixel data buffer.
Size layoutSize(static_cast<float>(renderInfo.width), static_cast<float>(renderInfo.height));
mAsyncTextInterface = asyncTextInterface;
}
+void TextVisual::RequestAsyncSizeComputation(Text::AsyncTextParameters& parameters)
+{
+ Actor control = mControl.GetHandle();
+ if(!control)
+ {
+ // Nothing to do.
+ return;
+ }
+
+ TextLoadObserver* textLoadObserver = this;
+ Text::AsyncTextManager::Get().RequestLoad(parameters, textLoadObserver);
+ DALI_LOG_RELEASE_INFO("-->TextVisual::RequestAsyncSizeComputation RequestLoad\n");
+}
+
void TextVisual::UpdateAsyncRenderer(Text::AsyncTextParameters& parameters)
{
Actor control = mControl.GetHandle();
return;
}
- if(parameters.renderType == Text::AsyncTextParameters::FIXED_SIZE &&
+ if(parameters.requestType == Text::Async::RENDER_FIXED_SIZE &&
((fabsf(parameters.textWidth) < Math::MACHINE_EPSILON_1000) || (fabsf(parameters.textHeight) < Math::MACHINE_EPSILON_1000) || parameters.text.empty()))
{
// Remove the texture set and any renderer previously set.
};
/**
+ * @brief Instantly requests the async size computation.
+ * @param[in] visual The text visual.
+ * @param[in] parameters The async text parameters.
+ */
+ static void RequestAsyncSizeComputation(Toolkit::Visual::Base visual, Text::AsyncTextParameters& parameters)
+ {
+ GetVisualObject(visual).RequestAsyncSizeComputation(parameters);
+ };
+
+ /**
* @brief Set the control's async text interface.
* @param[in] visual The text visual.
* @param[in] asyncTextInterface The async text interface.
void UpdateAsyncRenderer(Text::AsyncTextParameters& parameters);
/**
+ * @brief Requests the async size computation.
+ * @param[in] parameters The async text parameters.
+ */
+ void RequestAsyncSizeComputation(Text::AsyncTextParameters& parameters);
+
+ /**
* @brief Set the control's async text interface.
* @param[in] asyncTextInterface The async text interface.
*/