+
+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.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;
+ for( unsigned int index = 0u; index < numberOfLines; ++index )
+ {
+ const LineRun& line = *( lines.Begin() + index );
+ numberOfCharacters += line.characterRun.numberOfCharacters;
+ penY += ( line.ascender + -line.descender );
+ if( ( penY + ( line.ascender + -line.descender ) ) > 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;
+}
+
+