config_host.mk.in | 1 configure.ac | 27 +--- vcl/generic/glyphs/gcach_ftyp.cxx | 240 +++++++++----------------------------- 3 files changed, 66 insertions(+), 202 deletions(-)
New commits: commit fe9def183be4025f8c2ebba5f486fff1c20ecc80 Author: Khaled Hosny <khaledho...@eglug.org> Date: Sat May 11 08:44:11 2013 +0200 USE_FT_EMBOLDEN has never been used Change-Id: Idd30f6fcf9d1e4d2af5f49caffa91d6ce30bb196 diff --git a/config_host.mk.in b/config_host.mk.in index cfe407c..76ac1a7 100644 --- a/config_host.mk.in +++ b/config_host.mk.in @@ -540,7 +540,6 @@ export UNIXWRAPPERNAME=@UNIXWRAPPERNAME@ export UNOWINREG_DLL=@UNOWINREG_DLL@ export UPD=@UPD@ export URELIBS=@URELIBS@ -export USE_FT_EMBOLDEN=@USE_FT_EMBOLDEN@ export USE_XINERAMA=@USE_XINERAMA@ export use_shl_version=@use_shl_version@ export UUIDGEN=@UUIDGEN@ diff --git a/configure.ac b/configure.ac index 5aba388..10d0648 100644 --- a/configure.ac +++ b/configure.ac @@ -7308,23 +7308,6 @@ dnl Check for system libwpg dnl =================================================================== libo_CHECK_SYSTEM_MODULE([libwpg],[WPG],[libwpg-0.2],["-I${OUTDIR}/inc/external"],["-L${OUTDIR}/lib -lwpglib"]) -dnl =================================================================== -dnl Check whether freetype2 supports emboldening -dnl =================================================================== -if test "$test_freetype" = "yes"; then - save_CPPFLAGS="$CPPFLAGS" - save_LDFLAGS="$LDFLAGS" - save_LIBS="$LIBS" - CPPFLAGS="$CPPFLAGS $FREETYPE_CFLAGS" - LDFLAGS="$LDFLAGS $FREETYPE_LIBS" - AC_CHECK_LIB(freetype, FT_GlyphSlot_Embolden, - [USE_FT_EMBOLDEN="YES"], [USE_FT_EMBOLDEN="NO"], []) - LDFLAGS="$save_LDFLAGS" - CPPFLAGS="$save_CPPFLAGS" - LIBS="$save_LIBS" -fi -AC_SUBST(USE_FT_EMBOLDEN) - # =================================================================== # Check for system libxslt # to prevent incompatibilities between internal libxml2 and external libxslt, commit 96137f1ef8e1e2c8787b899edf8b2969c2eff5dc Author: Khaled Hosny <khaledho...@eglug.org> Date: Sat May 11 08:29:46 2013 +0200 Drop code for FreeTyope version we don't support Change-Id: I404ac35010c243fad65b6d83c10c75665a0568f0 diff --git a/vcl/generic/glyphs/gcach_ftyp.cxx b/vcl/generic/glyphs/gcach_ftyp.cxx index 1b31f2c..9995964 100644 --- a/vcl/generic/glyphs/gcach_ftyp.cxx +++ b/vcl/generic/glyphs/gcach_ftyp.cxx @@ -63,13 +63,8 @@ #endif #include "rtl/instance.hxx" -#ifndef FREETYPE_PATCH - // VERSION_MINOR in freetype.h is too coarse - // if patch-level is not available we need to fine-tune the version ourselves - #define FTVERSION 2005 -#else - #define FTVERSION (1000*FREETYPE_MAJOR + 100*FREETYPE_MINOR + FREETYPE_PATCH) -#endif +#define FTVERSION (1000*FREETYPE_MAJOR + 100*FREETYPE_MINOR + FREETYPE_PATCH) + #if FTVERSION >= 2200 typedef const FT_Vector* FT_Vector_CPtr; #else // FTVERSION < 2200 @@ -521,11 +516,6 @@ FreetypeManager::FreetypeManager() pFTLibraryVersion( aLibFT, &nMajor, &nMinor, &nPatch ); nFTVERSION = nMajor * 1000 + nMinor * 100 + nPatch; - // disable embedded bitmaps for Freetype-2.1.3 unless explicitly - // requested by env var below because it crashes StarOffice on RH9 - // reason: double free in freetype's embedded bitmap handling - if( nFTVERSION == 2103 ) - nDefaultPrioEmbedded = 0; // disable artificial emboldening with the Freetype API for older versions if( nFTVERSION < 2110 ) pFTEmbolden = NULL; @@ -716,14 +706,10 @@ ServerFont::ServerFont( const FontSelectPattern& rFSD, FtFontInfo* pFI ) FT_Encoding eEncoding = FT_ENCODING_UNICODE; if( mpFontInfo->IsSymbolFont() ) { -#if (FTVERSION < 2000) - eEncoding = FT_ENCODING_NONE; -#else if( FT_IS_SFNT( maFaceFT ) ) eEncoding = ft_encoding_symbol; else eEncoding = FT_ENCODING_ADOBE_CUSTOM; // freetype wants this for PS symbol fonts -#endif } rc = FT_Select_Charmap( maFaceFT, eEncoding ); // no standard encoding applies => we need an encoding converter @@ -854,13 +840,11 @@ void ServerFont::SetFontOptions( boost::shared_ptr<ImplFontOptions> pFontOptions if( mpFontOptions->DontUseHinting() ) mnPrioAutoHint = 0; -#if (FTVERSION >= 2005) || defined(TT_CONFIG_OPTION_BYTECODE_INTERPRETER) if( mnPrioAutoHint <= 0 ) -#endif mnLoadFlags |= FT_LOAD_NO_HINTING; #if defined(FT_LOAD_TARGET_LIGHT) && defined(FT_LOAD_TARGET_NORMAL) - if( !(mnLoadFlags & FT_LOAD_NO_HINTING) && (nFTVERSION >= 2103)) + if( !(mnLoadFlags & FT_LOAD_NO_HINTING) ) { mnLoadFlags |= FT_LOAD_TARGET_NORMAL; switch( mpFontOptions->GetHintStyle() ) @@ -1113,14 +1097,6 @@ int ServerFont::ApplyGlyphTransform( int nGlyphFlags, // orthogonal transforms are better handled by bitmap operations if( bStretched || (bForBitmapProcessing && (nAngle % 900) != 0) ) { - // workaround for compatibility with older FT versions - if( nFTVERSION < 2102 ) - { - FT_Fixed t = aMatrix.xy; - aMatrix.xy = aMatrix.yx; - aMatrix.yx = t; - } - // apply non-orthogonal or stretch transformations FT_Glyph_Transform( pGlyphFT, &aMatrix, NULL ); nAngle = 0; @@ -1259,11 +1235,7 @@ static int lcl_GetCharWidth( FT_FaceRec_* pFaceFT, double fStretch, int nGlyphFl if( nGlyphFlags & GF_ROTMASK ) // for bVertical rotated glyphs { const FT_Size_Metrics& rMetrics = pFaceFT->size->metrics; -#if (FTVERSION < 2000) - nCharWidth = (int)((rMetrics.height - rMetrics.descender) * fStretch); -#else nCharWidth = (int)((rMetrics.height + rMetrics.descender) * fStretch); -#endif } return (nCharWidth + 32) >> 6; @@ -1285,20 +1257,7 @@ void ServerFont::InitGlyphData( int nGlyphIndex, GlyphData& rGD ) const // nLoadFlags |= FT_LOAD_NO_BITMAP; FT_Error rc = -1; -#if (FTVERSION <= 2008) - // #88364# freetype<=2005 prefers autohinting to embedded bitmaps - // => first we have to try without hinting - if( (nLoadFlags & (FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP)) == 0 ) - { - rc = FT_Load_Glyph( maFaceFT, nGlyphIndex, nLoadFlags|FT_LOAD_NO_HINTING ); - if( (rc==FT_Err_Ok) && (maFaceFT->glyph->format!=FT_GLYPH_FORMAT_BITMAP) ) - rc = -1; // mark as "loading embedded bitmap" was unsuccessful - nLoadFlags |= FT_LOAD_NO_BITMAP; - } - - if( rc != FT_Err_Ok ) -#endif - rc = FT_Load_Glyph( maFaceFT, nGlyphIndex, nLoadFlags ); + rc = FT_Load_Glyph( maFaceFT, nGlyphIndex, nLoadFlags ); if( rc != FT_Err_Ok ) { @@ -1370,32 +1329,18 @@ bool ServerFont::GetGlyphBitmap1( int nGlyphIndex, RawBitmap& rRawBitmap ) const if( mbArtItalic ) nLoadFlags |= FT_LOAD_NO_BITMAP; -#if (FTVERSION >= 2002) // for 0/90/180/270 degree fonts enable hinting even if not advisable // non-hinted and non-antialiased bitmaps just look too ugly if( (mnCos==0 || mnSin==0) && (mnPrioAutoHint > 0) ) nLoadFlags &= ~FT_LOAD_NO_HINTING; -#endif if( mnPrioEmbedded <= mnPrioAutoHint ) nLoadFlags |= FT_LOAD_NO_BITMAP; FT_Error rc = -1; -#if (FTVERSION <= 2008) - // #88364# freetype<=2005 prefers autohinting to embedded bitmaps - // => first we have to try without hinting - if( (nLoadFlags & (FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP)) == 0 ) - { - rc = FT_Load_Glyph( maFaceFT, nGlyphIndex, nLoadFlags|FT_LOAD_NO_HINTING ); - if( (rc==FT_Err_Ok) && (maFaceFT->glyph->format != FT_GLYPH_FORMAT_BITMAP) ) - rc = -1; // mark as "loading embedded bitmap" was unsuccessful - nLoadFlags |= FT_LOAD_NO_BITMAP; - } + rc = FT_Load_Glyph( maFaceFT, nGlyphIndex, nLoadFlags ); if( rc != FT_Err_Ok ) -#endif - rc = FT_Load_Glyph( maFaceFT, nGlyphIndex, nLoadFlags ); - if( rc != FT_Err_Ok ) return false; if( mbArtBold && pFTEmbolden ) @@ -1412,10 +1357,7 @@ bool ServerFont::GetGlyphBitmap1( int nGlyphIndex, RawBitmap& rRawBitmap ) const { FT_Matrix aMatrix; aMatrix.xx = aMatrix.yy = 0x10000L; - if( nFTVERSION >= 2102 ) // Freetype 2.1.2 API swapped xy with yx - aMatrix.xy = 0x6000L, aMatrix.yx = 0; - else - aMatrix.yx = 0x6000L, aMatrix.xy = 0; + aMatrix.xy = 0x6000L, aMatrix.yx = 0; FT_Glyph_Transform( pGlyphFT, &aMatrix, NULL ); } @@ -1437,8 +1379,7 @@ bool ServerFont::GetGlyphBitmap1( int nGlyphIndex, RawBitmap& rRawBitmap ) const { if( pGlyphFT->format == FT_GLYPH_FORMAT_OUTLINE ) ((FT_OutlineGlyphRec*)pGlyphFT)->outline.flags |= FT_OUTLINE_HIGH_PRECISION; - // #i15743# freetype API 2.1.3 changed the FT_RENDER_MODE_MONO constant - FT_Render_Mode nRenderMode = (FT_Render_Mode)((nFTVERSION<2103) ? 1 : FT_RENDER_MODE_MONO); + FT_Render_Mode nRenderMode = FT_RENDER_MODE_MONO; rc = FT_Glyph_To_Bitmap( &pGlyphFT, nRenderMode, NULL, sal_True ); if( rc != FT_Err_Ok ) @@ -1538,32 +1479,14 @@ bool ServerFont::GetGlyphBitmap8( int nGlyphIndex, RawBitmap& rRawBitmap ) const if( mbArtItalic ) nLoadFlags |= FT_LOAD_NO_BITMAP; -#if (FTVERSION <= 2004) && !defined(TT_CONFIG_OPTION_BYTECODE_INTERPRETER) - // autohinting in FT<=2.0.4 makes antialiased glyphs look worse - nLoadFlags |= FT_LOAD_NO_HINTING; -#else if( (nGlyphFlags & GF_UNHINTED) || (mnPrioAutoHint < mnPrioAntiAlias) ) nLoadFlags |= FT_LOAD_NO_HINTING; -#endif if( mnPrioEmbedded <= mnPrioAntiAlias ) nLoadFlags |= FT_LOAD_NO_BITMAP; FT_Error rc = -1; -#if (FTVERSION <= 2008) - // #88364# freetype<=2005 prefers autohinting to embedded bitmaps - // => first we have to try without hinting - if( (nLoadFlags & (FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP)) == 0 ) - { - rc = FT_Load_Glyph( maFaceFT, nGlyphIndex, nLoadFlags|FT_LOAD_NO_HINTING ); - if( (rc==FT_Err_Ok) && (maFaceFT->glyph->format != FT_GLYPH_FORMAT_BITMAP) ) - rc = -1; // mark as "loading embedded bitmap" was unsuccessful - nLoadFlags |= FT_LOAD_NO_BITMAP; - } - - if( rc != FT_Err_Ok ) -#endif - rc = FT_Load_Glyph( maFaceFT, nGlyphIndex, nLoadFlags ); + rc = FT_Load_Glyph( maFaceFT, nGlyphIndex, nLoadFlags ); if( rc != FT_Err_Ok ) return false; @@ -1582,10 +1505,7 @@ bool ServerFont::GetGlyphBitmap8( int nGlyphIndex, RawBitmap& rRawBitmap ) const { FT_Matrix aMatrix; aMatrix.xx = aMatrix.yy = 0x10000L; - if( nFTVERSION >= 2102 ) // Freetype 2.1.2 API swapped xy with yx - aMatrix.xy = 0x6000L, aMatrix.yx = 0; - else - aMatrix.yx = 0x6000L, aMatrix.xy = 0; + aMatrix.xy = 0x6000L, aMatrix.yx = 0; FT_Glyph_Transform( pGlyphFT, &aMatrix, NULL ); } @@ -2236,8 +2156,7 @@ bool ServerFont::GetGlyphOutline( int nGlyphIndex, #ifdef FT_LOAD_TARGET_LIGHT // enable "light hinting" if available - if( nFTVERSION >= 2103 ) - nLoadFlags |= FT_LOAD_TARGET_LIGHT; + nLoadFlags |= FT_LOAD_TARGET_LIGHT; #endif FT_Error rc = FT_Load_Glyph( maFaceFT, nGlyphIndex, nLoadFlags ); @@ -2259,10 +2178,7 @@ bool ServerFont::GetGlyphOutline( int nGlyphIndex, { FT_Matrix aMatrix; aMatrix.xx = aMatrix.yy = 0x10000L; - if( nFTVERSION >= 2102 ) // Freetype 2.1.2 API swapped xy with yx - aMatrix.xy = 0x6000L, aMatrix.yx = 0; - else - aMatrix.yx = 0x6000L, aMatrix.xy = 0; + aMatrix.xy = 0x6000L, aMatrix.yx = 0; FT_Glyph_Transform( pGlyphFT, &aMatrix, NULL ); } commit 1266602a0d47c348043c301677399a24eeeebcce Author: Khaled Hosny <khaledho...@eglug.org> Date: Sat May 11 07:46:15 2013 +0200 Fix FreeType version check FreeType has 3 different kinds of versions * release, like 2.4.10 * libtool, like 13.0.7 (this what pkg-config returns) * soname FreeType's docs/VERSION.DLL provides a table mapping between the three We were checking for >= 2.0 which is always true of course, so I replaced it with 9.4.3 i.e. 2.1.5; the first FreeType release to provide a freetype2.pc file (I could have omitted the version check at all, since it is practically the same), but this should be replaced with a real minimum required version. Change-Id: I95f6c398a5b19d4bb728a6dddc957a9f95f27efa diff --git a/configure.ac b/configure.ac index 9871f4c..5aba388 100644 --- a/configure.ac +++ b/configure.ac @@ -7279,7 +7279,15 @@ dnl Check whether freetype is available dnl =================================================================== if test "$test_freetype" = "yes"; then AC_MSG_CHECKING([whether freetype is available]) - PKG_CHECK_MODULES( FREETYPE, freetype2 >= 2.0 ) + # FreeType has 3 different kinds of versions + # * release, like 2.4.10 + # * libtool, like 13.0.7 (this what pkg-config returns) + # * soname + # FreeType's docs/VERSION.DLL provides a table mapping between the three + # + # 9.4.3 is 2.1.5; the first FreeType release to provide a freetype2.pc file + # XXX: replace this with a real minimum required version + PKG_CHECK_MODULES( FREETYPE, freetype2 >= 9.4.3 ) else case "$BUILD_TYPE" in *FREETYPE*) commit f9560c8f9982eaef09b74baa479c187f049c4f9e Author: Khaled Hosny <khaledho...@eglug.org> Date: Sat May 11 07:07:29 2013 +0200 Cleanup FreeType ascender/descender handling a bit Change-Id: I9734f15811020ce1a7b761688d602c7e244167c7 diff --git a/vcl/generic/glyphs/gcach_ftyp.cxx b/vcl/generic/glyphs/gcach_ftyp.cxx index a10aeb3..1b31f2c 100644 --- a/vcl/generic/glyphs/gcach_ftyp.cxx +++ b/vcl/generic/glyphs/gcach_ftyp.cxx @@ -949,16 +949,57 @@ void ServerFont::FetchFontMetric( ImplFontMetricData& rTo, long& rFactor ) const rFactor = 0x100; - rTo.mnWidth = mnWidth; + const TT_OS2* pOS2 = (const TT_OS2*)FT_Get_Sfnt_Table( maFaceFT, ft_sfnt_os2 ); + const double fScale = (double)GetFontSelData().mnHeight / maFaceFT->units_per_EM; + + rTo.mnAscent = 0; + rTo.mnDescent = 0; + rTo.mnExtLeading = 0; + rTo.mnSlant = 0; + rTo.mnIntLeading = (rTo.mnAscent + rTo.mnDescent) - ((maFaceFT->units_per_EM + 32) >> 6); + rTo.mnWidth = mnWidth; + + // Calculating ascender and descender: + // FreeType >= 2.4.6 does the right thing, so we just use what it gives us, + // for earlier versions we emulate its behaviour; take them from 'hhea' + // table, if zero take them from 'OS/2' table. + if (nFTVERSION >= 2406) + { + const FT_Size_Metrics& rMetrics = maFaceFT->size->metrics; + rTo.mnAscent = (rMetrics.ascender + 32) >> 6; + rTo.mnDescent = (-rMetrics.descender + 32) >> 6; + rTo.mnExtLeading = ((rMetrics.height + 32) >> 6) - (rTo.mnAscent + rTo.mnDescent); + } + else + { + const TT_HoriHeader* pHHea = (const TT_HoriHeader*)FT_Get_Sfnt_Table(maFaceFT, ft_sfnt_hhea); + if (pHHea) + { + rTo.mnAscent = pHHea->Ascender * fScale + 0.5; + rTo.mnDescent = -pHHea->Descender * fScale + 0.5; + rTo.mnExtLeading = pHHea->Line_Gap * fScale + 0.5; + } - const FT_Size_Metrics& rMetrics = maFaceFT->size->metrics; - rTo.mnAscent = (+rMetrics.ascender + 32) >> 6; - rTo.mnDescent = (-rMetrics.descender + 32) >> 6; - 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; + if (!(rTo.mnAscent || rTo.mnDescent)) + { + if (pOS2 && (pOS2->version != 0xFFFF)) + { + if (pOS2->sTypoAscender || pOS2->sTypoDescender) + { + rTo.mnAscent = pOS2->sTypoAscender * fScale + 0.5; + rTo.mnDescent = -pOS2->sTypoDescender * fScale + 0.5; + rTo.mnExtLeading = pOS2->sTypoLineGap * fScale + 0.5; + } + else + { + rTo.mnAscent = pOS2->usWinAscent * fScale + 0.5; + rTo.mnDescent = pOS2->usWinDescent * fScale + 0.5; + rTo.mnDescent = 0; + } + } + } + } - const TT_OS2* pOS2 = (const TT_OS2*)FT_Get_Sfnt_Table( maFaceFT, ft_sfnt_os2 ); if( pOS2 && (pOS2->version != 0xFFFF) ) { // map the panose info from the OS2 table to their VCL counterparts @@ -989,15 +1030,6 @@ void ServerFont::FetchFontMetric( ImplFontMetricData& rTo, long& rFactor ) const case 1: // fall through default: rTo.SetPitch( PITCH_DONTKNOW ); break; } - - const double fScale = (double)GetFontSelData().mnHeight / maFaceFT->units_per_EM; - if( pOS2->sTypoAscender || pOS2->sTypoDescender ) - { - 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 ); - } } // initialize kashida width commit 5e77c9e17ba7dd9d296c9b755093f01e7eb4f514 Author: Khaled Hosny <khaledho...@eglug.org> Date: Sat May 11 00:50:59 2013 +0200 Revert 052f181dad89ad34d90513bc9dcd3e3239727933 Which in itself was effectively a revert of 3364fefe1e2dec522211040f2f9ea37bf5cd7466 Keeping the old broken line height calculation code is just masking of the real problem; there are some code elsewhere that have fragile workarounds to the real bug here (the removed code here shows a good example of such workarounds). On Mac we use the correct metrics as well, so we need to find the quirks and fix them, instead of pretending they do not exist. This fixes fdo#55469, among others. Change-Id: I36f13b28eaba022b7c388feae7e0bfd0ed1c3e89 diff --git a/vcl/generic/glyphs/gcach_ftyp.cxx b/vcl/generic/glyphs/gcach_ftyp.cxx index 13e6aa9..a10aeb3 100644 --- a/vcl/generic/glyphs/gcach_ftyp.cxx +++ b/vcl/generic/glyphs/gcach_ftyp.cxx @@ -928,18 +928,6 @@ int ServerFont::GetEmUnits() const void ServerFont::FetchFontMetric( ImplFontMetricData& rTo, long& rFactor ) const { - const int UNDETERMINED = 0xFEED; - static int nUseNewLineHeight = UNDETERMINED; - if (nUseNewLineHeight == UNDETERMINED) - { - osl::MutexGuard aGuard( osl::Mutex::getGlobalMutex()); - if (nUseNewLineHeight == UNDETERMINED) - { - const char* pEnv = getenv( "SAL_USE_NEW_LINEHEIGHT"); - nUseNewLineHeight = (pEnv ? atoi(pEnv) : 0); - } - } - static_cast<ImplFontAttributes&>(rTo) = mpFontInfo->GetFontAttributes(); rTo.mbScalableFont = true; @@ -966,15 +954,8 @@ void ServerFont::FetchFontMetric( ImplFontMetricData& rTo, long& rFactor ) const const FT_Size_Metrics& rMetrics = maFaceFT->size->metrics; rTo.mnAscent = (+rMetrics.ascender + 32) >> 6; rTo.mnDescent = (-rMetrics.descender + 32) >> 6; - if (nUseNewLineHeight) - { - rTo.mnExtLeading = ((rMetrics.height + 32) >> 6) - (rTo.mnAscent + rTo.mnDescent); - rTo.mnIntLeading = (rTo.mnAscent + rTo.mnDescent) - ((maFaceFT->units_per_EM + 32) >> 6); - } - else - { - 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 ); @@ -1010,67 +991,12 @@ void ServerFont::FetchFontMetric( ImplFontMetricData& rTo, long& rFactor ) const } const double fScale = (double)GetFontSelData().mnHeight / maFaceFT->units_per_EM; - if (nUseNewLineHeight) - { - if( pOS2->sTypoAscender || pOS2->sTypoDescender ) - { - 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 ); - } - } - else + if( pOS2->sTypoAscender || pOS2->sTypoDescender ) { - // #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! - - if( pOS2->usWinAscent || pOS2->usWinDescent ) // #i30551# - { - 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; - const TT_HoriHeader* pHHEA = (const TT_HoriHeader*)FT_Get_Sfnt_Table( maFaceFT, ft_sfnt_hhea ); - 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 ); } } _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits