144 lines
5.4 KiB
C#
144 lines
5.4 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text;
|
|
using System.Drawing;
|
|
using System.Drawing.Text;
|
|
using System.Runtime.InteropServices;
|
|
using System.Windows.Forms;
|
|
using System.ComponentModel;
|
|
using System.IO;
|
|
using System.Reflection;
|
|
#if LAYOUT
|
|
namespace DevComponents.DotNetBar.Layout
|
|
#else
|
|
namespace DevComponents.DotNetBar
|
|
#endif
|
|
{
|
|
// Uses Font Awesome - http://fortawesome.github.com/Font-Awesome
|
|
[EditorBrowsable(EditorBrowsableState.Never)]
|
|
public static class Symbols
|
|
{
|
|
#region WinApi
|
|
[DllImport("gdi32")]
|
|
static extern IntPtr AddFontMemResourceEx(IntPtr pbFont,
|
|
uint cbFont,
|
|
IntPtr pdv,
|
|
[In] ref uint pcFonts);
|
|
[DllImport("gdi32")]
|
|
[return: MarshalAs(UnmanagedType.Bool)]
|
|
static extern bool RemoveFontMemResourceEx(IntPtr fh);
|
|
#endregion
|
|
|
|
|
|
#region Internal Implementation
|
|
private static Dictionary<float, Font> _FontAwesomeCache = new Dictionary<float, Font>(10);
|
|
/// <summary>
|
|
/// Returns FontAwesome at specific size.
|
|
/// </summary>
|
|
/// <param name="fontSize">Font size in points</param>
|
|
/// <returns>Font in desired size.</returns>
|
|
public static Font GetFontAwesome(float fontSize)
|
|
{
|
|
Font font = null;
|
|
EnsureFontLoaded();
|
|
if (fontSize <= 0) return _FontAwesome;
|
|
if(_FontAwesomeCache.TryGetValue(fontSize, out font))
|
|
return font;
|
|
font = new Font(_FontAwesome.FontFamily, fontSize, FontStyle.Regular, GraphicsUnit.Point);
|
|
_FontAwesomeCache.Add(fontSize, font);
|
|
return font;
|
|
}
|
|
|
|
private static Font _FontAwesome = null;
|
|
/// <summary>
|
|
/// Gets FontAwesome at default size.
|
|
/// </summary>
|
|
public static Font FontAwesome
|
|
{
|
|
get
|
|
{
|
|
EnsureFontLoaded();
|
|
return _FontAwesome;
|
|
}
|
|
}
|
|
/// <summary>
|
|
/// Returns FontAwesome Family.
|
|
/// </summary>
|
|
public static FontFamily FontAwesomeFamily
|
|
{
|
|
get
|
|
{
|
|
EnsureFontLoaded();
|
|
return _FontAwesome.FontFamily;
|
|
}
|
|
}
|
|
|
|
private static PrivateFontCollection _PrivateFontCollection;
|
|
private static GCHandle _FontAwesomeHandle;
|
|
private static IntPtr _FontAwesomePointer;
|
|
private static void EnsureFontLoaded()
|
|
{
|
|
if (_FontAwesome == null)
|
|
{
|
|
_PrivateFontCollection = new PrivateFontCollection();
|
|
|
|
byte[] fontAwesomeBuffer = LoadFont("SystemImages.FontAwesome.ttf");
|
|
_FontAwesomeHandle = GCHandle.Alloc(fontAwesomeBuffer, GCHandleType.Pinned);
|
|
_PrivateFontCollection.AddMemoryFont(_FontAwesomeHandle.AddrOfPinnedObject(), fontAwesomeBuffer.Length);
|
|
uint rsxCnt = 1;
|
|
_FontAwesomePointer = AddFontMemResourceEx(_FontAwesomeHandle.AddrOfPinnedObject(),
|
|
(uint)fontAwesomeBuffer.Length, IntPtr.Zero, ref rsxCnt);
|
|
using (FontFamily ff = _PrivateFontCollection.Families[0])
|
|
{
|
|
if (ff.IsStyleAvailable(FontStyle.Regular))
|
|
{
|
|
_FontAwesome = new Font(ff, _FontAwesomeDefaultSize, FontStyle.Regular, GraphicsUnit.Point);
|
|
_FontAwesomeCache.Add(_FontAwesomeDefaultSize, _FontAwesome);
|
|
}
|
|
else
|
|
{
|
|
// Error use default font...
|
|
_FontAwesome = SystemInformation.MenuFont;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private static float _FontAwesomeDefaultSize = 18;
|
|
/// <summary>
|
|
/// Gets the default size for the FontAwesome font size in points.
|
|
/// </summary>
|
|
public static float FontAwesomeDefaultSize
|
|
{
|
|
get { return _FontAwesomeDefaultSize; }
|
|
}
|
|
|
|
internal static byte[] LoadFont(string fontFileName)
|
|
{
|
|
DotNetBarLayoutResourcesAttribute att = Attribute.GetCustomAttribute(System.Reflection.Assembly.GetExecutingAssembly(), typeof(DotNetBarLayoutResourcesAttribute)) as DotNetBarLayoutResourcesAttribute;
|
|
if (att != null && att.NamespacePrefix != "")
|
|
{
|
|
using (Stream fontStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(att.NamespacePrefix + "." + fontFileName))
|
|
{
|
|
byte[] fontData = new byte[fontStream.Length];
|
|
fontStream.Read(fontData, 0, fontData.Length);
|
|
fontStream.Close();
|
|
return fontData;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
using (Stream fontStream = typeof(LayoutControl).Module.Assembly.GetManifestResourceStream(typeof(LayoutControl), fontFileName))
|
|
{
|
|
byte[] fontData = new byte[fontStream.Length];
|
|
fontStream.Read(fontData, 0, fontData.Length);
|
|
fontStream.Close();
|
|
return fontData;
|
|
}
|
|
}
|
|
return new byte[0];
|
|
}
|
|
#endregion
|
|
}
|
|
}
|