public static LocaTable Deserialize(BinaryReader reader, long startOffset, ushort numberOfGlyphs, LocaTableVersion version) { var table = new LocaTable(); reader.BaseStream.Position = startOffset; table.GlyphOffsets.AddRange(Enumerable.Range(0, numberOfGlyphs).Select <int, uint?>(i => { var offset = ReadNextOffset(reader, version); // Peek next offset var restorePosition = reader.BaseStream.Position; var nextOffset = ReadNextOffset(reader, version); reader.BaseStream.Position = restorePosition; // Empty outline check if (offset == nextOffset) { return(null); } return(offset); })); return(table); }
private static uint ReadNextOffset(BinaryReader reader, LocaTableVersion version) { switch (version) { case LocaTableVersion.Long: return(DataTypeConverter.ReadULong(reader)); case LocaTableVersion.Short: return((uint)(DataTypeConverter.ReadUShort(reader) * 2)); default: throw new NotImplementedException(); } }
private static void WriteNextOffset(BinaryWriter writer, uint offset, LocaTableVersion version) { switch (version) { case LocaTableVersion.Long: DataTypeConverter.WriteULong(writer, offset); break; case LocaTableVersion.Short: DataTypeConverter.WriteUShort(writer, (ushort)(offset / 2)); break; default: throw new NotImplementedException(); } }