private bool ReadTag()
{
int type;
uint followingOffset;
this.sdtr.ReadRECORDHEADER(out type, out followingOffset);
uint startOffset = this.sdtr.Offset;
#if DEBUG
Tag _tag = (Tag)type;
bool isDefine = _tag == Tag.DefineShape ||
_tag == Tag.DefineShape3 ||
_tag == Tag.DefineShape4 ||
_tag == Tag.DefineSprite;
this.MarkDumpOffset(
"Body of " + _tag + " (" + type + ") len=" + (followingOffset - this.sdtr.Offset),
isDefine);
this.binaryDumpNest++;
this.taglog.Add(_tag.ToString());
#endif
switch ((Tag)type)
{
case Tag.End:
#if DEBUG
this.binaryDumpNest--;
#endif
return false;
case Tag.ShowFrame:
#if DEBUG
this.MarkDumpOffset("");
#endif
this.frameCursor++;
break;
case Tag.Protect:
this.sdtr.Align8();
if (followingOffset > this.sdtr.Offset)
{
/*(void)*/this.sdtr.ReadUI16(); /* Reserved. Assumed 0. */
this.swf.ProtectHash = this.sdtr.ReadString();
#if DEBUG
this.Log("Protect hash = " + this.swf.ProtectHash);
#endif
}
break;
case Tag.SetBackgroundColor:
this.swf.BackgroundColor = this.sdtr.ReadRGB();
break;
case Tag.PlaceObject:
this.currentTimeline.GetFrame(this.frameCursor).AddTag(this.ReadPlaceObject(followingOffset));
break;
case Tag.PlaceObject2:
this.currentTimeline.GetFrame(this.frameCursor).AddTag(this.ReadPlaceObject2());
break;
case Tag.RemoveObject2:
this.currentTimeline.GetFrame(this.frameCursor).AddTag(this.ReadRemoveObject2());
break;
case Tag.DefineBits:
case Tag.DefineBitsJPEG2:
case Tag.DefineBitsLossless:
case Tag.DefineBitsLossless2:
this.ReadImageBlob((Tag)type, followingOffset);
break;
case Tag.JPEGTables:
jpegTable = new JPEGTable(this.sdtr.ReadByteBlock((int)(followingOffset - this.sdtr.Offset)));
break;
case Tag.DefineSprite:
this.ReadSprite();
break;
case Tag.DefineShape:
case Tag.DefineShape2:
case Tag.DefineShape3:
case Tag.DefineShape4:
this.ReadDefineShapeN((Tag)type, followingOffset);
break;
case Tag.DefineMorphShape:
case Tag.DefineMorphShape2:
this.ReadDefineMorphShape((Tag)type, followingOffset);
break;
case Tag.DefineSceneAndFrameLabelData:
this.ReadSceneAndFrameLabelData();
break;
case Tag.DoABC:
this.ReadDoABC(followingOffset);
break;
case Tag.SymbolClass:
this.ReadSymbolClass();
break;
case Tag.Metadata:
this.ReadXMLMetadata();
break;
case Tag.EnableDebugger2:
this.ReadEnableDebugger2();
break;
case Tag.FrameLabel:
this.currentTimeline.GetFrame(this.frameCursor).Label = this.sdtr.ReadString();
#if DEBUG
this.Log("Frame label = " + this.currentTimeline.GetFrame(this.frameCursor).Label);
#endif
break;
case Tag.DefineFont3:
this.ReadFont((Tag)type);
break;
case Tag.DefineFontAlignZones:
this.ReadFontAlignZones();
break;
case Tag.DefineFontName:
this.ReadFontName();
break;
case Tag.DefineText:
case Tag.DefineText2:
this.ReadText((Tag)type);
break;
case Tag.DefineEditText:
this.ReadEditText();
break;
default:
/* ISSUE 73 */
throw new SWFModellerException(
SWFModellerError.UnimplementedFeature,
@"Unsupported tag type: " + type, swf.Context);
}
this.FinishTag(followingOffset);
#if DEBUG
this.binaryDumpNest--;
#endif
return true;
}