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 = $"";
+ var result = $"";
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));