/// <summary> /// Computes the bijective key for a typeface. /// </summary> internal static string ComputeKey(string familyName, FontResolvingOptions fontResolvingOptions) { // Compute a human readable key. string simulationSuffix = ""; if (fontResolvingOptions.OverrideStyleSimulations) { switch (fontResolvingOptions.StyleSimulations) { case XStyleSimulations.BoldSimulation: simulationSuffix = "|b+/i-"; break; case XStyleSimulations.ItalicSimulation: simulationSuffix = "|b-/i+"; break; case XStyleSimulations.BoldItalicSimulation: simulationSuffix = "|b+/i+"; break; case XStyleSimulations.None: break; default: throw new ArgumentOutOfRangeException(); } } string key = KeyPrefix + familyName.ToLowerInvariant() + (fontResolvingOptions.IsItalic ? "/i" : "/n") // normal / oblique / italic + (fontResolvingOptions.IsBold ? "/700" : "/400") + "/5" // Stretch.Normal + simulationSuffix; return(key); }
//// Methods //public Font(Font prototype, FontStyle newStyle); //public Font(FontFamily family, float emSize); //public Font(string familyName, float emSize); //public Font(FontFamily family, float emSize, FontStyle style); //public Font(FontFamily family, float emSize, GraphicsUnit unit); //public Font(string familyName, float emSize, FontStyle style); //public Font(string familyName, float emSize, GraphicsUnit unit); //public Font(FontFamily family, float emSize, FontStyle style, GraphicsUnit unit); //public Font(string familyName, float emSize, FontStyle style, GraphicsUnit unit); ////public Font(FontFamily family, float emSize, FontStyle style, GraphicsUnit unit, byte gdiCharSet); ////public Font(string familyName, float emSize, FontStyle style, GraphicsUnit unit, byte gdiCharSet); ////public Font(FontFamily family, float emSize, FontStyle style, GraphicsUnit unit, byte gdiCharSet, bool gdiVerticalFont); ////public Font(string familyName, float emSize, FontStyle style, GraphicsUnit unit, byte gdiCharSet, bool gdiVerticalFont); //public object Clone(); //private static FontFamily CreateFontFamilyWithFallback(string familyName); //private void Dispose(bool disposing); //public override bool Equals(object obj); //protected override void Finalize(); //public static Font FromHdc(IntPtr hdc); //public static Font FromHfont(IntPtr hfont); //public static Font FromLogFont(object lf); //public static Font FromLogFont(object lf, IntPtr hdc); //public override int GetHashCode(); /// <summary> /// Initializes this instance by computing the glyph typeface, font family, font source and TrueType fontface. /// (PDFsharp currently only deals with TrueType fonts.) /// </summary> void Initialize() { #if DEBUG if (_familyName == "Segoe UI Semilight" && (_style & XFontStyle.BoldItalic) == XFontStyle.Italic) { GetType(); } #endif FontResolvingOptions fontResolvingOptions = OverrideStyleSimulations ? new FontResolvingOptions(_style, StyleSimulations) : new FontResolvingOptions(_style); // HACK: 'PlatformDefault' is used in unit test code. if (StringComparer.OrdinalIgnoreCase.Compare(_familyName, GlobalFontSettings.DefaultFontName) == 0) { _familyName = "Calibri"; } // In principle an XFont is an XGlyphTypeface plus an em-size. _glyphTypeface = XGlyphTypeface.GetOrCreateFrom(_familyName, fontResolvingOptions); // Create font by using font family. XFontSource fontSource; // Not needed here. _gdiFont = FontHelper.CreateFont(_familyName, (float)_emSize, (GdiFontStyle)(_style & XFontStyle.BoldItalic), out fontSource); CreateDescriptorAndInitializeFontMetrics(); }
public static XGlyphTypeface GetOrCreateFrom(string familyName, FontResolvingOptions fontResolvingOptions) { // Check cache for requested type face. string typefaceKey = ComputeKey(familyName, fontResolvingOptions); XGlyphTypeface glyphTypeface; try { // Lock around TryGetGlyphTypeface and AddGlyphTypeface. Lock.EnterFontFactory(); if (GlyphTypefaceCache.TryGetGlyphTypeface(typefaceKey, out glyphTypeface)) { // Just return existing one. return(glyphTypeface); } // Resolve typeface by FontFactory. FontResolverInfo fontResolverInfo = FontFactory.ResolveTypeface(familyName, fontResolvingOptions, typefaceKey); if (fontResolverInfo == null) { // No fallback - just stop. throw new InvalidOperationException("No appropriate font found."); } GdiFont gdiFont = null; // Now create the font family at the first. XFontFamily fontFamily; PlatformFontResolverInfo platformFontResolverInfo = fontResolverInfo as PlatformFontResolverInfo; if (platformFontResolverInfo != null) { // Case: fontResolverInfo was created by platform font resolver // and contains platform specific objects that are reused. // Reuse GDI+ font from platform font resolver. gdiFont = platformFontResolverInfo.GdiFont; fontFamily = XFontFamily.GetOrCreateFromGdi(gdiFont); } else { // Case: fontResolverInfo was created by custom font resolver. // Get or create font family for custom font resolver retrieved font source. fontFamily = XFontFamily.GetOrCreateFontFamily(familyName); } // We have a valid font resolver info. That means we also have an XFontSource object loaded in the cache. XFontSource fontSource = FontFactory.GetFontSourceByFontName(fontResolverInfo.FaceName); Debug.Assert(fontSource != null); // Each font source already contains its OpenTypeFontface. glyphTypeface = new XGlyphTypeface(typefaceKey, fontFamily, fontSource, fontResolverInfo.StyleSimulations, gdiFont); GlyphTypefaceCache.AddGlyphTypeface(glyphTypeface); } finally { Lock.ExitFontFactory(); } return(glyphTypeface); }
//// Methods //public Font(Font prototype, FontStyle newStyle); //public Font(FontFamily family, float emSize); //public Font(string familyName, float emSize); //public Font(FontFamily family, float emSize, FontStyle style); //public Font(FontFamily family, float emSize, GraphicsUnit unit); //public Font(string familyName, float emSize, FontStyle style); //public Font(string familyName, float emSize, GraphicsUnit unit); //public Font(FontFamily family, float emSize, FontStyle style, GraphicsUnit unit); //public Font(string familyName, float emSize, FontStyle style, GraphicsUnit unit); ////public Font(FontFamily family, float emSize, FontStyle style, GraphicsUnit unit, byte gdiCharSet); ////public Font(string familyName, float emSize, FontStyle style, GraphicsUnit unit, byte gdiCharSet); ////public Font(FontFamily family, float emSize, FontStyle style, GraphicsUnit unit, byte gdiCharSet, bool gdiVerticalFont); ////public Font(string familyName, float emSize, FontStyle style, GraphicsUnit unit, byte gdiCharSet, bool gdiVerticalFont); //public object Clone(); //private static FontFamily CreateFontFamilyWithFallback(string familyName); //private void Dispose(bool disposing); //public override bool Equals(object obj); //protected override void Finalize(); //public static Font FromHdc(IntPtr hdc); //public static Font FromHfont(IntPtr hfont); //public static Font FromLogFont(object lf); //public static Font FromLogFont(object lf, IntPtr hdc); //public override int GetHashCode(); /// <summary> /// Initializes this instance by computing the glyph typeface, font family, font source and TrueType fontface. /// (PDFsharp currently only deals with TrueType fonts.) /// </summary> void Initialize() { FontResolvingOptions fontResolvingOptions = OverrideStyleSimulations ? new FontResolvingOptions(_style, StyleSimulations) : new FontResolvingOptions(_style); _glyphTypeface = XGlyphTypeface.GetOrCreateFrom(_familyName, fontResolvingOptions); CreateDescriptorAndInitializeFontMetrics(); }
public static XGlyphTypeface GetOrCreateFrom(string familyName, FontResolvingOptions fontResolvingOptions) { // Check cache for requested type face. string typefaceKey = ComputeKey(familyName, fontResolvingOptions); XGlyphTypeface glyphTypeface; if (GlyphTypefaceCache.TryGetGlyphTypeface(typefaceKey, out glyphTypeface)) { // Just return existing one. return(glyphTypeface); } // Resolve typeface by FontFactory. FontResolverInfo fontResolverInfo = FontFactory.ResolveTypeface(familyName, fontResolvingOptions, typefaceKey); if (fontResolverInfo == null) { // No fallback - just stop. throw new InvalidOperationException("No appropriate font found."); } // Now create the font family at the first. XFontFamily fontFamily; PlatformFontResolverInfo platformFontResolverInfo = fontResolverInfo as PlatformFontResolverInfo; if (platformFontResolverInfo != null) { } else { // Create new and exclusively used font family for custom font resolver retrieved font source. fontFamily = XFontFamily.CreateSolitary(fontResolverInfo.FaceName); } // We have a valid font resolver info. That means we also have an XFontSource object loaded in the cache. ////XFontSource fontSource = FontFactory.GetFontSourceByTypefaceKey(fontResolverInfo.FaceName); XFontSource fontSource = FontFactory.GetFontSourceByFontName(fontResolverInfo.FaceName); Debug.Assert(fontSource != null); // Each font source already contains its OpenTypeFontface. glyphTypeface = new XGlyphTypeface(typefaceKey, fontSource); GlyphTypefaceCache.AddGlyphTypeface(glyphTypeface); return(glyphTypeface); }
/// <summary> /// Initializes this instance by computing the glyph typeface, font family, font source and TrueType fontface. /// (PDFsharp currently only deals with TrueType fonts.) /// </summary> void Initialize() { #if DEBUG if (_familyName == "Segoe UI Semilight" && (_style & XFontStyle.BoldItalic) == XFontStyle.Italic) { GetType(); } #endif FontResolvingOptions fontResolvingOptions = OverrideStyleSimulations ? new FontResolvingOptions(_style, StyleSimulations) : new FontResolvingOptions(_style); // HACK: 'PlatformDefault' is used in unit test code. if (StringComparer.OrdinalIgnoreCase.Compare(_familyName, GlobalFontSettings.DefaultFontName) == 0) { } // In principle an XFont is an XGlyphTypeface plus an em-size. _glyphTypeface = XGlyphTypeface.GetOrCreateFrom(_familyName, fontResolvingOptions); CreateDescriptorAndInitializeFontMetrics(); }
//// Methods //public Font(Font prototype, FontStyle newStyle); //public Font(FontFamily family, float emSize); //public Font(string familyName, float emSize); //public Font(FontFamily family, float emSize, FontStyle style); //public Font(FontFamily family, float emSize, GraphicsUnit unit); //public Font(string familyName, float emSize, FontStyle style); //public Font(string familyName, float emSize, GraphicsUnit unit); //public Font(FontFamily family, float emSize, FontStyle style, GraphicsUnit unit); //public Font(string familyName, float emSize, FontStyle style, GraphicsUnit unit); ////public Font(FontFamily family, float emSize, FontStyle style, GraphicsUnit unit, byte gdiCharSet); ////public Font(string familyName, float emSize, FontStyle style, GraphicsUnit unit, byte gdiCharSet); ////public Font(FontFamily family, float emSize, FontStyle style, GraphicsUnit unit, byte gdiCharSet, bool gdiVerticalFont); ////public Font(string familyName, float emSize, FontStyle style, GraphicsUnit unit, byte gdiCharSet, bool gdiVerticalFont); //public object Clone(); //private static FontFamily CreateFontFamilyWithFallback(string familyName); //private void Dispose(bool disposing); //public override bool Equals(object obj); //protected override void Finalize(); //public static Font FromHdc(IntPtr hdc); //public static Font FromHfont(IntPtr hfont); //public static Font FromLogFont(object lf); //public static Font FromLogFont(object lf, IntPtr hdc); //public override int GetHashCode(); /// <summary> /// Initializes this instance by computing the glyph typeface, font family, font source and TrueType fontface. /// (PDFsharp currently only deals with TrueType fonts.) /// </summary> void Initialize() { #if DEBUG if (_familyName == "Segoe UI Semilight" && (_style & XFontStyle.BoldItalic) == XFontStyle.Italic) { GetType(); } #endif FontResolvingOptions fontResolvingOptions = OverrideStyleSimulations ? new FontResolvingOptions(_style, StyleSimulations) : new FontResolvingOptions(_style); // HACK: 'PlatformDefault' is used in unit test code. if (StringComparer.OrdinalIgnoreCase.Compare(_familyName, GlobalFontSettings.DefaultFontName) == 0) { #if CORE || GDI || WPF _familyName = "Calibri"; #endif } // In principle an XFont is an XGlyphTypeface plus an em-size. _glyphTypeface = XGlyphTypeface.GetOrCreateFrom(_familyName, fontResolvingOptions); #if GDI // TODO: In CORE build it is not necessary to create a GDI font at all // Create font by using font family. XFontSource fontSource; // Not needed here. _gdiFont = FontHelper.CreateFont(_familyName, (float)_emSize, (GdiFontStyle)(_style & XFontStyle.BoldItalic), out fontSource); #endif #if WPF && !SILVERLIGHT // Pure WPF _wpfFontFamily = _glyphTypeface.FontFamily.WpfFamily; _wpfTypeface = _glyphTypeface.WpfTypeface; if (_wpfFontFamily == null) { _wpfFontFamily = new WpfFontFamily(Name); } if (_wpfTypeface == null) { _wpfTypeface = FontHelper.CreateTypeface(WpfFontFamily, _style); } #endif #if WPF && SILVERLIGHT_ // Pure Silverlight 5 if (GlyphTypeface == null) { //Debug.Assert(Typeface == null); // #P F C //GlyphTypeface = XPrivateFontCollection.TryGetXGlyphTypeface(Name, _style); //if (GlyphTypeface == null) //{ // // HACK: Just make it work... // GlyphTypeface = GlobalFontSettings.TryGetXGlyphTypeface(Name, _style, out Data); //} #if DEBUG if (GlyphTypeface == null) { throw new Exception("No font: " + Name); } #endif _wpfFamily = GlyphTypeface.FontFamily; } //if (Family == null) // Family = new System.Windows.Media.FontFamily(Name); //if (Typeface == null) // Typeface = FontHelper.CreateTypeface(Family, _style); #endif CreateDescriptorAndInitializeFontMetrics(); }
public static XGlyphTypeface GetOrCreateFrom(string familyName, FontResolvingOptions fontResolvingOptions) { // Check cache for requested type face. string typefaceKey = ComputeKey(familyName, fontResolvingOptions); XGlyphTypeface glyphTypeface; if (GlyphTypefaceCache.TryGetGlyphTypeface(typefaceKey, out glyphTypeface)) { // Just return existing one. return(glyphTypeface); } // Resolve typeface by FontFactory. FontResolverInfo fontResolverInfo = FontFactory.ResolveTypeface(familyName, fontResolvingOptions, typefaceKey); if (fontResolverInfo == null) { // No fallback - just stop. throw new InvalidOperationException("No appropriate font found."); } #if CORE || GDI GdiFont gdiFont = null; #endif #if WPF WpfFontFamily wpfFontFamily = null; WpfTypeface wpfTypeface = null; WpfGlyphTypeface wpfGlyphTypeface = null; #endif #if UWP // Nothing to do. #endif // Now create the font family at the first. XFontFamily fontFamily; PlatformFontResolverInfo platformFontResolverInfo = fontResolverInfo as PlatformFontResolverInfo; if (platformFontResolverInfo != null) { #if CORE || GDI // $TODO THHO Lock??? // Reuse GDI+ font from platform font resolver. gdiFont = platformFontResolverInfo.GdiFont; fontFamily = XFontFamily.GetOrCreateFromGdi(gdiFont); #endif #if WPF #if !SILVERLIGHT // Reuse WPF font family created from platform font resolver. wpfFontFamily = platformFontResolverInfo.WpfFontFamily; wpfTypeface = platformFontResolverInfo.WpfTypeface; wpfGlyphTypeface = platformFontResolverInfo.WpfGlyphTypeface; fontFamily = XFontFamily.GetOrCreateFromWpf(wpfFontFamily); #else fontFamily = XFontFamily.GetOrCreateFromWpf(new WpfFontFamily(familyName)); #endif #endif #if NETFX_CORE || UWP fontFamily = null; #endif } else { // Create new and exclusively used font family for custom font resolver retrieved font source. fontFamily = XFontFamily.CreateSolitary(fontResolverInfo.FaceName); } // We have a valid font resolver info. That means we also have an XFontSource object loaded in the cache. ////XFontSource fontSource = FontFactory.GetFontSourceByTypefaceKey(fontResolverInfo.FaceName); XFontSource fontSource = FontFactory.GetFontSourceByFontName(fontResolverInfo.FaceName); Debug.Assert(fontSource != null); // Each font source already contains its OpenTypeFontface. #if CORE || GDI glyphTypeface = new XGlyphTypeface(typefaceKey, fontFamily, fontSource, fontResolverInfo.StyleSimulations, gdiFont); #endif #if WPF glyphTypeface = new XGlyphTypeface(typefaceKey, fontFamily, fontSource, fontResolverInfo.StyleSimulations, wpfTypeface, wpfGlyphTypeface); #endif #if NETFX_CORE || UWP glyphTypeface = new XGlyphTypeface(typefaceKey, fontFamily, fontSource, fontResolverInfo.StyleSimulations); #endif #if __IOS__ glyphTypeface = new XGlyphTypeface(typefaceKey, fontSource); #endif glyphTypeface = new XGlyphTypeface(typefaceKey, fontSource); GlyphTypefaceCache.AddGlyphTypeface(glyphTypeface); return(glyphTypeface); }
public static XGlyphTypeface GetOrCreateFrom(string familyName, FontResolvingOptions fontResolvingOptions) { // Check cache for requested type face. string typefaceKey = ComputeKey(familyName, fontResolvingOptions); XGlyphTypeface glyphTypeface; try { // Lock around TryGetGlyphTypeface and AddGlyphTypeface. Lock.EnterFontFactory(); if (GlyphTypefaceCache.TryGetGlyphTypeface(typefaceKey, out glyphTypeface)) { // Just return existing one. return(glyphTypeface); } // Resolve typeface by FontFactory. FontResolverInfo fontResolverInfo = FontFactory.ResolveTypeface(familyName, fontResolvingOptions, typefaceKey); if (fontResolverInfo == null) { // No fallback - just stop. throw new InvalidOperationException("No appropriate font found."); } #if CORE && !WITHOUT_DRAWING || GDI GdiFont gdiFont = null; #endif #if WPF WpfFontFamily wpfFontFamily = null; WpfTypeface wpfTypeface = null; WpfGlyphTypeface wpfGlyphTypeface = null; #endif #if UWP // Nothing to do. #endif // Now create the font family at the first. XFontFamily fontFamily; #if !WITHOUT_DRAWING PlatformFontResolverInfo platformFontResolverInfo = fontResolverInfo as PlatformFontResolverInfo; if (platformFontResolverInfo != null) { // Case: fontResolverInfo was created by platform font resolver // and contains platform specific objects that are reused. #if CORE || GDI // Reuse GDI+ font from platform font resolver. gdiFont = platformFontResolverInfo.GdiFont; fontFamily = XFontFamily.GetOrCreateFromGdi(gdiFont); #endif #if WPF #if !SILVERLIGHT // Reuse WPF font family created from platform font resolver. wpfFontFamily = platformFontResolverInfo.WpfFontFamily; wpfTypeface = platformFontResolverInfo.WpfTypeface; wpfGlyphTypeface = platformFontResolverInfo.WpfGlyphTypeface; fontFamily = XFontFamily.GetOrCreateFromWpf(wpfFontFamily); #else fontFamily = XFontFamily.GetOrCreateFromWpf(new WpfFontFamily(familyName)); #endif #endif #if NETFX_CORE || UWP fontFamily = null; #endif } else #endif { // Case: fontResolverInfo was created by custom font resolver. // Get or create font family for custom font resolver retrieved font source. fontFamily = XFontFamily.GetOrCreateFontFamily(familyName); } // We have a valid font resolver info. That means we also have an XFontSource object loaded in the cache. XFontSource fontSource = FontFactory.GetFontSourceByFontName(fontResolverInfo.FaceName); Debug.Assert(fontSource != null); // Each font source already contains its OpenTypeFontface. #if CORE || GDI glyphTypeface = new XGlyphTypeface(typefaceKey, fontFamily, fontSource, fontResolverInfo.StyleSimulations #if !WITHOUT_DRAWING , gdiFont #endif ); #endif #if WPF glyphTypeface = new XGlyphTypeface(typefaceKey, fontFamily, fontSource, fontResolverInfo.StyleSimulations, wpfTypeface, wpfGlyphTypeface); #endif #if NETFX_CORE || UWP glyphTypeface = new XGlyphTypeface(typefaceKey, fontFamily, fontSource, fontResolverInfo.StyleSimulations); #endif GlyphTypefaceCache.AddGlyphTypeface(glyphTypeface); } finally { Lock.ExitFontFactory(); } return(glyphTypeface); }