#i87970# better debug printing for FC substitutions

This commit is contained in:
Herbert Duerr [hdu] 2010-02-26 16:42:15 +01:00
parent 8f25475364
commit baab9baa6a

View file

@ -2165,7 +2165,7 @@ namespace
bool FcPreMatchSubstititution::FindFontSubstitute( ImplFontSelectData &rFontSelData ) const bool FcPreMatchSubstititution::FindFontSubstitute( ImplFontSelectData &rFontSelData ) const
{ {
// We dont' actually want to talk to Fontconfig at all for symbol fonts // We dont' actually want to talk to Fontconfig at all for symbol fonts
if (rFontSelData.IsSymbolFont()) if( rFontSelData.IsSymbolFont() )
return false; return false;
// StarSymbol is a unicode font, but it still deserves the symbol flag // StarSymbol is a unicode font, but it still deserves the symbol flag
if( 0 == rFontSelData.maSearchName.CompareIgnoreCaseToAscii( "starsymbol", 10) if( 0 == rFontSelData.maSearchName.CompareIgnoreCaseToAscii( "starsymbol", 10)
@ -2174,19 +2174,32 @@ bool FcPreMatchSubstititution::FindFontSubstitute( ImplFontSelectData &rFontSelD
rtl::OUString aDummy; rtl::OUString aDummy;
const ImplFontSelectData aOut = GetFcSubstitute( rFontSelData, aDummy ); const ImplFontSelectData aOut = GetFcSubstitute( rFontSelData, aDummy );
if (!aOut.maSearchName.Len()) // TODO: cache the font substitution suggestion
return false; // FC doing it would be preferable because it knows the invariables
if( uselessmatch(rFontSelData, aOut ) ) // e.g. FC knows the FC rule that all Arial gets replaced by LiberationSans
// whereas we would have to check for every size or attribute
if( !aOut.maSearchName.Len() )
return false; return false;
const bool bHaveSubstitute = !uselessmatch( rFontSelData, aOut );
#ifdef DEBUG #ifdef DEBUG
ByteString aOrigName( rFontSelData.maTargetName, RTL_TEXTENCODING_UTF8 ); const ByteString aOrigName( rFontSelData.maTargetName, RTL_TEXTENCODING_UTF8 );
ByteString aSubstName( aOut.maSearchName, RTL_TEXTENCODING_UTF8 ); const ByteString aSubstName( aOut.maSearchName, RTL_TEXTENCODING_UTF8 );
printf( "FcPreMatchSubstititution \"%s\" -> \"%s\"\n", printf( "FcPreMatchSubstititution \"%s\" bipw=%d%d%d%d -> ",
aOrigName.GetBuffer(), aSubstName.GetBuffer() ); aOrigName.GetBuffer(), rFontSelData.meWeight, rFontSelData.meItalic,
rFontSelData.mePitch, rFontSelData.meWidthType );
if( !bHaveSubstitute )
printf( "no substitute available\n" );
else
printf( "\"%s\" bipw=%d%d%d%d\n", aSubstName.GetBuffer(),
aOut.meWeight, aOut.meItalic, aOut.mePitch, aOut.meWidthType );
#endif #endif
rFontSelData = aOut;
return true; if( bHaveSubstitute )
rFontSelData = aOut;
return bHaveSubstitute;
} }
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
@ -2203,20 +2216,32 @@ bool FcGlyphFallbackSubstititution::FindFontSubstitute( ImplFontSelectData& rFon
return false; return false;
const ImplFontSelectData aOut = GetFcSubstitute( rFontSelData, rMissingCodes ); const ImplFontSelectData aOut = GetFcSubstitute( rFontSelData, rMissingCodes );
// TODO: cache the unicode+font specific result // TODO: cache the unicode + srcfont specific result
if (!aOut.maSearchName.Len()) // FC doing it would be preferable because it knows the invariables
return false; // e.g. FC knows the FC rule that all Arial gets replaced by LiberationSans
if (uselessmatch(rFontSelData, aOut)) // whereas we would have to check for every size or attribute
if( !aOut.maSearchName.Len() )
return false; return false;
const bool bHaveSubstitute = !uselessmatch( rFontSelData, aOut );
#ifdef DEBUG #ifdef DEBUG
ByteString aOrigName( rFontSelData.maTargetName, RTL_TEXTENCODING_UTF8 ); const ByteString aOrigName( rFontSelData.maTargetName, RTL_TEXTENCODING_UTF8 );
ByteString aSubstName( aOut.maSearchName, RTL_TEXTENCODING_UTF8 ); const ByteString aSubstName( aOut.maSearchName, RTL_TEXTENCODING_UTF8 );
printf( "FcGlyphFallbackSubstititution \"%s\" -> \"%s\"\n", printf( "FcGFSubstititution \"%s\" bipw=%d%d%d%d ->",
aOrigName.GetBuffer(), aSubstName.GetBuffer() ); aOrigName.GetBuffer(), rFontSelData.meWeight, rFontSelData.meItalic,
rFontSelData.mePitch, rFontSelData.meWidthType );
if( !bHaveSubstitute )
printf( "no substitute available\n" );
else
printf( "\"%s\" bipw=%d%d%d%d\n", aSubstName.GetBuffer(),
aOut.meWeight, aOut.meItalic, aOut.mePitch, aOut.meWidthType );
#endif #endif
rFontSelData = aOut;
return true; if( bHaveSubstitute )
rFontSelData = aOut;
return bHaveSubstitute;
} }
// =========================================================================== // ===========================================================================