Example #1
0
        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);
        }
Example #2
0
        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);
        }
Example #3
0
 ITagFormatter ISwfTagVisitor <object, ITagFormatter> .Visit(DefineFont3Tag tag, object arg)
 {
     return(new DefineFont3TagFormatter());
 }