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 span = new Span(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