/// <summary> /// Adds the specified font data to the global PrivateFontCollection. /// Family name and style are automatically retrieved from the font. /// </summary> public static void Add(byte[] font) { IntPtr unmanagedPointer = Marshal.AllocCoTaskMem(font.Length); Marshal.Copy(font, 0, unmanagedPointer, font.Length); Singleton.GetPrivateFontCollection().AddMemoryFont(unmanagedPointer, font.Length); // Do not free the memory here, AddMemoryFont stores a pointer, not a copy! //Marshal.FreeCoTaskMem(ip); XFontSource fontSource = XFontSource.GetOrCreateFrom(font); string familyName = fontSource.FontName; if (familyName.EndsWith(" Regular", StringComparison.OrdinalIgnoreCase)) { familyName = familyName.Substring(0, familyName.Length - 8); } bool bold = fontSource.Fontface.os2.IsBold; bool italic = fontSource.Fontface.os2.IsItalic; IncompetentlyMakeAHackToFixAProblemYouWoldNeverHaveIfYouUseAFontResolver(fontSource, ref familyName, ref bold, ref italic); string key = MakeKey(familyName, bold, italic); Singleton._fontSources.Add(key, fontSource); string typefaceKey = XGlyphTypeface.ComputeKey(familyName, bold, italic); FontFactory.CacheExistingFontSourceWithNewTypefaceKey(typefaceKey, fontSource); }
static XFontSource GetOrCreateFrom(string typefaceKey, byte[] fontBytes) { var key = FontHelper.CalcChecksum(fontBytes); if (FontFactory.TryGetFontSourceByKey(key, out XFontSource fontSource)) { // The font source already exists, but is not yet cached under the specified typeface key. FontFactory.CacheExistingFontSourceWithNewTypefaceKey(typefaceKey, fontSource); } else { // No font source exists. Create new one and cache it. fontSource = new XFontSource(fontBytes, key); FontFactory.CacheNewFontSource(typefaceKey, fontSource); } return(fontSource); }