You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

132 lines
4.1 KiB

#if NET40 || NET461
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows.Media;
namespace Apewer.Surface
{
/// <summary></summary>
internal class FontInstance
{
private FontFamily _fontfamily = null;
private Dictionary<string, string> _names = null;
private FontInstance(FontFamily fontFamily) { _fontfamily = fontFamily; }
/// <summary></summary>
public Dictionary<string, string> FontFamiliy
{
get
{
if (_names == null)
{
_names = new Dictionary<string, string>();
if (_fontfamily.FamilyNames.Keys.Count > 0)
{
foreach (var name in _fontfamily.FamilyNames)
{
var key = name.Key.IetfLanguageTag;
var value = name.Value;
if (!_names.ContainsKey(key)) _names.Add(key, value);
}
}
}
var result = new Dictionary<string, string>();
foreach (var item in _names) result.Add(item.Key, item.Value);
return result;
}
}
/// <summary></summary>
public List<string> EnemerateChars()
{
var list = new List<string>();
if (_fontfamily == null) return list;
var typefaces = _fontfamily.GetTypefaces();
foreach (var typeface in typefaces)
{
GlyphTypeface glyph;
var tried = typeface.TryGetGlyphTypeface(out glyph);
if (glyph != null)
{
list.Clear();
var map = glyph.CharacterToGlyphMap;
for (int i = 0; i < map.Count; i++)
{
long index = map.Keys.ElementAt(i);
try
{
var c = Convert.ToChar(index);
list.Add(c.ToString());
}
catch { }
}
}
}
return list;
}
/// <summary></summary>
public List<string> EnemerateChars(string fontFamily)
{
var list = new List<string>();
if (string.IsNullOrEmpty(fontFamily)) return list;
var fontfamily = new FontFamily(fontFamily);
var typefaces = fontfamily.GetTypefaces();
foreach (var typeface in typefaces)
{
GlyphTypeface glyph;
var tried = typeface.TryGetGlyphTypeface(out glyph);
if (glyph != null)
{
var map = glyph.CharacterToGlyphMap;
for (int i = 0; i < map.Count; i++)
{
long index = map.Keys.ElementAt(i);
try
{
var c = Convert.ToChar(index);
list.Add(c.ToString());
}
catch { }
}
}
}
return list;
}
/// <summary></summary>
public static List<FontInstance> EnumerateSystemFontFamilies()
{
var list = new List<FontInstance>();
var fontfamilies = Fonts.SystemFontFamilies;
foreach (var fontfamily in fontfamilies)
{
list.Add(new FontInstance(fontfamily));
}
return list;
}
/// <summary></summary>
public static List<FontInstance> FromFile(string path)
{
var list = new List<FontInstance>();
var fontfamilies = Fonts.GetFontFamilies(path);
foreach (var fontfamily in fontfamilies)
{
list.Add(new FontInstance(fontfamily));
}
return list;
}
}
}
#endif