From 1a213caf26726a0365c059c5e17b7932a3d4a591 Mon Sep 17 00:00:00 2001 From: Eliot Jones Date: Sun, 29 Apr 2018 15:15:11 +0100 Subject: [PATCH] start adding kerning table as a break from compact font format --- .../Fonts/TrueType/Parser/TableRegister.cs | 2 ++ .../TrueType/Parser/TrueTypeFontParser.cs | 8 ++++-- .../TrueType/Tables/Kerning/KernCoverage.cs | 26 +++++++++++++++++ .../Fonts/TrueType/Tables/KerningTable.cs | 28 +++++++++++++++++++ src/UglyToad.PdfPig/ICosUpdateInfo.cs | 7 ----- 5 files changed, 62 insertions(+), 9 deletions(-) create mode 100644 src/UglyToad.PdfPig/Fonts/TrueType/Tables/Kerning/KernCoverage.cs create mode 100644 src/UglyToad.PdfPig/Fonts/TrueType/Tables/KerningTable.cs delete mode 100644 src/UglyToad.PdfPig/ICosUpdateInfo.cs diff --git a/src/UglyToad.PdfPig/Fonts/TrueType/Parser/TableRegister.cs b/src/UglyToad.PdfPig/Fonts/TrueType/Parser/TableRegister.cs index b0da31be..b997bc80 100644 --- a/src/UglyToad.PdfPig/Fonts/TrueType/Parser/TableRegister.cs +++ b/src/UglyToad.PdfPig/Fonts/TrueType/Parser/TableRegister.cs @@ -27,5 +27,7 @@ /// Where a character code isn't found it should map to index 0. /// public CMapTable CMapTable { get; set; } + + public KerningTable KerningTable { get; set; } } } diff --git a/src/UglyToad.PdfPig/Fonts/TrueType/Parser/TrueTypeFontParser.cs b/src/UglyToad.PdfPig/Fonts/TrueType/Parser/TrueTypeFontParser.cs index ede11ee6..d9d8b255 100644 --- a/src/UglyToad.PdfPig/Fonts/TrueType/Parser/TrueTypeFontParser.cs +++ b/src/UglyToad.PdfPig/Fonts/TrueType/Parser/TrueTypeFontParser.cs @@ -88,7 +88,7 @@ { tableRegister.PostScriptTable = PostScriptTable.Load(data, table, tableRegister.MaximumProfileTable); } - + if (!isPostScript) { if (!tables.TryGetValue(TrueTypeHeaderTable.Loca, out var indexToLocationHeaderTable)) @@ -102,7 +102,7 @@ if (!tables.TryGetValue(TrueTypeHeaderTable.Glyf, out var glyphHeaderTable)) { - throw new InvalidOperationException("The glpyh table is required for non-PostScript fonts."); + throw new InvalidOperationException("The glyph table is required for non-PostScript fonts."); } // glyf @@ -137,6 +137,10 @@ // os2 // kern + if (tables.TryGetValue(TrueTypeHeaderTable.Kern, out var kernHeaderTable)) + { + tableRegister.KerningTable = KerningTable.Load(data, kernHeaderTable); + } } } } diff --git a/src/UglyToad.PdfPig/Fonts/TrueType/Tables/Kerning/KernCoverage.cs b/src/UglyToad.PdfPig/Fonts/TrueType/Tables/Kerning/KernCoverage.cs new file mode 100644 index 00000000..2418fda6 --- /dev/null +++ b/src/UglyToad.PdfPig/Fonts/TrueType/Tables/Kerning/KernCoverage.cs @@ -0,0 +1,26 @@ +namespace UglyToad.PdfPig.Fonts.TrueType.Tables.Kerning +{ + using System; + + [Flags] + internal enum KernCoverage + { + /// + /// The table is horizontal kerning data. + /// + Horizontal = 1, + /// + /// The table has minimum values rather than kerning values. + /// + Minimum = 1 << 1, + /// + /// Kerning is perpendicular to the flow of text. + /// If text is horizontal kerning will be in the up/down direction. + /// + CrossStream = 1 << 2, + /// + /// The value in this sub table should replace the currently accumulated value. + /// + Override = 1 << 3 + } +} diff --git a/src/UglyToad.PdfPig/Fonts/TrueType/Tables/KerningTable.cs b/src/UglyToad.PdfPig/Fonts/TrueType/Tables/KerningTable.cs new file mode 100644 index 00000000..be76d077 --- /dev/null +++ b/src/UglyToad.PdfPig/Fonts/TrueType/Tables/KerningTable.cs @@ -0,0 +1,28 @@ +namespace UglyToad.PdfPig.Fonts.TrueType.Tables +{ + using Kerning; + + internal class KerningTable + { + public static KerningTable Load(TrueTypeDataBytes data, TrueTypeHeaderTable headerTable) + { + data.Seek(headerTable.Offset); + + var version = data.ReadUnsignedShort(); + + var numberOfSubtables = data.ReadUnsignedShort(); + + for (var i = 0; i < numberOfSubtables; i++) + { + var subtableVersion = data.ReadUnsignedShort(); + var subtableLength = data.ReadUnsignedShort(); + var coverage = data.ReadUnsignedShort(); + + var kernCoverage = (KernCoverage) coverage; + var format = ((coverage & 255) >> 8); + } + + return new KerningTable(); + } + } +} diff --git a/src/UglyToad.PdfPig/ICosUpdateInfo.cs b/src/UglyToad.PdfPig/ICosUpdateInfo.cs deleted file mode 100644 index 7d8e33a9..00000000 --- a/src/UglyToad.PdfPig/ICosUpdateInfo.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace UglyToad.PdfPig -{ - internal interface ICosUpdateInfo - { - bool NeedsToBeUpdated { get; set; } - } -}