예제 #1
0
        void ReadSubTableFormat0(BinaryReader reader, int remainingBytes)
        {
            ushort npairs        = reader.ReadUInt16();
            ushort searchRange   = reader.ReadUInt16();
            ushort entrySelector = reader.ReadUInt16();
            ushort rangeShift    = reader.ReadUInt16();

            //----------------------------------------------

            //check
#if DEBUG
            if ((remainingBytes % 6) != 0)
            {
                throw new System.Exception();
            }
            int calNpairs = remainingBytes / 6;
#endif
            var ksubTable = new KerningSubTable(npairs);
            this.kernSubTables.Add(ksubTable);

            while (remainingBytes > 0)
            {
                ushort left  = reader.ReadUInt16();
                ushort right = reader.ReadUInt16();
                short  value = reader.ReadInt16();
                ksubTable.AddKernPair(
                    reader.ReadUInt16(), //left
                    reader.ReadUInt16(), //right
                    reader.ReadInt16()); //value

                remainingBytes -= 6;
            }
        }
예제 #2
0
        public static KerningTable Load(TrueTypeDataBytes data, TrueTypeHeaderTable headerTable)
        {
            data.Seek(headerTable.Offset);

            var version = data.ReadUnsignedShort();

            var numberOfSubtables = data.ReadUnsignedShort();

            var subTables = new KerningSubTable[numberOfSubtables];

            for (var i = 0; i < numberOfSubtables; i++)
            {
                var currentOffset = data.Position;

                var subtableVersion = data.ReadUnsignedShort();
                var subtableLength  = data.ReadUnsignedShort();
                var coverage        = data.ReadUnsignedShort();

                var kernCoverage = (KernCoverage)coverage;
                var format       = ((coverage & 255) >> 8);

                switch (format)
                {
                case 0:
                    subTables[i] = ReadFormat0Table(subtableVersion, data, kernCoverage);
                    break;

                case 2:
                    subTables[i] = ReadFormat2Table(subtableVersion, data, kernCoverage, currentOffset);
                    break;
                }
            }

            return(new KerningTable(subTables));
        }
예제 #3
0
        void ReadSubTableFormat0(BinaryReader reader, int remainingBytes)
        {
            ushort npairs = reader.ReadUInt16();
            ushort searchRange = reader.ReadUInt16();
            ushort entrySelector = reader.ReadUInt16();
            ushort rangeShift = reader.ReadUInt16();
            //----------------------------------------------

            //check 
#if DEBUG
            if ((remainingBytes % 6) != 0)
            {
                throw new System.Exception();
            }
            int calNpairs = remainingBytes / 6;
#endif
            var ksubTable = new KerningSubTable(npairs);
            this.kernSubTables.Add(ksubTable);

            while (remainingBytes > 0)
            {
                ushort left = reader.ReadUInt16();
                ushort right = reader.ReadUInt16();
                short value = reader.ReadInt16();
                ksubTable.AddKernPair(
                    reader.ReadUInt16(), //left
                    reader.ReadUInt16(),//right
                    reader.ReadInt16());//value

                remainingBytes -= 6;
            }
        }
        private TrueTypeFontTable ReadKerningTable(uint length, TrueTypeTableEntryList list, BigEndianReader reader)
        {
            KerningTable kern = new KerningTable(reader.Position);

            kern.TableVersion = reader.ReadUShortVersion();
            ushort tcount = reader.ReadUInt16();

            kern.TableCount = tcount;

            if (tcount > 0)
            {
                kern.SubTables = new List <KerningSubTable>();

                for (int i = 0; i < tcount; i++)
                {
                    KerningSubTable sub = new KerningSubTable();
                    sub.Version  = reader.ReadUShortVersion();
                    sub.Length   = reader.ReadUInt16();
                    sub.Coverage = (KerningCoverage)reader.ReadByte();
                    sub.Format   = (KerningFormat)reader.ReadByte();

                    if (sub.Format == KerningFormat.Format0)
                    {
                        KerningFormat0 fdata = new KerningFormat0();
                        fdata.PairCount     = reader.ReadUInt16();
                        fdata.SearchRange   = reader.ReadUInt16();
                        fdata.EntrySelector = reader.ReadUInt16();
                        fdata.RangeShift    = reader.ReadUInt16();

                        List <Kerning0Pair> pairs = new List <Kerning0Pair>();

                        for (int j = 0; j < fdata.PairCount; j++)
                        {
                            Kerning0Pair pair = new Kerning0Pair();
                            pair.LeftGlyphIndex  = reader.ReadUInt16();
                            pair.RightGlyphIndex = reader.ReadUInt16();
                            pair.Value           = reader.ReadInt16();
                            pairs.Add(pair);
                        }
                        fdata.KerningPairs    = pairs;
                        sub.KerningFormatData = fdata;
                    }

                    kern.SubTables.Add(sub);
                }
            }

            return(kern);
        }
예제 #5
0
        void ReadSubTableFormat0(BinaryReader reader, int remainingBytes)
        {
            ushort npairs        = reader.ReadUInt16();
            ushort searchRange   = reader.ReadUInt16();
            ushort entrySelector = reader.ReadUInt16();
            ushort rangeShift    = reader.ReadUInt16();
            //----------------------------------------------
            var ksubTable = new KerningSubTable(npairs);

            this.kernSubTables.Add(ksubTable);
            while (npairs > 0)
            {
                ksubTable.AddKernPair(
                    reader.ReadUInt16(), //left//
                    reader.ReadUInt16(), //right
                    reader.ReadInt16()); //value
                npairs--;
            }
        }
예제 #6
0
        public static KerningTable Load(BinaryReader reader)
        {
            // Type   | Field    | Description
            // -------|----------|-----------------------------------------
            // uint16 | version  | Table version number(0)
            // uint16 | nTables  | Number of subtables in the kerning table.
            ushort version       = reader.ReadUInt16();
            ushort subtableCount = reader.ReadUInt16();

            var tables = new List <KerningSubTable>(subtableCount);

            for (int i = 0; i < subtableCount; i++)
            {
                var t = KerningSubTable.Load(reader); // returns null for unknown/supported table format
                if (t != null)
                {
                    tables.Add(t);
                }
            }

            return(new KerningTable(tables.ToArray()));
        }