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; }
- }
-}