[Libreoffice-commits] core.git: vcl/generic

Khaled Hosny khaledhosny at eglug.org
Wed Sep 4 03:57:38 PDT 2013


 vcl/generic/glyphs/gcach_ftyp.cxx |   61 +++++++++++---------------------------
 vcl/generic/glyphs/gcach_ftyp.hxx |    2 -
 2 files changed, 19 insertions(+), 44 deletions(-)

New commits:
commit 655a62ad569b08c6d0b5639624e33d40594bedf2
Author: Khaled Hosny <khaledhosny at eglug.org>
Date:   Wed Sep 4 11:28:14 2013 +0200

    FT_Size API is available since FreeType 2.0.5
    
    We require at least 2.0.9 right now anyway, so no drop the dlsym hacks.
    
    This is essentially a revert of a36dab4a598c4ac168c7ef1df4d061613e40e416
    from 2003.
    
    Change-Id: Id9bca2962f25d92f1707bc3d1efc054ffd22c714
    Reviewed-on: https://gerrit.libreoffice.org/5803
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>

diff --git a/vcl/generic/glyphs/gcach_ftyp.cxx b/vcl/generic/glyphs/gcach_ftyp.cxx
index 3dbb5cd..44f00c6 100644
--- a/vcl/generic/glyphs/gcach_ftyp.cxx
+++ b/vcl/generic/glyphs/gcach_ftyp.cxx
@@ -50,12 +50,12 @@
 #include FT_FREETYPE_H
 #include FT_GLYPH_H
 #include FT_OUTLINE_H
+#include FT_SIZES_H
 #include FT_TRUETYPE_TABLES_H
 #include FT_TRUETYPE_TAGS_H
 #include FT_TRUETYPE_IDS_H
 
 #ifdef ANDROID
-#include FT_SIZES_H
 #include FT_SYNTHESIS_H
 #endif
 
@@ -122,14 +122,10 @@ static void InitGammaTable()
 
 static FT_Library aLibFT = 0;
 
-// #110607# enable linking with old FT versions
+// enable linking with old FT versions
 static int nFTVERSION = 0;
-static FT_Error (*pFTNewSize)(FT_Face,FT_Size*);
-static FT_Error (*pFTActivateSize)(FT_Size);
-static FT_Error (*pFTDoneSize)(FT_Size);
 void (*pFTEmbolden)(FT_GlyphSlot);
 static FT_UInt (*pFT_Face_GetCharVariantIndex)(FT_Face, FT_ULong, FT_ULong);
-static bool bEnableSizeFT = false;
 
 typedef ::boost::unordered_map<const char*, boost::shared_ptr<FtFontFile>, rtl::CStringHash, rtl::CStringEqual> FontFileList;
 
@@ -348,11 +344,8 @@ void FtFontInfo::InitHashes() const
 
 FT_FaceRec_* FtFontInfo::GetFaceFT()
 {
-    // get faceFT once/multiple depending on availability of SizeFT APIs
-    if( (mnRefCount++ <= 0) || !bEnableSizeFT )
+    if (!maFaceFT && mpFontFile->Map())
     {
-        if( !mpFontFile->Map() )
-            return NULL;
         FT_Error rc = FT_New_Memory_Face( aLibFT,
             (FT_Byte*)mpFontFile->GetBuffer(),
             mpFontFile->GetFileSize(), mnFaceNum, &maFaceFT );
@@ -360,6 +353,7 @@ FT_FaceRec_* FtFontInfo::GetFaceFT()
             maFaceFT = NULL;
     }
 
+   ++mnRefCount;
    return maFaceFT;
 }
 
@@ -388,12 +382,11 @@ GraphiteFaceWrapper * FtFontInfo::GetGraphiteFace()
 
 // -----------------------------------------------------------------------
 
