Restructure and simplify Font loading

This commit is contained in:
Flamefire committed 2014-09-06 12:57:40 +02:00
1 parent 9f8dfaa50c
commit 32241a91dc
6 files changed
+169 -191

No files matched your search

+12 -8
View File
@@ -4,10 +4,12 @@
<Font1>
<Name>Normal</Name>
<Outline>0,00</Outline>
<OutlineColorR>0,00</OutlineColorR>
<OutlineColorG>0,00</OutlineColorG>
<OutlineColorB>0,00</OutlineColorB>
<OutlineColorA>1,00</OutlineColorA>
<OutlineColor>
<R>0,00</R>
<G>0,00</G>
<B>0,00</B>
<A>1,00</A>
</OutlineColor>
<Folder>FreeSans</Folder>
<FileNormal>FreeSans.ttf</FileNormal>
<FileBold>FreeSansBold.ttf</FileBold>
@@ -17,10 +19,12 @@
<Font2>
<Name>Outline</Name>
<Outline>0,10</Outline>
<OutlineColorR>0,00</OutlineColorR>
<OutlineColorG>0,00</OutlineColorG>
<OutlineColorB>0,00</OutlineColorB>
<OutlineColorA>1,00</OutlineColorA>
<OutlineColor>
<R>0,00</R>
<G>0,00</G>
<B>0,00</B>
<A>1,00</A>
</OutlineColor>
<Folder>FreeSans</Folder>
<FileNormal>FreeSans.ttf</FileNormal>
<FileBold>FreeSansBold.ttf</FileBold>
+1 -1
View File
@@ -266,7 +266,7 @@ namespace Vocaluxe.Base
{
CFonts.LoadThemeFonts(
_Themes[themeIndex].Name,
Path.Combine(Path.Combine(_Themes[themeIndex].Path, _Themes[themeIndex].SkinFolder), CSettings.FolderNameThemeFonts),
Path.Combine(_Themes[themeIndex].Path, _Themes[themeIndex].SkinFolder, CSettings.FolderNameThemeFonts),
xmlReader);
}
else
+3 -3
View File
@@ -19,6 +19,7 @@ using System;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Text;
using System.Xml.Serialization;
using VocaluxeLib;
using VocaluxeLib.Draw;
@@ -154,15 +155,14 @@ namespace Vocaluxe.Base.Fonts
}
}
struct SFont
struct SFontFamily
{
public string Name;
public bool IsThemeFont;
public int PartyModeID;
public string ThemeName;
public string Folder;
public string FileNormal;
public string FileItalic;
public string FileBold;
+146 -174
View File
@@ -27,13 +27,12 @@ namespace Vocaluxe.Base.Fonts
{
static class CFonts
{
private static readonly List<SFont> _Fonts = new List<SFont>();
private static bool _IsInitialized;
private static readonly List<SFontFamily> _FontFamilies = new List<SFontFamily>();
private static int _CurrentFont;
private static float _Height = 1f;
// ReSharper disable MemberCanBePrivate.Global
public static int PartyModeID { get; set; }
// ReSharper restore MemberCanBePrivate.Global
public static EStyle Style = EStyle.Normal;
@@ -45,34 +44,34 @@ namespace Vocaluxe.Base.Fonts
public static float Outline
{
get { return _Fonts[_CurrentFont].Outline; }
get { return _FontFamilies[_CurrentFont].Outline; }
}
public static SColorF OutlineColor
{
get { return _Fonts[_CurrentFont].OutlineColor; }
get { return _FontFamilies[_CurrentFont].OutlineColor; }
}
public static void Init()
public static bool Init()
{
if (_IsInitialized)
return false;
_CurrentFont = 0;
PartyModeID = -1;
_BuildFonts();
return _LoadDefaultFonts();
}
private static void _BuildFonts()
public static void Close()
{
foreach (SFont font in _Fonts)
foreach (SFontFamily font in _FontFamilies)
{
font.Normal.Dispose();
font.Bold.Dispose();
font.Italic.Dispose();
font.BoldItalic.Dispose();
}
_Fonts.Clear();
_CurrentFont = 0;
_LoadFontList();
_FontFamilies.Clear();
_IsInitialized = false;
}
public static Font GetFont()
@@ -85,16 +84,16 @@ namespace Vocaluxe.Base.Fonts
switch (Style)
{
case EStyle.Normal:
return _Fonts[_CurrentFont].Normal;
return _FontFamilies[_CurrentFont].Normal;
case EStyle.Italic:
return _Fonts[_CurrentFont].Italic;
return _FontFamilies[_CurrentFont].Italic;
case EStyle.Bold:
return _Fonts[_CurrentFont].Bold;
return _FontFamilies[_CurrentFont].Bold;
case EStyle.BoldItalic:
return _Fonts[_CurrentFont].BoldItalic;
return _FontFamilies[_CurrentFont].BoldItalic;
}
//Just in case...
return _Fonts[_CurrentFont].Normal;
return _FontFamilies[_CurrentFont].Normal;
}
#region DrawText
@@ -216,9 +215,9 @@ namespace Vocaluxe.Base.Fonts
public static void SetFont(string fontName)
{
int index = _GetPartyFontIndex(PartyModeID, fontName);
int index = _GetPartyFontIndex(fontName, PartyModeID);
if (index < 0)
index = _GetThemeFontIndex(CConfig.Theme, fontName);
index = _GetThemeFontIndex(fontName, CConfig.Theme);
if (index < 0)
index = _GetFontIndex(fontName);
if (index >= 0)
@@ -266,60 +265,112 @@ namespace Vocaluxe.Base.Fonts
public static float GetTextHeight(string text)
{
//return TextRenderer.MeasureText(text, GetFont()).Height;
CFont font = _GetCurrentFont();
return text == "" ? 0 : text.Select(font.GetHeight).Max();
}
private static void _LoadFontFiles(CXMLReader xmlReader, string fontFolder, string themeName = "", int partyModeId = -1)
private static int _GetFontIndex(string fontName)
{
string value = string.Empty;
int i = 1;
while (xmlReader.GetValue("//root/Fonts/Font" + i + "/Folder", out value, value))
for (int i = 0; i < _FontFamilies.Count; i++)
{
var sf = new SFont {Folder = value, IsThemeFont = themeName != "", ThemeName = themeName, PartyModeID = partyModeId};
if (_FontFamilies[i].Name == fontName)
return i;
}
return -1;
}
private static int _GetThemeFontIndex(string fontName, string themeName)
{
if (themeName == "" || fontName == "")
return -1;
for (int i = 0; i < _FontFamilies.Count; i++)
{
if (_FontFamilies[i].Name == fontName && _FontFamilies[i].ThemeName == themeName)
return i;
}
return -1;
}
private static int _GetPartyFontIndex(string fontName, int partyModeID)
{
if (partyModeID == -1 || fontName == "")
return -1;
for (int i = 0; i < _FontFamilies.Count; i++)
{
if (_FontFamilies[i].PartyModeID == partyModeID && _FontFamilies[i].Name == fontName)
return i;
}
return -1;
}
/// <summary>
/// Load default fonts
/// </summary>
/// <returns></returns>
private static bool _LoadDefaultFonts()
{
CXMLReader xmlReader = CXMLReader.OpenFile(Path.Combine(CSettings.ProgramFolder, CSettings.FolderNameFonts, CSettings.FileNameFonts));
if (xmlReader == null)
return false;
return _LoadFontFile(xmlReader, Path.Combine(CSettings.ProgramFolder, CSettings.FolderNameFonts));
}
/// <summary>
/// Loads theme fonts from skin file
/// </summary>
public static bool LoadThemeFonts(string themeName, string fontFolder, CXMLReader xmlReader)
{
bool ok = _LoadFontFile(xmlReader, fontFolder, themeName);
CLog.StartBenchmark("BuildGlyphs");
_BuildGlyphs();
CLog.StopBenchmark("BuildGlyphs");
return ok;
}
/// <summary>
/// Loads party mode fonts from skin file
/// </summary>
public static bool LoadPartyModeFonts(int partyModeID, string fontFolder, CXMLReader xmlReader)
{
bool ok = _LoadFontFile(xmlReader, fontFolder, "", partyModeID);
CLog.StartBenchmark("BuildGlyphs");
_BuildGlyphs();
CLog.StopBenchmark("BuildGlyphs");
return ok;
}
private static bool _LoadFontFile(CXMLReader xmlReader, string fontFolder, string themeName = "", int partyModeId = -1)
{
string value;
int i = 1;
while (xmlReader.GetValue("//root/Fonts/Font" + i + "/Folder", out value))
{
var sf = new SFontFamily {Folder = value, ThemeName = themeName, PartyModeID = partyModeId};
bool ok = true;
string name;
ok &= xmlReader.GetValue("//root/Fonts/Font" + i + "/Name", out name, value);
sf.Name = name;
ok &= xmlReader.GetValue("//root/Fonts/Font" + i + "/FileNormal", out value, value);
sf.FileNormal = value;
value = Path.Combine(fontFolder, Path.Combine(sf.Folder, value));
var f = new CFont(value);
sf.Normal = f;
ok &= xmlReader.GetValue("//root/Fonts/Font" + i + "/FileItalic", out value, value);
sf.FileItalic = value;
value = Path.Combine(fontFolder, Path.Combine(sf.Folder, value));
f = new CFont(value);
sf.Italic = f;
ok &= xmlReader.GetValue("//root/Fonts/Font" + i + "/FileBold", out value, value);
sf.FileBold = value;
value = Path.Combine(fontFolder, Path.Combine(sf.Folder, value));
f = new CFont(value);
sf.Bold = f;
ok &= xmlReader.GetValue("//root/Fonts/Font" + i + "/FileBoldItalic", out value, value);
sf.FileBoldItalic = value;
value = Path.Combine(fontFolder, Path.Combine(sf.Folder, value));
f = new CFont(value);
sf.BoldItalic = f;
sf.Outline = 0f;
ok &= xmlReader.TryGetFloatValue("//root/Fonts/Font" + i + "/Outline", ref sf.Outline);
sf.OutlineColor = new SColorF(0f, 0f, 0f, 1f);
ok &= xmlReader.TryGetFloatValue("//root/Fonts/Font" + i + "/OutlineColorR", ref sf.OutlineColor.R);
ok &= xmlReader.TryGetFloatValue("//root/Fonts/Font" + i + "/OutlineColorG", ref sf.OutlineColor.G);
ok &= xmlReader.TryGetFloatValue("//root/Fonts/Font" + i + "/OutlineColorB", ref sf.OutlineColor.B);
ok &= xmlReader.TryGetFloatValue("//root/Fonts/Font" + i + "/OutlineColorA", ref sf.OutlineColor.A);
ok &= xmlReader.GetValue("//root/Fonts/Font" + i + "/Name", out sf.Name);
ok &= xmlReader.GetValue("//root/Fonts/Font" + i + "/FileNormal", out sf.FileNormal);
ok &= xmlReader.GetValue("//root/Fonts/Font" + i + "/FileItalic", out sf.FileItalic);
ok &= xmlReader.GetValue("//root/Fonts/Font" + i + "/FileBold", out sf.FileBold);
ok &= xmlReader.GetValue("//root/Fonts/Font" + i + "/FileBoldItalic", out sf.FileBoldItalic);
ok &= xmlReader.TryGetNormalizedFloatValue("//root/Fonts/Font" + i + "/Outline", ref sf.Outline);
ok &= xmlReader.TryGetColorFromRGBA("//root/Fonts/Font" + i + "/OutlineColor", ref sf.OutlineColor);
if (ok)
_Fonts.Add(sf);
{
sf.Normal = new CFont(Path.Combine(fontFolder, sf.Folder, sf.FileNormal));
sf.Italic = new CFont(Path.Combine(fontFolder, sf.Folder, sf.FileItalic));
sf.Bold = new CFont(Path.Combine(fontFolder, sf.Folder, sf.FileBold));
sf.BoldItalic = new CFont(Path.Combine(fontFolder, sf.Folder, sf.FileBoldItalic));
_FontFamilies.Add(sf);
}
else
{
string fontTypes;
@@ -330,166 +381,87 @@ namespace Vocaluxe.Base.Fonts
else
fontTypes = "basic fonts";
CLog.LogError("Error loading " + fontTypes + ": Error in Font" + i);
return false;
}
i++;
}
}
/// <summary>
/// Load default fonts
/// </summary>
/// <returns></returns>
private static void _LoadFontList()
{
CXMLReader xmlReader = CXMLReader.OpenFile(Path.Combine(CSettings.ProgramFolder, CSettings.FolderNameFonts, CSettings.FileNameFonts));
if (xmlReader == null)
return;
_LoadFontFiles(xmlReader, Path.Combine(CSettings.ProgramFolder, CSettings.FolderNameFonts));
}
/// <summary>
/// Loads theme fonts from skin file
/// </summary>
public static void LoadThemeFonts(string themeName, string fontFolder, CXMLReader xmlReader)
{
_LoadFontFiles(xmlReader, fontFolder, themeName);
CLog.StartBenchmark("BuildGlyphs");
_BuildGlyphs();
CLog.StopBenchmark("BuildGlyphs");
}
/// <summary>
/// Loads party mode fonts from skin file
/// </summary>
public static void LoadPartyModeFonts(int partyModeID, string fontFolder, CXMLReader xmlReader)
{
_LoadFontFiles(xmlReader, fontFolder, "", partyModeID);
CLog.StartBenchmark("BuildGlyphs");
_BuildGlyphs();
CLog.StopBenchmark("BuildGlyphs");
return true;
}
public static void SaveThemeFonts(string themeName, XmlWriter writer)
{
if (_Fonts.Count == 0)
if (_FontFamilies.Count == 0)
return;
int index = 0;
writer.WriteStartElement("Fonts");
int fontNr = 1;
bool setStart = false;
while (index < _Fonts.Count)
foreach (SFontFamily font in _FontFamilies)
{
if (_Fonts[index].IsThemeFont && _Fonts[index].ThemeName == themeName)
if (font.ThemeName == themeName)
{
if (!setStart)
{
writer.WriteStartElement("Fonts");
setStart = true;
}
writer.WriteStartElement("Font" + fontNr);
writer.WriteElementString("Name", _Fonts[index].Name);
writer.WriteElementString("Folder", _Fonts[index].Folder);
writer.WriteElementString("Name", font.Name);
writer.WriteElementString("Folder", font.Folder);
writer.WriteElementString("Outline", _Fonts[index].Outline.ToString("#0.00"));
writer.WriteElementString("OutlineColorR", _Fonts[index].OutlineColor.R.ToString("#0.00"));
writer.WriteElementString("OutlineColorG", _Fonts[index].OutlineColor.G.ToString("#0.00"));
writer.WriteElementString("OutlineColorB", _Fonts[index].OutlineColor.B.ToString("#0.00"));
writer.WriteElementString("OutlineColorA", _Fonts[index].OutlineColor.A.ToString("#0.00"));
writer.WriteElementString("Outline", font.Outline.ToString("#0.00"));
writer.WriteStartElement("OutlineColor");
writer.WriteElementString("R", font.OutlineColor.R.ToString("#0.00"));
writer.WriteElementString("G", font.OutlineColor.G.ToString("#0.00"));
writer.WriteElementString("B", font.OutlineColor.B.ToString("#0.00"));
writer.WriteElementString("A", font.OutlineColor.A.ToString("#0.00"));
writer.WriteEndElement();
writer.WriteElementString("FileNormal", _Fonts[index].FileNormal);
writer.WriteElementString("FileBold", _Fonts[index].FileBold);
writer.WriteElementString("FileItalic", _Fonts[index].FileItalic);
writer.WriteElementString("FileBoldItalic", _Fonts[index].FileBoldItalic);
writer.WriteElementString("FileNormal", font.FileNormal);
writer.WriteElementString("FileBold", font.FileBold);
writer.WriteElementString("FileItalic", font.FileItalic);
writer.WriteElementString("FileBoldItalic", font.FileBoldItalic);
writer.WriteEndElement();
fontNr++;
}
index++;
}
if (setStart)
writer.WriteEndElement();
writer.WriteEndElement();
}
public static void UnloadThemeFonts(string themeName)
{
int index = 0;
while (index < _Fonts.Count)
while (index < _FontFamilies.Count)
{
if (_Fonts[index].IsThemeFont && _Fonts[index].ThemeName == themeName)
if (_FontFamilies[index].ThemeName == themeName)
{
_Fonts[index].Normal.UnloadGlyphs();
_Fonts[index].Italic.UnloadGlyphs();
_Fonts[index].Bold.UnloadGlyphs();
_Fonts[index].BoldItalic.UnloadGlyphs();
_Fonts.RemoveAt(index);
_FontFamilies[index].Normal.Dispose();
_FontFamilies[index].Italic.Dispose();
_FontFamilies[index].Bold.Dispose();
_FontFamilies[index].BoldItalic.Dispose();
_FontFamilies.RemoveAt(index);
}
else
index++;
}
}
private static int _GetFontIndex(string fontName)
{
for (int i = 0; i < _Fonts.Count; i++)
{
if (!_Fonts[i].IsThemeFont && _Fonts[i].Name == fontName)
return i;
}
return -1;
}
private static int _GetThemeFontIndex(string themeName, string fontName)
{
if (themeName == "" || fontName == "")
return -1;
for (int i = 0; i < _Fonts.Count; i++)
{
if (_Fonts[i].IsThemeFont && _Fonts[i].Name == fontName && _Fonts[i].ThemeName == themeName)
return i;
}
return -1;
}
private static int _GetPartyFontIndex(int partyModeID, string fontName)
{
if (partyModeID == -1 || fontName == "")
return -1;
for (int i = 0; i < _Fonts.Count; i++)
{
if (!_Fonts[i].IsThemeFont && _Fonts[i].PartyModeID == partyModeID && _Fonts[i].Name == fontName)
return i;
}
return -1;
}
private static void _BuildGlyphs()
{
const string text = " abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890";
for (int i = 0; i < _Fonts.Count; i++)
for (int i = 0; i < _FontFamilies.Count; i++)
{
_CurrentFont = i;
foreach (char chr in text)
{
Style = EStyle.Normal;
_Fonts[_CurrentFont].Normal.GetOrAddGlyph(chr);
_FontFamilies[_CurrentFont].Normal.GetOrAddGlyph(chr);
Style = EStyle.Bold;
_Fonts[_CurrentFont].Bold.GetOrAddGlyph(chr);
_FontFamilies[_CurrentFont].Bold.GetOrAddGlyph(chr);
Style = EStyle.Italic;
_Fonts[_CurrentFont].Italic.GetOrAddGlyph(chr);
_FontFamilies[_CurrentFont].Italic.GetOrAddGlyph(chr);
Style = EStyle.BoldItalic;
_Fonts[_CurrentFont].BoldItalic.GetOrAddGlyph(chr);
_FontFamilies[_CurrentFont].BoldItalic.GetOrAddGlyph(chr);
}
}
Style = EStyle.Normal;
+1 -1
View File
@@ -64,7 +64,7 @@ namespace Vocaluxe.Base.Fonts
if (chr != ' ')
{
//Gets exact height and width for drawing more than 1 char. But width is to small to draw char on bitmap as e.g. italic chars will get cropped
_BoundingBox = g.MeasureString(chrString, fo, -1, new StringFormat(StringFormat.GenericTypographic));
_BoundingBox = g.MeasureString(chrString, fo, -1, StringFormat.GenericTypographic);
// ReSharper disable CompareOfFloatsByEqualityOperator
if (_BoundingBox.Height == 0)
// ReSharper restore CompareOfFloatsByEqualityOperator
+6 -4
View File
@@ -173,10 +173,11 @@ namespace Vocaluxe
Application.DoEvents();
// Init Font
CLog.StartBenchmark("Init Font");
CFonts.Init();
CLog.StopBenchmark("Init Font");
// Init Fonts
CLog.StartBenchmark("Init Fonts");
if (!CFonts.Init())
throw new CLoadingException("fonts");
CLog.StopBenchmark("Init Fonts");
Application.DoEvents();
@@ -264,6 +265,7 @@ namespace Vocaluxe
CVocaluxeServer.Close();
CGraphics.Close();
CCover.Close();
CFonts.Close();
CBackgroundMusic.Close();
CWebcam.Close();
CDataBase.Close();