summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/unotools/fontdefs.hxx9
-rw-r--r--unotools/source/misc/fontdefs.cxx67
-rw-r--r--vcl/source/font/PhysicalFontCollection.cxx36
3 files changed, 48 insertions, 64 deletions
diff --git a/include/unotools/fontdefs.hxx b/include/unotools/fontdefs.hxx
index 7ac715eb829b..e0601063ac4b 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 4f0fb085634f..cac720fe5dd9 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 af2440ca7866..416cc6b8945a 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;