/** * 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); }
/** * 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 + "'"); } } }