implement glyph index getter for the 3 implemented truetype cmap sub tables

This commit is contained in:
Eliot Jones
2018-03-31 12:43:06 +01:00
parent 92c0ef14cb
commit 0ae20c51f3
3 changed files with 48 additions and 8 deletions

View File

@@ -6,29 +6,40 @@
/// </summary> /// </summary>
internal class ByteEncodingCMapTable : ICMapSubTable internal class ByteEncodingCMapTable : ICMapSubTable
{ {
private const int GlyphMappingLength = 256;
private readonly byte[] glyphMapping;
public int PlatformId { get; } public int PlatformId { get; }
public int EncodingId { get; } public int EncodingId { get; }
private ByteEncodingCMapTable(int platformId, int encodingId) private ByteEncodingCMapTable(int platformId, int encodingId, byte[] glyphMapping)
{ {
this.glyphMapping = glyphMapping;
PlatformId = platformId; PlatformId = platformId;
EncodingId = encodingId; EncodingId = encodingId;
} }
public static ByteEncodingCMapTable Load(TrueTypeDataBytes data, int platformId, int encodingId) public static ByteEncodingCMapTable Load(TrueTypeDataBytes data, int platformId, int encodingId)
{ {
// ReSharper disable UnusedVariable
var length = data.ReadUnsignedShort(); var length = data.ReadUnsignedShort();
var version = data.ReadUnsignedShort(); var version = data.ReadUnsignedShort();
// ReSharper restore UnusedVariable
var glyphMapping = data.ReadByteArray(256); var glyphMapping = data.ReadByteArray(GlyphMappingLength);
return new ByteEncodingCMapTable(platformId, encodingId); return new ByteEncodingCMapTable(platformId, encodingId, glyphMapping);
} }
public int CharacterCodeToGlyphIndex(int characterCode) public int CharacterCodeToGlyphIndex(int characterCode)
{ {
throw new System.NotImplementedException(); if (characterCode < GlyphMappingLength || characterCode >= GlyphMappingLength)
{
return 0;
}
return glyphMapping[characterCode];
} }
} }
} }

View File

@@ -34,7 +34,26 @@ namespace UglyToad.PdfPig.Fonts.TrueType.Tables.CMapSubTables
public int CharacterCodeToGlyphIndex(int characterCode) public int CharacterCodeToGlyphIndex(int characterCode)
{ {
throw new NotImplementedException(); for (var i = 0; i < Segments.Count; i++)
{
var segment = Segments[i];
if (segment.EndCode < characterCode || segment.StartCode > characterCode)
{
continue;
}
if (segment.IdRangeOffset == 0)
{
return (characterCode + segment.IdDelta) % ushort.MaxValue;
}
var offset = segment.IdRangeOffset / 2 + (characterCode - segment.StartCode);
return GlyphIds[offset - Segments.Count + i];
}
return 0;
} }
public static Format4CMapTable Load(TrueTypeDataBytes data, int platformId, int encodingId) public static Format4CMapTable Load(TrueTypeDataBytes data, int platformId, int encodingId)

View File

@@ -10,25 +10,35 @@
/// </summary> /// </summary>
internal class HighByteMappingCMapTable : ICMapSubTable internal class HighByteMappingCMapTable : ICMapSubTable
{ {
private readonly IReadOnlyDictionary<int, int> characterCodesToGlyphIndices;
public int PlatformId { get; } public int PlatformId { get; }
public int EncodingId { get; } public int EncodingId { get; }
public HighByteMappingCMapTable(int platformId, int encodingId) private HighByteMappingCMapTable(int platformId, int encodingId, IReadOnlyDictionary<int, int> characterCodesToGlyphIndices)
{ {
this.characterCodesToGlyphIndices = characterCodesToGlyphIndices ?? throw new ArgumentNullException(nameof(characterCodesToGlyphIndices));
PlatformId = platformId; PlatformId = platformId;
EncodingId = encodingId; EncodingId = encodingId;
} }
public int CharacterCodeToGlyphIndex(int characterCode) public int CharacterCodeToGlyphIndex(int characterCode)
{ {
throw new NotImplementedException(); if (!characterCodesToGlyphIndices.TryGetValue(characterCode, out var index))
{
return 0;
}
return index;
} }
public static HighByteMappingCMapTable Load(TrueTypeDataBytes data, int numberOfGlyphs, int platformId, int encodingId) public static HighByteMappingCMapTable Load(TrueTypeDataBytes data, int numberOfGlyphs, int platformId, int encodingId)
{ {
// ReSharper disable UnusedVariable
var length = data.ReadUnsignedShort(); var length = data.ReadUnsignedShort();
var version = data.ReadUnsignedShort(); var version = data.ReadUnsignedShort();
// ReSharper restore UnusedVariable
var subHeaderKeys = new int[256]; var subHeaderKeys = new int[256];
var maximumSubHeaderIndex = 0; var maximumSubHeaderIndex = 0;
@@ -83,7 +93,7 @@
} }
} }
return new HighByteMappingCMapTable(platformId, encodingId); return new HighByteMappingCMapTable(platformId, encodingId, characterCodeToGlyphId);
} }
public struct SubHeader public struct SubHeader