Ejemplo n.º 1
0
        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);
        }
Ejemplo n.º 2
0
        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();
            }
        }
Ejemplo n.º 3
0
        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();
            }
        }