Beispiel #1
0
 public static void AreEqual(PlaceObject3Tag expected, PlaceObject3Tag actual)
 {
     Assert.AreEqual(expected.CharacterID, actual.CharacterID);
     Assert.AreEqual(expected.Depth, actual.Depth);
     AssertData.AreEqual(expected.Matrix, actual.Matrix, "Matrix");
     AssertFilters.AreEqual(expected.Filters, actual.Filters, "PlaceObject3.Filters");
     Assert.AreEqual(expected.RestData, actual.RestData);
 }
Beispiel #2
0
 public static void AreEqual(PlaceObject3Tag expected, PlaceObject3Tag actual)
 {
     Assert.AreEqual(expected.CharacterID, actual.CharacterID);
     Assert.AreEqual(expected.Depth, actual.Depth);
     AssertData.AreEqual(expected.Matrix, actual.Matrix, "Matrix");
     AssertFilters.AreEqual(expected.Filters, actual.Filters, "PlaceObject3.Filters");
     Assert.AreEqual(expected.RestData, actual.RestData);
 }
Beispiel #3
0
        SwfTagData ISwfTagVisitor <ISwfStreamWriter, SwfTagData> .Visit(PlaceObject3Tag tag, ISwfStreamWriter writer)
        {
            writer.WriteBit(tag.HasClipActions);
            writer.WriteBit(tag.ClipDepth.HasValue);
            writer.WriteBit(tag.Name != null);
            writer.WriteBit(tag.Ratio.HasValue);
            writer.WriteBit(tag.ColorTransform.HasValue);
            writer.WriteBit(tag.HasMatrix);
            writer.WriteBit(tag.HasCharacter);
            writer.WriteBit(tag.Move);

            writer.WriteBit(tag.Reserved);
            writer.WriteBit(tag.HasOpaqueBackground);
            writer.WriteBit(tag.Visible.HasValue);
            writer.WriteBit(tag.HasImage);
            writer.WriteBit(tag.ClassName != null);
            writer.WriteBit(tag.BitmapCache.HasValue);
            writer.WriteBit(tag.BlendMode.HasValue);
            writer.WriteBit(tag.HasFilterList);

            writer.WriteUInt16(tag.Depth);

            if (tag.ClassName != null)   //Adobe says class name is also present when (hasImage && hasCharacter)
            {
                writer.WriteString(tag.ClassName);
            }

            if (tag.HasCharacter)
            {
                writer.WriteUInt16(tag.CharacterID);
            }

            if (tag.HasMatrix)
            {
                writer.WriteMatrix(ref tag.Matrix);
            }

            if (tag.ColorTransform.HasValue)
            {
                writer.WriteColorTransformRGBA(tag.ColorTransform.Value);
            }

            if (tag.Ratio.HasValue)
            {
                writer.WriteUInt16(tag.Ratio.Value);
            }
            if (tag.Name != null)
            {
                writer.WriteString(tag.Name);
            }
            if (tag.ClipDepth.HasValue)
            {
                writer.WriteUInt16(tag.ClipDepth.Value);
            }

            if (tag.HasFilterList)
            {
                writer.WriteFilterList(tag.Filters);
            }

            if (tag.BlendMode.HasValue)
            {
                writer.WriteByte((byte)tag.BlendMode.Value);
            }

            if (tag.BitmapCache.HasValue)
            {
                writer.WriteByte(tag.BitmapCache.Value);
            }

            if (tag.Visible.HasValue)
            {
                writer.WriteByte(tag.Visible.Value);
                writer.WriteRGBA(tag.BackgroundColor);
            }

            if (tag.HasClipActions)
            {
                writer.WriteClipActions(_file.FileInfo.Version, tag.ClipActions);
            }
            return(null);
        }
