152 lines
4.5 KiB
C#
152 lines
4.5 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Diagnostics;
|
|
using System.Linq;
|
|
using System.Runtime.CompilerServices;
|
|
using System.Runtime.InteropServices;
|
|
using System.Text;
|
|
using System.Threading.Tasks;
|
|
|
|
#if false
|
|
namespace Quik.Media.Defaults.Win32
|
|
{
|
|
|
|
public class EnumerateFonts
|
|
{
|
|
private const byte DEFAULT_CHARSET = 1;
|
|
|
|
public static void Enumerate(FontFace font)
|
|
{
|
|
/* It's windows, just borrow the desktop window. */
|
|
IntPtr hdc = GetDC(GetDesktopWindow());
|
|
|
|
List<(LogFontA, TextMetricA)> list = new List<(LogFontA, TextMetricA)>();
|
|
|
|
LogFontA font2 = new LogFontA()
|
|
{
|
|
//FaceName = font.Family,
|
|
Weight = ((font.Style & FontStyle.Bold) != 0) ? FontWeight.Bold : FontWeight.Regular,
|
|
Italic = (font.Style & FontStyle.Italic) != 0,
|
|
CharSet = DEFAULT_CHARSET
|
|
};
|
|
|
|
Console.WriteLine(font2.FaceName);
|
|
|
|
EnumFontFamiliesExProc proc = (in LogFontA font, in TextMetricA metric, int type, IntPtr lparam) =>
|
|
{
|
|
list.Add((font, metric));
|
|
return 0;
|
|
};
|
|
|
|
EnumFontFamiliesExA(hdc, font2, proc, IntPtr.Zero, 0);
|
|
}
|
|
|
|
private const string gdi32 = "Gdi32.dll";
|
|
private const string user32 = "User32.dll";
|
|
|
|
[DllImport(gdi32)]
|
|
private static extern int EnumFontFamiliesExA(
|
|
IntPtr hdc,
|
|
in LogFontA font,
|
|
[MarshalAs(UnmanagedType.FunctionPtr)] EnumFontFamiliesExProc proc,
|
|
IntPtr lparam,
|
|
int flags /* Should be zero. */);
|
|
|
|
[DllImport(user32)]
|
|
private static extern IntPtr /* HWND */ GetDesktopWindow();
|
|
|
|
[DllImport(user32)]
|
|
private static extern IntPtr /* HDC */ GetDC(IntPtr hwnd);
|
|
|
|
private delegate int EnumFontFamiliesExProc(in LogFontA font, in TextMetricA metric, int fontType, IntPtr lParam);
|
|
|
|
private struct LogFontA
|
|
{
|
|
public long Height;
|
|
public long Width;
|
|
public long Escapement;
|
|
public long Orientation;
|
|
public FontWeight Weight;
|
|
[MarshalAs(UnmanagedType.U1)]
|
|
public bool Italic;
|
|
[MarshalAs(UnmanagedType.U1)]
|
|
public bool Underline;
|
|
[MarshalAs(UnmanagedType.U1)]
|
|
public bool StrikeOut;
|
|
public byte CharSet;
|
|
public byte OutPrecision;
|
|
public byte ClipPrecision;
|
|
public byte PitchAndFamily;
|
|
private unsafe fixed byte aFaceName[32];
|
|
public unsafe string FaceName
|
|
{
|
|
get
|
|
{
|
|
fixed (byte* str = aFaceName)
|
|
{
|
|
int len = 0;
|
|
for (; str[len] != 0 && len < 32; len++) ;
|
|
return Encoding.UTF8.GetString(str, len);
|
|
}
|
|
}
|
|
|
|
set
|
|
{
|
|
fixed (byte *str = aFaceName)
|
|
{
|
|
Span<byte> span = new Span<byte>(str, 32);
|
|
Encoding.UTF8.GetBytes(value, span);
|
|
span[31] = 0;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
private struct TextMetricA
|
|
{
|
|
public long Height;
|
|
public long Ascent;
|
|
public long Descent;
|
|
public long InternalLeading;
|
|
public long ExternalLeading;
|
|
public long AveCharWidth;
|
|
public long MaxCharWidth;
|
|
public long Weight;
|
|
public long Overhang;
|
|
public long DigitizedAspectX;
|
|
public long DigitizedAspectY;
|
|
public byte FirstChar;
|
|
public byte LastChar;
|
|
public byte DefaultChar;
|
|
public byte BreakChar;
|
|
public byte Italic;
|
|
public byte Underlined;
|
|
public byte StruckOut;
|
|
public byte PitchAndFamily;
|
|
public byte CharSet;
|
|
}
|
|
|
|
private enum FontWeight : long
|
|
{
|
|
DontCare = 0,
|
|
Thin = 100,
|
|
ExtraLight = 200,
|
|
UltraLight = 200,
|
|
Light = 300,
|
|
Normal = 400,
|
|
Regular = 400,
|
|
Medium = 500,
|
|
Semibold = 600,
|
|
Demibold = 600,
|
|
Bold = 700,
|
|
Extrabold = 800,
|
|
Ultrabold = 800,
|
|
Heavy = 900,
|
|
Black = 900
|
|
}
|
|
}
|
|
|
|
|
|
}
|
|
#endif
|