1
0
mirror of https://git.dev.opencascade.org/repos/occt.git synced 2025-08-09 13:22:24 +03:00

0030439: Visualization - extend fonts search within Font_FontMgr::FindFont() on Linux

Font_FontMgr has been redesigned to:
- Store fonts in a map instead a list.
- Allow mapping multiple fonts to a single alias.
- Log informative message about usage of non-requested font (fallback).
- Register all font files within standard folders on Linux when "fonts.dir" is not found.
- Prefer specific alias ("serif") as default fallback font instead of arbitrary one in a system.

A couple of obsolete and broken font aliases have been removed;
instead, new aliases of fonts popular on Linux platform have been added.

Font_NameOfFont.hxx has been extended with more neutral aliases
"monospace", "serif", "sans-serif", "cjk" and "korean".

Font_FontAspect enumeration values have been renamed Font_FA_ -> Font_FontAspect_
with old values preserved as alias.

Font_SystemFont has been extended with a list of paths to Font_FontAspect styles,
so that entire Font Family is now defined within a single Font_SystemFont instance.
Non-resizable fonts are now ignored by Font Manager.
This commit is contained in:
kgv
2019-01-10 23:10:51 +03:00
committed by bugmaster
parent 169c944c4b
commit 5b377041e3
16 changed files with 755 additions and 585 deletions

View File

