- // Retrieve from the visual model the glyphs and positions.
- mImpl->mVisualModel->GetGlyphs( glyphs,
- glyphIndex,
- numberOfLaidOutGlyphs );
+ if( 0u < numberOfLaidOutGlyphs )
+ {
+ // Retrieve from the visual model the glyphs and positions.
+ mImpl->mVisualModel->GetGlyphs( glyphs,
+ glyphIndex,
+ numberOfLaidOutGlyphs );
+
+ mImpl->mVisualModel->GetGlyphPositions( glyphPositions,
+ glyphIndex,
+ numberOfLaidOutGlyphs );
+
+ // Set the colors.
+ const GlyphIndex lastLaidOutGlyphIndex = glyphIndex + numberOfLaidOutGlyphs;
+
+ for( Vector<ColorGlyphRun>::ConstIterator it = mImpl->mVisualModel->mColorRuns.Begin(),
+ endIt = mImpl->mVisualModel->mColorRuns.End();
+ it != endIt;
+ ++it )
+ {
+ const ColorGlyphRun& colorGlyphRun = *it;
+ const GlyphIndex lastGlyphIndex = colorGlyphRun.glyphRun.glyphIndex + colorGlyphRun.glyphRun.numberOfGlyphs;
+
+ if( ( colorGlyphRun.glyphRun.glyphIndex < lastLaidOutGlyphIndex ) &&
+ ( glyphIndex < lastGlyphIndex ) )
+ {
+ for( GlyphIndex index = glyphIndex < colorGlyphRun.glyphRun.glyphIndex ? colorGlyphRun.glyphRun.glyphIndex : glyphIndex,
+ endIndex = lastLaidOutGlyphIndex < lastGlyphIndex ? lastLaidOutGlyphIndex : lastGlyphIndex;
+ index < endIndex;
+ ++index )
+ {
+ *( glyphColors + index - glyphIndex ) = colorGlyphRun.color;
+ }
+ }
+ }
+
+ // Get the lines for the given range of glyphs.
+ // The lines contain the alignment offset which needs to be added to the glyph's position.
+ LineIndex firstLine = 0u;
+ Length numberOfLines = 0u;
+ mImpl->mVisualModel->GetNumberOfLines( glyphIndex,
+ numberOfLaidOutGlyphs,
+ firstLine,
+ numberOfLines );