summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--vcl/unx/generic/glyphs/gcach_ftyp.cxx60
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 );
}
}