Beispiel #4
0
        SwfTagBase ISwfTagVisitor <ISwfStreamReader, SwfTagBase> .Visit(PlaceObject3Tag tag, ISwfStreamReader reader)
        {
            tag.HasClipActions    = reader.ReadBit();
            tag.HasClipDepth      = reader.ReadBit();
            tag.HasName           = reader.ReadBit();
            tag.HasRatio          = reader.ReadBit();
            tag.HasColorTransform = reader.ReadBit();
            tag.HasMatrix         = reader.ReadBit();
            tag.HasCharacter      = reader.ReadBit();
            tag.Move = reader.ReadBit();

            tag.Reserved            = reader.ReadBit();
            tag.HasOpaqueBackground = reader.ReadBit();
            tag.HasVisible          = reader.ReadBit();
            tag.HasImage            = reader.ReadBit();
            tag.HasClassName        = reader.ReadBit();
            tag.HasCacheAsBitmap    = reader.ReadBit();
            tag.HasBlendMode        = reader.ReadBit();
            tag.HasFilterList       = reader.ReadBit();

            tag.Depth = reader.ReadUInt16();
            if (tag.HasClassName)   //Adobe says class name is also present when (hasImage && hasCharacter)
            {
                tag.ClassName = reader.ReadString();
            }

            if (tag.HasCharacter)
            {
                tag.CharacterID = reader.ReadUInt16();
            }

            if (tag.HasMatrix)
            {
                tag.Matrix = reader.ReadMatrix();
            }

            if (tag.HasColorTransform)
            {
                tag.ColorTransform = reader.ReadColorTransformRGBA();
            }

            if (tag.HasRatio)
            {
                tag.Ratio = reader.ReadUInt16();
            }

            if (tag.HasName)
            {
                tag.Name = reader.ReadString();
            }

            if (tag.HasClipDepth)
            {
                tag.ClipDepth = reader.ReadUInt16();
            }

            if (tag.HasFilterList)
            {
                reader.ReadFilterList(tag.Filters);
            }

            if (tag.HasBlendMode)
            {
                tag.BlendMode = (BlendMode?)reader.ReadByte();
            }

            if (tag.HasVisible)
            {
                tag.Visible = reader.ReadByte();
                if (reader.BytesLeft > 0)
                {
                    tag.BackgroundColor = reader.ReadRGBA();
                }
            }

            if (tag.HasClipActions)
            {
                reader.ReadClipActions(_file.FileInfo.Version, tag.ClipActions);
            }
            return(tag);
        }
