diff --git a/src/UglyToad.PdfPig/Fonts/CharacterPath.cs b/src/UglyToad.PdfPig/Fonts/CharacterPath.cs index f9a4cfb3..9714e6c9 100644 --- a/src/UglyToad.PdfPig/Fonts/CharacterPath.cs +++ b/src/UglyToad.PdfPig/Fonts/CharacterPath.cs @@ -146,7 +146,7 @@ namespace UglyToad.PdfPig.Fonts var path = $""; var bboxRect = bbox.HasValue ? BboxToRect(bbox.Value, "yellow") : string.Empty; var others = string.Join(" ", bboxes.Select(x => BboxToRect(x, "gray"))); - var result = $"{path} {bboxRect} {others}"; + var result = $"{path} {bboxRect} {others}"; return result; } diff --git a/src/UglyToad.PdfPig/Fonts/CompactFontFormat/CharStrings/Type2CharStringParser.cs b/src/UglyToad.PdfPig/Fonts/CompactFontFormat/CharStrings/Type2CharStringParser.cs index 71673706..add75f02 100644 --- a/src/UglyToad.PdfPig/Fonts/CompactFontFormat/CharStrings/Type2CharStringParser.cs +++ b/src/UglyToad.PdfPig/Fonts/CompactFontFormat/CharStrings/Type2CharStringParser.cs @@ -2,6 +2,7 @@ { using System; using System.Collections.Generic; + using Charsets; using Geometry; using Util; using Util.JetBrains.Annotations; @@ -118,22 +119,25 @@ */ var isOdd = ctx.Stack.Length % 2 != 0; - var dx1 = ctx.Stack.PopBottom(); - ctx.AddRelativeHorizontalLine(dx1); + var numberOfAdditionalLines = ctx.Stack.Length - (isOdd ? 1 : 0); - var numberOfAdditionalLines = ctx.Stack.Length; - for (var i = 0; i < numberOfAdditionalLines; i++) + if (isOdd) { - var isDeltaY = (isOdd && i % 2 == 0) || (!isOdd && i % 2 != 0); - if (isDeltaY) + var dx1 = ctx.Stack.PopBottom(); + ctx.AddRelativeHorizontalLine(dx1); + + for (var i = 0; i < numberOfAdditionalLines; i+= 2) { - var dya = ctx.Stack.PopBottom(); - ctx.AddRelativeVerticalLine(dya); + ctx.AddRelativeVerticalLine(ctx.Stack.PopBottom()); + ctx.AddRelativeHorizontalLine(ctx.Stack.PopBottom()); } - else + } + else + { + for (var i = 0; i < numberOfAdditionalLines; i+= 2) { - var dxa = ctx.Stack.PopBottom(); - ctx.AddRelativeHorizontalLine(dxa); + ctx.AddRelativeHorizontalLine(ctx.Stack.PopBottom()); + ctx.AddRelativeVerticalLine(ctx.Stack.PopBottom()); } } @@ -145,23 +149,25 @@ { var isOdd = ctx.Stack.Length % 2 != 0; + var numberOfAdditionalLines = ctx.Stack.Length - (isOdd ? 1 : 0); + + if (isOdd) + { var dy1 = ctx.Stack.PopBottom(); ctx.AddRelativeVerticalLine(dy1); - var numberOfAdditionalLines = ctx.Stack.Length; - for (var i = 0; i < numberOfAdditionalLines; i++) - { - var isDeltaY = (isOdd && i % 2 != 0) || (!isOdd && i % 2 == 0); - - if (isDeltaY) + for (var i = 0; i < numberOfAdditionalLines; i+=2) { - var dya = ctx.Stack.PopBottom(); - ctx.AddRelativeVerticalLine(dya); + ctx.AddRelativeHorizontalLine(ctx.Stack.PopBottom()); + ctx.AddRelativeVerticalLine(ctx.Stack.PopBottom()); } - else + } + else + { + for (var i = 0; i < numberOfAdditionalLines; i+=2) { - var dxa = ctx.Stack.PopBottom(); - ctx.AddRelativeHorizontalLine(dxa); + ctx.AddRelativeVerticalLine(ctx.Stack.PopBottom()); + ctx.AddRelativeHorizontalLine(ctx.Stack.PopBottom()); } } @@ -673,7 +679,7 @@ public static Type2CharStrings Parse([NotNull] IReadOnlyList> charStringBytes, [NotNull] CompactFontFormatIndex localSubroutines, - [NotNull] CompactFontFormatIndex globalSubroutines) + [NotNull] CompactFontFormatIndex globalSubroutines, ICompactFontFormatCharset charset) { if (charStringBytes == null) { @@ -690,12 +696,12 @@ throw new ArgumentNullException(nameof(globalSubroutines)); } - var charStrings = new Dictionary(); + var charStrings = new Dictionary(); for (var i = 0; i < charStringBytes.Count; i++) { var charString = charStringBytes[i]; var sequence = ParseSingle(charString); - charStrings[i] = new Type2CharStrings.CommandSequence(sequence); + charStrings[charset.GetNameByGlyphId(i)] = new Type2CharStrings.CommandSequence(sequence); } return new Type2CharStrings(charStrings, new Dictionary()); diff --git a/src/UglyToad.PdfPig/Fonts/CompactFontFormat/CharStrings/Type2CharStrings.cs b/src/UglyToad.PdfPig/Fonts/CompactFontFormat/CharStrings/Type2CharStrings.cs index 09d4ea3f..26af913d 100644 --- a/src/UglyToad.PdfPig/Fonts/CompactFontFormat/CharStrings/Type2CharStrings.cs +++ b/src/UglyToad.PdfPig/Fonts/CompactFontFormat/CharStrings/Type2CharStrings.cs @@ -10,11 +10,11 @@ private readonly object locker = new object(); private readonly Dictionary glyphs = new Dictionary(); - public IReadOnlyDictionary CharStrings { get; } + public IReadOnlyDictionary CharStrings { get; } public IReadOnlyDictionary Subroutines { get; } - public Type2CharStrings(IReadOnlyDictionary charStrings, IReadOnlyDictionary subroutines) + public Type2CharStrings(IReadOnlyDictionary charStrings, IReadOnlyDictionary subroutines) { CharStrings = charStrings ?? throw new ArgumentNullException(nameof(charStrings)); Subroutines = subroutines ?? throw new ArgumentNullException(nameof(subroutines)); @@ -30,7 +30,7 @@ return result; } - if (!CharStrings.TryGetValue(0, out var sequence)) + if (!CharStrings.TryGetValue(name, out var sequence)) { throw new InvalidOperationException($"No charstring sequence with the name /{name} in this font."); } diff --git a/src/UglyToad.PdfPig/Fonts/CompactFontFormat/Charsets/CompactFontFormatCharset.cs b/src/UglyToad.PdfPig/Fonts/CompactFontFormat/Charsets/CompactFontFormatCharset.cs index f47c625f..088288ad 100644 --- a/src/UglyToad.PdfPig/Fonts/CompactFontFormat/Charsets/CompactFontFormatCharset.cs +++ b/src/UglyToad.PdfPig/Fonts/CompactFontFormat/Charsets/CompactFontFormatCharset.cs @@ -29,7 +29,7 @@ public virtual string GetNameByGlyphId(int glyphId) { - throw new NotImplementedException(); + return GlyphIdToStringIdAndName[glyphId].name; } public virtual string GetNameByStringId(int stringId) diff --git a/src/UglyToad.PdfPig/Fonts/CompactFontFormat/Charsets/CompactFontFormatExpertCharset.cs b/src/UglyToad.PdfPig/Fonts/CompactFontFormat/Charsets/CompactFontFormatExpertCharset.cs index 30ed348a..36a57990 100644 --- a/src/UglyToad.PdfPig/Fonts/CompactFontFormat/Charsets/CompactFontFormatExpertCharset.cs +++ b/src/UglyToad.PdfPig/Fonts/CompactFontFormat/Charsets/CompactFontFormatExpertCharset.cs @@ -195,7 +195,7 @@ public string GetNameByGlyphId(int glyphId) { - throw new System.NotImplementedException(); + return characterIdToStringIdAndName[glyphId].Value; } public string GetNameByStringId(int stringId) diff --git a/src/UglyToad.PdfPig/Fonts/CompactFontFormat/Charsets/CompactFontFormatExpertSubsetCharset.cs b/src/UglyToad.PdfPig/Fonts/CompactFontFormat/Charsets/CompactFontFormatExpertSubsetCharset.cs index 994f6b19..ca71e4d4 100644 --- a/src/UglyToad.PdfPig/Fonts/CompactFontFormat/Charsets/CompactFontFormatExpertSubsetCharset.cs +++ b/src/UglyToad.PdfPig/Fonts/CompactFontFormat/Charsets/CompactFontFormatExpertSubsetCharset.cs @@ -116,7 +116,7 @@ public string GetNameByGlyphId(int glyphId) { - throw new System.NotImplementedException(); + return characterIdToStringIdAndName[glyphId].Value; } public string GetNameByStringId(int stringId) diff --git a/src/UglyToad.PdfPig/Fonts/CompactFontFormat/Charsets/CompactFontFormatIsoAdobeCharset.cs b/src/UglyToad.PdfPig/Fonts/CompactFontFormat/Charsets/CompactFontFormatIsoAdobeCharset.cs index 32ca5c82..850662fc 100644 --- a/src/UglyToad.PdfPig/Fonts/CompactFontFormat/Charsets/CompactFontFormatIsoAdobeCharset.cs +++ b/src/UglyToad.PdfPig/Fonts/CompactFontFormat/Charsets/CompactFontFormatIsoAdobeCharset.cs @@ -258,7 +258,7 @@ public string GetNameByGlyphId(int glyphId) { - throw new System.NotImplementedException(); + return characterIdToStringIdAndName[glyphId].Value; } public string GetNameByStringId(int stringId) diff --git a/src/UglyToad.PdfPig/Fonts/CompactFontFormat/CompactFontFormatIndividualFontParser.cs b/src/UglyToad.PdfPig/Fonts/CompactFontFormat/CompactFontFormatIndividualFontParser.cs index 2c305c53..df857c44 100644 --- a/src/UglyToad.PdfPig/Fonts/CompactFontFormat/CompactFontFormatIndividualFontParser.cs +++ b/src/UglyToad.PdfPig/Fonts/CompactFontFormat/CompactFontFormatIndividualFontParser.cs @@ -3,7 +3,9 @@ using System; using System.Collections.Generic; using System.Diagnostics; + using System.IO; using System.Linq; + using System.Text; using Charsets; using CharStrings; using Dictionaries; @@ -108,12 +110,11 @@ var numberInRange = format == 1 ? data.ReadCard8() : data.ReadCard16(); glyphToNamesAndStringId.Add((glyphId, firstSid, ReadString(firstSid, stringIndex))); - glyphId++; for (var i = 0; i < numberInRange; i++) { + glyphId++; var sid = firstSid + i + 1; glyphToNamesAndStringId.Add((glyphId, sid, ReadString(sid, stringIndex))); - glyphId++; } } @@ -142,7 +143,7 @@ case CompactFontFormatCharStringType.Type1: throw new NotImplementedException(); case CompactFontFormatCharStringType.Type2: - charStrings = Type2CharStringParser.Parse(charStringIndex, localSubroutines, globalSubroutineIndex); + charStrings = Type2CharStringParser.Parse(charStringIndex, localSubroutines, globalSubroutineIndex, charset); break; default: throw new ArgumentOutOfRangeException($"Unexpected CharString type in CFF font: {topDictionary.CharStringType}."); @@ -150,11 +151,17 @@ if (Debugger.IsAttached) { + var builder = new StringBuilder(""); foreach (var pair in charStrings.CharStrings) { var path = Type2CharStrings.Run(pair.Value); var svg = path.ToFullSvg(); + builder.AppendLine(svg); } + + builder.Append(""); + + File.WriteAllText(@"C:\git\index.html", builder.ToString()); } return new CompactFontFormatFont(topDictionary, privateDictionary, charset, Union.Two(charStrings));