From 8d591ca913ebb67fd8be623de7240992c9498f2f Mon Sep 17 00:00:00 2001 From: Eliot Jones Date: Mon, 16 Apr 2018 23:58:27 +0100 Subject: [PATCH] fix bounding boxes for type 0 truetype fonts --- src/UglyToad.PdfPig/Fonts/CidFonts/ICidFontProgram.cs | 2 ++ src/UglyToad.PdfPig/Fonts/CidFonts/Type2CidFont.cs | 2 +- src/UglyToad.PdfPig/Fonts/Composite/Type0Font.cs | 8 +++++--- src/UglyToad.PdfPig/Fonts/Simple/TrueTypeSimpleFont.cs | 2 +- src/UglyToad.PdfPig/Fonts/TrueType/TrueTypeFont.cs | 5 +++++ 5 files changed, 14 insertions(+), 5 deletions(-) diff --git a/src/UglyToad.PdfPig/Fonts/CidFonts/ICidFontProgram.cs b/src/UglyToad.PdfPig/Fonts/CidFonts/ICidFontProgram.cs index 739f586c..23b7ab5f 100644 --- a/src/UglyToad.PdfPig/Fonts/CidFonts/ICidFontProgram.cs +++ b/src/UglyToad.PdfPig/Fonts/CidFonts/ICidFontProgram.cs @@ -13,5 +13,7 @@ bool TryGetBoundingBox(int characterCode, Func characterIdentifierToGlyphIndex, out PdfRectangle boundingBox); bool TryGetBoundingAdvancedWidth(int characterCode, out decimal width); + + int GetFontMatrixMultiplier(); } } diff --git a/src/UglyToad.PdfPig/Fonts/CidFonts/Type2CidFont.cs b/src/UglyToad.PdfPig/Fonts/CidFonts/Type2CidFont.cs index 7211dc8f..fe693300 100644 --- a/src/UglyToad.PdfPig/Fonts/CidFonts/Type2CidFont.cs +++ b/src/UglyToad.PdfPig/Fonts/CidFonts/Type2CidFont.cs @@ -42,7 +42,7 @@ this.cidToGid = cidToGid; // TODO: This should maybe take units per em into account? - var scale = 1 / 1000m; + var scale = 1 / (decimal)(fontProgram?.GetFontMatrixMultiplier() ?? 1000); FontMatrix = TransformationMatrix.FromValues(scale, 0, 0, scale, 0, 0); } diff --git a/src/UglyToad.PdfPig/Fonts/Composite/Type0Font.cs b/src/UglyToad.PdfPig/Fonts/Composite/Type0Font.cs index 3702d8a8..c36dd898 100644 --- a/src/UglyToad.PdfPig/Fonts/Composite/Type0Font.cs +++ b/src/UglyToad.PdfPig/Fonts/Composite/Type0Font.cs @@ -30,8 +30,6 @@ public bool IsVertical => CMap.WritingMode == WritingMode.Vertical; - private readonly TransformationMatrix fontMatrix = TransformationMatrix.FromValues(0.001m, 0, 0, 0.001m, 0, 0); - public Type0Font(NameToken baseFont, ICidFont cidFont, CMap cmap, CMap toUnicodeCMap) { BaseFont = baseFont ?? throw new ArgumentNullException(nameof(baseFont)); @@ -73,7 +71,11 @@ public PdfRectangle GetBoundingBox(int characterCode) { - return fontMatrix.Transform(GetBoundingBoxInGlyphSpace(characterCode)); + var matrix = GetFontMatrix(); + + var boundingBox = GetBoundingBoxInGlyphSpace(characterCode); + + return matrix.Transform(boundingBox); } public decimal GetWidth(int characterCode) diff --git a/src/UglyToad.PdfPig/Fonts/Simple/TrueTypeSimpleFont.cs b/src/UglyToad.PdfPig/Fonts/Simple/TrueTypeSimpleFont.cs index 74c07cc9..48e9f9cc 100644 --- a/src/UglyToad.PdfPig/Fonts/Simple/TrueTypeSimpleFont.cs +++ b/src/UglyToad.PdfPig/Fonts/Simple/TrueTypeSimpleFont.cs @@ -137,7 +137,7 @@ namespace UglyToad.PdfPig.Fonts.Simple if (font?.HeaderTable != null) { - scale = font.HeaderTable.UnitsPerEm; + scale = font.GetFontMatrixMultiplier(); } return TransformationMatrix.FromValues(1m / scale, 0, 0, 1m / scale, 0, 0); diff --git a/src/UglyToad.PdfPig/Fonts/TrueType/TrueTypeFont.cs b/src/UglyToad.PdfPig/Fonts/TrueType/TrueTypeFont.cs index 8c06ecab..f6de8d3f 100644 --- a/src/UglyToad.PdfPig/Fonts/TrueType/TrueTypeFont.cs +++ b/src/UglyToad.PdfPig/Fonts/TrueType/TrueTypeFont.cs @@ -69,6 +69,11 @@ return TryGetBoundingAdvancedWidthByIndex(index, out width); } + public int GetFontMatrixMultiplier() + { + return HeaderTable?.UnitsPerEm ?? 1000; + } + private bool TryGetBoundingAdvancedWidthByIndex(int index, out decimal width) { width = TableRegister.HorizontalMetricsTable.GetAdvanceWidth(index);