return VisualModelPtr( new VisualModel() );
}
-void VisualModel::SetGlyphs( const GlyphInfo* glyphs,
- const CharacterIndex* characterIndices,
- const Length* charactersPerGlyph,
+void VisualModel::SetGlyphs( const GlyphInfo* const glyphs,
+ const CharacterIndex* const characterIndices,
+ const Length* const charactersPerGlyph,
Length numberOfGlyphs )
{
if( 0u == numberOfGlyphs )
memcpy( glyphsPerCharacter, mGlyphsPerCharacter.Begin() + characterIndex, numberOfCharacters * sizeof( Length ) );
}
-void VisualModel::SetGlyphPositions( const Vector2* glyphPositions,
+void VisualModel::SetGlyphPositions( const Vector2* const glyphPositions,
Length numberOfGlyphs )
{
if( 0u == numberOfGlyphs )
memcpy( lines, mLines.Begin() + firstLine, numberOfLines * sizeof( LineRun ) );
}
+LineIndex VisualModel::GetLineOfGlyph( GlyphIndex glyphIndex )
+{
+ const CharacterIndex characterIndex = *( mGlyphsToCharacters.Begin() + glyphIndex );
+
+ return GetLineOfCharacter( characterIndex );
+}
+
+LineIndex VisualModel::GetLineOfCharacter( CharacterIndex characterIndex )
+{
+ // 1) Check first in the cached line.
+
+ const LineRun& lineRun = *( mLines.Begin() + mCachedLineIndex );
+
+ if( ( lineRun.characterRun.characterIndex <= characterIndex ) &&
+ ( characterIndex < lineRun.characterRun.characterIndex + lineRun.characterRun.numberOfCharacters ) )
+ {
+ return mCachedLineIndex;
+ }
+
+ // 2) Is not in the cached line. Check in the other lines.
+
+ LineIndex index = characterIndex < lineRun.characterRun.characterIndex ? 0u : mCachedLineIndex + 1u;
+
+ for( Vector<LineRun>::ConstIterator it = mLines.Begin() + index,
+ endIt = mLines.End();
+ it != endIt;
+ ++it, ++index )
+ {
+ const LineRun& lineRun = *it;
+
+ if( characterIndex < lineRun.characterRun.characterIndex + lineRun.characterRun.numberOfCharacters )
+ {
+ mCachedLineIndex = index;
+ break;
+ }
+ }
+
+ return index;
+}
+
void VisualModel::ReplaceLines( GlyphIndex glyphIndex,
Length numberOfGlyphsToRemove,
const LineRun* const lines,
return mActualSize;
}
+void VisualModel::SetTextColor( const Vector4& textColor )
+{
+ mTextColor = textColor;
+
+ if ( !mUnderlineColorSet )
+ {
+ mUnderlineColor = textColor;
+ }
+}
+
+void VisualModel::SetShadowOffset( const Vector2& shadowOffset )
+{
+ mShadowOffset = shadowOffset;
+}
+
+void VisualModel::SetShadowColor( const Vector4& shadowColor )
+{
+ mShadowColor = shadowColor;
+}
+
+void VisualModel::SetUnderlineColor( const Vector4& color )
+{
+ mUnderlineColor = color;
+ mUnderlineColorSet = true;
+}
+
+void VisualModel::SetUnderlineEnabled( bool enabled )
+{
+ mUnderlineEnabled = enabled;
+}
+
+void VisualModel::SetUnderlineHeight( float height )
+{
+ mUnderlineHeight = height;
+}
+
+const Vector4& VisualModel::GetTextColor() const
+{
+ return mTextColor;
+}
+
+const Vector2& VisualModel::GetShadowOffset() const
+{
+ return mShadowOffset;
+}
+
+const Vector4& VisualModel::GetShadowColor() const
+{
+ return mShadowColor;
+}
+
+const Vector4& VisualModel::GetUnderlineColor() const
+{
+ return mUnderlineColor;
+}
+
+bool VisualModel::IsUnderlineEnabled() const
+{
+ return mUnderlineEnabled;
+}
+
+float VisualModel::GetUnderlineHeight() const
+{
+ return mUnderlineHeight;
+}
+
+void VisualModel::ClearCaches()
+{
+ mCachedLineIndex = 0u;
+}
+
VisualModel::~VisualModel()
{
}
VisualModel::VisualModel()
+: mGlyphs(),
+ mGlyphsToCharacters(),
+ mCharactersToGlyph(),
+ mCharactersPerGlyph(),
+ mGlyphsPerCharacter(),
+ mGlyphPositions(),
+ mLines(),
+ mTextColor( Color::BLACK ),
+ mShadowColor( Color::BLACK ),
+ mUnderlineColor( Color::BLACK ),
+ mShadowOffset( Vector2::ZERO ),
+ mUnderlineHeight( 0.0f ),
+ mNaturalSize(),
+ mActualSize(),
+ mCachedLineIndex( 0u ),
+ mUnderlineEnabled( false ),
+ mUnderlineColorSet( false )
{
}