-void FtFontInfo::ReleaseFaceFT( FT_FaceRec_* pFaceFT )
+void FtFontInfo::ReleaseFaceFT()
 {
-    // release last/each depending on SizeFT availability
-    if( (--mnRefCount <= 0) || !bEnableSizeFT )
+    if (--mnRefCount <= 0)
     {
-        FT_Done_Face( pFaceFT );
+        FT_Done_Face( maFaceFT );
         maFaceFT = NULL;
         mpFontFile->Unmap();
     }
@@ -487,23 +480,15 @@ FreetypeManager::FreetypeManager()
     // system FreeType code (which *is* present in a system library,
     // libskia.so, but is not a public API, and in fact does crash the
     // app if used).
-    pFTNewSize = FT_New_Size;
-    pFTActivateSize = FT_Activate_Size;
-    pFTDoneSize = FT_Done_Size;
     pFTEmbolden = FT_GlyphSlot_Embolden;
     pFT_Face_GetCharVariantIndex = FT_Face_GetCharVariantIndex;
     nFTVERSION = FTVERSION;
 #else
 #ifdef RTLD_DEFAULT // true if a good dlfcn.h header was included
     // Get version of freetype library to enable workarounds.
-    pFTNewSize      = (FT_Error(*)(FT_Face,FT_Size*))(sal_IntPtr)dlsym( RTLD_DEFAULT, "FT_New_Size" );
-    pFTActivateSize = (FT_Error(*)(FT_Size))(sal_IntPtr)dlsym( RTLD_DEFAULT, "FT_Activate_Size" );
-    pFTDoneSize     = (FT_Error(*)(FT_Size))(sal_IntPtr)dlsym( RTLD_DEFAULT, "FT_Done_Size" );
     pFTEmbolden     = (void(*)(FT_GlyphSlot))(sal_IntPtr)dlsym( RTLD_DEFAULT, "FT_GlyphSlot_Embolden" );
     pFT_Face_GetCharVariantIndex = (FT_UInt(*)(FT_Face, FT_ULong, FT_ULong))(sal_IntPtr)dlsym( RTLD_DEFAULT, "FT_Face_GetCharVariantIndex" );
 
-    bEnableSizeFT = (pFTNewSize!=NULL) && (pFTActivateSize!=NULL) && (pFTDoneSize!=NULL);
-
     FT_Int nMajor = 0, nMinor = 0, nPatch = 0;
     FT_Library_Version(aLibFT, &nMajor, &nMinor, &nPatch);
     nFTVERSION = nMajor * 1000 + nMinor * 100 + nPatch;
@@ -541,8 +526,7 @@ FreetypeManager::FreetypeManager()
 
 FT_Face ServerFont::GetFtFace() const
 {
-    if( maSizeFT )
-        pFTActivateSize( maSizeFT );
+    FT_Activate_Size( maSizeFT );
 
     return maFaceFT;
 }
@@ -683,12 +667,8 @@ ServerFont::ServerFont( const FontSelectPattern& rFSD, FtFontInfo* pFI )
     if( (mnWidth < 0) || (mfStretch > +64.0) || (mfStretch < -64.0) )
         return;
 
-    // perf: use maSizeFT if available
-    if( bEnableSizeFT )
-    {
-        pFTNewSize( maFaceFT, &maSizeFT );
-        pFTActivateSize( maSizeFT );
-    }
+    FT_New_Size( maFaceFT, &maSizeFT );
+    FT_Activate_Size( maSizeFT );
     FT_Error rc = FT_Set_Pixel_Sizes( maFaceFT, mnWidth, rFSD.mnHeight );
     if( rc != FT_Err_Ok )
         return;
@@ -885,9 +865,9 @@ ServerFont::~ServerFont()
         rtl_destroyUnicodeToTextConverter( maRecodeConverter );
 
     if( maSizeFT )
-        pFTDoneSize( maSizeFT );
+        FT_Done_Size( maSizeFT );
 
-    mpFontInfo->ReleaseFaceFT( maFaceFT );
+    mpFontInfo->ReleaseFaceFT();
 
     ReleaseFromGarbageCollect();
 }
@@ -914,8 +894,7 @@ void ServerFont::FetchFontMetric( ImplFontMetricData& rTo, long& rFactor ) const
     if ( IsStarSymbol( rTo.GetFamilyName() ) )
         rTo.SetSymbolFlag( true );
 
-    if( maSizeFT )
-        pFTActivateSize( maSizeFT );
+    FT_Activate_Size( maSizeFT );
 
     rFactor = 0x100;
 
@@ -1242,8 +1221,7 @@ static int lcl_GetCharWidth( FT_FaceRec_* pFaceFT, double fStretch, int nGlyphFl
 
 void ServerFont::InitGlyphData( int nGlyphIndex, GlyphData& rGD ) const
 {
-    if( maSizeFT )
-        pFTActivateSize( maSizeFT );
+    FT_Activate_Size( maSizeFT );
 
     int nGlyphFlags;
     SplitGlyphFlags( *this, nGlyphIndex, nGlyphFlags );
@@ -1309,8 +1287,7 @@ bool ServerFont::GetAntialiasAdvice( void ) const
 
 bool ServerFont::GetGlyphBitmap1( int nGlyphIndex, RawBitmap& rRawBitmap ) const
 {
-    if( maSizeFT )
-        pFTActivateSize( maSizeFT );
+    FT_Activate_Size( maSizeFT );
 
     int nGlyphFlags;
     SplitGlyphFlags( *this, nGlyphIndex, nGlyphFlags );
@@ -1464,8 +1441,7 @@ bool ServerFont::GetGlyphBitmap1( int nGlyphIndex, RawBitmap& rRawBitmap ) const
 
 bool ServerFont::GetGlyphBitmap8( int nGlyphIndex, RawBitmap& rRawBitmap ) const
 {
-    if( maSizeFT )
-        pFTActivateSize( maSizeFT );
+    FT_Activate_Size( maSizeFT );
 
     int nGlyphFlags;
     SplitGlyphFlags( *this, nGlyphIndex, nGlyphFlags );
@@ -1740,8 +1716,7 @@ sal_uLong ServerFont::GetKernPairs( ImplKernPairData** ppKernPairs ) const
 
     // when font faces of different sizes share the same maFaceFT
     // then we have to make sure that it uses the correct maSizeFT
-    if( maSizeFT )
-        pFTActivateSize( maSizeFT );
+    FT_Activate_Size( maSizeFT );
 
     // first figure out which glyph pairs are involved in kerning
     sal_uLong nKernLength = 0;
@@ -2140,7 +2115,7 @@ bool ServerFont::GetGlyphOutline( int nGlyphIndex,
     ::basegfx::B2DPolyPolygon& rB2DPolyPoly ) const
 {
     if( maSizeFT )
-        pFTActivateSize( maSizeFT );
+        FT_Activate_Size( maSizeFT );
 
     rB2DPolyPoly.clear();
 
diff --git a/vcl/generic/glyphs/gcach_ftyp.hxx b/vcl/generic/glyphs/gcach_ftyp.hxx
index 2c31bb4..fa7b2ea 100644
--- a/vcl/generic/glyphs/gcach_ftyp.hxx
+++ b/vcl/generic/glyphs/gcach_ftyp.hxx
@@ -75,7 +75,7 @@ public:
 #if ENABLE_GRAPHITE
     GraphiteFaceWrapper*  GetGraphiteFace();
 #endif
-    void                  ReleaseFaceFT( FT_FaceRec_* );
+    void                  ReleaseFaceFT();
 
     const OString* GetFontFileName() const   { return mpFontFile->GetFileName(); }
     int                   GetFaceNum() const        { return mnFaceNum; }


More information about the Libreoffice-commits mailing list