summaryrefslogtreecommitdiff
path: root/vcl/generic
diff options
context:
space:
mode:
authorKhaled Hosny <khaledhosny@eglug.org>2013-05-06 01:40:06 +0200
committerKhaled Hosny <khaledhosny@eglug.org>2013-05-06 01:43:34 +0200
commit9a8f125fa7e63b829471a6722dae3006bb1f57d2 (patch)
tree696b285598260e0ca6b149c55bd3aff3a4dd6b4c /vcl/generic
parent26ec39fc9f4fecd826983b08b64990ca608e48c4 (diff)
[harfbuzz] Support Unicode variation selectors
Change-Id: I8c56f45505327857613c39b28da3ae7cc3ad201c
Diffstat (limited to 'vcl/generic')
-rw-r--r--vcl/generic/glyphs/gcach_ftyp.cxx29
-rw-r--r--vcl/generic/glyphs/gcach_layout.cxx8
2 files changed, 20 insertions, 17 deletions
diff --git a/vcl/generic/glyphs/gcach_ftyp.cxx b/vcl/generic/glyphs/gcach_ftyp.cxx
index 09a00dba182e..c1d6ddba2783 100644
--- a/vcl/generic/glyphs/gcach_ftyp.cxx
+++ b/vcl/generic/glyphs/gcach_ftyp.cxx
@@ -1177,7 +1177,7 @@ int ServerFont::ApplyGlyphTransform( int nGlyphFlags,
// -----------------------------------------------------------------------
-int ServerFont::GetRawGlyphIndex( sal_UCS4 aChar ) const
+int ServerFont::GetRawGlyphIndex(sal_UCS4 aChar, sal_UCS4 aVS) const
{
if( mpFontInfo->IsSymbolFont() )
{
@@ -1216,18 +1216,27 @@ int ServerFont::GetRawGlyphIndex( sal_UCS4 aChar ) const
aChar = aChar*256 + (aTempArray[i] & 0xFF);
}
- // cache glyph indexes in font info to share between different sizes
- int nGlyphIndex = mpFontInfo->GetGlyphIndex( aChar );
- if( nGlyphIndex < 0 )
+ int nGlyphIndex = 0;
+ // If asked, check first for variant glyph with the given Unicode variation
+ // selector. This is quite uncommon so we don't bother with caching here.
+ if (aVS)
+ nGlyphIndex = FT_Face_GetCharVariantIndex(maFaceFT, aChar, aVS);
+
+ if (nGlyphIndex == 0)
{
- nGlyphIndex = FT_Get_Char_Index( maFaceFT, aChar );
- if( !nGlyphIndex)
+ // cache glyph indexes in font info to share between different sizes
+ nGlyphIndex = mpFontInfo->GetGlyphIndex( aChar );
+ if( nGlyphIndex < 0 )
{
- // check if symbol aliasing helps
- if( (aChar <= 0x00FF) && mpFontInfo->IsSymbolFont() )
- nGlyphIndex = FT_Get_Char_Index( maFaceFT, aChar | 0xF000 );
+ nGlyphIndex = FT_Get_Char_Index( maFaceFT, aChar );
+ if( !nGlyphIndex)
+ {
+ // check if symbol aliasing helps
+ if( (aChar <= 0x00FF) && mpFontInfo->IsSymbolFont() )
+ nGlyphIndex = FT_Get_Char_Index( maFaceFT, aChar | 0xF000 );
+ }
+ mpFontInfo->CacheGlyphIndex( aChar, nGlyphIndex );
}
- mpFontInfo->CacheGlyphIndex( aChar, nGlyphIndex );
}
return nGlyphIndex;
diff --git a/vcl/generic/glyphs/gcach_layout.cxx b/vcl/generic/glyphs/gcach_layout.cxx
index f7b69073c858..cb6c1953a74a 100644
--- a/vcl/generic/glyphs/gcach_layout.cxx
+++ b/vcl/generic/glyphs/gcach_layout.cxx
@@ -246,13 +246,7 @@ static hb_bool_t getFontGlyph(hb_font_t* /*font*/, void* pFontData,
void* /*pUserData*/)
{
ServerFont* pFont = (ServerFont*) pFontData;
- *nGlyphIndex = 0;
-
- if (vs)
- *nGlyphIndex = pFont->GetRawGlyphIndex(ch /*, vs*/); // XXX handle variation selectors
-
- if (*nGlyphIndex == 0)
- *nGlyphIndex = pFont->GetRawGlyphIndex(ch);
+ *nGlyphIndex = pFont->GetRawGlyphIndex(ch, vs);
return *nGlyphIndex != 0;
}