diff --git a/src/UglyToad.PdfPig/Fonts/SystemFonts/SystemFontFinder.cs b/src/UglyToad.PdfPig/Fonts/SystemFonts/SystemFontFinder.cs index ee1447f4..3f334f84 100644 --- a/src/UglyToad.PdfPig/Fonts/SystemFonts/SystemFontFinder.cs +++ b/src/UglyToad.PdfPig/Fonts/SystemFonts/SystemFontFinder.cs @@ -14,6 +14,9 @@ { private static readonly IReadOnlyDictionary NameSubstitutes; + private static readonly object CacheLock = new object(); + private static readonly Dictionary Cache = new Dictionary(StringComparer.OrdinalIgnoreCase); + static SystemFontFinder() { var dict = new Dictionary @@ -67,7 +70,6 @@ private readonly TrueTypeFontParser trueTypeFontParser; private readonly Lazy> availableFonts; - private readonly Dictionary cache = new Dictionary(StringComparer.OrdinalIgnoreCase); private readonly Dictionary nameToFileNameMap = new Dictionary(StringComparer.OrdinalIgnoreCase); private readonly HashSet readFiles = new HashSet(); @@ -157,14 +159,17 @@ private TrueTypeFontProgram GetTrueTypeFontNamed(string name) { - if (cache.TryGetValue(name, out var result)) + lock (CacheLock) { - return result; + if (Cache.TryGetValue(name, out var cachedResult)) + { + return cachedResult; + } } if (nameToFileNameMap.TryGetValue(name, out var fileName)) { - if (TryReadFile(fileName, false, name, out result)) + if (TryReadFile(fileName, false, name, out var result)) { return result; } @@ -216,40 +221,42 @@ font = null; readFiles.Add(fileName); - using (var fileStream = File.OpenRead(fileName)) + var bytes = File.ReadAllBytes(fileName); + + var data = new TrueTypeDataBytes(new ByteArrayInputBytes(bytes)); + + if (readNameFirst) { - var input = new StreamInputBytes(fileStream); - var data = new TrueTypeDataBytes(input); + var name = trueTypeFontParser.GetNameTable(data); - if (readNameFirst) + if (name == null) { - var name = trueTypeFontParser.GetNameTable(data); - - if (name == null) - { - return false; - } - - var fontNameFromFile = name.GetPostscriptName() ?? name.FontName; - - nameToFileNameMap[fontNameFromFile] = fileName; - - if (!string.Equals(fontNameFromFile, fontName, StringComparison.OrdinalIgnoreCase)) - { - return false; - } + return false; } - data.Seek(0); - font = trueTypeFontParser.Parse(data); - var psName = font.TableRegister.NameTable?.GetPostscriptName() ?? font.Name; - if (!cache.ContainsKey(psName)) - { - cache[psName] = font; - } + var fontNameFromFile = name.GetPostscriptName() ?? name.FontName; - return true; + nameToFileNameMap[fontNameFromFile] = fileName; + + if (!string.Equals(fontNameFromFile, fontName, StringComparison.OrdinalIgnoreCase)) + { + return false; + } } + + data.Seek(0); + font = trueTypeFontParser.Parse(data); + var psName = font.TableRegister.NameTable?.GetPostscriptName() ?? font.Name; + + lock (CacheLock) + { + if (!Cache.ContainsKey(psName)) + { + Cache[psName] = font; + } + } + + return true; } } } \ No newline at end of file