Beispiel #5
0
        static SwfTagBase Create(SwfTagData tag_data)
        {
            var reader = new SwfStreamReader(tag_data.TagData);

            switch (tag_data.TagId)
            {
            // Display list
            case (int)SwfTagType.PlaceObject:                  return(PlaceObjectTag.Create(reader));

            case (int)SwfTagType.PlaceObject2:                 return(PlaceObject2Tag.Create(reader));

            case (int)SwfTagType.PlaceObject3:                 return(PlaceObject3Tag.Create(reader));

            case (int)SwfTagType.RemoveObject:                 return(RemoveObjectTag.Create(reader));

            case (int)SwfTagType.RemoveObject2:                return(RemoveObject2Tag.Create(reader));

            case (int)SwfTagType.ShowFrame:                    return(ShowFrameTag.Create(reader));

            // Control
            case (int)SwfTagType.SetBackgroundColor:           return(SetBackgroundColorTag.Create(reader));

            case (int)SwfTagType.FrameLabel:                   return(FrameLabelTag.Create(reader));

            case (int)SwfTagType.Protect:                      return(ProtectTag.Create(reader));

            case (int)SwfTagType.End:                          return(EndTag.Create(reader));

            case (int)SwfTagType.ExportAssets:                 return(ExportAssetsTag.Create(reader));

            case (int)SwfTagType.ImportAssets:                 return(UnsupportedTag.Create(SwfTagType.ImportAssets));

            case (int)SwfTagType.EnableDebugger:               return(EnableDebuggerTag.Create(reader));

            case (int)SwfTagType.EnableDebugger2:              return(EnableDebugger2Tag.Create(reader));

            case (int)SwfTagType.ScriptLimits:                 return(ScriptLimitsTag.Create(reader));

            case (int)SwfTagType.SetTabIndex:                  return(UnsupportedTag.Create(SwfTagType.SetTabIndex));

            case (int)SwfTagType.ImportAssets2:                return(UnsupportedTag.Create(SwfTagType.ImportAssets2));

            case (int)SwfTagType.SymbolClass:                  return(SymbolClassTag.Create(reader));

            case (int)SwfTagType.Metadata:                     return(MetadataTag.Create(reader));

            case (int)SwfTagType.DefineScalingGrid:            return(UnsupportedTag.Create(SwfTagType.DefineScalingGrid));

            case (int)SwfTagType.DefineSceneAndFrameLabelData: return(DefineSceneAndFrameLabelDataTag.Create(reader));

            // Actions
            case (int)SwfTagType.DoAction:                     return(UnsupportedTag.Create(SwfTagType.DoAction));

            case (int)SwfTagType.DoInitAction:                 return(UnsupportedTag.Create(SwfTagType.DoInitAction));

            case (int)SwfTagType.DoABC:                        return(DoABCTag.Create(reader));

            // Shape
            case (int)SwfTagType.DefineShape:                  return(DefineShapeTag.Create(reader));

            case (int)SwfTagType.DefineShape2:                 return(DefineShape2Tag.Create(reader));

            case (int)SwfTagType.DefineShape3:                 return(DefineShape3Tag.Create(reader));

            case (int)SwfTagType.DefineShape4:                 return(DefineShape4Tag.Create(reader));

            // Bitmaps
            case (int)SwfTagType.DefineBits:                   return(UnsupportedTag.Create(SwfTagType.DefineBits));

            case (int)SwfTagType.JPEGTables:                   return(UnsupportedTag.Create(SwfTagType.JPEGTables));

            case (int)SwfTagType.DefineBitsJPEG2:              return(UnsupportedTag.Create(SwfTagType.DefineBitsJPEG2));

            case (int)SwfTagType.DefineBitsJPEG3:              return(UnsupportedTag.Create(SwfTagType.DefineBitsJPEG3));

            case (int)SwfTagType.DefineBitsLossless:           return(DefineBitsLosslessTag.Create(reader));

            case (int)SwfTagType.DefineBitsLossless2:          return(DefineBitsLossless2Tag.Create(reader));

            case (int)SwfTagType.DefineBitsJPEG4:              return(UnsupportedTag.Create(SwfTagType.DefineBitsJPEG4));

            // Shape Morphing
            case (int)SwfTagType.DefineMorphShape:             return(UnsupportedTag.Create(SwfTagType.DefineMorphShape));

            case (int)SwfTagType.DefineMorphShape2:            return(UnsupportedTag.Create(SwfTagType.DefineMorphShape2));

            // Fonts and Text
            case (int)SwfTagType.DefineFont:                   return(UnsupportedTag.Create(SwfTagType.DefineFont));

            case (int)SwfTagType.DefineFontInfo:               return(UnsupportedTag.Create(SwfTagType.DefineFontInfo));

            case (int)SwfTagType.DefineFontInfo2:              return(UnsupportedTag.Create(SwfTagType.DefineFontInfo2));

            case (int)SwfTagType.DefineFont2:                  return(UnsupportedTag.Create(SwfTagType.DefineFont2));

            case (int)SwfTagType.DefineFont3:                  return(UnsupportedTag.Create(SwfTagType.DefineFont3));

            case (int)SwfTagType.DefineFontAlignZones:         return(UnsupportedTag.Create(SwfTagType.DefineFontAlignZones));

            case (int)SwfTagType.DefineFontName:               return(UnsupportedTag.Create(SwfTagType.DefineFontName));

            case (int)SwfTagType.DefineText:                   return(UnsupportedTag.Create(SwfTagType.DefineText));

            case (int)SwfTagType.DefineText2:                  return(UnsupportedTag.Create(SwfTagType.DefineText2));

            case (int)SwfTagType.DefineEditText:               return(UnsupportedTag.Create(SwfTagType.DefineEditText));

            case (int)SwfTagType.CSMTextSettings:              return(UnsupportedTag.Create(SwfTagType.CSMTextSettings));

            case (int)SwfTagType.DefineFont4:                  return(UnsupportedTag.Create(SwfTagType.DefineFont4));

            // Sounds
            case (int)SwfTagType.DefineSound:                  return(UnsupportedTag.Create(SwfTagType.DefineSound));

            case (int)SwfTagType.StartSound:                   return(UnsupportedTag.Create(SwfTagType.StartSound));

            case (int)SwfTagType.StartSound2:                  return(UnsupportedTag.Create(SwfTagType.StartSound2));

            case (int)SwfTagType.SoundStreamHead:              return(UnsupportedTag.Create(SwfTagType.SoundStreamHead));

            case (int)SwfTagType.SoundStreamHead2:             return(UnsupportedTag.Create(SwfTagType.SoundStreamHead2));

            case (int)SwfTagType.SoundStreamBlock:             return(UnsupportedTag.Create(SwfTagType.SoundStreamBlock));

            // Buttons
            case (int)SwfTagType.DefineButton:                 return(UnsupportedTag.Create(SwfTagType.DefineButton));

            case (int)SwfTagType.DefineButton2:                return(UnsupportedTag.Create(SwfTagType.DefineButton2));

            case (int)SwfTagType.DefineButtonCxform:           return(UnsupportedTag.Create(SwfTagType.DefineButtonCxform));

            case (int)SwfTagType.DefineButtonSound:            return(UnsupportedTag.Create(SwfTagType.DefineButtonSound));

            // Sprites and Movie Clips
            case (int)SwfTagType.DefineSprite:                 return(DefineSpriteTag.Create(reader));

            // Video
            case (int)SwfTagType.DefineVideoStream:            return(UnsupportedTag.Create(SwfTagType.DefineVideoStream));

            case (int)SwfTagType.VideoFrame:                   return(UnsupportedTag.Create(SwfTagType.VideoFrame));

            // Metadata
            case (int)SwfTagType.FileAttributes:               return(FileAttributesTag.Create(reader));

            case (int)SwfTagType.EnableTelemetry:              return(EnableTelemetryTag.Create(reader));

            case (int)SwfTagType.DefineBinaryData:             return(DefineBinaryDataTag.Create(reader));

            default:                                           return(UnknownTag.Create(tag_data.TagId));
            }
        }
