private void ParseTags() { bool tagsRemain = true; 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 = (TagType)(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(r)); tagsRemain = false; break; case TagType.FileAttributes: Tags.Add(new FileAttributesTag(r)); break; case TagType.BackgroundColor: Tags.Add(new BackgroundColorTag(r)); 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, "Morphs not supported")); r.SkipBytes(curTagLen); break; // todo: defineVideoStream case TagType.DefineVideoStream: Tags.Add(new UnsupportedDefinitionTag(r, "Video not supported")); r.SkipBytes(curTagLen); break; case TagType.ImportAssets: case TagType.ImportAssets2: Tags.Add(new UnsupportedDefinitionTag(r, "Import Assets not yet supported")); r.SkipBytes(curTagLen); break; // todo: ImportAssets tags default: // skip if unknown #if(DEBUG) Debug.WriteLine("unknown type: " + ((uint)curTag).ToString("X2") + " -- " + Enum.GetName(typeof(TagType), curTag)); r.SkipBytes(curTagLen); break; // throw new Exception("not defined " + ((uint)curTag).ToString("X2") + " -- " + Enum.GetName(typeof(TagType), curTag)); #else Debug.WriteLine("unknown type: " + ((uint)curTag).ToString("X2") + " -- " + Enum.GetName(typeof(TagType), curTag)); Log.AppendLine("Unhandled swf tag: " + ((uint)curTag).ToString("X2") + " -- " + Enum.GetName(typeof(TagType), curTag)); r.SkipBytes(curTagLen); break; #endif } if (tagEnd != r.Position) { Debug.WriteLine("bad tag: " + Enum.GetName(typeof(TagType), curTag)); Log.AppendLine("Tag not fully parsed: " + Enum.GetName(typeof(TagType), curTag)); r.Position = tagEnd; } } }
private void ParseDefineSpriteTag(DefineSpriteTag tag) { foreach (ISwfTag t in tag.ControlTags) { this.ParseTag(t); } }
private void ParseDefineSpriteTag(DefineSpriteTag tag) { uint rootFrame = curFrame; curFrame = 0; curTimeline = new Timeline(v.NextId()); curTimeline.FrameCount = tag.FrameCount; curTimeline.Id = tag.SpriteId; curTimeline.Duration = GetDuration(tag.FrameCount); v.Definitions.Add(curTimeline.Id, curTimeline); curDepthChart = new SortedDictionary<uint, Instance>(); foreach (ISwfTag t in tag.ControlTags) { this.ParseTag(t); } WriteEndTimes(); curTimeline.StrokeBounds = ParseSpriteBounds(tag); curTimeline = RootTimeline; curDepthChart = rootDepthChart; curFrame = rootFrame; }
private Rectangle ParseSpriteBounds(DefineSpriteTag tag) { Rectangle result = Rectangle.Empty; for (int i = 0; i < tag.FirstFrameObjects.Count; i++) { PlaceObjectTag o = (PlaceObjectTag)tag.FirstFrameObjects[i]; // yahoo has forward refs here... guard for now uint index = o.Character; if (!v.Definitions.ContainsKey(index)) { continue; } IDefinition def = this.v.Definitions[index]; Rectangle bnds = def.StrokeBounds; if (o.HasMatrix) { Point[] pts = new Point[] { bnds.Point, new Point(bnds.Point.X + bnds.Size.Width, bnds.Point.Y + bnds.Size.Height) }; // bugfix: needed to transform the translation from twips Matrix m = new Matrix(o.Matrix.ScaleX, o.Matrix.Rotate0, o.Matrix.Rotate1, o.Matrix.ScaleY, o.Matrix.TranslateX / twips, o.Matrix.TranslateY / twips); m.TransformPoints(pts); bnds = new Rectangle(pts[0], new Size(pts[1].X - pts[0].X, pts[1].Y - pts[0].Y)); } if (result == Rectangle.Empty) { result = bnds; // first placeObject } else { result = result.Union(bnds); // second+ } } tag.ShapeBounds = new Rect( (int)result.Point.X, (int)(result.Point.X + result.Size.Width), (int)result.Point.Y, (int)(result.Point.Y + result.Size.Height)); return result; }
private void ParseTags() { bool tagsRemain = true; 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 = (TagType)(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(r)); tagsRemain = false; break; case TagType.FileAttributes: Tags.Add(new FileAttributesTag(r)); break; case TagType.BackgroundColor: Tags.Add(new BackgroundColorTag(r)); 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, "Morphs not supported")); r.SkipBytes(curTagLen); break; // todo: defineVideoStream case TagType.DefineVideoStream: Tags.Add(new UnsupportedDefinitionTag(r, "Video not supported")); r.SkipBytes(curTagLen); break; case TagType.ImportAssets: case TagType.ImportAssets2: Tags.Add(new UnsupportedDefinitionTag(r, "Import Assets not yet supported")); r.SkipBytes(curTagLen); break; // todo: ImportAssets tags case TagType.SymbolClass: SymbolClassTag tag = new SymbolClassTag(r, curTagLen); Tags.Add(tag); for (int i = 0; i < tag.Ids.Length; i++) { SymbolClasses.Add(tag.Ids[i], tag.Names[i]); } break; default: // skip if unknown #if (DEBUG) Debug.WriteLine("unknown type: " + ((uint)curTag).ToString("X2") + " -- " + Enum.GetName(typeof(TagType), curTag)); r.SkipBytes(curTagLen); break; // throw new Exception("not defined " + ((uint)curTag).ToString("X2") + " -- " + Enum.GetName(typeof(TagType), curTag)); #else Debug.WriteLine("unknown type: " + ((uint)curTag).ToString("X2") + " -- " + Enum.GetName(typeof(TagType), curTag)); Log.AppendLine("Unhandled swf tag: " + ((uint)curTag).ToString("X2") + " -- " + Enum.GetName(typeof(TagType), curTag)); r.SkipBytes(curTagLen); break; #endif } if (tagEnd != r.Position) { Debug.WriteLine("bad tag: " + Enum.GetName(typeof(TagType), curTag)); Log.AppendLine("Tag not fully parsed: " + Enum.GetName(typeof(TagType), curTag)); r.Position = tagEnd; } } }