mirror of
https://github.com/UglyToad/PdfPig.git
synced 2025-10-15 19:54:52 +08:00
use standardencoding name for seac command in type 1 charstrings
This commit is contained in:
@@ -1,5 +1,7 @@
|
||||
namespace UglyToad.PdfPig.Fonts.Type1.CharStrings.Commands.StartFinishOutline
|
||||
{
|
||||
using Encodings;
|
||||
|
||||
/// <summary>
|
||||
/// 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);
|
||||
|
@@ -8,6 +8,7 @@
|
||||
internal class Type1BuildCharContext
|
||||
{
|
||||
private readonly Func<int, PdfPath> characterByIndexFactory;
|
||||
private readonly Func<string, PdfPath> characterByNameFactory;
|
||||
public IReadOnlyDictionary<int, Type1CharStrings.CommandSequence> Subroutines { get; }
|
||||
|
||||
public decimal WidthX { get; set; }
|
||||
@@ -32,9 +33,11 @@
|
||||
public IReadOnlyList<PdfPoint> FlexPoints { get; }
|
||||
|
||||
public Type1BuildCharContext(IReadOnlyDictionary<int, Type1CharStrings.CommandSequence> subroutines,
|
||||
Func<int, PdfPath> characterByIndexFactory)
|
||||
Func<int, PdfPath> characterByIndexFactory,
|
||||
Func<string, PdfPath> 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));
|
||||
|
@@ -17,7 +17,7 @@
|
||||
|
||||
public IReadOnlyDictionary<int, CommandSequence> Subroutines { get; }
|
||||
|
||||
public Type1CharStrings(IReadOnlyDictionary<string, CommandSequence> charStrings, IReadOnlyDictionary<int, string> charStringIndexToName,
|
||||
public Type1CharStrings(IReadOnlyDictionary<string, CommandSequence> charStrings, IReadOnlyDictionary<int, string> charStringIndexToName,
|
||||
IReadOnlyDictionary<int, CommandSequence> 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),
|
||||
|
Reference in New Issue
Block a user