use named constants for relevant type2 charstring command bytes

This commit is contained in:
Eliot Jones
2019-12-23 23:50:33 +00:00
parent 526af82e1a
commit 649abdf966

View File

@@ -19,17 +19,24 @@ namespace UglyToad.PdfPig.Fonts.CompactFontFormat.CharStrings
/// </remarks> /// </remarks>
internal class Type2CharStringParser internal class Type2CharStringParser
{ {
private const byte HstemByte = 1;
private const byte VstemByte = 3;
private const byte HstemhmByte = 18;
private const byte HintmaskByte = 19;
private const byte CntrmaskByte = 20;
private const byte VstemhmByte = 23;
private static readonly HashSet<byte> HintingCommandBytes = new HashSet<byte> private static readonly HashSet<byte> HintingCommandBytes = new HashSet<byte>
{ {
1, HstemByte,
3, VstemByte,
18, HstemhmByte,
23 VstemhmByte
}; };
private static readonly IReadOnlyDictionary<byte, LazyType2Command> SingleByteCommandStore = new Dictionary<byte, LazyType2Command> private static readonly IReadOnlyDictionary<byte, LazyType2Command> SingleByteCommandStore = new Dictionary<byte, LazyType2Command>
{ {
{ 1, new LazyType2Command("hstem", ctx => { HstemByte, new LazyType2Command("hstem", ctx =>
{ {
var numberOfEdgeHints = ctx.Stack.Length / 2; var numberOfEdgeHints = ctx.Stack.Length / 2;
var hints = new (double, double)[numberOfEdgeHints]; var hints = new (double, double)[numberOfEdgeHints];
@@ -56,7 +63,7 @@ namespace UglyToad.PdfPig.Fonts.CompactFontFormat.CharStrings
}) })
}, },
{ {
3, new LazyType2Command("vstem", ctx => VstemByte, new LazyType2Command("vstem", ctx =>
{ {
var numberOfEdgeHints = ctx.Stack.Length / 2; var numberOfEdgeHints = ctx.Stack.Length / 2;
var hints = new (double, double)[numberOfEdgeHints]; var hints = new (double, double)[numberOfEdgeHints];
@@ -197,7 +204,7 @@ namespace UglyToad.PdfPig.Fonts.CompactFontFormat.CharStrings
ctx.Stack.Clear(); ctx.Stack.Clear();
}) })
}, },
{ 18, new LazyType2Command("hstemhm", ctx => { HstemhmByte, new LazyType2Command("hstemhm", ctx =>
{ {
// Same as vstem except the charstring contains hintmask // Same as vstem except the charstring contains hintmask
var numberOfEdgeHints = ctx.Stack.Length / 2; var numberOfEdgeHints = ctx.Stack.Length / 2;
@@ -225,14 +232,14 @@ namespace UglyToad.PdfPig.Fonts.CompactFontFormat.CharStrings
}) })
}, },
{ {
19, new LazyType2Command("hintmask", ctx => HintmaskByte, new LazyType2Command("hintmask", ctx =>
{ {
// TODO: record this mask somewhere // TODO: record this mask somewhere
ctx.Stack.Clear(); ctx.Stack.Clear();
}) })
}, },
{ {
20, new LazyType2Command("cntrmask", ctx => CntrmaskByte, new LazyType2Command("cntrmask", ctx =>
{ {
// TODO: record this mask somewhere // TODO: record this mask somewhere
ctx.Stack.Clear(); ctx.Stack.Clear();
@@ -264,7 +271,7 @@ namespace UglyToad.PdfPig.Fonts.CompactFontFormat.CharStrings
ctx.Stack.Clear(); ctx.Stack.Clear();
}) })
}, },
{ 23, new LazyType2Command("vstemhm", ctx => { VstemhmByte, new LazyType2Command("vstemhm", ctx =>
{ {
// Same as vstem except the charstring contains hintmask // Same as vstem except the charstring contains hintmask
var numberOfEdgeHints = ctx.Stack.Length / 2; var numberOfEdgeHints = ctx.Stack.Length / 2;
@@ -865,10 +872,7 @@ namespace UglyToad.PdfPig.Fonts.CompactFontFormat.CharStrings
return (counts - 1) / 2; return (counts - 1) / 2;
} }
const byte hintmaskByte = 19;
const byte cntrmaskByte = 20;
/* /*
* The hintmask operator is followed by one or more data bytes that specify the stem hints which are to be active for the * The hintmask operator is followed by one or more data bytes that specify the stem hints which are to be active for the
* subsequent path construction. The number of data bytes must be exactly the number needed to represent the number of * subsequent path construction. The number of data bytes must be exactly the number needed to represent the number of
@@ -889,7 +893,7 @@ namespace UglyToad.PdfPig.Fonts.CompactFontFormat.CharStrings
foreach (var identifier in precedingCommands.Where(x => x.CommandIndex == i + 1)) foreach (var identifier in precedingCommands.Where(x => x.CommandIndex == i + 1))
{ {
if (!identifier.IsMultiByteCommand if (!identifier.IsMultiByteCommand
&& (identifier.CommandId == hintmaskByte || identifier.CommandId == cntrmaskByte) && (identifier.CommandId == HintmaskByte || identifier.CommandId == CntrmaskByte)
&& !hasEncounteredInitialHintMask) && !hasEncounteredInitialHintMask)
{ {
hasEncounteredInitialHintMask = true; hasEncounteredInitialHintMask = true;