+ mHighlightActor = Actor::New();
+
+ mHighlightActor.SetProperty( Dali::Actor::Property::NAME, "HighlightActor" );
+ mHighlightActor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::TOP_LEFT );
+ mHighlightActor.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::TOP_LEFT );
+ mHighlightActor.SetProperty( Actor::Property::COLOR, mHighlightColor );
+ mHighlightActor.SetProperty( Actor::Property::COLOR_MODE, USE_OWN_COLOR );
+ }
+
+ // Add the highlight box telling the controller it needs clipping.
+ mController.AddDecoration( mHighlightActor, true );
+ }
+
+ void UpdateHighlight()
+ {
+ if ( mHighlightActor )
+ {
+ // Sets the position of the highlight actor inside the decorator.
+ mHighlightActor.SetProperty( Actor::Property::POSITION, Vector2( mHighlightPosition.x + mHighlightOutlineOffset,
+ mHighlightPosition.y + mHighlightOutlineOffset ) );
+
+ const unsigned int numberOfQuads = mHighlightQuadList.Count();
+ if( 0u != numberOfQuads )
+ {
+ // Set the size of the highlighted text to the actor.
+ mHighlightActor.SetProperty( Actor::Property::SIZE, mHighlightSize );
+
+ // Used to translate the vertices given in decorator's coords to the mHighlightActor's local coords.
+ const float offsetX = mHighlightPosition.x + 0.5f * mHighlightSize.width;
+ const float offsetY = mHighlightPosition.y + 0.5f * mHighlightSize.height;
+
+ Vector<Vector2> vertices;
+ Vector<unsigned short> indices;
+
+ vertices.Reserve( 4u * numberOfQuads );
+ indices.Reserve( 6u * numberOfQuads );
+
+ // Index to the vertex.
+ unsigned int v = 0u;
+
+ // Traverse all quads.
+ for( Vector<Vector4>::ConstIterator it = mHighlightQuadList.Begin(),
+ endIt = mHighlightQuadList.End();
+ it != endIt;
+ ++it, v += 4u )
+ {
+ const Vector4& quad = *it;
+
+ Vector2 vertex;
+
+ // top-left (v+0)
+ vertex.x = quad.x - offsetX;
+ vertex.y = quad.y - offsetY;
+ vertices.PushBack( vertex );
+
+ // top-right (v+1)
+ vertex.x = quad.z - offsetX;
+ vertex.y = quad.y - offsetY;
+ vertices.PushBack( vertex );
+
+ // bottom-left (v+2)
+ vertex.x = quad.x - offsetX;
+ vertex.y = quad.w - offsetY;
+ vertices.PushBack( vertex );
+
+ // bottom-right (v+3)
+ vertex.x = quad.z - offsetX;
+ vertex.y = quad.w - offsetY;
+ vertices.PushBack( vertex );
+
+ // triangle A (3, 1, 0)
+ indices.PushBack( v + 3 );
+ indices.PushBack( v + 1 );
+ indices.PushBack( v );
+
+ // triangle B (0, 2, 3)
+ indices.PushBack( v );
+ indices.PushBack( v + 2 );
+ indices.PushBack( v + 3 );
+ }
+
+ if( ! mQuadVertices )
+ {
+ mQuadVertices = PropertyBuffer::New( mQuadVertexFormat );
+ }
+
+ mQuadVertices.SetData( &vertices[ 0 ], vertices.Size() );
+
+ if( !mQuadGeometry )
+ {
+ mQuadGeometry = Geometry::New();
+ mQuadGeometry.AddVertexBuffer( mQuadVertices );
+ }
+ mQuadGeometry.SetIndexBuffer( &indices[ 0 ], indices.Size() );
+
+ if( !mHighlightRenderer )
+ {
+ mHighlightRenderer = Dali::Renderer::New( mQuadGeometry, mHighlightShader );
+ mHighlightActor.AddRenderer( mHighlightRenderer );
+ }
+ }
+
+ mHighlightQuadList.Clear();
+
+ if( mHighlightRenderer )
+ {
+ mHighlightRenderer.SetProperty( Renderer::Property::DEPTH_INDEX, mTextDepth - 2 ); // text is rendered at mTextDepth and text's shadow at mTextDepth -1u.
+ }