+Dali::Property::Array RenderForLastIndex(RendererParameters& textParameters)
+{
+ Property::Array offsetValues;
+ if(textParameters.text.empty())
+ {
+ return offsetValues;
+ }
+ FontClient fontClient = FontClient::Get();
+ MetricsPtr metrics;
+ metrics = Metrics::New(fontClient);
+
+ Text::ModelPtr textModel = Text::Model::New();
+ InternalDataModel internalData(fontClient, metrics, textModel);
+
+ TextAbstraction::TextRenderer::Parameters rendererParameters(textModel->mVisualModel->mGlyphs,
+ textModel->mVisualModel->mGlyphPositions,
+ textModel->mVisualModel->mColors,
+ textModel->mVisualModel->mColorIndices,
+ internalData.blendingMode,
+ internalData.isEmoji);
+
+ rendererParameters.width = textParameters.textWidth;
+ rendererParameters.height = textParameters.textHeight;
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // Process the markup string if the mark-up processor is enabled.
+ ////////////////////////////////////////////////////////////////////////////////
+ ShapeTextPreprocess(textParameters, rendererParameters, internalData);
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // Retrieve the glyphs. Text shaping
+ ////////////////////////////////////////////////////////////////////////////////
+ Dali::Vector<Dali::Toolkit::DevelText::EmbeddedItemInfo> embeddedItemLayout;
+ ShapeText(rendererParameters, embeddedItemLayout, internalData);
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // Retrieve the glyph's metrics.
+ ////////////////////////////////////////////////////////////////////////////////
+ metrics->GetGlyphMetrics(rendererParameters.glyphs.Begin(), internalData.numberOfGlyphs);
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // Layout the text
+ ////////////////////////////////////////////////////////////////////////////////
+ int boundingBox = textParameters.textHeight - (textParameters.padding.top + textParameters.padding.bottom);
+ textParameters.textHeight = MAX_INT; // layout for the entire area.
+ LayoutText(textParameters, rendererParameters, embeddedItemLayout, internalData);
+
+ ////////////////////////////////////////////////////////////////////////////////
+ // Calculation last character index
+ ////////////////////////////////////////////////////////////////////////////////
+ Vector<LineRun>& lines = internalData.textModel->mVisualModel->mLines;
+ unsigned int numberOfLines = lines.Count();
+ int numberOfCharacters = 0;
+ float penY = 0.f;
+ float lineSize = internalData.layoutEngine.GetDefaultLineSize();
+ float lineOffset = 0.f;
+ bool isLastLine;
+ for(unsigned int index = 0u; index < numberOfLines; ++index)
+ {
+ const LineRun& line = *(lines.Begin() + index);
+ numberOfCharacters += line.characterRun.numberOfCharacters;
+ isLastLine = (index == numberOfLines - 1);
+
+ lineOffset = lineSize > 0.f ? lineSize : GetLineHeight(line, isLastLine);
+ penY += lineOffset;
+ if((penY + lineOffset) > boundingBox)
+ {
+ offsetValues.PushBack(numberOfCharacters);
+ penY = 0.f;
+ }
+ }
+ if(penY > 0.f)
+ {
+ // add remain character index
+ offsetValues.PushBack(numberOfCharacters);
+ }
+
+ return offsetValues;
+}
+
+Dali::Property::Array GetLastCharacterIndex(RendererParameters& textParameters)
+{
+ Dali::Property::Array offsetValues = Toolkit::DevelText::RenderForLastIndex(textParameters);
+ return offsetValues;
+}
+