示例#1
0
        /**
         * This will parse a kern pair from the data stream.
         *
         * @return The kern pair that was parsed from the stream.
         *
         * @throws IOException If there is an error reading from the stream.
         */
        private KernPair ParseKernPair()
        {
            KernPair kernPair = new KernPair();
            string   cmd      = ReadString();

            switch (cmd)
            {
            case KERN_PAIR_KP:
                kernPair.FirstKernCharacter  = ReadString();
                kernPair.SecondKernCharacter = ReadString();
                kernPair.X = Readfloat();
                kernPair.Y = Readfloat();
                break;

            case KERN_PAIR_KPH:
                kernPair.FirstKernCharacter  = HexTostring(ReadString());
                kernPair.SecondKernCharacter = HexTostring(ReadString());
                kernPair.X = Readfloat();
                kernPair.Y = Readfloat();
                break;

            case KERN_PAIR_KPX:
                kernPair.FirstKernCharacter  = ReadString();
                kernPair.SecondKernCharacter = ReadString();
                kernPair.X = Readfloat();
                kernPair.Y = 0;
                break;

            case KERN_PAIR_KPY:
                kernPair.FirstKernCharacter  = ReadString();
                kernPair.SecondKernCharacter = ReadString();
                kernPair.X = 0;
                kernPair.Y = Readfloat();
                break;

            default:
                throw new IOException("Error expected kern pair command actual='" + cmd + "'");
            }
            return(kernPair);
        }
示例#2
0
        /**
         * This will parse the kern data.
         *
         * @param fontMetrics The metrics class to put the parsed data into.
         *
         * @throws IOException If there is an error parsing the data.
         */
        private void ParseKernData(FontMetrics fontMetrics)
        {
            string nextCommand;

            while (!(nextCommand = ReadString()).Equals(END_KERN_DATA, StringComparison.Ordinal))
            {
                switch (nextCommand)
                {
                case START_TRACK_KERN:
                    int countTrackKern = ReadInt();
                    for (int i = 0; i < countTrackKern; i++)
                    {
                        TrackKern kern = new TrackKern();
                        kern.Degree       = ReadInt();
                        kern.MinPointSize = Readfloat();
                        kern.MinKern      = Readfloat();
                        kern.MaxPointSize = Readfloat();
                        kern.MaxKern      = Readfloat();
                        fontMetrics.AddTrackKern(kern);
                    }
                    string endTrackKern = ReadString();
                    if (!endTrackKern.Equals(END_TRACK_KERN, StringComparison.Ordinal))
                    {
                        throw new IOException("Error: Expected '" + END_TRACK_KERN + "' actual '" +
                                              endTrackKern + "'");
                    }
                    break;

                case START_KERN_PAIRS:
                    int countKernPairs = ReadInt();
                    for (int i = 0; i < countKernPairs; i++)
                    {
                        KernPair pair = ParseKernPair();
                        fontMetrics.AddKernPair(pair);
                    }
                    string endKernPairs = ReadString();
                    if (!endKernPairs.Equals(END_KERN_PAIRS, StringComparison.Ordinal))
                    {
                        throw new IOException("Error: Expected '" + END_KERN_PAIRS + "' actual '" +
                                              endKernPairs + "'");
                    }
                    break;

                case START_KERN_PAIRS0:
                    int countKernPairs0 = ReadInt();
                    for (int i = 0; i < countKernPairs0; i++)
                    {
                        KernPair pair = ParseKernPair();
                        fontMetrics.AddKernPair0(pair);
                    }
                    string endKernPairs0 = ReadString();
                    if (!endKernPairs0.Equals(END_KERN_PAIRS, StringComparison.Ordinal))
                    {
                        throw new IOException("Error: Expected '" + END_KERN_PAIRS + "' actual '" +
                                              endKernPairs0 + "'");
                    }
                    break;

                case START_KERN_PAIRS1:
                    int countKernPairs1 = ReadInt();
                    for (int i = 0; i < countKernPairs1; i++)
                    {
                        KernPair pair = ParseKernPair();
                        fontMetrics.AddKernPair1(pair);
                    }
                    string endKernPairs1 = ReadString();
                    if (!endKernPairs1.Equals(END_KERN_PAIRS, StringComparison.Ordinal))
                    {
                        throw new IOException("Error: Expected '" + END_KERN_PAIRS + "' actual '" +
                                              endKernPairs1 + "'");
                    }
                    break;

                default:
                    throw new IOException("Unknown kerning data type '" + nextCommand + "'");
                }
            }
        }