public object DeepCopy() { var newTable = (CmapTable)MemberwiseClone(); newTable.Subtables = Subtables.Select(subtable => (CmapSubtable)subtable.DeepCopy()).ToList(); return(newTable); }
public void Serialize(BinaryWriter writer, long startOffset, SerializationInfo additionalInfo) { writer.BaseStream.Position = startOffset; DataTypeConverter.WriteUShort(writer, Version); var environments = Subtables.SelectMany(subtable => subtable.Environments) .OrderBy(environment => environment.PlatformId) .ThenBy(environment => environment.EncodingId) .ToList(); DataTypeConverter.WriteUShort(writer, (ushort)environments.Count); var startOffsetOfEnvironments = writer.BaseStream.Position; writer.BaseStream.Position += environments.Count * (DataTypeLength.UShort + DataTypeLength.UShort + DataTypeLength.ULong); foreach (var subtable in Subtables) { // 4byte padding if (writer.BaseStream.Position % 4 != 0) { writer.BaseStream.Position += (4 - writer.BaseStream.Position % 4); } subtable.Environments.ForEach( environment => environment.SubtableOffset = (uint)(writer.BaseStream.Position - startOffset)); subtable.Serialize(writer, writer.BaseStream.Position, additionalInfo); } var endOffset = writer.BaseStream.Position; writer.BaseStream.Position = startOffsetOfEnvironments; environments.ForEach(environment => { DataTypeConverter.WriteUShort(writer, environment.PlatformId); DataTypeConverter.WriteUShort(writer, environment.EncodingId); DataTypeConverter.WriteULong(writer, (ushort)environment.SubtableOffset); }); // Restore writer position writer.BaseStream.Position = endOffset; }