[Libreoffice-commits] core.git: include/unotools unotools/source vcl/source

Caolán McNamara caolanm at redhat.com
Mon Oct 20 03:53:51 PDT 2014


 include/unotools/fontdefs.hxx              |    9 +++
 unotools/source/misc/fontdefs.cxx          |   67 ++++++++++++++++-------------
 vcl/source/font/PhysicalFontCollection.cxx |   36 ---------------
 3 files changed, 48 insertions(+), 64 deletions(-)

New commits:
commit e12ba2eddc827e39444f5efe6107d8afe1f7aaff
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Mon Oct 20 11:17:56 2014 +0100

    Resolves: fdo#85006 limit script stripping to known suffixes
    
    Change-Id: I276535b007bbb55555148d5937076b86da5de825

diff --git a/include/unotools/fontdefs.hxx b/include/unotools/fontdefs.hxx
index 7ac715e..e060106 100644
--- a/include/unotools/fontdefs.hxx
+++ b/include/unotools/fontdefs.hxx
@@ -83,6 +83,15 @@ UNOTOOLS_DLLPUBLIC OUString GetNextFontToken( const OUString& rTokenStr, sal_Int
 
 UNOTOOLS_DLLPUBLIC OUString GetEnglishSearchFontName( const OUString& rName );
 
+/** Strip any "script font suffix" from the font name
+
+    Related: fdo#49271 RTF files often contain weird-ass
+    Win 3.1/Win95 style fontnames which attempt to put the
+    charset encoding into the filename
+    http://www.webcenter.ru/~kazarn/eng/fonts_ttf.htm
+*/
+UNOTOOLS_DLLPUBLIC OUString StripScriptFromName(const OUString& rName);
+
 /** Determine if the font is the special Star|Open Symbol font
 
     @param rFontName
diff --git a/unotools/source/misc/fontdefs.cxx b/unotools/source/misc/fontdefs.cxx
index 4f0fb08..cac720f 100644
--- a/unotools/source/misc/fontdefs.cxx
+++ b/unotools/source/misc/fontdefs.cxx
@@ -320,9 +320,43 @@ static ImplLocalizedFontName aImplLocalizedNamesList[] =
 {   NULL,                   NULL },
 };
 
-OUString GetEnglishSearchFontName( const OUString& rInName )
+OUString StripScriptFromName(const OUString& _aName)
 {
-    OUStringBuffer rName( rInName.getStr());
+    // I worry that someone will have a font which *does* have
+    // e.g. "Greek" legitimately at the end of its name :-(
+    const char*suffixes[] = { " baltic",
+                              " ce",
+                              " cyr",
+                              " greek",
+                              " tur",
+                              " (arabic)",
+                              " (hebrew)",
+                              " (thai)",
+                              " (vietnamese)"
+                            };
+
+    OUString aName = _aName;
+    // These can be crazily piled up, e.g. Times New Roman CYR Greek
+    bool bFinished = false;
+    while (!bFinished)
+    {
+        bFinished = true;
+        for (size_t i = 0; i < SAL_N_ELEMENTS(suffixes); ++i)
+        {
+            size_t nLen = strlen(suffixes[i]);
+            if (aName.endsWithIgnoreAsciiCaseAsciiL(suffixes[i], nLen))
+            {
+                bFinished = false;
+                aName = aName.copy(0, aName.getLength() - nLen);
+            }
+        }
+    }
+    return aName;
+}
+
+OUString GetEnglishSearchFontName(const OUString& rInName)
+{
+    OUStringBuffer rName(rInName);
     bool        bNeedTranslation = false;
     sal_Int32  nLen = rName.getLength();
 
@@ -334,33 +368,8 @@ OUString GetEnglishSearchFontName( const OUString& rInName )
          rName.truncate(i);
 
     // Remove Script at the end
-    // Scriptname must be the last part of the fontname and
-    // looks like "fontname (scriptname)". So there can only be a
-    // script name at the end of the fontname, when the last char is ')'
-    if ( (nLen >= 3) && rName[ nLen-1 ] == ')' )
-    {
-        int nOpen = 1;
-        sal_Int32 nTempLen = nLen-2;
-        while ( nTempLen )
-        {
-            if ( rName[ nTempLen ] == '(' )
-            {
-                nOpen--;
-                if ( !nOpen )
-                {
-                    // Remove Space at the end
-                    if ( nTempLen && (rName[ nTempLen-1 ] == ' ') )
-                        nTempLen--;
-                    rName.truncate(nTempLen);
-                    nLen = nTempLen;
-                    break;
-                }
-            }
-            if ( rName[ nTempLen ] == ')' )
-                nOpen++;
-            nTempLen--;
-        }
-    }
+    rName = StripScriptFromName(rName.toString());
+    nLen = rName.getLength();
 
     // remove all whitespaces and converts to lower case ASCII
     // TODO: better transliteration to ASCII e.g. all digits
diff --git a/vcl/source/font/PhysicalFontCollection.cxx b/vcl/source/font/PhysicalFontCollection.cxx
index af2440c..416cc6b 100644
--- a/vcl/source/font/PhysicalFontCollection.cxx
+++ b/vcl/source/font/PhysicalFontCollection.cxx
@@ -36,40 +36,6 @@
 
 #include "PhysicalFontCollection.hxx"
 
-static OUString lcl_stripCharSetFromName(const OUString& _aName)
-{
-    // I worry that someone will have a font which *does* have
-    // e.g. "Greek" legitimately at the end of its name :-(
-    const char*suffixes[] = { " baltic",
-                              " ce",
-                              " cyr",
-                              " greek",
-                              " tur",
-                              " (arabic)",
-                              " (hebrew)",
-                              " (thai)",
-                              " (vietnamese)"
-                            };
-
-    OUString aName = _aName;
-    // These can be crazily piled up, e.g. Times New Roman CYR Greek
-    bool bFinished = false;
-    while (!bFinished)
-    {
-        bFinished = true;
-        for (size_t i = 0; i < SAL_N_ELEMENTS(suffixes); ++i)
-        {
-            size_t nLen = strlen(suffixes[i]);
-            if (aName.endsWithIgnoreAsciiCaseAsciiL(suffixes[i], nLen))
-            {
-                bFinished = false;
-                aName = aName.copy(0, aName.getLength() - nLen);
-            }
-        }
-    }
-    return aName;
-}
-
 static unsigned lcl_IsCJKFont( const OUString& rFontName )
 {
     // Test, if Fontname includes CJK characters --> In this case we
@@ -1113,7 +1079,7 @@ PhysicalFontFamily* PhysicalFontCollection::ImplFindByFont( FontSelectPattern& r
         // Win 3.1/Win95 style fontnames which attempt to put the
         // charset encoding into the filename
         // http://www.webcenter.ru/~kazarn/eng/fonts_ttf.htm
-        OUString sStrippedName = lcl_stripCharSetFromName(rFSD.maTargetName);
+        OUString sStrippedName = StripScriptFromName(rFSD.maTargetName);
         if (sStrippedName != rFSD.maTargetName)
         {
             rFSD.maTargetName = sStrippedName;


More information about the Libreoffice-commits mailing list