internal void Write(BitWriter writer) { writer.StartCrcCalculation(); writer.WriteStringAscii(Version.VersionString(), nullTerminated: false); writer.WriteBytes(0, 0, 0, 0, 0); if (Version == DwgVersionId.R14) { writer.WriteByte((byte)MaintenenceVersion); } else { writer.WriteByte(0); } writer.WriteByte(1); writer.WriteInt(ImagePointer); writer.WriteBytes(0, 0); writer.WriteShort(CodePage); writer.WriteInt(5); // 5 records HeaderVariablesLocator.Write(writer); ClassSectionLocator.Write(writer); ObjectMapLocator.Write(writer); UnknownSection_R13C3AndLaterLocator.Write(writer); UnknownSection_PaddingLocator.Write(writer); writer.WriteCrc(xorValue: 0x3CC4); // value for 5 records writer.WriteBytes(HeaderSentinel); }
private const int MaxSectionSizeBuffer = 10; // the maximum size of 2 MC values public void Write(BitWriter writer) { void WriteSection(byte[] data) { writer.StartCrcCalculation(initialValue: DwgHeaderVariables.InitialCrcValue); writer.WriteShortBigEndian((short)(data.Length + 2)); // account for crc writer.WriteBytes(data); writer.WriteCrc(writeCrcAsMsb: true); } // write in sections, each section is at most 2032 bytes, stop writing if remaining space is less than 10 var sectionStart = writer.Position; var lastHandle = 0; var lastLocation = 0; var ms = new MemoryStream(); var sectionWriter = new BitWriter(ms); foreach (var kvp in _handleOffsets.OrderBy(k => k.Key)) { var sectionSize = writer.Position - sectionStart; if (sectionSize >= MaxSectionSize - MaxSectionSizeBuffer) { // flush section var sectionBytes = sectionWriter.AsBytes(); WriteSection(sectionBytes); ms.Dispose(); ms = new MemoryStream(); sectionWriter = new BitWriter(ms); sectionStart = writer.Position; } // now write the values var handleDiff = kvp.Key - lastHandle; var locationDiff = kvp.Value - lastLocation; sectionWriter.Write_MC(handleDiff); sectionWriter.Write_MC(locationDiff); lastHandle = kvp.Key; lastLocation = kvp.Value; } // flush the final section var finalBytes = sectionWriter.AsBytes(); if (finalBytes.Length > 0) { WriteSection(finalBytes); } ms.Dispose(); // always finish with an empty section WriteSection(new byte[0]); }
internal void Write(BitWriter writer, DwgVersionId version) { writer.AlignByte(); using (var ms = new MemoryStream()) { // write the variables to memory var variableWriter = new BitWriter(ms); WriteVariables(variableWriter, version); var variableBytes = variableWriter.AsBytes(); // now write it all out writer.WriteBytes(StartSentinel); writer.StartCrcCalculation(initialValue: InitialCrcValue); writer.Write_RL(variableBytes.Length); writer.WriteBytes(variableBytes); writer.WriteCrc(); writer.WriteBytes(EndSentinel); } }
internal static void Write(IList <DwgClassDefinition> classes, BitWriter writer) { writer.AlignByte(); using (var ms = new MemoryStream()) { // write the classes to memory var classWriter = new BitWriter(ms); foreach (var c in classes) { c.Write(classWriter); } var classBytes = classWriter.AsBytes(); // now write it all out writer.WriteBytes(StartSentinel); writer.StartCrcCalculation(initialValue: DwgHeaderVariables.InitialCrcValue); writer.Write_RL(classBytes.Length); writer.WriteBytes(classBytes); writer.WriteCrc(); writer.WriteBytes(EndSentinel); } }