Test
This commit is contained in:
4325
PrintPDF/PdfSharp/Fonts/AdobeGlyphList20.cs
Normal file
4325
PrintPDF/PdfSharp/Fonts/AdobeGlyphList20.cs
Normal file
File diff suppressed because it is too large
Load Diff
4223
PrintPDF/PdfSharp/Fonts/AdobeGlyphListForNewFonts.cs
Normal file
4223
PrintPDF/PdfSharp/Fonts/AdobeGlyphListForNewFonts.cs
Normal file
File diff suppressed because it is too large
Load Diff
141
PrintPDF/PdfSharp/Fonts/CMapInfo.cs
Normal file
141
PrintPDF/PdfSharp/Fonts/CMapInfo.cs
Normal file
@@ -0,0 +1,141 @@
|
||||
#region PDFsharp - A .NET library for processing PDF
|
||||
//
|
||||
// Authors:
|
||||
// Stefan Lange
|
||||
//
|
||||
// Copyright (c) 2005-2017 empira Software GmbH, Cologne Area (Germany)
|
||||
//
|
||||
// http://www.pdfsharp.com
|
||||
// http://sourceforge.net/projects/pdfsharp
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the "Software"),
|
||||
// to deal in the Software without restriction, including without limitation
|
||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
// and/or sell copies of the Software, and to permit persons to whom the
|
||||
// Software is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Collections.Generic;
|
||||
using PdfSharp.Fonts.OpenType;
|
||||
using PdfSharp.Pdf.Internal;
|
||||
|
||||
namespace PdfSharp.Fonts
|
||||
{
|
||||
/// <summary>
|
||||
/// Helper class that determines the characters used in a particular font.
|
||||
/// </summary>
|
||||
internal class CMapInfo
|
||||
{
|
||||
public CMapInfo(OpenTypeDescriptor descriptor)
|
||||
{
|
||||
Debug.Assert(descriptor != null);
|
||||
_descriptor = descriptor;
|
||||
}
|
||||
internal OpenTypeDescriptor _descriptor;
|
||||
|
||||
/// <summary>
|
||||
/// Adds the characters of the specified string to the hashtable.
|
||||
/// </summary>
|
||||
public void AddChars(string text)
|
||||
{
|
||||
if (text != null)
|
||||
{
|
||||
bool symbol = _descriptor.FontFace.cmap.symbol;
|
||||
int length = text.Length;
|
||||
for (int idx = 0; idx < length; idx++)
|
||||
{
|
||||
char ch = text[idx];
|
||||
if (!CharacterToGlyphIndex.ContainsKey(ch))
|
||||
{
|
||||
char ch2 = ch;
|
||||
if (symbol)
|
||||
{
|
||||
// Remap ch for symbol fonts.
|
||||
ch2 = (char)(ch | (_descriptor.FontFace.os2.usFirstCharIndex & 0xFF00)); // @@@ refactor
|
||||
}
|
||||
int glyphIndex = _descriptor.CharCodeToGlyphIndex(ch2);
|
||||
CharacterToGlyphIndex.Add(ch, glyphIndex);
|
||||
GlyphIndices[glyphIndex] = null;
|
||||
MinChar = (char)Math.Min(MinChar, ch);
|
||||
MaxChar = (char)Math.Max(MaxChar, ch);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds the glyphIndices to the hashtable.
|
||||
/// </summary>
|
||||
public void AddGlyphIndices(string glyphIndices)
|
||||
{
|
||||
if (glyphIndices != null)
|
||||
{
|
||||
int length = glyphIndices.Length;
|
||||
for (int idx = 0; idx < length; idx++)
|
||||
{
|
||||
int glyphIndex = glyphIndices[idx];
|
||||
GlyphIndices[glyphIndex] = null;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Adds a ANSI characters.
|
||||
/// </summary>
|
||||
internal void AddAnsiChars()
|
||||
{
|
||||
byte[] ansi = new byte[256 - 32];
|
||||
for (int idx = 0; idx < 256 - 32; idx++)
|
||||
ansi[idx] = (byte)(idx + 32);
|
||||
#if EDF_CORE
|
||||
string text = null; // PdfEncoders.WinAnsiEncoding.GetString(ansi, 0, ansi.Length);
|
||||
#else
|
||||
string text = PdfEncoders.WinAnsiEncoding.GetString(ansi, 0, ansi.Length);
|
||||
#endif
|
||||
AddChars(text);
|
||||
}
|
||||
|
||||
internal bool Contains(char ch)
|
||||
{
|
||||
return CharacterToGlyphIndex.ContainsKey(ch);
|
||||
}
|
||||
|
||||
public char[] Chars
|
||||
{
|
||||
get
|
||||
{
|
||||
char[] chars = new char[CharacterToGlyphIndex.Count];
|
||||
CharacterToGlyphIndex.Keys.CopyTo(chars, 0);
|
||||
Array.Sort(chars);
|
||||
return chars;
|
||||
}
|
||||
}
|
||||
|
||||
public int[] GetGlyphIndices()
|
||||
{
|
||||
int[] indices = new int[GlyphIndices.Count];
|
||||
GlyphIndices.Keys.CopyTo(indices, 0);
|
||||
Array.Sort(indices);
|
||||
return indices;
|
||||
}
|
||||
|
||||
public char MinChar = char.MaxValue;
|
||||
public char MaxChar = char.MinValue;
|
||||
public Dictionary<char, int> CharacterToGlyphIndex = new Dictionary<char, int>();
|
||||
public Dictionary<int, object> GlyphIndices = new Dictionary<int, object>();
|
||||
}
|
||||
}
|
174
PrintPDF/PdfSharp/Fonts/FontDescriptorCache.cs
Normal file
174
PrintPDF/PdfSharp/Fonts/FontDescriptorCache.cs
Normal file
@@ -0,0 +1,174 @@
|
||||
#region PDFsharp - A .NET library for processing PDF
|
||||
//
|
||||
// Authors:
|
||||
// Stefan Lange
|
||||
//
|
||||
// Copyright (c) 2005-2017 empira Software GmbH, Cologne Area (Germany)
|
||||
//
|
||||
// http://www.pdfsharp.com
|
||||
// http://sourceforge.net/projects/pdfsharp
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the "Software"),
|
||||
// to deal in the Software without restriction, including without limitation
|
||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
// and/or sell copies of the Software, and to permit persons to whom the
|
||||
// Software is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using PdfSharp.Drawing;
|
||||
using PdfSharp.Fonts.OpenType;
|
||||
using PdfSharp.Internal;
|
||||
|
||||
namespace PdfSharp.Fonts
|
||||
{
|
||||
/// <summary>
|
||||
/// Global table of OpenType font descriptor objects.
|
||||
/// </summary>
|
||||
internal sealed class FontDescriptorCache
|
||||
{
|
||||
FontDescriptorCache()
|
||||
{
|
||||
_cache = new Dictionary<string, FontDescriptor>();
|
||||
}
|
||||
|
||||
///// <summary>
|
||||
///// Gets the FontDescriptor identified by the specified FontSelector. If no such object
|
||||
///// exists, a new FontDescriptor is created and added to the stock.
|
||||
///// </summary>
|
||||
//public static FontDescriptor GetOrCreateDescriptor_DEL-ETE(string familyName, XFontStyle stlye, OpenTypeFontface fontface)
|
||||
//{
|
||||
// //FontSelector1 selector = new FontSelector1(familyName, stlye);
|
||||
// string fontDescriptorKey = null; // FontDescriptor.ComputeKey(familyName, stlye);
|
||||
// try
|
||||
// {
|
||||
// Lock.EnterFontFactory();
|
||||
// FontDescriptor descriptor;
|
||||
// if (!Singleton._cache.TryGetValue(fontDescriptorKey, out descriptor))
|
||||
// {
|
||||
// descriptor = new OpenTypeDescriptor(fontDescriptorKey, familyName, stlye, fontface, null);
|
||||
// Singleton._cache.Add(fontDescriptorKey, descriptor);
|
||||
// }
|
||||
// return descriptor;
|
||||
// }
|
||||
// finally { Lock.ExitFontFactory(); }
|
||||
//}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the FontDescriptor identified by the specified XFont. If no such object
|
||||
/// exists, a new FontDescriptor is created and added to the cache.
|
||||
/// </summary>
|
||||
public static FontDescriptor GetOrCreateDescriptorFor(XFont font)
|
||||
{
|
||||
if (font == null)
|
||||
throw new ArgumentNullException("font");
|
||||
|
||||
//FontSelector1 selector = new FontSelector1(font);
|
||||
string fontDescriptorKey = FontDescriptor.ComputeKey(font);
|
||||
try
|
||||
{
|
||||
Lock.EnterFontFactory();
|
||||
FontDescriptor descriptor;
|
||||
if (!Singleton._cache.TryGetValue(fontDescriptorKey, out descriptor))
|
||||
{
|
||||
descriptor = new OpenTypeDescriptor(fontDescriptorKey, font);
|
||||
Singleton._cache.Add(fontDescriptorKey, descriptor);
|
||||
}
|
||||
return descriptor;
|
||||
}
|
||||
finally { Lock.ExitFontFactory(); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the FontDescriptor identified by the specified FontSelector. If no such object
|
||||
/// exists, a new FontDescriptor is created and added to the stock.
|
||||
/// </summary>
|
||||
public static FontDescriptor GetOrCreateDescriptor(string fontFamilyName, XFontStyle style)
|
||||
{
|
||||
if (string.IsNullOrEmpty(fontFamilyName))
|
||||
throw new ArgumentNullException("fontFamilyName");
|
||||
|
||||
//FontSelector1 selector = new FontSelector1(fontFamilyName, style);
|
||||
string fontDescriptorKey = FontDescriptor.ComputeKey(fontFamilyName, style);
|
||||
try
|
||||
{
|
||||
Lock.EnterFontFactory();
|
||||
FontDescriptor descriptor;
|
||||
if (!Singleton._cache.TryGetValue(fontDescriptorKey, out descriptor))
|
||||
{
|
||||
XFont font = new XFont(fontFamilyName, 10, style);
|
||||
descriptor = GetOrCreateDescriptorFor(font);
|
||||
if (Singleton._cache.ContainsKey(fontDescriptorKey))
|
||||
Singleton.GetType();
|
||||
else
|
||||
Singleton._cache.Add(fontDescriptorKey, descriptor);
|
||||
}
|
||||
return descriptor;
|
||||
}
|
||||
finally { Lock.ExitFontFactory(); }
|
||||
}
|
||||
|
||||
public static FontDescriptor GetOrCreateDescriptor(string idName, byte[] fontData)
|
||||
{
|
||||
//FontSelector1 selector = new FontSelector1(idName);
|
||||
string fontDescriptorKey = FontDescriptor.ComputeKey(idName);
|
||||
try
|
||||
{
|
||||
Lock.EnterFontFactory();
|
||||
FontDescriptor descriptor;
|
||||
if (!Singleton._cache.TryGetValue(fontDescriptorKey, out descriptor))
|
||||
{
|
||||
descriptor = GetOrCreateOpenTypeDescriptor(fontDescriptorKey, idName, fontData);
|
||||
Singleton._cache.Add(fontDescriptorKey, descriptor);
|
||||
}
|
||||
return descriptor;
|
||||
}
|
||||
finally { Lock.ExitFontFactory(); }
|
||||
}
|
||||
|
||||
static OpenTypeDescriptor GetOrCreateOpenTypeDescriptor(string fontDescriptorKey, string idName, byte[] fontData)
|
||||
{
|
||||
return new OpenTypeDescriptor(fontDescriptorKey, idName, fontData);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the singleton.
|
||||
/// </summary>
|
||||
static FontDescriptorCache Singleton
|
||||
{
|
||||
get
|
||||
{
|
||||
if (_singleton == null)
|
||||
{
|
||||
try
|
||||
{
|
||||
Lock.EnterFontFactory();
|
||||
if (_singleton == null)
|
||||
_singleton = new FontDescriptorCache();
|
||||
}
|
||||
finally { Lock.ExitFontFactory(); }
|
||||
}
|
||||
return _singleton;
|
||||
}
|
||||
}
|
||||
static volatile FontDescriptorCache _singleton;
|
||||
|
||||
/// <summary>
|
||||
/// Maps font font descriptor key to font descriptor.
|
||||
/// </summary>
|
||||
readonly Dictionary<string, FontDescriptor> _cache;
|
||||
}
|
||||
}
|
450
PrintPDF/PdfSharp/Fonts/FontFactory.cs
Normal file
450
PrintPDF/PdfSharp/Fonts/FontFactory.cs
Normal file
@@ -0,0 +1,450 @@
|
||||
#region PDFsharp - A .NET library for processing PDF
|
||||
//
|
||||
// Authors:
|
||||
// Stefan Lange
|
||||
//
|
||||
// Copyright (c) 2005-2017 empira Software GmbH, Cologne Area (Germany)
|
||||
//
|
||||
// http://www.pdfsharp.com
|
||||
// http://sourceforge.net/projects/pdfsharp
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the "Software"),
|
||||
// to deal in the Software without restriction, including without limitation
|
||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
// and/or sell copies of the Software, and to permit persons to whom the
|
||||
// Software is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
#if CORE || GDI
|
||||
using System.Drawing;
|
||||
using GdiFontFamily = System.Drawing.FontFamily;
|
||||
using GdiFont = System.Drawing.Font;
|
||||
#endif
|
||||
#if WPF
|
||||
using System.Windows;
|
||||
using System.Windows.Media;
|
||||
using System.Windows.Resources;
|
||||
using WpfFontFamily = System.Windows.Media.FontFamily;
|
||||
using WpfGlyphTypeface = System.Windows.Media.GlyphTypeface;
|
||||
using WpfTypeface = System.Windows.Media.Typeface;
|
||||
#endif
|
||||
using PdfSharp.Drawing;
|
||||
using PdfSharp.Fonts.OpenType;
|
||||
using PdfSharp.Internal;
|
||||
|
||||
#pragma warning disable 1591
|
||||
// ReSharper disable RedundantNameQualifier
|
||||
|
||||
namespace PdfSharp.Fonts
|
||||
{
|
||||
/// <summary>
|
||||
/// Provides functionality to map a fontface request to a physical font.
|
||||
/// </summary>
|
||||
internal static class FontFactory
|
||||
{
|
||||
//// Suffix for internal face names to indicate that the font data comes from the platform
|
||||
//// and not from the users font resolver.
|
||||
//public const string PlatformTag = "platform:";
|
||||
|
||||
/// <summary>
|
||||
/// Converts specified information about a required typeface into a specific font.
|
||||
/// </summary>
|
||||
/// <param name="familyName">Name of the font family.</param>
|
||||
/// <param name="fontResolvingOptions">The font resolving options.</param>
|
||||
/// <param name="typefaceKey">Typeface key if already known by caller, null otherwise.</param>
|
||||
/// <returns>
|
||||
/// Information about the typeface, or null if no typeface can be found.
|
||||
/// </returns>
|
||||
public static FontResolverInfo ResolveTypeface(string familyName, FontResolvingOptions fontResolvingOptions, string typefaceKey)
|
||||
{
|
||||
if (string.IsNullOrEmpty(typefaceKey))
|
||||
typefaceKey = XGlyphTypeface.ComputeKey(familyName, fontResolvingOptions);
|
||||
|
||||
try
|
||||
{
|
||||
Lock.EnterFontFactory();
|
||||
// Was this typeface requested before?
|
||||
FontResolverInfo fontResolverInfo;
|
||||
if (FontResolverInfosByName.TryGetValue(typefaceKey, out fontResolverInfo))
|
||||
return fontResolverInfo;
|
||||
|
||||
// Case: This typeface was not yet resolved before.
|
||||
|
||||
// Is there a custom font resolver available?
|
||||
IFontResolver customFontResolver = GlobalFontSettings.FontResolver;
|
||||
if (customFontResolver != null)
|
||||
{
|
||||
// Case: Use custom font resolver.
|
||||
fontResolverInfo = customFontResolver.ResolveTypeface(familyName, fontResolvingOptions.IsBold, fontResolvingOptions.IsItalic);
|
||||
|
||||
// If resolved by custom font resolver register info and font source.
|
||||
if (fontResolverInfo != null && !(fontResolverInfo is PlatformFontResolverInfo))
|
||||
{
|
||||
// OverrideStyleSimulations is true only for internal quality tests.
|
||||
if (fontResolvingOptions.OverrideStyleSimulations)
|
||||
{
|
||||
// Override style simulation returned by custom font resolver.
|
||||
fontResolverInfo = new FontResolverInfo(fontResolverInfo.FaceName, fontResolvingOptions.MustSimulateBold, fontResolvingOptions.MustSimulateItalic, fontResolverInfo.CollectionNumber);
|
||||
}
|
||||
|
||||
string resolverInfoKey = fontResolverInfo.Key;
|
||||
FontResolverInfo existingFontResolverInfo;
|
||||
if (FontResolverInfosByName.TryGetValue(resolverInfoKey, out existingFontResolverInfo))
|
||||
{
|
||||
// Case: A new typeface was resolved with the same info as a previous one.
|
||||
// Discard new object an reuse previous one.
|
||||
fontResolverInfo = existingFontResolverInfo;
|
||||
// Associate with typeface key.
|
||||
FontResolverInfosByName.Add(typefaceKey, fontResolverInfo);
|
||||
#if DEBUG
|
||||
// The font source should exist.
|
||||
Debug.Assert(FontSourcesByName.ContainsKey(fontResolverInfo.FaceName));
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
// Case: No such font resolver info exists.
|
||||
// Add to both dictionaries.
|
||||
FontResolverInfosByName.Add(typefaceKey, fontResolverInfo);
|
||||
Debug.Assert(resolverInfoKey == fontResolverInfo.Key);
|
||||
FontResolverInfosByName.Add(resolverInfoKey, fontResolverInfo);
|
||||
|
||||
// Create font source if not yet exists.
|
||||
XFontSource previousFontSource;
|
||||
if (FontSourcesByName.TryGetValue(fontResolverInfo.FaceName, out previousFontSource))
|
||||
{
|
||||
// Case: The font source exists, because a previous font resolver info comes
|
||||
// with the same face name, but was different in style simulation flags.
|
||||
// Nothing to do.
|
||||
}
|
||||
else
|
||||
{
|
||||
// Case: Get font from custom font resolver and create font source.
|
||||
byte[] bytes = customFontResolver.GetFont(fontResolverInfo.FaceName);
|
||||
XFontSource fontSource = XFontSource.GetOrCreateFrom(bytes);
|
||||
|
||||
// Add font source's font resolver name if it is different to the face name.
|
||||
if (string.Compare(fontResolverInfo.FaceName, fontSource.FontName, StringComparison.OrdinalIgnoreCase) != 0)
|
||||
FontSourcesByName.Add(fontResolverInfo.FaceName, fontSource);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Case: There was no custom font resolver set.
|
||||
// Use platform font resolver.
|
||||
// If it was successful resolver info and font source are cached
|
||||
// automatically by PlatformFontResolver.ResolveTypeface.
|
||||
fontResolverInfo = PlatformFontResolver.ResolveTypeface(familyName, fontResolvingOptions, typefaceKey);
|
||||
}
|
||||
|
||||
// Return value is null if the typeface could not be resolved.
|
||||
// In this case PDFsharp stops.
|
||||
return fontResolverInfo;
|
||||
}
|
||||
finally { Lock.ExitFontFactory(); }
|
||||
}
|
||||
|
||||
#if GDI
|
||||
/// <summary>
|
||||
/// Registers the font face.
|
||||
/// </summary>
|
||||
public static XFontSource RegisterFontFace(byte[] fontBytes)
|
||||
{
|
||||
try
|
||||
{
|
||||
Lock.EnterFontFactory();
|
||||
ulong key = FontHelper.CalcChecksum(fontBytes);
|
||||
XFontSource fontSource;
|
||||
if (FontSourcesByKey.TryGetValue(key, out fontSource))
|
||||
{
|
||||
throw new InvalidOperationException("Font face already registered.");
|
||||
}
|
||||
fontSource = XFontSource.GetOrCreateFrom(fontBytes);
|
||||
Debug.Assert(FontSourcesByKey.ContainsKey(key));
|
||||
Debug.Assert(fontSource.Fontface != null);
|
||||
|
||||
//fontSource.Fontface = new OpenTypeFontface(fontSource);
|
||||
//FontSourcesByKey.Add(checksum, fontSource);
|
||||
//FontSourcesByFontName.Add(fontSource.FontName, fontSource);
|
||||
|
||||
XGlyphTypeface glyphTypeface = new XGlyphTypeface(fontSource);
|
||||
FontSourcesByName.Add(glyphTypeface.Key, fontSource);
|
||||
GlyphTypefaceCache.AddGlyphTypeface(glyphTypeface);
|
||||
return fontSource;
|
||||
}
|
||||
finally { Lock.ExitFontFactory(); }
|
||||
}
|
||||
#endif
|
||||
|
||||
/// <summary>
|
||||
/// Gets the bytes of a physical font with specified face name.
|
||||
/// </summary>
|
||||
public static XFontSource GetFontSourceByFontName(string fontName)
|
||||
{
|
||||
XFontSource fontSource;
|
||||
if (FontSourcesByName.TryGetValue(fontName, out fontSource))
|
||||
return fontSource;
|
||||
|
||||
Debug.Assert(false, string.Format("An XFontSource with the name '{0}' does not exists.", fontName));
|
||||
return null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the bytes of a physical font with specified face name.
|
||||
/// </summary>
|
||||
public static XFontSource GetFontSourceByTypefaceKey(string typefaceKey)
|
||||
{
|
||||
XFontSource fontSource;
|
||||
if (FontSourcesByName.TryGetValue(typefaceKey, out fontSource))
|
||||
return fontSource;
|
||||
|
||||
Debug.Assert(false, string.Format("An XFontSource with the typeface key '{0}' does not exists.", typefaceKey));
|
||||
return null;
|
||||
}
|
||||
|
||||
public static bool TryGetFontSourceByKey(ulong key, out XFontSource fontSource)
|
||||
{
|
||||
return FontSourcesByKey.TryGetValue(key, out fontSource);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets a value indicating whether at least one font source was created.
|
||||
/// </summary>
|
||||
public static bool HasFontSources
|
||||
{
|
||||
get { return FontSourcesByName.Count > 0; }
|
||||
}
|
||||
|
||||
public static bool TryGetFontResolverInfoByTypefaceKey(string typeFaceKey, out FontResolverInfo info)
|
||||
{
|
||||
return FontResolverInfosByName.TryGetValue(typeFaceKey, out info);
|
||||
}
|
||||
|
||||
public static bool TryGetFontSourceByTypefaceKey(string typefaceKey, out XFontSource source)
|
||||
{
|
||||
return FontSourcesByName.TryGetValue(typefaceKey, out source);
|
||||
}
|
||||
|
||||
//public static bool TryGetFontSourceByFaceName(string faceName, out XFontSource source)
|
||||
//{
|
||||
// return FontSourcesByName.TryGetValue(faceName, out source);
|
||||
//}
|
||||
|
||||
internal static void CacheFontResolverInfo(string typefaceKey, FontResolverInfo fontResolverInfo)
|
||||
{
|
||||
FontResolverInfo existingfFontResolverInfo;
|
||||
// Check whether identical font is already registered.
|
||||
if (FontResolverInfosByName.TryGetValue(typefaceKey, out existingfFontResolverInfo))
|
||||
{
|
||||
// Should never come here.
|
||||
throw new InvalidOperationException(string.Format("A font file with different content already exists with the specified face name '{0}'.", typefaceKey));
|
||||
}
|
||||
if (FontResolverInfosByName.TryGetValue(fontResolverInfo.Key, out existingfFontResolverInfo))
|
||||
{
|
||||
// Should never come here.
|
||||
throw new InvalidOperationException(string.Format("A font resolver already exists with the specified key '{0}'.", fontResolverInfo.Key));
|
||||
}
|
||||
// Add to both dictionaries.
|
||||
FontResolverInfosByName.Add(typefaceKey, fontResolverInfo);
|
||||
FontResolverInfosByName.Add(fontResolverInfo.Key, fontResolverInfo);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Caches a font source under its face name and its key.
|
||||
/// </summary>
|
||||
public static XFontSource CacheFontSource(XFontSource fontSource)
|
||||
{
|
||||
try
|
||||
{
|
||||
Lock.EnterFontFactory();
|
||||
// Check whether an identical font source with a different face name already exists.
|
||||
XFontSource existingFontSource;
|
||||
if (FontSourcesByKey.TryGetValue(fontSource.Key, out existingFontSource))
|
||||
{
|
||||
#if DEBUG
|
||||
// Fonts have same length and check sum. Now check byte by byte identity.
|
||||
int length = fontSource.Bytes.Length;
|
||||
for (int idx = 0; idx < length; idx++)
|
||||
{
|
||||
if (existingFontSource.Bytes[idx] != fontSource.Bytes[idx])
|
||||
{
|
||||
//Debug.Assert(false,"Two fonts with identical checksum found.");
|
||||
break;
|
||||
//goto FontsAreNotIdentical;
|
||||
}
|
||||
}
|
||||
Debug.Assert(existingFontSource.Fontface != null);
|
||||
#endif
|
||||
return existingFontSource;
|
||||
|
||||
//FontsAreNotIdentical:
|
||||
//// Incredible rare case: Two different fonts have the same size and check sum.
|
||||
//// Give the new one a new key until it do not clash with an existing one.
|
||||
//while (FontSourcesByKey.ContainsKey(fontSource.Key))
|
||||
// fontSource.IncrementKey();
|
||||
}
|
||||
|
||||
OpenTypeFontface fontface = fontSource.Fontface;
|
||||
if (fontface == null)
|
||||
{
|
||||
// Create OpenType fontface for this font source.
|
||||
fontSource.Fontface = new OpenTypeFontface(fontSource);
|
||||
}
|
||||
FontSourcesByKey.Add(fontSource.Key, fontSource);
|
||||
FontSourcesByName.Add(fontSource.FontName, fontSource);
|
||||
return fontSource;
|
||||
}
|
||||
finally { Lock.ExitFontFactory(); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Caches a font source under its face name and its key.
|
||||
/// </summary>
|
||||
public static XFontSource CacheNewFontSource(string typefaceKey, XFontSource fontSource)
|
||||
{
|
||||
// Debug.Assert(!FontSourcesByFaceName.ContainsKey(fontSource.FaceName));
|
||||
|
||||
// Check whether an identical font source with a different face name already exists.
|
||||
XFontSource existingFontSource;
|
||||
if (FontSourcesByKey.TryGetValue(fontSource.Key, out existingFontSource))
|
||||
{
|
||||
//// Fonts have same length and check sum. Now check byte by byte identity.
|
||||
//int length = fontSource.Bytes.Length;
|
||||
//for (int idx = 0; idx < length; idx++)
|
||||
//{
|
||||
// if (existingFontSource.Bytes[idx] != fontSource.Bytes[idx])
|
||||
// {
|
||||
// goto FontsAreNotIdentical;
|
||||
// }
|
||||
//}
|
||||
return existingFontSource;
|
||||
|
||||
////// The bytes are really identical. Register font source again with the new face name
|
||||
////// but return the existing one to save memory.
|
||||
////FontSourcesByFaceName.Add(fontSource.FaceName, existingFontSource);
|
||||
////return existingFontSource;
|
||||
|
||||
//FontsAreNotIdentical:
|
||||
//// Incredible rare case: Two different fonts have the same size and check sum.
|
||||
//// Give the new one a new key until it do not clash with an existing one.
|
||||
//while (FontSourcesByKey.ContainsKey(fontSource.Key))
|
||||
// fontSource.IncrementKey();
|
||||
}
|
||||
|
||||
OpenTypeFontface fontface = fontSource.Fontface;
|
||||
if (fontface == null)
|
||||
{
|
||||
fontface = new OpenTypeFontface(fontSource);
|
||||
fontSource.Fontface = fontface; // Also sets the font name in fontSource
|
||||
}
|
||||
|
||||
FontSourcesByName.Add(typefaceKey, fontSource);
|
||||
FontSourcesByName.Add(fontSource.FontName, fontSource);
|
||||
FontSourcesByKey.Add(fontSource.Key, fontSource);
|
||||
|
||||
return fontSource;
|
||||
}
|
||||
|
||||
public static void CacheExistingFontSourceWithNewTypefaceKey(string typefaceKey, XFontSource fontSource)
|
||||
{
|
||||
try
|
||||
{
|
||||
Lock.EnterFontFactory();
|
||||
FontSourcesByName.Add(typefaceKey, fontSource);
|
||||
}
|
||||
finally { Lock.ExitFontFactory(); }
|
||||
}
|
||||
|
||||
internal static string GetFontCachesState()
|
||||
{
|
||||
StringBuilder state = new StringBuilder();
|
||||
string[] keys;
|
||||
int count;
|
||||
|
||||
// FontResolverInfo by name.
|
||||
state.Append("====================\n");
|
||||
state.Append("Font resolver info by name\n");
|
||||
Dictionary<string, FontResolverInfo>.KeyCollection keyCollection = FontResolverInfosByName.Keys;
|
||||
count = keyCollection.Count;
|
||||
keys = new string[count];
|
||||
keyCollection.CopyTo(keys, 0);
|
||||
Array.Sort(keys, StringComparer.OrdinalIgnoreCase);
|
||||
foreach (string key in keys)
|
||||
state.AppendFormat(" {0}: {1}\n", key, FontResolverInfosByName[key].DebuggerDisplay);
|
||||
state.Append("\n");
|
||||
|
||||
// FontSource by key.
|
||||
state.Append("Font source by key and name\n");
|
||||
Dictionary<ulong, XFontSource>.KeyCollection fontSourceKeys = FontSourcesByKey.Keys;
|
||||
count = fontSourceKeys.Count;
|
||||
ulong[] ulKeys = new ulong[count];
|
||||
fontSourceKeys.CopyTo(ulKeys, 0);
|
||||
Array.Sort(ulKeys, delegate (ulong x, ulong y) { return x == y ? 0 : (x > y ? 1 : -1); });
|
||||
foreach (ulong ul in ulKeys)
|
||||
state.AppendFormat(" {0}: {1}\n", ul, FontSourcesByKey[ul].DebuggerDisplay);
|
||||
Dictionary<string, XFontSource>.KeyCollection fontSourceNames = FontSourcesByName.Keys;
|
||||
count = fontSourceNames.Count;
|
||||
keys = new string[count];
|
||||
fontSourceNames.CopyTo(keys, 0);
|
||||
Array.Sort(keys, StringComparer.OrdinalIgnoreCase);
|
||||
foreach (string key in keys)
|
||||
state.AppendFormat(" {0}: {1}\n", key, FontSourcesByName[key].DebuggerDisplay);
|
||||
state.Append("--------------------\n\n");
|
||||
|
||||
// FontFamilyInternal by name.
|
||||
state.Append(FontFamilyCache.GetCacheState());
|
||||
// XGlyphTypeface by name.
|
||||
state.Append(GlyphTypefaceCache.GetCacheState());
|
||||
// OpenTypeFontface by name.
|
||||
state.Append(OpenTypeFontfaceCache.GetCacheState());
|
||||
return state.ToString();
|
||||
}
|
||||
|
||||
// TODO: Move to ctor
|
||||
|
||||
/// <summary>
|
||||
/// Maps font typeface key to font resolver info.
|
||||
/// </summary>
|
||||
//static readonly Dictionary<string, FontResolverInfo> FontResolverInfosByTypefaceKey = new Dictionary<string, FontResolverInfo>(StringComparer.OrdinalIgnoreCase);
|
||||
static readonly Dictionary<string, FontResolverInfo> FontResolverInfosByName = new Dictionary<string, FontResolverInfo>(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
///// <summary>
|
||||
///// Maps font resolver info key to font resolver info.
|
||||
///// </summary>
|
||||
//static readonly Dictionary<string, FontResolverInfo> FontResolverInfosByKey = new Dictionary<string, FontResolverInfo>();
|
||||
|
||||
/// <summary>
|
||||
/// Maps typeface key or font name to font source.
|
||||
/// </summary>
|
||||
//static readonly Dictionary<string, XFontSource> FontSourcesByTypefaceKey = new Dictionary<string, XFontSource>(StringComparer.OrdinalIgnoreCase);
|
||||
static readonly Dictionary<string, XFontSource> FontSourcesByName = new Dictionary<string, XFontSource>(StringComparer.OrdinalIgnoreCase);
|
||||
|
||||
///// <summary>
|
||||
///// Maps font name to font source.
|
||||
///// </summary>
|
||||
//static readonly Dictionary<string, XFontSource> FontSourcesByFontName = new Dictionary<string, XFontSource>();
|
||||
|
||||
/// <summary>
|
||||
/// Maps font source key to font source.
|
||||
/// </summary>
|
||||
static readonly Dictionary<ulong, XFontSource> FontSourcesByKey = new Dictionary<ulong, XFontSource>();
|
||||
}
|
||||
}
|
211
PrintPDF/PdfSharp/Fonts/FontResolverInfo.cs
Normal file
211
PrintPDF/PdfSharp/Fonts/FontResolverInfo.cs
Normal file
@@ -0,0 +1,211 @@
|
||||
#region PDFsharp - A .NET library for processing PDF
|
||||
//
|
||||
// Authors:
|
||||
// Stefan Lange
|
||||
//
|
||||
// Copyright (c) 2005-2017 empira Software GmbH, Cologne Area (Germany)
|
||||
//
|
||||
// http://www.pdfsharp.com
|
||||
// http://sourceforge.net/projects/pdfsharp
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the "Software"),
|
||||
// to deal in the Software without restriction, including without limitation
|
||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
// and/or sell copies of the Software, and to permit persons to whom the
|
||||
// Software is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using PdfSharp.Drawing;
|
||||
#if CORE
|
||||
using System.Drawing;
|
||||
#endif
|
||||
#if GDI
|
||||
using System.Drawing;
|
||||
#endif
|
||||
#if WPF
|
||||
using System.Windows.Media;
|
||||
#endif
|
||||
|
||||
namespace PdfSharp.Fonts
|
||||
{
|
||||
// The English terms font, font family, typeface, glyph etc. are sometimes confusingly used.
|
||||
// Here a short clarification by Wikipedia.
|
||||
//
|
||||
// Wikipedia EN -> DE
|
||||
// Font -> Schriftschnitt
|
||||
// Computer font -> Font (Informationstechnik)
|
||||
// Typeface (Font family) -> Schriftart / Schriftfamilie
|
||||
// Glyph -> Glyphe
|
||||
//
|
||||
// It seems that typeface and font family are synonyms in English.
|
||||
// In WPF a family name is used as a term for a bunch of fonts that share the same
|
||||
// characteristics, like Univers or Times New Roman.
|
||||
// In WPF a fontface describes a request of a font of a particular font family, e.g.
|
||||
// Univers medium bold italic.
|
||||
// In WPF a glyph typeface is the result of requesting a typeface, i.e. a physical font
|
||||
// plus the information whether bold and/or italic should be simulated.
|
||||
//
|
||||
// Wikipedia DE -> EN
|
||||
// Schriftart -> Typeface
|
||||
// Schriftschnitt -> Font
|
||||
// Schriftfamilie -> ~ (means Font family)
|
||||
// Schriftsippe -> Font superfamily
|
||||
// Font -> Computer font
|
||||
//
|
||||
// http://en.wikipedia.org/wiki/Font
|
||||
// http://en.wikipedia.org/wiki/Computer_font
|
||||
// http://en.wikipedia.org/wiki/Typeface
|
||||
// http://en.wikipedia.org/wiki/Glyph
|
||||
// http://en.wikipedia.org/wiki/Typographic_unit
|
||||
//
|
||||
// FaceName: A unique and only internally used name of a glyph typeface. In other words the name of the font data that represents a specific font.
|
||||
//
|
||||
//
|
||||
|
||||
/// <summary>
|
||||
/// Describes the physical font that must be used to render a particular XFont.
|
||||
/// </summary>
|
||||
[DebuggerDisplay("{DebuggerDisplay}")]
|
||||
public class FontResolverInfo
|
||||
{
|
||||
private const string KeyPrefix = "frik:"; // Font Resolver Info Key
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="FontResolverInfo"/> struct.
|
||||
/// </summary>
|
||||
/// <param name="faceName">The name that uniquely identifies the fontface.</param>
|
||||
public FontResolverInfo(string faceName) :
|
||||
this(faceName, false, false, 0)
|
||||
{ }
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="FontResolverInfo"/> struct.
|
||||
/// </summary>
|
||||
/// <param name="faceName">The name that uniquely identifies the fontface.</param>
|
||||
/// <param name="mustSimulateBold">Set to <c>true</c> to simulate bold when rendered. Not implemented and must be false.</param>
|
||||
/// <param name="mustSimulateItalic">Set to <c>true</c> to simulate italic when rendered.</param>
|
||||
/// <param name="collectionNumber">Index of the font in a true type font collection.
|
||||
/// Not yet implemented and must be zero.
|
||||
/// </param>
|
||||
internal FontResolverInfo(string faceName, bool mustSimulateBold, bool mustSimulateItalic, int collectionNumber)
|
||||
{
|
||||
if (String.IsNullOrEmpty(faceName))
|
||||
throw new ArgumentNullException("faceName");
|
||||
if (collectionNumber != 0)
|
||||
throw new NotImplementedException("collectionNumber is not yet implemented and must be 0.");
|
||||
|
||||
_faceName = faceName;
|
||||
_mustSimulateBold = mustSimulateBold;
|
||||
_mustSimulateItalic = mustSimulateItalic;
|
||||
_collectionNumber = collectionNumber;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="FontResolverInfo"/> struct.
|
||||
/// </summary>
|
||||
/// <param name="faceName">The name that uniquely identifies the fontface.</param>
|
||||
/// <param name="mustSimulateBold">Set to <c>true</c> to simulate bold when rendered. Not implemented and must be false.</param>
|
||||
/// <param name="mustSimulateItalic">Set to <c>true</c> to simulate italic when rendered.</param>
|
||||
public FontResolverInfo(string faceName, bool mustSimulateBold, bool mustSimulateItalic)
|
||||
: this(faceName, mustSimulateBold, mustSimulateItalic, 0)
|
||||
{ }
|
||||
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="FontResolverInfo" /> struct.
|
||||
/// </summary>
|
||||
/// <param name="faceName">The name that uniquely identifies the fontface.</param>
|
||||
/// <param name="styleSimulations">The style simulation flags.</param>
|
||||
public FontResolverInfo(string faceName, XStyleSimulations styleSimulations)
|
||||
: this(faceName,
|
||||
(styleSimulations & XStyleSimulations.BoldSimulation) == XStyleSimulations.BoldSimulation,
|
||||
(styleSimulations & XStyleSimulations.ItalicSimulation) == XStyleSimulations.ItalicSimulation, 0)
|
||||
{ }
|
||||
|
||||
/// <summary>
|
||||
/// Gets the key for this object.
|
||||
/// </summary>
|
||||
internal string Key
|
||||
{
|
||||
get
|
||||
{
|
||||
return _key ?? (_key = KeyPrefix + _faceName.ToLowerInvariant()
|
||||
+ '/' + (_mustSimulateBold ? "b+" : "b-") + (_mustSimulateItalic ? "i+" : "i-"));
|
||||
}
|
||||
}
|
||||
string _key;
|
||||
|
||||
/// <summary>
|
||||
/// A name that uniquely identifies the font (not the family), e.g. the file name of the font. PDFsharp does not use this
|
||||
/// name internally, but passes it to the GetFont function of the IFontResolver interface to retrieve the font data.
|
||||
/// </summary>
|
||||
public string FaceName
|
||||
{
|
||||
get { return _faceName; }
|
||||
}
|
||||
readonly string _faceName;
|
||||
|
||||
/// <summary>
|
||||
/// Indicates whether bold must be simulated. Bold simulation is not implemented in PDFsharp.
|
||||
/// </summary>
|
||||
public bool MustSimulateBold
|
||||
{
|
||||
get { return _mustSimulateBold; }
|
||||
}
|
||||
readonly bool _mustSimulateBold;
|
||||
|
||||
/// <summary>
|
||||
/// Indicates whether italic must be simulated.
|
||||
/// </summary>
|
||||
public bool MustSimulateItalic
|
||||
{
|
||||
get { return _mustSimulateItalic; }
|
||||
}
|
||||
readonly bool _mustSimulateItalic;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the style simulation flags.
|
||||
/// </summary>
|
||||
public XStyleSimulations StyleSimulations
|
||||
{
|
||||
get { return (_mustSimulateBold ? XStyleSimulations.BoldSimulation : 0) | (_mustSimulateItalic ? XStyleSimulations.ItalicSimulation : 0); }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// The number of the font in a Truetype font collection file. The number of the first font is 0.
|
||||
/// NOT YET IMPLEMENTED. Must be zero.
|
||||
/// </summary>
|
||||
internal int CollectionNumber // TODO : Find a better name.
|
||||
{
|
||||
get { return _collectionNumber; }
|
||||
}
|
||||
readonly int _collectionNumber;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the DebuggerDisplayAttribute text.
|
||||
/// </summary>
|
||||
internal string DebuggerDisplay
|
||||
{
|
||||
get
|
||||
{
|
||||
return string.Format(CultureInfo.InvariantCulture, "FontResolverInfo: '{0}',{1}{2}", FaceName,
|
||||
MustSimulateBold ? " simulate Bold" : "",
|
||||
MustSimulateItalic ? " simulate Italic" : "");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
89
PrintPDF/PdfSharp/Fonts/FontResolvingOptions.cs
Normal file
89
PrintPDF/PdfSharp/Fonts/FontResolvingOptions.cs
Normal file
@@ -0,0 +1,89 @@
|
||||
#region PDFsharp - A .NET library for processing PDF
|
||||
//
|
||||
// Authors:
|
||||
// Stefan Lange
|
||||
//
|
||||
// Copyright (c) 2005-2017 empira Software GmbH, Cologne Area (Germany)
|
||||
//
|
||||
// http://www.pdfsharp.com
|
||||
// http://sourceforge.net/projects/pdfsharp
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the "Software"),
|
||||
// to deal in the Software without restriction, including without limitation
|
||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
// and/or sell copies of the Software, and to permit persons to whom the
|
||||
// Software is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
#endregion
|
||||
|
||||
#if GDI
|
||||
using System.Drawing;
|
||||
using System.Drawing.Text;
|
||||
#endif
|
||||
#if WPF
|
||||
using System.Windows.Media;
|
||||
#endif
|
||||
using PdfSharp.Drawing;
|
||||
|
||||
namespace PdfSharp.Fonts
|
||||
{
|
||||
/// <summary>
|
||||
/// Parameters that affect font selection.
|
||||
/// </summary>
|
||||
class FontResolvingOptions
|
||||
{
|
||||
public FontResolvingOptions(XFontStyle fontStyle)
|
||||
{
|
||||
FontStyle = fontStyle;
|
||||
}
|
||||
|
||||
public FontResolvingOptions(XFontStyle fontStyle, XStyleSimulations styleSimulations)
|
||||
{
|
||||
FontStyle = fontStyle;
|
||||
OverrideStyleSimulations = true;
|
||||
StyleSimulations = styleSimulations;
|
||||
}
|
||||
|
||||
public bool IsBold
|
||||
{
|
||||
get { return (FontStyle & XFontStyle.Bold) == XFontStyle.Bold; }
|
||||
}
|
||||
|
||||
public bool IsItalic
|
||||
{
|
||||
get { return (FontStyle & XFontStyle.Italic) == XFontStyle.Italic; }
|
||||
}
|
||||
|
||||
public bool IsBoldItalic
|
||||
{
|
||||
get { return (FontStyle & XFontStyle.BoldItalic) == XFontStyle.BoldItalic; }
|
||||
}
|
||||
|
||||
public bool MustSimulateBold
|
||||
{
|
||||
get { return (StyleSimulations & XStyleSimulations.BoldSimulation) == XStyleSimulations.BoldSimulation; }
|
||||
}
|
||||
|
||||
public bool MustSimulateItalic
|
||||
{
|
||||
get { return (StyleSimulations & XStyleSimulations.ItalicSimulation) == XStyleSimulations.ItalicSimulation; }
|
||||
}
|
||||
|
||||
public XFontStyle FontStyle;
|
||||
|
||||
public bool OverrideStyleSimulations;
|
||||
|
||||
public XStyleSimulations StyleSimulations;
|
||||
}
|
||||
}
|
176
PrintPDF/PdfSharp/Fonts/FontWriter.cs
Normal file
176
PrintPDF/PdfSharp/Fonts/FontWriter.cs
Normal file
@@ -0,0 +1,176 @@
|
||||
#region PDFsharp - A .NET library for processing PDF
|
||||
//
|
||||
// Authors:
|
||||
// Stefan Lange
|
||||
//
|
||||
// Copyright (c) 2005-2017 empira Software GmbH, Cologne Area (Germany)
|
||||
//
|
||||
// http://www.pdfsharp.com
|
||||
// http://sourceforge.net/projects/pdfsharp
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the "Software"),
|
||||
// to deal in the Software without restriction, including without limitation
|
||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
// and/or sell copies of the Software, and to permit persons to whom the
|
||||
// Software is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
#endregion
|
||||
|
||||
using System.IO;
|
||||
|
||||
namespace PdfSharp.Fonts
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a writer for generation of font file streams.
|
||||
/// </summary>
|
||||
internal class FontWriter
|
||||
{
|
||||
/// <summary>
|
||||
/// Initializes a new instance of the <see cref="FontWriter"/> class.
|
||||
/// Data is written in Motorola format (big-endian).
|
||||
/// </summary>
|
||||
public FontWriter(Stream stream)
|
||||
{
|
||||
_stream = stream;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Closes the writer and, if specified, the underlying stream.
|
||||
/// </summary>
|
||||
public void Close(bool closeUnderlyingStream)
|
||||
{
|
||||
if (_stream != null && closeUnderlyingStream)
|
||||
{
|
||||
#if !UWP
|
||||
_stream.Close();
|
||||
#endif
|
||||
_stream.Dispose();
|
||||
}
|
||||
_stream = null;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Closes the writer and the underlying stream.
|
||||
/// </summary>
|
||||
public void Close()
|
||||
{
|
||||
Close(true);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the position within the stream.
|
||||
/// </summary>
|
||||
public int Position
|
||||
{
|
||||
get { return (int)_stream.Position; }
|
||||
set { _stream.Position = value; }
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes the specified value to the font stream.
|
||||
/// </summary>
|
||||
public void WriteByte(byte value)
|
||||
{
|
||||
_stream.WriteByte(value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes the specified value to the font stream.
|
||||
/// </summary>
|
||||
public void WriteByte(int value)
|
||||
{
|
||||
_stream.WriteByte((byte)value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes the specified value to the font stream using big-endian.
|
||||
/// </summary>
|
||||
public void WriteShort(short value)
|
||||
{
|
||||
_stream.WriteByte((byte)(value >> 8));
|
||||
_stream.WriteByte((byte)value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes the specified value to the font stream using big-endian.
|
||||
/// </summary>
|
||||
public void WriteShort(int value)
|
||||
{
|
||||
WriteShort((short)value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes the specified value to the font stream using big-endian.
|
||||
/// </summary>
|
||||
public void WriteUShort(ushort value)
|
||||
{
|
||||
_stream.WriteByte((byte)(value >> 8));
|
||||
_stream.WriteByte((byte)value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes the specified value to the font stream using big-endian.
|
||||
/// </summary>
|
||||
public void WriteUShort(int value)
|
||||
{
|
||||
WriteUShort((ushort)value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes the specified value to the font stream using big-endian.
|
||||
/// </summary>
|
||||
public void WriteInt(int value)
|
||||
{
|
||||
_stream.WriteByte((byte)(value >> 24));
|
||||
_stream.WriteByte((byte)(value >> 16));
|
||||
_stream.WriteByte((byte)(value >> 8));
|
||||
_stream.WriteByte((byte)value);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Writes the specified value to the font stream using big-endian.
|
||||
/// </summary>
|
||||
public void WriteUInt(uint value)
|
||||
{
|
||||
_stream.WriteByte((byte)(value >> 24));
|
||||
_stream.WriteByte((byte)(value >> 16));
|
||||
_stream.WriteByte((byte)(value >> 8));
|
||||
_stream.WriteByte((byte)value);
|
||||
}
|
||||
|
||||
//public short ReadFWord()
|
||||
//public ushort ReadUFWord()
|
||||
//public long ReadLongDate()
|
||||
//public string ReadString(int size)
|
||||
|
||||
public void Write(byte[] buffer)
|
||||
{
|
||||
_stream.Write(buffer, 0, buffer.Length);
|
||||
}
|
||||
|
||||
public void Write(byte[] buffer, int offset, int count)
|
||||
{
|
||||
_stream.Write(buffer, offset, count);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the underlying stream.
|
||||
/// </summary>
|
||||
internal Stream Stream
|
||||
{
|
||||
get { return _stream; }
|
||||
}
|
||||
Stream _stream;
|
||||
}
|
||||
}
|
116
PrintPDF/PdfSharp/Fonts/GlobalFontSettings.cs
Normal file
116
PrintPDF/PdfSharp/Fonts/GlobalFontSettings.cs
Normal file
@@ -0,0 +1,116 @@
|
||||
#region PDFsharp - A .NET library for processing PDF
|
||||
//
|
||||
// Authors:
|
||||
// Stefan Lange
|
||||
//
|
||||
// Copyright (c) 2005-2017 empira Software GmbH, Cologne Area (Germany)
|
||||
//
|
||||
// http://www.pdfsharp.com
|
||||
// http://sourceforge.net/projects/pdfsharp
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the "Software"),
|
||||
// to deal in the Software without restriction, including without limitation
|
||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
// and/or sell copies of the Software, and to permit persons to whom the
|
||||
// Software is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using PdfSharp.Internal;
|
||||
using PdfSharp.Pdf;
|
||||
|
||||
namespace PdfSharp.Fonts
|
||||
{
|
||||
/// <summary>
|
||||
/// Provides functionality to specify information about the handling of fonts in the current application domain.
|
||||
/// </summary>
|
||||
public static class GlobalFontSettings
|
||||
{
|
||||
/// <summary>
|
||||
/// The name of the default font.
|
||||
/// </summary>
|
||||
public const string DefaultFontName = "PlatformDefault";
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the global font resolver for the current application domain.
|
||||
/// This static function must be called only once and before any font operation was executed by PDFsharp.
|
||||
/// If this is not easily to obtain, e.g. because your code is running on a web server, you must provide the
|
||||
/// same instance of your font resolver in every subsequent setting of this property.
|
||||
/// In a web application set the font resolver in Global.asax.
|
||||
/// </summary>
|
||||
public static IFontResolver FontResolver
|
||||
{
|
||||
get { return _fontResolver; }
|
||||
set
|
||||
{
|
||||
// Cannot remove font resolver.
|
||||
if (value == null)
|
||||
throw new ArgumentNullException();
|
||||
|
||||
try
|
||||
{
|
||||
Lock.EnterFontFactory();
|
||||
// Ignore multiple setting e.g. in a web application.
|
||||
if (ReferenceEquals(_fontResolver, value))
|
||||
return;
|
||||
|
||||
if (FontFactory.HasFontSources)
|
||||
throw new InvalidOperationException("Must not change font resolver after is was once used.");
|
||||
|
||||
_fontResolver = value;
|
||||
}
|
||||
finally { Lock.ExitFontFactory(); }
|
||||
}
|
||||
}
|
||||
static IFontResolver _fontResolver;
|
||||
|
||||
/// <summary>
|
||||
/// Gets or sets the default font encoding used for XFont objects where encoding is not explicitly specified.
|
||||
/// If it is not set, the default value is PdfFontEncoding.Unicode.
|
||||
/// If you are sure your document contains only Windows-1252 characters (see https://en.wikipedia.org/wiki/Windows-1252)
|
||||
/// set default encoding to PdfFontEncodingj.Windows1252.
|
||||
/// Must be set only once per app domain.
|
||||
/// </summary>
|
||||
public static PdfFontEncoding DefaultFontEncoding
|
||||
{
|
||||
get
|
||||
{
|
||||
if (!_fontEncodingInitialized)
|
||||
DefaultFontEncoding = PdfFontEncoding.Unicode;
|
||||
return _fontEncoding;
|
||||
}
|
||||
set
|
||||
{
|
||||
try
|
||||
{
|
||||
Lock.EnterFontFactory();
|
||||
if (_fontEncodingInitialized)
|
||||
{
|
||||
// Ignore multiple setting e.g. in a web application.
|
||||
if (_fontEncoding == value)
|
||||
return;
|
||||
throw new InvalidOperationException("Must not change DefaultFontEncoding after is was set once.");
|
||||
}
|
||||
|
||||
_fontEncoding = value;
|
||||
_fontEncodingInitialized = true;
|
||||
}
|
||||
finally { Lock.ExitFontFactory(); }
|
||||
}
|
||||
}
|
||||
static PdfFontEncoding _fontEncoding;
|
||||
static bool _fontEncodingInitialized;
|
||||
}
|
||||
}
|
54
PrintPDF/PdfSharp/Fonts/IFontResolver.cs
Normal file
54
PrintPDF/PdfSharp/Fonts/IFontResolver.cs
Normal file
@@ -0,0 +1,54 @@
|
||||
#region PDFsharp - A .NET library for processing PDF
|
||||
//
|
||||
// Authors:
|
||||
// Stefan Lange
|
||||
//
|
||||
// Copyright (c) 2005-2017 empira Software GmbH, Cologne Area (Germany)
|
||||
//
|
||||
// http://www.pdfsharp.com
|
||||
// http://sourceforge.net/projects/pdfsharp
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the "Software"),
|
||||
// to deal in the Software without restriction, including without limitation
|
||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
// and/or sell copies of the Software, and to permit persons to whom the
|
||||
// Software is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
#endregion
|
||||
|
||||
namespace PdfSharp.Fonts
|
||||
{
|
||||
/// <summary>
|
||||
/// Provides functionality that converts a requested typeface into a physical font.
|
||||
/// </summary>
|
||||
public interface IFontResolver
|
||||
{
|
||||
/// <summary>
|
||||
/// Converts specified information about a required typeface into a specific font.
|
||||
/// </summary>
|
||||
/// <param name="familyName">Name of the font family.</param>
|
||||
/// <param name="isBold">Set to <c>true</c> when a bold fontface is required.</param>
|
||||
/// <param name="isItalic">Set to <c>true</c> when an italic fontface is required.</param>
|
||||
/// <returns>Information about the physical font, or null if the request cannot be satisfied.</returns>
|
||||
FontResolverInfo ResolveTypeface(string familyName, bool isBold, bool isItalic);
|
||||
|
||||
//FontResolverInfo ResolveTypeface(Typeface); TODO in PDFsharp 2.0
|
||||
|
||||
/// <summary>
|
||||
/// Gets the bytes of a physical font with specified face name.
|
||||
/// </summary>
|
||||
/// <param name="faceName">A face name previously retrieved by ResolveTypeface.</param>
|
||||
byte[] GetFont(string faceName);
|
||||
}
|
||||
}
|
337
PrintPDF/PdfSharp/Fonts/PlatformFontResolver.cs
Normal file
337
PrintPDF/PdfSharp/Fonts/PlatformFontResolver.cs
Normal file
@@ -0,0 +1,337 @@
|
||||
#region PDFsharp - A .NET library for processing PDF
|
||||
//
|
||||
// Authors:
|
||||
// Stefan Lange
|
||||
//
|
||||
// Copyright (c) 2005-2017 empira Software GmbH, Cologne Area (Germany)
|
||||
//
|
||||
// http://www.pdfsharp.com
|
||||
// http://sourceforge.net/projects/pdfsharp
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the "Software"),
|
||||
// to deal in the Software without restriction, including without limitation
|
||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
// and/or sell copies of the Software, and to permit persons to whom the
|
||||
// Software is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
#endregion
|
||||
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
#if CORE || GDI
|
||||
using System.Drawing;
|
||||
using System.Drawing.Drawing2D;
|
||||
using GdiFontFamily = System.Drawing.FontFamily;
|
||||
using GdiFont = System.Drawing.Font;
|
||||
using GdiFontStyle = System.Drawing.FontStyle;
|
||||
#endif
|
||||
#if WPF
|
||||
using System.Windows;
|
||||
using System.Windows.Documents;
|
||||
using System.Windows.Media;
|
||||
using WpfFontFamily = System.Windows.Media.FontFamily;
|
||||
using WpfTypeface = System.Windows.Media.Typeface;
|
||||
using WpfGlyphTypeface = System.Windows.Media.GlyphTypeface;
|
||||
using WpfStyleSimulations = System.Windows.Media.StyleSimulations;
|
||||
#endif
|
||||
using PdfSharp.Drawing;
|
||||
|
||||
#pragma warning disable 1591
|
||||
// ReSharper disable RedundantNameQualifier
|
||||
|
||||
namespace PdfSharp.Fonts
|
||||
{
|
||||
/// <summary>
|
||||
/// Default platform specific font resolving.
|
||||
/// </summary>
|
||||
public static class PlatformFontResolver
|
||||
{
|
||||
/// <summary>
|
||||
/// Resolves the typeface by generating a font resolver info.
|
||||
/// </summary>
|
||||
/// <param name="familyName">Name of the font family.</param>
|
||||
/// <param name="isBold">Indicates whether a bold font is requested.</param>
|
||||
/// <param name="isItalic">Indicates whether an italic font is requested.</param>
|
||||
public static FontResolverInfo ResolveTypeface(string familyName, bool isBold, bool isItalic)
|
||||
{
|
||||
FontResolvingOptions fontResolvingOptions = new FontResolvingOptions(FontHelper.CreateStyle(isBold, isItalic));
|
||||
return ResolveTypeface(familyName, fontResolvingOptions, XGlyphTypeface.ComputeKey(familyName, fontResolvingOptions));
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Internal implementation.
|
||||
/// </summary>
|
||||
internal static FontResolverInfo ResolveTypeface(string familyName, FontResolvingOptions fontResolvingOptions, string typefaceKey)
|
||||
{
|
||||
// Internally we often have the typeface key already.
|
||||
if (string.IsNullOrEmpty(typefaceKey))
|
||||
typefaceKey = XGlyphTypeface.ComputeKey(familyName, fontResolvingOptions);
|
||||
|
||||
// The user may call ResolveTypeface anytime from anywhere, so check cache in FontFactory in the first place.
|
||||
FontResolverInfo fontResolverInfo;
|
||||
if (FontFactory.TryGetFontResolverInfoByTypefaceKey(typefaceKey, out fontResolverInfo))
|
||||
return fontResolverInfo;
|
||||
|
||||
// Let the platform create the requested font source and save both PlattformResolverInfo
|
||||
// and XFontSource in FontFactory cache.
|
||||
// It is possible that we already have the correct font source. E.g. we already have the regular typeface in cache
|
||||
// and looking now for the italic typeface, but no such font exists. In this case we get the regular font source
|
||||
// and cache again it with the italic typeface key. Furthermore in glyph typeface style simulation for italic is set.
|
||||
#if (CORE || GDI) && !WPF
|
||||
GdiFont gdiFont;
|
||||
XFontSource fontSource = CreateFontSource(familyName, fontResolvingOptions, out gdiFont, typefaceKey);
|
||||
#endif
|
||||
#if WPF && !SILVERLIGHT
|
||||
WpfFontFamily wpfFontFamily;
|
||||
WpfTypeface wpfTypeface;
|
||||
WpfGlyphTypeface wpfGlyphTypeface;
|
||||
XFontSource fontSource = CreateFontSource(familyName, fontResolvingOptions, out wpfFontFamily, out wpfTypeface, out wpfGlyphTypeface, typefaceKey);
|
||||
#endif
|
||||
#if SILVERLIGHT
|
||||
//GlyphTypeface wpfGlyphTypeface;
|
||||
XFontSource fontSource = null;//CreateFontSource(familyName, isBold, isItalic, out wpfGlyphTypeface, typefaceKey);
|
||||
#endif
|
||||
#if NETFX_CORE || UWP
|
||||
//GlyphTypeface wpfGlyphTypeface;
|
||||
XFontSource fontSource = null;//CreateFontSource(familyName, isBold, isItalic, out wpfGlyphTypeface, typefaceKey);
|
||||
#endif
|
||||
// If no such font exists return null. PDFsharp will fail.
|
||||
if (fontSource == null)
|
||||
return null;
|
||||
|
||||
//#if (CORE || GDI) && !WPF
|
||||
// // TODO: Support style simulation for GDI+ platform fonts.
|
||||
// fontResolverInfo = new PlatformFontResolverInfo(typefaceKey, false, false, gdiFont);
|
||||
//#endif
|
||||
if (fontResolvingOptions.OverrideStyleSimulations)
|
||||
{
|
||||
#if (CORE || GDI) && !WPF
|
||||
// TODO: Support style simulation for GDI+ platform fonts.
|
||||
fontResolverInfo = new PlatformFontResolverInfo(typefaceKey, fontResolvingOptions.MustSimulateBold, fontResolvingOptions.MustSimulateItalic, gdiFont);
|
||||
#endif
|
||||
#if WPF && !SILVERLIGHT
|
||||
fontResolverInfo = new PlatformFontResolverInfo(typefaceKey, fontResolvingOptions.MustSimulateBold, fontResolvingOptions.MustSimulateItalic,
|
||||
wpfFontFamily, wpfTypeface, wpfGlyphTypeface);
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
#if (CORE || GDI) && !WPF
|
||||
bool mustSimulateBold = gdiFont.Bold && !fontSource.Fontface.os2.IsBold;
|
||||
bool mustSimulateItalic = gdiFont.Italic && !fontSource.Fontface.os2.IsItalic;
|
||||
fontResolverInfo = new PlatformFontResolverInfo(typefaceKey, mustSimulateBold, mustSimulateItalic, gdiFont);
|
||||
#endif
|
||||
#if WPF && !SILVERLIGHT
|
||||
// WPF knows what styles have to be simulated.
|
||||
bool mustSimulateBold = (wpfGlyphTypeface.StyleSimulations & WpfStyleSimulations.BoldSimulation) == WpfStyleSimulations.BoldSimulation;
|
||||
bool mustSimulateItalic = (wpfGlyphTypeface.StyleSimulations & WpfStyleSimulations.ItalicSimulation) == WpfStyleSimulations.ItalicSimulation;
|
||||
|
||||
// Weird behavior of WPF is fixed here in case we request a bold italic typeface.
|
||||
// If only italic is available, bold is simulated based on italic.
|
||||
// If only bold is available, italic is simulated based on bold.
|
||||
// But if both bold and italic is available, italic face is used and bold is simulated.
|
||||
// The latter case is reversed here, i.e. bold face is used and italic is simulated.
|
||||
if (fontResolvingOptions.IsBoldItalic && mustSimulateBold && !mustSimulateItalic)
|
||||
{
|
||||
// Try to get the bold typeface.
|
||||
string typefaceKeyBold = XGlyphTypeface.ComputeKey(familyName, true, false);
|
||||
FontResolverInfo infoBold = ResolveTypeface(familyName,
|
||||
new FontResolvingOptions(FontHelper.CreateStyle(true, false)), typefaceKeyBold);
|
||||
// Use it if it does not base on simulation.
|
||||
if (infoBold != null && infoBold.StyleSimulations == XStyleSimulations.None)
|
||||
{
|
||||
// Use existing bold typeface and simulate italic.
|
||||
fontResolverInfo = new PlatformFontResolverInfo(typefaceKeyBold, false, true,
|
||||
wpfFontFamily, wpfTypeface, wpfGlyphTypeface);
|
||||
}
|
||||
else
|
||||
{
|
||||
// Simulate both.
|
||||
fontResolverInfo = new PlatformFontResolverInfo(typefaceKey, true, true,
|
||||
wpfFontFamily, wpfTypeface, wpfGlyphTypeface);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
fontResolverInfo = new PlatformFontResolverInfo(typefaceKey, mustSimulateBold, mustSimulateItalic,
|
||||
wpfFontFamily, wpfTypeface, wpfGlyphTypeface);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
#if SILVERLIGHT
|
||||
fontResolverInfo = null; //new PlattformResolverInfo(typefaceKey, false, false, wpfGlyphTypeface);
|
||||
#endif
|
||||
FontFactory.CacheFontResolverInfo(typefaceKey, fontResolverInfo);
|
||||
|
||||
// Register font data under the platform specific face name.
|
||||
// Already done in CreateFontSource.
|
||||
// FontFactory.CacheNewFontSource(typefaceKey, fontSource);
|
||||
|
||||
return fontResolverInfo;
|
||||
}
|
||||
|
||||
#if (CORE_WITH_GDI || GDI) && !WPF
|
||||
/// <summary>
|
||||
/// Create a GDI+ font and use its handle to retrieve font data using native calls.
|
||||
/// </summary>
|
||||
internal static XFontSource CreateFontSource(string familyName, FontResolvingOptions fontResolvingOptions, out GdiFont font, string typefaceKey)
|
||||
{
|
||||
if (string.IsNullOrEmpty(typefaceKey))
|
||||
typefaceKey = XGlyphTypeface.ComputeKey(familyName, fontResolvingOptions);
|
||||
#if true_
|
||||
if (familyName == "Cambria")
|
||||
Debug-Break.Break();
|
||||
#endif
|
||||
GdiFontStyle gdiStyle = (GdiFontStyle)(fontResolvingOptions.FontStyle & XFontStyle.BoldItalic);
|
||||
|
||||
// Create a 10 point GDI+ font as an exemplar.
|
||||
XFontSource fontSource;
|
||||
font = FontHelper.CreateFont(familyName, 10, gdiStyle, out fontSource);
|
||||
|
||||
if (fontSource != null)
|
||||
{
|
||||
Debug.Assert(font != null);
|
||||
// Case: Font was created by a GDI+ private font collection.
|
||||
#if true
|
||||
#if DEBUG
|
||||
XFontSource existingFontSource;
|
||||
Debug.Assert(FontFactory.TryGetFontSourceByTypefaceKey(typefaceKey, out existingFontSource) &&
|
||||
ReferenceEquals(fontSource, existingFontSource));
|
||||
#endif
|
||||
#else
|
||||
// Win32 API cannot get font data from fonts created by private font collection,
|
||||
// because this is handled internally in GDI+.
|
||||
// Therefore the font source was created when the private font is added to the private font collection.
|
||||
if (!FontFactory.TryGetFontSourceByTypefaceKey(typefaceKey, out fontSource))
|
||||
{
|
||||
// Simplify styles.
|
||||
// (The code is written for clarity - do not rearrange for optimization)
|
||||
if (font.Bold && font.Italic)
|
||||
{
|
||||
if (FontFactory.TryGetFontSourceByTypefaceKey(XGlyphTypeface.ComputeKey(font.Name, true, false), out fontSource))
|
||||
{
|
||||
// Use bold font.
|
||||
FontFactory.CacheExistingFontSourceWithNewTypefaceKey(typefaceKey, fontSource);
|
||||
}
|
||||
else if (FontFactory.TryGetFontSourceByTypefaceKey(XGlyphTypeface.ComputeKey(font.Name, false, true), out fontSource))
|
||||
{
|
||||
// Use italic font.
|
||||
FontFactory.CacheExistingFontSourceWithNewTypefaceKey(typefaceKey, fontSource);
|
||||
}
|
||||
else if (FontFactory.TryGetFontSourceByTypefaceKey(XGlyphTypeface.ComputeKey(font.Name, false, false), out fontSource))
|
||||
{
|
||||
// Use regular font.
|
||||
FontFactory.CacheExistingFontSourceWithNewTypefaceKey(typefaceKey, fontSource);
|
||||
}
|
||||
}
|
||||
else if (font.Bold || font.Italic)
|
||||
{
|
||||
// Use regular font.
|
||||
if (FontFactory.TryGetFontSourceByTypefaceKey(XGlyphTypeface.ComputeKey(font.Name, false, false), out fontSource))
|
||||
{
|
||||
FontFactory.CacheExistingFontSourceWithNewTypefaceKey(typefaceKey, fontSource);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (FontFactory.TryGetFontSourceByTypefaceKey(XGlyphTypeface.ComputeKey(font.Name, false, false), out fontSource))
|
||||
{
|
||||
// Should never come here...
|
||||
FontFactory.CacheExistingFontSourceWithNewTypefaceKey(typefaceKey, fontSource);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
else
|
||||
{
|
||||
// Get or create the font source and cache it under the specified typeface key.
|
||||
fontSource = XFontSource.GetOrCreateFromGdi(typefaceKey, font);
|
||||
}
|
||||
return fontSource;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if WPF && !SILVERLIGHT
|
||||
/// <summary>
|
||||
/// Create a WPF GlyphTypeface and retrieve font data from it.
|
||||
/// </summary>
|
||||
internal static XFontSource CreateFontSource(string familyName, FontResolvingOptions fontResolvingOptions,
|
||||
out WpfFontFamily wpfFontFamily, out WpfTypeface wpfTypeface, out WpfGlyphTypeface wpfGlyphTypeface, string typefaceKey)
|
||||
{
|
||||
if (string.IsNullOrEmpty(typefaceKey))
|
||||
typefaceKey = XGlyphTypeface.ComputeKey(familyName, fontResolvingOptions);
|
||||
XFontStyle style = fontResolvingOptions.FontStyle;
|
||||
|
||||
#if DEBUG
|
||||
if (StringComparer.OrdinalIgnoreCase.Compare(familyName, "Segoe UI Semilight") == 0
|
||||
&& (style & XFontStyle.BoldItalic) == XFontStyle.Italic)
|
||||
familyName.GetType();
|
||||
#endif
|
||||
|
||||
// Use WPF technique to create font data.
|
||||
wpfTypeface = XPrivateFontCollection.TryCreateTypeface(familyName, style, out wpfFontFamily);
|
||||
#if DEBUG__
|
||||
if (wpfTypeface != null)
|
||||
{
|
||||
WpfGlyphTypeface glyphTypeface;
|
||||
ICollection<WpfTypeface> list = wpfFontFamily.GetTypefaces();
|
||||
foreach (WpfTypeface tf in list)
|
||||
{
|
||||
if (!tf.TryGetGlyphTypeface(out glyphTypeface))
|
||||
Debug-Break.Break();
|
||||
}
|
||||
|
||||
//if (!WpfTypeface.TryGetGlyphTypeface(out glyphTypeface))
|
||||
// throw new InvalidOperationException(PSSR.CannotGetGlyphTypeface(familyName));
|
||||
}
|
||||
#endif
|
||||
if (wpfFontFamily == null)
|
||||
wpfFontFamily = new WpfFontFamily(familyName);
|
||||
|
||||
if (wpfTypeface == null)
|
||||
wpfTypeface = FontHelper.CreateTypeface(wpfFontFamily, style);
|
||||
|
||||
// Let WPF choose the right glyph typeface.
|
||||
if (!wpfTypeface.TryGetGlyphTypeface(out wpfGlyphTypeface))
|
||||
throw new InvalidOperationException(PSSR.CannotGetGlyphTypeface(familyName));
|
||||
|
||||
// Get or create the font source and cache it under the specified typeface key.
|
||||
XFontSource fontSource = XFontSource.GetOrCreateFromWpf(typefaceKey, wpfGlyphTypeface);
|
||||
return fontSource;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if SILVERLIGHT
|
||||
/// <summary>
|
||||
/// Silverlight has no access to the bytes of its fonts and therefore return null.
|
||||
/// </summary>
|
||||
internal static XFontSource CreateFontSource(string familyName, bool isBold, bool isItalic)
|
||||
{
|
||||
// PDFsharp does not provide a default font because this would blow up the assembly
|
||||
// unnecessarily if the font is not needed. Provide your own font resolver to generate
|
||||
// PDF files containing text.
|
||||
return null;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if NETFX_CORE
|
||||
internal static XFontSource CreateFontSource(string familyName, bool isBold, bool isItalic, string typefaceKey)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
101
PrintPDF/PdfSharp/Fonts/PlatformFontResolverInfo.cs
Normal file
101
PrintPDF/PdfSharp/Fonts/PlatformFontResolverInfo.cs
Normal file
@@ -0,0 +1,101 @@
|
||||
#region PDFsharp - A .NET library for processing PDF
|
||||
//
|
||||
// Authors:
|
||||
// Stefan Lange
|
||||
//
|
||||
// Copyright (c) 2005-2017 empira Software GmbH, Cologne Area (Germany)
|
||||
//
|
||||
// http://www.pdfsharp.com
|
||||
// http://sourceforge.net/projects/pdfsharp
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the "Software"),
|
||||
// to deal in the Software without restriction, including without limitation
|
||||
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
// and/or sell copies of the Software, and to permit persons to whom the
|
||||
// Software is furnished to do so, subject to the following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||
// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
// DEALINGS IN THE SOFTWARE.
|
||||
#endregion
|
||||
|
||||
#if CORE || GDI
|
||||
using System.Drawing;
|
||||
using GdiFont = System.Drawing.Font;
|
||||
|
||||
#endif
|
||||
#if WPF
|
||||
using System.Windows.Media;
|
||||
using WpfFontFamily = System.Windows.Media.FontFamily;
|
||||
using WpfTypeface = System.Windows.Media.Typeface;
|
||||
using WpfGlyphTypeface = System.Windows.Media.GlyphTypeface;
|
||||
#endif
|
||||
|
||||
namespace PdfSharp.Fonts
|
||||
{
|
||||
/// <summary>
|
||||
/// Represents a font resolver info created by the platform font resolver.
|
||||
/// </summary>
|
||||
internal class PlatformFontResolverInfo : FontResolverInfo
|
||||
{
|
||||
#if CORE || GDI
|
||||
public PlatformFontResolverInfo(string faceName, bool mustSimulateBold, bool mustSimulateItalic, GdiFont gdiFont)
|
||||
: base(faceName, mustSimulateBold, mustSimulateItalic)
|
||||
{
|
||||
_gdiFont = gdiFont;
|
||||
}
|
||||
#endif
|
||||
#if WPF
|
||||
public PlatformFontResolverInfo(string faceName, bool mustSimulateBold, bool mustSimulateItalic, WpfFontFamily wpfFontFamily,
|
||||
WpfTypeface wpfTypeface, WpfGlyphTypeface wpfGlyphTypeface)
|
||||
: base(faceName, mustSimulateBold, mustSimulateItalic)
|
||||
{
|
||||
_wpfFontFamily = wpfFontFamily;
|
||||
_wpfTypeface = wpfTypeface;
|
||||
_wpfGlyphTypeface = wpfGlyphTypeface;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if CORE || GDI
|
||||
public Font GdiFont
|
||||
{
|
||||
get { return _gdiFont; }
|
||||
}
|
||||
readonly Font _gdiFont;
|
||||
#endif
|
||||
#if WPF
|
||||
public WpfFontFamily WpfFontFamily
|
||||
{
|
||||
get { return _wpfFontFamily; }
|
||||
}
|
||||
readonly WpfFontFamily _wpfFontFamily;
|
||||
|
||||
public WpfTypeface WpfTypeface
|
||||
{
|
||||
get { return _wpfTypeface; }
|
||||
}
|
||||
readonly WpfTypeface _wpfTypeface;
|
||||
|
||||
public WpfGlyphTypeface WpfGlyphTypeface
|
||||
{
|
||||
get { return _wpfGlyphTypeface; }
|
||||
}
|
||||
readonly WpfGlyphTypeface _wpfGlyphTypeface;
|
||||
#endif
|
||||
#if NETFX_CORE || UWP
|
||||
public PlatformFontResolverInfo(string faceName, bool mustSimulateBold, bool mustSimulateItalic)
|
||||
: base(faceName, mustSimulateBold, mustSimulateItalic)
|
||||
{
|
||||
//_gdiFont = gdiFont;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user