Example #1
0
        public TextCastProperties(ref ShockwaveReader input)
        {
            input.Advance(4);

            Alignment       = (TextAlignment)input.ReadInt16();
            BackgroundColor = input.ReadColor();

            Font       = input.ReadInt16();
            Rectangle  = input.ReadRect();
            LineHeight = input.ReadInt16();

            input.Advance(4);
            ButtonType = input.ReadInt16();
        }
        private void ReadInitialLoadSegment(ref ShockwaveReader input, AfterBurnerMapEntry[] entries, Dictionary <int, ChunkItem> chunks)
        {
            //First entry in the AfterBurnerMap must be ILS.
            AfterBurnerMapEntry ilsEntry = entries[0];

            input.Advance(ilsEntry.Offset);

            //TODO: this shouldn't be here
            ReadOnlySpan <byte> compressedData = input.ReadBytes(ilsEntry.Length);

            Span <byte> decompressedData = ilsEntry.DecompressedLength <= 1024 ?
                                           stackalloc byte[ilsEntry.DecompressedLength] : new byte[ilsEntry.DecompressedLength];

            ZLib.Decompress(compressedData, decompressedData);

            ShockwaveReader ilsReader = new ShockwaveReader(decompressedData, input.IsBigEndian);

            while (ilsReader.IsDataAvailable)
            {
                int id = ilsReader.Read7BitEncodedInt();

                AfterBurnerMapEntry entry = entries.FirstOrDefault(e => e.Id == id); //TODO: Chunk entries as dictionary
                if (entry == null)
                {
                    break;
                }

                chunks.Add(id, Read(ref ilsReader, entry.Header));
            }
        }
Example #3
0
        public void Populate(ref ShockwaveReader input, int scriptChunkOffset)
        {
            input.Advance(scriptChunkOffset + _codeOffset);
            input.ReadBytes(Body.Code);

            //input.PopulateVList(scriptChunkOffset + _argumentsOffset, Arguments, input.ReadInt16);
            //input.PopulateVList(scriptChunkOffset + _localsOffset, Locals, input.ReadInt16);
            //input.PopulateVList(scriptChunkOffset + _lineOffset, new List<byte>(), input.ReadByte);
        }
Example #4
0
        public DeflateShockwaveReader CreateDeflateReader(ref ShockwaveReader input)
        {
            input.Advance(2); //Skip ZLib header

            int dataLeft = Header.Length - input.Position;

            byte[] compressedData = input.ReadBytes(dataLeft).ToArray();

            return(new DeflateShockwaveReader(compressedData, input.IsBigEndian));
        }
Example #5
0
        public VideoCastProperties(ref ShockwaveReader input)
        {
            //TODO: A lot of unknown values.
            Type = input.ReadString((int)input.ReadUInt32());
            input.Advance(10);

            byte videoFlags = input.ReadByte();

            Streaming = ((videoFlags & 1) == 1);

            videoFlags    = input.ReadByte();
            HasSound      = ((videoFlags & 1) == 1);
            PausedAtStart = ((videoFlags & 2) == 2);

            Flags = (VideoCastFlags)input.ReadByte();
            input.Advance(3);
            Framerate = input.ReadByte();
            input.Advance(32);
            Rectangle = input.ReadRect();
        }
Example #6
0
        public SpriteProperties(ref ShockwaveReader input)
        {
            StartFrame = input.ReadInt32();
            EndFrame   = input.ReadInt32();

            input.ReadInt32();

            Channel = input.ReadInt32();
            SpritePropertiesOffsetsOffset = input.ReadInt32();

            input.Advance(28);
        }
Example #7
0
        public void Disassemble()
        {
            var input = new ShockwaveReader(_input.Span, Metadata.IsBigEndian);

            input.Advance(Metadata.Header.GetBodySize() + Metadata.GetBodySize());

            if (Metadata.Codec == CodecKind.FGDM ||
                Metadata.Codec == CodecKind.FGDC)
            {
                if (ChunkItem.Read(ref input) is FileVersionChunk version &&
                    ChunkItem.Read(ref input) is FileCompressionTypesChunk compressionTypes &&
                    ChunkItem.Read(ref input) is AfterburnerMapChunk afterburnerMap &&
                    ChunkItem.Read(ref input) is FileGzipEmbeddedImageChunk fgei)
                {
                    Chunks = fgei.ReadChunks(ref input, afterburnerMap.Entries);
                }
            }
            else if (Metadata.Codec == CodecKind.MV93)
            {
                var imapChunk = ChunkItem.Read(ref input) as InitialMapChunk;
                Version = imapChunk.Version;

                foreach (int offset in imapChunk.MemoryMapOffsets)
                {
                    input.Position = offset;
                    if (ChunkItem.Read(ref input) is MemoryMapChunk mmapChunk)
                    {
                        foreach (ChunkEntry entry in mmapChunk.Entries)
                        {
                            if (entry.Header.Kind == ChunkKind.RIFX)
                            {
                                continue;                                      //TODO: HACK
                            }
                            if (entry.Flags.HasFlag(ChunkEntryFlags.Ignore))
                            {
                                Chunks.Add(entry.Id, new UnknownChunk(ref input, entry.Header));
                                continue;
                            }

                            input.Position = entry.Offset;
                            Chunks.Add(entry.Id, ChunkItem.Read(ref input));
                        }
                    }
                }
            }

            //TODO:
            _input = null;
        }