diff --git a/src/UglyToad.PdfPig.Tests/Fonts/TrueType/Parser/TrueTypeFontParserTests.cs b/src/UglyToad.PdfPig.Tests/Fonts/TrueType/Parser/TrueTypeFontParserTests.cs index 87f428d6..db59cc35 100644 --- a/src/UglyToad.PdfPig.Tests/Fonts/TrueType/Parser/TrueTypeFontParserTests.cs +++ b/src/UglyToad.PdfPig.Tests/Fonts/TrueType/Parser/TrueTypeFontParserTests.cs @@ -48,15 +48,15 @@ Assert.Equal(2048, font.TableRegister.HeaderTable.UnitsPerEm); Assert.Equal(2008, font.TableRegister.HeaderTable.Created.Year); - Assert.Equal(10, font.TableRegister.HeaderTable.Created.Month); - Assert.Equal(13, font.TableRegister.HeaderTable.Created.Day); + Assert.Equal(09, font.TableRegister.HeaderTable.Created.Month); + Assert.Equal(12, font.TableRegister.HeaderTable.Created.Day); Assert.Equal(12, font.TableRegister.HeaderTable.Created.Hour); Assert.Equal(29, font.TableRegister.HeaderTable.Created.Minute); Assert.Equal(34, font.TableRegister.HeaderTable.Created.Second); Assert.Equal(2011, font.TableRegister.HeaderTable.Modified.Year); - Assert.Equal(12, font.TableRegister.HeaderTable.Modified.Month); - Assert.Equal(31, font.TableRegister.HeaderTable.Modified.Day); + Assert.Equal(11, font.TableRegister.HeaderTable.Modified.Month); + Assert.Equal(30, font.TableRegister.HeaderTable.Modified.Day); Assert.Equal(5, font.TableRegister.HeaderTable.Modified.Hour); Assert.Equal(13, font.TableRegister.HeaderTable.Modified.Minute); Assert.Equal(10, font.TableRegister.HeaderTable.Modified.Second); @@ -158,6 +158,20 @@ var name = font.Name; Assert.Equal("Andada Regular", name); + + Assert.Equal(1.001999m, font.TableRegister.HeaderTable.Revision); + + Assert.Equal(11, font.TableRegister.HeaderTable.Flags); + + Assert.Equal(1000, font.TableRegister.HeaderTable.UnitsPerEm); + + Assert.Equal(2011, font.TableRegister.HeaderTable.Created.Year); + Assert.Equal(9, font.TableRegister.HeaderTable.Created.Month); + Assert.Equal(30, font.TableRegister.HeaderTable.Created.Day); + + Assert.Equal(2017, font.TableRegister.HeaderTable.Modified.Year); + Assert.Equal(5, font.TableRegister.HeaderTable.Modified.Month); + Assert.Equal(4, font.TableRegister.HeaderTable.Modified.Day); } [Fact] diff --git a/src/UglyToad.PdfPig/Fonts/TrueType/Tables/HeaderTable.cs b/src/UglyToad.PdfPig/Fonts/TrueType/Tables/HeaderTable.cs index 15cc46a0..1cb19e2a 100644 --- a/src/UglyToad.PdfPig/Fonts/TrueType/Tables/HeaderTable.cs +++ b/src/UglyToad.PdfPig/Fonts/TrueType/Tables/HeaderTable.cs @@ -2,6 +2,7 @@ { using System; using Geometry; + using PdfPig.Exceptions; /// /// The 'head' table contains global information about the font. @@ -99,8 +100,26 @@ throw new InvalidOperationException($"The units per em for this TrueType font was incorrect, value should be between 16 and 16384 but found {unitsPerEm} istead."); } - var created = data.ReadInternationalDate(); - var modified = data.ReadInternationalDate(); + DateTime created; + try + { + created = data.ReadInternationalDate(); + } + catch (PdfDocumentFormatException) + { + created = DateTime.MinValue; + } + + DateTime modified; + try + { + modified = data.ReadInternationalDate(); + } + catch (PdfDocumentFormatException) + { + modified = DateTime.MinValue; + } + var xMin = data.ReadSignedShort(); var yMin = data.ReadSignedShort(); var xMax = data.ReadSignedShort(); diff --git a/src/UglyToad.PdfPig/Fonts/TrueType/TrueTypeDataBytes.cs b/src/UglyToad.PdfPig/Fonts/TrueType/TrueTypeDataBytes.cs index 7e24d9e4..70ae6d99 100644 --- a/src/UglyToad.PdfPig/Fonts/TrueType/TrueTypeDataBytes.cs +++ b/src/UglyToad.PdfPig/Fonts/TrueType/TrueTypeDataBytes.cs @@ -4,6 +4,7 @@ using System.IO; using System.Text; using IO; + using PdfPig.Exceptions; internal class TrueTypeDataBytes { @@ -99,25 +100,28 @@ public long ReadLong() { - ReadBuffered(internalBuffer, 8); - - var result = FromBytes(internalBuffer, 0, 8); - + var upper = (long)ReadSignedInt(); + var lower = ReadSignedInt(); + var result = (upper << 32) + (lower & 0xFFFFFFFF); return result; } public DateTime ReadInternationalDate() { - // TODO: this returns the wrong value, investigate... - long secondsSince1904 = ReadLong(); + var secondsSince1904 = ReadLong(); var date = new DateTime(1904, 1, 1, 0, 0, 0, DateTimeKind.Utc); - var result = date.AddSeconds(secondsSince1904); - result = result.AddMonths(1); - result = result.AddDays(1); + try + { + var result = date.AddSeconds(secondsSince1904); - return result; + return result; + } + catch (ArgumentOutOfRangeException) + { + throw new PdfDocumentFormatException($"Invalid date offset ({secondsSince1904} seconds) encountered in TrueType header table."); + } } public void Seek(long position) @@ -125,17 +129,6 @@ inputBytes.Seek(position); } - private long FromBytes(byte[] buffer, int startIndex, int bytesToConvert) - { - long ret = 0; - for (int i = 0; i < bytesToConvert; i++) - { - ret = unchecked((ret << 8) | buffer[startIndex + i]); - } - - return ret; - } - public int ReadSignedByte() { ReadBuffered(internalBuffer, 1);