diff options
-rw-r--r-- | vcl/unx/generic/glyphs/gcach_ftyp.cxx | 60 |
1 files changed, 7 insertions, 53 deletions
diff --git a/vcl/unx/generic/glyphs/gcach_ftyp.cxx b/vcl/unx/generic/glyphs/gcach_ftyp.cxx index e2cf92df9047..5610b014af84 100644 --- a/vcl/unx/generic/glyphs/gcach_ftyp.cxx +++ b/vcl/unx/generic/glyphs/gcach_ftyp.cxx @@ -976,16 +976,12 @@ void ServerFont::FetchFontMetric( ImplFontMetricData& rTo, long& rFactor ) const const FT_Size_Metrics& rMetrics = maFaceFT->size->metrics; rTo.mnAscent = (+rMetrics.ascender + 32) >> 6; -#if (FTVERSION < 2000) - rTo.mnDescent = (+rMetrics.descender + 32) >> 6; -#else rTo.mnDescent = (-rMetrics.descender + 32) >> 6; -#endif - rTo.mnIntLeading = ((rMetrics.height + 32) >> 6) - (rTo.mnAscent + rTo.mnDescent); + rTo.mnExtLeading = ((rMetrics.height + 32) >> 6) - (rTo.mnAscent + rTo.mnDescent); + rTo.mnIntLeading = (rTo.mnAscent + rTo.mnDescent) - ((maFaceFT->units_per_EM + 32) >> 6); rTo.mnSlant = 0; const TT_OS2* pOS2 = (const TT_OS2*)FT_Get_Sfnt_Table( maFaceFT, ft_sfnt_os2 ); - const TT_HoriHeader* pHHEA = (const TT_HoriHeader*)FT_Get_Sfnt_Table( maFaceFT, ft_sfnt_hhea ); if( pOS2 && (pOS2->version != 0xFFFF) ) { // map the panose info from the OS2 table to their VCL counterparts @@ -1017,55 +1013,13 @@ void ServerFont::FetchFontMetric( ImplFontMetricData& rTo, long& rFactor ) const default: rTo.mePitch = PITCH_DONTKNOW; break; } - // #108862# sanity check, some fonts treat descent as signed !!! - int nDescent = pOS2->usWinDescent; - if( nDescent > 5*maFaceFT->units_per_EM ) - nDescent = (short)pOS2->usWinDescent; // interpret it as signed! - const double fScale = (double)GetFontSelData().mnHeight / maFaceFT->units_per_EM; - if( pOS2->usWinAscent || pOS2->usWinDescent ) // #i30551# + if( pOS2->sTypoAscender || pOS2->sTypoDescender ) { - rTo.mnAscent = (long)( +pOS2->usWinAscent * fScale + 0.5 ); - rTo.mnDescent = (long)( +nDescent * fScale + 0.5 ); - rTo.mnIntLeading = (long)( (+pOS2->usWinAscent + pOS2->usWinDescent - maFaceFT->units_per_EM) * fScale + 0.5 ); - } - rTo.mnExtLeading = 0; - if( (pHHEA != NULL) && (pOS2->usWinAscent || pOS2->usWinDescent) ) - { - int nExtLeading = pHHEA->Line_Gap; - nExtLeading -= (pOS2->usWinAscent + pOS2->usWinDescent); - nExtLeading += (pHHEA->Ascender - pHHEA->Descender); - if( nExtLeading > 0 ) - rTo.mnExtLeading = (long)(nExtLeading * fScale + 0.5); - } - - // Check for CJK capabilities of the current font - // #107888# workaround for Asian... - // TODO: remove when ExtLeading fully implemented - sal_Bool bCJKCapable = ((pOS2->ulUnicodeRange2 & 0x2DF00000) != 0); - - if ( bCJKCapable && (pOS2->usWinAscent || pOS2->usWinDescent) ) - { - rTo.mnIntLeading += rTo.mnExtLeading; - - // #109280# The line height for Asian fonts is too small. - // Therefore we add half of the external leading to the - // ascent, the other half is added to the descent. - const long nHalfTmpExtLeading = rTo.mnExtLeading / 2; - const long nOtherHalfTmpExtLeading = rTo.mnExtLeading - - nHalfTmpExtLeading; - - // #110641# external leading for Asian fonts. - // The factor 0.3 has been verified during experiments. - const long nCJKExtLeading = (long)(0.30 * (rTo.mnAscent + rTo.mnDescent)); - - if ( nCJKExtLeading > rTo.mnExtLeading ) - rTo.mnExtLeading = nCJKExtLeading - rTo.mnExtLeading; - else - rTo.mnExtLeading = 0; - - rTo.mnAscent += nHalfTmpExtLeading; - rTo.mnDescent += nOtherHalfTmpExtLeading; + rTo.mnAscent = (long)( pOS2->sTypoAscender * fScale + 0.5 ); + rTo.mnDescent = (long)( -pOS2->sTypoDescender * fScale + 0.5 ); + rTo.mnExtLeading = (long)( pOS2->sTypoLineGap * fScale + 0.5 ); + rTo.mnIntLeading = (long)( (pOS2->sTypoAscender - pOS2->sTypoDescender - maFaceFT->units_per_EM) * fScale + 0.5 ); } } |