Ejemplo n.º 1
0
 public ByteEncodingCMapTable(TrueTypeCMapPlatform platformId, ushort encodingId, ushort languageId, byte[] glyphMapping)
 {
     this.glyphMapping = glyphMapping;
     PlatformId        = platformId;
     EncodingId        = encodingId;
     LanguageId        = languageId;
 }
Ejemplo n.º 2
0
 /// <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));
 }
Ejemplo n.º 3
0
        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));
        }
Ejemplo n.º 4
0
        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));
        }
Ejemplo n.º 5
0
        /// <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;
        }
Ejemplo n.º 6
0
        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));
        }
Ejemplo n.º 7
0
        /// <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;
        }
Ejemplo n.º 8
0
        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));
        }
Ejemplo n.º 9
0
        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));
        }
Ejemplo n.º 10
0
 private HighByteMappingCMapTable(TrueTypeCMapPlatform platformId, int encodingId, IReadOnlyDictionary <int, int> characterCodesToGlyphIndices)
 {
     this.characterCodesToGlyphIndices = characterCodesToGlyphIndices ?? throw new ArgumentNullException(nameof(characterCodesToGlyphIndices));
     PlatformId = platformId;
     EncodingId = encodingId;
 }
Ejemplo n.º 11
0
 public SubTableHeaderEntry(TrueTypeCMapPlatform platformId, int encodingId, long offset)
 {
     PlatformId = platformId;
     EncodingId = encodingId;
     Offset     = offset;
 }
Ejemplo n.º 12
0
 private ByteEncodingCMapTable(TrueTypeCMapPlatform platformId, int encodingId, byte[] glyphMapping)
 {
     this.glyphMapping = glyphMapping;
     PlatformId        = platformId;
     EncodingId        = encodingId;
 }