Exemplo n.º 1
0
        internal DefineFontAlignZonesTag(SwfReader r, Dictionary <uint, DefineFont2_3> fonts)
            : base(TagType.DefineFontAlignZones)
        {
            Fonts = fonts;

            FontId       = r.GetUI16();
            CSMTableHint = r.GetBits(2);
            r.SkipBits(6);
            r.Align();

            DefineFont2_3 font       = Fonts[FontId];
            uint          glyphCount = font.NumGlyphs;

            ZoneTable = new ZoneRecord[glyphCount];
            for (int i = 0; i < glyphCount; i++)
            {
                ZoneTable[i] = new ZoneRecord(r);
            }
        }
Exemplo n.º 2
0
        internal override void ToSwf(SwfWriter w)
        {
            uint start = (uint)w.Position;

            w.AppendTagIDAndLength(this.TagType, 0, true);

            w.AppendUI16(FontId);
            w.AppendBits(CSMTableHint, 2);
            w.AppendBits(0, 6);
            w.Align();

            DefineFont2_3 font       = Fonts[FontId];
            uint          glyphCount = font.NumGlyphs;

            for (int i = 0; i < glyphCount; i++)
            {
                ZoneTable[i].ToSwf(w);
            }

            w.ResetLongTagLength(this.TagType, start, true);
        }
