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
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
|
|
|