From e82c949130836ee969541260a636341a7475c854 Mon Sep 17 00:00:00 2001 From: swmal <897655+swmal@users.noreply.github.com> Date: Wed, 25 Feb 2026 16:34:52 +0100 Subject: [PATCH 1/3] Improved support for fallbackfonts --- .../EPPlus.Fonts.OpenType.Tests.csproj | 5 +- .../FallbackFonts/CustomFontProviderTests.cs | 345 ++++++++++++++++++ .../FontSubsetManagerTests.cs | 133 +++++++ .../Fonts/NotoSansMath-Regular.ttf | Bin 0 -> 1004120 bytes .../DefaultFontProvider.cs | 105 ++++-- .../FontSubsetBuilder.cs | 59 --- .../FontSubsetManager.cs | 139 +++++++ src/EPPlus.Fonts.OpenType/OpenTypeFont.cs | 16 +- src/EPPlus.Fonts.OpenType/OpenTypeFonts.cs | 1 - .../Scanner/FontScannerV2.Ttc.cs | 6 - .../Subsetting/GposSubsetProcessor.cs | 4 - .../Layout/Features/FeatureListTable.cs | 20 - .../LookupType2/PairPosSubTableFormat2.cs | 2 - .../Tables/Gsub/GsubTable.cs | 23 -- .../Utils/CodePointUtil.cs | 85 +++++ 15 files changed, 792 insertions(+), 151 deletions(-) create mode 100644 src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/CustomFontProviderTests.cs create mode 100644 src/EPPlus.Fonts.OpenType.Tests/FontSubsetManagerTests.cs create mode 100644 src/EPPlus.Fonts.OpenType.Tests/Fonts/NotoSansMath-Regular.ttf delete mode 100644 src/EPPlus.Fonts.OpenType/FontSubsetBuilder.cs create mode 100644 src/EPPlus.Fonts.OpenType/FontSubsetManager.cs create mode 100644 src/EPPlus.Fonts.OpenType/Utils/CodePointUtil.cs diff --git a/src/EPPlus.Fonts.OpenType.Tests/EPPlus.Fonts.OpenType.Tests.csproj b/src/EPPlus.Fonts.OpenType.Tests/EPPlus.Fonts.OpenType.Tests.csproj index 1813c8ce9..a69a0ca61 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/EPPlus.Fonts.OpenType.Tests.csproj +++ b/src/EPPlus.Fonts.OpenType.Tests/EPPlus.Fonts.OpenType.Tests.csproj @@ -1,4 +1,4 @@ - + net8.0 latest @@ -38,6 +38,9 @@ PreserveNewest + + PreserveNewest + PreserveNewest diff --git a/src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/CustomFontProviderTests.cs b/src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/CustomFontProviderTests.cs new file mode 100644 index 000000000..c9d3644e2 --- /dev/null +++ b/src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/CustomFontProviderTests.cs @@ -0,0 +1,345 @@ +/************************************************************************************************* + Required Notice: Copyright (C) EPPlus Software AB. + This software is licensed under PolyForm Noncommercial License 1.0.0 + and may only be used for noncommercial purposes + https://polyformproject.org/licenses/noncommercial/1.0.0/ + + A commercial license to use this software can be purchased at https://epplussoftware.com + ************************************************************************************************* + Date Author Change + ************************************************************************************************* + 02/24/2026 EPPlus Software AB CustomFontProvider unit tests + *************************************************************************************************/ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System; +using System.Linq; + +namespace EPPlus.Fonts.OpenType.Tests.FallbackFonts +{ + [TestClass] + public class CustomFontProviderTests : FontTestBase + { + public override TestContext? TestContext { get; set; } + + private OpenTypeFont _robotoFont; + private OpenTypeFont _notoEmojiFont; + private OpenTypeFont _notoMathFont; + + // U+1F600 = 😀 (Grinning Face) - present in NotoEmoji, absent in Roboto + private const uint EmojiCodePoint = 0x1F600; + // U+0041 = 'A' - present in Roboto (and most text fonts) + private const uint LatinA = 0x0041; + // U+2A0C = ⨌ (Quadruple Integral) - present in Noto Sans Math, absent in Roboto and NotoEmoji + private const uint IntegralCodePoint = 0x2A0C; + // U+F0000 = Private Use Area - unlikely to be in any standard font + private const uint PrivateUseCodePoint = 0xF0000; + + [TestInitialize] + public void TestSetup() + { + _robotoFont = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + _notoEmojiFont = OpenTypeFonts.GetFontData(FontFolders, "Noto Emoji", FontSubFamily.Regular); + _notoMathFont = OpenTypeFonts.GetFontData(FontFolders, "Noto Sans Math", FontSubFamily.Regular); + } + + #region Constructor Tests + + [TestMethod] + public void Constructor_WithValidFont_ShouldSetPrimaryFont() + { + // Act + var provider = new CustomFontProvider(_robotoFont); + + // Assert + Assert.AreEqual(_robotoFont, provider.PrimaryFont); + } + + [TestMethod] + [ExpectedException(typeof(ArgumentNullException))] + public void Constructor_WithNull_ShouldThrowArgumentNullException() + { + // Act + new CustomFontProvider(null); + } + + #endregion + + #region AddFallback Tests + + [TestMethod] + public void AddFallback_WithValidFont_ShouldBeIncludedInGetAllFonts() + { + // Arrange + var provider = new CustomFontProvider(_robotoFont); + + // Act + provider.AddFallback(_notoEmojiFont); + var allFonts = provider.GetAllFonts().ToList(); + + // Assert + Assert.AreEqual(2, allFonts.Count, "Should have primary + 1 fallback"); + Assert.AreEqual(_robotoFont, allFonts[0], "First should be primary font"); + Assert.AreEqual(_notoEmojiFont, allFonts[1], "Second should be fallback font"); + } + + [TestMethod] + [ExpectedException(typeof(ArgumentNullException))] + public void AddFallback_WithNull_ShouldThrowArgumentNullException() + { + // Arrange + var provider = new CustomFontProvider(_robotoFont); + + // Act + provider.AddFallback(null); + } + + [TestMethod] + public void AddFallback_MultipleFonts_ShouldPreserveOrder() + { + // Arrange + var provider = new CustomFontProvider(_robotoFont); + + // Act + provider.AddFallback(_notoEmojiFont); + provider.AddFallback(_robotoFont); // Same font again, to test ordering + var allFonts = provider.GetAllFonts().ToList(); + + // Assert + Assert.AreEqual(3, allFonts.Count, "Should have primary + 2 fallbacks"); + Assert.AreEqual(_robotoFont, allFonts[0], "First should be primary"); + Assert.AreEqual(_notoEmojiFont, allFonts[1], "Second should be first added fallback"); + Assert.AreEqual(_robotoFont, allFonts[2], "Third should be second added fallback"); + } + + #endregion + + #region TryGetGlyphFont - Primary Font Tests + + [TestMethod] + public void TryGetGlyphFont_LatinChar_ShouldUsePrimaryFont() + { + // Arrange + var provider = new CustomFontProvider(_robotoFont); + provider.AddFallback(_notoEmojiFont); + + // Act + bool found = provider.TryGetGlyphFont(LatinA, out var font, out var glyphId); + + // Assert + Assert.IsTrue(found, "Should find glyph for 'A'"); + Assert.AreEqual(_robotoFont, font, "Should use primary font for Latin chars"); + Assert.AreNotEqual((ushort)0, glyphId, "GlyphId should not be .notdef"); + } + + [TestMethod] + public void TryGetGlyphFont_CharInBothFonts_ShouldPreferPrimaryFont() + { + // Arrange - both Roboto and NotoEmoji might have basic chars, + // but primary should always be preferred + var provider = new CustomFontProvider(_robotoFont); + provider.AddFallback(_notoEmojiFont); + + // Act + bool found = provider.TryGetGlyphFont(LatinA, out var font, out var glyphId); + + // Assert + Assert.IsTrue(found); + Assert.AreEqual(_robotoFont, font, "Primary font should always be preferred when it has the glyph"); + } + + #endregion + + #region TryGetGlyphFont - Fallback Tests + + [TestMethod] + public void TryGetGlyphFont_EmojiNotInPrimary_ShouldUseFallbackFont() + { + // Arrange + var provider = new CustomFontProvider(_robotoFont); + provider.AddFallback(_notoEmojiFont); + + // Verify preconditions: Roboto should NOT have the emoji glyph + bool robotoHasEmoji = _robotoFont.CmapTable.TryGetGlyphId(EmojiCodePoint, out _); + Assert.IsFalse(robotoHasEmoji, "Precondition: Roboto should not contain emoji U+1F600"); + + // Verify preconditions: NotoEmoji SHOULD have the emoji glyph + bool notoHasEmoji = _notoEmojiFont.CmapTable.TryGetGlyphId(EmojiCodePoint, out _); + Assert.IsTrue(notoHasEmoji, "Precondition: NotoEmoji should contain emoji U+1F600"); + + // Act + bool found = provider.TryGetGlyphFont(EmojiCodePoint, out var font, out var glyphId); + + // Assert + Assert.IsTrue(found, "Should find emoji glyph in fallback font"); + Assert.AreEqual(_notoEmojiFont, font, "Should return NotoEmoji as the fallback font"); + Assert.AreNotEqual((ushort)0, glyphId, "GlyphId should not be .notdef"); + } + + [TestMethod] + public void TryGetGlyphFont_EmojiWithMultipleFallbacks_ShouldUseFirstMatchingFallback() + { + // Arrange - add Roboto (no emoji) first, then NotoEmoji (has emoji) + var provider = new CustomFontProvider(_robotoFont); + provider.AddFallback(_robotoFont); // First fallback: also no emoji + provider.AddFallback(_notoEmojiFont); // Second fallback: has emoji + + // Act + bool found = provider.TryGetGlyphFont(EmojiCodePoint, out var font, out var glyphId); + + // Assert + Assert.IsTrue(found, "Should find emoji in second fallback"); + Assert.AreEqual(_notoEmojiFont, font, "Should return NotoEmoji (second fallback), not Roboto (first fallback)"); + Assert.AreNotEqual((ushort)0, glyphId); + } + + [TestMethod] + public void TryGetGlyphFont_MathSymbol_ShouldUseThirdFallback() + { + // Arrange - three-level fallback chain: Roboto → NotoEmoji → NotoSansMath + var provider = new CustomFontProvider(_robotoFont); + provider.AddFallback(_notoEmojiFont); + provider.AddFallback(_notoMathFont); + + // Verify preconditions + bool robotoHasMath = _robotoFont.CmapTable.TryGetGlyphId(IntegralCodePoint, out _); + Assert.IsFalse(robotoHasMath, "Precondition: Roboto should not contain ∫ (U+222B)"); + + bool emojiHasMath = _notoEmojiFont.CmapTable.TryGetGlyphId(IntegralCodePoint, out _); + Assert.IsFalse(emojiHasMath, "Precondition: NotoEmoji should not contain ∫ (U+222B)"); + + bool mathHasMath = _notoMathFont.CmapTable.TryGetGlyphId(IntegralCodePoint, out _); + Assert.IsTrue(mathHasMath, "Precondition: Noto Sans Math should contain ∫ (U+222B)"); + + // Act + bool found = provider.TryGetGlyphFont(IntegralCodePoint, out var font, out var glyphId); + + // Assert + Assert.IsTrue(found, "Should find ∫ in third fallback (Noto Sans Math)"); + Assert.AreEqual(_notoMathFont, font, "Should return Noto Sans Math as the resolving font"); + Assert.AreNotEqual((ushort)0, glyphId, "GlyphId should not be .notdef"); + } + + [TestMethod] + public void TryGetGlyphFont_ThreeFallbacks_EachFontResolvesItsOwnDomain() + { + // Arrange - full chain: Roboto → NotoEmoji → NotoSansMath + var provider = new CustomFontProvider(_robotoFont); + provider.AddFallback(_notoEmojiFont); + provider.AddFallback(_notoMathFont); + + // Act & Assert - Latin 'A' should resolve from primary (Roboto) + bool foundLatin = provider.TryGetGlyphFont(LatinA, out var latinFont, out var latinGlyphId); + Assert.IsTrue(foundLatin); + Assert.AreEqual(_robotoFont, latinFont, "Latin 'A' should come from Roboto (primary)"); + Assert.AreNotEqual((ushort)0, latinGlyphId); + + // Act & Assert - Emoji should resolve from first fallback (NotoEmoji) + bool foundEmoji = provider.TryGetGlyphFont(EmojiCodePoint, out var emojiFont, out var emojiGlyphId); + Assert.IsTrue(foundEmoji); + Assert.AreEqual(_notoEmojiFont, emojiFont, "Emoji should come from NotoEmoji (1st fallback)"); + Assert.AreNotEqual((ushort)0, emojiGlyphId); + + // Act & Assert - Math symbol should resolve from second fallback (NotoSansMath) + bool foundMath = provider.TryGetGlyphFont(IntegralCodePoint, out var mathFont, out var mathGlyphId); + Assert.IsTrue(foundMath); + Assert.AreEqual(_notoMathFont, mathFont, "∫ should come from Noto Sans Math (2nd fallback)"); + Assert.AreNotEqual((ushort)0, mathGlyphId); + + // Act & Assert - Unknown code point should fail gracefully + bool foundUnknown = provider.TryGetGlyphFont(PrivateUseCodePoint, out var unknownFont, out var unknownGlyphId); + Assert.IsFalse(foundUnknown); + Assert.AreEqual(_robotoFont, unknownFont, "Not found should return primary font"); + Assert.AreEqual((ushort)0, unknownGlyphId); + } + + #endregion + + #region TryGetGlyphFont - Not Found Tests + + [TestMethod] + public void TryGetGlyphFont_CharNotInAnyFont_ShouldReturnFalseWithPrimaryFont() + { + // Arrange + var provider = new CustomFontProvider(_robotoFont); + provider.AddFallback(_notoEmojiFont); + + // Act + bool found = provider.TryGetGlyphFont(PrivateUseCodePoint, out var font, out var glyphId); + + // Assert + Assert.IsFalse(found, "Should not find glyph in Private Use Area"); + Assert.AreEqual(_robotoFont, font, "Should return primary font even when not found"); + Assert.AreEqual((ushort)0, glyphId, "GlyphId should be .notdef (0)"); + } + + [TestMethod] + public void TryGetGlyphFont_NoFallbacks_CharNotInPrimary_ShouldReturnFalse() + { + // Arrange - no fallbacks added at all + var provider = new CustomFontProvider(_robotoFont); + + // Act + bool found = provider.TryGetGlyphFont(EmojiCodePoint, out var font, out var glyphId); + + // Assert + Assert.IsFalse(found, "Should not find emoji when no fallbacks are configured"); + Assert.AreEqual(_robotoFont, font, "Should still return primary font"); + Assert.AreEqual((ushort)0, glyphId, "Should return .notdef"); + } + + #endregion + + #region GetAllFonts Tests + + [TestMethod] + public void GetAllFonts_NoFallbacks_ShouldReturnOnlyPrimary() + { + // Arrange + var provider = new CustomFontProvider(_robotoFont); + + // Act + var allFonts = provider.GetAllFonts().ToList(); + + // Assert + Assert.AreEqual(1, allFonts.Count, "Should only contain primary font"); + Assert.AreEqual(_robotoFont, allFonts[0]); + } + + [TestMethod] + public void GetAllFonts_WithFallbacks_ShouldReturnPrimaryFirstThenFallbacks() + { + // Arrange + var provider = new CustomFontProvider(_robotoFont); + provider.AddFallback(_notoEmojiFont); + + // Act + var allFonts = provider.GetAllFonts().ToList(); + + // Assert + Assert.AreEqual(2, allFonts.Count); + Assert.AreEqual(_robotoFont, allFonts[0], "Primary font should be first"); + Assert.AreEqual(_notoEmojiFont, allFonts[1], "Fallback should come after primary"); + } + + [TestMethod] + public void GetAllFonts_CalledMultipleTimes_ShouldReturnConsistentResults() + { + // Arrange + var provider = new CustomFontProvider(_robotoFont); + provider.AddFallback(_notoEmojiFont); + + // Act + var firstCall = provider.GetAllFonts().ToList(); + var secondCall = provider.GetAllFonts().ToList(); + + // Assert + Assert.AreEqual(firstCall.Count, secondCall.Count); + for (int i = 0; i < firstCall.Count; i++) + { + Assert.AreEqual(firstCall[i], secondCall[i], $"Font at index {i} should be the same across calls"); + } + } + + #endregion + } +} \ No newline at end of file diff --git a/src/EPPlus.Fonts.OpenType.Tests/FontSubsetManagerTests.cs b/src/EPPlus.Fonts.OpenType.Tests/FontSubsetManagerTests.cs new file mode 100644 index 000000000..1db76fb91 --- /dev/null +++ b/src/EPPlus.Fonts.OpenType.Tests/FontSubsetManagerTests.cs @@ -0,0 +1,133 @@ +using EPPlus.Fonts.OpenType; +using Microsoft.VisualStudio.TestTools.UnitTesting; +using System.Collections.Generic; +using System.Linq; + +namespace EPPlus.Fonts.OpenType.Tests +{ + [TestClass] + public class FontSubsetManagerTests : FontTestBase + { + public override TestContext? TestContext { get; set; } + + // Helper: Load a real font for testing + private OpenTypeFont LoadTestFont() + { + // Adjust path to a font available in your test environment + return OpenTypeFonts.GetFontData(FontFolders, "Roboto", ignoreCache: true); + } + + [TestMethod] + public void CreateSubsettedProvider_WithAsciiText_ReturnsSubsettedPrimaryFont() + { + // Arrange + var font = LoadTestFont(); + var manager = new FontSubsetManager(font); + + // Act + manager.AddText("Hello World"); + var provider = manager.CreateSubsettedProvider(); + + // Assert - The subset should be a different (smaller) font instance + var subsetFont = provider.PrimaryFont; + Assert.IsNotNull(subsetFont); + Assert.IsTrue(subsetFont.IsSubset, "Primary font should be subsetted"); + + // Verify the subset contains the glyphs we need + foreach (char c in "Hello World") + { + ushort glyphId; + Assert.IsTrue( + subsetFont.CmapTable.TryGetGlyphId(c, out glyphId), + $"Subset should contain glyph for '{c}'"); + Assert.AreNotEqual((ushort)0, glyphId, $"Glyph for '{c}' should not be .notdef"); + } + } + + [TestMethod] + public void CreateSubsettedProvider_WithEmoji_SubsetsFallbackFont() + { + // Arrange + var font = LoadTestFont(); + var provider = new DefaultFontProvider(font); + var manager = new FontSubsetManager(provider); + + // Act - Add text with emoji (U+1F600 = 😀, handled by Noto Emoji fallback) + manager.AddText("Hello 😀"); + var subsettedProvider = manager.CreateSubsettedProvider(); + + // Assert - Should have primary + at least one fallback + var allFonts = subsettedProvider.GetAllFonts().ToList(); + Assert.IsTrue(allFonts.Count >= 2, + "Should have primary font + emoji fallback font"); + + // The fallback font should also be subsetted + var fallbackFont = allFonts[1]; + Assert.IsTrue(fallbackFont.IsSubset, + "Fallback (emoji) font should be subsetted"); + + // The subsetted emoji font should be much smaller than the original + var serialized = fallbackFont.Serialize(); + Assert.IsTrue(serialized.Length < 100 * 1024, + $"Subsetted emoji font should be small, was {serialized.Length / 1024} KB"); + } + + [TestMethod] + public void CreateSubsettedProvider_WithMultipleAddTextCalls_CollectsAllCodePoints() + { + // Arrange + var font = LoadTestFont(); + var manager = new FontSubsetManager(font); + + // Act - Add text in multiple calls (simulates scanning multiple cells) + manager.AddText("ABC"); + manager.AddText("DEF"); + manager.AddText("ADF"); // Overlapping characters + var provider = manager.CreateSubsettedProvider(); + + // Assert - All characters from all calls should be present + var subsetFont = provider.PrimaryFont; + foreach (char c in "ABCDEF") + { + ushort glyphId; + Assert.IsTrue( + subsetFont.CmapTable.TryGetGlyphId(c, out glyphId), + $"Subset should contain glyph for '{c}'"); + } + } + + [TestMethod] + public void CreateSubsettedProvider_UnusedFallbackFontsAreExcluded() + { + // Arrange - DefaultFontProvider has Noto Emoji + Noto Math as fallbacks + var font = LoadTestFont(); + var provider = new DefaultFontProvider(font); + var manager = new FontSubsetManager(provider); + + // Act - Only ASCII text, no emoji or math symbols + manager.AddText("Plain text only"); + var subsettedProvider = manager.CreateSubsettedProvider(); + + // Assert - Should only have the primary font (no fallbacks needed) + var allFonts = subsettedProvider.GetAllFonts().ToList(); + Assert.AreEqual(1, allFonts.Count, + "Only primary font should be included when no fallback glyphs are used"); + } + + [TestMethod] + public void AddText_WithNullOrEmpty_DoesNotThrow() + { + // Arrange + var font = LoadTestFont(); + var manager = new FontSubsetManager(font); + + // Act & Assert - Should handle gracefully + manager.AddText(null); + manager.AddText(""); + manager.AddText("A"); // Then add real text + + var provider = manager.CreateSubsettedProvider(); + Assert.IsNotNull(provider.PrimaryFont); + } + } +} \ No newline at end of file diff --git a/src/EPPlus.Fonts.OpenType.Tests/Fonts/NotoSansMath-Regular.ttf b/src/EPPlus.Fonts.OpenType.Tests/Fonts/NotoSansMath-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..7062ca131d84f7de5ed739422fbdc3e8fcfdc5e4 GIT binary patch literal 1004120 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%0DxSARYe$ivB2^w$ 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%0DadDA25#Vj!8UCnfP1J&P`9jK|a^yITU{~ z>p;#78x#~4Of%~|v`KT=rkZ9-fSUJs>#d~O<~L? zgf0wb0if!dq)Ds@rcoEL3u}N78of_hcjox9qenWU z>0}|57C01^YOr?mK#gkEgGhZJ@yCI;k7{-U1yu_Qa3boFIEn8xs1t{67axU|X$L3H zSrYbX$EN0iI!WA7GVY(f!*;97W^+gF4n7`POlAvSe{JL1P~YxMHp(+b68H{cB+!&q6*2U=ZOiz4ZE*)bS2UA+ERu)U1ns2^#4f)wj zP_){GSg$=sxwveQ4#$q<1{?`No}dCL(N*=XEhNS|N7hZ4C(_yEd22KkP~!?M5m6?Z ziteR`GlrjS$3`fc86L`{%x1bbYqXf_ppfsJShFJ)30Tj-TD!1b3CIoN3T><<&~FeM z5y!Ix-eVZkE&w}d1-GcX(Xj#jElm(`z2p(HQZ;c=&ctFj$Cu?>1|nZWL>G7%g+Qk2gCZ|#^fDeks=1hyh$T$&kbw3>lc_xxgdyvMHn_HCy-XQ1`^(E{N%#m)c7DbF;_j>+nD#rL#gJJ z(=|P~w8)iu6^`ef7PcttDU`@!3cSl#st+v(L@r%Q4>R`2d5n@am@#lMp5 z94kg_CmFy6_RQZUN>0`1Ix(|cIGJ1d_-uQuyPE3e-O{x$es*tfw)(!IBOj_Ny(O`0 z?*0|vl(SSw4*~oeIi&AaYS9QLwINM7+6Mic9OKAgpt}8m@0w77#!++KAYufRcmtBX z0MYOZh-*M>8EHfTD@a7W`{N_rge(Mg@QIgskay7Tzwh?_v-V-1=FYj>wx2z{v%S6s z5sVj7sVvWh$bqZbRbns+RHE6@2TCDi6QcMq@$1STNOL55)s9#zjB%QX_n^&)G4Yb! z6Li@5bbKtWIChrnnv~5}Rx7Vn?F(azi#)_jwDBlWEfDdtiB6}ehWLQJXKXX*Yn>gH zeRc_UQ-ws>*%-DI%3s{b_?@E1C3r(U&-hWaf~{~=vXNp zoA%`N(@)DjXxgr)5Or4u2N*E|c)jb+)QLSfaF+m*VjF89Q4%kRXuFlVELZ)pw&L*8 z4su>r44R3aRx_D$cvy#nKg;*)?_NLsCxe>|B@hU$gOC8zKmzzfWQEO

ul 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%0D_2BK5v=Zw`co?{a7h|SSfp9+&w}|w2@W{)(EQM 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≠ZI~|;vOUGgRT_vxtjRZ zi{Zjvfa;KJWBdeUJ8A0|{X`5fqY#hPViK!rVAaLV$C5|U-~v_z7XVuKuSA+>gXa3_ zn9g4BzjypX=N22h_DLnnw$9$%8oB(6Ji2!cGbMi7JK|9YPtSL!t=rtbucP%~%lf1B z%2zOSN{as}B(Xq-2B~4hU9rTZK;*)4C0}I{2C!izh=R$2{@fg!MQV&xzzU>v#1Mv6 z9ffui%?4gkke0hDgu#*{BAE~0Y3(sv9kl%j=MNnK$L%a)(7!^?)PQFyj^!7mCGs+ctMg z#o}sK+J2<}A!Bt7;d-%RT*HygajxM9hkG(DSyesBqHzu^{t6h~wP=@dFFZmBvxMq^ z^P*Cy1jTXCd_Z!MAJ0e^RN(f5;j&4VmZqG;pm}{N*=oc;L@OI%rKP_Es3%ROOxv{h zccG_}zcC$m*VQpuU3*=7b5ljMJW^B;3VL$UF)l+^%W5+hT>GSdDJcVl^C6CW{$T%d zx1ZnEd||W-s5KD{!Y95u(re68XJuz-TpFc5V9m?ZX*Ah^g5tJvpILeQ_}t*~DeOUZ zTzHs<6gYhL47*zE*R*#>ca|j{ z3$NR@p&&n`l(%Yox=QvHvB~h-?HdXT14?;2ycs#pHdSqS4Q@Q$0_!Q`T!yM6=t0{T zfG8nri!?0Ks2R@%OkQBfKV6MgK-D+7oDxmw6Eb#s!Fq%2E%^kzd#hfLR?ph`y-Eg3GEUf+AiY-IRS$8Mw^f^!=h&SsFUj7Op~x^F7VngIL`Gq zh^S=c+AIc_(M91u(ax2e7a%rtwOA>Mzfy&}C8d3sEWQS%dKxxV-*KC#M|Ys1uBx%Y z(0+7c@JHR7nZWg{FS)i`DoQDGrEOax-BKa znvs^ds=4;&ookj=Z7#3cV>bsQC4ova{=6hy=w4oL@s^HM&&6CTI@j!|{xhqtiSF25 zQyeJqdiQNVR$PL^s=!Rr1tTiP`{N$<0%8t`6h4hCPFdXeVVXfi%qxMI!!R;G`-uxX zci!{dOTS@%L@}|hMEY;ADnV>n5xSvUphBABF^aMiik6}SbDO_msa;@0MGH@^HDC)+ zuojzTVV1?4h4xe6Lz?}7Bar+H2}BS0kPprY&K&a(?rx}F+pJl>f_>=6>-R@n4h+^d z_NmeotsOB#^ZucpZH=ravT0{*>)x)Bn_Bh{cWel=;m#Hs6y%G&2KfrgKK&H96uc&h z4mz#~=sZA+-7>Wj;=LObU!_`s!V!{+fU1Wly*f?0Nqe6#;CG4_{f<(tI{rGp6fY4! zk1HEr^7_931OuxS@Ox1h6V{+!r_I#JBx)$XF%~XXvp+x#Tt<75(Ey*t_QQoC7j1I2zI;w(Qqcel*u7+IKCXYYY8z}xX7OD73 zA$tWonnS(fP%#zz38Px3Act4l&7?a6^bV4eBg;V_`AW*dSBiH#R3wF`DK~_xc7C0y zS*gqI3{}pp-@N{DcFWkY&iKf9N9{`m6UZvuxpCEtb2|r0Z-4hdU0GAt@{JfsGsM&h zEpDNKAm3CR2*W_QHdumsb03__0iYZN9|#g+!&nxS0H8`O+|sm|^$e5?Lv6I~%$eBg znqi~yCHC`hMMi0TW#W0kSl?aX_jk@ehpRCHsrI49wi^&$^fc6|P&2hC(Ry999K9B!JU`b6QT9WI^Iv=IPlo;!ON(FwJvAF++bNV;SXd>~t`K(}^|0Q3s-wWkJ0oq$r95BqOOp;`v)lE~(wYuX_8f)q=MQZGcV zq9VpHV*YaZ2YSvj<-Hp>vtRvaJ|eaCZiN(OV-d}=sZW@6aKFfg&c$R=TZD^v&K`@! z>z*E9*EO=mvE9^SDdv4TCESb?d;A!SXNiWX!I^q59QCj5LDePkG< zV9f=alMU#yQNF~K?a(>!JKCV1tW7J70nzfOb0iu8(!Aog-gMJ#4cmHJ;`^&=YpW{j zYF}dCz2m-%w@n=HsQ4qRA0HkX8ygx#AQLxoA!-(fWL{Z!?-Q92bOgzf>BM%E*K!MV zCl`SZiZ0;@&`;#Yul|u3T=L4iK0^`F+C)2;8^TXO3hn60C&z1>>&(wcIMGfQu5+1PX9+}>Ta75!b2SP=1-GXLlSNeGT%xO&_p z&{~w`?@!^sA{5M}m&!uWN~&;3dDO@YKZC0yT+fKYi`e3l&)^D`(9axW4&@g^fPjBW zriLUyR!H~tq^S9(QG3ky?X|wUk1R;i^szQg`i{mGONEJa)zc8BrTv%?#>0Y(q9k=~ zC4wM~P!gnz7unMnMG?ZD)!`%{_=c>#@RY0O>9A-WDn^@?` zsV_Dj3Iy(cRVS3oP0u{>jx8H6ecAJz%T0`^Rf%l#qIo8xY=yGQTG?WtT*0;@VFd!wg8`ux#0Q$DN7pp*9ZS7=hL0z@H_p8+meyLkn@@J$ViDu z*|g#btd_JL({yZ!)o*C&tP)ycvDi?>vdZbBt+yZBsw}T6u8$gGTiRPU#PXMKs+}nb zPd~Ezlb_r3Or*6k+JrIDr9$e@CVNUW)UR*cQ`xkn_E>7%8=--2VBFv6mu_g>-{2QS z;~oGsIxxTmg2{-i7@TdXRu?oA{8g@F)uf#yd)~44)UEqp%sG=)5Sq|E_;BXRP(jvR zLBoBw-g5t^LOI)JZuSPB!^YXM0E5^#7vwA+Z^*IRkXYe#WI@rxkp@u}fHS-mv0p(e zrG2L=8!(yAV=?i-2+DINFIq187(-QcIK|;HTg_pW7?Plq57fiB=eE1yxD{LF4@`{L zt!qAUxUsunMQLL=8g+CV?!8}cT07wCXspgzHqbCz{p54TGq#_y2XwQmO2g$Q4OM|t zVc;jQb1qqDybXOnJPjBt-0`k@V?dfM^oVe z)G>!l6$<|cHkJXW!6R#lH;KKCuyhUm;EaMyNJbXegsIj>bVV5vf<|8hhtY1dn@#v- z1DZXXQH>Mbsw=sNR29YAa+T>f%k@d$jXZv`V_I(-zVrB*yN}!nE9T4iFZR+ub6e)I z#}t=NoWAtWtd4b)IYVX*_C5bfli&t>h$_zlpYY<4Qt2EsJaUBKEsaD9+rvMezj3b{$ZDFk^@4xM2$L0nc*!CJ6 z*!l(>*kPR0qV4kX=RWtu)1PbD(%!OBIycx)-!g-13!{MaPG_>vS8JpU-Z~1WVzP8@p!~OB8!IAN%ekje! zNm81ah2hF?VEYA;`sF0l3Ux3AYG3dMP%AiwFamW>y;HJIvRSsI<3;Pl$`hhR3m3*X zjs9P!S2geMI^oVfHFJliIl}iHwFmlw2dXXSm_&E7iFj5Jp#?425EfnKw(aWRqM**KZ$6RbF#v@Dx z=tpurwkIchLL9AYiv~w&=F~v4w;?b)5ekDN$Q4QZPj7oNnC?o(e5#A&+d49 zN7vi*>_OvC$5-dK9_X!WZc%8I#a;O=y2fo?J^OpqH?P{(y?1lNz@d)41I^QMRyr-^=noZ+Mf8!wD~I*BDvs(VdN<`2w6={dpY-JWb89wqHuO)e#OmZ;DPWhe znI0J$aoh;9YUGfWN9GCXEfs_mS-BqLj;{!RbFrn`HKg;@zaFb}r}a*S_8xk~$o6aB z{y;eDYpX`UYWn59H71ihf4p_~S5|KuT>h<{(Nck>8x2`O+nT)?jtrve;fBZ?gs;Gv z@F(Fb9wftwr@X%?NPVJPsFt(B89~`v)t4E)bLH{uqVekXF+o`SvXG_qXU6*46F(Bn zBb6nCEh=By{PWQ9;VYLhi0|X_q0-f_4`fl{Xk?@(P!#L#IyLdw?f%M! z9lgt*I2)>EpRtCs_e>=EOG{38BKkPhG=M8E`#Dbd-vqsYga|Wt%?RfCpW|0D5z=!C z5f~0bajjjSkp`myFc0cfN$g6L)PfBmfTPGjYk+SfgBXzeyZCKr!Dz*+nyr1XseTPz$k0@z|{q1#Wrt>hv0gUbN6Y7<|^gGjaS!$R4J zz+p9TWJ_elVOHSyVJespFs#)uo!ZEA!$(QN!Xjv8;a8}iqqda9UO{1*)4je}ThruWX^ z`|e5nSuiKgvmJa3>FoXnt5WzTP%QB%7s?9rIEsZXd=iSqonsDTiSaDaup(X`;wYR( z4@(fBg=}JQa4yI7v9Z`{BfH&LwW6n^wbod6vbe~oH?&urntu6k)Gr8ulA`8^3iCVb z3$|^`FE1?FVzV~ceHodWt!s}#Ty;2NRk;4OkiQ$FScDK;&Dk!U3$76I%O&Gla)tPj z0*)oxRQxEhwEms-gLh2tJwEWZ;lhsm+RCEN{5oC3_MVx$M^EludH3+%s+sy&Tg_~3 ztOfgkd{yBV?86&Iv?MkkSbcJPPqR@NG&T3$)%#=*d;hj=i7EE}#1tk+Lbe7<%m_FM zxE45YuY+sB(3QEsgf@HeJH}9$<61}$5#y&xb1an{BHA=2G{eZX_~zo>TVu^TI%n%6 zPlOx%U&YJpLhH&-cWJbCQ}^tB6QhY&SiEXgyt=M(MMG^I6Sr{D3CTRNa2!?i zuMcQJ_&qX@*HlPo7O8v@%Obss;*AtQA<3|y9ykQ!hkfHUljY5O`{Ju>PAmGOt=7t7 z{jI$(A1d+$Y_a9-6UV#Cm&dgmCOU)BJabyZNbHm(2k*pE8SqVie;^B`w^51G=rMW7 z;(!cEikYAw$yOvTA36V5%TeEshJiblRW$v?xY;&v`^X|$+R?M({HT6wRqM?85lB-k z)>gZ+j!TmkTIyv;(;I@cBuSd?xoBih8Sj-O2wUUA(I~-F5FCtq$wlJ)2*jkJpx_`; z%!ET5i2sQ!Jj{esu|%yT{rh*{R>&*wDpRV)eT7a<+1WCu9ke)>nzjKx7yPd6d z%$E4T=5><1-i1xDA_lTHuFZkV!}<`a1#%&P&_KSujj9j`tN&l--UH08th^Gv=jNPq z&N;`rx6-Ygvnr`nr3xxZRm!Q=YP!`@t8=0S4F=rMG?;9U!FGeq8^`hZ4LD@OBY)g+ zrr)?!PK>JF|Iv}Bj)XhAXEs{C_O-TOJ#=fFf4cl+Za~I-{?@g{$A_7(G5s6Um#jO# zg;z%w-h*^GzYQ#mlxc~(F#hM2r#fDG>RZ>ISbXto%uQx{=U*Aw&Qm+jGM1gc$Hhaq z_?eNuq-*pY<4A)q{9T6h-h3z?m}|eO5d+=zrv~DKUV1ZrX8? zj2&UkeJS{#WRb^{LSa0+@$kAToOLU*kEirKSB?h1_J`izjFtbN9b-_NO^EoB*S=!! z>11>}uWw&(VZKBk{J-;m9S{DtKr$PEUb;Va7bGK#f_1VEp4^s9?w=cyBD%0!+l%T`_3jOer0NDFnFx~$*3n-D6Buba`?SR zo|`yAfPWsQxE%qO3mf$Tlj&i9NX?WqLm(OWo5ExsH)Z_AJTWAKq@66Z#P$SSz=1fY z(3G7c1Pm;3)PLEG@Gp;D8Mtq7JkJ+q^R>Zx+e+!erRYGm|8Ql?Ek5mqwc*P> zNqtb?IY1Dzr*ABN{Lx75^1_{sqH~#DE0AuxfPRXh~aq<-z{zGhfv_Cm&CCYJWld=}JCYQa_*2 zK6Y*S+40{VZ!0bH+qwcVf`gHf8O6v1u@3^w1h0qB2>m|YTY|w7F}syoCT#uOLrQLd zuKS@d0Nxf!L@aK^?8FfK<;Hzt$-5+ySSVf&s6Q~+(|cv;#A&It&DQOG*RV)Dmu@Qt zw8t0iUEye(DVT5%w6?nr)jPJj9y;$EiCdp_UOCIW?5fzeTVk%T8Y4s==XWte5fUNU z#b9XxDtS{(EEI4$kbM!lS%iTz=ICb7D-2YyDoCzgp}-g(LV`?#P1=!)iTQ=4VX^67 zf9YC~F9=0V0LebY=No?bOAp{@chq3gXj^Jl_legp{h`___c^ZeugNW{ErxgLkJJ{q z*FkYJE$qw(X?pEIf}O4>0%nMh!rZ{rFzp0-BwXkQH<}jRfHGKh7V4#0hC>-!Z7DH^ zw9FPzs+ff~{*3&3VD=tHi=ZI}Q;PmK?kw21-6OQ`8#VKcmRGOx|%zde6BI+z()qU(3GD9+{R@|9x6 zju$3%hRTqZk4JHK%z73!k;{iZ|dTRh0 z8a?nrpd*2K9yi5_SQ~B9j9qRVfJX2$0%9}*HsEK}auNWoVNZ!ch5c;nGV;G}Y}Hkd z^}u5O8qB9|=L-X!ajjG@y9L>G?R{G(wy#`iZC`k9=E#xzU_YzX2UnL0_UUTNsL_Lv zjdvJw{r?0`rh@kn+waT+bP9xvi^u|rt|VpSvh`W`AtI*A?lK4ElAMOT?q28BvH6TU z1*s*FB3Ll)lJr7A;$^hR3rQQ069YN~t|nmarNBSFhk4)5Yu~;9GSpfgeEGj$!rMMT zh9)ACr0q$<#FC-e3zL=*w6GA|Q?Ly2#{IrsGBlknUXY>DRzT$6EvuS{O(*7qB>aFN z5Y55TW06uz=;kx)bG@ma(5Vx?5x1+?^*F;=`Vzy{NX5Ohl*}Y23XyiXvSmVE4PSqG z_OZvc>O)53Z-5RBQigqQtFp2&+|kl`uD=u?z1ENC@d19d?3Q>)!y&@og3`Fa&-$)6 zek4-j@p(vz2l~xKFqM>e=p!}K8Ze^CTqi4`5t_2_pqYu^e6r`^h0@{TBq}`J{PIBe ziPpALgULc`s+MWFca=(WAwqw>8cYSVS96*H> zMBd7M@A_P;S*ymvB|i7SP|zEvL&4oU;oY|A_r-riL9 zmdJ~9LbYLT;ZbTfeHlJ1{k@;V`*`=SPEZBzDpJeNX43Bq&Jm$4FfVpK92BW76uWgo z&-yDjy&{c9By{x_<9+d9&&s%`7%>k7TB4?yJQEz^|M30RYF-nnL}&YYAKmWUN{uXM zjua*jhvS5t-h*wz|C1j>G>O3cfJkk_u3#XE$0Ruv9*)pnsW~AUwCvqt)b?&iVB_90 zVP`R_>XA}-_*8Fl#22v@y}7|~E*0$bc}L~3#etz)$7(vwF}Zf<3S+61R0kiXOLw zMC6CSjv~#`AiA?az*!|K_6Jh$;PxP*CW4(ejp9;cGz4P!+s0_@`y7vR=V*|E6x-Sq z+bwihqbQG(HOiL1+2_MxAO&F+WB2u`|3uO>xUH5SSi?s{AqJr%Wm&^ zt^p1)1ZaQ*=?Ah!mdqs5quR&#xOYtj5D&_>HdI@;&2hEM(QPEOnWv^Yg1&H}jOQM_PmK;wOgUFLch z_Mjmj-QRBu2Z>_$(NU)V`^rxt5tl@TczsI)ZppHjl>pVp=Vfw^?0Pc0H@ghJ;~seKN{pjz%Q3tb!c z>jqCqyyd7l9QI-^Mxexc!C)!0n2mXDsJyb#ck5JVCN%uoA5E{tnThP!kpw#}(-{nO z1UO$F>(NfYMiiw0bOWp5H8oblY^ND7pQP+)9vw8HL6#IqHVhb2N7jG=oBqGb|s4RJ?-mI~rc$HSX*21gPK#&Tt~+48{KG(j%AoTXuIiZg+)}ul)?) z^V+xACuN*yQQfEnG`n5l!Dx4J(%TA`iIA_8ukgt#VE&Na8KpJtcDLfeVm121V>W;< z2D%R)`;f;;J1PrllIc)6F!j-!OM+WvXbjJyIr#Tp9Z=>vciTI^hxzYtxs&pTZr+q9 zM|L0K$Dbe*Kc41~z4qb!1fjE%8~ZqIw~ZIpSeCRx%q>I$v(Sa8Ak8{a2i|QtMeunF ztdRA#=l9XowfC2VF*S~2YG`=auH0x9&rS}8@v%J+*m=SAf|pXkI&A2ckR*%tf)Bs) zNWau95`O2!e|+|xtMw41M1L(Yp!@#!cfRtC_~-B>_$3V7SYuQ$^T=jVG#xuID&ddZ zY-omJz6e&Z(qp_iq8W+}YoOo~qTgQ4P^?U<8H%|>giUy8ZbpDOW{q5a&xfoeC@vN< zu#%us*Iw1VyUlMXf^r5{61lXg5V;PuwzNxyo`qU>pQ7hxudI@rF=cP`3WcTo4CcM( zSgNbNll+J0sIzcRfBx00>^cqY8*3_>^CJsZ65E<>~np-+QJNArT+PuQ)f zP*0={-nli}cmP`ZYu>m2(s8-KJ=fYdAQtu9>JtiU`58-=@5P-?^%>JfZIGbc7i;LJBEv1E+~h5OGzho=4A-HA>oCN*%_y^$KbW9vY7 zcjw19)U`ovAEzXAtDL!uUK zu4oLEBXhmP|D?miKmI;5QJh)~#|msrM12qQXLw+JqrjmitaXwzzE!!+FvWZ58Yiko zcvvo5ZhpX0k2yt6)cmm>-J zKaV>Nl0ceLpn&_~4`q@O>yO`yxQ$_&tAX&x3_93e_|8kJ><+l%-gLg}n%sBVU<>#xKBv2@Fu7nh9o1T(jODf3 zds`NlagQCi$4~R$g9sBH-``9vlTHhk{Y-=C145bmKjx$`3Ad1Td`AdMoEi&E?bpI2 z&IOslSKCJg!s?i6xjt=s%J@`Glr{#;#twP8U**;^n$GCO`!;sIZ&t^p(lt4OBgc>y z%)y~q(d!+%!s)IG+VTzo349G+FUmYb2Z-J+ZJ30kBm<=%5%~vvLbZKJfKS1Dq5!ey zHmS-IxxYq?{};Xe5>XxDNi9ET&fd5PQ|>t=pX@gj9jFEU`=Gt!{$qdp+P97+NkH5K z6WvBV?!F%HK9v9YphOUN#rAlYvI3SsTUZ%M=CSS@sDDGj(qNRn`0UPq=6iO&sm*0| zhHP5H1Zikeg-1)`;sG8qS2w3(iL8grXew5T8IE5N;035sB{A*jhqT+{9cU~0Wkjh` z5T@h_iD1h50B%hPzi$#>dlptuBsEzTXCHl?_f8_X59tZb1ANcx$(fk7t*B!3J3k0a zM6Dfl+Yev+79;a7MS?Sd9kL4u|Kl&?=I(6rzApygXw+C@`_w4UKUu%^zHeW9rVqs; zMv9h4-{1M(ulx!wOEQdi+ z;e)@8%W>)sFaNZoJrr6n?#VZM@^E>dm=Z9+v4OV?>GTTN5GFQ z>2ZH9kVBtAgPJ6aKE}r-9eYy@LJ9!#iWr`{Gun5EL-3(oWHNrWJ{#&=t`_S?p?7tP z5qfkgWVyOnt4OGgw`h|CI;kuaA^C><==#uOC)+aNk)20mYOznWDUyaNrnqZsuESBY z#Y(A>#T4qJbi^M+PH6@}1wlX}FBu21k?eW}ANO8@ks%-}G_odpURkwBOVUajUYnBv z8CF|U*o1)KjUCl2BcKddb07dRo1GuAU%q_!)WT%TptWVCuhM6(y_#xu@-Nzq z-psr6Z|Is_H%}pLUp^;DbMdyaoPW8_BmiLJd9?!s3VO{X&zCuT{@cj z%J=xp&Y$aH9cKREg{@aVG5Z&IZ>^Y2TQnC>5%)uc6r*}pDH8X<$9mZ#1c`Y<=72vH zNKw^9j6N5L5%jH51G&@naAp1oOBPWLEhn#@@_9iCXIoreG%vjCXmaazvxnVaf{zy-6ze1=g#cTauqj61Z_J(Rl!(mszrrp*OB|RI2 z$pXkxLcC->2I3986J9#DH{-K?YLA%2AzlcRP)E}(40M^0hgh{o6r4y6WS`jMpV=II zzSI|-n^2;$SL>D{l`}kPV&1L$bk}%TEQt^Im8If<>C2(26_#J^-=6Nee70p1QQ-R2 zzw16S5=r&A?1OEIHXm-q4~yE!B1jLvW?Don_!=>*G(>^R6bb_ky+@c6I3EttWq@O{ zA42ajs52mP;q)E}oW!a0sl1_LJ)%uZ6T)9Ov87(ZJ*^TF9OXJg0PPQHBjD$^V6_GU`g zc3v)&uRTb70KrN}v6c z&FIscb$NMT#p+-l*m+T_@tEL&sP11FFCxy*@H`NHRXfcF4Y<=NzoJ&ylyAg);R{fR zBKDq?ILU7(@{KqT3!XiWdFVy_%SAqzmkt{#ee*nwhl6e-*gTt~!-kw3vk?_Tc5^MU z`^=NJqOm1tQ9g3{rbDC>7ayIe^j%C(Nv&$N-XM?3eaUyU4p;e}hfHbX;F-+v$XN0h zbSlx3NJZv7o}rAvjPO?KvY<(gtrd6#HWRZVMd4w)*9{Ch6<|c(!ac#=v>Cm~Be{ow zG$R_jA#heHsWcc3b?F>m>>l*{yea{smOz+Mv-7L1?e}kf zd*`|jx{RAbS)!*_v>LVj-j~SC#quUzNXxrtXsYFDZLmp=(6s4;9;oc~K<$^;5S;G1 zpHGwhpLrNR(&0VFdzKYdRD(JOl_Q}5q!b|yWQdI2?g0ccDS$E9Wlhx?@fmid@$Ra< zNa`rOUF}7wFBTmiW^xIku%{2qAH%LO)NB7C zM#b68p<<@}%*Ux-$b93iAay{tZ z;-fMZ7sHXjmh5nV+M*Bf8THo-rFSRAREFzW6b%TkM?tFo8KCN@BlT38Weqgsl z8Qv3|oMaMX0IkNnF-ysv9EzLriQbA-;x~UeR4^M{4z+i4V(6ijBCUV5uC;^3O28S10(@8)^HC^iYMoQIXBl7S|k)t)&)}sOq~GL z*+XC=7JvW3A#?8|{VG?wZQh`iif#&}GWUmM*H17#J74GoT+;HcdSG=U{>*b2jv<)( zzrbW6tQ}C_IjKbg?=*E5Y1|Zouch-DzAAvT9d;<=(wn%u&LWxF4V^`?~4?Zd;cJ9S?f9V$?{PA@!|GPDWg2HcIL>&%j@F5 zV*_mmvik=j$5&Z}Ks1dCPT0zz*GI6uD@uN31RwrMw2ljWmT&@$kT`)7NdpZEDVC;DNALHIbQk|B*MA~vYI~$zrN~5{ zf9Uz%S+hngyeSf?&Bq@bV09OdG4`Fm>F9F{`7gb;DVnI7r_HDK%_eL-(s=G)dMY7r2X2BLxH4HMe>l@YP3hWHsD#5oyt9%!|Dp$17sW#Z`_uHLD^UY)J{bG^3M?U`O|j@QygD6sXPYX+Y7Dr3rapOY;RJjR+DYhyaQFu!4x}480nu za`S|X1aqfposc(0b}f@sH6Hb+18EZUp)BuXOT`HKnw&RFxyU8(rAF?7HBMORaQnpY zfqf=g+VHeS+sDFvTBft+9r1c+f~PNqdozR3a4RX~#Xx2#W;wM{J$=|2bK9jV$;gz& za!#jz?wR?I+>Evz>$)@?PIhgzlN)ZZCa9!igAH_VNyme^DnMCiI#Ln^o`%FKEUA7k ziGpf6qJJxwqEaG-zyI_IN2JJ(>VMn#8_dyA2jNo07yG+!Zgo&!(%E@LqLFMh*c3sy zl9v#Lw}AgXQ=il#RUo>Kuv~W$V?=m`^nu7w@z$WtM^cJvmEl!;tG)G(A`}@Dv0#8x zWNcwtl&pQFutB46gvrYmF=1rc47${{MVm<|HgkDO$0YWe!6m+*Z-XlfGp$zUOoCmCTqQ%G# zJON$yX)!il;65=%erv}et6}G_uh@%8hr^;YNOhWosbkuzX5#nRs(G*1p|nbT^6s(Z zTzKctLTlT{;PXX-BVuXKWEScWS^w&p?Nq=m609h(_6A^0{{Yt11bZ6cfhns%%Pq?CN~iQY{C_8icMbWf z17dNyd(czr6~ij^<3?BEe8aoaiq-@1BngVB%L>tYBWmnXRDiSTNI6=@_rjr+1mPPi zDML4}G$$zwZPJ;_vLAP)6~Vm%?=C8_=SF4}^56%qt(|GVx{x0*qL>~kSKF;J$$YFe zq)W!)?Qy3}*Y-VyT&a>Mm)ApUl`nqe;`ZuGOCh7gCXFPK?!}xMyPO$M4bDburNZ2H z#Z2P7ez=V9z-3rralxXwm$ag9Y_GH;Ces^8D{{t!_z)Uq?R6L=6x{VDWOF(V2?PDp zcD2G|ylNCYXTBn16z0cIwhxFz?%`OvsC3@%P`Xq3Zt#tFW({72+D?2)e#(37SahSt zI*$`QwMQQ%9;LDz@y+BXiPq8xme~=03f?5e`*k+!S2s2*0N|#pY|jAz9F3Z#7jsVx zb;+iK0gO%bu-L9jczjN~pAdNuoQLr90OQaBxPI5uu&3W~5*!W1#bXhIiaH$}kqXB7 zF1$qX8xa%#uFx0gzkX;9PZOC+II_oUE2m|BCzL{Ks$J@BOG?CTU9&EEq8H4>Bwt`t zD_YI^4U1!9!W-N9;;=PrJ{4&7JNf*4-auvuF;>%9rljKAXv_FhQ4?7nGcNrm{6yMl zot(oma)b21(I-SB5!yTRYzxb2M>c5e3Ko3YkUSYg z8`*an%O!)qz;$N4k{Fmz&J`zS+>tD%z&2h{oSy__h+c*VD2$EXV1Urq8X;}70PCn5 z@pZ&$1X6&Z+Y6Mv9gbtEdZZj4KHZlc^C#^EZ>BqtiiSG<{t0<(VQ~1?@tR(DR-x@X zUCZPwy8HAd3@f?k&m0(55@)f}^^Urn{o$>19Gk=XCPYU%tmGUn>cWE`q(XAT$`<{J z_B4X7U7q!B&7W*{Y7|N)*CZ?|x%#0943DRlxDk3sJ?^0dgAWkBM#vBE)4MBE}2H9NWdqNr$ z9YrL8#0(%KMRZW`B#+0P0nt4mXd?cJy`L}EiC_dcmMq0mEadqaKbv4QsAU20tVyWR zWH}%*1F!H#-tV@%Q?g@|nnjs;W5Qpxgw-CS6O@lr)>B((iv2z1WqB;Y{AGVEwlSen zoD$2TKKHpDeSRj3ajW3*wlQwNMR|Y3+I_tn3Fv-8B}5@{@F!bx#kE0JKB0H4U5j@|G-nox62{@h6d*YdxE0K7eclkDLaUVHS8xbGlWWn0{15i|ddK9Ze~Y4*0bCyxhpDS%*jk}X6eSh<7%#L+*=$`z8eE4ZC11L$6VSsqRD2VeV0 zewsK@H2P?xCQ16Zh>R_ zV#(Z{SBeWYc%_&>f}5~yZ`g}|4|SA-Lf(K}3QZ9FR?zMQ`+L!oNq)-A!Uj}xZ z2dc^&^`hTpm~u~iF9IstnUYwaEu@uv(r1@7L97jeTnOz&e}I{~OC85!mFQy~s_r*F z0&93kn01(+puOn#C}kX=rQXqNp39+{yC)9vQd`+(^Mj<>{Ao0s_jscIypL@* ze`BNN0&O;bU-x!ftR*!t6DGU1iPOJC-{G4yo4+eFm9?2ZyfWC5X1GJ5an6U4446__ z!A&BTM+Do_gw+n5gn4DWv)MdW5Gs;)l34M^S(nCga?Qz4oFmQV%h5jCM?GIbvw4{` z_{wg`j_r$w0uGr)JHUa-xfoPHTnD>A#@fUcEx6osr;$_VQ zjNBHV=#;`pkdSw8Ubd&lJXR_Ar5w!<_-}+lJG%ibphcE5`#Z&PUvNAYtoYDl{w#XT z$1>`X*<+rr&t{Urz5X|(&eEo;G|>jIBoZ*YJ?7aQ8?|)E_z+&L9EyWPXOewzY?$8D zW1hoW3A6Tp*2hSb`J?p}+tZe(TNr`WxTnj!bO2rE&+YtBq7fPNGU;jBX8s!NedakX1W;?j$AhZhFZ4W5`pnDGXZ|JHXZ~A;e!H#5zyx0V zCVt~2me4$YWAGk*=68v@jyl_Up6fGD16&n;FN$k>*}EKP*8pMVUG{E-q}|BHB!Vs5 z6Cehn&%9B1@q>8Bq|veF*EA5v#n)OML%7M<>x|z93_yJ3sOd#w?xf#vi=) z&DTkv`QVak=U;K(4m|&JxNilot1fGbAhYADCU0kNAVv=y48nGay@jSeazx_zhqE83 zUi>{Mybho`>1nz*4*ltLfwAc{?0zdVm)^^4TcjWWpBa?~;QZ`wkE=^)1ka*(<#X zXP7f$A)Y`i5)0ruNy4^=VZ0xjt;d_^0iDG>BncjDIO#SQI)LLY!U#0@$oWA2r{p7> ze^j3f^)6R4y#}G{>;xn5>Qq)mT$k#W3RR)9HP#BLQ(wT93mAOz)y;v&PPV6mgF8=2 z6rzCWl1LiJYoo3!!xekGJ(5oj%tUf2E^vDpXpIFhHYmwZ6QLdN(HQP6QIg4Sp=cPy zSC=(qOW`V(BsO^Nku*I>Nd{NrASF5ZVMEu+(Ie*;$6E)?<)g#pUQ_kwJ8BG5$yhAz zQZ3>LZT)S=u;hHsvj0cs?9e6C?R+W1;`Ny`v2BkPQk zmbXiV=Tum$!ro!cZAIJp<@8tn7xSZ?KehCm#{T0ww?F^!nQ!2|9>F|+A4S2k4a#!- zjVQ~(0K*GpgIUV(1(x+Dlx5EKbDZUHgl>{$@}n!sD<{2f2*Y+9ja38v0asER^prY! zZwv=YE|)LX>J7^)3%Tw0+8wn-Z7l4vpRhPw9=*$JkDuzAzd3kcax@d_u&FwxQ*lDJ zs3SVq!Fr7Y%`@-qU>^awEs97%#Gx{7lJjG`0a*_W2S)E{WeSzpA{5eY@3!K%3wS#-#)o!zQg~UPV8TCi8T+wSA*V%Tk?Le@FV;!??kd-@$h#>YV}} z3gi^BqWeFZROrPon1VWEfaOBdo%J*oZ=_QcLSsIM$b|r9w-GuE{L>_Xy>z>oXVXNS zWU#M&9lz!TR>x_q4kNA3z9|vfa4#Zs*nnkufC+s2i8fU5-~Ze-gjgzV*JD3#SvuJC1$uaCL+6W7kVGb7|*8iQI+DM79l?HS-uO zh=Di!DocfCU*KNhQxavt=o7Gd?_u5=cNjVUe!4W}ba25RMYk|782Q|=c=FvNEMMAc zD9eXiY&Pcpoe#2n=}VL^-TL~!U?Xx1_|gyE$(JULh9K_>!tot^Y4)b?O`6_MsOAQ} zk&n>u<83mkzu>Hz+RR$d?aQ|v0-3P*$V^w~rCh(tsWBL=lB^<_dCcj4H{X9v+%7Y+_dY|A$fiFRclYN+@NZC2u+TVJ0mSm!e=)+thJebucQg z%iTtWMrKvD$lG#PB8$<)aP}K~w=ZK8@-GWS_U`tbGwlHZ|AJVC$0JeUOPEt(-gBS# z+OUIx0NNzfu_3HN6iPFR{iJFxHt}M~5DxJT_Cy4Z2guh%m0`~*!ZntfedmcJ{m1er zq=C1=)CO2CNq+Knk5U`W4Vp7AOtMUEt2Cv{l^C(7*XHpl1dK#31XWwV^P9D{OUJ*t z^OWBzWG)G1$)2vX#Uzhs41}vq5|o!7#0p{)oeCVLo7Scb@HKn0$5JJhL`q%tlIGjMod7;nxO@!MVZl zGbW*;8Z8bQ`NFd&%@FfTZ1&~7F^|sDUd|1t!P4e1L%vut}beH-cQmrT;lWfVgT%jBomC_m!h-udIUWJraA0St^W8xs%z^$y=mMb{ca#g~#yoM(c7d zRuPHP8V{kPStaQ-$Xg@po`JJ6bH~WRMKT8vt?`(t#X6Y~ex5&+B>N=Ld63<^MQDh- zs1pHV8X*m1byx%fkvsI#*yA(l5r4*-cg1?6#%!Xy!iF+gv%&4scHKVlvkR0YP+Ba7 zazVXwoJKKx-Z5DG&tvitiQg&qwZmp0fF#;<2iV}aaZ*$xOBJd+q}1JjTIzsV;613A zZ$rwr!8)vfbV!)uccF@xM^+;$-TWhyjKX@stCvZVgPXBZRjxpb^-ya}u5igmADP^| zuW&BBUQI3zr|vu4-Eqj~9_|_-+d@c$pU1shc=L6jyA859`xF!wx(jEV6bSGHU@2nu z@8ObDwCIiLOQZQ4pIisFD zY*+W*?pIh6Et8P9=L=sTeDhai9b4T@_s*-8;^b_2c|GahI2nKPSuDMauWJPs%vqwL zKU-HyB?w(mK;K<_X3BLSGnT+4P2xF;v=F?)7ZT{Sd6+u2pdXh5CEcK-_X=t(f!ZuA z`3+VVa~SbDS$)`l!SQJsX@35~%JfRLEAFcp=MT3ZF3h}tD>GOd3EAyVhwOX*O?hSW z^e4+x@mm9xR_V^_dU3ga{DVhC-(i+zV`nOn97VK~V5EN=@*qLpyALqZiF6 zEI4>IUeVj;u_qaQN#?Z3-8!o=XfAc?!k>Ka&fk@!PN%}EwVM5&WZt24e)#*$(_am` zgrX~AX-n6;8S&1AKk^}zxhRo(Ic7?MiVx_RO=-Bs&v? zg>@UBnomA8)S$e(cK*8B9!yn`-*?aEs(R#{x5bSIW$`EG#w zWJi`FJ?K_dPxOR6!AmD=7nWT~lR+#Kw)8mc&lpTE-d_0lW3kTbZKntO+csKr2}}tR zKM^{fpLedVZ*b#1h$+1QLmKp^1{gwhR@d0Iya(;L6AU>4Af;JWp2uIaR_32(UeU3>t=z5ETy^oyipq{u|T^B1w`E-M^ zSH)xf9&#_jqhG2o?BUU4KOdSI-hl5V=Ih4Yc=f~?--Ayd@bBl-BM08cr*H0PKrYNZ z2x*zxFxPkC(=(p#nJ`54Bu=?irfUfn3rev_>hjhW+=~}WmG#b{#TYYW?NX)3E?wg@ z0k6;7Dv#BnZDms172wmKkZ1}qTgIsOs4dRx&x@+_xsLfX+9XKz(z8QPovkzfpTec6 zbtD5J!ly@ljQ>N}fJ~E54|x_r(qlwNYkmrYPWklvj{RHl>EltK*Jjacv86e~WOnDk zT?qBWwMq6d>c#x6#6Zlf+xhMddnpC&02SfXr_He*h)*-#o7UEn-{ScKNZbw~<$M&hZ0(($-mX;0-lRC2y#X975cl;EA55&tV#-4ndSymj8Qb^8E< zk=2=DhfpM5>+XygA%HFz?SNkchb;zMA0^C7Fv_v?`N-4}Zm`@!#H~GS{7AOn($=w| zd!5S1DSX~>@)aQ*I7pjwhq7s}2irQekcR4IdUv(?5ulMt+%N;gOi;D{3jPAbC=sLg zD~;pGS@7^`2<#)uLqZkO8xYsg@GgSa&FzV@5NI$WF>h2mN(r|=83>|AesjFsiuU9q z&v!qW7fJNDe+G=c-av;Z^0FO+*5Uq7T!Mub0dHKUj$VB!s)Tp^Y#u9If0 z0uhR+z%IZ6L6u4YU9m-s1&@#aBKDW50T}Y8;j!ho>MTzx5lE!OyuXF3ql?K~y|@Aw zAAYlo^2Kugowuw&sEfPBUwdx%-}?DUjV{3OZol)Hr>;ME`QrA;>B-UIuFh&DpAAEB z7V1HtVm_r26D|hzON~iN^I+s-NRk_W*u8kzl1%*=2}bG3bkP&PP3JBvMULs*n6P4r z8(*L&kr|JR(b?Ygh7{i>lN_dlt_U-y){hG`|ET#N&9wPc1%J@tH=8|%bi93WH0l{h zs1pX2M{gKJ`etwm(ahm^)Z-e7PlWk#h)BXuu5 ztZ>HSnq1jyu-Jt{r9t7hPdzi=^H4>X(9e# zwWz|EM)OwWoUqSAV^=IQSkw!Q!D=i%(;c-1weo1iCB6Bk0kl zko^H=WsUA2ZtBlLJX4DvIE`cSH5T*<49hnlA4k0_K1oTI9p+U!{Qz76dGl-jY z0y;6dL>GmItNp8axx8oa#7yjTx?u0Pa5U&~Zh1DZJ#;aV%v4t2@l3zh(^5&y4<-`s zSj7W-AXdcs63KFUbY*7nnZDs(z0ti;DsRiN0nw0gO2+EFHH z*aTh(`j08as6vo&x*2 zNa<0$hSGfxHYxCBGTypW2@^s*)W~Pm_+H@HbH0U&r_UEnZRUd8L%ru0+C0T% zX1XgTCbWw9@X^xLcyZy(mD1#W(NtKjkhtyPVD`}YdUP-}ealsGOgzx<_6KrmTkFKm zKMv(%Q!#%aQUD0&u=)%}|7Oqhk*C7JcxHTMC6df$r%zTr26@~0#o|P*ZF{!emkN7C zNL1w3)Rp%6cb{p~>%y%n&CyStX*rt=pQ#+XwJ?%EgrL)#1jkn4>#rt|) z?W1BYDscxKt$=g1L-28E>U@!hh)yP#A_{^VBiq8UFGnooZ}Y?&Mx_+1ws=aOM4^fg@VqwThWXvh0fE#pV z(m1vGMVx`1Aby~#_#77I2VE<<+~{mTZz`?#v<&$DMW-w72`d1#xg7>$)Y+Daj^-ro zZ7E09nwiXZwN}^LecotYj&h4c9PS823z5G0D#KTW^fFCWURo@79&Y!GOnFCct{lPV zH7~Sp(oO+itjT!Hc4yw3>cT}#dcIZbuo!g<_jOdeDu?sl=v0qQZ`WnVQrT>5tS!L& zvQ96ONHrLAH;l}A{$FCF?G4^{>sErC-Gimqco}Y@AZ*fVtpYlZ0NC zo($7Ll(wit+Ce|=jdvcY^yP~ovqvovh&<&$q`$jA)_ra!ov=A-1+P#l(J3qQYqjx6 z-skq&tqzB;a$knR%59|X82G@XOhUgIeTrTW#_jOJt44QtY#0YJwVPa zkGvrBTQ!)3F_~C0u+`_6i1dz@iB6SLB45=>4Qai<95DO)y+VoL`Hxc5@z4CgWo?TRDC7^wi|oNO!$jPQ-j@_G{F`m@hNSs@=$7@2HRffYcL7VF~{s z>z$4YG17=bu|P>dEw(b^7k3g>YM6r%55xRcAA)p}0n4$&4RejaAC+XP%!Fm7}4#%wd&Sptnj?*=Y0` z6ox0K`jdjTv&((qpfcWOOSYm#nFE4JT4%;mJwC3}`dv(NI9Zr#iyF~ATVk2tNQA0h zCf<@?o@n(IV$scwQMJwK^>v5@0z=&2e%9wp@V{K1Kd~8Al?TQK9DxwV#E4vfivM@K zmwCU4%=W1y+MR#oecMhUBYao~x*{1DwL~qGU_7K`JP4Yl6f$H{3xrA%ND!5_>sZ-p znOwa^Vm^qc6H6|{ux{F{ z;brD!)&w8S8n`9ME)cSmh))IzR#6LB`--30pslggNC}HwmUOrXahOdm$l4QN<#8iU zM{}QNrzdb%C2kvZMS41S{m+#;J#vyWgnVY5*pv*_mm_kEx@*`Z5y>Q$$tmAx-P+n( z(3)&EwaO@z89Ii7BD_JqdwA4iGYW-bu~V#;E4$_vLs&gZXT<9>w^k!7o9prZ;@LSv z#^FqQb#k>XTgvLCBC%MLtF~BtwRphM;?URTukn{bGqd~0`;!)pJToBoq*JPF#iw!F z#6pcmVs{vpMvN(!t!$P^#S&}P!3;b%Va~?w4x>6@GI)i2QG6(i+*K@yjF*h)b7od5 zLsElS9`6}NWGYm9YXh63dSm|+r|P|q!)sA=Z|bpb4hOeT{OL(J6iKucoMDbz?!V;jUX@?KvNOv7SM@{aP} z`RY6)krE`%0VkW{5o~!8RucG&6zfa|7+D4>9c&d?gRSgAp@`3?wz5}(%0U`eBj4D1 zgKwa6*!aR?-7^g#u&JZdM@L8M9o3dt1nsp@JyNT9lgy-&jgLvLg}10j(`}Mvk@Zz+ zL`RJ!$>rpYA>qI#>I(5Sww|bFwa9Q4AuR8FB6)Hxy;*r;YI0`i-Pcpy6|GVxlBgwm zdA#!U6Hh#+7xCpPRLs?BueWSYm#VV~wOAz248}6C__?cR{u;J!$jW@X)0=lL`bnBT{Uzx>RLj*$1cq<&DtPowU?T5%5qG~hN%9gC&|Ll5_uqc!6OTRo(A6tv zPOY!b9UA}4#AkZoZ32FD{Di(1N%r(?e85g-*oz1W3h)!L8f=3>YAl+u192TR*2A1; z3okT;W5Ych;|ev+^PA_CEA-MZNcaLFgHmXM{4OrapckZ322D7*Y?6yLV7vHVjAcv) zqe&oP!R<2UYY##JE^3Aoo%W9!Sp$+s{G=-k=M8u<$3k4FH!d=Z@G=Z`d-DnAQ zzV;X8UJo0k*qkku+U!^&+UsX33wFEPtTw6D#nzlcu7{>Tx!z?D*dkabinz;s=4U#)@%|Ta151LCJ-bId4J2Hpw5b*KrB|JQ=W;@id5O{ zwfA~dW~o$Zs#P8m@g*|yZ; zJ>pbLu%oSecsi8`7Y<*p3xv+$sK4Eo*$N>T5g0qCGLe2?{1EfF zK5VV5kELt|gI{Ax?X)JVrr=P_Q4AL3hLAnr^_nshC1I?s(^^^^L9=ABKnk0|q$f5? zEuD6L+d~%)7vrATsnZJx|O%MOgihpYhQ9X z&3?1P>?92w5F`la;N_m=eUnA%Ro9QV`%p4Xp?m_6kphQwst4Lu88+ zf(n@5$B;FOAH$|j5>?Q4GwV{AeG*u3myGQVK;HNZZ}GygJHRI|o?lud@IqUSlyFh4 zd6Icj&cX`RuIx(<5s{MW44V)NXk1GCBKgxmFmV))5r%;?G%y9!z0#@ zhAmJFo=DdVQJ*E2R!P-fyQ8zSX33s8y8$DFv^>LZAbHe* zX2S7cLWEx8RKASMz}W!ifEA~4W5X`Puv_*Wz&e&#_>ZeJ(NO$I`p6g7DxHO}%ayd7 zG^x<+FU%$;{e4y$pD$A@6cgU8F68z`3|gDq?B9|p*FVs9^$YdHJ2$`lYaO+8m)Gp{ zi-c;kA@J(2F5ikBk_pko@_cXqD@&gr+_dCe2CYzF()uU6Tl0FfMq*Iloa zQi-77VbiD;GTtyVOuA-c>n%(k3${}~T4{(d5-Ue@FeJ>dVbticpa@r*O=^(W$k%O_6A zPcC&neE-RbWFZxkfkThy2`BpA_t47Iso|ED3zs*2<;rGX@kGfZ*O^C;tj>CZ{(LHZ z_TovZPeXE*kKiS)1D^O;UA4V99uk5Ohb|igMJF9)3fRF0!J1}W7oi$25o&^l;|x5ksf^AKob|F^*hd9yDs)*TG**v2$)jo$8jHWmRpme`YZX1&=R znRuEzp(ZZCCc!!NI4o>U0~u;o%pkvTxFiWaES#yKeu#Vmlfn?k17q=}>6K#8>2_GW z=19$X=<&KIsMlD85|gJCe)x;-iEPgk*H$X%-!L~~6DyHd3I&3W?XK2=^3ez1Iecsa z+vgM#t;%nipT4~kxcWh+Jv~zox!RZH1C><8ZLzulD5pv9e_+khGp6a(YaEQ-h_jC@Z~ z1Vf9G2nxZ7kChC9?=|)ZS|1^p=bK&wlj4o8;eIREz?!}HHR{#3^cd20!0R2{LvZjJ ziI#nbX3+e4VP^Tz^2AtsYas^)jmK)%s4&~6nQ4Nd(S^;%HF_Goa-|T=5*)ScfylXV zmWyeqiRAnnLLCwWQ5pvq$Xrfl#``17m1m!r&z#;~C}t9l_SURZD3VEqqVDs3wa&`Y zh5Je?TZP|$1M!-y8v5`&A& z@nk;QI}I39;ZjA+qgQ&`D!I)gLy3)sp)DT-MqwHk-#t z_U{pM@Bms;zs!54{^TRqrUX*)I>VPfX*Ixw)KTsbj`9@1EEQPTQbZb3V3tCeN+zTP z0~sM0$N`$kVI7dMNJ#1?;mHtCqwFE#DHpN)c_RE5s~Ji?_z7^w2j2IdcR%!wt5?pR z-rQI@GCR}X+fvSA3y4-jU@-zn?`46pnF>iK@cOyMN)|Bthr|f?gwR++u*Wj6xR`}P zom_0eMzC!D&Luqi)1GFo&wtJn(ik;*ryb+AC`hzjFv> zc9mPI0Hdo~IeW&h)yU-<@Xh-|a7LZG&wZrT zkTAR2JZw=rkW0!kCBMPq5(+hHkZY;sY2^&e^?A3n;6@ywGOQO?8S~^ zqH5j5DDanJfr}yq_P`0 zUm&LyA=oEc5hA@e*_ee?g_JBd(OP48^Rp9U-SygP>uMnvi+Egit40M;!YWfG28*GQ z2wuqDiZ{e~nK=@`n^tc~K+Y}%>KLN9A$-gRa*6`rk2q)L^?WWD(FqyiI|neL0J^eR$Xc zw>8v0JmhwV^s#}(tjr*hxsp~4*_}n0&Sx$hy}v4vXmyuYPQP>rb}In4_hT?Nj`RL6 z7MD`@A|+bK%?tu(qD?n;4}iEt#8nA=lx;Axc~T)5U9f6E45b7ySDu*bxSUQEGZRPGV$pE4dt%(Hv`8h97JFu)KXxpAa$_T+qqWq)wH zMy@v|-AUZ=w=6DhhD!X4*M=EG&VM4*;$6t{LV1NVb-H71+*3$WYB6QRpGditzpcOo1OIVAlplf?ZBzh-f(1k8xsG z6N~EulHg89#2`VcibZ(fTf1K%%QkhdFNnp6Ih)mh#+T~3yPQu~`Tp~1l*nesBs|ny zICuQm)I=m4izK3CRuEu{{$W!*4x{4MDH;66O63@O`=*G*g7|~W`REh@VG7-)_N-R! z(!>S;3KcA={rW>+f6vgeLYqz$H)nF$ROEki_a0D^UFUgVy~;V~oO8~htGcRFbyw${ z!*rOQ9Du=K25|-;0RkWdFo~i_Pz<8PH6@t}t87a?@~&*@cr97M++FRltd-^CwM==n z;!3ubgZ=J(uX=iBkY$}cXL*KXzp7WSyYBt(pTGY*JiAf)fv7#7Mja$Pc$)LWbaLHx?|qwXNeSL)**9!V#RHjlqI zkmI+t5%b|6>}3iHQ7%<}_Tw)!GKIv%#$Gacm6UaL~T`MJZ~(LCh*khlS<&l9~) zlcM(pj(Wilxv$hNK&)7oh|^qZE@^+FpdOI5h*jFpr^0C!T>W)vC+#geQA<)NLB-HFa5TL-KR>Jx zqx=2Lc&u3p@9fRyl9Op~OCwm>4f*Z%pvNGyNCd^Db63tS*$noXvEDEQO&T~`jTPNa zbAGJIfBiPAu@J=kE8Y#>ud?b$e#~G_KZ5{@G;iWU&R%fZs=`C-wGa*dCyuL#hf&3l zHyI>RCLoy((C#us;Ak^67eW$W;Qc-+m(%`FPFzoa8gKyg;~j2q&dqd32bnH{+)9bxV#6I0X!N1 z7}MrK66N@S$>IvNg3ZSg(Sl#Yj}F^%*+?2iUY$l23OU4jtrO$eyzhB7?_v|+U)7^IiEJ*a*nlum540OwnNi(YpNEnl#LQ&yWP2# z$>bz*y$n&q<6B!#x@IN;S@`z7|HS_txPY6e2VdjeW=d`IE+Y{-V1~{OSygh8LisqO zq9dhUP&Qqj0J%Q_HXSk~;y))t%3P`7E6)S|&0|yw=Ddzk;pD1#M;bKXh>A)Iv-s!YgW@&?*;q)Qjh z{mL^Yvp|$u@m8jb_MC0-*kQG2*OQ){b!rUa3vt z_9WeLxhntqurO}ZD=(~Tyi#R%`ss=3SZKCuHbzI)YcCaS<1vvO;x_6)f4RgnJEG5? z-JMDbertG8U*}jU12q;H1{%0(bC;0d7>0K^B>W2K(g_(yfs9ApK5!$NW;4j z2+#NUBJmEqliki>(ggfW3-(M5$Ck{N`1^s+EG^{GE)J|aVOB>w$)oU@zF}Z9Ds-Q@ z&6G&QeA1eCT3ZkZ4WuGOq=D^fFh=?tY9WdU0GjLV(OS+I^;-4rfFt|NRBfp2E?XyF z9q#Nn6=IQh=#!(K`Fdl-Ahnpw-r`my&?Y5u}fChK>eK~5%S|Ef-= zd}hSdDW(R!HmgT0H0cfIx#_`9wqrBTz6@mstu1ZbzV|0TE-kbND`JUOTM5)hB}Q}2 zQJR|h)ti6ylK)#TJI7rTrT%3DTKeoSRrCJ3>6JFD1VPShVWZyU{YG04V4m<=NhIL& z&TTaWGCAq$C64AGTv0RtqfD<9NCZkaw1`+FQj+CDS`}F>0JW9u_+EC33VO+5C&c?0 zM<*T;<1kNr_$R=#;T|vzC*tH;sItBO+TG`$zJ2y^Z)as`sy8wehyc(O0R$|8y!Gjv zH|JG87{xvT4|NHZ@$>}b$zj@R;SlS@~d;Dd}L@T6^+_LA(h-} zO{lf{bi!qn+2nGCO0G7`6@dUGAy|l-5*NnGmXrJ;}w83 z-KDXGq(2ZHSx%`fQD1(2B+|}hHm2)diA+m6$s~qOv3BUN%oSpDL(!Ov@CHf5dVR;E zx8`OxVr4|aYKc^Vo^5At&>tyk?UNTK-uzm^WSgudn|`~^&F3o(wqRq6(76zVNDFE9 zS>6`!A7U_#NJ6SlB(eS;NDz1rr;#9RMwjkjk$nGd!O z#zHQeHKI2Rt=#)_cf*pHaJzi&q+I23+L4U6ZVX>qxEl$35k&7MLfP!xeqQ5o>2eph z>MKJ-x3o5A#(@6!#xSh@8MocuJL6c^-bNM4>_m(?^+b6BVE+NP7>Pz7S@FRTD4*B(CICKW9cb*MWu~L|<6wJ=h*t3aUN0 z(1b=9tkEEQ7(rtXc8U4x=-7I0?4XcF%e~f6KAxzL`~4LUkhf{IMr!bzRo-$f73!u% z^#P~F-LQp+V)-mcG`ucz%7<(%ln99LVwGmh5AyZjj!z8)N^6zoMl&Qa=Ik62q~#9> zeObF$Akk#qR%7?HwrSok2%l+$F{2Yo2eK$S9q zfb487&iBS!1Lfx{&u3Dh0AN#Qy_SMNN=!+MK!B|y;FP)XUlLQY+n>fM<97G`F(B~J z*uD}PMUdrfqulgT;%r~Em(apWkIBTpW|I*4@ZSpWzrOZ+8xfO2#D2Z>^(ix)ATp7fg9qx@T2uh7T*Hh0TcGU6@Tx zGrtYjVK^n~KD%4?F!gw`usvG`pd)g)Kdm!a-QGde#SIBx>#E=4)uEb~tNR>gA77wX z+JoU^WB~ncCOwrZZH-2t_pM8N@$xY9RDOQ{OhiAqv5JF@^(45DZQwq>!21U8ztZ%8 zbR>n*c5i*=tb;V{V%77B7%se&87$UiVr&ZEhTsDo$AkhzWgHowl;+~rEhTT@P zTmbQIb-QkbRHZVyojyw>65c*Kn@xsFS63aOFuHC`#fn8F5hhuI zKF$9d=d~^x0K3hw+>^@S?YQ3N5D8UUrOUiBsSTOU8KX>wgn*^$;72DhMn2{6n87)! za|=YV@eFLOEHYaT7=3Z43KO|h>H2^JFKR5=(c@{As{7J~!HCndbtbCREWEU-vxKX5 z5&jT~p^yjmEFHc+C|5MDZ&moe^NCMO#M)-BYbVrrq#+}O_TD;gj0Y^qAZlKzIGXe= zBt!o0Eq-Ly9a7E=FP|exMKtQxnYx(n{i(x_&E)JfHS?@`h7KnGP8T!C3#>4Z5B$^G zRJfAxL`^PLpc)7b)|`Xg(Hn1kwqy5(7JaIib)+m%N@cqv#h+YioRn8Zg0`A&IPPI8WcyW2agTWNSYgf}ZtM1i`)F4vY-Lw1Z>o@K_^RrL56|K$k z!r&wpf}le7p+w0%lGoYJG*uGB0m7xpDoW`jvrDe|C)e=AN&A`?o)RNiNA?c0Ma0Mr zk}d=?Q;i}K(ce?*#b zUdSPM1QWs@pA(&n6Tz-;-=AU;T{Lx~1|kGcAn%)uXU|^TN}sJHI_0dRTx;FA8f`>n zI-N+ZGuX4u*;iKXJ`GGFeI#I*S4xR z5@wHd>8bS*&!AIQoGZ>|@*?!Ch{OZA^0`$<9Q|wPJaMX5CMMn(k|e$1c37nl2<&!; z$Lf zk`P6xm*@mMUW<05k#x=GhkZ5&2RZ#e0Y29`eRmwNEtb(28O@?`<;bIJ?0BL&DngiFg=k7HJzym zi!bWe>t(7!J*$ud_$TyLhK3yDVLsA;O?S&TqjRB(B~v){I=|X6owTpt6c(eFlGj_c ziV3V$szlY5Ktq;;Iujf@ktvaM_a+I zADs^b6!MpXVOWh7@Ne8;G?U-<<8T-@(%2lqB*RE9E_Kj!qaerh;aBB&6(^N^Ajv~h zwLn5Te|hLlRh*ZhXH>w)AXPq}ⅆt(Gz-qW(GNdmD8V*Kk}JVvoUCA%>9p}ZS2%< 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 u;V>aNRf%d+!; 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 t2~ - /// Default font provider with automatic Noto Emoji fallback. + /// Default font provider with automatic embedded fallback fonts. + /// Fallback fonts are lazy-loaded on first use (thread-safe). + /// Default chain: Primary → Noto Emoji → Noto Sans Math. /// public class DefaultFontProvider : IFontProvider { private readonly OpenTypeFont _primaryFont; - private OpenTypeFont _emojiFont; + private readonly List _fallbackFonts; private readonly object _lock = new object(); public OpenTypeFont PrimaryFont @@ -30,7 +33,8 @@ public OpenTypeFont PrimaryFont } ///

- /// Creates a font provider with automatic emoji fallback. + /// Creates a font provider with automatic embedded fallbacks. + /// Default fallback chain: Noto Emoji → Noto Sans Math. /// /// The user's primary font public DefaultFontProvider(OpenTypeFont primaryFont) @@ -39,25 +43,11 @@ public DefaultFontProvider(OpenTypeFont primaryFont) throw new ArgumentNullException("primaryFont"); _primaryFont = primaryFont; - } - - /// - /// Gets the emoji font, loading it on first access (lazy loading). - /// Thread-safe for .NET 3.5 compatibility. - /// - private OpenTypeFont GetEmojiFontLazy() - { - if (_emojiFont == null) + _fallbackFonts = new List { - lock (_lock) - { - if (_emojiFont == null) - { - _emojiFont = EmbeddedFonts.LoadNotoEmoji(); - } - } - } - return _emojiFont; + new LazyFallbackFont(EmbeddedFonts.LoadNotoEmoji), + new LazyFallbackFont(EmbeddedFonts.LoadNotoMath) + }; } public bool TryGetGlyphFont(uint codePoint, out OpenTypeFont font, out ushort glyphId) @@ -69,12 +59,18 @@ public bool TryGetGlyphFont(uint codePoint, out OpenTypeFont font, out ushort gl return true; } - // Fallback to embedded Noto Emoji (lazy-loaded) - var emojiFont = GetEmojiFontLazy(); - if (emojiFont.CmapTable.TryGetGlyphId(codePoint, out glyphId)) + // Try fallback fonts in order (lazy-loaded) + lock (_lock) { - font = emojiFont; - return true; + foreach (var fallback in _fallbackFonts) + { + var fallbackFont = fallback.Font; + if (fallbackFont.CmapTable.TryGetGlyphId(codePoint, out glyphId)) + { + font = fallbackFont; + return true; + } + } } // Not found - return primary with .notdef @@ -87,11 +83,60 @@ public IEnumerable GetAllFonts() { yield return _primaryFont; - // Only include emoji font if it was actually loaded - if (_emojiFont != null) + lock (_lock) { - yield return _emojiFont; + foreach (var fallback in _fallbackFonts) + { + if (fallback.IsLoaded) + { + yield return fallback.Font; + } + } + } + } + + /// + /// Wraps a font loader delegate with lazy, thread-safe initialization. + /// + private class LazyFallbackFont + { + private readonly Func _loader; + private OpenTypeFont _font; + private readonly object _lock = new object(); + + internal LazyFallbackFont(Func loader) + { + _loader = loader; + } + + /// + /// Gets whether the font has been loaded yet. + /// + internal bool IsLoaded + { + get { return _font != null; } + } + + /// + /// Gets the font, loading it on first access. + /// + internal OpenTypeFont Font + { + get + { + if (_font == null) + { + lock (_lock) + { + if (_font == null) + { + _font = _loader(); + } + } + } + return _font; + } } } } -} +} \ No newline at end of file diff --git a/src/EPPlus.Fonts.OpenType/FontSubsetBuilder.cs b/src/EPPlus.Fonts.OpenType/FontSubsetBuilder.cs deleted file mode 100644 index aecc0e1d8..000000000 --- a/src/EPPlus.Fonts.OpenType/FontSubsetBuilder.cs +++ /dev/null @@ -1,59 +0,0 @@ -/************************************************************************************************* - Required Notice: Copyright (C) EPPlus Software AB. - This software is licensed under PolyForm Noncommercial License 1.0.0 - and may only be used for noncommercial purposes - https://polyformproject.org/licenses/noncommercial/1.0.0/ - - A commercial license to use this software can be purchased at https://epplussoftware.com - ************************************************************************************************* - Date Author Change - ************************************************************************************************* - 10/07/2025 EPPlus Software AB EPPlus.Fonts.OpenType 1.0 - *************************************************************************************************/ -using EPPlus.Fonts.OpenType.Tables.Glyph; -using EPPlus.Fonts.OpenType.Tables.Head; -using EPPlus.Fonts.OpenType.Tables.Loca; -using System.Collections.Generic; - -namespace EPPlus.Fonts.OpenType -{ - public class FontSubsetBuilder - { - private readonly OpenTypeFont _original; - - public FontSubsetBuilder(OpenTypeFont original) - { - _original = original; - } - - public OpenTypeFont BuildSubset(HashSet glyphIds, IEnumerable usedChars) - { - var subsetFont = new OpenTypeFont(_original.Format); - - subsetFont.AddOrReplaceTable(_original.HeadTable.Clone()); - subsetFont.AddOrReplaceTable(_original.MaxpTable.Clone()); - subsetFont.MaxpTable.numGlyphs = (ushort)glyphIds.Count; - - // Build glyf subset - var glyfProcessor = new GlyphSubsetProcessor(_original.GlyfTable); - var glyphSubsetResult = glyfProcessor.CreateSubset(glyphIds); - subsetFont.AddOrReplaceTable(glyphSubsetResult.GlyfTable); - - - var glyfSize = glyphSubsetResult.GlyfTable.GetLength(subsetFont); - var indexToLocFormat = glyfSize < 65536 - ? HeadTable.IndexToLocFormats.Offset16 - : HeadTable.IndexToLocFormats.Offset32; - - // Update HeadTable - subsetFont.HeadTable.IndexToLocFormat = indexToLocFormat; - - // Build Loca-table for the subset - subsetFont.AddOrReplaceTable( - LocaTable.CreateSubset(glyphSubsetResult.LocaOffsets, indexToLocFormat) - ); - - return subsetFont; - } - } -} diff --git a/src/EPPlus.Fonts.OpenType/FontSubsetManager.cs b/src/EPPlus.Fonts.OpenType/FontSubsetManager.cs new file mode 100644 index 000000000..969751703 --- /dev/null +++ b/src/EPPlus.Fonts.OpenType/FontSubsetManager.cs @@ -0,0 +1,139 @@ +/************************************************************************************************* + Required Notice: Copyright (C) EPPlus Software AB. + This software is licensed under PolyForm Noncommercial License 1.0.0 + and may only be used for noncommercial purposes + https://polyformproject.org/licenses/noncommercial/1.0.0/ + + A commercial license to use this software can be purchased at https://epplussoftware.com + ************************************************************************************************* + Date Author Change + ************************************************************************************************* + 02/25/2026 EPPlus Software AB Font subset manager for PDF export + *************************************************************************************************/ +using EPPlus.Fonts.OpenType.Utils; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace EPPlus.Fonts.OpenType +{ + /// + /// Prepares subsetted fonts for PDF export by pre-scanning text, + /// distributing code points to the correct font via the fallback chain, + /// and creating minimal subsets of all fonts (including fallbacks). + /// + /// Usage: + /// 1. Create with an IFontProvider (e.g., DefaultFontProvider) + /// 2. Call AddText() for all text that will be rendered (e.g., all cell values) + /// 3. Call CreateSubsettedProvider() to get a new IFontProvider with subsetted fonts + /// 4. Use the returned provider for shaping and PDF rendering + /// + public class FontSubsetManager + { + private readonly IFontProvider _sourceProvider; + + // Code points collected per font (key = original font instance) + private readonly Dictionary> _codePointsByFont = + new Dictionary>(); + + public FontSubsetManager(IFontProvider sourceProvider) + { + if (sourceProvider == null) + throw new ArgumentNullException("sourceProvider"); + + _sourceProvider = sourceProvider; + } + + public FontSubsetManager(OpenTypeFont font) + : this(new DefaultFontProvider(font)) + { + + } + + /// + /// Scans text and distributes each code point to the font that will render it. + /// Call this for every piece of text that will appear in the document. + /// + public void AddText(string text) + { + if (string.IsNullOrEmpty(text)) + return; + + var codePoints = CodePointUtil.ExtractCodePoints(text); + + foreach (var cp in codePoints) + { + OpenTypeFont font; + ushort glyphId; + _sourceProvider.TryGetGlyphFont((uint)cp, out font, out glyphId); + + HashSet fontCodePoints; + if (!_codePointsByFont.TryGetValue(font, out fontCodePoints)) + { + fontCodePoints = new HashSet(); + _codePointsByFont[font] = fontCodePoints; + } + + fontCodePoints.Add(cp); + } + } + + /// + /// Creates a new IFontProvider where all fonts (primary + fallbacks) are subsetted + /// to contain only the glyphs needed for the collected text. + /// Fonts that had no text collected are excluded from the result. + /// + public IFontProvider CreateSubsettedProvider() + { + var primaryFont = _sourceProvider.PrimaryFont; + var allFonts = _sourceProvider.GetAllFonts().ToList(); + + // Subset each font that has collected code points + var subsetMap = new Dictionary(); + + foreach (var kvp in _codePointsByFont) + { + var originalFont = kvp.Key; + var codePoints = kvp.Value; + + if (codePoints.Count == 0) + continue; + + try + { + var chars = CodePointUtil.CodePointsToString(codePoints); + var subset = originalFont.CreateSubset(chars); + subsetMap[originalFont] = subset; + } + catch (Exception ex) + { + // If subsetting fails, use the original font + System.Diagnostics.Debug.WriteLine( + $"Warning: Could not subset '{originalFont.NameTable?.GetFullFontName()}': {ex.Message}"); + subsetMap[originalFont] = originalFont; + } + } + + // Build new provider with subsetted fonts, preserving fallback order + var subsetPrimary = subsetMap.ContainsKey(primaryFont) + ? subsetMap[primaryFont] + : primaryFont; + + var provider = new CustomFontProvider(subsetPrimary); + + // Add fallback fonts in their original order (skip primary) + for (int i = 1; i < allFonts.Count; i++) + { + var originalFallback = allFonts[i]; + + if (subsetMap.ContainsKey(originalFallback)) + { + provider.AddFallback(subsetMap[originalFallback]); + } + // If no code points were collected for this fallback, skip it entirely + } + + return provider; + } + } +} \ No newline at end of file diff --git a/src/EPPlus.Fonts.OpenType/OpenTypeFont.cs b/src/EPPlus.Fonts.OpenType/OpenTypeFont.cs index c81d1b848..ca939ec36 100644 --- a/src/EPPlus.Fonts.OpenType/OpenTypeFont.cs +++ b/src/EPPlus.Fonts.OpenType/OpenTypeFont.cs @@ -32,6 +32,7 @@ Date Author Change using EPPlus.Fonts.OpenType.Utils; using System; using System.Collections.Generic; +using System.Diagnostics; using System.Linq; namespace EPPlus.Fonts.OpenType @@ -39,6 +40,7 @@ namespace EPPlus.Fonts.OpenType /// /// Base class for open-type fonts /// + [DebuggerDisplay("{FullName}, IsSubset: {IsSubset}")] public class OpenTypeFont { internal TableCache _localTableCache; @@ -606,21 +608,25 @@ internal void AddOrReplaceTable(T table) public OpenTypeFont CreateSubset(IEnumerable usedChars) { + // Validate input if (usedChars == null) throw new ArgumentNullException(nameof(usedChars)); - var charArray = usedChars.ToArray(); - if (charArray.Length == 0) + + if (!usedChars.Any()) throw new ArgumentException("Text cannot be empty", nameof(usedChars)); var subsetBuilder = new SubsetFontBuilder(); - var codePoints = CharacterUtil.ExtractCodePointsFromChars(charArray); - // Använd "this" direkt — IsReadOnly-skyddet på AddOrReplaceTable - // garanterar att denna instans aldrig modifieras av subsetting. + // Extract Unicode code points, correctly handling surrogate pairs. + // A string like "Hello 😀" contains 7 chars but 6 code points, + // because 😀 (U+1F600) is encoded as two UTF-16 surrogates. + var codePoints = CodePointUtil.ExtractCodePoints(usedChars); + var newFont = subsetBuilder.CreateSubset(this, codePoints); var postProcessor = new SubsetPostProcessor(); postProcessor.PostProcessSubset(newFont); + return newFont; } diff --git a/src/EPPlus.Fonts.OpenType/OpenTypeFonts.cs b/src/EPPlus.Fonts.OpenType/OpenTypeFonts.cs index ea2b78991..af07d45dd 100644 --- a/src/EPPlus.Fonts.OpenType/OpenTypeFonts.cs +++ b/src/EPPlus.Fonts.OpenType/OpenTypeFonts.cs @@ -152,7 +152,6 @@ public static OpenTypeFont GetFontDataOpen( if (cached != null && cached.Font != null && cached.IsLoaded) { cached.Font.EnsureFullyLoaded(); - Debug.WriteLine($"[CACHE HIT] {fontName}_{subFamily} → Font={cached.Font.GetHashCode()}, CmapSubTables={cached.Font.CmapTable?.SubTables?.Count}"); return cached.Font; } } diff --git a/src/EPPlus.Fonts.OpenType/Scanner/FontScannerV2.Ttc.cs b/src/EPPlus.Fonts.OpenType/Scanner/FontScannerV2.Ttc.cs index 7ad7bd495..21e0afe61 100644 --- a/src/EPPlus.Fonts.OpenType/Scanner/FontScannerV2.Ttc.cs +++ b/src/EPPlus.Fonts.OpenType/Scanner/FontScannerV2.Ttc.cs @@ -24,8 +24,6 @@ private static List ScanTtcFile(string filePath) uint tag = reader.ReadUInt32BigEndian(); if (tag != 0x74746366) // "ttcf" { - System.Diagnostics.Debug.WriteLine( - $"[FontScannerV2] Expected TTC header but got 0x{tag:X8} in file: {filePath}"); return faces; // Not a TTC file – return empty list } @@ -35,8 +33,6 @@ private static List ScanTtcFile(string filePath) // Sanity check – prevent huge or corrupt TTC from causing issues if (numFonts == 0 || numFonts > 1024) { - System.Diagnostics.Debug.WriteLine( - $"[FontScannerV2] Invalid number of fonts in TTC ({numFonts}) in file: {filePath}"); return faces; } @@ -51,8 +47,6 @@ private static List ScanTtcFile(string filePath) // Skip obviously invalid offsets if (offset >= fs.Length) { - System.Diagnostics.Debug.WriteLine( - $"[FontScannerV2] Skipping invalid TTC offset 0x{offset:X8} (beyond file end) in: {filePath}"); continue; } diff --git a/src/EPPlus.Fonts.OpenType/Subsetting/GposSubsetProcessor.cs b/src/EPPlus.Fonts.OpenType/Subsetting/GposSubsetProcessor.cs index cefdc5fe2..cc50506f5 100644 --- a/src/EPPlus.Fonts.OpenType/Subsetting/GposSubsetProcessor.cs +++ b/src/EPPlus.Fonts.OpenType/Subsetting/GposSubsetProcessor.cs @@ -77,8 +77,6 @@ public void Rewrite(FontSubsettingContext context) var oldGpos = context.OriginalFont.GposTable; if (oldGpos == null) return; - Debug.WriteLine($"[GPOS Subset] Original GPOS has {oldGpos.LookupList.Lookups.Count} lookups"); - // Count Type 4 (MarkToBase) lookups int markToBaseCount = 0; foreach (var lookup in oldGpos.LookupList.Lookups) @@ -90,13 +88,11 @@ public void Rewrite(FontSubsettingContext context) markToBaseCount++; } } - Debug.WriteLine($"[GPOS Subset] Original has {markToBaseCount} MarkToBase lookups"); var newGpos = oldGpos.Rewrite(context); if (newGpos != null) { - Debug.WriteLine($"[GPOS Subset] New GPOS has {newGpos.LookupList.Lookups.Count} lookups"); context.SubsetFont.AddOrReplaceTable(newGpos); } } diff --git a/src/EPPlus.Fonts.OpenType/Tables/Common/Layout/Features/FeatureListTable.cs b/src/EPPlus.Fonts.OpenType/Tables/Common/Layout/Features/FeatureListTable.cs index 9eb9c9bba..b19ed2e3e 100644 --- a/src/EPPlus.Fonts.OpenType/Tables/Common/Layout/Features/FeatureListTable.cs +++ b/src/EPPlus.Fonts.OpenType/Tables/Common/Layout/Features/FeatureListTable.cs @@ -68,27 +68,7 @@ internal FeatureRewriteResult Rewrite(FontSubsettingContext context, Dictionary< { var feature = this.FeatureRecords[oldIndex]; - if (oldIndex >= 5 && oldIndex <= 7) // Debug 'liga' features - { - Debug.WriteLine($"\n=== Processing feature[{oldIndex}]: '{feature.FeatureTag.Value}' ==="); - if (feature.FeatureTable != null) - { - Debug.WriteLine($" Original lookups: [{string.Join(", ", feature.FeatureTable.LookupListIndices.Select(i => i.ToString()).ToArray())}]"); - } - } - var rewrittenFeature = feature.Rewrite(context, lookupMap); - if (oldIndex >= 5 && oldIndex <= 7) - { - if (rewrittenFeature != null && rewrittenFeature.FeatureTable != null) - { - Debug.WriteLine($" Rewritten lookups: [{string.Join(", ", rewrittenFeature.FeatureTable.LookupListIndices.Select(i => i.ToString()).ToArray())}]"); - } - else - { - Debug.WriteLine($" ❌ REMOVED (no valid lookups remain)"); - } - } if (rewrittenFeature != null) { int newIndex = newFeatures.Count; diff --git a/src/EPPlus.Fonts.OpenType/Tables/Gpos/Data/Lookups/LookupType2/PairPosSubTableFormat2.cs b/src/EPPlus.Fonts.OpenType/Tables/Gpos/Data/Lookups/LookupType2/PairPosSubTableFormat2.cs index 7818c8ea7..95797b15b 100644 --- a/src/EPPlus.Fonts.OpenType/Tables/Gpos/Data/Lookups/LookupType2/PairPosSubTableFormat2.cs +++ b/src/EPPlus.Fonts.OpenType/Tables/Gpos/Data/Lookups/LookupType2/PairPosSubTableFormat2.cs @@ -54,11 +54,9 @@ public override bool TryGetPairAdjustment( value1 = null; value2 = null; - System.Diagnostics.Debug.WriteLine($"[Format2] Trying pair: {firstGlyph} + {secondGlyph}"); if (Coverage == null || ClassDef1 == null || ClassDef2 == null || ClassMatrix == null) { - System.Diagnostics.Debug.WriteLine($" ✗ Missing data: Cov={Coverage != null}, CD1={ClassDef1 != null}, CD2={ClassDef2 != null}, Matrix={ClassMatrix != null}"); return false; } diff --git a/src/EPPlus.Fonts.OpenType/Tables/Gsub/GsubTable.cs b/src/EPPlus.Fonts.OpenType/Tables/Gsub/GsubTable.cs index a7f29f689..9d2d65565 100644 --- a/src/EPPlus.Fonts.OpenType/Tables/Gsub/GsubTable.cs +++ b/src/EPPlus.Fonts.OpenType/Tables/Gsub/GsubTable.cs @@ -127,29 +127,6 @@ public GsubTable Rewrite(FontSubsettingContext context) if (this.FeatureList != null && lookupResult != null) { featureResult = this.FeatureList.Rewrite(context, lookupResult.OldToNewIndexMap); - if (featureResult != null) - { - Debug.WriteLine("\n=== FEATURE INDEX MAPPING ==="); - Debug.WriteLine($"Original features: {this.FeatureList.FeatureRecords.Count}"); - Debug.WriteLine($"New features: {featureResult.NewFeatureList.FeatureRecords.Count}"); - Debug.WriteLine($"Mapping entries: {featureResult.OldToNewIndexMap.Count}"); - - Debug.WriteLine("\nMapping details:"); - foreach (var kvp in featureResult.OldToNewIndexMap.OrderBy(k => k.Key)) - { - var oldFeature = this.FeatureList.FeatureRecords[kvp.Key]; - var newFeature = featureResult.NewFeatureList.FeatureRecords[kvp.Value]; - Debug.WriteLine($" Old[{kvp.Key}] '{oldFeature.FeatureTag.Value}' → New[{kvp.Value}] '{newFeature.FeatureTag.Value}'"); - } - - Debug.WriteLine("\nOriginal script DFLT had features:"); - var origDflt = this.ScriptList.ScriptRecords.FirstOrDefault(s => s.ScriptTag.Value == "DFLT"); - if (origDflt?.ScriptTable?.DefaultLangSys != null) - { - var indices = string.Join(", ", origDflt.ScriptTable.DefaultLangSys.FeatureIndices.Select(i => i.ToString()).ToArray()); - Debug.WriteLine($" [{indices}]"); - } - } if (featureResult == null || featureResult.NewFeatureList == null || featureResult.NewFeatureList.FeatureRecords.Count == 0) { // No features remain diff --git a/src/EPPlus.Fonts.OpenType/Utils/CodePointUtil.cs b/src/EPPlus.Fonts.OpenType/Utils/CodePointUtil.cs new file mode 100644 index 000000000..c427caa18 --- /dev/null +++ b/src/EPPlus.Fonts.OpenType/Utils/CodePointUtil.cs @@ -0,0 +1,85 @@ +/************************************************************************************************* + Required Notice: Copyright (C) EPPlus Software AB. + This software is licensed under PolyForm Noncommercial License 1.0.0 + and may only be used for noncommercial purposes + https://polyformproject.org/licenses/noncommercial/1.0.0/ + + A commercial license to use this software can be purchased at https://epplussoftware.com + ************************************************************************************************* + Date Author Change + ************************************************************************************************* + 10/07/2025 EPPlus Software AB EPPlus.Fonts.OpenType 1.0 + *************************************************************************************************/ +using System.Collections.Generic; + +namespace EPPlus.Fonts.OpenType.Utils +{ + internal static class CodePointUtil + { + /// + /// Extracts distinct Unicode code points from a sequence of chars, + /// correctly combining surrogate pairs into supplementary plane code points. + /// Lone surrogates are skipped. + /// + internal static IEnumerable ExtractCodePoints(IEnumerable chars) + { + var codePoints = new HashSet(); + char? pendingHighSurrogate = null; + + foreach (var c in chars) + { + if (pendingHighSurrogate.HasValue) + { + if (char.IsLowSurrogate(c)) + { + // Valid pair - combine into code point + int cp = char.ConvertToUtf32(pendingHighSurrogate.Value, c); + codePoints.Add(cp); + pendingHighSurrogate = null; + continue; + } + + // Previous high surrogate had no matching low - skip it + pendingHighSurrogate = null; + } + + if (char.IsHighSurrogate(c)) + { + pendingHighSurrogate = c; + } + else if (!char.IsLowSurrogate(c)) + { + // Normal BMP character + codePoints.Add(c); + } + // Lone low surrogates are skipped + } + + return codePoints; + } + + /// + /// Converts a set of Unicode code points to a string, + /// correctly encoding supplementary plane characters as surrogate pairs. + /// + internal static string CodePointsToString(HashSet codePoints) + { + var sb = new System.Text.StringBuilder(codePoints.Count * 2); + + foreach (var cp in codePoints) + { + if (cp <= 0xFFFF) + { + sb.Append((char)cp); + } + else + { + // Supplementary plane - encode as surrogate pair + sb.Append(char.ConvertFromUtf32(cp)); + } + } + + return sb.ToString(); + } + } +} From 42bbc6c0900148199f635373cd44d64b56a3f5a8 Mon Sep 17 00:00:00 2001 From: swmal <897655+swmal@users.noreply.github.com> Date: Thu, 26 Feb 2026 16:24:04 +0100 Subject: [PATCH 2/3] Fallbackfonts refactoring --- .../PdfResources/PdfFontResource.cs | 2 +- .../Pdfhelpers/PdfTextData.cs | 2 +- .../ExtractCharWidthsBenchmark.cs | 2 +- .../FontCacheBenchmarks.cs | 12 +- .../FontCacheClearingBenchmarks.cs | 8 +- .../FontLoadingBenchmarks.cs | 10 +- .../RichTextBenchmarks.cs | 7 +- .../SubsettingBenchmarks.cs | 2 +- .../TextLayoutEngineBenchmarks.cs | 4 +- .../TextShapingBenchmarks.cs | 2 +- .../FallbackFonts/CustomFontProviderTests.cs | 6 +- .../FallbackFonts/FontProviderTests.cs | 2 +- .../FontMeasurerPerformanceTest.cs | 4 +- .../FontSubsetManagerTests.cs | 2 +- .../FontTestBase.cs | 23 +- .../Helpers/FontTestHelper.cs | 16 +- .../Integration/MeasurerComparisonTests.cs | 20 +- .../Integration/TextLayoutEngineTests.cs | 38 +-- .../Reading/GposReadingTests.cs | 95 ++------ .../Reading/TtfReadingTests.cs | 26 ++- .../Reading/VerticalTextTests.cs | 4 +- .../Regression/RegressionTests.cs | 43 ++-- .../Serialization/CmapSerializationTests.cs | 8 +- .../CoreTableSerializationTests.cs | 14 +- .../Serialization/GPosSerializationTests.cs | 219 ++++-------------- .../GlyphTableSerializationTests.cs | 7 +- .../Serialization/KernSerializationTests.cs | 2 +- .../Subsetting/BasicSubsettingTests.cs | 115 +++------ .../CompositeGlyphSubsettingTests.cs | 6 +- .../Subsetting/LigatureSubsettingTests.cs | 19 +- .../Subsetting/SubsettingEdgeCasesTests.cs | 14 +- .../Subsetting/VerticalSubsettingTests.cs | 28 +-- .../ChainingContextualSubstitutionTests.cs | 12 +- .../TextShaping/MarkToBaseTests.cs | 16 +- .../TextShaping/SingleAdjustmentsTests.cs | 70 +----- .../TextShaping/SingleSubstitutionTests.cs | 4 +- .../TextShaping/TextShaperTests.cs | 82 +++---- .../TextShaping/VerticalTextShapingTests.cs | 34 +-- .../Validation/CmapTableValidationTests.cs | 2 +- .../Validation/CoreTableValidationTests.cs | 12 +- .../Validation/EntireFontValidationTests.cs | 2 +- .../Validation/GlyphTableValidationTests.cs | 6 +- .../Validation/GsubTableValidationTests.cs | 2 +- src/EPPlus.Fonts.OpenType/EmbeddedFonts.cs | 2 +- .../FontCache/OpenTypeFontCache.cs | 82 +++---- .../FontResolver/DefaultFontLocations.cs | 83 +++++++ .../FontResolver/DefaultFontResolver.cs | 76 ++++++ .../FontResolver/FontsResolutionConfig.cs | 40 ++++ .../FontResolver/IFontResolver.cs | 31 +++ src/EPPlus.Fonts.OpenType/FontSubFamily.cs | 22 ++ .../Integration/TextLayoutEngine.cs | 4 +- src/EPPlus.Fonts.OpenType/OpenTypeFont.cs | 46 +++- .../OpenTypeFontFactory.cs | 8 +- src/EPPlus.Fonts.OpenType/OpenTypeFonts.cs | 190 ++++++--------- .../Scanner/FontFaceInfo.cs | 2 + .../Scanner/FontScannerV2.cs | 7 +- .../TrueTypeMeasurer/TextData.cs | 13 +- 57 files changed, 776 insertions(+), 834 deletions(-) create mode 100644 src/EPPlus.Fonts.OpenType/FontResolver/DefaultFontLocations.cs create mode 100644 src/EPPlus.Fonts.OpenType/FontResolver/DefaultFontResolver.cs create mode 100644 src/EPPlus.Fonts.OpenType/FontResolver/FontsResolutionConfig.cs create mode 100644 src/EPPlus.Fonts.OpenType/FontResolver/IFontResolver.cs create mode 100644 src/EPPlus.Fonts.OpenType/FontSubFamily.cs diff --git a/src/EPPlus.Export.Pdf/PdfResources/PdfFontResource.cs b/src/EPPlus.Export.Pdf/PdfResources/PdfFontResource.cs index 9d163192f..da7008e17 100644 --- a/src/EPPlus.Export.Pdf/PdfResources/PdfFontResource.cs +++ b/src/EPPlus.Export.Pdf/PdfResources/PdfFontResource.cs @@ -34,7 +34,7 @@ public PdfFontResource(string fontName, FontSubFamily subFamily, int labelNumber : base("F", labelNumber) { this.fontName = fontName; - fontData = OpenTypeFonts.GetFontData(pageSettings.FontDirectories, fontName, subFamily, pageSettings.SearchSystemDirectories); + fontData = OpenTypeFonts.LoadFont(fontName, subFamily); } //Get the Font Descriptor object to write in PDF. diff --git a/src/EPPlus.Export.Pdf/Pdfhelpers/PdfTextData.cs b/src/EPPlus.Export.Pdf/Pdfhelpers/PdfTextData.cs index 84fba3170..b78507de1 100644 --- a/src/EPPlus.Export.Pdf/Pdfhelpers/PdfTextData.cs +++ b/src/EPPlus.Export.Pdf/Pdfhelpers/PdfTextData.cs @@ -23,7 +23,7 @@ internal static class PdfTextData { internal static OpenTypeFont GetFontData(PdfPageSettings pageSettings, string fontName, FontSubFamily subFamily) { - return OpenTypeFonts.GetFontData(pageSettings.FontDirectories, fontName, subFamily, pageSettings.SearchSystemDirectories); + return OpenTypeFonts.LoadFont(fontName, subFamily); } internal static double MeasureFontHeight(OpenTypeFont font, double fontSize) diff --git a/src/EPPlus.Fonts.OpenType.Benchmarks/ExtractCharWidthsBenchmark.cs b/src/EPPlus.Fonts.OpenType.Benchmarks/ExtractCharWidthsBenchmark.cs index 2536f8378..fc7196b2e 100644 --- a/src/EPPlus.Fonts.OpenType.Benchmarks/ExtractCharWidthsBenchmark.cs +++ b/src/EPPlus.Fonts.OpenType.Benchmarks/ExtractCharWidthsBenchmark.cs @@ -17,7 +17,7 @@ public class ExtractCharWidthsBenchmark public void Setup() { var fontFolders = new List { /* your font paths */ }; - var font = OpenTypeFonts.GetFontData(fontFolders, "Calibri", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Calibri"); _shaper = new TextShaper(font); _options = ShapingOptions.Default; diff --git a/src/EPPlus.Fonts.OpenType.Benchmarks/FontCacheBenchmarks.cs b/src/EPPlus.Fonts.OpenType.Benchmarks/FontCacheBenchmarks.cs index 9f699d4fb..7203cebce 100644 --- a/src/EPPlus.Fonts.OpenType.Benchmarks/FontCacheBenchmarks.cs +++ b/src/EPPlus.Fonts.OpenType.Benchmarks/FontCacheBenchmarks.cs @@ -30,14 +30,14 @@ public void Setup() // Pre-load font into cache OpenTypeFonts.ClearFontCache(); - OpenTypeFonts.GetFontData(_fontFolders, "Roboto", FontSubFamily.Regular); + OpenTypeFonts.LoadFont("Roboto"); } [Benchmark] public OpenTypeFont Load_FromCache_SingleThread() { // This should be extremely fast - just cache lookup - return OpenTypeFonts.GetFontData(_fontFolders, "Roboto", FontSubFamily.Regular); + return OpenTypeFonts.LoadFont("Roboto"); } [Benchmark] @@ -46,10 +46,10 @@ public OpenTypeFont[] Load_FromCache_MultipleFonts() // Simulates loading multiple font styles (like for a document) return new[] { - OpenTypeFonts.GetFontData(_fontFolders, "Roboto", FontSubFamily.Regular), - OpenTypeFonts.GetFontData(_fontFolders, "Roboto", FontSubFamily.Bold), - OpenTypeFonts.GetFontData(_fontFolders, "Roboto", FontSubFamily.Italic), - OpenTypeFonts.GetFontData(_fontFolders, "Roboto", FontSubFamily.BoldItalic) + OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular), + OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Bold), + OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Italic), + OpenTypeFonts.LoadFont("Roboto", FontSubFamily.BoldItalic) }; } } diff --git a/src/EPPlus.Fonts.OpenType.Benchmarks/FontCacheClearingBenchmarks.cs b/src/EPPlus.Fonts.OpenType.Benchmarks/FontCacheClearingBenchmarks.cs index 7259df995..5f5f8e9f6 100644 --- a/src/EPPlus.Fonts.OpenType.Benchmarks/FontCacheClearingBenchmarks.cs +++ b/src/EPPlus.Fonts.OpenType.Benchmarks/FontCacheClearingBenchmarks.cs @@ -28,10 +28,10 @@ public OpenTypeFont Load_Clear_Load_Pattern() { // Simulates pattern where cache is cleared between operations OpenTypeFonts.ClearFontCache(); - var font1 = OpenTypeFonts.GetFontData(_fontFolders, "Roboto", FontSubFamily.Regular); + var font1 = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); OpenTypeFonts.ClearFontCache(); - var font2 = OpenTypeFonts.GetFontData(_fontFolders, "Roboto", FontSubFamily.Regular); + var font2 = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); return font2; } @@ -40,8 +40,8 @@ public OpenTypeFont Load_Clear_Load_Pattern() public OpenTypeFont Load_Reuse_Pattern() { // Simulates pattern where cache is NOT cleared (optimal) - var font1 = OpenTypeFonts.GetFontData(_fontFolders, "Roboto", FontSubFamily.Regular); - var font2 = OpenTypeFonts.GetFontData(_fontFolders, "Roboto", FontSubFamily.Regular); + var font1 = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); + var font2 = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); return font2; } diff --git a/src/EPPlus.Fonts.OpenType.Benchmarks/FontLoadingBenchmarks.cs b/src/EPPlus.Fonts.OpenType.Benchmarks/FontLoadingBenchmarks.cs index 433208d04..51f72a209 100644 --- a/src/EPPlus.Fonts.OpenType.Benchmarks/FontLoadingBenchmarks.cs +++ b/src/EPPlus.Fonts.OpenType.Benchmarks/FontLoadingBenchmarks.cs @@ -40,35 +40,35 @@ public void Setup() public OpenTypeFont Load_Roboto_Regular_ColdCache() { OpenTypeFonts.ClearFontCache(); // Clear INNE i benchmark - return OpenTypeFonts.GetFontData(_fontFolders, "Roboto", FontSubFamily.Regular); + return OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); } [Benchmark] public OpenTypeFont Load_Roboto_Regular_WarmCache() { // Load UTAN att cleara - använder cache från GlobalSetup eller warmup - return OpenTypeFonts.GetFontData(_fontFolders, "Roboto", FontSubFamily.Regular); + return OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); } [Benchmark] public OpenTypeFont Load_Roboto_Bold_ColdCache() { OpenTypeFonts.ClearFontCache(); - return OpenTypeFonts.GetFontData(_fontFolders, "Roboto", FontSubFamily.Bold); + return OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Bold); } [Benchmark] public OpenTypeFont Load_Roboto_Italic_ColdCache() { OpenTypeFonts.ClearFontCache(); - return OpenTypeFonts.GetFontData(_fontFolders, "Roboto", FontSubFamily.Italic); + return OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Italic); } [Benchmark] public OpenTypeFont Load_Roboto_BoldItalic_ColdCache() { OpenTypeFonts.ClearFontCache(); - return OpenTypeFonts.GetFontData(_fontFolders, "Roboto", FontSubFamily.BoldItalic); + return OpenTypeFonts.LoadFont("Roboto", FontSubFamily.BoldItalic); } } } \ No newline at end of file diff --git a/src/EPPlus.Fonts.OpenType.Benchmarks/RichTextBenchmarks.cs b/src/EPPlus.Fonts.OpenType.Benchmarks/RichTextBenchmarks.cs index d1f194085..0ecb2a0fd 100644 --- a/src/EPPlus.Fonts.OpenType.Benchmarks/RichTextBenchmarks.cs +++ b/src/EPPlus.Fonts.OpenType.Benchmarks/RichTextBenchmarks.cs @@ -61,12 +61,7 @@ public void Setup() } Console.WriteLine("\nLoading Roboto Regular..."); - var font = OpenTypeFonts.GetFontData( - _fontFolders, - FontFamily, - FontSubFamily.Regular, - searchSystemDirectories: false - ); + var font = OpenTypeFonts.LoadFont(FontFamily, FontSubFamily.Regular); Console.WriteLine(string.Format("Loaded: {0} {1} ({2} glyphs)", font.FullName, font.SubFamily, font.GlyfTable.Glyphs.Count)); diff --git a/src/EPPlus.Fonts.OpenType.Benchmarks/SubsettingBenchmarks.cs b/src/EPPlus.Fonts.OpenType.Benchmarks/SubsettingBenchmarks.cs index 53c50acc5..8fc391854 100644 --- a/src/EPPlus.Fonts.OpenType.Benchmarks/SubsettingBenchmarks.cs +++ b/src/EPPlus.Fonts.OpenType.Benchmarks/SubsettingBenchmarks.cs @@ -35,7 +35,7 @@ public void Setup() } _fontFolders = new List { fontsPath }; - _roboto = OpenTypeFonts.GetFontData(_fontFolders, "Roboto", FontSubFamily.Regular); + _roboto = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); } [Benchmark] diff --git a/src/EPPlus.Fonts.OpenType.Benchmarks/TextLayoutEngineBenchmarks.cs b/src/EPPlus.Fonts.OpenType.Benchmarks/TextLayoutEngineBenchmarks.cs index ca4fa4927..67fc76a40 100644 --- a/src/EPPlus.Fonts.OpenType.Benchmarks/TextLayoutEngineBenchmarks.cs +++ b/src/EPPlus.Fonts.OpenType.Benchmarks/TextLayoutEngineBenchmarks.cs @@ -59,7 +59,7 @@ public void Setup() var fontFolders = new List { fontsPath }; // Setup new layout engine - var font = OpenTypeFonts.GetFontData(fontFolders, FontFamily, FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont(FontFamily, FontSubFamily.Regular); var shaper = new TextShaper(font); _layoutEngine = new TextLayoutEngine(shaper); @@ -155,7 +155,7 @@ public List New_Wrap_10Paragraphs_Sequential() [Benchmark] public double[] OnlyExtractWidths() { - var font = OpenTypeFonts.GetFontData(null, FontFamily, FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont(FontFamily, FontSubFamily.Regular); var shaper = new TextShaper(font); return shaper.ExtractCharWidths(LoremIpsum20Para, FontSize, ShapingOptions.Default); } diff --git a/src/EPPlus.Fonts.OpenType.Benchmarks/TextShapingBenchmarks.cs b/src/EPPlus.Fonts.OpenType.Benchmarks/TextShapingBenchmarks.cs index 8f44c3b83..186f4d29b 100644 --- a/src/EPPlus.Fonts.OpenType.Benchmarks/TextShapingBenchmarks.cs +++ b/src/EPPlus.Fonts.OpenType.Benchmarks/TextShapingBenchmarks.cs @@ -22,7 +22,7 @@ public void Setup() } var fontFolders = new List { fontsPath }; - _roboto = OpenTypeFonts.GetFontData(fontFolders, "Roboto", FontSubFamily.Regular); + _roboto = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); _shaper = new TextShaper(_roboto); } diff --git a/src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/CustomFontProviderTests.cs b/src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/CustomFontProviderTests.cs index c9d3644e2..3756a923b 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/CustomFontProviderTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/CustomFontProviderTests.cs @@ -37,9 +37,9 @@ public class CustomFontProviderTests : FontTestBase [TestInitialize] public void TestSetup() { - _robotoFont = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); - _notoEmojiFont = OpenTypeFonts.GetFontData(FontFolders, "Noto Emoji", FontSubFamily.Regular); - _notoMathFont = OpenTypeFonts.GetFontData(FontFolders, "Noto Sans Math", FontSubFamily.Regular); + _robotoFont = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); + _notoEmojiFont = OpenTypeFonts.LoadFont("Noto Emoji", FontSubFamily.Regular); + _notoMathFont = OpenTypeFonts.LoadFont("Noto Sans Math", FontSubFamily.Regular); } #region Constructor Tests diff --git a/src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/FontProviderTests.cs b/src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/FontProviderTests.cs index bf78eb66a..58f10e4af 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/FontProviderTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/FontProviderTests.cs @@ -18,7 +18,7 @@ public class FontProviderTests : FontTestBase [TestInitialize] public void TestSetup() { - _robotoFont = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + _robotoFont = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); } [TestMethod] diff --git a/src/EPPlus.Fonts.OpenType.Tests/FontMeasurerPerformanceTest.cs b/src/EPPlus.Fonts.OpenType.Tests/FontMeasurerPerformanceTest.cs index 0bd23b175..cae6bd6e3 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/FontMeasurerPerformanceTest.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/FontMeasurerPerformanceTest.cs @@ -105,7 +105,7 @@ public void Wrap20Paragraphs100TimesMultipleTextFragments() public void QuickPeakMemoryTest() { var fontFolders = new List { /* your paths */ }; - var font = OpenTypeFonts.GetFontData(fontFolders, "Calibri", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Calibri", FontSubFamily.Regular, FontFolders); var shaper = new TextShaper(font); var layoutEngine = new TextLayoutEngine(shaper); @@ -145,7 +145,7 @@ public void QuickPeakMemoryTest() public void QuickPeakMemoryTest2() { var fontFolders = new List { /* your paths */ }; - var font = OpenTypeFonts.GetFontData(fontFolders, "Calibri", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Calibri", FontSubFamily.Regular, FontFolders); var shaper = new TextShaper(font); var layoutEngine = new TextLayoutEngine(shaper); diff --git a/src/EPPlus.Fonts.OpenType.Tests/FontSubsetManagerTests.cs b/src/EPPlus.Fonts.OpenType.Tests/FontSubsetManagerTests.cs index 1db76fb91..2bb0efe0d 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/FontSubsetManagerTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/FontSubsetManagerTests.cs @@ -14,7 +14,7 @@ public class FontSubsetManagerTests : FontTestBase private OpenTypeFont LoadTestFont() { // Adjust path to a font available in your test environment - return OpenTypeFonts.GetFontData(FontFolders, "Roboto", ignoreCache: true); + return OpenTypeFonts.LoadFont("Roboto"); } [TestMethod] diff --git a/src/EPPlus.Fonts.OpenType.Tests/FontTestBase.cs b/src/EPPlus.Fonts.OpenType.Tests/FontTestBase.cs index 2faf2b88b..febc2835b 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/FontTestBase.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/FontTestBase.cs @@ -10,6 +10,7 @@ Date Author Change ************************************************************************************************* 12/21/2025 EPPlus Software AB Test base class *************************************************************************************************/ +using EPPlus.Fonts.OpenType.FontResolver; using EPPlus.Fonts.OpenType.Tests.Helpers; namespace EPPlus.Fonts.OpenType.Tests @@ -112,7 +113,13 @@ protected static void DeleteOutputFont(string fileName) [TestInitialize] public void ClearAllCaches() { - //OpenTypeFonts.ClearFontCache(); + OpenTypeFonts.ClearFontCache(); + ConfigureResolver(); + } + + protected virtual void ConfigureResolver() + { + OpenTypeFonts.Configure(new DefaultFontResolver(FontFolders, false)); } [ClassInitialize(InheritanceBehavior.BeforeEachDerivedClass)] @@ -120,5 +127,19 @@ public static void BaseClassInitialize(TestContext context) { FontDirectoriesTestHelper.ClassInitialize(context); } + + /// + /// Temporarily configures the font resolver for the duration of one test. + /// Restores the default test resolver automatically via [TestCleanup]. + /// + protected static void UseSystemFonts() + { + OpenTypeFonts.Configure(new DefaultFontResolver(null, true)); + } + + protected static void UseFontFolders(IEnumerable directories, bool searchSystemDirectories = false) + { + OpenTypeFonts.Configure(new DefaultFontResolver(directories, searchSystemDirectories)); + } } } \ No newline at end of file diff --git a/src/EPPlus.Fonts.OpenType.Tests/Helpers/FontTestHelper.cs b/src/EPPlus.Fonts.OpenType.Tests/Helpers/FontTestHelper.cs index aa84e0d5d..1e8f1e2a4 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Helpers/FontTestHelper.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Helpers/FontTestHelper.cs @@ -85,7 +85,7 @@ public static byte[] SubsetAndSerialize( string text, List fontFolders) { - var font = OpenTypeFonts.GetFontData(fontFolders, fontName, FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont(fontName, FontSubFamily.Regular); var subset = font.CreateSubset(text); return subset.Serialize(); } @@ -98,7 +98,7 @@ public static byte[] SubsetAndSerialize( char[] chars, List fontFolders) { - var font = OpenTypeFonts.GetFontData(fontFolders, fontName, FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont(fontName, FontSubFamily.Regular); var subset = font.CreateSubset(chars); return subset.Serialize(); } @@ -115,13 +115,11 @@ public static OpenTypeFont RoundtripSubset( string text, List fontFolders) { - var font = OpenTypeFonts.GetFontData(fontFolders, fontName, FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont(fontName, FontSubFamily.Regular); var subset = font.CreateSubset(text); var bytes = subset.Serialize(); - var parsed = new OpenTypeFont( - bytes, - font.Format); + var parsed = new OpenTypeFont(bytes); AssertFontValid(parsed); @@ -136,13 +134,11 @@ public static OpenTypeFont RoundtripSubset( char[] chars, List fontFolders) { - var font = OpenTypeFonts.GetFontData(fontFolders, fontName, FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont(fontName, FontSubFamily.Regular); var subset = font.CreateSubset(chars); var bytes = subset.Serialize(); - var parsed = new OpenTypeFont( - bytes, - font.Format); + var parsed = new OpenTypeFont(bytes); AssertFontValid(parsed); diff --git a/src/EPPlus.Fonts.OpenType.Tests/Integration/MeasurerComparisonTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Integration/MeasurerComparisonTests.cs index afcb93bdb..4da69391e 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Integration/MeasurerComparisonTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Integration/MeasurerComparisonTests.cs @@ -23,7 +23,7 @@ public class MeasurerComparisonTests : FontTestBase public void Compare_MeasureSimpleText_ShouldBeClose() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); // Old measurer var oldMeasurer = new FontMeasurerTrueType(11f, "Roboto", FontSubFamily.Regular); @@ -59,7 +59,7 @@ public void Compare_MeasureSimpleText_ShouldBeClose() public void Compare_MeasureTextWithKerning_ShouldBeClose() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var oldMeasurer = new FontMeasurerTrueType(11f, "Roboto", FontSubFamily.Regular); @@ -88,7 +88,7 @@ public void Compare_MeasureTextWithKerning_ShouldBeClose() public void Compare_MeasureMultiLineText_NewImplementationFixesBugs() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var oldMeasurer = new FontMeasurerTrueType(11f, "Roboto", FontSubFamily.Regular); oldMeasurer.MeasureWrappedTextCells = true; @@ -157,7 +157,7 @@ public void Compare_MeasureMultiLineText_NewImplementationFixesBugs() public void Compare_GetSingleLineSpacing_ShouldMatch() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var oldMeasurer = new FontMeasurerTrueType(11f, "Roboto", FontSubFamily.Regular); var shaper = new TextShaper(font); @@ -178,7 +178,7 @@ public void Compare_GetSingleLineSpacing_ShouldMatch() public void Compare_GetBaseLine_ShouldMatch() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var oldMeasurer = new FontMeasurerTrueType(11f, "Roboto", FontSubFamily.Regular); var shaper = new TextShaper(font); @@ -203,7 +203,7 @@ public void Compare_GetBaseLine_ShouldMatch() public void Compare_WrapSimpleText_ShouldGiveSameLines() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var oldMeasurer = new FontMeasurerTrueType(11f, "Roboto", FontSubFamily.Regular); @@ -246,7 +246,7 @@ public void Compare_WrapSimpleText_ShouldGiveSameLines() public void Compare_WrapTextWithPreExistingWidth_ShouldGiveSameLines() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var oldMeasurer = new FontMeasurerTrueType(11f, "Roboto", FontSubFamily.Regular); var shaper = new TextShaper(font); @@ -287,7 +287,7 @@ public void Compare_WrapTextWithPreExistingWidth_ShouldGiveSameLines() public void Compare_WrapRichText_ShouldGiveSimilarLines() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var oldMeasurer = new FontMeasurerTrueType(11f, "Roboto", FontSubFamily.Regular); var shaper = new TextShaper(font); @@ -343,7 +343,7 @@ public void Compare_WrapRichText_ShouldGiveSimilarLines() public void Compare_EmptyString_BothShouldReturnZero() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var oldMeasurer = new FontMeasurerTrueType(11f, "Roboto", FontSubFamily.Regular); var shaper = new TextShaper(font); @@ -371,7 +371,7 @@ public void Compare_EmptyString_BothShouldReturnZero() public void Compare_SingleCharacter_ShouldMatch() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var oldMeasurer = new FontMeasurerTrueType(11f, "Roboto", FontSubFamily.Regular); var shaper = new TextShaper(font); diff --git a/src/EPPlus.Fonts.OpenType.Tests/Integration/TextLayoutEngineTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Integration/TextLayoutEngineTests.cs index 76c3fc3a1..911a81959 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Integration/TextLayoutEngineTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Integration/TextLayoutEngineTests.cs @@ -21,7 +21,7 @@ public class TextLayoutEngineTests : FontTestBase public void WrapText_ShortText_NoWrapping() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Calibri", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Calibri", FontSubFamily.Regular, FontFolders); var shaper = new TextShaper(font); var layout = new TextLayoutEngine(shaper, FontFolders); @@ -37,7 +37,7 @@ public void WrapText_ShortText_NoWrapping() public void WrapText_LongText_WrapsAtSpaces() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Calibri", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Calibri", FontSubFamily.Regular, FontFolders); var shaper = new TextShaper(font); var layout = new TextLayoutEngine(shaper); @@ -58,7 +58,7 @@ public void WrapText_LongText_WrapsAtSpaces() public void WrapText_WithLineBreaks_PreservesBreaks() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Calibri", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Calibri", FontSubFamily.Regular, FontFolders); var shaper = new TextShaper(font); var layout = new TextLayoutEngine(shaper); @@ -75,7 +75,7 @@ public void WrapText_WithLineBreaks_PreservesBreaks() [TestMethod] public void WrapText_TestWhenOnExactWrapPlusSpaces2() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Aptos Narrow", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Aptos Narrow", FontSubFamily.Regular, FontFolders); //'sit amet non' is EXACTLY 72 pixels (54 points) in excel at 100% size/display //So an added space should push 'non' over the edge to the next line var text = "sit amet non lacus."; @@ -98,7 +98,7 @@ public void WrapText_TestWhenOnExactWrapPlusSpaces2() [TestMethod] public void WrapText_TestWhenOnExactWrap() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Aptos Narrow", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Aptos Narrow", FontSubFamily.Regular, FontFolders); //'sit amet non' is EXACTLY 72 pixels (54 points) in excel at 100% size/display var text = "nulla efficitur commodo sit amet non lacus. Proin viverra enim"; var comparison = new List() { "nulla", "efficitur", "commodo", "sit amet non", "lacus. Proin", "viverra enim" }; @@ -118,7 +118,7 @@ public void WrapText_TestWhenOnExactWrap() [TestMethod] public void WrapText_TestFragments() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Aptos Narrow", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Aptos Narrow", FontSubFamily.Regular, FontFolders); var Lorem20Str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nulla pulvinar interdum imperdiet. Praesent ut auctor urna. Phasellus sollicitudin quam vitae est convallis, eu mattis lorem efficitur. Mauris nulla libero, tincidunt id ipsum non, lobortis tristique mauris. Donec ut enim sed enim fermentum molestie vel quis odio. Morbi a fermentum massa, sit amet ultrices est. Aenean ante mi, fermentum nec rhoncus et, vulputate vel sapien. Donec tempus, leo quis luctus rhoncus, augue odio pharetra libero, ac blandit urna turpis sed diam. Vivamus augue purus, eleifend et justo facilisis, imperdiet rhoncus sem. Quisque accumsan pellentesque elit, eget finibus massa accumsan in. Fusce eu accumsan enim. Cras pulvinar enim vel tellus lacinia, consectetur euismod tortor consectetur. Praesent tincidunt pretium eros, ac auctor magna luctus sed. Ut porta lectus quam, non ornare mauris lacinia sit amet. Nullam egestas dolor quis magna porttitor, ac iaculis nisi hendrerit. Proin at mollis lacus, in porttitor nunc. Aliquam erat volutpat. Sed vel egestas risus, at aliquam arcu. Vestibulum quis lobortis nulla. Etiam pellentesque auctor nulla, eget tincidunt felis rhoncus id. Sed metus ante, efficitur id dui eu, fermentum mollis odio. Phasellus ullamcorper iaculis augue vel consequat. Etiam fringilla euismod interdum. Ut molestie massa id fringilla lobortis. Vestibulum malesuada, ante vel mattis ultrices, sem ante molestie augue, non tristique dui mi non nibh. Maecenas dictum, sem eget convallis rhoncus, lacus enim porta neque, in posuere dui ex a sapien. Nam lacus nibh, posuere sed elit eget, condimentum facilisis ligula. Cras consectetur lacus ullamcorper velit aliquet bibendum eget vel nulla. Aenean varius ac erat quis ullamcorper. Donec laoreet arcu a lorem volutpat faucibus. Vivamus vehicula leo ut erat luctus scelerisque. Morbi posuere ex et magna egestas facilisis. Fusce scelerisque volutpat erat bibendum hendrerit. Nam blandit mi ut metus pulvinar, vel tempus lacus euismod. Quisque imperdiet sit amet sapien sed ultricies. Phasellus sodales, ipsum vitae tincidunt facilisis, nulla ligula faucibus felis, eget vehicula ante lacus eu lorem. Integer congue diam ac viverra tristique. Curabitur tristique dolor quis quam pretium, et scelerisque quam dictum. Maecenas vitae sodales ligula. Pellentesque maximus diam vel porta convallis. Ut aliquam eros quis porta pellentesque. Fusce in ex ut mi egestas cursus. Aliquam erat volutpat. Cras laoreet condimentum laoreet. Sed eget facilisis tellus. Morbi viverra odio sed odio placerat mollis. Duis turpis metus, dignissim varius urna quis, viverra dignissim dui. Vivamus viverra at nisi quis convallis. Suspendisse fringilla risus et ante sollicitudin, sed eleifend sem placerat. Proin pretium blandit arcu, eget rhoncus risus hendrerit at. Interdum et malesuada fames ac ante ipsum primis in faucibus. Phasellus vulputate efficitur maximus. Cras blandit nulla eu nisi auctor tempus. Sed pretium lacus ac magna vestibulum, aliquam faucibus orci luctus. Mauris enim lorem, varius ut ante quis, varius viverra lectus. Fusce blandit nibh vel feugiat efficitur. Donec maximus id justo ac mollis. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nulla placerat lectus et purus dictum, id congue nisi euismod. Maecenas euismod fermentum diam, sit amet gravida magna suscipit a. Quisque consectetur arcu eu nunc sodales scelerisque. Nulla non tincidunt nulla. Pellentesque ut tortor vel enim convallis malesuada. Aliquam ultricies bibendum ultrices. Mauris rutrum ac nisl vel luctus. Donec quis nibh vitae orci ultricies gravida. Aliquam vitae velit porttitor lorem bibendum fringilla volutpat a eros. Curabitur at commodo tortor. Etiam ultricies, neque et iaculis euismod, diam ligula luctus mi, vitae lobortis felis lorem eu nulla. Sed a semper ex. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nulla mauris elit, pulvinar ac tortor et, luctus hendrerit nisl. In egestas auctor urna vitae laoreet. Praesent bibendum egestas convallis. Proin non suscipit tellus. Nullam at nibh in urna laoreet sodales non vel tellus. Donec in enim dui. Phasellus quis quam tincidunt, pellentesque lorem ac, scelerisque neque. Integer nec tempus urna. Donec elit massa, eleifend eu sapien sit amet, mollis pellentesque est. Nullam tristique tellus iaculis arcu consectetur pretium. Sed venenatis convallis scelerisque. Suspendisse varius urna sit amet purus accumsan, id ultricies erat efficitur. Cras non ipsum eget nulla efficitur commodo sit amet non lacus. Proin viverra enim sit amet enim tempus ullamcorper. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Duis ac massa interdum, gravida ex egestas, finibus purus. Nunc consectetur commodo lacus, ac convallis quam lobortis eu. Sed convallis tempor commodo. Nulla sed convallis mauris. Donec venenatis nisi est, ac ullamcorper mi pretium quis. Donec vitae eros at ipsum interdum scelerisque nec vitae nisi. Sed vestibulum erat ac bibendum dapibus. Morbi nec elit id quam tristique cursus id sed sem. Praesent non ante enim. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Praesent non mauris dui. Aliquam rhoncus mattis ante sed venenatis. Vivamus vehicula sed sapien sed dictum. In aliquet, urna efficitur tincidunt lobortis, nibh justo tristique purus, sed volutpat risus magna et libero.Suspendisse lectus justo, varius eget arcu et, semper laoreet erat. Quisque eget lacus ornare, pellentesque erat sit amet, vulputate felis. Duis luctus, massa a pellentesque mollis, massa elit convallis mi, vel bibendum ex ex eu purus. Suspendisse vel fermentum urna, ac commodo enim. Mauris tincidunt cursus elit, a volutpat libero commodo et. Etiam dapibus libero venenatis tellus lobortis, vel lacinia elit faucibus. Maecenas semper sed quam quis finibus. Integer efficitur, libero imperdiet sollicitudin commodo, elit arcu vulputate est, eget finibus mi urna sit amet magna. Cras ullamcorper consequat ornare. Fusce convallis nunc vel risus cursus, at maximus ligula cursus. Pellentesque vulputate risus libero, eget cursus nibh sodales sed. Donec accumsan sem et massa semper, id dignissim velit vehicula.Cras cursus ipsum ac erat vehicula, nec iaculis purus dictum. Quisque lacinia elit vitae leo dictum, vel dignissim velit dapibus. Aenean sem nisi, faucibus interdum justo eu, euismod porttitor ex. Morbi et lectus lectus. Duis neque felis, suscipit at scelerisque eu, scelerisque id orci. Curabitur et placerat ipsum. Proin gravida sapien nisl, et varius ipsum mollis nec. Quisque dignissim consectetur feugiat. Aenean eros purus, laoreet interdum rutrum at, aliquet sit amet lectus. Donec gravida lorem ut tincidunt laoreet. Donec consequat viverra ligula, in accumsan mi bibendum scelerisque. Quisque ac risus justo. Morbi magna arcu, egestas nec luctus commodo, cursus eget nunc. Vivamus euismod lorem ex, et maximus felis hendrerit eget. Nullam ullamcorper euismod ligula, et iaculis ligula ultricies a. Fusce aliquam, enim vel fermentum ultrices, elit quam semper erat, vitae semper velit augue non magna.Quisque maximus semper arcu, id pellentesque est tempus a. Phasellus lacus elit, auctor sit amet lacinia a, dapibus vitae velit. Phasellus ut pharetra justo, ut ultricies erat. Sed molestie sapien vel interdum lobortis. Nulla facilisi. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Nulla nec mauris quis nisi vulputate gravida quis nec velit.Nam et congue ipsum. Nulla vel elit non dolor mollis aliquet vel at magna. Pellentesque nec facilisis elit. In vulputate quis sem porta suscipit. Nullam sed ex ornare nibh suscipit mattis quis non lacus. Mauris vel ex urna. Vivamus ultricies sapien sit amet sapien vehicula gravida. Donec feugiat volutpat quam. Vestibulum auctor dictum nisl, id hendrerit metus ullamcorper sed. Nulla maximus lacus vel mollis maximus. Nulla laoreet placerat quam eu viverra. Etiam feugiat accumsan nisl a condimentum. Sed ultricies ante ante, ac auctor ligula gravida nec. Praesent a neque dignissim, sagittis felis sit amet, condimentum turpis. Fusce at leo vel est blandit malesuada. Pellentesque et neque non metus pellentesque imperdiet. Praesent pellentesque lacinia lorem, et tristique tellus efficitur id. Suspendisse aliquet ultricies justo vitae interdum. Cras tristique viverra quam, eget gravida mi fermentum imperdiet. Sed imperdiet vitae purus ut volutpat. Nulla lacinia elit in fermentum consectetur. Phasellus commodo ut nisl sit amet sagittis. Duis ac ornare orci. Vivamus vel enim posuere, pharetra ex vel, elementum est. Vestibulum commodo luctus metus eget maximus. Suspendisse a nulla a odio eleifend faucibus. Suspendisse semper lacus non porttitor aliquet. Cras ac scelerisque magna, et pulvinar justo. Integer cursus pulvinar fringilla. Mauris imperdiet nibh sit amet tempor laoreet. Morbi tincidunt tortor ex, sit amet maximus purus tristique quis. Quisque sed hendrerit velit. Mauris mattis nibh ut eros luctus, eget mattis massa auctor. Phasellus eu neque at augue gravida sagittis nec non tortor. Etiam porttitor sem sodales mi ullamcorper gravida. In in dictum orci. In vitae vestibulum quam. Cras augue eros, tincidunt ac elit posuere, sollicitudin efficitur lectus. Praesent quis sodales nisl. Proin sit amet molestie est. In commodo mauris vel mauris efficitur, nec mollis mauris sagittis. Cras ligula nibh, egestas sit amet eros in, lacinia tristique magna. Cras risus libero, lacinia eget libero vitae, maximus aliquet nibh. Mauris id sodales purus, vitae dictum lectus. Cras consectetur ligula velit, tempus pulvinar lacus porttitor vitae. Phasellus eget tellus ipsum. Donec interdum laoreet elit non vestibulum. Cras sed urna ullamcorper, aliquam erat eget, porta orci. Vestibulum eget congue nulla. Sed sem tortor, euismod at rutrum id, sagittis a nunc. Duis in nibh facilisis, dignissim purus ut, hendrerit magna. Sed semper ligula id massa elementum, non malesuada velit egestas. Nullam dictum, mi nec euismod sagittis, ligula leo ullamcorper dolor, quis faucibus odio metus eget magna. Ut gravida metus non metus bibendum bibendum. In sagittis eleifend aliquet. Interdum et malesuada fames ac ante ipsum primis in faucibus. Nam mollis sagittis felis, in faucibus tortor pretium vel. Nam nec enim metus. Donec in augue arcu. Proin non lobortis purus, sit amet lacinia elit. Suspendisse quis eros condimentum, blandit justo sit amet, lobortis nisl. Suspendisse maximus massa sed urna tempor ornare. Nunc malesuada purus odio, eu luctus lectus auctor nec. Morbi auctor pellentesque auctor. Sed ullamcorper, ex vitae aliquam vulputate, est diam feugiat mi, id porttitor lectus orci ac leo. Donec sit amet velit pulvinar, venenatis turpis ut, interdum ligula. Interdum et malesuada fames ac ante ipsum primis in faucibus. Vestibulum eu lacus urna. Maecenas sem nulla, accumsan eu ultricies sed, tempor vel magna. Cras aliquet sollicitudin sapien ac pulvinar. Praesent ac sodales mi. Integer vitae mauris massa. Maecenas iaculis orci et faucibus interdum. Nunc nec maximus felis, sed finibus quam. Pellentesque felis massa, vestibulum in tellus vitae, congue tincidunt justo. Nunc vitae enim malesuada, bibendum ante nec, varius tellus. Praesent vitae nisi id quam auctor lacinia at non quam. Nam nec ligula sit amet felis auctor sagittis. Nunc in risus eu urna varius laoreet quis sit amet felis. Morbi varius tempor orci, eu vestibulum nunc vestibulum ac. Nunc vehicula velit eleifend consequat porta. Suspendisse maximus dapibus orci, in vulputate massa pretium ac. Quisque malesuada aliquet aliquet."; const string SavedComparisonString = "Lorem\r\nipsum dolor\r\nsit amet,\r\nconsectetur\r\nadipiscing\r\nelit. Nulla\r\npulvinar\r\ninterdum\r\nimperdiet.\r\nPraesent ut\r\nauctor urna.\r\nPhasellus\r\nsollicitudin\r\nquam vitae\r\nest\r\nconvallis,\r\neu mattis\r\nlorem\r\nefficitur.\r\nMauris nulla\r\nlibero,\r\ntincidunt id\r\nipsum non,\r\nlobortis\r\ntristique\r\nmauris.\r\nDonec ut\r\nenim sed\r\nenim\r\nfermentum\r\nmolestie vel\r\nquis odio.\r\nMorbi a\r\nfermentum\r\nmassa, sit\r\namet\r\nultrices est.\r\nAenean\r\nante mi,\r\nfermentum\r\nnec\r\nrhoncus et,\r\nvulputate\r\nvel sapien.\r\nDonec\r\ntempus, leo\r\nquis luctus\r\nrhoncus,\r\naugue odio\r\npharetra\r\nlibero, ac\r\nblandit urna\r\nturpis sed\r\ndiam.\r\nVivamus\r\naugue\r\npurus,\r\neleifend et\r\njusto\r\nfacilisis,\r\nimperdiet\r\nrhoncus\r\nsem.\r\nQuisque\r\naccumsan\r\npellentesqu\r\ne elit, eget\r\nfinibus\r\nmassa\r\naccumsan\r\nin. Fusce eu\r\naccumsan\r\nenim. Cras\r\npulvinar\r\nenim vel\r\ntellus\r\nlacinia,\r\nconsectetur\r\neuismod\r\ntortor\r\nconsectetur\r\n. Praesent\r\ntincidunt\r\npretium\r\neros, ac\r\nauctor\r\nmagna\r\nluctus sed.\r\nUt porta\r\nlectus\r\nquam, non\r\nornare\r\nmauris\r\nlacinia sit\r\namet.\r\nNullam\r\negestas\r\ndolor quis\r\nmagna\r\nporttitor, ac\r\niaculis nisi\r\nhendrerit.\r\nProin at\r\nmollis\r\nlacus, in\r\nporttitor\r\nnunc.\r\nAliquam\r\nerat\r\nvolutpat.\r\nSed vel\r\negestas\r\nrisus, at\r\naliquam\r\narcu.\r\nVestibulum\r\nquis\r\nlobortis\r\nnulla. Etiam\r\npellentesqu\r\ne auctor\r\nnulla, eget\r\ntincidunt\r\nfelis\r\nrhoncus id.\r\nSed metus\r\nante,\r\nefficitur id\r\ndui eu,\r\nfermentum\r\nmollis odio.\r\nPhasellus\r\nullamcorper\r\niaculis\r\naugue vel\r\nconsequat.\r\nEtiam\r\nfringilla\r\neuismod\r\ninterdum.\r\nUt molestie\r\nmassa id\r\nfringilla\r\nlobortis.\r\nVestibulum\r\nmalesuada,\r\nante vel\r\nmattis\r\nultrices,\r\nsem ante\r\nmolestie\r\naugue, non\r\ntristique dui\r\nmi non\r\nnibh.\r\nMaecenas\r\ndictum,\r\nsem eget\r\nconvallis\r\nrhoncus,\r\nlacus enim\r\nporta\r\nneque, in\r\nposuere dui\r\nex a sapien.\r\nNam lacus\r\nnibh,\r\nposuere sed\r\nelit eget,\r\ncondimentu\r\nm facilisis\r\nligula. Cras\r\nconsectetur\r\nlacus\r\nullamcorper\r\nvelit aliquet\r\nbibendum\r\neget vel\r\nnulla.\r\nAenean\r\nvarius ac\r\nerat quis\r\nullamcorper\r\n. Donec\r\nlaoreet arcu\r\na lorem\r\nvolutpat\r\nfaucibus.\r\nVivamus\r\nvehicula leo\r\nut erat\r\nluctus\r\nscelerisque.\r\nMorbi\r\nposuere ex\r\net magna\r\negestas\r\nfacilisis.\r\nFusce\r\nscelerisque\r\nvolutpat\r\nerat\r\nbibendum\r\nhendrerit.\r\nNam blandit\r\nmi ut metus\r\npulvinar, vel\r\ntempus\r\nlacus\r\neuismod.\r\nQuisque\r\nimperdiet\r\nsit amet\r\nsapien sed\r\nultricies.\r\nPhasellus\r\nsodales,\r\nipsum vitae\r\ntincidunt\r\nfacilisis,\r\nnulla ligula\r\nfaucibus\r\nfelis, eget\r\nvehicula\r\nante lacus\r\neu lorem.\r\nInteger\r\ncongue\r\ndiam ac\r\nviverra\r\ntristique.\r\nCurabitur\r\ntristique\r\ndolor quis\r\nquam\r\npretium, et\r\nscelerisque\r\nquam\r\ndictum.\r\nMaecenas\r\nvitae\r\nsodales\r\nligula.\r\nPellentesqu\r\ne maximus\r\ndiam vel\r\nporta\r\nconvallis. Ut\r\naliquam\r\neros quis\r\nporta\r\npellentesqu\r\ne. Fusce in\r\nex ut mi\r\negestas\r\ncursus.\r\nAliquam\r\nerat\r\nvolutpat.\r\nCras laoreet\r\ncondimentu\r\nm laoreet.\r\nSed eget\r\nfacilisis\r\ntellus.\r\nMorbi\r\nviverra odio\r\nsed odio\r\nplacerat\r\nmollis. Duis\r\nturpis\r\nmetus,\r\ndignissim\r\nvarius urna\r\nquis, viverra\r\ndignissim\r\ndui.\r\nVivamus\r\nviverra at\r\nnisi quis\r\nconvallis.\r\nSuspendiss\r\ne fringilla\r\nrisus et ante\r\nsollicitudin,\r\nsed eleifend\r\nsem\r\nplacerat.\r\nProin\r\npretium\r\nblandit\r\narcu, eget\r\nrhoncus\r\nrisus\r\nhendrerit at.\r\nInterdum et\r\nmalesuada\r\nfames ac\r\nante ipsum\r\nprimis in\r\nfaucibus.\r\nPhasellus\r\nvulputate\r\nefficitur\r\nmaximus.\r\nCras blandit\r\nnulla eu nisi\r\nauctor\r\ntempus.\r\nSed pretium\r\nlacus ac\r\nmagna\r\nvestibulum,\r\naliquam\r\nfaucibus\r\norci luctus.\r\nMauris enim\r\nlorem,\r\nvarius ut\r\nante quis,\r\nvarius\r\nviverra\r\nlectus.\r\nFusce\r\nblandit nibh\r\nvel feugiat\r\nefficitur.\r\nDonec\r\nmaximus id\r\njusto ac\r\nmollis.\r\nVestibulum\r\nante ipsum\r\nprimis in\r\nfaucibus\r\norci luctus\r\net ultrices\r\nposuere\r\ncubilia\r\ncurae; Nulla\r\nplacerat\r\nlectus et\r\npurus\r\ndictum, id\r\ncongue nisi\r\neuismod.\r\nMaecenas\r\neuismod\r\nfermentum\r\ndiam, sit\r\namet\r\ngravida\r\nmagna\r\nsuscipit a.\r\nQuisque\r\nconsectetur\r\narcu eu\r\nnunc\r\nsodales\r\nscelerisque.\r\nNulla non\r\ntincidunt\r\nnulla.\r\nPellentesqu\r\ne ut tortor\r\nvel enim\r\nconvallis\r\nmalesuada.\r\nAliquam\r\nultricies\r\nbibendum\r\nultrices.\r\nMauris\r\nrutrum ac\r\nnisl vel\r\nluctus.\r\nDonec quis\r\nnibh vitae\r\norci ultricies\r\ngravida.\r\nAliquam\r\nvitae velit\r\nporttitor\r\nlorem\r\nbibendum\r\nfringilla\r\nvolutpat a\r\neros.\r\nCurabitur at\r\ncommodo\r\ntortor. Etiam\r\nultricies,\r\nneque et\r\niaculis\r\neuismod,\r\ndiam ligula\r\nluctus mi,\r\nvitae\r\nlobortis felis\r\nlorem eu\r\nnulla. Sed a\r\nsemper ex.\r\nInterdum et\r\nmalesuada\r\nfames ac\r\nante ipsum\r\nprimis in\r\nfaucibus.\r\nNulla\r\nmauris elit,\r\npulvinar ac\r\ntortor et,\r\nluctus\r\nhendrerit\r\nnisl. In\r\negestas\r\nauctor urna\r\nvitae\r\nlaoreet.\r\nPraesent\r\nbibendum\r\negestas\r\nconvallis.\r\nProin non\r\nsuscipit\r\ntellus.\r\nNullam at\r\nnibh in urna\r\nlaoreet\r\nsodales non\r\nvel tellus.\r\nDonec in\r\nenim dui.\r\nPhasellus\r\nquis quam\r\ntincidunt,\r\npellentesqu\r\ne lorem ac,\r\nscelerisque\r\nneque.\r\nInteger nec\r\ntempus\r\nurna. Donec\r\nelit massa,\r\neleifend eu\r\nsapien sit\r\namet,\r\nmollis\r\npellentesqu\r\ne est.\r\nNullam\r\ntristique\r\ntellus\r\niaculis arcu\r\nconsectetur\r\npretium.\r\nSed\r\nvenenatis\r\nconvallis\r\nscelerisque.\r\nSuspendiss\r\ne varius\r\nurna sit\r\namet purus\r\naccumsan,\r\nid ultricies\r\nerat\r\nefficitur.\r\nCras non\r\nipsum eget\r\nnulla\r\nefficitur\r\ncommodo\r\nsit amet non\r\nlacus. Proin\r\nviverra enim\r\nsit amet\r\nenim\r\ntempus\r\nullamcorper\r\n. Class\r\naptent taciti\r\nsociosqu ad\r\nlitora\r\ntorquent per\r\nconubia\r\nnostra, per\r\ninceptos\r\nhimenaeos.\r\nDuis ac\r\nmassa\r\ninterdum,\r\ngravida ex\r\negestas,\r\nfinibus\r\npurus. Nunc\r\nconsectetur\r\ncommodo\r\nlacus, ac\r\nconvallis\r\nquam\r\nlobortis eu.\r\nSed\r\nconvallis\r\ntempor\r\ncommodo.\r\nNulla sed\r\nconvallis\r\nmauris.\r\nDonec\r\nvenenatis\r\nnisi est, ac\r\nullamcorper\r\nmi pretium\r\nquis. Donec\r\nvitae eros at\r\nipsum\r\ninterdum\r\nscelerisque\r\nnec vitae\r\nnisi. Sed\r\nvestibulum\r\nerat ac\r\nbibendum\r\ndapibus.\r\nMorbi nec\r\nelit id quam\r\ntristique\r\ncursus id\r\nsed sem.\r\nPraesent\r\nnon ante\r\nenim.\r\nPellentesqu\r\ne habitant\r\nmorbi\r\ntristique\r\nsenectus et\r\nnetus et\r\nmalesuada\r\nfames ac\r\nturpis\r\negestas.\r\nPraesent\r\nnon mauris\r\ndui.\r\nAliquam\r\nrhoncus\r\nmattis ante\r\nsed\r\nvenenatis.\r\nVivamus\r\nvehicula\r\nsed sapien\r\nsed dictum.\r\nIn aliquet,\r\nurna\r\nefficitur\r\ntincidunt\r\nlobortis,\r\nnibh justo\r\ntristique\r\npurus, sed\r\nvolutpat\r\nrisus magna\r\net\r\nlibero.Susp\r\nendisse\r\nlectus justo,\r\nvarius eget\r\narcu et,\r\nsemper\r\nlaoreet erat.\r\nQuisque\r\neget lacus\r\nornare,\r\npellentesqu\r\ne erat sit\r\namet,\r\nvulputate\r\nfelis. Duis\r\nluctus,\r\nmassa a\r\npellentesqu\r\ne mollis,\r\nmassa elit\r\nconvallis\r\nmi, vel\r\nbibendum\r\nex ex eu\r\npurus.\r\nSuspendiss\r\ne vel\r\nfermentum\r\nurna, ac\r\ncommodo\r\nenim.\r\nMauris\r\ntincidunt\r\ncursus elit,\r\na volutpat\r\nlibero\r\ncommodo\r\net. Etiam\r\ndapibus\r\nlibero\r\nvenenatis\r\ntellus\r\nlobortis, vel\r\nlacinia elit\r\nfaucibus.\r\nMaecenas\r\nsemper sed\r\nquam quis\r\nfinibus.\r\nInteger\r\nefficitur,\r\nlibero\r\nimperdiet\r\nsollicitudin\r\ncommodo,\r\nelit arcu\r\nvulputate\r\nest, eget\r\nfinibus mi\r\nurna sit\r\namet\r\nmagna.\r\nCras\r\nullamcorper\r\nconsequat\r\nornare.\r\nFusce\r\nconvallis\r\nnunc vel\r\nrisus\r\ncursus, at\r\nmaximus\r\nligula\r\ncursus.\r\nPellentesqu\r\ne vulputate\r\nrisus libero,\r\neget cursus\r\nnibh\r\nsodales\r\nsed. Donec\r\naccumsan\r\nsem et\r\nmassa\r\nsemper, id\r\ndignissim\r\nvelit\r\nvehicula.Cr\r\nas cursus\r\nipsum ac\r\nerat\r\nvehicula,\r\nnec iaculis\r\npurus\r\ndictum.\r\nQuisque\r\nlacinia elit\r\nvitae leo\r\ndictum, vel\r\ndignissim\r\nvelit\r\ndapibus.\r\nAenean sem\r\nnisi,\r\nfaucibus\r\ninterdum\r\njusto eu,\r\neuismod\r\nporttitor ex.\r\nMorbi et\r\nlectus\r\nlectus. Duis\r\nneque felis,\r\nsuscipit at\r\nscelerisque\r\neu,\r\nscelerisque\r\nid orci.\r\nCurabitur et\r\nplacerat\r\nipsum.\r\nProin\r\ngravida\r\nsapien nisl,\r\net varius\r\nipsum\r\nmollis nec.\r\nQuisque\r\ndignissim\r\nconsectetur\r\nfeugiat.\r\nAenean\r\neros purus,\r\nlaoreet\r\ninterdum\r\nrutrum at,\r\naliquet sit\r\namet\r\nlectus.\r\nDonec\r\ngravida\r\nlorem ut\r\ntincidunt\r\nlaoreet.\r\nDonec\r\nconsequat\r\nviverra\r\nligula, in\r\naccumsan\r\nmi\r\nbibendum\r\nscelerisque.\r\nQuisque ac\r\nrisus justo.\r\nMorbi\r\nmagna\r\narcu,\r\negestas nec\r\nluctus\r\ncommodo,\r\ncursus eget\r\nnunc.\r\nVivamus\r\neuismod\r\nlorem ex, et\r\nmaximus\r\nfelis\r\nhendrerit\r\neget.\r\nNullam\r\nullamcorper\r\neuismod\r\nligula, et\r\niaculis\r\nligula\r\nultricies a.\r\nFusce\r\naliquam,\r\nenim vel\r\nfermentum\r\nultrices, elit\r\nquam\r\nsemper\r\nerat, vitae\r\nsemper velit\r\naugue non\r\nmagna.Quis\r\nque\r\nmaximus\r\nsemper\r\narcu, id\r\npellentesqu\r\ne est\r\ntempus a.\r\nPhasellus\r\nlacus elit,\r\nauctor sit\r\namet lacinia\r\na, dapibus\r\nvitae velit.\r\nPhasellus ut\r\npharetra\r\njusto, ut\r\nultricies\r\nerat. Sed\r\nmolestie\r\nsapien vel\r\ninterdum\r\nlobortis.\r\nNulla\r\nfacilisi.\r\nVestibulum\r\nante ipsum\r\nprimis in\r\nfaucibus\r\norci luctus\r\net ultrices\r\nposuere\r\ncubilia\r\ncurae; Nulla\r\nnec mauris\r\nquis nisi\r\nvulputate\r\ngravida quis\r\nnec\r\nvelit.Nam et\r\ncongue\r\nipsum.\r\nNulla vel elit\r\nnon dolor\r\nmollis\r\naliquet vel\r\nat magna.\r\nPellentesqu\r\ne nec\r\nfacilisis elit.\r\nIn vulputate\r\nquis sem\r\nporta\r\nsuscipit.\r\nNullam sed\r\nex ornare\r\nnibh\r\nsuscipit\r\nmattis quis\r\nnon lacus.\r\nMauris vel\r\nex urna.\r\nVivamus\r\nultricies\r\nsapien sit\r\namet sapien\r\nvehicula\r\ngravida.\r\nDonec\r\nfeugiat\r\nvolutpat\r\nquam.\r\nVestibulum\r\nauctor\r\ndictum nisl,\r\nid hendrerit\r\nmetus\r\nullamcorper\r\nsed. Nulla\r\nmaximus\r\nlacus vel\r\nmollis\r\nmaximus.\r\nNulla\r\nlaoreet\r\nplacerat\r\nquam eu\r\nviverra.\r\nEtiam\r\nfeugiat\r\naccumsan\r\nnisl a\r\ncondimentu\r\nm. Sed\r\nultricies\r\nante ante,\r\nac auctor\r\nligula\r\ngravida nec.\r\nPraesent a\r\nneque\r\ndignissim,\r\nsagittis felis\r\nsit amet,\r\ncondimentu\r\nm turpis.\r\nFusce at leo\r\nvel est\r\nblandit\r\nmalesuada.\r\nPellentesqu\r\ne et neque\r\nnon metus\r\npellentesqu\r\ne imperdiet.\r\nPraesent\r\npellentesqu\r\ne lacinia\r\nlorem, et\r\ntristique\r\ntellus\r\nefficitur id.\r\nSuspendiss\r\ne aliquet\r\nultricies\r\njusto vitae\r\ninterdum.\r\nCras\r\ntristique\r\nviverra\r\nquam, eget\r\ngravida mi\r\nfermentum\r\nimperdiet.\r\nSed\r\nimperdiet\r\nvitae purus\r\nut volutpat.\r\nNulla\r\nlacinia elit\r\nin\r\nfermentum\r\nconsectetur\r\n. Phasellus\r\ncommodo\r\nut nisl sit\r\namet\r\nsagittis.\r\nDuis ac\r\nornare orci.\r\nVivamus vel\r\nenim\r\nposuere,\r\npharetra ex\r\nvel,\r\nelementum\r\nest.\r\nVestibulum\r\ncommodo\r\nluctus\r\nmetus eget\r\nmaximus.\r\nSuspendiss\r\ne a nulla a\r\nodio\r\neleifend\r\nfaucibus.\r\nSuspendiss\r\ne semper\r\nlacus non\r\nporttitor\r\naliquet.\r\nCras ac\r\nscelerisque\r\nmagna, et\r\npulvinar\r\njusto.\r\nInteger\r\ncursus\r\npulvinar\r\nfringilla.\r\nMauris\r\nimperdiet\r\nnibh sit\r\namet\r\ntempor\r\nlaoreet.\r\nMorbi\r\ntincidunt\r\ntortor ex, sit\r\namet\r\nmaximus\r\npurus\r\ntristique\r\nquis.\r\nQuisque\r\nsed\r\nhendrerit\r\nvelit. Mauris\r\nmattis nibh\r\nut eros\r\nluctus, eget\r\nmattis\r\nmassa\r\nauctor.\r\nPhasellus\r\neu neque at\r\naugue\r\ngravida\r\nsagittis nec\r\nnon tortor.\r\nEtiam\r\nporttitor\r\nsem\r\nsodales mi\r\nullamcorper\r\ngravida. In\r\nin dictum\r\norci. In vitae\r\nvestibulum\r\nquam. Cras\r\naugue eros,\r\ntincidunt ac\r\nelit posuere,\r\nsollicitudin\r\nefficitur\r\nlectus.\r\nPraesent\r\nquis\r\nsodales\r\nnisl. Proin\r\nsit amet\r\nmolestie\r\nest. In\r\ncommodo\r\nmauris vel\r\nmauris\r\nefficitur,\r\nnec mollis\r\nmauris\r\nsagittis.\r\nCras ligula\r\nnibh,\r\negestas sit\r\namet eros\r\nin, lacinia\r\ntristique\r\nmagna.\r\nCras risus\r\nlibero,\r\nlacinia eget\r\nlibero vitae,\r\nmaximus\r\naliquet\r\nnibh. Mauris\r\nid sodales\r\npurus, vitae\r\ndictum\r\nlectus. Cras\r\nconsectetur\r\nligula velit,\r\ntempus\r\npulvinar\r\nlacus\r\nporttitor\r\nvitae.\r\nPhasellus\r\neget tellus\r\nipsum.\r\nDonec\r\ninterdum\r\nlaoreet elit\r\nnon\r\nvestibulum.\r\nCras sed\r\nurna\r\nullamcorper\r\n, aliquam\r\nerat eget,\r\nporta orci.\r\nVestibulum\r\neget congue\r\nnulla. Sed\r\nsem tortor,\r\neuismod at\r\nrutrum id,\r\nsagittis a\r\nnunc. Duis\r\nin nibh\r\nfacilisis,\r\ndignissim\r\npurus ut,\r\nhendrerit\r\nmagna. Sed\r\nsemper\r\nligula id\r\nmassa\r\nelementum,\r\nnon\r\nmalesuada\r\nvelit\r\negestas.\r\nNullam\r\ndictum, mi\r\nnec\r\neuismod\r\nsagittis,\r\nligula leo\r\nullamcorper\r\ndolor, quis\r\nfaucibus\r\nodio metus\r\neget magna.\r\nUt gravida\r\nmetus non\r\nmetus\r\nbibendum\r\nbibendum.\r\nIn sagittis\r\neleifend\r\naliquet.\r\nInterdum et\r\nmalesuada\r\nfames ac\r\nante ipsum\r\nprimis in\r\nfaucibus.\r\nNam mollis\r\nsagittis\r\nfelis, in\r\nfaucibus\r\ntortor\r\npretium vel.\r\nNam nec\r\nenim\r\nmetus.\r\nDonec in\r\naugue arcu.\r\nProin non\r\nlobortis\r\npurus, sit\r\namet lacinia\r\nelit.\r\nSuspendiss\r\ne quis eros\r\ncondimentu\r\nm, blandit\r\njusto sit\r\namet,\r\nlobortis nisl.\r\nSuspendiss\r\ne maximus\r\nmassa sed\r\nurna tempor\r\nornare.\r\nNunc\r\nmalesuada\r\npurus odio,\r\neu luctus\r\nlectus\r\nauctor nec.\r\nMorbi\r\nauctor\r\npellentesqu\r\ne auctor.\r\nSed\r\nullamcorper\r\n, ex vitae\r\naliquam\r\nvulputate,\r\nest diam\r\nfeugiat mi,\r\nid porttitor\r\nlectus orci\r\nac leo.\r\nDonec sit\r\namet velit\r\npulvinar,\r\nvenenatis\r\nturpis ut,\r\ninterdum\r\nligula.\r\nInterdum et\r\nmalesuada\r\nfames ac\r\nante ipsum\r\nprimis in\r\nfaucibus.\r\nVestibulum\r\neu lacus\r\nurna.\r\nMaecenas\r\nsem nulla,\r\naccumsan\r\neu ultricies\r\nsed, tempor\r\nvel magna.\r\nCras aliquet\r\nsollicitudin\r\nsapien ac\r\npulvinar.\r\nPraesent ac\r\nsodales mi.\r\nInteger vitae\r\nmauris\r\nmassa.\r\nMaecenas\r\niaculis orci\r\net faucibus\r\ninterdum.\r\nNunc nec\r\nmaximus\r\nfelis, sed\r\nfinibus\r\nquam.\r\nPellentesqu\r\ne felis\r\nmassa,\r\nvestibulum\r\nin tellus\r\nvitae,\r\ncongue\r\ntincidunt\r\njusto. Nunc\r\nvitae enim\r\nmalesuada,\r\nbibendum\r\nante nec,\r\nvarius\r\ntellus.\r\nPraesent\r\nvitae nisi id\r\nquam\r\nauctor\r\nlacinia at\r\nnon quam.\r\nNam nec\r\nligula sit\r\namet felis\r\nauctor\r\nsagittis.\r\nNunc in\r\nrisus eu\r\nurna varius\r\nlaoreet quis\r\nsit amet\r\nfelis. Morbi\r\nvarius\r\ntempor orci,\r\neu\r\nvestibulum\r\nnunc\r\nvestibulum\r\nac. Nunc\r\nvehicula\r\nvelit\r\neleifend\r\nconsequat\r\nporta.\r\nSuspendiss\r\ne maximus\r\ndapibus\r\norci, in\r\nvulputate\r\nmassa\r\npretium ac.\r\nQuisque\r\nmalesuada\r\naliquet\r\naliquet."; @@ -161,7 +161,7 @@ public void WrapText_TestFragments() public void WrapText_WithPreExistingWidth_AccountsForIt() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Calibri", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Calibri", FontSubFamily.Regular, FontFolders); var shaper = new TextShaper(font); var layout = new TextLayoutEngine(shaper); @@ -181,7 +181,7 @@ public void WrapText_WithPreExistingWidth_AccountsForIt() public void WrapText_EmptyString_ReturnsEmptyLine() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Calibri", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Calibri", FontSubFamily.Regular, FontFolders); var shaper = new TextShaper(font); var layout = new TextLayoutEngine(shaper); @@ -197,7 +197,7 @@ public void WrapText_EmptyString_ReturnsEmptyLine() public void WrapText_WithKerning_MeasuresCorrectly() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular, FontFolders); var shaper = new TextShaper(font); var layout = new TextLayoutEngine(shaper); @@ -220,7 +220,7 @@ public void WrapText_WithKerning_MeasuresCorrectly() public void WrapRichText_SingleFragment_BehavesLikeSingleFont() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Calibri", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Calibri", FontSubFamily.Regular, FontFolders); var shaper = new TextShaper(font); var layout = new TextLayoutEngine(shaper); @@ -245,7 +245,7 @@ public void WrapRichText_SingleFragment_BehavesLikeSingleFont() public void WrapRichText_MultipleFragments_ConcatenatesCorrectly() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Calibri", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Calibri", FontSubFamily.Regular, FontFolders); var shaper = new TextShaper(font); var layout = new TextLayoutEngine(shaper); @@ -275,7 +275,7 @@ public void WrapRichText_MultipleFragments_ConcatenatesCorrectly() public void WrapRichText_DifferentFonts_WrapsCorrectly() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Calibri", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Calibri", FontSubFamily.Regular, FontFolders); var shaper = new TextShaper(font); var layout = new TextLayoutEngine(shaper); @@ -342,7 +342,7 @@ public void WrapLongRichTextWord() Style = MeasurementFontStyles.Regular }; - var font = OpenTypeFonts.GetFontData(FontFolders, mFont.FontFamily, FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont(mFont.FontFamily, FontSubFamily.Regular, FontFolders, true); var longWord = "pellentesquer"; @@ -413,7 +413,7 @@ public void WrapRichTextDifficultCase() public void WrapRichText_WordSpanningFragments_MeasuresCorrectly() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Calibri", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Calibri", FontSubFamily.Regular, FontFolders); var shaper = new TextShaper(font); var layout = new TextLayoutEngine(shaper); @@ -444,7 +444,7 @@ public void WrapRichText_WordSpanningFragments_MeasuresCorrectly() public void WrapRichText_WithLineBreaks_PreservesBreaks() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Calibri", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Calibri", FontSubFamily.Regular, FontFolders); var shaper = new TextShaper(font); var layout = new TextLayoutEngine(shaper); @@ -475,7 +475,7 @@ public void WrapRichText_WithLineBreaks_PreservesBreaks() public void WrapRichText_EmptyFragments_HandlesGracefully() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Calibri", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Calibri", FontSubFamily.Regular, FontFolders); var shaper = new TextShaper(font); var layout = new TextLayoutEngine(shaper); @@ -510,7 +510,7 @@ public void WrapRichText_EmptyFragments_HandlesGracefully() public void WrapRichText_NullFragmentList_ReturnsEmptyLine() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Calibri", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Calibri", FontSubFamily.Regular, FontFolders); var shaper = new TextShaper(font); var layout = new TextLayoutEngine(shaper); @@ -530,7 +530,7 @@ public void WrapRichText_NullFragmentList_ReturnsEmptyLine() public void WrapRichText_SameFontMultipleTimes_UsesCache() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Calibri", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Calibri", FontSubFamily.Regular, FontFolders); var shaper = new TextShaper(font); var layout = new TextLayoutEngine(shaper); @@ -568,7 +568,7 @@ public void WrapRichText_SameFontMultipleTimes_UsesCache() [TestMethod] public void WrapText_Continous_Long_Word() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Aptos Narrow", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Aptos Narrow", FontSubFamily.Regular, FontFolders); var longWord = "pellentesquer"; diff --git a/src/EPPlus.Fonts.OpenType.Tests/Reading/GposReadingTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Reading/GposReadingTests.cs index 0a2b86bdf..3f1c05fd6 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Reading/GposReadingTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Reading/GposReadingTests.cs @@ -1,4 +1,5 @@ -using EPPlus.Fonts.OpenType.Scanner; +using EPPlus.Fonts.OpenType.FontResolver; +using EPPlus.Fonts.OpenType.Scanner; using EPPlus.Fonts.OpenType.Tables.Cmap; using EPPlus.Fonts.OpenType.Tables.Gpos; using EPPlus.Fonts.OpenType.Tables.Gpos.Data.Lookups.LookupType1; @@ -16,19 +17,21 @@ public class GposReadingTests : FontTestBase { public override TestContext? TestContext { get; set; } + protected override void ConfigureResolver() + { + OpenTypeFonts.Configure(new DefaultFontResolver(FontFolders, true)); + } + [TestMethod] public void ReadGposTable_Roboto() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular, ignoreCache: true); - // Assert GPOS exists Assert.IsNotNull(font.GposTable, "Roboto should have GPOS table"); var gpos = font.GposTable; - // Verify basic structure Assert.AreEqual((ushort)1, gpos.MajorVersion, "GPOS major version should be 1"); Assert.IsNotNull(gpos.ScriptList, "GPOS should have ScriptList"); Assert.IsNotNull(gpos.FeatureList, "GPOS should have FeatureList"); @@ -38,17 +41,14 @@ public void ReadGposTable_Roboto() [TestMethod] public void ReadGposTable_HasKernFeature() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular, ignoreCache: true); var gpos = font.GposTable; Assert.IsNotNull(gpos, "GPOS table should exist"); - // Act - Find 'kern' feature var kernFeature = gpos.FeatureList.FeatureRecords .FirstOrDefault(f => f.FeatureTag.Value == "kern"); - // Assert Assert.IsNotNull(kernFeature, "GPOS should have 'kern' feature"); Assert.IsNotNull(kernFeature.FeatureTable, "kern feature should have FeatureTable"); Assert.IsTrue(kernFeature.FeatureTable.LookupListIndices.Length > 0, @@ -58,17 +58,14 @@ public void ReadGposTable_HasKernFeature() [TestMethod] public void ReadGposTable_HasPairPosLookup() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular, ignoreCache: true); var gpos = font.GposTable; Assert.IsNotNull(gpos, "GPOS table should exist"); - // Act - Find Type 2 (PairPos) lookup var pairPosLookup = gpos.LookupList.Lookups .FirstOrDefault(l => l.LookupType == 2); - // Assert Assert.IsNotNull(pairPosLookup, "GPOS should have Type 2 (PairPos) lookup"); Assert.IsTrue(pairPosLookup.SubTables.Count > 0, "PairPos lookup should have subtables"); @@ -77,18 +74,15 @@ public void ReadGposTable_HasPairPosLookup() [TestMethod] public void ReadGposTable_PairPosFormat1() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular, ignoreCache: true); var gpos = font.GposTable; var pairPosLookup = gpos.LookupList.Lookups.FirstOrDefault(l => l.LookupType == 2); Assert.IsNotNull(pairPosLookup, "Need PairPos lookup for test"); - // Act - Get first PairPos subtable var subtable = pairPosLookup.SubTables[0] as PairPosSubTableFormat1; - // Assert Assert.IsNotNull(subtable, "First subtable should be PairPosSubTableFormat1"); Assert.AreEqual((ushort)1, subtable.SubtableFormat, "Format should be 1"); Assert.IsNotNull(subtable.Coverage, "Should have Coverage table"); @@ -96,14 +90,10 @@ public void ReadGposTable_PairPosFormat1() Assert.IsTrue(subtable.PairSets.Count > 0, "Should have at least one PairSet"); } - - - [TestMethod] public void ReadGposTable_FindKerningPair_ActualPairs() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular, ignoreCache: true); if (!font.CmapTable.TryGetGlyphId('A', out ushort aGlyph)) { @@ -118,11 +108,8 @@ public void ReadGposTable_FindKerningPair_ActualPairs() var subtable = pairPosLookup.SubTables[0] as PairPosSubTableFormat1; Assert.IsNotNull(subtable, "Need PairPosSubTableFormat1"); - // Act - Test with pairs we KNOW exist from debug output - // A(37) + glyph 35 = kerning -61 bool found = subtable.TryGetPairAdjustment(aGlyph, 35, out var value1, out var value2); - // Assert Assert.IsTrue(found, $"Should find kerning pair for A({aGlyph}) + glyph 35"); Assert.IsNotNull(value1, "Value1 should exist"); Assert.AreEqual(-61, value1.XAdvance, "Should have XAdvance = -61"); @@ -137,9 +124,8 @@ public void SerializeCmapTable() var ffi = FontScannerV2.FindBestMatch(FontFolder, "Roboto", FontSubFamily.Regular); var originalBytes = ffi.GetTableBytes("cmap"); - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false, true); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular, ignoreCache: true); - // Check IdDelta[3] var subtable = font.CmapTable.SubTables[0] as CmapSubtable4; Debug.WriteLine($"IdDelta[3] = {subtable.IdDelta[3]}"); @@ -155,8 +141,7 @@ public void SerializeCmapTable() [TestMethod] public void ReadGposTable_MultipleKerningPairs() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular, ignoreCache: true); var gpos = font.GposTable; var pairPosLookup = gpos.LookupList.Lookups.FirstOrDefault(l => l.LookupType == 2); @@ -164,9 +149,6 @@ public void ReadGposTable_MultipleKerningPairs() Assert.IsNotNull(subtable, "Need PairPosSubTableFormat1"); - // Test known pairs from debug output - // NOTE: All glyph IDs adjusted for current Roboto-Regular.ttf version - // 'A' = glyph 37, 'V' = glyph 58 var testPairs = new[] { (37, 35, -61), // A + glyph 35 @@ -178,7 +160,6 @@ public void ReadGposTable_MultipleKerningPairs() int foundCount = 0; - // Act - Check each pair foreach (var (first, second, expectedKern) in testPairs) { if (subtable.TryGetPairAdjustment((ushort)first, (ushort)second, out var val1, out var val2)) @@ -194,24 +175,20 @@ public void ReadGposTable_MultipleKerningPairs() } } - // Assert Assert.AreEqual(5, foundCount, "Should find all 5 test pairs"); } [TestMethod] public void ReadGposTable_HasSinglePosLookup() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular, ignoreCache: true); var gpos = font.GposTable; Assert.IsNotNull(gpos, "GPOS table should exist"); - // Act - Find Type 1 (SinglePos) lookup var singlePosLookup = gpos.LookupList.Lookups .FirstOrDefault(l => l.LookupType == 1); - // Assert if (singlePosLookup != null) { Assert.IsTrue(singlePosLookup.SubTables.Count > 0, @@ -227,8 +204,7 @@ public void ReadGposTable_HasSinglePosLookup() [TestMethod] public void ReadGposTable_SinglePosFormat1() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular, ignoreCache: true); var gpos = font.GposTable; var singlePosLookup = gpos.LookupList.Lookups.FirstOrDefault(l => l.LookupType == 1); @@ -239,7 +215,6 @@ public void ReadGposTable_SinglePosFormat1() return; } - // Act - Get first SinglePos subtable var subtable = singlePosLookup.SubTables.FirstOrDefault() as SinglePosSubTableFormat1; if (subtable == null) @@ -248,7 +223,6 @@ public void ReadGposTable_SinglePosFormat1() return; } - // Assert Assert.AreEqual((ushort)1, subtable.SubtableFormat, "Format should be 1"); Assert.IsNotNull(subtable.Coverage, "Should have Coverage table"); Assert.IsNotNull(subtable.Value, "Should have ValueRecord"); @@ -264,8 +238,7 @@ public void ReadGposTable_SinglePosFormat1() [TestMethod] public void ReadGposTable_SinglePosFormat2() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular, ignoreCache: true); var gpos = font.GposTable; var singlePosLookup = gpos.LookupList.Lookups.FirstOrDefault(l => l.LookupType == 1); @@ -276,7 +249,6 @@ public void ReadGposTable_SinglePosFormat2() return; } - // Act - Find Format 2 subtable var subtable = singlePosLookup.SubTables .OfType() .FirstOrDefault(); @@ -287,7 +259,6 @@ public void ReadGposTable_SinglePosFormat2() return; } - // Assert Assert.AreEqual((ushort)2, subtable.SubtableFormat, "Format should be 2"); Assert.IsNotNull(subtable.Coverage, "Should have Coverage table"); Assert.IsNotNull(subtable.Values, "Should have ValueRecords array"); @@ -303,8 +274,7 @@ public void ReadGposTable_SinglePosFormat2() [TestMethod] public void ReadGposTable_SinglePosTryGetAdjustment() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular, ignoreCache: true); var gpos = font.GposTable; var singlePosLookup = gpos.LookupList.Lookups.FirstOrDefault(l => l.LookupType == 1); @@ -315,7 +285,6 @@ public void ReadGposTable_SinglePosTryGetAdjustment() return; } - // Act - Test TryGetAdjustment on first subtable var subtableFormat1 = singlePosLookup.SubTables.OfType().FirstOrDefault(); var subtableFormat2 = singlePosLookup.SubTables.OfType().FirstOrDefault(); @@ -323,7 +292,6 @@ public void ReadGposTable_SinglePosTryGetAdjustment() if (subtableFormat1 != null) { - // Try a few common glyph IDs for (ushort glyphId = 1; glyphId < 100; glyphId++) { if (subtableFormat1.TryGetAdjustment(glyphId, out var value)) @@ -337,7 +305,6 @@ public void ReadGposTable_SinglePosTryGetAdjustment() if (subtableFormat2 != null && !foundAdjustment) { - // Try a few common glyph IDs for (ushort glyphId = 1; glyphId < 100; glyphId++) { if (subtableFormat2.TryGetAdjustment(glyphId, out var value)) @@ -358,17 +325,14 @@ public void ReadGposTable_SinglePosTryGetAdjustment() [TestMethod] public void ReadGposTable_HasMarkToBaseLookup() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular, ignoreCache: true); var gpos = font.GposTable; Assert.IsNotNull(gpos, "GPOS table should exist"); - // Act - Find Type 4 (MarkToBase) lookup var markToBaseLookup = gpos.LookupList.Lookups .FirstOrDefault(l => l.LookupType == 4); - // Assert if (markToBaseLookup != null) { Assert.IsTrue(markToBaseLookup.SubTables.Count > 0, @@ -384,8 +348,7 @@ public void ReadGposTable_HasMarkToBaseLookup() [TestMethod] public void ReadGposTable_MarkToBaseFormat1() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular, ignoreCache: true); var gpos = font.GposTable; var markToBaseLookup = gpos.LookupList.Lookups.FirstOrDefault(l => l.LookupType == 4); @@ -396,7 +359,6 @@ public void ReadGposTable_MarkToBaseFormat1() return; } - // Act - Get first MarkToBase subtable var subtable = markToBaseLookup.SubTables.FirstOrDefault() as MarkToBaseSubTableFormat1; if (subtable == null) @@ -405,7 +367,6 @@ public void ReadGposTable_MarkToBaseFormat1() return; } - // Assert Assert.AreEqual((ushort)1, subtable.SubtableFormat, "Format should be 1"); Assert.IsNotNull(subtable.MarkCoverage, "Should have MarkCoverage table"); Assert.IsNotNull(subtable.BaseCoverage, "Should have BaseCoverage table"); @@ -422,8 +383,7 @@ public void ReadGposTable_MarkToBaseFormat1() [TestMethod] public void ReadGposTable_MarkToBaseTryGetAttachment() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular, ignoreCache: true); var gpos = font.GposTable; var markToBaseLookup = gpos.LookupList.Lookups.FirstOrDefault(l => l.LookupType == 4); @@ -442,13 +402,8 @@ public void ReadGposTable_MarkToBaseTryGetAttachment() return; } - // Act - Try to find an attachment - // We need to know which glyphs are marks and bases - // Let's try some common combinations - bool foundAttachment = false; - // Try first few marks with first few bases for (ushort markGlyph = 1; markGlyph < 100 && !foundAttachment; markGlyph++) { if (subtable.MarkCoverage.IsCovered(markGlyph)) @@ -481,8 +436,7 @@ public void ReadGposTable_MarkToBaseTryGetAttachment() [TestMethod] public void ReadGposTable_MarkToBaseWithAccentedCharacters() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular, ignoreCache: true); var gpos = font.GposTable; var markToBaseLookup = gpos.LookupList.Lookups.FirstOrDefault(l => l.LookupType == 4); @@ -501,15 +455,10 @@ public void ReadGposTable_MarkToBaseWithAccentedCharacters() return; } - // Act - Try common accented character combinations - // e + combining acute (́) = é - // Get glyph IDs for these characters - if (font.CmapTable.TryGetGlyphId('e', out ushort eGlyph)) { Debug.WriteLine($"'e' = glyph {eGlyph}"); - // Combining acute accent Unicode: U+0301 if (font.CmapTable.TryGetGlyphId('\u0301', out ushort acuteGlyph)) { Debug.WriteLine($"Combining acute = glyph {acuteGlyph}"); diff --git a/src/EPPlus.Fonts.OpenType.Tests/Reading/TtfReadingTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Reading/TtfReadingTests.cs index 66fc6d5a9..8a3ee72cf 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Reading/TtfReadingTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Reading/TtfReadingTests.cs @@ -10,6 +10,7 @@ Date Author Change ************************************************************************************************* 12/22/2025 EPPlus Software AB TTF reading tests *************************************************************************************************/ +using EPPlus.Fonts.OpenType.FontResolver; using EPPlus.Fonts.OpenType.Tests.Helpers; using OfficeOpenXml.Interfaces.Drawing.Text; using System.Diagnostics; @@ -21,10 +22,15 @@ public sealed class TtfReadingTests : FontTestBase { public override TestContext? TestContext { get; set; } + protected override void ConfigureResolver() + { + OpenTypeFonts.Configure(new DefaultFontResolver(FontFolders, true)); + } + [TestMethod] public void ReadRobotoRegularTtf() { - OpenTypeFont? font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false); + OpenTypeFont? font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); Assert.IsNotNull(font); var cmap = font.CmapTable; Assert.AreEqual("Roboto", font.FullName); @@ -37,7 +43,7 @@ public void ReadRobotoBoldTtf() { Stopwatch sw = Stopwatch.StartNew(); sw.Start(); - OpenTypeFont? font = OpenTypeFonts.GetFontDataOpen(FontFolders, "Roboto", FontSubFamily.Bold, false); + OpenTypeFont? font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Bold); sw.Stop(); var ms = sw.ElapsedMilliseconds; Assert.IsNotNull(font); @@ -48,7 +54,7 @@ public void ReadRobotoBoldTtf() [TestMethod] public void ReadSourceSans3Otf() { - OpenTypeFont? font = OpenTypeFonts.GetFontDataOpen(FontFolders, "Source Sans 3", FontSubFamily.Regular, false); + OpenTypeFont? font = OpenTypeFonts.LoadFont("Source Sans 3", FontSubFamily.Regular); Assert.IsNotNull(font); Assert.AreEqual("Source Sans 3", font.FullName); Assert.AreEqual("Regular", font.SubFamily); @@ -88,7 +94,7 @@ string GetFsString(ushort fsId) [TestMethod] public void ReadTccGothic() { - OpenTypeFont? font = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic", FontSubFamily.Bold, true); + OpenTypeFont? font = OpenTypeFonts.LoadFont("BIZ UDGothic", FontSubFamily.Bold); Assert.IsNotNull(font); Assert.AreEqual("BIZ UDGothic Bold", font.FullName); @@ -98,7 +104,7 @@ public void ReadTccGothic() [TestMethod] public void ReadGsubTable() { - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "Roboto", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var gSub = font.GsubTable; Assert.IsNotNull(gSub); } @@ -106,11 +112,11 @@ public void ReadGsubTable() [TestMethod] public void ReadSixFonts() { - OpenTypeFont? gothic = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic", FontSubFamily.Bold, true); - OpenTypeFont? calibri = OpenTypeFonts.GetFontDataOpen(FontFolders, "Calibri", FontSubFamily.Italic, true); - OpenTypeFont? aptos = OpenTypeFonts.GetFontDataOpen(FontFolders, "Aptos Narrow", FontSubFamily.Bold, true); - OpenTypeFont? timesNewRoman = OpenTypeFonts.GetFontDataOpen(FontFolders, "Times New Roman", FontSubFamily.Regular, true); - OpenTypeFont? SS3 = OpenTypeFonts.GetFontDataOpen(FontFolders, "Source Sans 3", FontSubFamily.Bold, false); + OpenTypeFont? gothic = OpenTypeFonts.LoadFont("BIZ UDGothic", FontSubFamily.Bold, FontFolders, true, true); + OpenTypeFont? calibri = OpenTypeFonts.LoadFont("Calibri", FontSubFamily.Italic, FontFolders, true, true); + OpenTypeFont? aptos = OpenTypeFonts.LoadFont("Aptos Narrow", FontSubFamily.Bold, FontFolders, true, true); + OpenTypeFont? timesNewRoman = OpenTypeFonts.LoadFont("Times New Roman", FontSubFamily.Regular, FontFolders, true, true); + OpenTypeFont? SS3 = OpenTypeFonts.LoadFont("Source Sans 3", FontSubFamily.Bold, FontFolders, true, true); Assert.IsNotNull(gothic); Assert.AreEqual("BIZ UDGothic Bold", gothic.FullName); diff --git a/src/EPPlus.Fonts.OpenType.Tests/Reading/VerticalTextTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Reading/VerticalTextTests.cs index 3a195d3be..04aef4022 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Reading/VerticalTextTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Reading/VerticalTextTests.cs @@ -15,7 +15,7 @@ public class VerticalTextTests : FontTestBase [TestMethod] public void TestVerticalMetrics_Vhea() { - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic"); + var font = OpenTypeFonts.LoadFont("BIZ UDGothic"); Assert.IsNotNull(font); var vhea = font.VheaTable; Assert.IsNotNull(vhea, "vhea table should be present in a CJK font."); @@ -30,7 +30,7 @@ public void TestVerticalMetrics_Vhea() [TestMethod] public void TestVerticalMetrics_Vmtx() { - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic"); + var font = OpenTypeFonts.LoadFont("BIZ UDGothic"); Assert.IsNotNull(font); var vhea = font.VheaTable; diff --git a/src/EPPlus.Fonts.OpenType.Tests/Regression/RegressionTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Regression/RegressionTests.cs index 4b05238d2..15c0c457f 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Regression/RegressionTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Regression/RegressionTests.cs @@ -45,14 +45,13 @@ public void Bug_20251222_CircularLigatureDependency_Roboto() // Discovery and Rewrite phases // DATE: 2025-12-22 - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var subset = font.CreateSubset("ffi"); SaveFont("regression_ffi_circular.ttf", subset); - // Should create valid font with ffi ligature var bytes = subset.Serialize(); - var parsed = new OpenTypeFont(bytes, font.Format); + var parsed = new OpenTypeFont(bytes); Assert.IsNotNull(parsed.GsubTable); @@ -73,16 +72,14 @@ public void Bug_20251222_AbcSubset_TooManyGlyphs() // exist in the subset // DATE: 2025-12-22 - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var subset = font.CreateSubset(new[] { 'a', 'b', 'c' }); SaveFont("regression_abc_glyphs.ttf", subset); - // Should have ~10 glyphs (abc + space + .notdef + variants), NOT 28 Assert.IsTrue(subset.MaxpTable.numGlyphs >= 5 && subset.MaxpTable.numGlyphs <= 15, $"Expected 5-15 glyphs for abc, got {subset.MaxpTable.numGlyphs}"); - // Should have NO ligatures int ligCount = FontTestHelper.CountLigatures(subset); Assert.AreEqual(0, ligCount, "abc should have no ligatures"); } @@ -95,16 +92,14 @@ public void Bug_20251222_Fiffig_LostLigatures_AfterAbcFix() // FIX: Corrected logic to only check base components (GID < 400) // DATE: 2025-12-22 - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var subset = font.CreateSubset("fiffig"); SaveFont("regression_fiffig_ligatures.ttf", subset); - // Should have exactly 3 ligatures: fi, ff, ffi int ligCount = FontTestHelper.CountLigatures(subset); Assert.AreEqual(3, ligCount, "fiffig should have fi, ff, ffi ligatures"); - // Verify font is valid FontTestHelper.AssertFontValid(subset); } @@ -116,12 +111,11 @@ public void Bug_20251222_FeaturePointsToInvalidLookup() // FIX: FeatureListTable.Rewrite now uses lookupMap to remap indices // DATE: 2025-12-22 - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var subset = font.CreateSubset("fiffig"); SaveFont("regression_feature_lookup.ttf", subset); - // Verify all features point to valid lookups if (subset.GsubTable?.FeatureList?.FeatureRecords != null) { int lookupCount = subset.GsubTable.LookupList?.Lookups?.Count ?? 0; @@ -149,16 +143,14 @@ public void Bug_20251222_LigatureComponentRewrite_WrongDictionary() // FIX: Properly lookup each component in OldToNewGlyphId dictionary // DATE: 2025-12-22 - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var subset = font.CreateSubset("fi"); SaveFont("regression_ligature_components.ttf", subset); - // Serialize and re-parse to verify components are correct var bytes = subset.Serialize(); - var parsed = new OpenTypeFont(bytes, font.Format); + var parsed = new OpenTypeFont(bytes); - // Should have fi ligature with correctly remapped components int ligCount = FontTestHelper.CountLigatures(parsed); Assert.IsTrue(ligCount >= 1, "Should have fi ligature"); @@ -174,12 +166,11 @@ public void Bug_20251222_ValidationCrash_NullRawData() // FIX: Check if RawData is null before accessing, skip checksum validation for in-memory fonts // DATE: 2025-12-22 - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var subset = font.CreateSubset("f"); SaveFont("regression_validation_rawdata.ttf", subset); - // Should not crash during validation FontTestHelper.AssertFontValid(subset); Assert.IsNotNull(subset); @@ -194,12 +185,11 @@ public void Bug_20251222_ValidationCrash_FileLengthZero() // FIX: Calculate fileLength from TableRecords if FileLength property is <= 0 // DATE: 2025-12-22 - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var subset = font.CreateSubset("fl"); SaveFont("regression_validation_filelength.ttf", subset); - // Should not fail with file length error FontTestHelper.AssertFontValid(subset); Assert.IsNotNull(subset); @@ -214,18 +204,16 @@ public void Bug_20251222_MissingCoverageInitialization() // FIX: Initialize Coverage.SubstFormat = 1 and newSubTable.SubstFormat = 1 // DATE: 2025-12-22 - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var subset = font.CreateSubset("office"); SaveFont("regression_coverage_init.ttf", subset); - // Should serialize successfully var bytes = subset.Serialize(); Assert.IsNotNull(bytes); Assert.IsTrue(bytes.Length > 0); - // Should parse successfully - var parsed = new OpenTypeFont(bytes, font.Format); + var parsed = new OpenTypeFont(bytes); Assert.IsNotNull(parsed); FontTestHelper.AssertFontValid(parsed); @@ -239,7 +227,7 @@ public void Bug_20251222_EmptySubset_ShouldThrow() // FIX: Added validation to throw ArgumentException if usedChars is empty // DATE: 2025-12-22 - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); Assert.ThrowsException(() => font.CreateSubset("")); Assert.ThrowsException(() => font.CreateSubset((char[])null)); @@ -257,16 +245,14 @@ public void Bug_20251222_CompoundLigatureComponents() // RESULT: Simplified component lists (ffi = [f, f, i] instead of [f, i, fi]) // DATE: 2025-12-22 - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var subset = font.CreateSubset("fiffig"); SaveFont("regression_compound_components.ttf", subset); - // Should have 3 ligatures: ff, fi, ffi int ligCount = FontTestHelper.CountLigatures(subset); Assert.AreEqual(3, ligCount); - // Verify in FontDrop or similar tool that ligatures render correctly FontTestHelper.AssertFontValid(subset); } @@ -283,7 +269,8 @@ public void GetFromCacheBoldItalicShouldWork() var ttTextMeasurer = new FontMeasurerTrueType(); ttTextMeasurer.SetFont(boldItalic); - var cachedFont = OpenTypeFontCache.GetFromCache("Aptos Narrow", FontSubFamily.BoldItalic); + var cacheKey = OpenTypeFonts.BuildCacheKey("Aptos Narrow", FontSubFamily.BoldItalic, Enumerable.Empty(), searchSystemDirectories: true); + var cachedFont = OpenTypeFontCache.GetFromCache(cacheKey); Assert.IsNotNull(cachedFont); } } diff --git a/src/EPPlus.Fonts.OpenType.Tests/Serialization/CmapSerializationTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Serialization/CmapSerializationTests.cs index 30608f5ee..dc5f5fbe2 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Serialization/CmapSerializationTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Serialization/CmapSerializationTests.cs @@ -18,7 +18,7 @@ public void SerializeCmapTable() var ffi = FontScannerV2.FindBestMatch(FontFolder, "Roboto", FontSubFamily.Regular); var originalBytes = ffi.GetTableBytes("cmap"); - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false, true); + var font = OpenTypeFonts.LoadFont("Roboto"); var cmapBytes = font.CmapTable.Serialize(font); Assert.AreEqual(originalBytes.Length, cmapBytes?.Length); @@ -28,7 +28,7 @@ public void SerializeCmapTable() [TestMethod] public void SerializeCmapTable_Format12() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Noto Emoji", FontSubFamily.Regular, false, true); + var font = OpenTypeFonts.LoadFont("Noto Emoji"); // Ta unique chars from the originalfonts cmap (format 4 + 12) var allCodePoints = new HashSet(); @@ -41,8 +41,8 @@ public void SerializeCmapTable_Format12() } // re-serialize - var bytes = font.CmapTable.Serialize(font); - var tempFont = new OpenTypeFont(bytes, font.Format); + var bytes = font.Serialize(); + var tempFont = new OpenTypeFont(bytes); // Check that ALL original chars are still there foreach (uint cp in allCodePoints) diff --git a/src/EPPlus.Fonts.OpenType.Tests/Serialization/CoreTableSerializationTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Serialization/CoreTableSerializationTests.cs index 675376699..f13175c78 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Serialization/CoreTableSerializationTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Serialization/CoreTableSerializationTests.cs @@ -18,7 +18,7 @@ public void SerializeHeadTable() var ffi = FontScannerV2.FindBestMatch(FontFolder, "Roboto", FontSubFamily.Regular); var originalBytes = ffi.GetTableBytes("head"); - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false, true); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var headBytes = font?.HeadTable.Serialize(font); Assert.AreEqual(originalBytes.Length, headBytes?.Length); @@ -31,7 +31,7 @@ public void SerializeMaxpTable() var ffi = FontScannerV2.FindBestMatch(FontFolder, "Roboto", FontSubFamily.Regular); var originalBytes = ffi.GetTableBytes("maxp"); - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false, true); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var maxpBytes = font?.MaxpTable.Serialize(font); Assert.AreEqual(originalBytes.Length, maxpBytes?.Length); @@ -44,7 +44,7 @@ public void SerializeHheaTable() var ffi = FontScannerV2.FindBestMatch(FontFolder, "Roboto", FontSubFamily.Regular); var originalBytes = ffi.GetTableBytes("hhea"); - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false, true); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var hheaBytes = font?.HheaTable.Serialize(font); Assert.AreEqual(originalBytes.Length, hheaBytes?.Length); @@ -57,7 +57,7 @@ public void SerializePostTable() var ffi = FontScannerV2.FindBestMatch(FontFolders, "Roboto", FontSubFamily.Regular); var originalBytes = ffi.GetTableBytes("post"); - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false, true); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var postBytes = font?.PostTable.Serialize(font); Assert.AreEqual(originalBytes.Length, postBytes?.Length); @@ -70,7 +70,7 @@ public void SerializeNameTable() var ffi = FontScannerV2.FindBestMatch(FontFolder, "Roboto", FontSubFamily.Regular); var originalBytes = ffi.GetTableBytes("name"); - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false, true); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var nameBytes = font?.NameTable.Serialize(font); Assert.AreEqual(originalBytes.Length, nameBytes?.Length); @@ -87,7 +87,7 @@ public void SerializeOs2Table(string fontName, FontSubFamily subFamily, int expe var ffi = FontScannerV2.FindBestMatch(FontFolder, fontName, subFamily); var originalBytes = ffi.GetTableBytes("OS/2"); - var font = OpenTypeFonts.GetFontData(FontFolders, fontName, subFamily, false, true); + var font = OpenTypeFonts.LoadFont(fontName, subFamily); var os2Bytes = font?.Os2Table.Serialize(font); Assert.AreEqual(expectedLength, os2Bytes?.Length); @@ -98,4 +98,4 @@ public void SerializeOs2Table(string fontName, FontSubFamily subFamily, int expe CollectionAssert.AreEqual(originalBytes, os2Bytes); } } -} +} \ No newline at end of file diff --git a/src/EPPlus.Fonts.OpenType.Tests/Serialization/GPosSerializationTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Serialization/GPosSerializationTests.cs index 39d8ed285..8633c1ad5 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Serialization/GPosSerializationTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Serialization/GPosSerializationTests.cs @@ -37,9 +37,6 @@ public class GposSerializationTests : FontTestBase #region Helper Classes for .NET 3.5 Compatibility - /// - /// Represents a glyph pair key for kerning lookups - /// private class GlyphPair { public ushort FirstGlyph { get; set; } @@ -64,9 +61,6 @@ public override int GetHashCode() } } - /// - /// Represents anchor point data for mark-to-base attachments - /// private class AnchorPointPair { public short MarkAnchorX { get; set; } @@ -75,9 +69,6 @@ private class AnchorPointPair public short BaseAnchorY { get; set; } } - /// - /// Represents a single position adjustment - /// private class SinglePosValue { public short XPlacement { get; set; } @@ -91,8 +82,7 @@ private class SinglePosValue [TestMethod] public void Diagnose_SerializedFontOffsets() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, ignoreCache: true); + var font = OpenTypeFonts.LoadFont("Roboto"); Debug.WriteLine("=== ORIGINAL TABLE RECORDS ==="); foreach (var kvp in font.TableRecords) @@ -101,23 +91,20 @@ public void Diagnose_SerializedFontOffsets() kvp.Key, kvp.Value.Offset, kvp.Value.Length)); } - // Act var serializer = new OpenTypeFontSerializer(font); var bytes = serializer.Serialize(); Debug.WriteLine(string.Format("\n=== SERIALIZED FONT: {0} bytes ===", bytes.Length)); - // Read back table directory from serialized bytes using (var ms = new MemoryStream(bytes)) using (var reader = new FontsBinaryReader(ms)) { - // Skip sfnt header (12 bytes) reader.BaseStream.Position = 0; uint sfntVersion = reader.ReadUInt32BigEndian(); ushort numTables = reader.ReadUInt16BigEndian(); - reader.ReadUInt16BigEndian(); // searchRange - reader.ReadUInt16BigEndian(); // entrySelector - reader.ReadUInt16BigEndian(); // rangeShift + reader.ReadUInt16BigEndian(); + reader.ReadUInt16BigEndian(); + reader.ReadUInt16BigEndian(); Debug.WriteLine(string.Format("\nsfntVersion: 0x{0:X8}", sfntVersion)); Debug.WriteLine(string.Format("numTables: {0}", numTables)); @@ -131,14 +118,8 @@ public void Diagnose_SerializedFontOffsets() uint offset = reader.ReadUInt32BigEndian(); uint length = reader.ReadUInt32BigEndian(); - string status = ""; - if (offset + length > bytes.Length) - { - status = " *** INVALID: extends beyond file!"; - } - - Debug.WriteLine(string.Format("{0}: Offset={1}, Length={2}{3}", - tag, offset, length, status)); + string status = offset + length > bytes.Length ? " *** INVALID: extends beyond file!" : ""; + Debug.WriteLine(string.Format("{0}: Offset={1}, Length={2}{3}", tag, offset, length, status)); } } } @@ -148,39 +129,32 @@ public void Diagnose_SerializedFontOffsets() [TestMethod] public void SerializeGpos_StructurePreserved() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, ignoreCache: true); + var font = OpenTypeFonts.LoadFont("Roboto"); var originalGpos = font.GposTable; - // Act var serializer = new OpenTypeFontSerializer(font); var bytes = serializer.Serialize(); - var reparsed = new OpenTypeFont(bytes, font.Format); + var reparsed = new OpenTypeFont(bytes); - // Assert - Structure Assert.IsNotNull(reparsed.GposTable, "GPOS table should exist after roundtrip"); Assert.AreEqual(originalGpos.MajorVersion, reparsed.GposTable.MajorVersion); Assert.AreEqual(originalGpos.MinorVersion, reparsed.GposTable.MinorVersion); - // Script count Assert.AreEqual( originalGpos.ScriptList.ScriptRecords.Count, reparsed.GposTable.ScriptList.ScriptRecords.Count, "Script count should match"); - // Feature count Assert.AreEqual( originalGpos.FeatureList.FeatureRecords.Count, reparsed.GposTable.FeatureList.FeatureRecords.Count, "Feature count should match"); - // Lookup count Assert.AreEqual( originalGpos.LookupList.Lookups.Count, reparsed.GposTable.LookupList.Lookups.Count, "Lookup count should match"); - // Lookup types should match for (int i = 0; i < originalGpos.LookupList.Lookups.Count; i++) { Assert.AreEqual( @@ -193,29 +167,22 @@ public void SerializeGpos_StructurePreserved() [TestMethod] public void SerializeGpos_FeatureTagsPreserved() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var originalTags = new List(); foreach (var feature in font.GposTable.FeatureList.FeatureRecords) - { originalTags.Add(feature.FeatureTag.Value); - } originalTags.Sort(); - // Act var serializer = new OpenTypeFontSerializer(font); var bytes = serializer.Serialize(); - var reparsed = new OpenTypeFont(bytes, font.Format); + var reparsed = new OpenTypeFont(bytes); var reparsedTags = new List(); foreach (var feature in reparsed.GposTable.FeatureList.FeatureRecords) - { reparsedTags.Add(feature.FeatureTag.Value); - } reparsedTags.Sort(); - // Assert Assert.AreEqual(originalTags.Count, reparsedTags.Count, "Feature count should match"); for (int i = 0; i < originalTags.Count; i++) { @@ -229,29 +196,22 @@ public void SerializeGpos_FeatureTagsPreserved() [TestMethod] public void SerializeGpos_ScriptTagsPreserved() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, ignoreCache: true); + var font = OpenTypeFonts.LoadFont("Roboto"); var originalTags = new List(); foreach (var script in font.GposTable.ScriptList.ScriptRecords) - { originalTags.Add(script.ScriptTag.Value); - } originalTags.Sort(); - // Act var serializer = new OpenTypeFontSerializer(font); var bytes = serializer.Serialize(); - var reparsed = new OpenTypeFont(bytes, font.Format); + var reparsed = new OpenTypeFont(bytes); var reparsedTags = new List(); foreach (var script in reparsed.GposTable.ScriptList.ScriptRecords) - { reparsedTags.Add(script.ScriptTag.Value); - } reparsedTags.Sort(); - // Assert Assert.AreEqual(originalTags.Count, reparsedTags.Count, "Script count should match"); for (int i = 0; i < originalTags.Count; i++) { @@ -269,25 +229,19 @@ public void SerializeGpos_ScriptTagsPreserved() [TestMethod] public void SerializeGpos_PairPos_KerningValuesPreserved() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, ignoreCache: true); + var font = OpenTypeFonts.LoadFont("Roboto"); - // Collect original kerning pairs var originalKerning = CollectKerningPairs(font); Debug.WriteLine(string.Format("Original font has {0} kerning pairs", originalKerning.Count)); - Assert.IsTrue(originalKerning.Count > 0, "Font should have kerning pairs"); - // Act var serializer = new OpenTypeFontSerializer(font); var bytes = serializer.Serialize(); - var reparsed = new OpenTypeFont(bytes, font.Format); + var reparsed = new OpenTypeFont(bytes); - // Assert - All kerning values should be preserved var reparsedKerning = CollectKerningPairs(reparsed); - Assert.AreEqual(originalKerning.Count, reparsedKerning.Count, - "Kerning pair count should match"); + Assert.AreEqual(originalKerning.Count, reparsedKerning.Count, "Kerning pair count should match"); int verified = 0; foreach (var pair in originalKerning.Keys) @@ -311,17 +265,14 @@ public void SerializeGpos_PairPos_KerningValuesPreserved() [TestMethod] public void SerializeGpos_PairPos_SpecificPairsVerified() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, ignoreCache: true); + var font = OpenTypeFonts.LoadFont("Roboto"); - // Get glyph IDs for test characters ushort fGlyph, eGlyph, aGlyph, vGlyph; font.CmapTable.TryGetGlyphId('f', out fGlyph); font.CmapTable.TryGetGlyphId('e', out eGlyph); font.CmapTable.TryGetGlyphId('A', out aGlyph); font.CmapTable.TryGetGlyphId('V', out vGlyph); - // Get original values var origLookup = FindFirstLookupOfType(font.GposTable, 2); Assert.IsNotNull(origLookup, "Should have PairPos lookup"); @@ -332,21 +283,13 @@ public void SerializeGpos_PairPos_SpecificPairsVerified() bool hasFe = origSubtable.TryGetPairAdjustment(fGlyph, eGlyph, out feOrig1, out feOrig2); bool hasAv = origSubtable.TryGetPairAdjustment(aGlyph, vGlyph, out avOrig1, out avOrig2); - if (hasFe) - { - Debug.WriteLine(string.Format("Original: f-e = {0}", feOrig1.XAdvance)); - } - if (hasAv) - { - Debug.WriteLine(string.Format("Original: A-V = {0}", avOrig1.XAdvance)); - } + if (hasFe) Debug.WriteLine(string.Format("Original: f-e = {0}", feOrig1.XAdvance)); + if (hasAv) Debug.WriteLine(string.Format("Original: A-V = {0}", avOrig1.XAdvance)); - // Act var serializer = new OpenTypeFontSerializer(font); var bytes = serializer.Serialize(); - var reparsed = new OpenTypeFont(bytes, font.Format); + var reparsed = new OpenTypeFont(bytes); - // Assert var newLookup = FindFirstLookupOfType(reparsed.GposTable, 2); Assert.IsNotNull(newLookup, "Reparsed should have PairPos lookup"); @@ -356,8 +299,7 @@ public void SerializeGpos_PairPos_SpecificPairsVerified() if (hasFe) { ValueRecord feNew1, feNew2; - Assert.IsTrue(newSubtable.TryGetPairAdjustment(fGlyph, eGlyph, out feNew1, out feNew2), - "f-e pair should exist"); + Assert.IsTrue(newSubtable.TryGetPairAdjustment(fGlyph, eGlyph, out feNew1, out feNew2), "f-e pair should exist"); Assert.AreEqual(feOrig1.XAdvance, feNew1.XAdvance, "f-e kerning should match"); Debug.WriteLine(string.Format("f-e: {0} verified", feNew1.XAdvance)); } @@ -365,8 +307,7 @@ public void SerializeGpos_PairPos_SpecificPairsVerified() if (hasAv) { ValueRecord avNew1, avNew2; - Assert.IsTrue(newSubtable.TryGetPairAdjustment(aGlyph, vGlyph, out avNew1, out avNew2), - "A-V pair should exist"); + Assert.IsTrue(newSubtable.TryGetPairAdjustment(aGlyph, vGlyph, out avNew1, out avNew2), "A-V pair should exist"); Assert.AreEqual(avOrig1.XAdvance, avNew1.XAdvance, "A-V kerning should match"); Debug.WriteLine(string.Format("A-V: {0} verified", avNew1.XAdvance)); } @@ -375,25 +316,20 @@ public void SerializeGpos_PairPos_SpecificPairsVerified() [TestMethod] public void SerializeGpos_PairPos_ValueFormatPreserved() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, ignoreCache: true); + var font = OpenTypeFonts.LoadFont("Roboto"); var origLookup = FindFirstLookupOfType(font.GposTable, 2); var origSubtable = origLookup.SubTables[0] as PairPosSubTableFormat1; - // Act var serializer = new OpenTypeFontSerializer(font); var bytes = serializer.Serialize(); - var reparsed = new OpenTypeFont(bytes, font.Format); + var reparsed = new OpenTypeFont(bytes); var newLookup = FindFirstLookupOfType(reparsed.GposTable, 2); var newSubtable = newLookup.SubTables[0] as PairPosSubTableFormat1; - // Assert - Assert.AreEqual(origSubtable.ValueFormat1, newSubtable.ValueFormat1, - "ValueFormat1 should be preserved"); - Assert.AreEqual(origSubtable.ValueFormat2, newSubtable.ValueFormat2, - "ValueFormat2 should be preserved"); + Assert.AreEqual(origSubtable.ValueFormat1, newSubtable.ValueFormat1, "ValueFormat1 should be preserved"); + Assert.AreEqual(origSubtable.ValueFormat2, newSubtable.ValueFormat2, "ValueFormat2 should be preserved"); Debug.WriteLine(string.Format("ValueFormat1: 0x{0:X4}", newSubtable.ValueFormat1)); Debug.WriteLine(string.Format("ValueFormat2: 0x{0:X4}", newSubtable.ValueFormat2)); @@ -406,8 +342,7 @@ public void SerializeGpos_PairPos_ValueFormatPreserved() [TestMethod] public void SerializeGpos_SinglePos_ValuesPreserved() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, ignoreCache: true); + var font = OpenTypeFonts.LoadFont("Roboto"); var singlePosLookup = FindFirstLookupOfType(font.GposTable, 1); if (singlePosLookup == null) @@ -416,20 +351,16 @@ public void SerializeGpos_SinglePos_ValuesPreserved() return; } - // Collect original adjustments var originalAdjustments = CollectSinglePosAdjustments(font); Debug.WriteLine(string.Format("Original has {0} single adjustments", originalAdjustments.Count)); - // Act var serializer = new OpenTypeFontSerializer(font); var bytes = serializer.Serialize(); - var reparsed = new OpenTypeFont(bytes, font.Format); + var reparsed = new OpenTypeFont(bytes); - // Assert var reparsedAdjustments = CollectSinglePosAdjustments(reparsed); - Assert.AreEqual(originalAdjustments.Count, reparsedAdjustments.Count, - "SinglePos adjustment count should match"); + Assert.AreEqual(originalAdjustments.Count, reparsedAdjustments.Count, "SinglePos adjustment count should match"); foreach (ushort glyphId in originalAdjustments.Keys) { @@ -440,14 +371,10 @@ public void SerializeGpos_SinglePos_ValuesPreserved() var actual = reparsedAdjustments[glyphId]; - Assert.AreEqual(expected.XPlacement, actual.XPlacement, - string.Format("Glyph {0} XPlacement", glyphId)); - Assert.AreEqual(expected.YPlacement, actual.YPlacement, - string.Format("Glyph {0} YPlacement", glyphId)); - Assert.AreEqual(expected.XAdvance, actual.XAdvance, - string.Format("Glyph {0} XAdvance", glyphId)); - Assert.AreEqual(expected.YAdvance, actual.YAdvance, - string.Format("Glyph {0} YAdvance", glyphId)); + Assert.AreEqual(expected.XPlacement, actual.XPlacement, string.Format("Glyph {0} XPlacement", glyphId)); + Assert.AreEqual(expected.YPlacement, actual.YPlacement, string.Format("Glyph {0} YPlacement", glyphId)); + Assert.AreEqual(expected.XAdvance, actual.XAdvance, string.Format("Glyph {0} XAdvance", glyphId)); + Assert.AreEqual(expected.YAdvance, actual.YAdvance, string.Format("Glyph {0} YAdvance", glyphId)); } Debug.WriteLine(string.Format("Verified {0} single adjustments", originalAdjustments.Count)); @@ -460,8 +387,7 @@ public void SerializeGpos_SinglePos_ValuesPreserved() [TestMethod] public void SerializeGpos_MarkToBase_StructurePreserved() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, ignoreCache: true); + var font = OpenTypeFonts.LoadFont("Roboto"); var markToBaseLookup = FindFirstLookupOfType(font.GposTable, 4); if (markToBaseLookup == null) @@ -473,12 +399,10 @@ public void SerializeGpos_MarkToBase_StructurePreserved() var origSubtable = markToBaseLookup.SubTables[0] as MarkToBaseSubTableFormat1; Assert.IsNotNull(origSubtable, "Should have MarkToBase subtable"); - // Act var serializer = new OpenTypeFontSerializer(font); var bytes = serializer.Serialize(); - var reparsed = new OpenTypeFont(bytes, font.Format); + var reparsed = new OpenTypeFont(bytes); - // Assert var newLookup = FindFirstLookupOfType(reparsed.GposTable, 4); Assert.IsNotNull(newLookup, "MarkToBase lookup should exist"); @@ -490,16 +414,13 @@ public void SerializeGpos_MarkToBase_StructurePreserved() Assert.AreEqual(origSubtable.BaseArray.BaseCount, newSubtable.BaseArray.BaseCount, "BaseCount"); Debug.WriteLine(string.Format("MarkToBase preserved: {0} classes, {1} marks, {2} bases", - newSubtable.MarkClassCount, - newSubtable.MarkArray.MarkCount, - newSubtable.BaseArray.BaseCount)); + newSubtable.MarkClassCount, newSubtable.MarkArray.MarkCount, newSubtable.BaseArray.BaseCount)); } [TestMethod] public void SerializeGpos_MarkToBase_AnchorPointsPreserved() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, ignoreCache: true); + var font = OpenTypeFonts.LoadFont("Roboto"); var markToBaseLookup = FindFirstLookupOfType(font.GposTable, 4); if (markToBaseLookup == null) @@ -509,9 +430,8 @@ public void SerializeGpos_MarkToBase_AnchorPointsPreserved() } var origSubtable = markToBaseLookup.SubTables[0] as MarkToBaseSubTableFormat1; - - // Find valid mark-base pairs var originalAttachments = CollectMarkToBaseAttachments(origSubtable); + if (originalAttachments.Count == 0) { Assert.Inconclusive("No attachments found"); @@ -520,12 +440,10 @@ public void SerializeGpos_MarkToBase_AnchorPointsPreserved() Debug.WriteLine(string.Format("Found {0} mark-base attachments", originalAttachments.Count)); - // Act var serializer = new OpenTypeFontSerializer(font); var bytes = serializer.Serialize(); - var reparsed = new OpenTypeFont(bytes, font.Format); + var reparsed = new OpenTypeFont(bytes); - // Assert var newLookup = FindFirstLookupOfType(reparsed.GposTable, 4); var newSubtable = newLookup.SubTables[0] as MarkToBaseSubTableFormat1; @@ -539,10 +457,8 @@ public void SerializeGpos_MarkToBase_AnchorPointsPreserved() var expected = originalAttachments[pair]; AnchorTable newMarkAnchor, newBaseAnchor; - Assert.IsTrue(newSubtable.TryGetAttachment(pair.FirstGlyph, pair.SecondGlyph, - out newMarkAnchor, out newBaseAnchor), - string.Format("Missing attachment for mark {0}, base {1}", - pair.FirstGlyph, pair.SecondGlyph)); + Assert.IsTrue(newSubtable.TryGetAttachment(pair.FirstGlyph, pair.SecondGlyph, out newMarkAnchor, out newBaseAnchor), + string.Format("Missing attachment for mark {0}, base {1}", pair.FirstGlyph, pair.SecondGlyph)); Assert.AreEqual(expected.MarkAnchorX, newMarkAnchor.XCoordinate, string.Format("Mark anchor X for ({0}, {1})", pair.FirstGlyph, pair.SecondGlyph)); @@ -566,15 +482,12 @@ public void SerializeGpos_MarkToBase_AnchorPointsPreserved() [TestMethod] public void SerializeGpos_FeatureLookupIndices_AreValid() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, ignoreCache: true); + var font = OpenTypeFonts.LoadFont("Roboto"); - // Act var serializer = new OpenTypeFontSerializer(font); var bytes = serializer.Serialize(); - var reparsed = new OpenTypeFont(bytes, font.Format); + var reparsed = new OpenTypeFont(bytes); - // Assert int lookupCount = reparsed.GposTable.LookupList.Lookups.Count; foreach (var feature in reparsed.GposTable.FeatureList.FeatureRecords) @@ -593,7 +506,7 @@ public void SerializeGpos_FeatureLookupIndices_AreValid() [TestMethod] public void Diagnose_GposTableOffset() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); Debug.WriteLine("=== TABLE RECORDS ==="); foreach (var kvp in font.TableRecords) @@ -604,9 +517,7 @@ public void Diagnose_GposTableOffset() Debug.WriteLine(string.Format("\n=== READER STATE ===")); Debug.WriteLine(string.Format("Reader stream length: {0}", font._tblSettings.TableReaderFactory.FontBytesLength)); - Debug.WriteLine(string.Format("Reader stream position: {0}", font._tblSettings.TableReaderFactory.FontBytesLength)); - // Try to read GPOS Debug.WriteLine("\n=== LOADING GPOS ==="); var gpos = font.GposTable; Debug.WriteLine(string.Format("GPOS version: {0}.{1}", gpos.MajorVersion, gpos.MinorVersion)); @@ -615,20 +526,16 @@ public void Diagnose_GposTableOffset() [TestMethod] public void SerializeGpos_LangSysFeatureIndices_AreValid() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); - // Act var serializer = new OpenTypeFontSerializer(font); var bytes = serializer.Serialize(); - var reparsed = new OpenTypeFont(bytes, font.Format); + var reparsed = new OpenTypeFont(bytes); - // Assert int featureCount = reparsed.GposTable.FeatureList.FeatureRecords.Count; foreach (var script in reparsed.GposTable.ScriptList.ScriptRecords) { - // Check DefaultLangSys if (script.ScriptTable.DefaultLangSys != null) { foreach (var idx in script.ScriptTable.DefaultLangSys.FeatureIndices) @@ -639,7 +546,6 @@ public void SerializeGpos_LangSysFeatureIndices_AreValid() } } - // Check other LangSys records foreach (var langSys in script.ScriptTable.LangSysRecords) { foreach (var idx in langSys.LangSysTable.FeatureIndices) @@ -661,15 +567,12 @@ public void SerializeGpos_LangSysFeatureIndices_AreValid() [TestMethod] public void SerializeGpos_CoverageGlyphIds_AreValid() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, ignoreCache: true); + var font = OpenTypeFonts.LoadFont("Roboto"); - // Act var serializer = new OpenTypeFontSerializer(font); var bytes = serializer.Serialize(); - var reparsed = new OpenTypeFont(bytes, font.Format); + var reparsed = new OpenTypeFont(bytes); - // Assert ushort maxGlyph = reparsed.MaxpTable.numGlyphs; for (int lookupIdx = 0; lookupIdx < reparsed.GposTable.LookupList.Lookups.Count; lookupIdx++) @@ -708,9 +611,7 @@ private LookupTable FindFirstLookupOfType(GposTable gpos, int lookupType) foreach (var lookup in gpos.LookupList.Lookups) { if (lookup.LookupType == lookupType) - { return lookup; - } } return null; } @@ -729,7 +630,6 @@ private Dictionary CollectKerningPairs(OpenTypeFont font) var coveredGlyphs = subtable.Coverage.GetCoveredGlyphs(); - // PairSets är en List som är indexerad parallellt med Coverage for (int i = 0; i < coveredGlyphs.Length && i < subtable.PairSets.Count; i++) { ushort firstGlyph = coveredGlyphs[i]; @@ -836,33 +736,16 @@ private List GetCoveragesFromSubtable(object subtable) var coverages = new List(); var pp1 = subtable as PairPosSubTableFormat1; - if (pp1 != null) - { - coverages.Add(pp1.Coverage); - return coverages; - } + if (pp1 != null) { coverages.Add(pp1.Coverage); return coverages; } var sp1 = subtable as SinglePosSubTableFormat1; - if (sp1 != null) - { - coverages.Add(sp1.Coverage); - return coverages; - } + if (sp1 != null) { coverages.Add(sp1.Coverage); return coverages; } var sp2 = subtable as SinglePosSubTableFormat2; - if (sp2 != null) - { - coverages.Add(sp2.Coverage); - return coverages; - } + if (sp2 != null) { coverages.Add(sp2.Coverage); return coverages; } var mtb = subtable as MarkToBaseSubTableFormat1; - if (mtb != null) - { - coverages.Add(mtb.MarkCoverage); - coverages.Add(mtb.BaseCoverage); - return coverages; - } + if (mtb != null) { coverages.Add(mtb.MarkCoverage); coverages.Add(mtb.BaseCoverage); return coverages; } return coverages; } diff --git a/src/EPPlus.Fonts.OpenType.Tests/Serialization/GlyphTableSerializationTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Serialization/GlyphTableSerializationTests.cs index ad1b54ac6..2c01afc2f 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Serialization/GlyphTableSerializationTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Serialization/GlyphTableSerializationTests.cs @@ -19,7 +19,7 @@ public void SerializeLocaTable() var ffi = FontScannerV2.FindBestMatch(FontFolder, "Roboto", FontSubFamily.Regular); var originalBytes = ffi.GetTableBytes("loca"); - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false, true); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var locaBytes = font.LocaTable.Serialize(font); Assert.AreEqual(originalBytes.Length, locaBytes?.Length); @@ -32,7 +32,7 @@ public void SerializeHtmxTable() var ffi = FontScannerV2.FindBestMatch(FontFolder, "Roboto", FontSubFamily.Regular); var originalBytes = ffi.GetTableBytes("hmtx"); - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false, true); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var hmtxBytes = font?.HmtxTable.Serialize(font); Assert.AreEqual(originalBytes.Length, hmtxBytes?.Length); @@ -46,10 +46,11 @@ public void SerializeHtmxTable() [DataRow("Mulish", FontSubFamily.Regular)] public void SerializeGlyfTable(string fontName, FontSubFamily subFamily) { + OpenTypeFonts.ClearFontCache(); var ffi = FontScannerV2.FindBestMatch(FontFolders, fontName, subFamily); var originalBytes = ffi.GetTableBytes("glyf"); - var font = OpenTypeFonts.GetFontData(FontFolders, fontName, subFamily, false, true); + var font = OpenTypeFonts.LoadFont(fontName, subFamily); var glyfBytes = font.GlyfTable.Serialize(font); Assert.AreEqual(originalBytes.Length, glyfBytes?.Length, diff --git a/src/EPPlus.Fonts.OpenType.Tests/Serialization/KernSerializationTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Serialization/KernSerializationTests.cs index 4da664f3e..57ad3c238 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Serialization/KernSerializationTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Serialization/KernSerializationTests.cs @@ -19,7 +19,7 @@ public void SerializeKernTable() var ffi = FontScannerV2.FindBestMatch(@"c:\windows\fonts", "Arial", FontSubFamily.Regular); var originalBytes = ffi.GetTableBytes("kern"); - var font = OpenTypeFonts.GetFontData(new List { @"c:\windows\fonts" }, "Arial", FontSubFamily.Regular, false); + var font = OpenTypeFonts.LoadFont("Arial"); var kernBytes = font?.KernTable.Serialize(font); Assert.AreEqual(originalBytes.Length, kernBytes?.Length); diff --git a/src/EPPlus.Fonts.OpenType.Tests/Subsetting/BasicSubsettingTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Subsetting/BasicSubsettingTests.cs index 4770c5212..c86277435 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Subsetting/BasicSubsettingTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Subsetting/BasicSubsettingTests.cs @@ -28,19 +28,15 @@ public class BasicSubsettingTests : FontTestBase [TestMethod] public void Subset_Abc_RoundtripValidation() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false); + var font = OpenTypeFonts.LoadFont("Roboto"); var subsetFont = font.CreateSubset(new[] { 'a', 'b', 'c' }); - // Act var serializer = new OpenTypeFontSerializer(subsetFont); var bytes = serializer.Serialize(); - var parsedFont = new OpenTypeFont(bytes, font.Format); + var parsedFont = new OpenTypeFont(bytes); - // Save for inspection SaveFontForCurrentTest(parsedFont); - // Assert: Check table presence Assert.AreEqual(12, parsedFont.TableRecords.Count); Assert.IsTrue(parsedFont.TableRecords.ContainsKey("head")); Assert.IsTrue(parsedFont.TableRecords.ContainsKey("name")); @@ -55,14 +51,11 @@ public void Subset_Abc_RoundtripValidation() Assert.IsTrue(parsedFont.TableRecords.ContainsKey("GSUB")); Assert.IsTrue(parsedFont.TableRecords.ContainsKey("GPOS")); - // Validate all tables FontTestHelper.AssertFontValid(parsedFont); - // ✅ FIXED: abc should have NO ligatures int ligatureCount = FontTestHelper.CountLigatures(parsedFont); Assert.AreEqual(0, ligatureCount, "abc should have NO ligatures"); - // Verify glyph count (approximately) int expectedGlyphs = 3; // a, b, c expectedGlyphs += 1; // + space (U+0020) expectedGlyphs += 1; // + .notdef (GID 0) @@ -71,39 +64,33 @@ public void Subset_Abc_RoundtripValidation() Assert.AreEqual((ushort)expectedGlyphs, parsedFont.MaxpTable.numGlyphs); Assert.AreEqual((ushort)expectedGlyphs, parsedFont.HheaTable.numberOfHMetrics); - // Verify space exists in cmap Assert.IsTrue(parsedFont.CmapTable.ContainsChar(32)); } [TestMethod] public void Subset_Fiffig_WithFullValidation() { - // Arrange - var fontName = "Roboto"; - var font = OpenTypeFonts.GetFontData(FontFolders, fontName, FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("Roboto"); var subsetFont = font.CreateSubset("fiffig"); - // Act var serializer = new OpenTypeFontSerializer(subsetFont); var bytes = serializer.Serialize(); - var parsedFont = new OpenTypeFont(bytes, font.Format); + var parsedFont = new OpenTypeFont(bytes); - // Save for inspection - SaveFontForCurrentTest( parsedFont); + SaveFontForCurrentTest(parsedFont); - // Assert FontTestHelper.AssertFontValid(parsedFont, FontValidationSeverity.Warning); } [TestMethod] public void Subset_SingleChar_ShouldWork() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Mulish", FontSubFamily.Regular, false); + var font = OpenTypeFonts.LoadFont("Mulish"); var subsetFont = font.CreateSubset(new[] { 'a' }); var serializer = new OpenTypeFontSerializer(subsetFont); var bytes = serializer.Serialize(); - var parsedFont = new OpenTypeFont(bytes, font.Format); + var parsedFont = new OpenTypeFont(bytes); SaveFontForCurrentTest(parsedFont); @@ -113,7 +100,7 @@ public void Subset_SingleChar_ShouldWork() [TestMethod] public void Subset_MultipleChars_ShouldWork() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false); + var font = OpenTypeFonts.LoadFont("Roboto"); var subsetFont = font.CreateSubset(new[] { 'F', 'l', 'y', 'g', 'a', 'n', 'd', 'e', 'b', 'ä', 'c', 'k', 's', 'i', 'r', 'ö', 'h', 'w', 'p', 'å', 'm', 'j', 'u', 't', 'v', 'o', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' @@ -121,7 +108,7 @@ public void Subset_MultipleChars_ShouldWork() var serializer = new OpenTypeFontSerializer(subsetFont); var bytes = serializer.Serialize(); - var parsedFont = new OpenTypeFont(bytes, font.Format); + var parsedFont = new OpenTypeFont(bytes); SaveFontForCurrentTest(parsedFont); @@ -131,7 +118,6 @@ public void Subset_MultipleChars_ShouldWork() [TestMethod] public void Subset_RoundtripHelper_ShouldWork() { - // Using FontTestHelper.RoundtripSubset var parsedFont = FontTestHelper.RoundtripSubset("Roboto", "test", FontFolders); SaveFontForCurrentTest(parsedFont); @@ -143,9 +129,8 @@ public void Subset_RoundtripHelper_ShouldWork() [TestMethod] public void Check_Original_Roboto_Ligatures() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false); + var font = OpenTypeFonts.LoadFont("Roboto"); - // Get glyph IDs in ORIGINAL font.CmapTable.TryGetGlyphId('f', out ushort fGlyph); font.CmapTable.TryGetGlyphId('i', out ushort iGlyph); font.CmapTable.TryGetGlyphId('o', out ushort oGlyph); @@ -183,9 +168,8 @@ public void Check_Original_Roboto_Ligatures() [TestMethod] public void Subset_Ligatures_ShouldStillWork() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false); + var font = OpenTypeFonts.LoadFont("Roboto"); - // Check ORIGINAL first Debug.WriteLine("=== ORIGINAL ROBOTO ==="); if (font.GsubTable != null) { @@ -216,13 +200,12 @@ public void Subset_Ligatures_ShouldStillWork() Debug.WriteLine($"Feature[{i}]: '{feat.FeatureTag.Value}'"); } - // Create subset Debug.WriteLine("\n=== CREATING SUBSET ==="); var subsetFont = font.CreateSubset("fiffigoffice"); var serializer = new OpenTypeFontSerializer(subsetFont); var bytes = serializer.Serialize(); - var parsedFont = new OpenTypeFont(bytes, font.Format); + var parsedFont = new OpenTypeFont(bytes); SaveFontForCurrentTest(parsedFont); @@ -234,7 +217,6 @@ public void Subset_Ligatures_ShouldStillWork() Debug.WriteLine($"'f' = glyph {subsetF}"); Debug.WriteLine($"'i' = glyph {subsetI}"); - // Check GSUB Assert.IsNotNull(parsedFont.GsubTable, "GSUB should be present"); Debug.WriteLine($"\n=== GSUB FEATURES (DETAILED) ==="); @@ -253,7 +235,6 @@ public void Subset_Ligatures_ShouldStillWork() Assert.IsTrue(ligLookups.Count > 0, "Should have ligature lookups"); - // Check what ligatures exist foreach (var lookup in ligLookups) { foreach (var subtable in lookup.SubTables) @@ -293,7 +274,6 @@ public void Subset_Ligatures_ShouldStillWork() var scriptTable = scriptRecord.ScriptTable; - // Check DefaultLangSys if (scriptTable.DefaultLangSys != null) { var defLang = scriptTable.DefaultLangSys; @@ -301,7 +281,6 @@ public void Subset_Ligatures_ShouldStillWork() Debug.WriteLine($" RequiredFeatureIndex: {defLang.RequiredFeatureIndex}"); Debug.WriteLine($" FeatureIndices: [{string.Join(", ", defLang.FeatureIndices.Select(i => i.ToString()).ToArray())}]"); - // Show what features these indices point to foreach (var featIdx in defLang.FeatureIndices) { if (featIdx < parsedFont.GsubTable.FeatureList.FeatureRecords.Count) @@ -313,21 +292,16 @@ public void Subset_Ligatures_ShouldStillWork() } } } + FontTestHelper.AssertFontValid(parsedFont, FontValidationSeverity.Warning); } - - [TestMethod] public void Subset_WithGposKerning_ShouldPreservePositioning() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false); - - // Use characters that ACTUALLY have kerning in Roboto + var font = OpenTypeFonts.LoadFont("Roboto"); var chars = new[] { 'f', 'e', 'c', 'd', 'g', 'E', 'a', 'b', ' ' }; - // Check ORIGINAL font - test f-e pair bool foundF_Original = font.CmapTable.TryGetGlyphId('f', out ushort fGlyphOrig); bool foundE_Original = font.CmapTable.TryGetGlyphId('e', out ushort eGlyphOrig); @@ -337,7 +311,6 @@ public void Subset_WithGposKerning_ShouldPreservePositioning() Assert.IsTrue(foundF_Original && foundE_Original, "Should find f and e in original"); - // Verify kerning exists in original bool hasOriginalKerning = false; if (font.GposTable != null) { @@ -356,17 +329,15 @@ public void Subset_WithGposKerning_ShouldPreservePositioning() Assert.IsTrue(hasOriginalKerning, "f-e should have kerning in original font"); - // Create subset Debug.WriteLine($"\n=== CREATING SUBSET ==="); var subsetFont = font.CreateSubset(chars); var serializer = new OpenTypeFontSerializer(subsetFont); var bytes = serializer.Serialize(); - var parsedFont = new OpenTypeFont(bytes, font.Format); + var parsedFont = new OpenTypeFont(bytes); SaveFontForCurrentTest(parsedFont); - // Check SUBSET font bool foundF = parsedFont.CmapTable.TryGetGlyphId('f', out ushort fGlyph); bool foundE = parsedFont.CmapTable.TryGetGlyphId('e', out ushort eGlyph); @@ -379,7 +350,6 @@ public void Subset_WithGposKerning_ShouldPreservePositioning() var kernLookups = parsedFont.GposTable.LookupList.Lookups.Where(l => l.LookupType == 2).ToList(); Assert.IsTrue(kernLookups.Count > 0, "Should have at least one kerning lookup"); - // Verify f-e kerning is preserved bool hasKerning = false; foreach (var lookup in kernLookups) { @@ -402,29 +372,22 @@ public void Subset_WithGposKerning_ShouldPreservePositioning() [TestMethod] public void Subset_WithGposSingleAdjustment_ShouldPreserve() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false); - - // Include various characters that might have single adjustments + var font = OpenTypeFonts.LoadFont("Roboto"); var chars = new[] { - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', - 'A', 'B', 'C', 'D', 'E', ' ' - }; + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', + 'A', 'B', 'C', 'D', 'E', ' ' + }; var subsetFont = font.CreateSubset(chars); - // Act var serializer = new OpenTypeFontSerializer(subsetFont); var bytes = serializer.Serialize(); - var parsedFont = new OpenTypeFont(bytes, font.Format); + var parsedFont = new OpenTypeFont(bytes); - // Save for inspection SaveFontForCurrentTest(parsedFont); - // Assert FontTestHelper.AssertFontValid(parsedFont, FontValidationSeverity.Warning); - // Check if SinglePos lookups exist if (parsedFont.GposTable != null) { var singlePosLookups = parsedFont.GposTable.LookupList.Lookups @@ -432,43 +395,32 @@ public void Subset_WithGposSingleAdjustment_ShouldPreserve() .ToList(); if (singlePosLookups.Count > 0) - { System.Diagnostics.Debug.WriteLine($"✅ Subset has {singlePosLookups.Count} SinglePos lookup(s)"); - } else - { System.Diagnostics.Debug.WriteLine("ℹ️ No SinglePos lookups in subset (may not be present in Roboto)"); - } } } [TestMethod] public void Subset_WithGposMarkToBase_ShouldPreserveAccents() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false); - - // Include base characters and their accented versions + var font = OpenTypeFonts.LoadFont("Roboto"); var chars = new[] { - 'e', 'a', 'o', 'u', 'i', 'n', - 'é', 'à', 'ö', 'ü', 'ñ', ' ', - 'E', 'A', 'O', 'U' - }; + 'e', 'a', 'o', 'u', 'i', 'n', + 'é', 'à', 'ö', 'ü', 'ñ', ' ', + 'E', 'A', 'O', 'U' + }; var subsetFont = font.CreateSubset(chars); - // Act var serializer = new OpenTypeFontSerializer(subsetFont); var bytes = serializer.Serialize(); - var parsedFont = new OpenTypeFont(bytes, font.Format); + var parsedFont = new OpenTypeFont(bytes); - // Save for inspection SaveFontForCurrentTest(parsedFont); - // Assert FontTestHelper.AssertFontValid(parsedFont, FontValidationSeverity.Warning); - // Check if MarkToBase lookups exist if (parsedFont.GposTable != null) { var markToBaseLookups = parsedFont.GposTable.LookupList.Lookups @@ -479,7 +431,6 @@ public void Subset_WithGposMarkToBase_ShouldPreserveAccents() { System.Diagnostics.Debug.WriteLine($"✅ Subset has {markToBaseLookups.Count} MarkToBase lookup(s)"); - // Try to verify a specific attachment var subtable = markToBaseLookups[0].SubTables.FirstOrDefault() as MarkToBaseSubTableFormat1; if (subtable != null) { @@ -498,28 +449,18 @@ public void Subset_WithGposMarkToBase_ShouldPreserveAccents() [TestMethod] public void Subset_CompleteGposTest_AllThreeLookupTypes() { - // Arrange - Kitchen sink test with all GPOS features - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false); - - // Characters covering: - // - Kerning pairs (A-V, T-o, etc.) - // - Potential single adjustments - // - Accented characters for MarkToBase + var font = OpenTypeFonts.LoadFont("Roboto"); var text = "AVTO Wave Typography TEST café résumé ñoño 123"; var subsetFont = font.CreateSubset(text); - // Act var serializer = new OpenTypeFontSerializer(subsetFont); var bytes = serializer.Serialize(); - var parsedFont = new OpenTypeFont(bytes, font.Format); + var parsedFont = new OpenTypeFont(bytes); - // Save for inspection SaveFontForCurrentTest(parsedFont); - // Assert FontTestHelper.AssertFontValid(parsedFont, FontValidationSeverity.Warning); - // Comprehensive GPOS check if (parsedFont.GposTable != null) { System.Diagnostics.Debug.WriteLine("=== GPOS Subsetting Results ==="); diff --git a/src/EPPlus.Fonts.OpenType.Tests/Subsetting/CompositeGlyphSubsettingTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Subsetting/CompositeGlyphSubsettingTests.cs index f44dc4ccd..f70918a15 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Subsetting/CompositeGlyphSubsettingTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Subsetting/CompositeGlyphSubsettingTests.cs @@ -23,7 +23,7 @@ public class CompositeGlyphSubsettingTests : FontTestBase [TestMethod] public void Subset_Roboto_With_ÅÄÖ_Should_Work() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); // Get the original å var ågId = font.CmapTable.MapCharToGlyph('å'); @@ -45,7 +45,7 @@ public void Subset_Roboto_With_ÅÄÖ_Should_Work() [TestMethod] public void Subset_Mulish_With_ÅÄÖ_Should_Work() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Mulish", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Mulish", FontSubFamily.Regular); var subset = font.CreateSubset("Testar åäö ÅÄÖ och även é û č ć đ ł".Distinct()); // Save for inspection (CI/CD safe) @@ -62,7 +62,7 @@ public void Subset_Mulish_With_ÅÄÖ_Should_Work() [TestMethod] public void Subset_BIZUDGothic_With_ÅÄÖ_Should_Work() { - var font = OpenTypeFonts.GetFontData(FontFolders, "BIZUDGothic", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("BIZUDGothic", FontSubFamily.Regular); var subset = font.CreateSubset("Testar åäö ÅÄÖ och även é û č ć đ ł".Distinct()); // Save for inspection (CI/CD safe) diff --git a/src/EPPlus.Fonts.OpenType.Tests/Subsetting/LigatureSubsettingTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Subsetting/LigatureSubsettingTests.cs index 9cbba3b16..567928524 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Subsetting/LigatureSubsettingTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Subsetting/LigatureSubsettingTests.cs @@ -25,7 +25,7 @@ public class LigatureSubsettingTests : FontTestBase [TestMethod] public void Subset_Abc_ShouldHaveNoLigatures() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var subset = font.CreateSubset(new[] { 'a', 'b', 'c' }); SaveFontForCurrentTest(subset); @@ -37,7 +37,7 @@ public void Subset_Abc_ShouldHaveNoLigatures() [TestMethod] public void Subset_Fiffig_ShouldHaveThreeLigatures() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var subset = font.CreateSubset("fiffig"); SaveFontForCurrentTest(subset); @@ -49,7 +49,7 @@ public void Subset_Fiffig_ShouldHaveThreeLigatures() [TestMethod] public void Subset_Fi_ShouldHaveFiLigature() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var subset = font.CreateSubset("fi"); SaveFontForCurrentTest(subset); @@ -61,7 +61,7 @@ public void Subset_Fi_ShouldHaveFiLigature() [TestMethod] public void Subset_Ff_ShouldHaveFfLigature() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var subset = font.CreateSubset("ff"); SaveFontForCurrentTest(subset); @@ -77,7 +77,7 @@ public void Subset_Ff_ShouldHaveFfLigature() [DataRow("fl")] public void Subset_CommonLigatures_ShouldWork(string text) { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var subset = font.CreateSubset(text); SaveFontForCurrentTest(subset, text); @@ -85,7 +85,6 @@ public void Subset_CommonLigatures_ShouldWork(string text) Assert.IsNotNull(subset); FontTestHelper.AssertFontValid(subset); - // Should have at least one ligature int ligCount = FontTestHelper.CountLigatures(subset); Assert.IsTrue(ligCount > 0, $"{text} should have ligatures"); } @@ -93,22 +92,20 @@ public void Subset_CommonLigatures_ShouldWork(string text) [TestMethod] public void Subset_OnlyF_ShouldNotCrash() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var subset = font.CreateSubset("f"); SaveFontForCurrentTest(subset); - // Should not crash, may or may not have ligatures Assert.IsNotNull(subset); Assert.IsTrue(subset.MaxpTable.numGlyphs > 0); FontTestHelper.AssertFontValid(subset); - } [TestMethod] public void Subset_Office_ShouldHaveFfiLigature() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var subset = font.CreateSubset("office"); SaveFontForCurrentTest(subset); @@ -120,7 +117,7 @@ public void Subset_Office_ShouldHaveFfiLigature() [TestMethod] public void Subset_HasLigatureLookupType() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var subset = font.CreateSubset("fi"); bool hasLigatures = FontTestHelper.HasGsubLookupType(subset, 4); diff --git a/src/EPPlus.Fonts.OpenType.Tests/Subsetting/SubsettingEdgeCasesTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Subsetting/SubsettingEdgeCasesTests.cs index fc60eca42..524744cf4 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Subsetting/SubsettingEdgeCasesTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Subsetting/SubsettingEdgeCasesTests.cs @@ -28,7 +28,7 @@ public class SubsettingEdgeCasesTests : FontTestBase [ExpectedException(typeof(ArgumentException))] public void Subset_EmptyString_ShouldThrow() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var subset = font.CreateSubset(""); } @@ -36,14 +36,14 @@ public void Subset_EmptyString_ShouldThrow() [ExpectedException(typeof(ArgumentNullException))] public void Subset_NullArray_ShouldThrow() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var subset = font.CreateSubset((char[])null); } [TestMethod] public void Subset_SingleChar_ShouldHaveMinimalGlyphs() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var subset = font.CreateSubset("a"); SaveFont("edge_single_char.ttf", subset); @@ -56,7 +56,7 @@ public void Subset_SingleChar_ShouldHaveMinimalGlyphs() [TestMethod] public void Subset_LargeText_ShouldCompleteQuickly() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var allLatinChars = Enumerable.Range(32, 95).Select(i => (char)i).ToArray(); var sw = System.Diagnostics.Stopwatch.StartNew(); @@ -72,7 +72,7 @@ public void Subset_LargeText_ShouldCompleteQuickly() [TestMethod] public void Subset_DuplicateChars_ShouldDedup() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var subset1 = font.CreateSubset("aaa"); var subset2 = font.CreateSubset("a"); @@ -84,7 +84,7 @@ public void Subset_DuplicateChars_ShouldDedup() [TestMethod] public void Subset_AllGlyphs_ShouldBeSimilarSizeToOriginal() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); // Get ALL characters from cmap var allChars = new HashSet(); @@ -115,7 +115,7 @@ public void Subset_AllGlyphs_ShouldBeSimilarSizeToOriginal() public void Subset_PreservesRobotoKerning() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var builder = new SubsetFontBuilder(); // Act diff --git a/src/EPPlus.Fonts.OpenType.Tests/Subsetting/VerticalSubsettingTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Subsetting/VerticalSubsettingTests.cs index 967d6f31e..95efe9815 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Subsetting/VerticalSubsettingTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Subsetting/VerticalSubsettingTests.cs @@ -32,13 +32,13 @@ public static void ClassInitialize(TestContext ctx) public void Subset_CjkFont_SubsetContainsVheaTable() { // Arrange - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("BIZ UDGothic"); Assert.IsNotNull(font.VheaTable, "BIZ UDGothic should have a vhea table"); // Act var subset = font.CreateSubset("日本語"); var bytes = subset.Serialize(); - var parsed = new OpenTypeFont(bytes, font.Format); + var parsed = new OpenTypeFont(bytes); SaveFontForCurrentTest(parsed); @@ -50,13 +50,13 @@ public void Subset_CjkFont_SubsetContainsVheaTable() public void Subset_CjkFont_SubsetContainsVmtxTable() { // Arrange - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("BIZ UDGothic"); Assert.IsNotNull(font.VmtxTable, "BIZ UDGothic should have a vmtx table"); // Act var subset = font.CreateSubset("日本語"); var bytes = subset.Serialize(); - var parsed = new OpenTypeFont(bytes, font.Format); + var parsed = new OpenTypeFont(bytes); SaveFontForCurrentTest(parsed); @@ -68,13 +68,13 @@ public void Subset_CjkFont_SubsetContainsVmtxTable() public void Subset_FontWithoutVmtx_SubsetDoesNotContainVmtxTable() { // Arrange - Roboto has no vmtx/vhea - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "Roboto", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("Roboto"); Assert.IsNull(font.VmtxTable, "Roboto should not have a vmtx table"); // Act var subset = font.CreateSubset("ABC"); var bytes = subset.Serialize(); - var parsed = new OpenTypeFont(bytes, font.Format); + var parsed = new OpenTypeFont(bytes); // Assert - vmtx should not be introduced by subsetting Assert.IsNull(parsed.VmtxTable, "Subset of font without vmtx should not contain vmtx table"); @@ -88,12 +88,12 @@ public void Subset_FontWithoutVmtx_SubsetDoesNotContainVmtxTable() public void Subset_CjkFont_VheaNumberOfVMetricsMatchesGlyphCount() { // Arrange - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("BIZ UDGothic"); // Act var subset = font.CreateSubset("日本語"); var bytes = subset.Serialize(); - var parsed = new OpenTypeFont(bytes, font.Format); + var parsed = new OpenTypeFont(bytes); SaveFontForCurrentTest(parsed); @@ -112,7 +112,7 @@ public void Subset_CjkFont_VheaNumberOfVMetricsMatchesGlyphCount() public void Subset_CjkFont_VmtxAdvanceHeightPreservedForSubsettedGlyphs() { // Arrange - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("BIZ UDGothic"); var text = "日"; // Get original glyph ID and advance height before subsetting @@ -123,7 +123,7 @@ public void Subset_CjkFont_VmtxAdvanceHeightPreservedForSubsettedGlyphs() // Act var subset = font.CreateSubset(text); var bytes = subset.Serialize(); - var parsed = new OpenTypeFont(bytes, font.Format); + var parsed = new OpenTypeFont(bytes); SaveFontForCurrentTest(parsed); @@ -141,12 +141,12 @@ public void Subset_CjkFont_VmtxAdvanceHeightPreservedForSubsettedGlyphs() public void Subset_CjkFont_VmtxEntryCountMatchesGlyphCount() { // Arrange - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("BIZ UDGothic"); // Act var subset = font.CreateSubset("東京"); var bytes = subset.Serialize(); - var parsed = new OpenTypeFont(bytes, font.Format); + var parsed = new OpenTypeFont(bytes); SaveFontForCurrentTest(parsed); @@ -161,12 +161,12 @@ public void Subset_CjkFont_VmtxEntryCountMatchesGlyphCount() public void Subset_CjkFont_PassesValidationAfterSubsetting() { // Arrange - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("BIZ UDGothic"); // Act var subset = font.CreateSubset("日本語テスト"); var bytes = subset.Serialize(); - var parsed = new OpenTypeFont(bytes, font.Format); + var parsed = new OpenTypeFont(bytes); SaveFontForCurrentTest(parsed); diff --git a/src/EPPlus.Fonts.OpenType.Tests/TextShaping/ChainingContextualSubstitutionTests.cs b/src/EPPlus.Fonts.OpenType.Tests/TextShaping/ChainingContextualSubstitutionTests.cs index 8d3f5c14a..ac06672ea 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/TextShaping/ChainingContextualSubstitutionTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/TextShaping/ChainingContextualSubstitutionTests.cs @@ -28,7 +28,7 @@ public class ChainingContextualSubstitutionTests : FontTestBase public void ChainingContextual_Roboto_FfiLigature_Office() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -43,7 +43,7 @@ public void ChainingContextual_Roboto_FfiLigature_Office() public void ChainingContextual_Roboto_FfiLigature_AtStart() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act - ffi at the beginning of text (no backtrack context) @@ -58,7 +58,7 @@ public void ChainingContextual_Roboto_FfiLigature_AtStart() public void ChainingContextual_Roboto_FfiLigature_AtEnd() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act - ffi at the end of text (no lookahead context) @@ -73,7 +73,7 @@ public void ChainingContextual_Roboto_FfiLigature_AtEnd() public void ChainingContextual_Roboto_MultipleFfiLigatures() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act - Multiple ffi sequences in same text @@ -93,7 +93,7 @@ public void ChainingContextual_Roboto_MultipleFfiLigatures() public void ChainingContextual_Roboto_Type6BeforeType4_CorrectOrder() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var subset = font.CreateSubset("office fit"); var shaper = new TextShaper(subset); @@ -114,7 +114,7 @@ public void ChainingContextual_Roboto_Type6BeforeType4_CorrectOrder() public void ChainingContextual_Roboto_FfiLigature_HasCorrectMetrics() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act diff --git a/src/EPPlus.Fonts.OpenType.Tests/TextShaping/MarkToBaseTests.cs b/src/EPPlus.Fonts.OpenType.Tests/TextShaping/MarkToBaseTests.cs index a62b97f91..8822a2e79 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/TextShaping/MarkToBaseTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/TextShaping/MarkToBaseTests.cs @@ -1,4 +1,5 @@ -using EPPlus.Fonts.OpenType.TextShaping; +using EPPlus.Fonts.OpenType.FontResolver; +using EPPlus.Fonts.OpenType.TextShaping; using OfficeOpenXml.Interfaces.Drawing.Text; using System; using System.Collections.Generic; @@ -10,14 +11,21 @@ namespace EPPlus.Fonts.OpenType.Tests.TextShaping { [TestClass] - public class MarkToBaseTests : FontTestBase + public class MarkToBaseTests { - public override TestContext? TestContext { get; set; } + [TestInitialize] + public void TestSetup() + { + OpenTypeFonts.ClearFontCache(); + + } [TestMethod] public void MarkToBaseTest() { - var font = OpenTypeFonts.GetFontData(null, "Roboto", FontSubFamily.Regular, true, true); + var resolver = new DefaultFontResolver(null, true); // system-Roboto, ingen testmapp + OpenTypeFonts.Configure(resolver); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular, ignoreCache: true); Debug.WriteLine("=== MarkToBaseTest ==="); Debug.WriteLine($"Font instance: {font.GetHashCode()}"); Debug.WriteLine($"CmapTable instance: {font.CmapTable.GetHashCode()}"); diff --git a/src/EPPlus.Fonts.OpenType.Tests/TextShaping/SingleAdjustmentsTests.cs b/src/EPPlus.Fonts.OpenType.Tests/TextShaping/SingleAdjustmentsTests.cs index 85b312086..639465430 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/TextShaping/SingleAdjustmentsTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/TextShaping/SingleAdjustmentsTests.cs @@ -14,15 +14,11 @@ public class SingleAdjustmentTests : FontTestBase [TestMethod] public void SingleAdjustment_Roboto_DoesNotCrash() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); - // Act - Shape text with glyphs that are in the Single Adjustment coverage - // (even though the adjustments are all zero) var result = shaper.Shape("Hello World"); - // Assert - Should not crash and should produce valid output Assert.IsNotNull(result); Assert.IsTrue(result.Glyphs.Length > 0); Assert.AreEqual("Hello World", result.OriginalText); @@ -31,19 +27,13 @@ public void SingleAdjustment_Roboto_DoesNotCrash() [TestMethod] public void SingleAdjustment_WithZeroValues_DoesNotAffectOutput() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); - // Act - Shape same text with and without positioning var withPositioning = shaper.Shape("AV"); var withoutPositioning = shaper.Shape("AV", ShapingOptions.None); - // Assert - With zero-value Single Adjustments, the glyphs should only - // differ by kerning (not by Single Adjustment since all values are 0) Assert.AreEqual(withoutPositioning.Glyphs.Length, withPositioning.Glyphs.Length); - - // The difference should only be from kerning Assert.IsTrue(withPositioning.TotalAdvanceWidth < withoutPositioning.TotalAdvanceWidth, "Should have kerning applied"); } @@ -51,32 +41,24 @@ public void SingleAdjustment_WithZeroValues_DoesNotAffectOutput() [TestMethod] public void SingleAdjustment_WithZeroValues_DoesNotAffectOutput2() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); - // Act - Shape same text with and without positioning var withPositioning = shaper.Shape("AV"); var withoutPositioning = shaper.Shape("AV", ShapingOptions.None); - // Debug output Debug.WriteLine($"Without positioning: {withoutPositioning.TotalAdvanceWidth}"); Debug.WriteLine($"With positioning: {withPositioning.TotalAdvanceWidth}"); Debug.WriteLine($"Difference: {withoutPositioning.TotalAdvanceWidth - withPositioning.TotalAdvanceWidth}"); Debug.WriteLine("\nWithout positioning glyphs:"); foreach (var g in withoutPositioning.Glyphs) - { Debug.WriteLine($" GlyphId: {g.GlyphId}, XAdvance: {g.XAdvance}, XOffset: {g.XOffset}"); - } Debug.WriteLine("\nWith positioning glyphs:"); foreach (var g in withPositioning.Glyphs) - { Debug.WriteLine($" GlyphId: {g.GlyphId}, XAdvance: {g.XAdvance}, XOffset: {g.XOffset}"); - } - // Assert Assert.AreEqual(withoutPositioning.Glyphs.Length, withPositioning.Glyphs.Length); Assert.IsTrue(withPositioning.TotalAdvanceWidth < withoutPositioning.TotalAdvanceWidth, "Should have kerning applied"); @@ -85,10 +67,9 @@ public void SingleAdjustment_WithZeroValues_DoesNotAffectOutput2() [TestMethod] public void Kerning_IsApplied_ForAVPair() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); - // Shape with only kerning (no single adjustment) var optionsOnlyKern = new ShapingOptions { ApplySubstitutions = false, @@ -108,30 +89,23 @@ public void Kerning_IsApplied_ForAVPair() [TestMethod] public void SingleAdjustment_Verdana_HasRealAdjustments() { - // NOTE: This test requires Verdana font to be installed - // Verdana has Single Adjustment Format 2 with XPlacement=36 for certain glyphs - try { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Verdana", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Verdana"); if (font == null || font.FullName != "Verdana") { Assert.Inconclusive("Verdana font not found - test skipped"); - return; // Koden efter detta körs inte + return; } var shaper = new TextShaper(font); - // Act - Shape some text (we don't know which specific glyphs have adjustments) var withPositioning = shaper.Shape("Hello123"); var withoutPositioning = shaper.Shape("Hello123", ShapingOptions.None); - // Assert - Should produce valid output Assert.IsNotNull(withPositioning); Assert.IsNotNull(withoutPositioning); Assert.AreEqual(withPositioning.Glyphs.Length, withoutPositioning.Glyphs.Length); - // Check if any glyph has XOffset applied (from Single Adjustment) bool hasXOffset = false; for (int i = 0; i < withPositioning.Glyphs.Length; i++) { @@ -142,8 +116,6 @@ public void SingleAdjustment_Verdana_HasRealAdjustments() } } - // Note: We can't assert that hasXOffset is true because we don't know - // which characters map to the adjusted glyphs. But we can verify no crash. System.Console.WriteLine($"Found XOffset adjustments: {hasXOffset}"); } catch (System.IO.FileNotFoundException) @@ -155,23 +127,18 @@ public void SingleAdjustment_Verdana_HasRealAdjustments() [TestMethod] public void SingleAdjustment_Verdana_AdjustmentsAppliedWithDefaultOptions() { - // NOTE: This test requires Verdana font to be installed - try { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Verdana", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Verdana"); if (font == null || font.FullName != "Verdana") { Assert.Inconclusive("Verdana font not found - test skipped"); - return; // Koden efter detta körs inte + return; } var shaper = new TextShaper(font); - // Act - Use default options (which includes positioning) var result = shaper.Shape("Test"); - // Assert - Should not crash and produce valid output Assert.IsNotNull(result); Assert.AreEqual(4, result.Glyphs.Length); Assert.AreEqual("Test", result.OriginalText); @@ -185,18 +152,11 @@ public void SingleAdjustment_Verdana_AdjustmentsAppliedWithDefaultOptions() [TestMethod] public void SingleAdjustment_AppliedBeforeKerning() { - // This test verifies the order of operations: - // Single Adjustment should be applied before Kerning - - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); - // Act var result = shaper.Shape("Test"); - // Assert - Just verify it doesn't crash and produces valid output - // (We can't test the actual order without non-zero Single Adjustment values) Assert.IsNotNull(result); Assert.IsTrue(result.Glyphs.Length > 0); } @@ -204,19 +164,14 @@ public void SingleAdjustment_AppliedBeforeKerning() [TestMethod] public void SingleAdjustment_NotAppliedWithNoneOptions() { - // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); - // Act var result = shaper.Shape("Test", ShapingOptions.None); - // Assert - Should have basic glyph mapping but no positioning Assert.IsNotNull(result); Assert.AreEqual(4, result.Glyphs.Length); - // With ShapingOptions.None, glyphs should have their base advance widths - // (no kerning or Single Adjustment applied) foreach (var glyph in result.Glyphs) { Assert.AreEqual(0, glyph.XOffset, "No offset adjustments with None options"); @@ -227,14 +182,11 @@ public void SingleAdjustment_NotAppliedWithNoneOptions() [TestMethod] public void SingleAdjustmentProvider_HandlesNullFont() { - // Arrange - Create provider with font that has no GPOS - var font = OpenTypeFonts.GetFontData(FontFolders, "SourceSans3", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("SourceSans3"); var shaper = new TextShaper(font); - // Act - Should not crash even though SourceSans3 has no GPOS table var result = shaper.Shape("Test"); - // Assert Assert.IsNotNull(result); Assert.AreEqual(4, result.Glyphs.Length); } diff --git a/src/EPPlus.Fonts.OpenType.Tests/TextShaping/SingleSubstitutionTests.cs b/src/EPPlus.Fonts.OpenType.Tests/TextShaping/SingleSubstitutionTests.cs index 80c601188..89f760706 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/TextShaping/SingleSubstitutionTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/TextShaping/SingleSubstitutionTests.cs @@ -38,7 +38,7 @@ public void SingleSubstitution_SmallCaps_SubstitutesGlyphs() { try { - var font = OpenTypeFonts.GetFontData(FontFolders, fontName, FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont(fontName, FontSubFamily.Regular); // Verify font has smcp feature with Type 1 lookup if (font == null || !font.FullName.Contains(fontName) || font.GsubTable == null) @@ -123,7 +123,7 @@ public void SingleSubstitution_AppliesBeforeLigatures() { try { - var font = OpenTypeFonts.GetFontData(FontFolders, fontName, FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont(fontName); if (font == null || !font.FullName .Contains(fontName) || font.GsubTable == null) continue; diff --git a/src/EPPlus.Fonts.OpenType.Tests/TextShaping/TextShaperTests.cs b/src/EPPlus.Fonts.OpenType.Tests/TextShaping/TextShaperTests.cs index 7d41a06c2..ac0ab4703 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/TextShaping/TextShaperTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/TextShaping/TextShaperTests.cs @@ -31,7 +31,7 @@ public class TextShaperTests : FontTestBase public void Shape_EmptyString_ReturnsEmptyResult() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -48,7 +48,7 @@ public void Shape_EmptyString_ReturnsEmptyResult() public void Shape_NullString_ReturnsEmptyResult() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -64,7 +64,7 @@ public void Shape_NullString_ReturnsEmptyResult() public void Shape_SingleCharacter_ReturnsOneGlyph() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -82,7 +82,7 @@ public void Shape_SingleCharacter_ReturnsOneGlyph() public void Shape_SimpleWord_ReturnsCorrectGlyphCount() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -99,7 +99,7 @@ public void Shape_SimpleWord_ReturnsCorrectGlyphCount() public void Shape_WithSpace_IncludesSpaceGlyph() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -118,7 +118,7 @@ public void Shape_WithSpace_IncludesSpaceGlyph() public void Shape_WithKerning_ReducesWidth() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var shaper = new TextShaper(font); // Act @@ -134,7 +134,7 @@ public void Shape_WithKerning_ReducesWidth() public void Debug_GposKerningFormat() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); Assert.IsNotNull(font.GposTable, "Should have GPOS"); @@ -177,7 +177,7 @@ public void Debug_GposKerningFormat() public void Shape_AVPair_HasNegativeKerning() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -197,7 +197,7 @@ public void Shape_AVPair_HasNegativeKerning() public void Shape_FastOption_StillAppliesKerning() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -217,7 +217,7 @@ public void Shape_FastOption_StillAppliesKerning() public void MeasureText_ReturnsPositiveWidth() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var shaper = new TextShaper(font); // Act @@ -231,7 +231,7 @@ public void MeasureText_ReturnsPositiveWidth() public void MeasureTextInPoints_ReturnsReasonableValue() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var shaper = new TextShaper(font); // Act @@ -246,7 +246,7 @@ public void MeasureTextInPoints_ReturnsReasonableValue() public void MeasureTextInPixels_ScalesWithDpi() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var shaper = new TextShaper(font); // Act @@ -262,7 +262,7 @@ public void MeasureTextInPixels_ScalesWithDpi() public void MeasureText_LargerFontSize_LargerWidth() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var shaper = new TextShaper(font); // Act @@ -282,7 +282,7 @@ public void MeasureText_LargerFontSize_LargerWidth() public void Shape_GlyphsHaveClusterIndices() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -298,7 +298,7 @@ public void Shape_GlyphsHaveClusterIndices() public void Shape_GlyphsHaveCharCount() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -315,7 +315,7 @@ public void Shape_GlyphsHaveCharCount() public void Shape_GlyphsHaveValidIds() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -337,7 +337,7 @@ public void Shape_GlyphsHaveValidIds() public void ShapeLines_SingleLine_ReturnsOneElement() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -352,7 +352,7 @@ public void ShapeLines_SingleLine_ReturnsOneElement() public void ShapeLines_TwoLinesWithLF_ReturnsTwoElements() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var shaper = new TextShaper(font); // Act @@ -368,7 +368,7 @@ public void ShapeLines_TwoLinesWithLF_ReturnsTwoElements() public void ShapeLines_TwoLinesWithCRLF_ReturnsTwoElements() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var shaper = new TextShaper(font); // Act @@ -384,7 +384,7 @@ public void ShapeLines_TwoLinesWithCRLF_ReturnsTwoElements() public void ShapeLines_EmptyLine_PreservesEmptyLine() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var shaper = new TextShaper(font); // Act @@ -401,7 +401,7 @@ public void ShapeLines_EmptyLine_PreservesEmptyLine() public void MeasureLines_SingleLine_MatchesSingleMeasurement() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -417,7 +417,7 @@ public void MeasureLines_SingleLine_MatchesSingleMeasurement() public void MeasureLines_TwoLines_WidthIsMaxOfBoth() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -434,7 +434,7 @@ public void MeasureLines_TwoLines_WidthIsMaxOfBoth() public void MeasureLines_TwoLines_HeightIsDoubleLineHeight() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -454,7 +454,7 @@ public void MeasureLines_TwoLines_HeightIsDoubleLineHeight() public void GetLineHeightInPoints_ReturnsPositiveValue() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -470,7 +470,7 @@ public void GetLineHeightInPoints_ReturnsPositiveValue() public void GetFontHeightInPoints_ReturnsPositiveValue() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -486,7 +486,7 @@ public void GetFontHeightInPoints_ReturnsPositiveValue() public void GetLineHeight_IsGreaterThanFontHeight() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -502,7 +502,7 @@ public void GetLineHeight_IsGreaterThanFontHeight() public void GetLineHeight_ScalesWithFontSize() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -522,7 +522,7 @@ public void GetLineHeight_ScalesWithFontSize() public void ShapedText_GetWidthInPoints_MatchesMeasureText() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -538,7 +538,7 @@ public void ShapedText_GetWidthInPoints_MatchesMeasureText() public void ShapedText_GetWidthInPixels_MatchesMeasureText() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -558,7 +558,7 @@ public void ShapedText_GetWidthInPixels_MatchesMeasureText() public void Shape_OnlySpaces_ReturnsGlyphs() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -573,7 +573,7 @@ public void Shape_OnlySpaces_ReturnsGlyphs() public void Shape_SpecialCharacters_HandlesGracefully() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -588,7 +588,7 @@ public void Shape_SpecialCharacters_HandlesGracefully() public void Shape_Numbers_ReturnsCorrectGlyphs() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -606,7 +606,7 @@ public void Shape_Numbers_ReturnsCorrectGlyphs() public void Shape_FiLigature_CombinesTwoGlyphs() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -622,7 +622,7 @@ public void Shape_FiLigature_CombinesTwoGlyphs() public void Shape_Office_HasFfiLigature() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -637,7 +637,7 @@ public void Shape_Office_HasFfiLigature() public void Shape_Ligature_PreservesClusterIndex() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -656,7 +656,7 @@ public void Shape_Ligature_PreservesClusterIndex() public void Shape_DecomposedUnicode_PositionsAccent() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -685,7 +685,7 @@ public void Shape_DecomposedUnicode_PositionsAccent() public void Shape_PrecomposedVsDecomposed_SimilarWidth() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -709,7 +709,7 @@ public void Shape_PrecomposedVsDecomposed_SimilarWidth() public void Shape_SourceSans3_SingleMark_PositionsCorrectly() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "SourceSans3", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("SourceSans3"); var shaper = new TextShaper(font); // Act - Single combining mark @@ -738,7 +738,7 @@ public void Shape_SourceSans3_SingleMark_PositionsCorrectly() public void Shape_Cafe_HandlesDecomposed() { // Arrange - var font = OpenTypeFonts.GetFontData(FontFolders, "SourceSans3", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("SourceSans3"); var shaper = new TextShaper(font); // Act - "café" with decomposed é @@ -759,7 +759,7 @@ public void Shape_Cafe_HandlesDecomposed() [TestMethod] public void Debug_OpenSans_MarkFeature() { - var font = OpenTypeFonts.GetFontData(FontFolders, "OpenSans", FontSubFamily.Regular); + var font = OpenTypeFonts.LoadFont("OpenSans", FontSubFamily.Regular); foreach (var featureRecord in font.GposTable.FeatureList.FeatureRecords) { @@ -808,7 +808,7 @@ public void Discovery_CheckFontsForSingleAdjustment() { try { - var font = OpenTypeFonts.GetFontData(FontFolders, fontName, subFamily); + var font = OpenTypeFonts.LoadFont(fontName, subFamily); if (font.GposTable == null) { diff --git a/src/EPPlus.Fonts.OpenType.Tests/TextShaping/VerticalTextShapingTests.cs b/src/EPPlus.Fonts.OpenType.Tests/TextShaping/VerticalTextShapingTests.cs index 5a2653445..55ad5d0f4 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/TextShaping/VerticalTextShapingTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/TextShaping/VerticalTextShapingTests.cs @@ -34,7 +34,7 @@ public static void ClassInitialize(TestContext ctx) public void ShapeVertical_CjkText_ReturnsOneGlyphPerCharacter() { // Arrange - BIZ UDGothic has vmtx and is a CJK font - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("BIZ UDGothic"); var shaper = new TextShaper(font); // Act @@ -49,7 +49,7 @@ public void ShapeVertical_CjkText_ReturnsOneGlyphPerCharacter() public void ShapeVertical_CjkText_GlyphsHavePositiveYAdvance() { // Arrange - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("BIZ UDGothic"); var shaper = new TextShaper(font); // Act @@ -67,7 +67,7 @@ public void ShapeVertical_CjkText_GlyphsHavePositiveYAdvance() public void ShapeVertical_CjkText_TotalAdvanceHeightIsPositive() { // Arrange - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("BIZ UDGothic"); var shaper = new TextShaper(font); // Act @@ -82,7 +82,7 @@ public void ShapeVertical_CjkText_TotalAdvanceHeightIsPositive() public void ShapeVertical_EmptyString_ReturnsEmptyGlyphArray() { // Arrange - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("BIZ UDGothic"); var shaper = new TextShaper(font); // Act @@ -98,7 +98,7 @@ public void ShapeVertical_EmptyString_ReturnsEmptyGlyphArray() public void ShapeVertical_ClusterIndexMatchesCharacterPosition() { // Arrange - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("BIZ UDGothic"); var shaper = new TextShaper(font); var text = "ABC"; @@ -122,7 +122,7 @@ public void ShapeVertical_ClusterIndexMatchesCharacterPosition() public void ShapeLightVertical_CjkText_ReturnsOneEntryPerCharacter() { // Arrange - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("BIZ UDGothic"); var shaper = new TextShaper(font); // Act @@ -137,7 +137,7 @@ public void ShapeLightVertical_CjkText_ReturnsOneEntryPerCharacter() public void ShapeLightVertical_CjkText_YAdvanceMatchesShapeVertical() { // Arrange - ShapeLightVertical should produce identical YAdvance values to ShapeVertical - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("BIZ UDGothic"); var shaper = new TextShaper(font); var text = "東京"; @@ -158,7 +158,7 @@ public void ShapeLightVertical_CjkText_YAdvanceMatchesShapeVertical() public void ShapeLightVertical_EmptyString_ReturnsEmptyArray() { // Arrange - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("BIZ UDGothic"); var shaper = new TextShaper(font); // Act @@ -178,7 +178,7 @@ public void ShapeLightVertical_EmptyString_ReturnsEmptyArray() public void ShapeVertical_FontWithoutVmtx_FallsBackToHmtxAdvanceWidth() { // Arrange - Calibri has no vmtx table, fallback to hmtx should kick in - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "Roboto", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); Assert.IsNull(font.VmtxTable, "Roboto should not have a vmtx table"); @@ -200,7 +200,7 @@ public void ShapeVertical_FontWithoutVmtx_FallsBackToHmtxAdvanceWidth() public void ShapeVertical_FontWithoutVmtx_YAdvanceMatchesHmtxAdvanceWidth() { // Arrange - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "Roboto", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); // Act @@ -221,7 +221,7 @@ public void ShapeVertical_FontWithoutVmtx_YAdvanceMatchesHmtxAdvanceWidth() public void ShapeVertical_OriginalTextIsPreserved() { // Arrange - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("BIZ UDGothic"); var shaper = new TextShaper(font); var text = "日本語テスト"; @@ -236,7 +236,7 @@ public void ShapeVertical_OriginalTextIsPreserved() public void ShapeVertical_PrimaryFontGlyphs_HaveFontIdZero() { // Arrange - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("BIZ UDGothic"); var shaper = new TextShaper(font); // Act @@ -258,7 +258,7 @@ public void ShapeVertical_PrimaryFontGlyphs_HaveFontIdZero() public void ShapeVertical_SurrogatePair_ProducesOneGlyphWithCharCountTwo() { // Arrange - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("BIZ UDGothic"); var shaper = new TextShaper(font); // U+20B9F 𠺟 - a CJK unified ideograph extension B character (surrogate pair in UTF-16) @@ -281,7 +281,7 @@ public void ShapeVertical_SurrogatePair_ProducesOneGlyphWithCharCountTwo() public void ShapeLightVertical_SurrogatePair_ProducesOneEntryWithCharCountTwo() { // Arrange - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("BIZ UDGothic"); var shaper = new TextShaper(font); var text = "\uD842\uDF9F"; @@ -303,7 +303,7 @@ public void ShapeLightVertical_SurrogatePair_ProducesOneEntryWithCharCountTwo() public void ShapeVertical_CjkText_GlyphsHavePositiveAdvanceWidth() { // Arrange - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("BIZ UDGothic"); var shaper = new TextShaper(font); // Act @@ -322,7 +322,7 @@ public void ShapeVertical_AdvanceWidthMatchesHmtxAdvanceWidth() { // Arrange - AdvanceWidth on VerticalShapedGlyph must equal hmtx advanceWidth // since centering calculations depend on this value being accurate - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "BIZ UDGothic", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("BIZ UDGothic"); var shaper = new TextShaper(font); // Act @@ -343,7 +343,7 @@ public void ShapeVertical_FontWithoutVmtx_AdvanceWidthMatchesHmtxAdvanceWidth() { // Arrange - Roboto has no vmtx table, both YAdvance and AdvanceWidth // should fall back to hmtx and be equal to each other - var font = OpenTypeFonts.GetFontDataOpen(FontFolders, "Roboto", FontSubFamily.Regular, true); + var font = OpenTypeFonts.LoadFont("Roboto"); var shaper = new TextShaper(font); Assert.IsNull(font.VmtxTable, "Roboto should not have a vmtx table"); diff --git a/src/EPPlus.Fonts.OpenType.Tests/Validation/CmapTableValidationTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Validation/CmapTableValidationTests.cs index 356024472..f0c3dbd0e 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Validation/CmapTableValidationTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Validation/CmapTableValidationTests.cs @@ -22,7 +22,7 @@ public static void Initialize(TestContext testContext) [TestMethod] public void CmapTableValidation_Test() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false, true); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var validator = new CmapTableValidator(); var context = new FontValidationContext(font); var result = validator.Validate(font.CmapTable, context); diff --git a/src/EPPlus.Fonts.OpenType.Tests/Validation/CoreTableValidationTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Validation/CoreTableValidationTests.cs index b719992fc..ccb198bab 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Validation/CoreTableValidationTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Validation/CoreTableValidationTests.cs @@ -21,7 +21,7 @@ public class CoreTableValidationTests : FontTestBase [TestMethod] public void HeadTable_Validation_ShouldPass() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false, true); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var validator = new HeadTableValidator(); var context = new FontValidationContext(font); var result = validator.Validate(font.HeadTable, context); @@ -32,7 +32,7 @@ public void HeadTable_Validation_ShouldPass() [TestMethod] public void MaxpTable_Validation_ShouldPass() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false, true); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var validator = new MaxpTableValidator(); var context = new FontValidationContext(font); var result = validator.Validate(font.MaxpTable, context); @@ -42,7 +42,7 @@ public void MaxpTable_Validation_ShouldPass() [TestMethod] public void HheaTable_Validation_ShouldPass() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false, true); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var validator = new HheaTableValidator(); var context = new FontValidationContext(font); var result = validator.Validate(font.HheaTable, context); @@ -52,7 +52,7 @@ public void HheaTable_Validation_ShouldPass() [TestMethod] public void NameTable_Validation_ShouldPass() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false, true); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var validator = new NameTableValidator(); var context = new FontValidationContext(font); var result = validator.Validate(font.NameTable, context); @@ -62,7 +62,7 @@ public void NameTable_Validation_ShouldPass() [TestMethod] public void Os2Table_Validation_ShouldPass() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false, true); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var validator = new Os2TableValidator(); var context = new FontValidationContext(font); var result = validator.Validate(font.Os2Table, context); @@ -72,7 +72,7 @@ public void Os2Table_Validation_ShouldPass() [TestMethod] public void PostTable_Validation_ShouldPass() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false, true); + var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular); var validator = new PostTableValidator(); var context = new FontValidationContext(font); var result = validator.Validate(font.PostTable, context); diff --git a/src/EPPlus.Fonts.OpenType.Tests/Validation/EntireFontValidationTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Validation/EntireFontValidationTests.cs index 6b7d7d8d6..9b2ed9a09 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Validation/EntireFontValidationTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Validation/EntireFontValidationTests.cs @@ -11,7 +11,7 @@ public class EntireFontValidationTests : FontTestBase [TestMethod] public void ValidateEntireFont() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false, true); + var font = OpenTypeFonts.LoadFont("Roboto"); var report = font.ValidateFont(FontValidationSeverity.Error); Assert.IsTrue(report.IsValid); } diff --git a/src/EPPlus.Fonts.OpenType.Tests/Validation/GlyphTableValidationTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Validation/GlyphTableValidationTests.cs index 23bcbb64c..2a5ac3ee3 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Validation/GlyphTableValidationTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Validation/GlyphTableValidationTests.cs @@ -18,7 +18,7 @@ public class GlyphTableValidationTests : FontTestBase [TestMethod] public void LocaTableValidation_Test() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false, true); + var font = OpenTypeFonts.LoadFont("Roboto"); var validator = new LocaTableValidator(); var context = new FontValidationContext(font); var result = validator.Validate(font.LocaTable, context); @@ -28,7 +28,7 @@ public void LocaTableValidation_Test() [TestMethod] public void HmtxTableValidation_Test() { - var font = OpenTypeFonts.GetFontData(FontFolders, "Roboto", FontSubFamily.Regular, false, true); + var font = OpenTypeFonts.LoadFont("Roboto"); var validator = new HmtxTableValidator(); var context = new FontValidationContext(font); var result = validator.Validate(font.HmtxTable, context); @@ -42,7 +42,7 @@ public void HmtxTableValidation_Test() [DataRow("Mulish", FontSubFamily.Regular)] public void GlyfTableValidation_Test(string fontName, FontSubFamily subFamily) { - var font = OpenTypeFonts.GetFontData(FontFolders, fontName, subFamily, false, true); + var font = OpenTypeFonts.LoadFont(fontName, subFamily); var validator = new GlyfTableValidator(); var context = new FontValidationContext(font); var result = validator.Validate(font.GlyfTable, context); diff --git a/src/EPPlus.Fonts.OpenType.Tests/Validation/GsubTableValidationTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Validation/GsubTableValidationTests.cs index bfe6c285a..4c37fee53 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Validation/GsubTableValidationTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Validation/GsubTableValidationTests.cs @@ -16,7 +16,7 @@ public class GsubTableValidationTests : FontTestBase [DataRow("NotoEmoji")] public void GsubTableValidation_Test(string fontName) { - var font = OpenTypeFonts.GetFontData(FontFolders, fontName, FontSubFamily.Regular, false, true); + var font = OpenTypeFonts.LoadFont(fontName); var validator = new GsubTableValidator(); var context = new FontValidationContext(font); var result = validator.Validate(font.GsubTable, context); diff --git a/src/EPPlus.Fonts.OpenType/EmbeddedFonts.cs b/src/EPPlus.Fonts.OpenType/EmbeddedFonts.cs index ac9dc5b29..6da3aee52 100644 --- a/src/EPPlus.Fonts.OpenType/EmbeddedFonts.cs +++ b/src/EPPlus.Fonts.OpenType/EmbeddedFonts.cs @@ -50,7 +50,7 @@ private static OpenTypeFont LoadCached(string resourceName) "This is a bug in EPPlus.Fonts.OpenType - please report it."); } - font = OpenTypeFonts.GetFromBytes(bytes: ReadStreamFully(stream), FontFormat.Ttf); + font = OpenTypeFonts.GetFromBytes(bytes: ReadStreamFully(stream)); _cache[resourceName] = font; return font; } diff --git a/src/EPPlus.Fonts.OpenType/FontCache/OpenTypeFontCache.cs b/src/EPPlus.Fonts.OpenType/FontCache/OpenTypeFontCache.cs index a6343243a..878d2819c 100644 --- a/src/EPPlus.Fonts.OpenType/FontCache/OpenTypeFontCache.cs +++ b/src/EPPlus.Fonts.OpenType/FontCache/OpenTypeFontCache.cs @@ -1,4 +1,17 @@ -using System; +/************************************************************************************************* + Required Notice: Copyright (C) EPPlus Software AB. + This software is licensed under PolyForm Noncommercial License 1.0.0 + and may only be used for noncommercial purposes + https://polyformproject.org/licenses/noncommercial/1.0.0/ + + A commercial license to use this software can be purchased at https://epplussoftware.com + ************************************************************************************************* + Date Author Change + ************************************************************************************************* + 10/07/2025 EPPlus Software AB EPPlus.Fonts.OpenType 1.0 + 02/26/2026 EPPlus Software AB Added overloads accepting prebuilt cache keys + *************************************************************************************************/ +using System; using System.Collections.Generic; using System.Threading; @@ -18,30 +31,14 @@ internal static void Clear() } } - /// - /// Builds a cache key from family name and subfamily. - /// THE SUBFAMILY ENUM SHOULD ALWAYS BE INPUT PARAMETER. - /// Fonts can name themselves however they want, but we map other values in the font to the subfamily. - /// Therefore never change it to e.g. a string input-parameter - /// and never use e.g. font.GetEnglishSubfamily name as this could create mismatches. - /// - /// Font family name - /// MUST STAY as FontSubFamily enum - /// Cache key string - static string BuildCacheKey(string familyName, FontSubFamily subFamily) - { - return string.Format("{0}-{1}", familyName, subFamily.ToString()); - } - /// /// Checks if a font is present in the cache (loaded or loading). /// - public static bool Contains(string familyName, FontSubFamily subFamily) + public static bool Contains(string cacheKey) { - var key = BuildCacheKey(familyName, subFamily); lock (_syncRoot) { - return _cache.ContainsKey(key); + return _cache.ContainsKey(cacheKey); } } @@ -49,14 +46,13 @@ public static bool Contains(string familyName, FontSubFamily subFamily) /// Creates a placeholder entry to indicate that font loading has begun. /// This prevents multiple threads from starting to load the same font. /// - public static void BeginCache(string familyName, FontSubFamily subFamily) + public static void BeginCache(string cacheKey) { lock (_syncRoot) { - var key = BuildCacheKey(familyName, subFamily); - if (!_cache.ContainsKey(key)) + if (!_cache.ContainsKey(cacheKey)) { - _cache[key] = new CachedOpenTypeFont() + _cache[cacheKey] = new CachedOpenTypeFont() { IsLoaded = false, Font = null @@ -66,24 +62,21 @@ public static void BeginCache(string familyName, FontSubFamily subFamily) } /// - /// Adds or updates a fully loaded font in the cache. + /// Adds or updates a fully loaded font using a prebuilt cache key. /// Signals all waiting threads that the font is now available. /// - public static void AddToCache(OpenTypeFont font, string familyName, FontSubFamily subFamily) + public static void AddToCache(OpenTypeFont font, string cacheKey) { lock (_syncRoot) { - var key = BuildCacheKey(familyName, subFamily); - - // Update existing entry OR create new one - if (_cache.ContainsKey(key)) + if (_cache.ContainsKey(cacheKey)) { - _cache[key].Font = font; - _cache[key].IsLoaded = true; + _cache[cacheKey].Font = font; + _cache[cacheKey].IsLoaded = true; } else { - _cache[key] = new CachedOpenTypeFont + _cache[cacheKey] = new CachedOpenTypeFont { Font = font, IsLoaded = true @@ -96,24 +89,19 @@ public static void AddToCache(OpenTypeFont font, string familyName, FontSubFamil } /// - /// Retrieves a font from cache, waiting if it's currently being loaded by another thread. + /// Retrieves a font from cache using a prebuilt cache key. + /// Waits if the font is currently being loaded by another thread. /// Returns null if font is not in cache or if timeout occurs while waiting. /// - /// Font family name - /// Font subfamily - /// Cached font entry or null if not available - public static CachedOpenTypeFont GetFromCache(string familyName, FontSubFamily subFamily) + public static CachedOpenTypeFont GetFromCache(string cacheKey) { - var key = BuildCacheKey(familyName, subFamily); lock (_syncRoot) { - if (_cache.TryGetValue(key, out var cached)) + if (_cache.TryGetValue(cacheKey, out var cached)) { // If already loaded, return immediately if (cached.IsLoaded && cached.Font != null) - { return cached; - } // Wait for another thread to finish loading var timeout = TimeSpan.FromSeconds(2); @@ -123,22 +111,16 @@ public static CachedOpenTypeFont GetFromCache(string familyName, FontSubFamily s { // CRITICAL: Retrieve from dictionary again after Wait()! // The 'cached' reference may be stale after another thread updates the cache - if (_cache.TryGetValue(key, out cached) && cached.IsLoaded && cached.Font != null) - { + if (_cache.TryGetValue(cacheKey, out cached) && cached.IsLoaded && cached.Font != null) return cached; - } - // Wait and release lock temporarily Monitor.Wait(_syncRoot, TimeSpan.FromMilliseconds(50)); } - // Timeout occurred - one final check - if (_cache.TryGetValue(key, out cached) && cached.IsLoaded && cached.Font != null) - { + // One final check after timeout + if (_cache.TryGetValue(cacheKey, out cached) && cached.IsLoaded && cached.Font != null) return cached; - } - // Timeout without result return null; } return null; diff --git a/src/EPPlus.Fonts.OpenType/FontResolver/DefaultFontLocations.cs b/src/EPPlus.Fonts.OpenType/FontResolver/DefaultFontLocations.cs new file mode 100644 index 000000000..636744881 --- /dev/null +++ b/src/EPPlus.Fonts.OpenType/FontResolver/DefaultFontLocations.cs @@ -0,0 +1,83 @@ +/************************************************************************************************* + Required Notice: Copyright (C) EPPlus Software AB. + This software is licensed under PolyForm Noncommercial License 1.0.0 + and may only be used for noncommercial purposes + https://polyformproject.org/licenses/noncommercial/1.0.0/ + + A commercial license to use this software can be purchased at https://epplussoftware.com + ************************************************************************************************* + Date Author Change + ************************************************************************************************* + 10/07/2025 EPPlus Software AB EPPlus.Fonts.OpenType 1.0 + *************************************************************************************************/ +using EPPlus.Fonts.OpenType.Utils.Platform; +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Text; + +namespace EPPlus.Fonts.OpenType.FontResolver +{ + internal static class DefaultFontLocations + { + private static string GetWindowsFolder() + { + var winfolder = @"c:\Windows"; +#if !NET35 + var wf = Environment.GetFolderPath(Environment.SpecialFolder.Windows); + if (!string.IsNullOrEmpty(wf) && Directory.Exists(wf)) return wf; +#endif + var ewf = Environment.GetEnvironmentVariable("WINDIR"); + if (!string.IsNullOrEmpty(ewf) && Directory.Exists(ewf)) + { + winfolder = ewf; + } + return winfolder; + } + + internal static readonly List winFontLocations = new List() + { + Path.Combine(GetWindowsFolder(), "Fonts"), + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Microsoft\\Windows\\Fonts"), + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Microsoft\\Windows\\Fonts"), + Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Microsoft\\FontCache"), + }; + + internal static readonly List linFontLocations = new List() + { + "/usr/share/fonts", + "/usr/local/share/fonts", + "/usr/share/X11/fonts", + Path.Combine(Environment.GetEnvironmentVariable("HOME") ?? "~", ".fonts"), + Path.Combine(Path.Combine(Path.Combine(Environment.GetEnvironmentVariable("HOME") ?? "~", ".local"), "share"), "fonts"), + }; + + internal static readonly List macFontLocations = new List() + { + "/System/Library/Fonts", + "/Library/Fonts", + "/Network/Library/Fonts", + Path.Combine(Path.Combine(Environment.GetEnvironmentVariable("HOME") ?? "~", "Library"), "Fonts"), + }; + + internal static List GetLocationsCollection(IEnumerable fontDirectories, bool searchSystemDirectories = true) + { + var fontLocations = new List(); + fontLocations.AddRange(fontDirectories ?? Enumerable.Empty()); + + if (searchSystemDirectories) + { + var platform = PlatformUtils.GetPlatform(); + if (platform == PlatformUtils.OperatingSystem.Windows) + fontLocations.AddRange(winFontLocations); + else if (platform == PlatformUtils.OperatingSystem.Mac) + fontLocations.AddRange(macFontLocations); + else + fontLocations.AddRange(linFontLocations); + } + + return fontLocations; + } + } +} diff --git a/src/EPPlus.Fonts.OpenType/FontResolver/DefaultFontResolver.cs b/src/EPPlus.Fonts.OpenType/FontResolver/DefaultFontResolver.cs new file mode 100644 index 000000000..ab6a31287 --- /dev/null +++ b/src/EPPlus.Fonts.OpenType/FontResolver/DefaultFontResolver.cs @@ -0,0 +1,76 @@ +/************************************************************************************************* + Required Notice: Copyright (C) EPPlus Software AB. + This software is licensed under PolyForm Noncommercial License 1.0.0 + and may only be used for noncommercial purposes + https://polyformproject.org/licenses/noncommercial/1.0.0/ + + A commercial license to use this software can be purchased at https://epplussoftware.com + ************************************************************************************************* + Date Author Change + ************************************************************************************************* + 10/07/2025 EPPlus Software AB EPPlus.Fonts.OpenType 1.0 + 02/26/2026 EPPlus Software AB Removed caching (moved to OpenTypeFonts) + *************************************************************************************************/ +using EPPlus.Fonts.OpenType.Scanner; +using System.Collections.Generic; +using System.IO; +using System.Linq; + +namespace EPPlus.Fonts.OpenType.FontResolver +{ + /// + /// Default IFontResolver implementation that resolves fonts from the file system. + /// Searches additional font directories and optionally system font directories. + /// Supports fallback font chains via FontResolutionConfig. + /// + internal class DefaultFontResolver : IFontResolver + { + private readonly IEnumerable _fontDirectories; + private readonly bool _searchSystemDirectories; + private readonly FontResolutionConfig _config; + + public DefaultFontResolver( + IEnumerable fontDirectories = null, + bool searchSystemDirectories = true, + FontResolutionConfig config = null) + { + _fontDirectories = fontDirectories ?? Enumerable.Empty(); + _searchSystemDirectories = searchSystemDirectories; + _config = config; + } + + public byte[] ResolveFont(string fontName, FontSubFamily subFamily) + { + // Try exact match first + var face = FontScannerV2.FindBestMatch( + _fontDirectories, fontName, subFamily, _searchSystemDirectories); + + if (face != null && face.IsExactMatch) + return ReadFontBytes(face.FilePath); + + // No exact match — try fallback chain + if (_config != null) + { + var fallbacks = _config.GetFallbacks(fontName); + if (fallbacks != null) + { + foreach (var fallbackName in fallbacks) + { + var fallbackFace = FontScannerV2.FindBestMatch( + _fontDirectories, fallbackName, subFamily, _searchSystemDirectories); + + if (fallbackFace != null && fallbackFace.IsExactMatch) + return ReadFontBytes(fallbackFace.FilePath); + } + } + } + + return null; + } + + private static byte[] ReadFontBytes(string filePath) + { + return File.ReadAllBytes(filePath); + } + } +} \ No newline at end of file diff --git a/src/EPPlus.Fonts.OpenType/FontResolver/FontsResolutionConfig.cs b/src/EPPlus.Fonts.OpenType/FontResolver/FontsResolutionConfig.cs new file mode 100644 index 000000000..4daf79488 --- /dev/null +++ b/src/EPPlus.Fonts.OpenType/FontResolver/FontsResolutionConfig.cs @@ -0,0 +1,40 @@ +/************************************************************************************************* + Required Notice: Copyright (C) EPPlus Software AB. + This software is licensed under PolyForm Noncommercial License 1.0.0 + and may only be used for noncommercial purposes + https://polyformproject.org/licenses/noncommercial/1.0.0/ + + A commercial license to use this software can be purchased at https://epplussoftware.com + ************************************************************************************************* + Date Author Change + ************************************************************************************************* + 10/07/2025 EPPlus Software AB EPPlus.Fonts.OpenType 1.0 + *************************************************************************************************/ +using System; +using System.Collections.Generic; + +namespace EPPlus.Fonts.OpenType.FontResolver +{ + public class FontResolutionConfig + { + private readonly Dictionary _fallbacks = + new Dictionary(StringComparer.OrdinalIgnoreCase); + + public FontResolutionConfig AddFallback(string primaryFont, params string[] fallbacks) + { + if (string.IsNullOrEmpty(primaryFont)) + throw new ArgumentNullException("primaryFont"); + if (fallbacks == null || fallbacks.Length == 0) + throw new ArgumentException("At least one fallback must be specified", "fallbacks"); + + _fallbacks[primaryFont] = fallbacks; + return this; + } + + internal string[] GetFallbacks(string fontName) + { + string[] result; + return _fallbacks.TryGetValue(fontName, out result) ? result : null; + } + } +} diff --git a/src/EPPlus.Fonts.OpenType/FontResolver/IFontResolver.cs b/src/EPPlus.Fonts.OpenType/FontResolver/IFontResolver.cs new file mode 100644 index 000000000..9a15757f6 --- /dev/null +++ b/src/EPPlus.Fonts.OpenType/FontResolver/IFontResolver.cs @@ -0,0 +1,31 @@ +/************************************************************************************************* + Required Notice: Copyright (C) EPPlus Software AB. + This software is licensed under PolyForm Noncommercial License 1.0.0 + and may only be used for noncommercial purposes + https://polyformproject.org/licenses/noncommercial/1.0.0/ + + A commercial license to use this software can be purchased at https://epplussoftware.com + ************************************************************************************************* + Date Author Change + ************************************************************************************************* + 10/07/2025 EPPlus Software AB EPPlus.Fonts.OpenType 1.0 + 02/26/2026 EPPlus Software AB Simplified to return raw font bytes + *************************************************************************************************/ +namespace EPPlus.Fonts.OpenType.FontResolver +{ + /// + /// Resolves a font by name and subfamily to raw font bytes. + /// Implement this interface to provide fonts from any source (file system, database, embedded resources, etc.). + /// Font format (TTF/OTF) is detected automatically from the returned bytes. + /// + public interface IFontResolver + { + /// + /// Resolves a font to its raw bytes. + /// + /// Font family name (e.g. "Roboto") + /// Font subfamily (Regular, Bold, Italic, etc.) + /// Raw font bytes, or null if the font could not be found + byte[] ResolveFont(string fontName, FontSubFamily subFamily); + } +} \ No newline at end of file diff --git a/src/EPPlus.Fonts.OpenType/FontSubFamily.cs b/src/EPPlus.Fonts.OpenType/FontSubFamily.cs new file mode 100644 index 000000000..de5e6f8cb --- /dev/null +++ b/src/EPPlus.Fonts.OpenType/FontSubFamily.cs @@ -0,0 +1,22 @@ +/************************************************************************************************* + Required Notice: Copyright (C) EPPlus Software AB. + This software is licensed under PolyForm Noncommercial License 1.0.0 + and may only be used for noncommercial purposes + https://polyformproject.org/licenses/noncommercial/1.0.0/ + + A commercial license to use this software can be purchased at https://epplussoftware.com + ************************************************************************************************* + Date Author Change + ************************************************************************************************* + 01/15/2025 EPPlus Software AB Initial implementation + *************************************************************************************************/ +namespace EPPlus.Fonts.OpenType +{ + public enum FontSubFamily + { + Regular, + Bold, + Italic, + BoldItalic + } +} diff --git a/src/EPPlus.Fonts.OpenType/Integration/TextLayoutEngine.cs b/src/EPPlus.Fonts.OpenType/Integration/TextLayoutEngine.cs index cd799dc75..322a25a54 100644 --- a/src/EPPlus.Fonts.OpenType/Integration/TextLayoutEngine.cs +++ b/src/EPPlus.Fonts.OpenType/Integration/TextLayoutEngine.cs @@ -219,10 +219,10 @@ private ITextShaper GetShaperForFont(MeasurementFont font) return cachedShaper; } - var openTypeFont = OpenTypeFonts.GetFontData( - fontDirectories: _fontDirectories, + var openTypeFont = OpenTypeFonts.LoadFont( fontName: font.FontFamily, subFamily: GetFontSubFamily(font.Style), + fontDirectories: _fontDirectories, searchSystemDirectories: _searchSystemDirectories ); diff --git a/src/EPPlus.Fonts.OpenType/OpenTypeFont.cs b/src/EPPlus.Fonts.OpenType/OpenTypeFont.cs index ca939ec36..6fdb0e651 100644 --- a/src/EPPlus.Fonts.OpenType/OpenTypeFont.cs +++ b/src/EPPlus.Fonts.OpenType/OpenTypeFont.cs @@ -62,14 +62,18 @@ internal OpenTypeFont(FontFormat format, bool isSubset = false) } - internal OpenTypeFont(byte[] fontBytes, FontFormat format) - : this(fontBytes, -1, format) + internal OpenTypeFont(byte[] fontBytes) + : this(fontBytes, -1) { } - internal OpenTypeFont(byte[] fontBytes, long startOffset, FontFormat format) + internal OpenTypeFont(byte[] fontBytes, long startOffset) { - Format = format; + if (fontBytes == null || fontBytes.Length < 4) + throw new ArgumentException("Invalid font data: too short to contain a valid SFNT header.", nameof(fontBytes)); + + Format = DetectFormat(fontBytes, startOffset > -1 ? startOffset : 0); + _fontBytes = fontBytes; var tableReaderFactory = new FontTableReaderFactory(fontBytes); using var reader = tableReaderFactory.CreateReader(startOffset); @@ -122,6 +126,40 @@ internal OpenTypeFont(byte[] fontBytes, long startOffset, FontFormat format) : null; } + /// + /// Detects the font format from the SFNT version field in the header. + /// + /// Raw font bytes + /// Offset to the start of the SFNT header + /// Detected FontFormat + /// Thrown if the header contains an unrecognized SFNT version + private static FontFormat DetectFormat(byte[] fontBytes, long offset) + { + // sfntVersion is a big-endian UInt32 at the start of the SFNT header + uint sfntVersion = + ((uint)fontBytes[offset + 0] << 24) | + ((uint)fontBytes[offset + 1] << 16) | + ((uint)fontBytes[offset + 2] << 8) | + ((uint)fontBytes[offset + 3]); + + switch (sfntVersion) + { + case 0x00010000: // TrueType + case 0x74727565: // 'true' — Apple TrueType + return FontFormat.Ttf; + + case 0x4F54544F: // 'OTTO' — OpenType/CFF + case 0x74797031: // 'typ1' — PostScript Type 1 + return FontFormat.Otf; + + default: + throw new ArgumentException( + $"Unrecognized SFNT version 0x{sfntVersion:X8}. " + + "The data does not appear to be a valid TTF or OTF font.", + "fontBytes"); + } + } + Os2TableLoader _os2TableLoader; NameTableLoader _nameTableLoader; HheaTableLoader _hheaTableLoader; diff --git a/src/EPPlus.Fonts.OpenType/OpenTypeFontFactory.cs b/src/EPPlus.Fonts.OpenType/OpenTypeFontFactory.cs index 85524b03e..ff1668b69 100644 --- a/src/EPPlus.Fonts.OpenType/OpenTypeFontFactory.cs +++ b/src/EPPlus.Fonts.OpenType/OpenTypeFontFactory.cs @@ -25,20 +25,20 @@ public static OpenTypeFont CreateFromFace(FontFaceInfo face) { // Pass the start offset to the constructor // This tells OpenTypeFont where this font's table directory starts - return new OpenTypeFont(fontData, face.OffsetInFile, FontFormat.Ttf); + return new OpenTypeFont(fontData, face.OffsetInFile); } else // Regular TTF/OTF { var format = Path.GetExtension(face.FilePath).ToLowerInvariant() == ".otf" ? FontFormat.Otf : FontFormat.Ttf; - return new OpenTypeFont(fontData, format); + return new OpenTypeFont(fontData); } } - public static OpenTypeFont CreateFromBytes(byte[] bytes, FontFormat format) + public static OpenTypeFont CreateFromBytes(byte[] bytes) { - return new OpenTypeFont(bytes, format); + return new OpenTypeFont(bytes); } } } \ No newline at end of file diff --git a/src/EPPlus.Fonts.OpenType/OpenTypeFonts.cs b/src/EPPlus.Fonts.OpenType/OpenTypeFonts.cs index af07d45dd..741a16445 100644 --- a/src/EPPlus.Fonts.OpenType/OpenTypeFonts.cs +++ b/src/EPPlus.Fonts.OpenType/OpenTypeFonts.cs @@ -11,15 +11,13 @@ Date Author Change 10/07/2025 EPPlus Software AB EPPlus.Fonts.OpenType 1.0 01/10/2026 EPPlus Software AB Fix threading issue with global lock 01/23/2026 EPPlus Software AB Improved thread-safety with per-font locking + 02/26/2026 EPPlus Software AB Moved caching from DefaultFontResolver to here *************************************************************************************************/ using EPPlus.Fonts.OpenType.FontCache; +using EPPlus.Fonts.OpenType.FontResolver; using EPPlus.Fonts.OpenType.Scanner; -using EPPlus.Fonts.OpenType.Tables; -using EPPlus.Fonts.OpenType.Tables.Cmap; -using EPPlus.Fonts.OpenType.Utils.Platform; using System; using System.Collections.Generic; -using System.Diagnostics; using System.IO; using System.Linq; @@ -29,70 +27,18 @@ public static class OpenTypeFonts { private static readonly object _syncRoot = new object(); private static readonly Dictionary _fontLocks = new Dictionary(); + private static volatile IFontResolver _fontResolver = new DefaultFontResolver(); - #region --- Platform-specific font locations --- - - private static string GetWindowsFolder() + public static void Configure(IFontResolver resolver) { - var winfolder = @"c:\Windows"; -#if !NET35 - var wf = Environment.GetFolderPath(Environment.SpecialFolder.Windows); - if (!string.IsNullOrEmpty(wf) && Directory.Exists(wf)) return wf; -#endif - var ewf = Environment.GetEnvironmentVariable("WINDIR"); - if (!string.IsNullOrEmpty(ewf) && Directory.Exists(ewf)) - { - winfolder = ewf; - } - return winfolder; + _fontResolver = resolver ?? throw new ArgumentNullException("resolver"); } - internal static readonly List winFontLocations = new List() - { - Path.Combine(GetWindowsFolder(), "Fonts"), - Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Microsoft\\Windows\\Fonts"), - Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Microsoft\\Windows\\Fonts"), - Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Microsoft\\FontCache"), - }; - - internal static readonly List linFontLocations = new List() - { - "/usr/share/fonts", - "/usr/local/share/fonts", - "/usr/share/X11/fonts", - Path.Combine(Environment.GetEnvironmentVariable("HOME") ?? "~", ".fonts"), - Path.Combine(Path.Combine(Path.Combine(Environment.GetEnvironmentVariable("HOME") ?? "~", ".local"), "share"), "fonts"), - }; - - internal static readonly List macFontLocations = new List() - { - "/System/Library/Fonts", - "/Library/Fonts", - "/Network/Library/Fonts", - Path.Combine(Path.Combine(Environment.GetEnvironmentVariable("HOME") ?? "~", "Library"), "Fonts"), - }; - - internal static List GetLocationsCollection(IEnumerable fontDirectories, bool searchSystemDirectories = true) + public static void Configure(FontResolutionConfig config) { - var fontLocations = new List(); - fontLocations.AddRange(fontDirectories ?? Enumerable.Empty()); - - if (searchSystemDirectories) - { - var platform = PlatformUtils.GetPlatform(); - if (platform == PlatformUtils.OperatingSystem.Windows) - fontLocations.AddRange(winFontLocations); - else if (platform == PlatformUtils.OperatingSystem.Mac) - fontLocations.AddRange(macFontLocations); - else - fontLocations.AddRange(linFontLocations); - } - - return fontLocations; + _fontResolver = new DefaultFontResolver(config: config); } - #endregion - /// /// Clears all cached fonts and font locks. /// Thread-safe operation. @@ -108,29 +54,35 @@ public static void ClearFontCache() } /// - /// Returns a fully loaded OpenTypeFont with thread-safe caching. - /// Uses per-font locking to ensure only one thread loads each unique font. - /// Uses FontScannerV2 under the hood. + /// Loads a font by name and subfamily, with thread-safe caching. + /// When fontDirectories or searchSystemDirectories are specified, they take precedence + /// over the globally configured resolver for this call only — thread-safe. /// - /// Additional directories to search for fonts /// Font family name /// Font subfamily (Regular, Bold, Italic, etc.) + /// Additional directories to search. If null, uses globally configured resolver. /// Whether to search system font directories /// If true, bypasses cache and loads font directly /// Loaded OpenTypeFont or null if not found - public static OpenTypeFont GetFontDataOpen( - IEnumerable fontDirectories, + public static OpenTypeFont LoadFont( string fontName, FontSubFamily subFamily = FontSubFamily.Regular, + IEnumerable fontDirectories = null, bool searchSystemDirectories = true, bool ignoreCache = false) { - // Create or retrieve per-font lock key - // This ensures different fonts can be loaded in parallel, - // but the same font is only loaded once even if requested by multiple threads - string lockKey = string.Format("{0}_{1}", fontName, subFamily); - object fontLock; + // If caller specifies directories, use a local resolver for this call only. + // This is thread-safe since the resolver is a local variable. + var resolver = fontDirectories != null + ? new DefaultFontResolver(fontDirectories, searchSystemDirectories) + : _fontResolver; + + if (ignoreCache) + return ResolveAndCreate(resolver, fontName, subFamily); + // Cache key includes directories to avoid collisions between different resolver configs + string lockKey = BuildCacheKey(fontName, subFamily, fontDirectories, searchSystemDirectories); + object fontLock; lock (_syncRoot) { if (!_fontLocks.TryGetValue(lockKey, out fontLock)) @@ -140,61 +92,56 @@ public static OpenTypeFont GetFontDataOpen( } } - // Lock PER FONT, not globally - // This allows parallel loading of different fonts lock (fontLock) { - // Check cache inside the font-specific lock - // This ensures we don't load the same font twice - if (!ignoreCache) + var cached = OpenTypeFontCache.GetFromCache(lockKey); + if (cached != null && cached.Font != null && cached.IsLoaded) { - var cached = OpenTypeFontCache.GetFromCache(fontName, subFamily); - if (cached != null && cached.Font != null && cached.IsLoaded) - { - cached.Font.EnsureFullyLoaded(); - return cached.Font; - } + cached.Font.EnsureFullyLoaded(); + return cached.Font; } - // Mark as loading to prevent other threads from starting to load - // (they will wait in GetFromCache instead) - if (!ignoreCache) - { - OpenTypeFontCache.BeginCache(fontName, subFamily); - } + OpenTypeFontCache.BeginCache(lockKey); - // Find the font face - var face = FontScannerV2.FindBestMatch(fontDirectories, fontName, subFamily, searchSystemDirectories); - if (face == null) + var font = ResolveAndCreate(resolver, fontName, subFamily); + if (font == null) return null; - // Load the font from file - var font = OpenTypeFontFactory.CreateFromFace(face); font.EnsureFullyLoaded(); - - // Add to cache and signal waiting threads - if (!ignoreCache) - { - font.IsReadOnly = true; - OpenTypeFontCache.AddToCache(font, fontName, subFamily); - } - + font.IsReadOnly = true; + OpenTypeFontCache.AddToCache(font, lockKey); return font; } } /// - /// Legacy wrapper – kept for backward compatibility. - /// Calls GetFontDataOpen internally. + /// Builds a cache key that uniquely identifies a font + resolution config combination. /// - public static OpenTypeFont GetFontData( - IEnumerable fontDirectories, + internal static string BuildCacheKey( string fontName, - FontSubFamily subFamily = FontSubFamily.Regular, - bool searchSystemDirectories = true, - bool ignoreCache = false) + FontSubFamily subFamily, + IEnumerable fontDirectories, + bool searchSystemDirectories) + { + if (fontDirectories == null) + return string.Format("{0}_{1}", fontName, subFamily); + + // Include directories in key to avoid collisions + var dirs = string.Join("|", fontDirectories?.ToArray() ?? new string[] {""}); + return string.Format("{0}_{1}_{2}_{3}", fontName, subFamily, dirs, searchSystemDirectories); + } + + /// + /// Resolves font bytes via the given resolver and creates an OpenTypeFont instance. + /// Font format (TTF/OTF) is detected automatically from the SFNT header. + /// + private static OpenTypeFont ResolveAndCreate(IFontResolver resolver, string fontName, FontSubFamily subFamily) { - return GetFontDataOpen(fontDirectories, fontName, subFamily, searchSystemDirectories, ignoreCache); + var bytes = resolver.ResolveFont(fontName, subFamily); + if (bytes == null) + return null; + + return new OpenTypeFont(bytes); } /// @@ -202,16 +149,12 @@ public static OpenTypeFont GetFontData( /// Skips corrupt or unreadable fonts, but logs detailed information for diagnostics. /// This method is NOT cached and may take significant time to complete. /// - /// Additional directories to search - /// Whether to search system font directories - /// Optional filter for font format (TrueType or OpenType/CFF) - /// List of successfully loaded fonts public static List GetAllBaseFontData( List fontDirectories, bool searchSystemDirectories = true, FontFormat? formatTarget = null) { - var locations = GetLocationsCollection(fontDirectories, searchSystemDirectories); + var locations = DefaultFontLocations.GetLocationsCollection(fontDirectories, searchSystemDirectories); var faces = FontScannerV2.EnumerateAllFaces(locations); var result = new List(faces.Count); @@ -219,7 +162,6 @@ public static List GetAllBaseFontData( foreach (var face in faces) { - // Filter by format if requested if (formatTarget.HasValue) { string ext = Path.GetExtension(face.FilePath); @@ -234,15 +176,11 @@ public static List GetAllBaseFontData( try { - OpenTypeFont font = OpenTypeFontFactory.CreateFromFace(face); + var font = OpenTypeFontFactory.CreateFromFace(face); if (font != null) - { result.Add(font); - } else - { failures++; - } } catch (Exception ex) when ( ex is IOException || @@ -252,12 +190,10 @@ ex is ArgumentException || ex is NotSupportedException || ex is EndOfStreamException) { - // These are expected for corrupt or inaccessible fonts failures++; } catch (Exception ex) { - // Unexpected exceptions – log with full details (never swallow these silently) failures++; System.Diagnostics.Debug.WriteLine( string.Format( @@ -285,9 +221,13 @@ ex is NotSupportedException || return result; } - public static OpenTypeFont GetFromBytes(byte[] bytes, FontFormat format) + /// + /// Creates an OpenTypeFont from raw font bytes. + /// Font format (TTF/OTF) is detected automatically from the SFNT header. + /// + public static OpenTypeFont GetFromBytes(byte[] bytes) { - return OpenTypeFontFactory.CreateFromBytes(bytes, format); + return new OpenTypeFont(bytes); } } } \ No newline at end of file diff --git a/src/EPPlus.Fonts.OpenType/Scanner/FontFaceInfo.cs b/src/EPPlus.Fonts.OpenType/Scanner/FontFaceInfo.cs index c593c1028..4f5db1711 100644 --- a/src/EPPlus.Fonts.OpenType/Scanner/FontFaceInfo.cs +++ b/src/EPPlus.Fonts.OpenType/Scanner/FontFaceInfo.cs @@ -56,6 +56,8 @@ public class FontFaceInfo public ushort FsSelection { get; internal set; } + public bool IsExactMatch { get; internal set; } + /// /// Table directory for this face. /// diff --git a/src/EPPlus.Fonts.OpenType/Scanner/FontScannerV2.cs b/src/EPPlus.Fonts.OpenType/Scanner/FontScannerV2.cs index 17b3dc308..5a7581f10 100644 --- a/src/EPPlus.Fonts.OpenType/Scanner/FontScannerV2.cs +++ b/src/EPPlus.Fonts.OpenType/Scanner/FontScannerV2.cs @@ -2,6 +2,7 @@ using System.IO; using System; using System.Linq; +using EPPlus.Fonts.OpenType.FontResolver; namespace EPPlus.Fonts.OpenType.Scanner { @@ -23,7 +24,7 @@ public static FontFaceInfo FindBestMatch( FontSubFamily desiredStyle, bool searchSystemDirectories = true) { - var directories = OpenTypeFonts.GetLocationsCollection(additionalDirectories, searchSystemDirectories); + var directories = DefaultFontLocations.GetLocationsCollection(additionalDirectories, searchSystemDirectories); var candidates = EnumerateAllFaces(directories); FontFaceInfo bestMatch = null; @@ -42,7 +43,9 @@ public static FontFaceInfo FindBestMatch( bestMatch = face; } } - + if (bestMatch == null) + return null; + bestMatch.IsExactMatch = bestScore >= 9_000; return bestMatch; } diff --git a/src/EPPlus.Fonts.OpenType/TrueTypeMeasurer/TextData.cs b/src/EPPlus.Fonts.OpenType/TrueTypeMeasurer/TextData.cs index ecece0334..ee784698b 100644 --- a/src/EPPlus.Fonts.OpenType/TrueTypeMeasurer/TextData.cs +++ b/src/EPPlus.Fonts.OpenType/TrueTypeMeasurer/TextData.cs @@ -37,7 +37,7 @@ internal static class TextData internal static OpenTypeFont GetFontData(string fontName, FontSubFamily subFamily) { - return OpenTypeFonts.GetFontData(FontDirectories, fontName, subFamily, SearchSystemDirectories); + return OpenTypeFonts.LoadFont(fontName, subFamily, FontDirectories, SearchSystemDirectories); } /// @@ -1441,15 +1441,4 @@ internal static List WrapMultipleTextFragmentsToTextLines(TextPa return outputTextLines; } } -} - -namespace EPPlus.Fonts.OpenType -{ - public enum FontSubFamily - { - Regular, - Bold, - Italic, - BoldItalic - } } \ No newline at end of file From 4e4549a44e5678a6cb9bc617ab3071f6454acdad Mon Sep 17 00:00:00 2001 From: swmal <{ID}+username}@users.noreply.github.com> Date: Fri, 27 Feb 2026 16:16:32 +0100 Subject: [PATCH 3/3] More work on fallback fonts. Added fallback to Archivo fonts if the primary font is missing --- src/EPPlus.Export.Pdf/ExcelPdf.cs | 1 + .../PdfLayout/PdfCellContentLayout.cs | 1 + .../PdfLayout/PdfCellData.cs | 1 + .../PdfObjects/PdfContentStream.cs | 1 + .../PdfResources/PdfFontResource.cs | 3 +- .../Pdfhelpers/PdfTextData.cs | 3 +- .../ExtractCharWidthsBenchmark.cs | 2 +- .../FontCacheBenchmarks.cs | 1 + .../FontCacheClearingBenchmarks.cs | 1 + .../FontLoadingBenchmarks.cs | 1 + .../RichTextBenchmarks.cs | 1 + .../SubsettingBenchmarks.cs | 1 + .../TextLayoutEngineBenchmarks.cs | 1 + .../TextShapingBenchmarks.cs | 2 +- .../FallbackFonts/CustomFontProviderTests.cs | 1 + .../FallbackFonts/DefaultPrimaryFontTests.cs | 83 +++++++ .../FallbackFonts/FontProviderTests.cs | 1 + .../FontMeasurerPerformanceTest.cs | 1 + .../FontTestBase.cs | 6 +- .../Helpers/FontTestHelper.cs | 1 + .../Integration/MeasurerComparisonTests.cs | 1 + .../Integration/TextLayoutEngineTests.cs | 1 + .../Reading/GposReadingTests.cs | 3 +- .../Reading/TtfReadingTests.cs | 3 +- .../Regression/RegressionTests.cs | 1 + .../Serialization/CmapSerializationTests.cs | 1 + .../CoreTableSerializationTests.cs | 1 + .../GlyphTableSerializationTests.cs | 1 + .../Serialization/KernSerializationTests.cs | 1 + .../CompositeGlyphSubsettingTests.cs | 1 + .../TextShaping/MarkToBaseTests.cs | 4 +- .../TextShaping/SingleAdjustmentsTests.cs | 2 +- .../TextShaping/SingleSubstitutionTests.cs | 2 +- .../TextShaping/TextShaperTests.cs | 2 +- .../Validation/CmapTableValidationTests.cs | 1 + .../Validation/CoreTableValidationTests.cs | 1 + .../Validation/GlyphTableValidationTests.cs | 1 + .../EPPlus.Fonts.OpenType.csproj | 8 + src/EPPlus.Fonts.OpenType/EmbeddedFonts.cs | 18 ++ .../EpplusFontConfiguration.cs | 97 +++++++++ .../MacintoshLanguageMappings.cs | 22 +- .../WindowsLanguageMappings.cs | 58 ++--- .../FontResolver/DefaultFontResolver.cs | 14 +- .../FontResolver/FontsResolutionConfig.cs | 40 ---- .../Integration/FragmentPosition.cs | 1 + .../Integration/OpenTypeFontTextMeasurer.cs | 1 + .../Integration/TextFragment.cs | 1 + .../Integration/TextLayoutEngine.Helpers.cs | 4 +- .../Integration/TextLayoutEngine.RichText.cs | 2 +- .../Integration/TextLayoutEngine.cs | 1 + src/EPPlus.Fonts.OpenType/OpenTypeFonts.cs | 202 +++++++++++------- .../Resources/ArchivoNarrow-Bold.ttf | Bin 0 -> 63640 bytes .../Resources/ArchivoNarrow-BoldItalic.ttf | Bin 0 -> 66284 bytes .../Resources/ArchivoNarrow-Italic.ttf | Bin 0 -> 66396 bytes .../Resources/ArchivoNarrow-Regular.ttf | Bin 0 -> 63652 bytes .../Resources/THIRD_PARTY_LICENSES.txt | 12 +- .../Scanner/FontFaceInfo.cs | 3 +- .../Scanner/FontScannerV2.cs | 1 + .../Scanner/FontScannerV2Core.cs | 1 + .../Tables/Name/NameTable.cs | 1 + .../Contextual/ChainingContextualProcessor.cs | 2 +- .../Ligatures/LigatureProcessor.cs | 2 +- .../Positioning/MarkToBaseProvider.cs | 2 +- .../SingleSubstitutionProcessor.cs | 2 +- .../TextShaping/TextShaper.Vertical.cs | 2 +- .../TextShaping/TextShaper.cs | 2 +- .../DataHolders/TextParagraph.cs | 1 + .../TrueTypeMeasurer/FontMeasurerTrueType.cs | 1 + .../TrueTypeMeasurer/TextData.cs | 2 +- .../Fonts}/FontSubFamily.cs | 2 +- .../{Drawing/Text => Fonts}/GlyphWidth.cs | 2 +- .../Fonts/IEpplusFontConfiguration.cs | 59 +++++ .../Fonts}/IFontResolver.cs | 2 +- .../{Drawing/Text => Fonts}/ITextShaper.cs | 2 +- .../{Drawing/Text => Fonts}/ShapedGlyph.cs | 2 +- .../{Drawing/Text => Fonts}/ShapedText.cs | 2 +- .../Text => Fonts}/ShapedVerticalText.cs | 2 +- .../{Drawing/Text => Fonts}/ShapingOptions.cs | 2 +- .../Text => Fonts}/VerticalGlyphHeight.cs | 2 +- .../Text => Fonts}/VerticalShapedGlyph.cs | 2 +- 80 files changed, 532 insertions(+), 190 deletions(-) create mode 100644 src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/DefaultPrimaryFontTests.cs create mode 100644 src/EPPlus.Fonts.OpenType/EpplusFontConfiguration.cs delete mode 100644 src/EPPlus.Fonts.OpenType/FontResolver/FontsResolutionConfig.cs create mode 100644 src/EPPlus.Fonts.OpenType/Resources/ArchivoNarrow-Bold.ttf create mode 100644 src/EPPlus.Fonts.OpenType/Resources/ArchivoNarrow-BoldItalic.ttf create mode 100644 src/EPPlus.Fonts.OpenType/Resources/ArchivoNarrow-Italic.ttf create mode 100644 src/EPPlus.Fonts.OpenType/Resources/ArchivoNarrow-Regular.ttf rename src/{EPPlus.Fonts.OpenType => EPPlus.Interfaces/Fonts}/FontSubFamily.cs (95%) rename src/EPPlus.Interfaces/{Drawing/Text => Fonts}/GlyphWidth.cs (98%) create mode 100644 src/EPPlus.Interfaces/Fonts/IEpplusFontConfiguration.cs rename src/{EPPlus.Fonts.OpenType/FontResolver => EPPlus.Interfaces/Fonts}/IFontResolver.cs (97%) rename src/EPPlus.Interfaces/{Drawing/Text => Fonts}/ITextShaper.cs (99%) rename src/EPPlus.Interfaces/{Drawing/Text => Fonts}/ShapedGlyph.cs (99%) rename src/EPPlus.Interfaces/{Drawing/Text => Fonts}/ShapedText.cs (98%) rename src/EPPlus.Interfaces/{Drawing/Text => Fonts}/ShapedVerticalText.cs (98%) rename src/EPPlus.Interfaces/{Drawing/Text => Fonts}/ShapingOptions.cs (99%) rename src/EPPlus.Interfaces/{Drawing/Text => Fonts}/VerticalGlyphHeight.cs (97%) rename src/EPPlus.Interfaces/{Drawing/Text => Fonts}/VerticalShapedGlyph.cs (98%) diff --git a/src/EPPlus.Export.Pdf/ExcelPdf.cs b/src/EPPlus.Export.Pdf/ExcelPdf.cs index 11ae3f555..e53878908 100644 --- a/src/EPPlus.Export.Pdf/ExcelPdf.cs +++ b/src/EPPlus.Export.Pdf/ExcelPdf.cs @@ -24,6 +24,7 @@ Date Author Change using EPPlus.Export.Pdf.PdfSettings; using OfficeOpenXml.Style; using EPPlus.Fonts.OpenType; +using OfficeOpenXml.Interfaces.Fonts; namespace EPPlus.Export.Pdf { diff --git a/src/EPPlus.Export.Pdf/PdfLayout/PdfCellContentLayout.cs b/src/EPPlus.Export.Pdf/PdfLayout/PdfCellContentLayout.cs index b2213b74f..f90db2eeb 100644 --- a/src/EPPlus.Export.Pdf/PdfLayout/PdfCellContentLayout.cs +++ b/src/EPPlus.Export.Pdf/PdfLayout/PdfCellContentLayout.cs @@ -18,6 +18,7 @@ Date Author Change using EPPlus.Graphics.Math; using OfficeOpenXml; using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using OfficeOpenXml.Style; using System.Collections.Generic; using System.Linq; diff --git a/src/EPPlus.Export.Pdf/PdfLayout/PdfCellData.cs b/src/EPPlus.Export.Pdf/PdfLayout/PdfCellData.cs index 96cbd3957..b2a4fd248 100644 --- a/src/EPPlus.Export.Pdf/PdfLayout/PdfCellData.cs +++ b/src/EPPlus.Export.Pdf/PdfLayout/PdfCellData.cs @@ -13,6 +13,7 @@ Date Author Change using EPPlus.Export.Pdf.Pdfhelpers; using EPPlus.Fonts.OpenType; using EPPlus.Graphics; +using OfficeOpenXml.Interfaces.Fonts; using OfficeOpenXml.Style; using System.Collections.Generic; using System.Drawing; diff --git a/src/EPPlus.Export.Pdf/PdfObjects/PdfContentStream.cs b/src/EPPlus.Export.Pdf/PdfObjects/PdfContentStream.cs index fc7cd0665..f39f965be 100644 --- a/src/EPPlus.Export.Pdf/PdfObjects/PdfContentStream.cs +++ b/src/EPPlus.Export.Pdf/PdfObjects/PdfContentStream.cs @@ -18,6 +18,7 @@ Date Author Change using EPPlus.Graphics; using EPPlus.Graphics.Math; using OfficeOpenXml; +using OfficeOpenXml.Interfaces.Fonts; using OfficeOpenXml.Style; using System; using System.Collections.Generic; diff --git a/src/EPPlus.Export.Pdf/PdfResources/PdfFontResource.cs b/src/EPPlus.Export.Pdf/PdfResources/PdfFontResource.cs index da7008e17..47c998945 100644 --- a/src/EPPlus.Export.Pdf/PdfResources/PdfFontResource.cs +++ b/src/EPPlus.Export.Pdf/PdfResources/PdfFontResource.cs @@ -17,6 +17,7 @@ Date Author Change using System; using System.Collections.Generic; using EPPlus.Graphics; +using OfficeOpenXml.Interfaces.Fonts; namespace EPPlus.Export.Pdf.PdfResources { @@ -34,7 +35,7 @@ public PdfFontResource(string fontName, FontSubFamily subFamily, int labelNumber : base("F", labelNumber) { this.fontName = fontName; - fontData = OpenTypeFonts.LoadFont(fontName, subFamily); + fontData = OpenTypeFonts.LoadFont(fontName, subFamily, pageSettings.FontDirectories, pageSettings.SearchSystemDirectories); } //Get the Font Descriptor object to write in PDF. diff --git a/src/EPPlus.Export.Pdf/Pdfhelpers/PdfTextData.cs b/src/EPPlus.Export.Pdf/Pdfhelpers/PdfTextData.cs index b78507de1..cbf89df53 100644 --- a/src/EPPlus.Export.Pdf/Pdfhelpers/PdfTextData.cs +++ b/src/EPPlus.Export.Pdf/Pdfhelpers/PdfTextData.cs @@ -14,6 +14,7 @@ Date Author Change using EPPlus.Fonts.OpenType; using EPPlus.Fonts.OpenType.Tables.Cmap; using EPPlus.Fonts.OpenType.Tables.Kern; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Linq; @@ -23,7 +24,7 @@ internal static class PdfTextData { internal static OpenTypeFont GetFontData(PdfPageSettings pageSettings, string fontName, FontSubFamily subFamily) { - return OpenTypeFonts.LoadFont(fontName, subFamily); + return OpenTypeFonts.LoadFont(fontName, subFamily, pageSettings.FontDirectories, pageSettings.SearchSystemDirectories); } internal static double MeasureFontHeight(OpenTypeFont font, double fontSize) diff --git a/src/EPPlus.Fonts.OpenType.Benchmarks/ExtractCharWidthsBenchmark.cs b/src/EPPlus.Fonts.OpenType.Benchmarks/ExtractCharWidthsBenchmark.cs index fc7196b2e..734d92727 100644 --- a/src/EPPlus.Fonts.OpenType.Benchmarks/ExtractCharWidthsBenchmark.cs +++ b/src/EPPlus.Fonts.OpenType.Benchmarks/ExtractCharWidthsBenchmark.cs @@ -1,7 +1,7 @@ using BenchmarkDotNet.Attributes; using EPPlus.Fonts.OpenType; using EPPlus.Fonts.OpenType.TextShaping; -using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; [MemoryDiagnoser] [SimpleJob(warmupCount: 1, iterationCount: 3)] diff --git a/src/EPPlus.Fonts.OpenType.Benchmarks/FontCacheBenchmarks.cs b/src/EPPlus.Fonts.OpenType.Benchmarks/FontCacheBenchmarks.cs index 7203cebce..b51dbe68a 100644 --- a/src/EPPlus.Fonts.OpenType.Benchmarks/FontCacheBenchmarks.cs +++ b/src/EPPlus.Fonts.OpenType.Benchmarks/FontCacheBenchmarks.cs @@ -1,4 +1,5 @@ using BenchmarkDotNet.Attributes; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Collections.Generic; using System.Linq; diff --git a/src/EPPlus.Fonts.OpenType.Benchmarks/FontCacheClearingBenchmarks.cs b/src/EPPlus.Fonts.OpenType.Benchmarks/FontCacheClearingBenchmarks.cs index 5f5f8e9f6..29622a3ca 100644 --- a/src/EPPlus.Fonts.OpenType.Benchmarks/FontCacheClearingBenchmarks.cs +++ b/src/EPPlus.Fonts.OpenType.Benchmarks/FontCacheClearingBenchmarks.cs @@ -1,5 +1,6 @@ using BenchmarkDotNet.Attributes; using EPPlus.Fonts.OpenType; +using OfficeOpenXml.Interfaces.Fonts; /// /// Benchmarks for repeated cache clearing scenarios diff --git a/src/EPPlus.Fonts.OpenType.Benchmarks/FontLoadingBenchmarks.cs b/src/EPPlus.Fonts.OpenType.Benchmarks/FontLoadingBenchmarks.cs index 51f72a209..703d995c9 100644 --- a/src/EPPlus.Fonts.OpenType.Benchmarks/FontLoadingBenchmarks.cs +++ b/src/EPPlus.Fonts.OpenType.Benchmarks/FontLoadingBenchmarks.cs @@ -12,6 +12,7 @@ Date Author Change *************************************************************************************************/ using BenchmarkDotNet.Attributes; using EPPlus.Fonts.OpenType; +using OfficeOpenXml.Interfaces.Fonts; using System.Collections.Generic; using System.IO; diff --git a/src/EPPlus.Fonts.OpenType.Benchmarks/RichTextBenchmarks.cs b/src/EPPlus.Fonts.OpenType.Benchmarks/RichTextBenchmarks.cs index 0ecb2a0fd..c6e64408d 100644 --- a/src/EPPlus.Fonts.OpenType.Benchmarks/RichTextBenchmarks.cs +++ b/src/EPPlus.Fonts.OpenType.Benchmarks/RichTextBenchmarks.cs @@ -15,6 +15,7 @@ Date Author Change using EPPlus.Fonts.OpenType.Integration; using EPPlus.Fonts.OpenType.TextShaping; using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Collections.Generic; using System.IO; diff --git a/src/EPPlus.Fonts.OpenType.Benchmarks/SubsettingBenchmarks.cs b/src/EPPlus.Fonts.OpenType.Benchmarks/SubsettingBenchmarks.cs index 8fc391854..985233598 100644 --- a/src/EPPlus.Fonts.OpenType.Benchmarks/SubsettingBenchmarks.cs +++ b/src/EPPlus.Fonts.OpenType.Benchmarks/SubsettingBenchmarks.cs @@ -12,6 +12,7 @@ Date Author Change *************************************************************************************************/ using BenchmarkDotNet.Attributes; using EPPlus.Fonts.OpenType; +using OfficeOpenXml.Interfaces.Fonts; using System.Collections.Generic; using System.IO; diff --git a/src/EPPlus.Fonts.OpenType.Benchmarks/TextLayoutEngineBenchmarks.cs b/src/EPPlus.Fonts.OpenType.Benchmarks/TextLayoutEngineBenchmarks.cs index 67fc76a40..cfe1147c5 100644 --- a/src/EPPlus.Fonts.OpenType.Benchmarks/TextLayoutEngineBenchmarks.cs +++ b/src/EPPlus.Fonts.OpenType.Benchmarks/TextLayoutEngineBenchmarks.cs @@ -15,6 +15,7 @@ Date Author Change using EPPlus.Fonts.OpenType.Integration; using EPPlus.Fonts.OpenType.TextShaping; using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using System.Collections.Generic; namespace EPPlus.Fonts.Benchmarks diff --git a/src/EPPlus.Fonts.OpenType.Benchmarks/TextShapingBenchmarks.cs b/src/EPPlus.Fonts.OpenType.Benchmarks/TextShapingBenchmarks.cs index 186f4d29b..87ce151d4 100644 --- a/src/EPPlus.Fonts.OpenType.Benchmarks/TextShapingBenchmarks.cs +++ b/src/EPPlus.Fonts.OpenType.Benchmarks/TextShapingBenchmarks.cs @@ -1,6 +1,6 @@ using BenchmarkDotNet.Attributes; using EPPlus.Fonts.OpenType.TextShaping; -using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; namespace EPPlus.Fonts.OpenType.Benchmarks { diff --git a/src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/CustomFontProviderTests.cs b/src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/CustomFontProviderTests.cs index 3756a923b..b7fd0bc97 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/CustomFontProviderTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/CustomFontProviderTests.cs @@ -11,6 +11,7 @@ Date Author Change 02/24/2026 EPPlus Software AB CustomFontProvider unit tests *************************************************************************************************/ using Microsoft.VisualStudio.TestTools.UnitTesting; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Linq; diff --git a/src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/DefaultPrimaryFontTests.cs b/src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/DefaultPrimaryFontTests.cs new file mode 100644 index 000000000..e9a3b0029 --- /dev/null +++ b/src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/DefaultPrimaryFontTests.cs @@ -0,0 +1,83 @@ +/************************************************************************************************* + Required Notice: Copyright (C) EPPlus Software AB. + This software is licensed under PolyForm Noncommercial License 1.0.0 + and may only be used for noncommercial purposes + https://polyformproject.org/licenses/noncommercial/1.0.0/ + + A commercial license to use this software can be purchased at https://epplussoftware.com + ************************************************************************************************* + Date Author Change + ************************************************************************************************* + 02/27/2026 EPPlus Software AB Initial implementation + *************************************************************************************************/ +using EPPlus.Fonts.OpenType.FontResolver; +using OfficeOpenXml.Interfaces.Fonts; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace EPPlus.Fonts.OpenType.Tests.FallbackFonts +{ + [TestClass] + public class DefaultPrimaryFontTests : FontTestBase + { + public override TestContext? TestContext { get; set; } + + private static readonly string UnknownFont = "ThisFontDoesNotExist_XYZ"; + + private static DefaultFontResolver CreateIsolatedResolver() + { + // No directories, no system fonts — guarantees Archivo Narrow fallback + return new DefaultFontResolver(fontDirectories: null, searchSystemDirectories: false); + } + + [TestMethod] + public void ResolveFont_UnknownFont_Regular_ShouldFallbackToArchivoNarrow() + { + var resolver = CreateIsolatedResolver(); + var bytes = resolver.ResolveFont(UnknownFont, FontSubFamily.Regular); + + Assert.IsNotNull(bytes, "Should fall back to Archivo Narrow, not return null"); + var font = OpenTypeFonts.GetFromBytes(bytes); + Assert.AreEqual("Archivo Narrow", font.NameTable.GetFamilyName()); + Assert.AreEqual(FontSubFamily.Regular, font.NameTable.GetSubfamilyEnum()); + } + + [TestMethod] + public void ResolveFont_UnknownFont_Bold_ShouldFallbackToArchivoNarrowBold() + { + var resolver = CreateIsolatedResolver(); + var bytes = resolver.ResolveFont(UnknownFont, FontSubFamily.Bold); + + Assert.IsNotNull(bytes, "Should fall back to Archivo Narrow Bold, not return null"); + var font = OpenTypeFonts.GetFromBytes(bytes); + Assert.AreEqual("Archivo Narrow", font.NameTable.GetFamilyName()); + Assert.AreEqual(FontSubFamily.Bold, font.NameTable.GetSubfamilyEnum()); + } + + [TestMethod] + public void ResolveFont_UnknownFont_Italic_ShouldFallbackToArchivoNarrowItalic() + { + var resolver = CreateIsolatedResolver(); + var bytes = resolver.ResolveFont(UnknownFont, FontSubFamily.Italic); + + Assert.IsNotNull(bytes, "Should fall back to Archivo Narrow Italic, not return null"); + var font = OpenTypeFonts.GetFromBytes(bytes); + Assert.AreEqual("Archivo Narrow", font.NameTable.GetFamilyName()); + Assert.AreEqual(FontSubFamily.Italic, font.NameTable.GetSubfamilyEnum()); + } + + [TestMethod] + public void ResolveFont_UnknownFont_BoldItalic_ShouldFallbackToArchivoNarrowBoldItalic() + { + var resolver = CreateIsolatedResolver(); + var bytes = resolver.ResolveFont(UnknownFont, FontSubFamily.BoldItalic); + + Assert.IsNotNull(bytes, "Should fall back to Archivo Narrow Bold Italic, not return null"); + var font = OpenTypeFonts.GetFromBytes(bytes); + Assert.AreEqual("Archivo Narrow", font.NameTable.GetFamilyName()); + Assert.AreEqual(FontSubFamily.BoldItalic, font.NameTable.GetSubfamilyEnum()); + } + } +} \ No newline at end of file diff --git a/src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/FontProviderTests.cs b/src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/FontProviderTests.cs index 58f10e4af..61c22b861 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/FontProviderTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/FallbackFonts/FontProviderTests.cs @@ -4,6 +4,7 @@ Font Provider Unit Tests *************************************************************************************************/ using EPPlus.Fonts.OpenType.TextShaping; using Microsoft.VisualStudio.TestTools.UnitTesting; +using OfficeOpenXml.Interfaces.Fonts; using System.Linq; namespace EPPlus.Fonts.OpenType.Tests.FallbackFonts diff --git a/src/EPPlus.Fonts.OpenType.Tests/FontMeasurerPerformanceTest.cs b/src/EPPlus.Fonts.OpenType.Tests/FontMeasurerPerformanceTest.cs index cae6bd6e3..acd5673d3 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/FontMeasurerPerformanceTest.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/FontMeasurerPerformanceTest.cs @@ -2,6 +2,7 @@ using EPPlus.Fonts.OpenType.Integration; using EPPlus.Fonts.OpenType.TextShaping; using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Diagnostics; using System.Drawing; diff --git a/src/EPPlus.Fonts.OpenType.Tests/FontTestBase.cs b/src/EPPlus.Fonts.OpenType.Tests/FontTestBase.cs index febc2835b..1c5e0bd1d 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/FontTestBase.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/FontTestBase.cs @@ -119,7 +119,7 @@ public void ClearAllCaches() protected virtual void ConfigureResolver() { - OpenTypeFonts.Configure(new DefaultFontResolver(FontFolders, false)); + OpenTypeFonts.Configure(x => x.SetFontResolver(new DefaultFontResolver(FontFolders, false))); } [ClassInitialize(InheritanceBehavior.BeforeEachDerivedClass)] @@ -134,12 +134,12 @@ public static void BaseClassInitialize(TestContext context) /// protected static void UseSystemFonts() { - OpenTypeFonts.Configure(new DefaultFontResolver(null, true)); + OpenTypeFonts.Configure(x => x.SetFontResolver(new DefaultFontResolver(null, true))); } protected static void UseFontFolders(IEnumerable directories, bool searchSystemDirectories = false) { - OpenTypeFonts.Configure(new DefaultFontResolver(directories, searchSystemDirectories)); + OpenTypeFonts.Configure(x => x.SetFontResolver(new DefaultFontResolver(directories, searchSystemDirectories))); } } } \ No newline at end of file diff --git a/src/EPPlus.Fonts.OpenType.Tests/Helpers/FontTestHelper.cs b/src/EPPlus.Fonts.OpenType.Tests/Helpers/FontTestHelper.cs index 1e8f1e2a4..650b81516 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Helpers/FontTestHelper.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Helpers/FontTestHelper.cs @@ -1,5 +1,6 @@ using EPPlus.Fonts.OpenType.FontValidation; using EPPlus.Fonts.OpenType.Tables.Gsub.Data.Lookups; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Collections.Generic; using System.IO; diff --git a/src/EPPlus.Fonts.OpenType.Tests/Integration/MeasurerComparisonTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Integration/MeasurerComparisonTests.cs index 4da69391e..9e20a788a 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Integration/MeasurerComparisonTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Integration/MeasurerComparisonTests.cs @@ -4,6 +4,7 @@ using EPPlus.Fonts.OpenType.Utils; using Microsoft.VisualStudio.TestTools.UnitTesting; using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Collections.Generic; using System.Diagnostics; diff --git a/src/EPPlus.Fonts.OpenType.Tests/Integration/TextLayoutEngineTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Integration/TextLayoutEngineTests.cs index 911a81959..cdad64a43 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Integration/TextLayoutEngineTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Integration/TextLayoutEngineTests.cs @@ -4,6 +4,7 @@ using EPPlus.Fonts.OpenType.Utils; using Microsoft.VisualStudio.TestTools.UnitTesting; using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using System.Collections.Generic; using System.Diagnostics; using static System.Net.Mime.MediaTypeNames; diff --git a/src/EPPlus.Fonts.OpenType.Tests/Reading/GposReadingTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Reading/GposReadingTests.cs index 3f1c05fd6..abe02a36c 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Reading/GposReadingTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Reading/GposReadingTests.cs @@ -7,6 +7,7 @@ using EPPlus.Fonts.OpenType.Tables.Gpos.Data.Lookups.LookupType4; using EPPlus.Fonts.OpenType.Tests.Helpers; using Microsoft.VisualStudio.TestTools.UnitTesting; +using OfficeOpenXml.Interfaces.Fonts; using System.Diagnostics; using System.Linq; @@ -19,7 +20,7 @@ public class GposReadingTests : FontTestBase protected override void ConfigureResolver() { - OpenTypeFonts.Configure(new DefaultFontResolver(FontFolders, true)); + OpenTypeFonts.Configure(x => x.SetFontResolver(new DefaultFontResolver(FontFolders, true))); } diff --git a/src/EPPlus.Fonts.OpenType.Tests/Reading/TtfReadingTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Reading/TtfReadingTests.cs index 8a3ee72cf..d76a14984 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Reading/TtfReadingTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Reading/TtfReadingTests.cs @@ -13,6 +13,7 @@ Date Author Change using EPPlus.Fonts.OpenType.FontResolver; using EPPlus.Fonts.OpenType.Tests.Helpers; using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using System.Diagnostics; namespace EPPlus.Fonts.OpenType.Tests.Reading @@ -24,7 +25,7 @@ public sealed class TtfReadingTests : FontTestBase protected override void ConfigureResolver() { - OpenTypeFonts.Configure(new DefaultFontResolver(FontFolders, true)); + OpenTypeFonts.Configure(x => x.SetFontResolver(new DefaultFontResolver(FontFolders, true))); } [TestMethod] diff --git a/src/EPPlus.Fonts.OpenType.Tests/Regression/RegressionTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Regression/RegressionTests.cs index 15c0c457f..b490c6589 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Regression/RegressionTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Regression/RegressionTests.cs @@ -13,6 +13,7 @@ Date Author Change using EPPlus.Fonts.OpenType.FontCache; using EPPlus.Fonts.OpenType.Tests.Helpers; using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using System.ComponentModel.DataAnnotations; using System.Diagnostics; using System.IO; diff --git a/src/EPPlus.Fonts.OpenType.Tests/Serialization/CmapSerializationTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Serialization/CmapSerializationTests.cs index dc5f5fbe2..b84b0c87d 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Serialization/CmapSerializationTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Serialization/CmapSerializationTests.cs @@ -1,5 +1,6 @@ using EPPlus.Fonts.OpenType.Scanner; using EPPlus.Fonts.OpenType.Tests.Helpers; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Collections.Generic; using System.Linq; diff --git a/src/EPPlus.Fonts.OpenType.Tests/Serialization/CoreTableSerializationTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Serialization/CoreTableSerializationTests.cs index f13175c78..e7ca71ce3 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Serialization/CoreTableSerializationTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Serialization/CoreTableSerializationTests.cs @@ -1,5 +1,6 @@ using EPPlus.Fonts.OpenType.Scanner; using EPPlus.Fonts.OpenType.Tests.Helpers; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Collections.Generic; using System.Linq; diff --git a/src/EPPlus.Fonts.OpenType.Tests/Serialization/GlyphTableSerializationTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Serialization/GlyphTableSerializationTests.cs index 2c01afc2f..a97ca24ad 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Serialization/GlyphTableSerializationTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Serialization/GlyphTableSerializationTests.cs @@ -1,5 +1,6 @@ using EPPlus.Fonts.OpenType.Scanner; using EPPlus.Fonts.OpenType.Tests.Helpers; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Collections.Generic; using System.Linq; diff --git a/src/EPPlus.Fonts.OpenType.Tests/Serialization/KernSerializationTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Serialization/KernSerializationTests.cs index 57ad3c238..517675118 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Serialization/KernSerializationTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Serialization/KernSerializationTests.cs @@ -1,5 +1,6 @@ using EPPlus.Fonts.OpenType.Scanner; using EPPlus.Fonts.OpenType.Tests.Helpers; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Collections.Generic; using System.Linq; diff --git a/src/EPPlus.Fonts.OpenType.Tests/Subsetting/CompositeGlyphSubsettingTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Subsetting/CompositeGlyphSubsettingTests.cs index f70918a15..a5c55bf95 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Subsetting/CompositeGlyphSubsettingTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Subsetting/CompositeGlyphSubsettingTests.cs @@ -11,6 +11,7 @@ Date Author Change 12/21/2025 EPPlus Software AB Composite glyph subsetting tests *************************************************************************************************/ using EPPlus.Fonts.OpenType.Tests.Helpers; +using OfficeOpenXml.Interfaces.Fonts; using System.Linq; namespace EPPlus.Fonts.OpenType.Tests.Subsetting diff --git a/src/EPPlus.Fonts.OpenType.Tests/TextShaping/MarkToBaseTests.cs b/src/EPPlus.Fonts.OpenType.Tests/TextShaping/MarkToBaseTests.cs index 8822a2e79..0a9fbd88a 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/TextShaping/MarkToBaseTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/TextShaping/MarkToBaseTests.cs @@ -1,6 +1,6 @@ using EPPlus.Fonts.OpenType.FontResolver; using EPPlus.Fonts.OpenType.TextShaping; -using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Collections.Generic; using System.Diagnostics; @@ -24,7 +24,7 @@ public void TestSetup() public void MarkToBaseTest() { var resolver = new DefaultFontResolver(null, true); // system-Roboto, ingen testmapp - OpenTypeFonts.Configure(resolver); + OpenTypeFonts.Configure(x => x.SetFontResolver(resolver)); var font = OpenTypeFonts.LoadFont("Roboto", FontSubFamily.Regular, ignoreCache: true); Debug.WriteLine("=== MarkToBaseTest ==="); Debug.WriteLine($"Font instance: {font.GetHashCode()}"); diff --git a/src/EPPlus.Fonts.OpenType.Tests/TextShaping/SingleAdjustmentsTests.cs b/src/EPPlus.Fonts.OpenType.Tests/TextShaping/SingleAdjustmentsTests.cs index 639465430..a9bdb7c13 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/TextShaping/SingleAdjustmentsTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/TextShaping/SingleAdjustmentsTests.cs @@ -1,7 +1,7 @@ using EPPlus.Fonts.OpenType; using EPPlus.Fonts.OpenType.TextShaping; using Microsoft.VisualStudio.TestTools.UnitTesting; -using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using System.Diagnostics; namespace EPPlus.Fonts.OpenType.Tests.TextShaping diff --git a/src/EPPlus.Fonts.OpenType.Tests/TextShaping/SingleSubstitutionTests.cs b/src/EPPlus.Fonts.OpenType.Tests/TextShaping/SingleSubstitutionTests.cs index 89f760706..b1dceb99a 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/TextShaping/SingleSubstitutionTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/TextShaping/SingleSubstitutionTests.cs @@ -14,7 +14,7 @@ Date Author Change using EPPlus.Fonts.OpenType.Tables.Gsub.Data.Lookups; using EPPlus.Fonts.OpenType.TextShaping; using Microsoft.VisualStudio.TestTools.UnitTesting; -using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using System.Collections.Generic; using System.Diagnostics; using System.Linq; diff --git a/src/EPPlus.Fonts.OpenType.Tests/TextShaping/TextShaperTests.cs b/src/EPPlus.Fonts.OpenType.Tests/TextShaping/TextShaperTests.cs index ac0ab4703..b759947ee 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/TextShaping/TextShaperTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/TextShaping/TextShaperTests.cs @@ -14,7 +14,7 @@ Date Author Change using EPPlus.Fonts.OpenType.Tables.Gpos.Data.Lookups.LookupType2; using EPPlus.Fonts.OpenType.TextShaping; using Microsoft.VisualStudio.TestTools.UnitTesting; -using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Diagnostics; diff --git a/src/EPPlus.Fonts.OpenType.Tests/Validation/CmapTableValidationTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Validation/CmapTableValidationTests.cs index f0c3dbd0e..6ab526979 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Validation/CmapTableValidationTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Validation/CmapTableValidationTests.cs @@ -1,6 +1,7 @@ using EPPlus.Fonts.OpenType.FontValidation; using EPPlus.Fonts.OpenType.Tables.Cmap; using EPPlus.Fonts.OpenType.Tests.Helpers; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Collections.Generic; using System.Linq; diff --git a/src/EPPlus.Fonts.OpenType.Tests/Validation/CoreTableValidationTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Validation/CoreTableValidationTests.cs index ccb198bab..a22cd26cd 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Validation/CoreTableValidationTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Validation/CoreTableValidationTests.cs @@ -6,6 +6,7 @@ using EPPlus.Fonts.OpenType.Tables.Os2; using EPPlus.Fonts.OpenType.Tables.Post; using EPPlus.Fonts.OpenType.Tests.Helpers; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Collections.Generic; using System.Linq; diff --git a/src/EPPlus.Fonts.OpenType.Tests/Validation/GlyphTableValidationTests.cs b/src/EPPlus.Fonts.OpenType.Tests/Validation/GlyphTableValidationTests.cs index 2a5ac3ee3..06d4ea879 100644 --- a/src/EPPlus.Fonts.OpenType.Tests/Validation/GlyphTableValidationTests.cs +++ b/src/EPPlus.Fonts.OpenType.Tests/Validation/GlyphTableValidationTests.cs @@ -3,6 +3,7 @@ using EPPlus.Fonts.OpenType.Tables.Hmtx; using EPPlus.Fonts.OpenType.Tables.Loca; using EPPlus.Fonts.OpenType.Tests.Helpers; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Collections.Generic; using System.Linq; diff --git a/src/EPPlus.Fonts.OpenType/EPPlus.Fonts.OpenType.csproj b/src/EPPlus.Fonts.OpenType/EPPlus.Fonts.OpenType.csproj index 72eb6b59f..76c52dc79 100644 --- a/src/EPPlus.Fonts.OpenType/EPPlus.Fonts.OpenType.csproj +++ b/src/EPPlus.Fonts.OpenType/EPPlus.Fonts.OpenType.csproj @@ -61,10 +61,18 @@ + + + + + + + + PreserveNewest diff --git a/src/EPPlus.Fonts.OpenType/EmbeddedFonts.cs b/src/EPPlus.Fonts.OpenType/EmbeddedFonts.cs index 6da3aee52..7c6198b17 100644 --- a/src/EPPlus.Fonts.OpenType/EmbeddedFonts.cs +++ b/src/EPPlus.Fonts.OpenType/EmbeddedFonts.cs @@ -1,4 +1,5 @@ using EPPlus.Fonts.OpenType.Scanner; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Collections.Generic; using System.IO; @@ -31,6 +32,23 @@ internal static OpenTypeFont LoadNotoMath() return LoadCached("NotoSansMath-Regular.ttf"); } + internal static OpenTypeFont LoadArchivoNarrow(FontSubFamily subFamily) + { + if (subFamily == FontSubFamily.Italic) + { + return LoadCached("ArchivoNarrow-Italic.ttf"); + } + else if (subFamily == FontSubFamily.Bold) + { + return LoadCached("ArchivoNarrow-Bold.ttf"); + } + else if(subFamily == FontSubFamily.BoldItalic) + { + return LoadCached("ArchivoNarrow-BoldItalic.ttf"); + } + return LoadCached("ArchivoNarrow-Regular.ttf"); + } + private static OpenTypeFont LoadCached(string resourceName) { lock (_lock) diff --git a/src/EPPlus.Fonts.OpenType/EpplusFontConfiguration.cs b/src/EPPlus.Fonts.OpenType/EpplusFontConfiguration.cs new file mode 100644 index 000000000..f4238a9f4 --- /dev/null +++ b/src/EPPlus.Fonts.OpenType/EpplusFontConfiguration.cs @@ -0,0 +1,97 @@ +/************************************************************************************************* + Required Notice: Copyright (C) EPPlus Software AB. + This software is licensed under PolyForm Noncommercial License 1.0.0 + and may only be used for noncommercial purposes + https://polyformproject.org/licenses/noncommercial/1.0.0/ + + A commercial license to use this software can be purchased at https://epplussoftware.com + ************************************************************************************************* + Date Author Change + ************************************************************************************************* + 02/27/2026 EPPlus Software AB Replaces FontResolutionConfig + *************************************************************************************************/ +using OfficeOpenXml.Interfaces.Fonts; +using System; +using System.Collections.Generic; + +namespace EPPlus.Fonts.OpenType.FontResolver +{ + /// + /// Concrete implementation of . + /// Managed exclusively by — not instantiated by user code. + /// + internal class EpplusFontConfiguration : IEpplusFontConfiguration + { + private readonly Dictionary _fallbacks = + new Dictionary(StringComparer.OrdinalIgnoreCase); + + // Internal events consumed by OpenTypeFonts in the same assembly. + internal event Action OnReset; + internal event Action OnSetFontResolver; + + // ----------------------------------------------------------------------------------------- + // IEpplusFontConfiguration + // ----------------------------------------------------------------------------------------- + + /// + public IEpplusFontConfiguration AddFallback(string primaryFont, params string[] fallbacks) + { + if (string.IsNullOrEmpty(primaryFont)) + throw new ArgumentNullException("primaryFont"); + if (fallbacks == null || fallbacks.Length == 0) + throw new ArgumentException("At least one fallback must be specified.", "fallbacks"); + + // Additive: merge with any existing fallbacks for this font. + string[] existing; + if (_fallbacks.TryGetValue(primaryFont, out existing)) + { + var merged = new string[existing.Length + fallbacks.Length]; + existing.CopyTo(merged, 0); + fallbacks.CopyTo(merged, existing.Length); + _fallbacks[primaryFont] = merged; + } + else + { + _fallbacks[primaryFont] = fallbacks; + } + + return this; + } + + /// + public IEpplusFontConfiguration SetFontResolver(IFontResolver resolver) + { + if (resolver == null) + throw new ArgumentNullException("resolver"); + + if (OnSetFontResolver != null) + OnSetFontResolver(resolver); + + return this; + } + + /// + public IEpplusFontConfiguration Reset() + { + _fallbacks.Clear(); + + if (OnReset != null) + OnReset(); + + return this; + } + + // ----------------------------------------------------------------------------------------- + // Internal API — consumed by DefaultFontResolver in the same assembly. + // ----------------------------------------------------------------------------------------- + + /// + /// Returns the fallback chain for the given font name, or null if none is configured. + /// + internal string[] GetFallbacks(string fontName) + { + string[] result; + return _fallbacks.TryGetValue(fontName, out result) ? result : null; + } + } +} \ No newline at end of file diff --git a/src/EPPlus.Fonts.OpenType/FontLocalization/MacintoshLanguageMappings.cs b/src/EPPlus.Fonts.OpenType/FontLocalization/MacintoshLanguageMappings.cs index 9046dafe4..1f9525c69 100644 --- a/src/EPPlus.Fonts.OpenType/FontLocalization/MacintoshLanguageMappings.cs +++ b/src/EPPlus.Fonts.OpenType/FontLocalization/MacintoshLanguageMappings.cs @@ -9,21 +9,25 @@ This software is licensed under PolyForm Noncommercial License 1.0.0 Date Author Change ************************************************************************************************* 10/07/2025 EPPlus Software AB EPPlus.Fonts.OpenType 1.0 + 02/27/2026 EPPlus Software AB Thread-safe initialization *************************************************************************************************/ using System.Collections.Generic; -using System.Linq; namespace EPPlus.Fonts.OpenType.FontLocalization { internal static class MacintoshLanguageMappings { - private static IDictionary _mappings = new Dictionary(); + private static readonly object _syncRoot = new object(); + private static volatile bool _initialized = false; + private static readonly Dictionary _mappings = new Dictionary(); private static void AddMapping(int hexNumber, Languages language) { + // Called only within lock, no additional lock needed var mapping = LanguageMapping.Create(hexNumber, language); _mappings.Add(mapping.code, mapping); } + private static void CreateMappings() { AddMapping(0, Languages.English); @@ -147,12 +151,20 @@ public static IDictionary Mappings { get { - if (_mappings.Count() == 0) + // Double-checked locking pattern, compatible with .NET 3.5+ + if (!_initialized) { - CreateMappings(); + lock (_syncRoot) + { + if (!_initialized) + { + CreateMappings(); + _initialized = true; + } + } } return _mappings; } } } -} +} \ No newline at end of file diff --git a/src/EPPlus.Fonts.OpenType/FontLocalization/WindowsLanguageMappings.cs b/src/EPPlus.Fonts.OpenType/FontLocalization/WindowsLanguageMappings.cs index 1c2c2ecf4..7c98224f3 100644 --- a/src/EPPlus.Fonts.OpenType/FontLocalization/WindowsLanguageMappings.cs +++ b/src/EPPlus.Fonts.OpenType/FontLocalization/WindowsLanguageMappings.cs @@ -9,33 +9,34 @@ This software is licensed under PolyForm Noncommercial License 1.0.0 Date Author Change ************************************************************************************************* 10/07/2025 EPPlus Software AB EPPlus.Fonts.OpenType 1.0 + 02/27/2026 EPPlus Software AB Thread-safe initialization *************************************************************************************************/ using System.Collections.Generic; -using System.Linq; namespace EPPlus.Fonts.OpenType.FontLocalization { internal static class WindowsLanguageMappings { - private static IDictionary _mappings = new Dictionary(); + private static readonly object _syncRoot = new object(); + private static volatile bool _initialized = false; + private static readonly Dictionary _mappings = new Dictionary(); + private static void AddMappping(int hexNumber, Languages language) { - lock (_mappings) - { - if (_mappings.ContainsKey(hexNumber)) return; + // Called only within lock during initialization, no additional lock needed + if (_mappings.ContainsKey(hexNumber)) return; - var mapping = LanguageMapping.Create(hexNumber, language); - _mappings.Add(mapping.code, mapping); - } + var mapping = LanguageMapping.Create(hexNumber, language); + _mappings.Add(mapping.code, mapping); } + private static void CreateMappings() { - AddMappping(0x0436, Languages.Afrikaans); AddMappping(0x041C, Languages.Albanian); AddMappping(0x0484, Languages.Alsatian); AddMappping(0x045E, Languages.Amharic); - + AddMappping(0x1401, Languages.Arabic); AddMappping(0x3C01, Languages.Arabic); AddMappping(0x0C01, Languages.Arabic); @@ -47,12 +48,14 @@ private static void CreateMappings() AddMappping(0x1801, Languages.Arabic); AddMappping(0x2001, Languages.Arabic); AddMappping(0x4001, Languages.Arabic); - AddMappping(0x0401, Languages.Arabic); AddMappping(0x2801, Languages.Arabic); AddMappping(0x1C01, Languages.Arabic); AddMappping(0x3801, Languages.Arabic); AddMappping(0x2401, Languages.Arabic); - + AddMappping(0x0401, Languages.Arabic); + AddMappping(0x2801, Languages.Arabic); + AddMappping(0x1401, Languages.Arabic); + AddMappping(0x0429, Languages.Dari); AddMappping(0x042B, Languages.Armenian); AddMappping(0x044D, Languages.Assamese); AddMappping(0x082C, Languages.Azeri_Cyrillic); @@ -64,24 +67,23 @@ private static void CreateMappings() AddMappping(0x0445, Languages.Bengali); AddMappping(0x201A, Languages.Bosnian_Cyrillic); AddMappping(0x141A, Languages.Bosnian_Latin); - AddMappping(0x047E, Languages.Breton); AddMappping(0x0402, Languages.Bulgarian); AddMappping(0x0403, Languages.Catalan); - AddMappping(0x1404, Languages.Chinese); - AddMappping(0x0804, Languages.Chinese); - AddMappping(0x1004, Languages.Chinese); - AddMappping(0x0404, Languages.Chinese); + AddMappping(0x0C04, Languages.Chinese_Traditional); + AddMappping(0x1404, Languages.Chinese_Traditional); + AddMappping(0x0804, Languages.Chinese_Simplified); + AddMappping(0x1004, Languages.Chinese_Simplified); + AddMappping(0x0404, Languages.Chinese_Traditional); AddMappping(0x0483, Languages.Corsican); AddMappping(0x041A, Languages.Croatian); - AddMappping(0x101A, Languages.Croatian_Latin); - AddMappping(0x0405, Languages.Czech ); + AddMappping(0x0405, Languages.Czech); AddMappping(0x0406, Languages.Danish); AddMappping(0x048C, Languages.Dari); AddMappping(0x0465, Languages.Divehi); - AddMappping(0x0813, Languages.Dutch); AddMappping(0x0413, Languages.Dutch); + AddMappping(0x0813, Languages.Dutch); AddMappping(0x0C09, Languages.English); AddMappping(0x2809, Languages.English); @@ -107,7 +109,7 @@ private static void CreateMappings() AddMappping(0x080C, Languages.French); AddMappping(0x0C0C, Languages.French); AddMappping(0x040C, Languages.French); - AddMappping(0x140c, Languages.French); + AddMappping(0x140C, Languages.French); AddMappping(0x180C, Languages.French); AddMappping(0x100C, Languages.French); AddMappping(0x0462, Languages.Frisian); @@ -258,12 +260,20 @@ public static IDictionary Mappings { get { - if(_mappings.Count() == 0) + // Double-checked locking pattern, compatible with .NET 3.5+ + if (!_initialized) { - CreateMappings(); + lock (_syncRoot) + { + if (!_initialized) + { + CreateMappings(); + _initialized = true; + } + } } return _mappings; } } } -} +} \ No newline at end of file diff --git a/src/EPPlus.Fonts.OpenType/FontResolver/DefaultFontResolver.cs b/src/EPPlus.Fonts.OpenType/FontResolver/DefaultFontResolver.cs index ab6a31287..3c5bf0b17 100644 --- a/src/EPPlus.Fonts.OpenType/FontResolver/DefaultFontResolver.cs +++ b/src/EPPlus.Fonts.OpenType/FontResolver/DefaultFontResolver.cs @@ -10,8 +10,10 @@ Date Author Change ************************************************************************************************* 10/07/2025 EPPlus Software AB EPPlus.Fonts.OpenType 1.0 02/26/2026 EPPlus Software AB Removed caching (moved to OpenTypeFonts) + 02/27/2026 EPPlus Software AB Replaced FontResolutionConfig with EpplusFontConfiguration, added Archivo Narrow fallback *************************************************************************************************/ using EPPlus.Fonts.OpenType.Scanner; +using OfficeOpenXml.Interfaces.Fonts; using System.Collections.Generic; using System.IO; using System.Linq; @@ -21,18 +23,18 @@ namespace EPPlus.Fonts.OpenType.FontResolver /// /// Default IFontResolver implementation that resolves fonts from the file system. /// Searches additional font directories and optionally system font directories. - /// Supports fallback font chains via FontResolutionConfig. + /// Supports fallback font chains via EpplusFontConfiguration. /// internal class DefaultFontResolver : IFontResolver { private readonly IEnumerable _fontDirectories; private readonly bool _searchSystemDirectories; - private readonly FontResolutionConfig _config; + private readonly EpplusFontConfiguration _config; public DefaultFontResolver( IEnumerable fontDirectories = null, bool searchSystemDirectories = true, - FontResolutionConfig config = null) + EpplusFontConfiguration config = null) { _fontDirectories = fontDirectories ?? Enumerable.Empty(); _searchSystemDirectories = searchSystemDirectories; @@ -48,7 +50,7 @@ public byte[] ResolveFont(string fontName, FontSubFamily subFamily) if (face != null && face.IsExactMatch) return ReadFontBytes(face.FilePath); - // No exact match — try fallback chain + // No exact match — try user-configured fallback chain if (_config != null) { var fallbacks = _config.GetFallbacks(fontName); @@ -65,7 +67,9 @@ public byte[] ResolveFont(string fontName, FontSubFamily subFamily) } } - return null; + // No match found — fall back to built-in Archivo Narrow. + // Only applies when using DefaultFontResolver (i.e. no custom resolver installed). + return EmbeddedFonts.LoadArchivoNarrow(subFamily).RawData; } private static byte[] ReadFontBytes(string filePath) diff --git a/src/EPPlus.Fonts.OpenType/FontResolver/FontsResolutionConfig.cs b/src/EPPlus.Fonts.OpenType/FontResolver/FontsResolutionConfig.cs deleted file mode 100644 index 4daf79488..000000000 --- a/src/EPPlus.Fonts.OpenType/FontResolver/FontsResolutionConfig.cs +++ /dev/null @@ -1,40 +0,0 @@ -/************************************************************************************************* - Required Notice: Copyright (C) EPPlus Software AB. - This software is licensed under PolyForm Noncommercial License 1.0.0 - and may only be used for noncommercial purposes - https://polyformproject.org/licenses/noncommercial/1.0.0/ - - A commercial license to use this software can be purchased at https://epplussoftware.com - ************************************************************************************************* - Date Author Change - ************************************************************************************************* - 10/07/2025 EPPlus Software AB EPPlus.Fonts.OpenType 1.0 - *************************************************************************************************/ -using System; -using System.Collections.Generic; - -namespace EPPlus.Fonts.OpenType.FontResolver -{ - public class FontResolutionConfig - { - private readonly Dictionary _fallbacks = - new Dictionary(StringComparer.OrdinalIgnoreCase); - - public FontResolutionConfig AddFallback(string primaryFont, params string[] fallbacks) - { - if (string.IsNullOrEmpty(primaryFont)) - throw new ArgumentNullException("primaryFont"); - if (fallbacks == null || fallbacks.Length == 0) - throw new ArgumentException("At least one fallback must be specified", "fallbacks"); - - _fallbacks[primaryFont] = fallbacks; - return this; - } - - internal string[] GetFallbacks(string fontName) - { - string[] result; - return _fallbacks.TryGetValue(fontName, out result) ? result : null; - } - } -} diff --git a/src/EPPlus.Fonts.OpenType/Integration/FragmentPosition.cs b/src/EPPlus.Fonts.OpenType/Integration/FragmentPosition.cs index f20b3cfaa..73c5734d2 100644 --- a/src/EPPlus.Fonts.OpenType/Integration/FragmentPosition.cs +++ b/src/EPPlus.Fonts.OpenType/Integration/FragmentPosition.cs @@ -11,6 +11,7 @@ Date Author Change 01/20/2025 EPPlus Software AB TextLayoutEngine implementation *************************************************************************************************/ using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; namespace EPPlus.Fonts.OpenType.Integration { diff --git a/src/EPPlus.Fonts.OpenType/Integration/OpenTypeFontTextMeasurer.cs b/src/EPPlus.Fonts.OpenType/Integration/OpenTypeFontTextMeasurer.cs index 7852b15ae..5aa8dda49 100644 --- a/src/EPPlus.Fonts.OpenType/Integration/OpenTypeFontTextMeasurer.cs +++ b/src/EPPlus.Fonts.OpenType/Integration/OpenTypeFontTextMeasurer.cs @@ -12,6 +12,7 @@ Date Author Change *************************************************************************************************/ using EPPlus.Fonts.OpenType.TextShaping; using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using System; namespace EPPlus.Fonts.OpenType.Integration diff --git a/src/EPPlus.Fonts.OpenType/Integration/TextFragment.cs b/src/EPPlus.Fonts.OpenType/Integration/TextFragment.cs index 3ac45fba4..6c173acad 100644 --- a/src/EPPlus.Fonts.OpenType/Integration/TextFragment.cs +++ b/src/EPPlus.Fonts.OpenType/Integration/TextFragment.cs @@ -11,6 +11,7 @@ Date Author Change 01/20/2025 EPPlus Software AB TextLayoutEngine implementation *************************************************************************************************/ using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; namespace EPPlus.Fonts.OpenType.Integration { diff --git a/src/EPPlus.Fonts.OpenType/Integration/TextLayoutEngine.Helpers.cs b/src/EPPlus.Fonts.OpenType/Integration/TextLayoutEngine.Helpers.cs index a650eb113..aefc23b45 100644 --- a/src/EPPlus.Fonts.OpenType/Integration/TextLayoutEngine.Helpers.cs +++ b/src/EPPlus.Fonts.OpenType/Integration/TextLayoutEngine.Helpers.cs @@ -1,9 +1,9 @@ -using OfficeOpenXml.Interfaces.Drawing.Text; -using System; +using System; using System.Collections.Generic; using System.Linq; using System.Text; using EPPlus.Fonts.OpenType.Utilities; +using OfficeOpenXml.Interfaces.Fonts; namespace EPPlus.Fonts.OpenType.Integration diff --git a/src/EPPlus.Fonts.OpenType/Integration/TextLayoutEngine.RichText.cs b/src/EPPlus.Fonts.OpenType/Integration/TextLayoutEngine.RichText.cs index 78498120b..060b105e0 100644 --- a/src/EPPlus.Fonts.OpenType/Integration/TextLayoutEngine.RichText.cs +++ b/src/EPPlus.Fonts.OpenType/Integration/TextLayoutEngine.RichText.cs @@ -14,7 +14,7 @@ Date Author Change 02/23/2026 EPPlus Software AB Performance fix: Shape() → ShapeLight() in ProcessFragment *************************************************************************************************/ using EPPlus.Fonts.OpenType.Utilities; -using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Collections.Generic; using System.Text; diff --git a/src/EPPlus.Fonts.OpenType/Integration/TextLayoutEngine.cs b/src/EPPlus.Fonts.OpenType/Integration/TextLayoutEngine.cs index 322a25a54..af04bd38c 100644 --- a/src/EPPlus.Fonts.OpenType/Integration/TextLayoutEngine.cs +++ b/src/EPPlus.Fonts.OpenType/Integration/TextLayoutEngine.cs @@ -17,6 +17,7 @@ Date Author Change using EPPlus.Fonts.OpenType.TextShaping; using EPPlus.Fonts.OpenType.Utilities; using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Collections.Generic; using System.Linq; diff --git a/src/EPPlus.Fonts.OpenType/OpenTypeFonts.cs b/src/EPPlus.Fonts.OpenType/OpenTypeFonts.cs index 741a16445..712fca93d 100644 --- a/src/EPPlus.Fonts.OpenType/OpenTypeFonts.cs +++ b/src/EPPlus.Fonts.OpenType/OpenTypeFonts.cs @@ -1,7 +1,7 @@ /************************************************************************************************* - Required Notice: Copyright (C) EPPlus Software AB. - This software is licensed under PolyForm Noncommercial License 1.0.0 - and may only be used for noncommercial purposes + Required Notice: Copyright (C) EPPlus Software AB. + This software is licensed under PolyForm Noncommercial License 1.0.0 + and may only be used for noncommercial purposes https://polyformproject.org/licenses/noncommercial/1.0.0/ A commercial license to use this software can be purchased at https://epplussoftware.com @@ -12,10 +12,13 @@ Date Author Change 01/10/2026 EPPlus Software AB Fix threading issue with global lock 01/23/2026 EPPlus Software AB Improved thread-safety with per-font locking 02/26/2026 EPPlus Software AB Moved caching from DefaultFontResolver to here + 02/27/2026 EPPlus Software AB Replaced Configure overloads with IEpplusFontConfiguration *************************************************************************************************/ using EPPlus.Fonts.OpenType.FontCache; using EPPlus.Fonts.OpenType.FontResolver; using EPPlus.Fonts.OpenType.Scanner; +using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Collections.Generic; using System.IO; @@ -27,16 +30,72 @@ public static class OpenTypeFonts { private static readonly object _syncRoot = new object(); private static readonly Dictionary _fontLocks = new Dictionary(); - private static volatile IFontResolver _fontResolver = new DefaultFontResolver(); - public static void Configure(IFontResolver resolver) + // Active resolver — replaced on Reset() and SetFontResolver(). + private static volatile IFontResolver _fontResolver; + private static volatile bool _hasCustomResolver; + + // Singleton configuration instance. Internal events wired up in the static constructor. + private static readonly EpplusFontConfiguration _configuration; + + static OpenTypeFonts() { - _fontResolver = resolver ?? throw new ArgumentNullException("resolver"); + _configuration = new EpplusFontConfiguration(); + + _configuration.OnReset += () => + { + _hasCustomResolver = false; + _fontResolver = new DefaultFontResolver(); + ClearFontCache(); + }; + + _configuration.OnSetFontResolver += resolver => + { + _hasCustomResolver = true; + _fontResolver = resolver; + ClearFontCache(); + }; + + // Default resolver — no fallback config yet. + _fontResolver = new DefaultFontResolver(); } - public static void Configure(FontResolutionConfig config) + // ----------------------------------------------------------------------------------------- + // Public API + // ----------------------------------------------------------------------------------------- + + /// + /// The single entry point for configuring font behaviour. + /// Changes are global and persist for the lifetime of the application unless + /// is called inside the lambda. + /// + /// + /// // Simple fallback chain: + /// OpenTypeFonts.Configure(config => + /// { + /// config.AddFallback("Arial", "Helvetica", "Roboto"); + /// }); + /// + /// // Custom resolver (built-in Archivo Narrow fallback is bypassed): + /// OpenTypeFonts.Configure(config => + /// { + /// config.SetFontResolver(new MyDatabaseFontResolver()); + /// }); + /// + /// // Reset to factory defaults: + /// OpenTypeFonts.Configure(config => config.Reset()); + /// + public static void Configure(Action configure) { - _fontResolver = new DefaultFontResolver(config: config); + if (configure == null) + throw new ArgumentNullException("configure"); + + configure(_configuration); + + // If the user did not install a custom resolver via SetFontResolver(), rebuild + // DefaultFontResolver so it picks up any newly added fallback chains. + if (!_hasCustomResolver) + _fontResolver = new DefaultFontResolver(config: _configuration); } /// @@ -53,17 +112,15 @@ public static void ClearFontCache() } } + // ----------------------------------------------------------------------------------------- + // Internal font loading + // ----------------------------------------------------------------------------------------- + /// /// Loads a font by name and subfamily, with thread-safe caching. /// When fontDirectories or searchSystemDirectories are specified, they take precedence /// over the globally configured resolver for this call only — thread-safe. /// - /// Font family name - /// Font subfamily (Regular, Bold, Italic, etc.) - /// Additional directories to search. If null, uses globally configured resolver. - /// Whether to search system font directories - /// If true, bypasses cache and loads font directly - /// Loaded OpenTypeFont or null if not found public static OpenTypeFont LoadFont( string fontName, FontSubFamily subFamily = FontSubFamily.Regular, @@ -71,8 +128,6 @@ public static OpenTypeFont LoadFont( bool searchSystemDirectories = true, bool ignoreCache = false) { - // If caller specifies directories, use a local resolver for this call only. - // This is thread-safe since the resolver is a local variable. var resolver = fontDirectories != null ? new DefaultFontResolver(fontDirectories, searchSystemDirectories) : _fontResolver; @@ -80,7 +135,6 @@ public static OpenTypeFont LoadFont( if (ignoreCache) return ResolveAndCreate(resolver, fontName, subFamily); - // Cache key includes directories to avoid collisions between different resolver configs string lockKey = BuildCacheKey(fontName, subFamily, fontDirectories, searchSystemDirectories); object fontLock; lock (_syncRoot) @@ -114,36 +168,6 @@ public static OpenTypeFont LoadFont( } } - /// - /// Builds a cache key that uniquely identifies a font + resolution config combination. - /// - internal static string BuildCacheKey( - string fontName, - FontSubFamily subFamily, - IEnumerable fontDirectories, - bool searchSystemDirectories) - { - if (fontDirectories == null) - return string.Format("{0}_{1}", fontName, subFamily); - - // Include directories in key to avoid collisions - var dirs = string.Join("|", fontDirectories?.ToArray() ?? new string[] {""}); - return string.Format("{0}_{1}_{2}_{3}", fontName, subFamily, dirs, searchSystemDirectories); - } - - /// - /// Resolves font bytes via the given resolver and creates an OpenTypeFont instance. - /// Font format (TTF/OTF) is detected automatically from the SFNT header. - /// - private static OpenTypeFont ResolveAndCreate(IFontResolver resolver, string fontName, FontSubFamily subFamily) - { - var bytes = resolver.ResolveFont(fontName, subFamily); - if (bytes == null) - return null; - - return new OpenTypeFont(bytes); - } - /// /// Returns all available font faces as fully loaded OpenTypeFont instances. /// Skips corrupt or unreadable fonts, but logs detailed information for diagnostics. @@ -168,7 +192,10 @@ public static List GetAllBaseFontData( if (!string.IsNullOrEmpty(ext)) { ext = ext.ToLowerInvariant(); - var format = (ext == ".otf" || ext == ".cff") ? FontFormat.Otf : FontFormat.Ttf; + var format = (ext == ".otf" || ext == ".cff") + ? FontFormat.Otf + : FontFormat.Ttf; + if (format != formatTarget.Value) continue; } @@ -176,58 +203,73 @@ public static List GetAllBaseFontData( try { - var font = OpenTypeFontFactory.CreateFromFace(face); - if (font != null) - result.Add(font); - else - failures++; - } - catch (Exception ex) when ( - ex is IOException || - ex is UnauthorizedAccessException || - ex is InvalidOperationException || - ex is ArgumentException || - ex is NotSupportedException || - ex is EndOfStreamException) - { - failures++; + var font = new OpenTypeFont(File.ReadAllBytes(face.FilePath)); + font.EnsureFullyLoaded(); + result.Add(font); } catch (Exception ex) { failures++; System.Diagnostics.Debug.WriteLine( - string.Format( - "[OpenTypeFonts] UNEXPECTED ERROR loading font: {0} [TTC offset: {1}]\r\n" + - " Exception: {2}\r\n" + - " Message: {3}\r\n" + - " Stack: {4}", - face.FilePath, - face.OffsetInFile, - ex.GetType().Name, - ex.Message, - ex.StackTrace)); + string.Format("[OpenTypeFonts] Failed to load font: {0} → {1}: {2}", + face.FilePath, ex.GetType().Name, ex.Message)); } } if (failures > 0) - { System.Diagnostics.Debug.WriteLine( - string.Format( - "[OpenTypeFonts] GetAllBaseFontData completed. Loaded {0} fonts, skipped {1} due to errors.", - result.Count, - failures)); - } + string.Format("[OpenTypeFonts] {0} font(s) failed to load.", failures)); return result; } /// - /// Creates an OpenTypeFont from raw font bytes. + /// Creates an OpenTypeFont directly from raw font bytes. /// Font format (TTF/OTF) is detected automatically from the SFNT header. /// + /// Raw TTF/OTF font bytes. + /// A fully loaded OpenTypeFont instance. public static OpenTypeFont GetFromBytes(byte[] bytes) { + if (bytes == null) + throw new ArgumentNullException("bytes"); + + var font = new OpenTypeFont(bytes); + font.EnsureFullyLoaded(); + return font; + } + + // ----------------------------------------------------------------------------------------- + // Internal helpers + // ----------------------------------------------------------------------------------------- + + internal static string BuildCacheKey( + string fontName, + FontSubFamily subFamily, + IEnumerable fontDirectories, + bool searchSystemDirectories) + { + if (fontDirectories == null) + return string.Format("{0}_{1}", fontName, subFamily); + + var dirs = string.Join("|", fontDirectories.ToArray()); + return string.Format("{0}_{1}_{2}_{3}", fontName, subFamily, dirs, searchSystemDirectories); + } + + private static OpenTypeFont ResolveAndCreate(IFontResolver resolver, string fontName, FontSubFamily subFamily) + { + var bytes = resolver.ResolveFont(fontName, subFamily); + if (bytes == null) + return null; + return new OpenTypeFont(bytes); } + + internal static List GetLocationsCollection( + IEnumerable fontDirectories, + bool searchSystemDirectories) + { + return DefaultFontLocations.GetLocationsCollection(fontDirectories, searchSystemDirectories); + } } } \ No newline at end of file diff --git a/src/EPPlus.Fonts.OpenType/Resources/ArchivoNarrow-Bold.ttf b/src/EPPlus.Fonts.OpenType/Resources/ArchivoNarrow-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..05861d99f8cbbc2c6a45ab5965e2a04c30dc8c4c GIT binary patch literal 63640 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 literal 0 HcmV?d00001 diff --git a/src/EPPlus.Fonts.OpenType/Resources/ArchivoNarrow-BoldItalic.ttf b/src/EPPlus.Fonts.OpenType/Resources/ArchivoNarrow-BoldItalic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ab2d419998d191404014dde748db02b8fe13d30b GIT binary patch literal 66284 zcmc${2YeJq(l^}Qvq52%b3j_sV=Y5~|`J`X<)KphjS5?R9?wJ)*2oZ_E zBE*>bhQ@J&n$`-Th6*94jhQle`l4r_j22?zvqI#5GiLhC+S^v&93e#ZAtA!IO`bl) zea7hJ#Jd|(7EYg0GvmuWuLR-#D%@AMtY}_2@`t8_pLc~`r10g8K{sitv;68iVik`JIer!5jh{Q95 zaCEhIwlvSY*L}Yb+Id3QMy+UGyHXn>J^+6z_?;ciD_URw_rVk)f?q-YX)8Osdy4*g zXp|5h=$Blyva5CFGTV7)g5Lpt`yR(0!XUK+7mNHFS1Zc$ zTs7PKvlvfTQ7RV*H+z#<`EQ#L-YLTQD{fG7LQI}GX`HxTh+eN@Te2MD6!KDvQ{iem zE>37Fp;bNbaO9{ET15%yPLYUzC8T^>qRxPeG&}-I2yBxIci?8Ki~=NWM2(9}C> zKf*&=I7%>DOJWabu&@k}2#7?!N`0c)VU>l`2&DN~SdqpiA~;PNcpU0e^_kkIK389= zue2a7SPRiYwJ^w~zg#g^%n%F3O0h{?B({lr#SXDc>=xgMLo!Gv%53S9Bji{)LoSr< za;-c=z9M%kyNXd0)FySFx=P)o?o~U~UiFja)QYs@wdL9w+C|zm+HKl{+Oyg_+85dZ zi^URYNwwr#$}H8E36|NG#g>(p^_EL44_SV+{ALZZ##)`$B5Q+ns&&5gMC+B-8?E

ecSq}^$OsA?*IJondc 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 literal 0 HcmV?d00001 diff --git a/src/EPPlus.Fonts.OpenType/Resources/ArchivoNarrow-Italic.ttf b/src/EPPlus.Fonts.OpenType/Resources/ArchivoNarrow-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..daf0f93f52eb42af4bf4d94401940c7a7c0c1fed GIT binary patch literal 66396 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 literal 0 HcmV?d00001 diff --git a/src/EPPlus.Fonts.OpenType/Resources/ArchivoNarrow-Regular.ttf b/src/EPPlus.Fonts.OpenType/Resources/ArchivoNarrow-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..f1c9c6d934c22a2d35131c2b10757c8139facc26 GIT binary patch literal 63652 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%0D?N`PZMi@*$hP+vY?4EAU!BGk&7- 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�~?mzg&z{Hg}}QUU2yj3tcvgqip+) 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 literal 0 HcmV?d00001 diff --git a/src/EPPlus.Fonts.OpenType/Resources/THIRD_PARTY_LICENSES.txt b/src/EPPlus.Fonts.OpenType/Resources/THIRD_PARTY_LICENSES.txt index 26398079a..787f89b3a 100644 --- a/src/EPPlus.Fonts.OpenType/Resources/THIRD_PARTY_LICENSES.txt +++ b/src/EPPlus.Fonts.OpenType/Resources/THIRD_PARTY_LICENSES.txt @@ -17,4 +17,14 @@ This Font Software is licensed under the SIL Open Font License, Version 1.1. This license is available with a FAQ at: https://openfontlicense.org The font and its source code are available at: -https://github.com/notofonts/math \ No newline at end of file +https://github.com/notofonts/math + +Archivo Narrow Font +Copyright 2011 The Archivo Project Authors (https://github.com/Omnibus-Type/ArchivoNarrow) +Licensed under the SIL Open Font License, Version 1.1 + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is available with a FAQ at: https://openfontlicense.org + +The font and its source code are available at: +https://github.com/Omnibus-Type/ArchivoNarrow \ No newline at end of file diff --git a/src/EPPlus.Fonts.OpenType/Scanner/FontFaceInfo.cs b/src/EPPlus.Fonts.OpenType/Scanner/FontFaceInfo.cs index 4f5db1711..1979c0f95 100644 --- a/src/EPPlus.Fonts.OpenType/Scanner/FontFaceInfo.cs +++ b/src/EPPlus.Fonts.OpenType/Scanner/FontFaceInfo.cs @@ -1,4 +1,5 @@ -using System; +using OfficeOpenXml.Interfaces.Fonts; +using System; using System.Collections.Generic; using System.IO; using System.Linq; diff --git a/src/EPPlus.Fonts.OpenType/Scanner/FontScannerV2.cs b/src/EPPlus.Fonts.OpenType/Scanner/FontScannerV2.cs index 5a7581f10..72c269029 100644 --- a/src/EPPlus.Fonts.OpenType/Scanner/FontScannerV2.cs +++ b/src/EPPlus.Fonts.OpenType/Scanner/FontScannerV2.cs @@ -3,6 +3,7 @@ using System; using System.Linq; using EPPlus.Fonts.OpenType.FontResolver; +using OfficeOpenXml.Interfaces.Fonts; namespace EPPlus.Fonts.OpenType.Scanner { diff --git a/src/EPPlus.Fonts.OpenType/Scanner/FontScannerV2Core.cs b/src/EPPlus.Fonts.OpenType/Scanner/FontScannerV2Core.cs index 8c5474712..8e15b5227 100644 --- a/src/EPPlus.Fonts.OpenType/Scanner/FontScannerV2Core.cs +++ b/src/EPPlus.Fonts.OpenType/Scanner/FontScannerV2Core.cs @@ -1,4 +1,5 @@ using EPPlus.Fonts.OpenType.Tables.Name; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Collections.Generic; using System.IO; diff --git a/src/EPPlus.Fonts.OpenType/Tables/Name/NameTable.cs b/src/EPPlus.Fonts.OpenType/Tables/Name/NameTable.cs index bfd0bbe24..c471f4de6 100644 --- a/src/EPPlus.Fonts.OpenType/Tables/Name/NameTable.cs +++ b/src/EPPlus.Fonts.OpenType/Tables/Name/NameTable.cs @@ -11,6 +11,7 @@ Date Author Change 10/07/2025 EPPlus Software AB EPPlus.Fonts.OpenType 1.0 *************************************************************************************************/ using EPPlus.Fonts.OpenType.FontLocalization; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Collections.Generic; using System.IO; diff --git a/src/EPPlus.Fonts.OpenType/TextShaping/Contextual/ChainingContextualProcessor.cs b/src/EPPlus.Fonts.OpenType/TextShaping/Contextual/ChainingContextualProcessor.cs index 50d370a55..03dfdd15a 100644 --- a/src/EPPlus.Fonts.OpenType/TextShaping/Contextual/ChainingContextualProcessor.cs +++ b/src/EPPlus.Fonts.OpenType/TextShaping/Contextual/ChainingContextualProcessor.cs @@ -15,7 +15,7 @@ Date Author Change using EPPlus.Fonts.OpenType.Tables.Gsub.Data.Lookups; using EPPlus.Fonts.OpenType.TextShaping.Ligatures; using EPPlus.Fonts.OpenType.TextShaping.Substitutions; -using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using System.Collections.Generic; namespace EPPlus.Fonts.OpenType.TextShaping.Contextual diff --git a/src/EPPlus.Fonts.OpenType/TextShaping/Ligatures/LigatureProcessor.cs b/src/EPPlus.Fonts.OpenType/TextShaping/Ligatures/LigatureProcessor.cs index b58f3f750..9ad8d344b 100644 --- a/src/EPPlus.Fonts.OpenType/TextShaping/Ligatures/LigatureProcessor.cs +++ b/src/EPPlus.Fonts.OpenType/TextShaping/Ligatures/LigatureProcessor.cs @@ -13,7 +13,7 @@ Date Author Change using EPPlus.Fonts.OpenType.Tables.Common.Layout.Lookups; using EPPlus.Fonts.OpenType.Tables.Gsub; using EPPlus.Fonts.OpenType.Tables.Gsub.Data.Lookups; -using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using System.Collections.Generic; using System.Linq; diff --git a/src/EPPlus.Fonts.OpenType/TextShaping/Positioning/MarkToBaseProvider.cs b/src/EPPlus.Fonts.OpenType/TextShaping/Positioning/MarkToBaseProvider.cs index 1e5d51cc7..1e6c6568f 100644 --- a/src/EPPlus.Fonts.OpenType/TextShaping/Positioning/MarkToBaseProvider.cs +++ b/src/EPPlus.Fonts.OpenType/TextShaping/Positioning/MarkToBaseProvider.cs @@ -12,7 +12,7 @@ Date Author Change *************************************************************************************************/ using EPPlus.Fonts.OpenType.Tables.Gpos; using EPPlus.Fonts.OpenType.Tables.Gpos.Data.Lookups.LookupType4; -using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using System.Collections.Generic; namespace EPPlus.Fonts.OpenType.TextShaping.Positioning diff --git a/src/EPPlus.Fonts.OpenType/TextShaping/Substitutions/SingleSubstitutionProcessor.cs b/src/EPPlus.Fonts.OpenType/TextShaping/Substitutions/SingleSubstitutionProcessor.cs index 704ccdf01..b3ba88a38 100644 --- a/src/EPPlus.Fonts.OpenType/TextShaping/Substitutions/SingleSubstitutionProcessor.cs +++ b/src/EPPlus.Fonts.OpenType/TextShaping/Substitutions/SingleSubstitutionProcessor.cs @@ -12,7 +12,7 @@ Date Author Change *************************************************************************************************/ using EPPlus.Fonts.OpenType.Tables.Gsub; using EPPlus.Fonts.OpenType.Tables.Gsub.Data.Lookups; -using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using System.Collections.Generic; namespace EPPlus.Fonts.OpenType.TextShaping.Substitutions diff --git a/src/EPPlus.Fonts.OpenType/TextShaping/TextShaper.Vertical.cs b/src/EPPlus.Fonts.OpenType/TextShaping/TextShaper.Vertical.cs index b507e334c..aa0b166f6 100644 --- a/src/EPPlus.Fonts.OpenType/TextShaping/TextShaper.Vertical.cs +++ b/src/EPPlus.Fonts.OpenType/TextShaping/TextShaper.Vertical.cs @@ -11,7 +11,7 @@ Date Author Change 02/19/2026 EPPlus Software AB Vertical text shaping support (Excel rotation 255) Requires TextShaper.cs to be declared as partial *************************************************************************************************/ -using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using System.Collections.Generic; namespace EPPlus.Fonts.OpenType.TextShaping diff --git a/src/EPPlus.Fonts.OpenType/TextShaping/TextShaper.cs b/src/EPPlus.Fonts.OpenType/TextShaping/TextShaper.cs index 2a8d14b30..cf7095a93 100644 --- a/src/EPPlus.Fonts.OpenType/TextShaping/TextShaper.cs +++ b/src/EPPlus.Fonts.OpenType/TextShaping/TextShaper.cs @@ -17,7 +17,7 @@ Date Author Change using EPPlus.Fonts.OpenType.TextShaping.Ligatures; using EPPlus.Fonts.OpenType.TextShaping.Positioning; using EPPlus.Fonts.OpenType.TextShaping.Substitutions; -using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Collections.Generic; diff --git a/src/EPPlus.Fonts.OpenType/TrueTypeMeasurer/DataHolders/TextParagraph.cs b/src/EPPlus.Fonts.OpenType/TrueTypeMeasurer/DataHolders/TextParagraph.cs index 2b7b81170..bf3c40647 100644 --- a/src/EPPlus.Fonts.OpenType/TrueTypeMeasurer/DataHolders/TextParagraph.cs +++ b/src/EPPlus.Fonts.OpenType/TrueTypeMeasurer/DataHolders/TextParagraph.cs @@ -2,6 +2,7 @@ using EPPlus.Fonts.OpenType.Tables.Cmap.Mappings; using EPPlus.Fonts.OpenType.TrueTypeMeasurer.DataHolders; using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Collections; using System.Collections.Generic; diff --git a/src/EPPlus.Fonts.OpenType/TrueTypeMeasurer/FontMeasurerTrueType.cs b/src/EPPlus.Fonts.OpenType/TrueTypeMeasurer/FontMeasurerTrueType.cs index 9ccb8793d..5f85d357b 100644 --- a/src/EPPlus.Fonts.OpenType/TrueTypeMeasurer/FontMeasurerTrueType.cs +++ b/src/EPPlus.Fonts.OpenType/TrueTypeMeasurer/FontMeasurerTrueType.cs @@ -17,6 +17,7 @@ Date Author Change using System.Linq; using EPPlus.Fonts.OpenType.TrueTypeMeasurer; using EPPlus.Fonts.OpenType.TrueTypeMeasurer.DataHolders; +using OfficeOpenXml.Interfaces.Fonts; namespace EPPlus.Fonts.OpenType { diff --git a/src/EPPlus.Fonts.OpenType/TrueTypeMeasurer/TextData.cs b/src/EPPlus.Fonts.OpenType/TrueTypeMeasurer/TextData.cs index ee784698b..d0e40ec8f 100644 --- a/src/EPPlus.Fonts.OpenType/TrueTypeMeasurer/TextData.cs +++ b/src/EPPlus.Fonts.OpenType/TrueTypeMeasurer/TextData.cs @@ -15,7 +15,7 @@ Date Author Change using EPPlus.Fonts.OpenType.Tables.Kern; using EPPlus.Fonts.OpenType.TrueTypeMeasurer; using EPPlus.Fonts.OpenType.TrueTypeMeasurer.DataHolders; -using OfficeOpenXml.Interfaces.Drawing.Text; +using OfficeOpenXml.Interfaces.Fonts; using System; using System.Collections.Generic; using System.Linq; diff --git a/src/EPPlus.Fonts.OpenType/FontSubFamily.cs b/src/EPPlus.Interfaces/Fonts/FontSubFamily.cs similarity index 95% rename from src/EPPlus.Fonts.OpenType/FontSubFamily.cs rename to src/EPPlus.Interfaces/Fonts/FontSubFamily.cs index de5e6f8cb..9c5659cf5 100644 --- a/src/EPPlus.Fonts.OpenType/FontSubFamily.cs +++ b/src/EPPlus.Interfaces/Fonts/FontSubFamily.cs @@ -10,7 +10,7 @@ Date Author Change ************************************************************************************************* 01/15/2025 EPPlus Software AB Initial implementation *************************************************************************************************/ -namespace EPPlus.Fonts.OpenType +namespace OfficeOpenXml.Interfaces.Fonts { public enum FontSubFamily { diff --git a/src/EPPlus.Interfaces/Drawing/Text/GlyphWidth.cs b/src/EPPlus.Interfaces/Fonts/GlyphWidth.cs similarity index 98% rename from src/EPPlus.Interfaces/Drawing/Text/GlyphWidth.cs rename to src/EPPlus.Interfaces/Fonts/GlyphWidth.cs index f7932cc4c..ab4086dfd 100644 --- a/src/EPPlus.Interfaces/Drawing/Text/GlyphWidth.cs +++ b/src/EPPlus.Interfaces/Fonts/GlyphWidth.cs @@ -13,7 +13,7 @@ Date Author Change using System.Diagnostics; using System.Runtime.InteropServices; -namespace OfficeOpenXml.Interfaces.Drawing.Text +namespace OfficeOpenXml.Interfaces.Fonts { ///

/// Lightweight glyph representation optimized for text measurement and wrapping. diff --git a/src/EPPlus.Interfaces/Fonts/IEpplusFontConfiguration.cs b/src/EPPlus.Interfaces/Fonts/IEpplusFontConfiguration.cs new file mode 100644 index 000000000..2359b5639 --- /dev/null +++ b/src/EPPlus.Interfaces/Fonts/IEpplusFontConfiguration.cs @@ -0,0 +1,59 @@ +/************************************************************************************************* + Required Notice: Copyright (C) EPPlus Software AB. + This software is licensed under PolyForm Noncommercial License 1.0.0 + and may only be used for noncommercial purposes + https://polyformproject.org/licenses/noncommercial/1.0.0/ + + A commercial license to use this software can be purchased at https://epplussoftware.com + ************************************************************************************************* + Date Author Change + ************************************************************************************************* + 02/27/2026 EPPlus Software AB Initial implementation + *************************************************************************************************/ +namespace OfficeOpenXml.Interfaces.Fonts +{ + /// + /// Global font configuration for EPPlus. + /// Accessed exclusively via OpenTypeFonts.Configure(Action<IEpplusFontConfiguration>). + /// Changes are global and persist for the lifetime of the application unless + /// is called. + /// + public interface IEpplusFontConfiguration + { + /// + /// Adds a font-name fallback chain. + /// "If Arial is not found, try Helvetica, then Roboto." + /// Additive — does not replace previously added fallbacks for the same font. + /// + /// The font that may be missing. + /// + /// One or more font names to try in order when + /// cannot be resolved. + /// + /// This instance, for fluent chaining. + IEpplusFontConfiguration AddFallback(string primaryFont, params string[] fallbacks); + + /// + /// Replaces the font resolver entirely. + /// The user takes full responsibility for font resolution. + /// EPPlus built-in fallbacks (Archivo Narrow) will NOT be applied. + /// + /// + /// A custom that returns raw TTF/OTF bytes. + /// + /// This instance, for fluent chaining. + IEpplusFontConfiguration SetFontResolver(IFontResolver resolver); + + /// + /// Restores all settings to factory defaults: + /// + /// Clears all font-name fallbacks. + /// Restores DefaultFontResolver (with Archivo Narrow built-in fallback). + /// Restores DefaultFontProvider (with Noto Emoji + Noto Sans Math chain). + /// Clears the font cache. + /// + /// + /// This instance, for fluent chaining. + IEpplusFontConfiguration Reset(); + } +} \ No newline at end of file diff --git a/src/EPPlus.Fonts.OpenType/FontResolver/IFontResolver.cs b/src/EPPlus.Interfaces/Fonts/IFontResolver.cs similarity index 97% rename from src/EPPlus.Fonts.OpenType/FontResolver/IFontResolver.cs rename to src/EPPlus.Interfaces/Fonts/IFontResolver.cs index 9a15757f6..9d71cb4ec 100644 --- a/src/EPPlus.Fonts.OpenType/FontResolver/IFontResolver.cs +++ b/src/EPPlus.Interfaces/Fonts/IFontResolver.cs @@ -11,7 +11,7 @@ Date Author Change 10/07/2025 EPPlus Software AB EPPlus.Fonts.OpenType 1.0 02/26/2026 EPPlus Software AB Simplified to return raw font bytes *************************************************************************************************/ -namespace EPPlus.Fonts.OpenType.FontResolver +namespace OfficeOpenXml.Interfaces.Fonts { /// /// Resolves a font by name and subfamily to raw font bytes. diff --git a/src/EPPlus.Interfaces/Drawing/Text/ITextShaper.cs b/src/EPPlus.Interfaces/Fonts/ITextShaper.cs similarity index 99% rename from src/EPPlus.Interfaces/Drawing/Text/ITextShaper.cs rename to src/EPPlus.Interfaces/Fonts/ITextShaper.cs index 2710f5f96..4a563c0e6 100644 --- a/src/EPPlus.Interfaces/Drawing/Text/ITextShaper.cs +++ b/src/EPPlus.Interfaces/Fonts/ITextShaper.cs @@ -11,7 +11,7 @@ Date Author Change 01/15/2025 EPPlus Software AB Initial implementation *************************************************************************************************/ -namespace OfficeOpenXml.Interfaces.Drawing.Text +namespace OfficeOpenXml.Interfaces.Fonts { /// /// Core text shaping - converts text to positioned glyphs. diff --git a/src/EPPlus.Interfaces/Drawing/Text/ShapedGlyph.cs b/src/EPPlus.Interfaces/Fonts/ShapedGlyph.cs similarity index 99% rename from src/EPPlus.Interfaces/Drawing/Text/ShapedGlyph.cs rename to src/EPPlus.Interfaces/Fonts/ShapedGlyph.cs index 8b59de60f..fe05a6a18 100644 --- a/src/EPPlus.Interfaces/Drawing/Text/ShapedGlyph.cs +++ b/src/EPPlus.Interfaces/Fonts/ShapedGlyph.cs @@ -15,7 +15,7 @@ Date Author Change using System.Diagnostics; using System.Runtime.InteropServices; -namespace OfficeOpenXml.Interfaces.Drawing.Text +namespace OfficeOpenXml.Interfaces.Fonts { /// /// Represents a shaped glyph with positioning information. diff --git a/src/EPPlus.Interfaces/Drawing/Text/ShapedText.cs b/src/EPPlus.Interfaces/Fonts/ShapedText.cs similarity index 98% rename from src/EPPlus.Interfaces/Drawing/Text/ShapedText.cs rename to src/EPPlus.Interfaces/Fonts/ShapedText.cs index a816a550d..24a6b9344 100644 --- a/src/EPPlus.Interfaces/Drawing/Text/ShapedText.cs +++ b/src/EPPlus.Interfaces/Fonts/ShapedText.cs @@ -14,7 +14,7 @@ Date Author Change using System.Diagnostics; using System.Text; -namespace OfficeOpenXml.Interfaces.Drawing.Text +namespace OfficeOpenXml.Interfaces.Fonts { /// /// Result of text shaping operation containing positioned glyphs. diff --git a/src/EPPlus.Interfaces/Drawing/Text/ShapedVerticalText.cs b/src/EPPlus.Interfaces/Fonts/ShapedVerticalText.cs similarity index 98% rename from src/EPPlus.Interfaces/Drawing/Text/ShapedVerticalText.cs rename to src/EPPlus.Interfaces/Fonts/ShapedVerticalText.cs index 6f7081513..5df675f71 100644 --- a/src/EPPlus.Interfaces/Drawing/Text/ShapedVerticalText.cs +++ b/src/EPPlus.Interfaces/Fonts/ShapedVerticalText.cs @@ -12,7 +12,7 @@ Date Author Change *************************************************************************************************/ using System.Diagnostics; -namespace OfficeOpenXml.Interfaces.Drawing.Text +namespace OfficeOpenXml.Interfaces.Fonts { /// /// Result of a vertical text shaping operation containing positioned glyphs. diff --git a/src/EPPlus.Interfaces/Drawing/Text/ShapingOptions.cs b/src/EPPlus.Interfaces/Fonts/ShapingOptions.cs similarity index 99% rename from src/EPPlus.Interfaces/Drawing/Text/ShapingOptions.cs rename to src/EPPlus.Interfaces/Fonts/ShapingOptions.cs index a1d84d37b..a62ca99d7 100644 --- a/src/EPPlus.Interfaces/Drawing/Text/ShapingOptions.cs +++ b/src/EPPlus.Interfaces/Fonts/ShapingOptions.cs @@ -12,7 +12,7 @@ Date Author Change *************************************************************************************************/ using System.Collections.Generic; -namespace OfficeOpenXml.Interfaces.Drawing.Text +namespace OfficeOpenXml.Interfaces.Fonts { /// /// Options for controlling text shaping behavior. diff --git a/src/EPPlus.Interfaces/Drawing/Text/VerticalGlyphHeight.cs b/src/EPPlus.Interfaces/Fonts/VerticalGlyphHeight.cs similarity index 97% rename from src/EPPlus.Interfaces/Drawing/Text/VerticalGlyphHeight.cs rename to src/EPPlus.Interfaces/Fonts/VerticalGlyphHeight.cs index bdd4cb0d6..aae70c5df 100644 --- a/src/EPPlus.Interfaces/Drawing/Text/VerticalGlyphHeight.cs +++ b/src/EPPlus.Interfaces/Fonts/VerticalGlyphHeight.cs @@ -13,7 +13,7 @@ Date Author Change using System.Diagnostics; using System.Runtime.InteropServices; -namespace OfficeOpenXml.Interfaces.Drawing.Text +namespace OfficeOpenXml.Interfaces.Fonts { /// /// Lightweight glyph representation optimized for vertical text measurement. diff --git a/src/EPPlus.Interfaces/Drawing/Text/VerticalShapedGlyph.cs b/src/EPPlus.Interfaces/Fonts/VerticalShapedGlyph.cs similarity index 98% rename from src/EPPlus.Interfaces/Drawing/Text/VerticalShapedGlyph.cs rename to src/EPPlus.Interfaces/Fonts/VerticalShapedGlyph.cs index 7fb6a89a4..5e83a5d57 100644 --- a/src/EPPlus.Interfaces/Drawing/Text/VerticalShapedGlyph.cs +++ b/src/EPPlus.Interfaces/Fonts/VerticalShapedGlyph.cs @@ -12,7 +12,7 @@ Date Author Change *************************************************************************************************/ using System.Diagnostics; -namespace OfficeOpenXml.Interfaces.Drawing.Text +namespace OfficeOpenXml.Interfaces.Fonts { /// /// Represents a shaped glyph with vertical positioning information.