public ByteEncodingCMapTable(TrueTypeCMapPlatform platformId, ushort encodingId, ushort languageId, byte[] glyphMapping) { this.glyphMapping = glyphMapping; PlatformId = platformId; EncodingId = encodingId; LanguageId = languageId; }
/// <summary> /// Create a new <see cref="Format4CMapTable"/>. /// </summary> public Format4CMapTable(TrueTypeCMapPlatform platformId, ushort encodingId, ushort language, IReadOnlyList <Segment> segments, IReadOnlyList <ushort> glyphIds) { PlatformId = platformId; EncodingId = encodingId; Language = language; Segments = segments ?? throw new ArgumentNullException(nameof(segments)); GlyphIds = glyphIds ?? throw new ArgumentNullException(nameof(glyphIds)); }
public static Format4CMapTable Load(TrueTypeDataBytes data, TrueTypeCMapPlatform platformId, ushort encodingId) { // Length in bytes. var length = data.ReadUnsignedShort(); // Used for sub-tables with a Macintosh platform ID. var version = data.ReadUnsignedShort(); var doubleSegmentCount = data.ReadUnsignedShort(); // Defines the number of contiguous segments. var segmentCount = doubleSegmentCount / 2; // Some crazy sum. var searchRange = data.ReadUnsignedShort(); var entrySelector = data.ReadUnsignedShort(); var rangeShift = data.ReadUnsignedShort(); // End character codes for each segment. var endCounts = data.ReadUnsignedShortArray(segmentCount); // Should be zero. var reservedPad = data.ReadUnsignedShort(); // Start character codes for each segment. var startCounts = data.ReadUnsignedShortArray(segmentCount); // Delta for all character codes in the segment. Contrary to the spec this is actually a short[]. var idDeltas = data.ReadShortArray(segmentCount); var idRangeOffsets = data.ReadUnsignedShortArray(segmentCount); const int singleIntsRead = 8; const int intArraysRead = 8; // ReSharper disable once ArrangeRedundantParentheses var remainingBytes = length - ((singleIntsRead * 2) + intArraysRead * segmentCount); var remainingInts = remainingBytes / 2; var glyphIndices = data.ReadUnsignedShortArray(remainingInts); var segments = new Segment[endCounts.Length]; for (int i = 0; i < endCounts.Length; i++) { var start = startCounts[i]; var end = endCounts[i]; var delta = idDeltas[i]; var offsets = idRangeOffsets[i]; segments[i] = new Segment(start, end, delta, offsets); } return(new Format4CMapTable(platformId, encodingId, version, segments, glyphIndices)); }
public static ByteEncodingCMapTable Load(TrueTypeDataBytes data, TrueTypeCMapPlatform platformId, ushort encodingId) { var length = data.ReadUnsignedShort(); var language = data.ReadUnsignedShort(); var glyphMapping = data.ReadByteArray(length - (SizeOfShort * 3)); return(new ByteEncodingCMapTable(platformId, encodingId, language, glyphMapping)); }
/// <summary> /// Create a new <see cref="TrimmedTableMappingCMapTable"/>. /// </summary> public TrimmedTableMappingCMapTable(TrueTypeCMapPlatform platformId, ushort encodingId, int firstCharacterCode, int entryCount, ushort[] glyphIndices) { FirstCharacterCode = firstCharacterCode; this.entryCount = entryCount; this.glyphIndices = glyphIndices ?? throw new ArgumentNullException(nameof(glyphIndices)); LastCharacterCode = firstCharacterCode + entryCount - 1; PlatformId = platformId; EncodingId = encodingId; }
public static ByteEncodingCMapTable Load(TrueTypeDataBytes data, TrueTypeCMapPlatform platformId, int encodingId) { // ReSharper disable UnusedVariable var length = data.ReadUnsignedShort(); var version = data.ReadUnsignedShort(); // ReSharper restore UnusedVariable var glyphMapping = data.ReadByteArray(GlyphMappingLength); return(new ByteEncodingCMapTable(platformId, encodingId, glyphMapping)); }
/// <summary> /// Create a new <see cref="Format4CMapTable"/>. /// </summary> public Format4CMapTable(TrueTypeCMapPlatform platformId, int encodingId, int language, IReadOnlyList <Segment> segments, IReadOnlyList <int> glyphIds) { PlatformId = platformId; EncodingId = encodingId; Language = language; Segments = segments ?? throw new ArgumentNullException(nameof(segments)); GlyphIds = glyphIds ?? throw new ArgumentNullException(nameof(glyphIds)); FirstCharacterCode = Segments[0].StartCode; LastCharacterCode = Segments[Segments.Count - 2].EndCode; }
public static TrimmedTableMappingCMapTable Load(TrueTypeDataBytes data, TrueTypeCMapPlatform platformId, ushort encodingId) { var length = data.ReadUnsignedShort(); var language = data.ReadUnsignedShort(); // First character code in the range. var firstCode = data.ReadUnsignedShort(); // Number of character codes in the range. var entryCount = data.ReadUnsignedShort(); var glyphIndices = data.ReadUnsignedShortArray(entryCount); return(new TrimmedTableMappingCMapTable(platformId, encodingId, firstCode, entryCount, glyphIndices)); }
public static HighByteMappingCMapTable Load(TrueTypeDataBytes data, int numberOfGlyphs, TrueTypeCMapPlatform platformId, int encodingId) { // ReSharper disable UnusedVariable var length = data.ReadUnsignedShort(); var version = data.ReadUnsignedShort(); // ReSharper restore UnusedVariable var subHeaderKeys = new int[256]; var maximumSubHeaderIndex = 0; for (var i = 0; i < 256; i++) { var value = data.ReadUnsignedShort(); maximumSubHeaderIndex = Math.Max(maximumSubHeaderIndex, value / 8); subHeaderKeys[i] = value; } var subHeaderCount = maximumSubHeaderIndex + 1; var subHeaders = new SubHeader[subHeaderCount]; for (var i = 0; i < subHeaderCount; i++) { var firstCode = data.ReadUnsignedShort(); var entryCount = data.ReadUnsignedShort(); var idDelta = data.ReadSignedShort(); var idRangeOffset = data.ReadUnsignedShort() - (subHeaderCount - i - 1) * 8 - 2; subHeaders[i] = new SubHeader(firstCode, entryCount, idDelta, idRangeOffset); } var glyphIndexArrayOffset = data.Position; var characterCodeToGlyphId = new Dictionary <int, int>(); for (var i = 0; i < subHeaderCount; i++) { var subHeader = subHeaders[i]; data.Seek(glyphIndexArrayOffset + subHeader.IdRangeOffset); for (int j = 0; j < subHeader.EntryCount; j++) { int characterCode = (i << 8) + (subHeader.FirstCode + j); var p = (int)data.ReadUnsignedShort(); if (p > 0) { p = (p + subHeader.IdDelta) % 65536; } if (p >= numberOfGlyphs) { continue; } characterCodeToGlyphId[characterCode] = p; } } return(new HighByteMappingCMapTable(platformId, encodingId, characterCodeToGlyphId)); }
private HighByteMappingCMapTable(TrueTypeCMapPlatform platformId, int encodingId, IReadOnlyDictionary <int, int> characterCodesToGlyphIndices) { this.characterCodesToGlyphIndices = characterCodesToGlyphIndices ?? throw new ArgumentNullException(nameof(characterCodesToGlyphIndices)); PlatformId = platformId; EncodingId = encodingId; }
public SubTableHeaderEntry(TrueTypeCMapPlatform platformId, int encodingId, long offset) { PlatformId = platformId; EncodingId = encodingId; Offset = offset; }
private ByteEncodingCMapTable(TrueTypeCMapPlatform platformId, int encodingId, byte[] glyphMapping) { this.glyphMapping = glyphMapping; PlatformId = platformId; EncodingId = encodingId; }