Exemplo n.º 3
0
        internal void _ParseTags()
        {
            bool __tagsRemain = true;

            Tags           = new List <ISwfTag>();
            TimelineStream = new List <byte[]>();
            BinaryDatas    = new Dictionary <uint, byte[]>();
            Fonts          = new Dictionary <uint, DefineFont2_3>();
            Metadata       = null;
            Symbols        = new Dictionary <string, uint>();
            while (__tagsRemain)
            {
                /*
                 *      RECORDHEADER (short)
                 *      Field				Type	Comment
                 *      TagCodeAndLength	UI16	Upper 10 bits: tag typeLower 6 bits: tag length
                 *
                 *      RECORDHEADER (long)
                 *      Field				Type	Comment
                 *      TagCodeAndLength	UI16	Tag type and length of 0x3F Packed together as in short header
                 *      Length				SI32	Length of tag
                 */
                uint __b = _r.GetUI16();
                _curTag    = (uint)(__b >> 6);
                _curTagLen = __b & 0x3F;
                if (_curTagLen == 0x3F)
                {
                    _curTagLen = _r.GetUI32();
                }
                uint __tagEnd = _r.Position + _curTagLen;
                //Debug.WriteLine(r.Position + " type: " + ((uint)curTag).ToString("X2") + " -- " + Enum.GetName(typeof(TagType), curTag));

                switch (_curTag)
                {
                case TagType.End:
                    Tags.Add(new EndTag());
                    __tagsRemain = false;
                    break;

                case TagType.FileAttributes:
                    Tags.Add(new FileAttributesTag(_r));
                    break;

                case TagType.BackgroundColor:
                    Tags.Add(new BackgroundColorTag(_r));
                    break;

                case TagType.SerialNumber:
                    Tags.Add(new SerialNumberTag(_r));
                    break;

                case TagType.ScriptLimits:
                    Tags.Add(new ScriptLimitsTag(_r));
                    break;

                case TagType.Metadata:
                    MetadataTag __metadataTag = new MetadataTag(_r);
                    Metadata = __metadataTag.xml;
                    Tags.Add(__metadataTag);
                    break;

                case TagType.DefineBinaryData:
                    DefineBinaryDataTag __defineBinaryDataTag = new DefineBinaryDataTag(_r, _curTagLen);
                    BinaryDatas.Add(__defineBinaryDataTag.id, __defineBinaryDataTag.data);
                    Tags.Add(__defineBinaryDataTag);
                    break;

                case TagType.SymbolClass:
                    SymbolClassTag __symbolClassTag = new SymbolClassTag(_r, _curTagLen);
                    Symbols = __symbolClassTag.Symbols;
                    Tags.Add(__symbolClassTag);
                    break;

                case TagType.DefineShape:
                    Tags.Add(new DefineShapeTag(_r));
                    break;

                case TagType.DefineShape2:
                    Tags.Add(new DefineShape2Tag(_r));
                    break;

                case TagType.DefineShape3:
                    Tags.Add(new DefineShape3Tag(_r));
                    break;

                case TagType.DefineShape4:
                    Tags.Add(new DefineShape4Tag(_r));
                    break;

                case TagType.PlaceObject:
                    Tags.Add(new PlaceObjectTag(_r, __tagEnd));
                    break;

                case TagType.PlaceObject2:
                    Tags.Add(new PlaceObject2Tag(_r, this.Header.Version));
                    break;

                case TagType.PlaceObject3:
                    Tags.Add(new PlaceObject3Tag(_r));
                    break;

                case TagType.RemoveObject:
                    Tags.Add(new RemoveObjectTag(_r));
                    break;

                case TagType.RemoveObject2:
                    Tags.Add(new RemoveObject2Tag(_r));
                    break;

                case TagType.ShowFrame:
                    Tags.Add(new ShowFrame(_r));
                    break;

                case TagType.FrameLabel:
                    Tags.Add(new FrameLabelTag(_r));
                    break;

                case TagType.DefineSprite:
                    DefineSpriteTag sp = new DefineSpriteTag(_r, this.Header.Version);
                    Tags.Add(sp);
                    break;

                // Bitmaps

                case TagType.JPEGTables:
                    JpegTable = new JPEGTables(_r, _curTagLen);
                    Tags.Add(JpegTable);
                    break;

                case TagType.DefineBits:
                    Tags.Add(new DefineBitsTag(_r, _curTagLen, false, false));
                    break;

                case TagType.DefineBitsJPEG2:
                    Tags.Add(new DefineBitsTag(_r, _curTagLen, true, false));
                    break;

                case TagType.DefineBitsJPEG3:
                    Tags.Add(new DefineBitsTag(_r, _curTagLen, true, true));
                    break;

                case TagType.DefineBitsLossless:
                    Tags.Add(new DefineBitsLosslessTag(_r, _curTagLen, false));
                    break;

                case TagType.DefineBitsLossless2:
                    Tags.Add(new DefineBitsLosslessTag(_r, _curTagLen, true));
                    break;

                // Sound

                case TagType.DefineSound:
                    Tags.Add(new DefineSoundTag(_r, _curTagLen));
                    break;

                case TagType.StartSound:
                    Tags.Add(new StartSoundTag(_r));
                    break;

                case TagType.SoundStreamHead:
                case TagType.SoundStreamHead2:
                    Tags.Add(new SoundStreamHeadTag(_r));
                    break;

                case TagType.SoundStreamBlock:
                    SoundStreamBlockTag ssb = new SoundStreamBlockTag(_r, _curTagLen);
                    TimelineStream.Add(ssb.SoundData);
                    Tags.Add(ssb);
                    break;

                // text

                case TagType.DefineFontInfo:
                    break;

                case TagType.DefineFontInfo2:
                    break;

                case TagType.DefineFont:
                    break;

                case TagType.DefineFont2:
                    DefineFont2_3 df2 = new DefineFont2_3(_r, false);
                    Tags.Add(df2);
                    Fonts.Add(df2.FontId, df2);
                    break;

                case TagType.DefineFont3:
                    DefineFont2_3 df3 = new DefineFont2_3(_r, true);
                    Tags.Add(df3);
                    Fonts.Add(df3.FontId, df3);
                    break;

                case TagType.DefineFontAlignZones:
                    DefineFontAlignZonesTag dfaz = new DefineFontAlignZonesTag(_r, Fonts);
                    Tags.Add(dfaz);
                    break;

                case TagType.CSMTextSettings:
                    CSMTextSettingsTag csm = new CSMTextSettingsTag(_r);
                    Tags.Add(csm);
                    break;

                case TagType.DefineText:
                    DefineTextTag dt = new DefineTextTag(_r, false);
                    Tags.Add(dt);
                    break;

                case TagType.DefineText2:
                    DefineTextTag dt2 = new DefineTextTag(_r, true);
                    Tags.Add(dt2);
                    break;

                case TagType.DefineEditText:
                    Tags.Add(new DefineEditTextTag(_r));
                    break;

                case TagType.DefineFontName:
                    Tags.Add(new DefineFontName(_r));
                    break;

                // buttons
                case TagType.DefineButton:
                    Tags.Add(new DefineButton(_r));
                    break;

                case TagType.DefineButton2:
                    Tags.Add(new DefineButton2(_r));
                    break;

                case TagType.DefineButtonCxform:
                    Tags.Add(new DefineButtonCxform(_r));
                    break;

                case TagType.DefineButtonSound:
                    Tags.Add(new DefineButtonSound(_r));
                    break;

                // actions
                case TagType.ExportAssets:
                    Tags.Add(new ExportAssetsTag(_r));
                    break;

                case TagType.DoAction:
                    Tags.Add(new DoActionTag(_r, _curTagLen));
                    break;

                case TagType.DoInitAction:
                    Tags.Add(new DoActionTag(_r, _curTagLen, true));
                    break;

                // todo: defineMorphShape
                case TagType.DefineMorphShape:
                    Tags.Add(new UnsupportedDefinitionTag(_r, _curTag, "Morphs not supported"));
                    _r.SkipBytes(_curTagLen);
                    break;

                // todo: defineVideoStream
                case TagType.DefineVideoStream:
                    Tags.Add(new UnsupportedDefinitionTag(_r, _curTag, "Video not supported"));
                    _r.SkipBytes(_curTagLen);
                    break;

                case TagType.ImportAssets:
                case TagType.ImportAssets2:
                    Tags.Add(new UnsupportedDefinitionTag(_r, _curTag, "Import Assets not yet supported"));
                    _r.SkipBytes(_curTagLen);
                    break;

                // todo: ImportAssets tags
                case TagType.DoABC:
                    Tags.Add(new DoABCTag(_r, _curTagLen));
                    //_r.SkipBytes(_curTagLen);
                    break;

                case TagType.DoABC2:
                    Tags.Add(new DoABCTag(_r, _curTagLen, true));
                    //_r.SkipBytes(_curTagLen);
                    break;

                default:
                    // skip if unknown
                    Debug.WriteLine("unknown type: " + ((uint)_curTag).ToString("X2") + " -- ");
                    Log.AppendLine("Unhandled swf tag: " + ((uint)_curTag).ToString("X2") + " -- ");
                    Tags.Add(new UnsupportedDefinitionTag(_r, (uint)_curTag, "Unhandled swf tag: " + ((uint)_curTag).ToString("X2")));
                    _r.SkipBytes(_curTagLen);
                    break;
                }
                if (__tagEnd != _r.Position)
                {
                    Debug.WriteLine("bad tag: " + ((uint)_curTag).ToString("X2"));
                    Log.AppendLine("Tag not fully parsed: " + ((uint)_curTag).ToString("X2"));

                    _r.Position = __tagEnd;
                }
            }
        }