38 for(
size_t i = 0;
i < rFontName.size();
i++)
42 if ( ((
ch >= 0x3040) && (
ch <= 0x30FF)) ||
43 ((
ch >= 0x3190) && (
ch <= 0x319F)) )
44 return ImplFontAttrs::CJK|ImplFontAttrs::CJK_JP;
47 if ( ((
ch >= 0xAC00) && (
ch <= 0xD7AF)) ||
48 ((
ch >= 0xA960) && (
ch <= 0xA97F)) ||
49 ((
ch >= 0xD7B0) && (
ch <= 0xD7FF)) ||
50 ((
ch >= 0x3130) && (
ch <= 0x318F)) ||
51 ((
ch >= 0x1100) && (
ch <= 0x11FF)) )
52 return ImplFontAttrs::CJK|ImplFontAttrs::CJK_KR;
55 if ( (
ch >= 0x3400) && (
ch <= 0x9FFF) )
56 return ImplFontAttrs::CJK|ImplFontAttrs::CJK_TC|ImplFontAttrs::CJK_SC;
59 if ( ((
ch >= 0x3000) && (
ch <= 0xD7AF)) ||
60 ((
ch >= 0xFF00) && (
ch <= 0xFFEE)) )
61 return ImplFontAttrs::CJK;
65 return ImplFontAttrs::None;
72 : mbMatchData( false )
73 , mpPreMatchHook( nullptr )
74 , mpFallbackHook( nullptr )
75 , mnFallbackCount( -1 )
111 static const char* aGlyphFallbackList[] = {
114 "arialunicodems",
"cyberbit",
"code2000",
"",
116 "starsymbol",
"opensymbol",
"",
117 "msmincho",
"fzmingti",
"fzheiti",
"ipamincho",
"sazanamimincho",
"kochimincho",
"",
118 "sunbatang",
"sundotum",
"baekmukdotum",
"gulim",
"batang",
"dotum",
"",
119 "hgmincholightj",
"msunglightsc",
"msunglighttc",
"hymyeongjolightk",
"",
120 "tahoma",
"dejavusans",
"timesnewroman",
"liberationsans",
"",
121 "shree",
"mangal",
"",
122 "raavi",
"shruti",
"tunga",
"",
123 "latha",
"gautami",
"kartika",
"vrinda",
"",
124 "shayyalmt",
"naskmt",
"scheherazade",
"",
125 "david",
"nachlieli",
"lucidagrande",
"",
126 "norasi",
"angsanaupc",
"",
130 "padauk",
"pinlonmyanmar",
"",
131 "iskoolapota",
"lklug",
"",
135 bool bHasEudc =
false;
137 int nBestQuality = 0;
138 std::unique_ptr<std::array<PhysicalFontFamily*,MAX_GLYPHFALLBACK>> pFallbackList;
140 for(
const char** ppNames = &aGlyphFallbackList[0];; ++ppNames )
145 if( nBestQuality > 0 )
157 OUString aTokenName( *ppNames, strlen(*ppNames), RTL_TEXTENCODING_UTF8 );
164 if( nBestQuality < pFallbackFont->GetMinQuality() )
169 pFallbackList.reset(
new std::array<PhysicalFontFamily*,MAX_GLYPHFALLBACK>);
171 (*pFallbackList)[ nMaxLevel ] = pFallbackFont;
172 if( !bHasEudc && !nMaxLevel )
173 bHasEudc = !strncmp( *ppNames,
"eudc", 5 );
183 OUString& rMissingCodes,
184 int nFallbackLevel)
const
195 sal_Int32 nStrIndex = 0;
196 while( nStrIndex < rMissingCodes.getLength() )
198 cChar = rMissingCodes.iterateCodePoints( &nStrIndex );
213 int nRemainingLength = 0;
214 std::unique_ptr<sal_UCS4[]>
const pRemainingCodes(
new sal_UCS4[rMissingCodes.getLength()]);
219 while( nStrIndex < rMissingCodes.getLength() )
221 cChar = rMissingCodes.iterateCodePoints( &nStrIndex );
223 &aFontName, &bEmbolden, &aMatrix);
224 if (!bCached || rFontSelData.
maSearchName != aFontName ||
228 pRemainingCodes[ nRemainingLength++ ] = cChar;
231 rMissingCodes = OUString( pRemainingCodes.get(), nRemainingLength );
235 OUString aOldMissingCodes = rMissingCodes;
260 if( nStrIndex >= aOldMissingCodes.getLength() )
262 cChar = aOldMissingCodes.iterateCodePoints( &nStrIndex );
267 for( nStrIndex = 0; nStrIndex < rMissingCodes.getLength(); )
269 cChar = rMissingCodes.iterateCodePoints( &nStrIndex );
289 pFallbackData = (*mpFallbackList)[ nFallbackLevel ];
292 return pFallbackData;
329 pFoundData = (*it).second.get();
345 for( sal_Int32 nTokenPos = 0; nTokenPos != -1; )
348 if( aFamilyName.empty() )
374 if( nSearchType != ImplFontAttrs::None )
381 eSearchWeight, eSearchWidth, eSearchSlant,
u"" );
401 const utl::FontSubstConfiguration& rFontSubst = utl::FontSubstConfiguration::get();
405 const OUString& rSearchName = family.first;
416 std::u16string_view rSearchFamilyName )
const
419 nSearchType |= ImplFontAttrs::Italic;
422 if( nSearchType == ImplFontAttrs::None
458 if ( nSearchType & ImplFontAttrs::CJK )
462 if ( !(nMatchType & ImplFontAttrs::CJK_AllLang) )
464 nTestMatch -= 10000000;
469 if ( (nSearchType & ImplFontAttrs::CJK_AllLang)
470 && (nMatchType & ImplFontAttrs::CJK_AllLang) )
471 nTestMatch += 10000000*3;
472 if ( nMatchType & ImplFontAttrs::CJK )
473 nTestMatch += 10000000*2;
474 if ( nMatchType & ImplFontAttrs::Full )
475 nTestMatch += 10000000;
478 else if ( nMatchType & ImplFontAttrs::CJK )
480 nTestMatch -= 10000000;
484 if( nSearchType & ImplFontAttrs::CTL )
486 if( nMatchType & ImplFontAttrs::CTL )
487 nTestMatch += 10000000*2;
488 if( nMatchType & ImplFontAttrs::Full )
489 nTestMatch += 10000000;
491 else if ( nMatchType & ImplFontAttrs::CTL )
493 nTestMatch -= 10000000;
497 if( nSearchType & ImplFontAttrs::NoneLatin )
499 if( nMatchType & ImplFontAttrs::NoneLatin )
500 nTestMatch += 10000000*2;
501 if( nMatchType & ImplFontAttrs::Full )
502 nTestMatch += 10000000;
506 if ( nSearchType & ImplFontAttrs::Symbol )
508 const OUString& rSearchName = family.first;
510 if ( rSearchName ==
"starsymbol" )
512 nTestMatch += 10000000*6+(10000*3);
514 else if ( rSearchName ==
"opensymbol" )
516 nTestMatch += 10000000*6;
518 else if ( rSearchName ==
"starbats" ||
519 rSearchName ==
"wingdings" ||
520 rSearchName ==
"monotypesorts" ||
521 rSearchName ==
"dingbats" ||
522 rSearchName ==
"zapfdingbats" )
524 nTestMatch += 10000000*5;
528 nTestMatch += 10000000*4;
532 if( nMatchType & ImplFontAttrs::Symbol )
533 nTestMatch += 10000000*2;
534 if( nMatchType & ImplFontAttrs::Full )
535 nTestMatch += 10000000;
540 nTestMatch -= 10000000;
542 else if ( nMatchType & ImplFontAttrs::Symbol )
548 if( !rSearchFamilyName.empty() && (rSearchFamilyName ==
pData->GetMatchFamilyName()) )
550 nTestMatch += 1000000*3;
554 if( nSearchType & ImplFontAttrs::AllScript )
556 if( nMatchType & ImplFontAttrs::AllScript )
558 nTestMatch += 1000000*2;
560 if( nSearchType & ImplFontAttrs::AllSubscript )
562 if( ImplFontAttrs::None == ((nSearchType ^ nMatchType) & ImplFontAttrs::AllSubscript) )
563 nTestMatch += 1000000*2;
564 if( ImplFontAttrs::None != ((nSearchType ^ nMatchType) & ImplFontAttrs::BrushScript) )
565 nTestMatch -= 1000000;
568 else if( nMatchType & ImplFontAttrs::AllScript )
570 nTestMatch -= 1000000;
574 if( nSearchType & ImplFontAttrs::Fixed )
576 if( nMatchType & ImplFontAttrs::Fixed )
577 nTestMatch += 1000000*2;
579 if( ImplFontAttrs::None == ((nSearchType ^ nMatchType) & ImplFontAttrs::Typewriter) )
580 nTestMatch += 10000*2;
582 else if( nMatchType & ImplFontAttrs::Fixed )
584 nTestMatch -= 1000000;
588 if( nSearchType & ImplFontAttrs::Special )
590 if( nMatchType & ImplFontAttrs::Special )
594 else if( !(nSearchType & ImplFontAttrs::AllSerifStyle) )
596 if( nMatchType & ImplFontAttrs::Serif )
598 nTestMatch += 1000*2;
600 else if( nMatchType & ImplFontAttrs::SansSerif )
606 else if( (nMatchType & ImplFontAttrs::Special) && !(nSearchType & ImplFontAttrs::Symbol) )
608 nTestMatch -= 1000000;
612 if( nSearchType & ImplFontAttrs::Decorative )
614 if( nMatchType & ImplFontAttrs::Decorative )
618 else if( !(nSearchType & ImplFontAttrs::AllSerifStyle) )
620 if( nMatchType & ImplFontAttrs::Serif )
621 nTestMatch += 1000*2;
622 else if ( nMatchType & ImplFontAttrs::SansSerif )
626 else if( nMatchType & ImplFontAttrs::Decorative )
628 nTestMatch -= 1000000;
632 if( nSearchType & (ImplFontAttrs::Titling | ImplFontAttrs::Capitals) )
634 if( nMatchType & (ImplFontAttrs::Titling | ImplFontAttrs::Capitals) )
636 nTestMatch += 1000000*2;
638 if( ImplFontAttrs::None == ((nSearchType^nMatchType) &
ImplFontAttrs(ImplFontAttrs::Titling | ImplFontAttrs::Capitals)))
640 nTestMatch += 1000000;
642 else if( (nMatchType & (ImplFontAttrs::Titling | ImplFontAttrs::Capitals)) &&
643 (nMatchType & (ImplFontAttrs::Standard | ImplFontAttrs::Default)) )
645 nTestMatch += 1000000;
648 else if( nMatchType & (ImplFontAttrs::Titling | ImplFontAttrs::Capitals) )
650 nTestMatch -= 1000000;
654 if( nSearchType & (ImplFontAttrs::Outline | ImplFontAttrs::Shadow) )
656 if( nMatchType & (ImplFontAttrs::Outline | ImplFontAttrs::Shadow) )
658 nTestMatch += 1000000*2;
660 if( ImplFontAttrs::None == ((nSearchType ^ nMatchType) &
ImplFontAttrs(ImplFontAttrs::Outline | ImplFontAttrs::Shadow)) )
662 nTestMatch += 1000000;
664 else if( (nMatchType & (ImplFontAttrs::Outline | ImplFontAttrs::Shadow)) &&
665 (nMatchType & (ImplFontAttrs::Standard | ImplFontAttrs::Default)) )
667 nTestMatch += 1000000;
670 else if ( nMatchType & (ImplFontAttrs::Outline | ImplFontAttrs::Shadow) )
672 nTestMatch -= 1000000;
677 if( (rSearchFamilyName.size() >= 4) &&
678 (
pData->GetMatchFamilyName().getLength() >= 4) &&
679 ((rSearchFamilyName.find(
pData->GetMatchFamilyName() ) != std::u16string_view::npos) ||
680 (
pData->GetMatchFamilyName().indexOf( rSearchFamilyName ) != -1)) )
685 if( nSearchType & ImplFontAttrs::Serif )
687 if( nMatchType & ImplFontAttrs::Serif )
688 nTestMatch += 1000000*2;
689 else if( nMatchType & ImplFontAttrs::SansSerif )
690 nTestMatch -= 1000000;
694 if( nSearchType & ImplFontAttrs::SansSerif )
696 if( nMatchType & ImplFontAttrs::SansSerif )
697 nTestMatch += 1000000;
698 else if ( nMatchType & ImplFontAttrs::Serif )
699 nTestMatch -= 1000000;
703 if( nSearchType & ImplFontAttrs::Italic )
706 nTestMatch += 1000000*3;
707 if( nMatchType & ImplFontAttrs::Italic )
708 nTestMatch += 1000000;
710 else if (!(nSearchType & ImplFontAttrs::AllScript)
711 && ((nMatchType & ImplFontAttrs::Italic)
714 nTestMatch -= 1000000*2;
722 if( eSearchWidth == eMatchWidth )
723 nTestMatch += 1000000*3;
725 nTestMatch += 1000000;
729 if( eSearchWidth == eMatchWidth )
730 nTestMatch += 1000000*3;
732 nTestMatch += 1000000;
737 nTestMatch -= 1000000;
748 nTestMatch += 1000000;
750 nTestMatch += 1000000;
755 nTestMatch += 1000000;
757 nTestMatch += 1000000;
765 nTestMatch -= 1000000;
770 nTestMatch += 10000*4;
772 nTestMatch -= 10000*4;
775 if( nMatchType & ImplFontAttrs::Standard )
776 nTestMatch += 10000*2;
777 if( nMatchType & ImplFontAttrs::Default )
779 if( nMatchType & ImplFontAttrs::Full )
781 if( nMatchType & ImplFontAttrs::Normal )
785 if( ((nSearchType ^ nMatchType) & ImplFontAttrs::OtherStyle) != ImplFontAttrs::None )
791 if( ImplFontAttrs::None == ((nSearchType ^ nMatchType) & ImplFontAttrs::Rounded) )
795 if( ImplFontAttrs::None == ((nSearchType ^ nMatchType) & ImplFontAttrs::Typewriter) )
799 if( nSearchType & ImplFontAttrs::Gothic )
801 if( nMatchType & ImplFontAttrs::Gothic )
802 nTestMatch += 1000*3;
803 if( nMatchType & ImplFontAttrs::SansSerif )
804 nTestMatch += 1000*2;
808 if( nSearchType & ImplFontAttrs::Schoolbook )
810 if( nMatchType & ImplFontAttrs::Schoolbook )
811 nTestMatch += 1000*3;
812 if( nMatchType & ImplFontAttrs::Serif )
813 nTestMatch += 1000*2;
817 if ( nTestMatch > nBestMatch )
820 nBestMatch = nTestMatch;
821 nBestType = nMatchType;
823 else if( nTestMatch == nBestMatch )
826 if( nMatchType & ImplFontAttrs::Default )
829 nBestType = nMatchType;
831 else if( (nMatchType & ImplFontAttrs::Standard) &&
832 !(nBestType & ImplFontAttrs::Default) )
835 nBestType = nMatchType;
852 OUString aFontname = rDefaults.
getDefaultFont( aLanguageTag, DefaultFontType::SANS_UNICODE );
858 aFontname = rDefaults.
getDefaultFont( aLanguageTag, DefaultFontType::SANS );
863 aFontname = rDefaults.
getDefaultFont( aLanguageTag, DefaultFontType::SERIF );
868 aFontname = rDefaults.
getDefaultFont( aLanguageTag, DefaultFontType::FIXED );
881 if(
pData->GetMatchType() & ImplFontAttrs::Symbol )
885 if(
pData->GetMatchType() & (ImplFontAttrs::Default|ImplFontAttrs::Standard) )
894 pFoundData = (*it).second.get();
901 auto xClonedCollection = std::make_shared<PhysicalFontCollection>();
906 xClonedCollection->mbMatchData =
false;
914 return xClonedCollection;
927 return pDeviceFontList;
935 {
"Times New Roman",
"Liberation Serif" },
936 {
"Arial",
"Liberation Sans" },
937 {
"Arial Narrow",
"Liberation Sans Narrow" },
938 {
"Courier New",
"Liberation Mono" },
939 {
"Cambria",
"Caladea" },
940 {
"Calibri",
"Carlito" },
963 static bool noFontLookup = getenv(
"SAL_NO_FONT_LOOKUP") !=
nullptr;
975 bool bMultiToken =
false;
976 sal_Int32 nTokenPos = 0;
987 OUString aBaseFontName = aSearchName.copy( 0, (nFeat != -1) ? nFeat : aSearchName.getLength() );
991 aSearchName = aBaseFontName;
1000 aSearchName.startsWithIgnoreAsciiCase(
"hg" ) )
1003 if( aSearchName.startsWithIgnoreAsciiCase(
"hggothicb" ) )
1004 aBoldName =
"hggothice";
1005 else if( aSearchName.startsWithIgnoreAsciiCase(
"hgpgothicb" ) )
1006 aBoldName =
"hgpgothice";
1007 else if( aSearchName.startsWithIgnoreAsciiCase(
"hgminchol" ) )
1008 aBoldName =
"hgminchob";
1009 else if( aSearchName.startsWithIgnoreAsciiCase(
"hgpminchol" ) )
1010 aBoldName =
"hgpminchob";
1011 else if( aSearchName.equalsIgnoreAsciiCase(
"hgminchob" ) )
1012 aBoldName =
"hgminchoe";
1013 else if( aSearchName.equalsIgnoreAsciiCase(
"hgpminchob" ) )
1014 aBoldName =
"hgpminchoe";
1019 aSearchName = aBoldName;
1069 if( nTokenPos == -1)
1079 for( nTokenPos = 0; nTokenPos != -1; )
1108 OUString aSearchShortName;
1109 OUString aSearchFamilyName;
1113 utl::FontSubstConfiguration::getMapName( aSearchName, aSearchShortName, aSearchFamilyName,
1114 eSearchWeight, eSearchWidth, nSearchType );
1118 if ( aSearchShortName != aSearchName )
1128 if ((aSearchName !=
"msmincho") && (aSearchName !=
"msgothic"))
1143 const utl::FontSubstConfiguration& rFontSubst = utl::FontSubstConfiguration::get();
1144 pFontAttr = rFontSubst.getSubstInfo( aSearchName );
1145 if ( !pFontAttr && (aSearchShortName != aSearchName) )
1146 pFontAttr = rFontSubst.getSubstInfo( aSearchShortName );
1147 if ( !pFontAttr && (aSearchFamilyName != aSearchShortName) )
1148 pFontAttr = rFontSubst.getSubstInfo( aSearchFamilyName );
1164 aSearchName =
"OpenSymbol";
1173 while( nTokenPos != -1 )
1181 OUString aTempShortName;
1182 OUString aTempFamilyName;
1186 utl::FontSubstConfiguration::getMapName( aSearchName, aTempShortName, aTempFamilyName,
1187 eTempWeight, eTempWidth, nTempType );
1190 if( aTempShortName != aSearchName )
1203 const utl::FontSubstConfiguration& rFontSubst = utl::FontSubstConfiguration::get();
1204 pTempFontAttr = rFontSubst.getSubstInfo( aSearchName );
1206 if ( !pTempFontAttr && (aTempShortName != aSearchName) )
1207 pTempFontAttr = rFontSubst.getSubstInfo( aTempShortName );
1209 if ( !pTempFontAttr && (aTempFamilyName != aTempShortName) )
1210 pTempFontAttr = rFontSubst.getSubstInfo( aTempFamilyName );
1220 pFontAttr = pTempFontAttr;
1226 nSearchType |= ImplFontAttrs::CJK | ImplFontAttrs::CJK_SC;
1228 nSearchType |= ImplFontAttrs::CJK | ImplFontAttrs::CJK_TC;
1230 nSearchType |= ImplFontAttrs::CJK | ImplFontAttrs::CJK_KR;
1232 nSearchType |= ImplFontAttrs::CJK | ImplFontAttrs::CJK_JP;
1237 nSearchType |= ImplFontAttrs::Symbol;
1242 eSearchWeight, eSearchWidth, rFSD.
GetItalic(), aSearchFamilyName);
1261 if ((nSearchType & ImplFontAttrs::Italic)
static ImplFontAttrs lcl_IsCJKFont(std::u16string_view rFontName)
#define MAX_GLYPHFALLBACK
void SetItalic(const FontItalic eItalic)
bool IsMicrosoftSymbolEncoded() const
FontFamily GetFamilyType() const
FontItalic GetItalic() const
void SetWeight(const FontWeight eWeight)
FontWeight GetWeight() const
const OUString & GetFamilyName() const
FontWidth GetWidthType() const
void AddFallbackForUnicode(sal_UCS4 cChar, FontWeight eWeight, const OUString &rFontName, bool bEmbolden, const ItalicMatrix &rMatrix)
bool GetFallbackForUnicode(sal_UCS4 cInChar, FontWeight eInWeight, OUString *pOutFontName, bool *pOutEmbolden, ItalicMatrix *pOutItalicMatrix) const
void IgnoreFallbackForUnicode(sal_UCS4, FontWeight eWeight, std::u16string_view rFontName)
static bool isKorean(LanguageType nLang)
static bool isTraditionalChinese(LanguageType nLang)
static bool isSimplifiedChinese(LanguageType nLang)
OUString getDefaultFont(const LanguageTag &rLanguageTag, DefaultFontType nType) const
static DefaultFontConfiguration & get()
ItalicMatrix maItalicMatrix
static const char FEAT_PREFIX
Abstracts the concept of finding the best font to support an incomplete font.
virtual bool FindFontSubstitute(vcl::font::FontSelectPattern &, LogicalFontInstance *pLogicalFont, OUString &rMissingCodes) const =0
void SetPreMatchHook(vcl::font::PreMatchFontSubstitution *)
~PhysicalFontCollection()
void ImplInitGenericGlyphFallback() const
void Add(vcl::font::PhysicalFontFace *)
vcl::font::PhysicalFontFamily * FindFontFamily(std::u16string_view rFontName) const
vcl::font::PhysicalFontFamily * ImplFindFontFamilyBySearchName(const OUString &) const
void SetFallbackHook(vcl::font::GlyphFallbackFontSubstitution *)
vcl::font::PreMatchFontSubstitution * mpPreMatchHook
vcl::font::GlyphFallbackFontSubstitution * mpFallbackHook
vcl::font::PhysicalFontFamily * FindFontFamilyByAttributes(ImplFontAttrs nSearchType, FontWeight, FontWidth, FontItalic, std::u16string_view rSearchFamily) const
vcl::font::PhysicalFontFamily * FindFontFamilyByTokenNames(std::u16string_view rTokenStr) const
void ImplInitMatchData() const
std::unique_ptr< vcl::font::PhysicalFontFaceCollection > GetFontFaceCollection() const
std::shared_ptr< PhysicalFontCollection > Clone() const
vcl::font::PhysicalFontFamily * GetGlyphFallbackFont(vcl::font::FontSelectPattern &, LogicalFontInstance *pLogicalFont, OUString &rMissingCodes, int nFallbackLevel) const
vcl::font::PhysicalFontFamily * FindOrCreateFontFamily(const OUString &rFamilyName)
vcl::font::PhysicalFontFamily * ImplFindFontFamilyBySubstFontAttr(const utl::FontNameAttr &) const
std::unique_ptr< std::array< vcl::font::PhysicalFontFamily *, MAX_GLYPHFALLBACK > > mpFallbackList
PhysicalFontFamilies maPhysicalFontFamilies
vcl::font::PhysicalFontFamily * ImplFindFontFamilyOfDefaultFont() const
abstract base class for physical font faces
void AddFontFace(PhysicalFontFace *)
void UpdateDevFontList(PhysicalFontFaceCollection &) const
void UpdateCloneFontList(PhysicalFontCollection &) const
int GetMinQuality() const
FontTypeFaces GetTypeFaces() const
void InitMatchData(const utl::FontSubstConfiguration &, const OUString &rSearchName)
static void CalcType(ImplFontAttrs &rType, FontWeight &rWeight, FontWidth &rWidth, FontFamily eFamily, const utl::FontNameAttr *pFontAttr)
Abstracts the concept of a configured font substitution before the availability of the originally sel...
virtual bool FindFontSubstitute(vcl::font::FontSelectPattern &) const =0
UNOTOOLS_DLLPUBLIC OUString StripScriptFromName(const OUString &rName)
UNOTOOLS_DLLPUBLIC OUString GetEnglishSearchFontName(std::u16string_view rName)
UNOTOOLS_DLLPUBLIC std::u16string_view GetNextFontToken(std::u16string_view rTokenStr, sal_Int32 &rIndex)
#define LANGUAGE_JAPANESE
std::unique_ptr< sal_Int32[]> pData
A PhysicalFontFaceCollection is created by a PhysicalFontCollection and becomes invalid when original...
static ImplFontAttrs lcl_IsCJKFont(std::u16string_view rFontName)
const std::vector< std::pair< OUString, OUString > > aMetricCompatibleMap
static bool FindMetricCompatibleFont(FontSelectPattern &rFontSelData)
void ImplFontSubstitute(OUString &rFontName)
::std::vector< OUString > Substitutions