@@ -509,6 +509,39 @@ namespace
}
return Standard_True;
}
//! Auxiliary function to parse font aspect style argument
static Standard_Boolean parseFontStyle (const TCollection_AsciiString& theArg,
Font_FontAspect& theAspect)
{
if (theArg == "regular"
|| *theArg.ToCString() == 'r')
{
theAspect = Font_FA_Regular;
return Standard_True;
}
else if (theArg == "bolditalic"
|| theArg == "bold-italic"
|| theArg == "italic-bold"
|| theArg == "italicbold")
{
theAspect = Font_FA_BoldItalic;
return Standard_True;
}
else if (theArg == "bold"
|| *theArg.ToCString() == 'b')
{
theAspect = Font_FA_Bold;
return Standard_True;
}
else if (theArg == "italic"
|| *theArg.ToCString() == 'i')
{
theAspect = Font_FA_Italic;
return Standard_True;
}
return Standard_False;
}
}
//==============================================================================
@@ -2464,22 +2497,13 @@ static int VDrawText (Draw_Interpretor& theDI,
TCollection_AsciiString anOption (theArgVec[anArgIt]);
anOption.LowerCase();
if (anOption.IsEqual ("regular"))
Font_FontAspect aFontAspect = Font_FA_Undefined;
if (!parseFontStyle (anOption, aFontAspect))
{
aTextPrs->SetFontAspect (Font_FA_Regular);
}
else if (anOption.IsEqual ("bold"))
{
aTextPrs->SetFontAspect (Font_FA_Bold);
}
else if (anOption.IsEqual ("italic"))
{
aTextPrs->SetFontAspect (Font_FA_Italic);
}
else if (anOption.IsEqual ("bolditalic"))
{
aTextPrs->SetFontAspect (Font_FA_BoldItalic);
std::cout << "Error: unknown font aspect '" << anOption << "'.\n";
return 1;
}
aTextPrs->SetFontAspect (aFontAspect);
}
else if (aParam == "-font")
{
@@ -5191,49 +5215,6 @@ static Standard_Integer VMarkersTest (Draw_Interpretor&,
return 0;
}
//! Auxiliary function to parse font aspect style argument
static Standard_Boolean parseFontStyle (const TCollection_AsciiString& theArg,
Font_FontAspect& theAspect)
{
if (theArg == "regular"
|| *theArg.ToCString() == 'r')
{
theAspect = Font_FA_Regular;
return Standard_True;
}
else if (theArg == "bolditalic")
{
theAspect = Font_FA_BoldItalic;
return Standard_True;
}
else if (theArg == "bold"
|| *theArg.ToCString() == 'b')
{
theAspect = Font_FA_Bold;
return Standard_True;
}
else if (theArg == "italic"
|| *theArg.ToCString() == 'i')
{
theAspect = Font_FA_Italic;
return Standard_True;
}
return Standard_False;
}
//! Auxiliary function
static TCollection_AsciiString fontStyleString (const Font_FontAspect theAspect)
{
switch (theAspect)
{
case Font_FA_Regular: return "regular";
case Font_FA_BoldItalic: return "bolditalic";
case Font_FA_Bold: return "bold";
case Font_FA_Italic: return "italic";
default: return "undefined";
}
}
//=======================================================================
//function : TextToBrep
//purpose : Tool for conversion text to occt-shapes
@@ -5364,26 +5345,9 @@ static int TextToBRep (Draw_Interpretor& /*theDI*/,
TCollection_AsciiString anOption (theArgVec[anArgIt]);
anOption.LowerCase();
if (anOption.IsEqual ("regular"))
if (!parseFontStyle (anOption, aFontAspect))
{
aFontAspect = Font_FA_Regular;
}
else if (anOption.IsEqual ("bold"))
{
aFontAspect = Font_FA_Bold;
}
else if (anOption.IsEqual ("italic"))
{
aFontAspect = Font_FA_Italic;
}
else if (anOption.IsEqual ("bolditalic"))
{
aFontAspect = Font_FA_BoldItalic;
}
else
{
std::cout << "Error: wrong syntax at '" << aParam.ToCString() << "'.\n";
std::cout << "Error: unknown font aspect '" << anOption << "'.\n";
return 1;
}
}
@@ -5459,8 +5423,8 @@ static int VFont (Draw_Interpretor& theDI,
{
// just print the list of available fonts
Standard_Boolean isFirst = Standard_True;
for (Font_NListOfSystemFont::Iterator anIter (aMgr->GetAvailableFonts());
anIter.More(); anIter.Next())
const Font_NListOfSystemFont aFonts = aMgr->GetAvailableFonts();
for (Font_NListOfSystemFont::Iterator anIter (aFonts); anIter.More(); anIter.Next())
{
const Handle(Font_SystemFont)& aFont = anIter.Value();
if (!isFirst)
@@ -5468,9 +5432,7 @@ static int VFont (Draw_Interpretor& theDI,
theDI << "\n";
}
theDI << aFont->FontName()->String()
<< " " << fontStyleString (aFont->FontAspect())
<< " " << aFont->FontPath()->String();
theDI << aFont->ToString();
isFirst = Standard_False;
}
return 0;
@@ -5481,15 +5443,11 @@ static int VFont (Draw_Interpretor& theDI,
const TCollection_AsciiString anArg (theArgVec[anArgIter]);
TCollection_AsciiString anArgCase (anArg);
anArgCase.LowerCase();
if (anArgCase == "find")
if (anArgIter + 1 < theArgNb
&& (anArgCase == "-find"
|| anArgCase == "find"))
{
if (++anArgIter >= theArgNb)
{
std::cerr << "Wrong syntax at argument '" << anArg.ToCString() << "'!\n";
return 1;
}
Standard_CString aFontName = theArgVec[anArgIter];
Standard_CString aFontName = theArgVec[++anArgIter];
Font_FontAspect aFontAspect = Font_FA_Undefined;
if (++anArgIter < theArgNb)
{
@@ -5500,26 +5458,23 @@ static int VFont (Draw_Interpretor& theDI,
--anArgIter;
}
}
Handle(Font_SystemFont) aFont = aMgr->FindFont (new TCollection_HAsciiString (aFontName), aFontAspect, -1);
if (aFont.IsNull())
if (Handle(Font_SystemFont) aFont = aMgr->FindFont (aFontName, aFontAspect))
{
theDI << aFont->ToString();
}
else
{
std::cerr << "Error: font '" << aFontName << "' is not found!\n";
continue;
}
theDI << aFont->FontName()->String()
<< " " << fontStyleString (aFont->FontAspect())
<< " " << aFont->FontPath()->String();
}
else if (anArgCase == "add"
|| anArgCase == "register")
else if (anArgIter + 1 < theArgNb
&& (anArgCase == "-add"
|| anArgCase == "add"
|| anArgCase == "-register"
|| anArgCase == "register"))
{
if (++anArgIter >= theArgNb)
{
std::cerr << "Error: wrong syntax at argument '" << anArg << "'!\n";
return 1;
}
++anArgIter;
Standard_CString aFontPath = theArgVec[anArgIter++];
TCollection_AsciiString aFontName;
Font_FontAspect aFontAspect = Font_FA_Undefined;
@@ -5528,7 +5483,7 @@ static int VFont (Draw_Interpretor& theDI,
{
anArgCase = theArgVec[anArgIter];
anArgCase.LowerCase();
if (aFontAspect == Font_FA_Undefined
if (aFontAspect == Font_FontAspect_UNDEFINED
&& parseFontStyle (anArgCase, aFontAspect))
{
continue;
@@ -5557,19 +5512,27 @@ static int VFont (Draw_Interpretor& theDI,
continue;
}
if (aFontAspect != Font_FA_Undefined
if (aFontAspect != Font_FontAspect_UNDEFINED
|| !aFontName.IsEmpty())
{
if (aFontAspect == Font_FA_Undefined)
{
aFontAspect = aFont->FontAspect();
}
Handle(TCollection_HAsciiString) aName = aFont->FontName();
TCollection_AsciiString aName = aFont->FontName();
if (!aFontName.IsEmpty())
{
aName = new TCollection_HAsciiString (aFontName);
aName = aFontName;
}
aFont = new Font_SystemFont (aName, aFontAspect, new TCollection_HAsciiString (aFontPath));
Handle(Font_SystemFont) aFont2 = new Font_SystemFont (aName);
if (aFontAspect != Font_FontAspect_UNDEFINED)
{
aFont2->SetFontPath (aFontAspect, aFontPath);
}
else
{
for (int anAspectIter = 0; anAspectIter < Font_FontAspect_NB; ++anAspectIter)
{
aFont2->SetFontPath ((Font_FontAspect )anAspectIter, aFont->FontPath ((Font_FontAspect )anAspectIter));
}
}
aFont = aFont2;
}
if (isSingelStroke != -1)
{
@@ -5577,9 +5540,18 @@ static int VFont (Draw_Interpretor& theDI,
}
aMgr->RegisterFont (aFont, Standard_True);
theDI << aFont->FontName()->String()
<< " " << fontStyleString (aFont->FontAspect())
<< " " << aFont->FontPath()->String();
theDI << aFont->ToString();
}
else if (anArgCase == "-verbose"
|| anArgCase == "-trace")
{
bool toEnable = true;
if (anArgIter + 1 < theArgNb
&& ViewerTest::ParseOnOff (theArgVec[anArgIter + 1], toEnable))
{
++anArgIter;
}
aMgr->SetTraceAliases (toEnable);
}
else
{
@@ -6501,7 +6473,7 @@ void ViewerTest::ObjectCommands(Draw_Interpretor& theCommands)
"\n\t\t: [-angle angle=0]"
"\n\t\t: [-zoom {0|1}=0]"
"\n\t\t: [-height height=16]"
"\n\t\t: [-aspect {regular|bold|italic|bolditalic}=regular]"
"\n\t\t: [-aspect {regular|bold|italic|boldItalic}=regular]"
"\n\t\t: [-font font=Times]"
"\n\t\t: [-2d]"
"\n\t\t: [-perspos {X Y Z}=0 0 0], where"
@@ -6658,14 +6630,14 @@ void ViewerTest::ObjectCommands(Draw_Interpretor& theCommands)
"\n\t\t: [-halign {left|center|right}=left]"
"\n\t\t: [-valign {top|center|bottom|topfirstline}=bottom}]"
"\n\t\t: [-height height=16]"
"\n\t\t: [-aspect {regular|bold|italic|bolditalic}=regular]"
"\n\t\t: [-aspect {regular|bold|italic|boldItalic}=regular]"
"\n\t\t: [-font font=Courier]"
"\n\t\t: [-composite {on|off}=off]"
"\n\t\t: [-plane NormX NormY NormZ DirX DirY DirZ]",
__FILE__, TextToBRep, group);
theCommands.Add ("vfont",
"vfont [add pathToFont [fontName] [regular,bold,italic,bolditalic=undefined] [singleStroke]]"
"\n\t\t: [find fontName [regular,bold,italic,bolditalic=undefined]]",
"vfont [-add pathToFont [fontName] [regular,bold,italic,boldItalic=undefined] [singleStroke]]"
"\n\t\t: [-find fontName [regular,bold,italic,boldItalic=undefined]] [-verbose {on|off}]",
__FILE__, VFont, group);
theCommands.Add ("vsetedgetype",