diff --git a/src/UglyToad.PdfPig/Fonts/Type1/CharStrings/Commands/StartFinishOutline/SeacCommand.cs b/src/UglyToad.PdfPig/Fonts/Type1/CharStrings/Commands/StartFinishOutline/SeacCommand.cs index 4d67784d..d821204f 100644 --- a/src/UglyToad.PdfPig/Fonts/Type1/CharStrings/Commands/StartFinishOutline/SeacCommand.cs +++ b/src/UglyToad.PdfPig/Fonts/Type1/CharStrings/Commands/StartFinishOutline/SeacCommand.cs @@ -1,5 +1,7 @@ namespace UglyToad.PdfPig.Fonts.Type1.CharStrings.Commands.StartFinishOutline { + using Encodings; + /// /// Standard encoding accented character. /// Makes an accented character from two other characters in the font program. @@ -21,11 +23,15 @@ var accentLeftSidebearingX = context.Stack.PopBottom(); var accentOriginX = context.Stack.PopBottom(); var accentOriginY = context.Stack.PopBottom(); - var baseCharacterCode = context.Stack.PopBottom(); - var accentCharacterCode = context.Stack.PopBottom(); + var baseCharacterCode = (int)context.Stack.PopBottom(); + var accentCharacterCode = (int)context.Stack.PopBottom(); - var baseCharacter = context.GetCharacter((int)baseCharacterCode); - var accentCharacter = context.GetCharacter((int) accentCharacterCode); + // Both bchar and achar are codes that these characters are assigned in the Adobe StandardEncoding vector + var baseCharacterName = StandardEncoding.Instance.CodeToNameMap[baseCharacterCode]; + var accentCharacterName = StandardEncoding.Instance.CodeToNameMap[accentCharacterCode]; + + var baseCharacter = context.GetCharacter(baseCharacterName); + var accentCharacter = context.GetCharacter(accentCharacterName); // TODO: full seac implementation. context.SetPath(baseCharacter); diff --git a/src/UglyToad.PdfPig/Fonts/Type1/CharStrings/Commands/Type1BuildCharContext.cs b/src/UglyToad.PdfPig/Fonts/Type1/CharStrings/Commands/Type1BuildCharContext.cs index 29939308..23d69207 100644 --- a/src/UglyToad.PdfPig/Fonts/Type1/CharStrings/Commands/Type1BuildCharContext.cs +++ b/src/UglyToad.PdfPig/Fonts/Type1/CharStrings/Commands/Type1BuildCharContext.cs @@ -8,6 +8,7 @@ internal class Type1BuildCharContext { private readonly Func characterByIndexFactory; + private readonly Func characterByNameFactory; public IReadOnlyDictionary Subroutines { get; } public decimal WidthX { get; set; } @@ -32,9 +33,11 @@ public IReadOnlyList FlexPoints { get; } public Type1BuildCharContext(IReadOnlyDictionary subroutines, - Func characterByIndexFactory) + Func characterByIndexFactory, + Func characterByNameFactory) { this.characterByIndexFactory = characterByIndexFactory ?? throw new ArgumentNullException(nameof(characterByIndexFactory)); + this.characterByNameFactory = characterByNameFactory ?? throw new ArgumentNullException(nameof(characterByNameFactory)); Subroutines = subroutines ?? throw new ArgumentNullException(nameof(subroutines)); } @@ -48,6 +51,11 @@ return characterByIndexFactory(characterCode); } + public PdfPath GetCharacter(string characterName) + { + return characterByNameFactory(characterName); + } + public void SetPath(PdfPath path) { Path = path ?? throw new ArgumentNullException(nameof(path)); diff --git a/src/UglyToad.PdfPig/Fonts/Type1/CharStrings/Type1CharStrings.cs b/src/UglyToad.PdfPig/Fonts/Type1/CharStrings/Type1CharStrings.cs index aa88f969..201a64db 100644 --- a/src/UglyToad.PdfPig/Fonts/Type1/CharStrings/Type1CharStrings.cs +++ b/src/UglyToad.PdfPig/Fonts/Type1/CharStrings/Type1CharStrings.cs @@ -17,7 +17,7 @@ public IReadOnlyDictionary Subroutines { get; } - public Type1CharStrings(IReadOnlyDictionary charStrings, IReadOnlyDictionary charStringIndexToName, + public Type1CharStrings(IReadOnlyDictionary charStrings, IReadOnlyDictionary charStringIndexToName, IReadOnlyDictionary subroutines) { this.charStringIndexToName = charStringIndexToName ?? throw new ArgumentNullException(nameof(charStringIndexToName)); @@ -71,8 +71,26 @@ glyphs[name] = path; + return path; + }, s => + { + if (glyphs.TryGetValue(s, out var result)) + { + return result; + } + + if (!CharStrings.TryGetValue(s, out var charstring)) + { + throw new InvalidOperationException($"Tried to retrieve Type 1 charstring by name {s} but it was not found in the charstrings."); + } + + var path = Run(charstring); + + glyphs[s] = path; + return path; }); + foreach (var command in sequence.Commands) { command.Match(x => context.Stack.Push(x),