Beispiel #6
0
 ITagFormatter ISwfTagVisitor <object, ITagFormatter> .Visit(PlaceObject3Tag tag, object arg)
 {
     return(new PlaceObject3TagFormatter());
 }
        public SwfDisplayList Visit(PlaceObject3Tag tag, SwfDisplayList dl)
        {
            var is_shape  = tag.HasCharacter && Library.HasDefine <SwfLibraryShapeDefine>(tag.CharacterId);
            var is_sprite = tag.HasCharacter && Library.HasDefine <SwfLibrarySpriteDefine>(tag.CharacterId);

            if (tag.HasCharacter)
            {
                SwfDisplayInstance old_inst = null;
                if (tag.Move)                     // replace character
                {
                    if (dl.Instances.TryGetValue(tag.Depth, out old_inst))
                    {
                        dl.Instances.Remove(tag.Depth);
                    }
                }
                // new character
                SwfDisplayInstance new_inst = null;
                if (is_shape)
                {
                    new_inst = new SwfDisplayShapeInstance();
                }
                else if (is_sprite)
                {
                    new_inst = new SwfDisplaySpriteInstance();
                }
                if (new_inst != null)
                {
                    new_inst.Id             = tag.CharacterId;
                    new_inst.Depth          = tag.Depth;
                    new_inst.ClipDepth      = tag.HasClipDepth      ? tag.ClipDepth      : (old_inst != null ? old_inst.ClipDepth      : (ushort)0);
                    new_inst.Visible        = tag.HasVisible        ? tag.Visible        : (old_inst != null ? old_inst.Visible        : true);
                    new_inst.Matrix         = tag.HasMatrix         ? tag.Matrix         : (old_inst != null ? old_inst.Matrix         : SwfMatrix.identity);
                    new_inst.BlendMode      = tag.HasBlendMode      ? tag.BlendMode      : (old_inst != null ? old_inst.BlendMode      : SwfBlendMode.identity);
                    new_inst.FilterList     = tag.HasFilterList     ? tag.SurfaceFilters : (old_inst != null ? old_inst.FilterList     : SwfSurfaceFilters.identity);
                    new_inst.ColorTransform = tag.HasColorTransform ? tag.ColorTransform : (old_inst != null ? old_inst.ColorTransform : SwfColorTransform.identity);
                    dl.Instances.Add(new_inst.Depth, new_inst);
                }
            }
            else if (tag.Move)                   // move character
            {
                SwfDisplayInstance inst;
                if (dl.Instances.TryGetValue(tag.Depth, out inst))
                {
                    if (tag.HasClipDepth)
                    {
                        inst.ClipDepth = tag.ClipDepth;
                    }
                    if (tag.HasVisible)
                    {
                        inst.Visible = tag.Visible;
                    }
                    if (tag.HasMatrix)
                    {
                        inst.Matrix = tag.Matrix;
                    }
                    if (tag.HasBlendMode)
                    {
                        inst.BlendMode = tag.BlendMode;
                    }
                    if (tag.HasFilterList)
                    {
                        inst.FilterList = tag.SurfaceFilters;
                    }
                    if (tag.HasColorTransform)
                    {
                        inst.ColorTransform = tag.ColorTransform;
                    }
                }
            }
            return(dl);
        }