SwfTagBase ISwfTagVisitor <ISwfStreamReader, SwfTagBase> .Visit(DefineFont3Tag tag, ISwfStreamReader reader) { tag.FontID = reader.ReadUInt16(); tag.HasLayout = reader.ReadBit(); tag.ShiftJIS = reader.ReadBit(); tag.SmallText = reader.ReadBit(); tag.ANSI = reader.ReadBit(); tag.WideOffsets = reader.ReadBit(); tag.WideCodes = reader.ReadBit(); tag.Italic = reader.ReadBit(); tag.Bold = reader.ReadBit(); tag.Language = reader.ReadByte(); int nameLength = reader.ReadByte(); tag.FontName = Encoding.UTF8.GetString(reader.ReadBytes(nameLength)); if (reader.BytesLeft == 0) { return(tag); } int glyphsCount = reader.ReadUInt16(); if (glyphsCount < 1) { return(tag); } var offsetTable = new uint[glyphsCount]; for (var i = 0; i < glyphsCount; i++) { offsetTable[i] = tag.WideOffsets ? reader.ReadUInt32() : reader.ReadUInt16(); } uint codeTableOffset = tag.WideOffsets ? reader.ReadUInt32() : reader.ReadUInt16(); for (var i = 0; i < glyphsCount; i++) { var glyph = new Glyph(); reader.ReadToShapeRecordsRGB(glyph.Records); tag.Glyphs.Add(glyph); reader.AlignToByte(); } for (var i = 0; i < glyphsCount; i++) { var glyph = tag.Glyphs[i]; glyph.Code = tag.WideCodes ? reader.ReadUInt16() : reader.ReadByte(); } if (tag.HasLayout) { tag.Ascent = reader.ReadSInt16(); tag.Descent = reader.ReadSInt16(); tag.Leading = reader.ReadSInt16(); for (var i = 0; i < glyphsCount; i++) { var glyph = tag.Glyphs[i]; glyph.Advance = reader.ReadSInt16(); } for (var i = 0; i < glyphsCount; i++) { var glyph = tag.Glyphs[i]; glyph.Bounds = reader.ReadRect(); } var kerningCounts = reader.ReadUInt16(); for (var i = 0; i < kerningCounts; i++) { tag.KerningRecords.Add(reader.ReadKerningRecord(tag.WideCodes)); } } return(tag); }
SwfTagData ISwfTagVisitor <ISwfStreamWriter, SwfTagData> .Visit(DefineFont3Tag tag, ISwfStreamWriter writer) { writer.WriteUInt16(tag.FontID); writer.WriteBit(tag.HasLayout); writer.WriteBit(tag.ShiftJIS); writer.WriteBit(tag.SmallText); writer.WriteBit(tag.ANSI); writer.WriteBit(tag.WideOffsets); writer.WriteBit(tag.WideCodes); writer.WriteBit(tag.Italic); writer.WriteBit(tag.Bold); writer.WriteByte(tag.Language); var name = Encoding.UTF8.GetBytes(tag.FontName); writer.WriteByte((byte)name.Length); writer.WriteBytes(name); writer.WriteUInt16((ushort)tag.Glyphs.Count); var offsets = new List <uint>(); var shapesData = SerializeGlyphsData(tag.Glyphs, offsets); var offsetBytes = (uint)(tag.WideOffsets ? 4 : 2); var offsetTableSize = offsetBytes * tag.Glyphs.Count; var firstShapeOffset = offsetTableSize + offsetBytes; WriteOffsets(writer, offsets, (uint)firstShapeOffset, tag.WideOffsets); var codeTableOffset = firstShapeOffset + (uint)shapesData.Length; if (tag.WideOffsets) { writer.WriteUInt32((uint)codeTableOffset); } else { writer.WriteUInt16((ushort)codeTableOffset); } writer.WriteBytes(shapesData); foreach (var glyph in tag.Glyphs) { if (tag.WideCodes) { writer.WriteUInt16(glyph.Code); } else { writer.WriteByte((byte)glyph.Code); } } if (tag.HasLayout) { writer.WriteSInt16(tag.Ascent); writer.WriteSInt16(tag.Descent); writer.WriteSInt16(tag.Leading); foreach (var glyph in tag.Glyphs) { writer.WriteSInt16(glyph.Advance); } foreach (var glyph in tag.Glyphs) { writer.WriteRect(glyph.Bounds); } writer.WriteUInt16((ushort)tag.KerningRecords.Count); foreach (var kerningRecord in tag.KerningRecords) { writer.WriteKerningRecord(kerningRecord, tag.WideCodes); } } return(null); }
ITagFormatter ISwfTagVisitor <object, ITagFormatter> .Visit(DefineFont3Tag tag, object arg) { return(new DefineFont3TagFormatter()); }