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)); } }
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); }
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)); }
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(); }
public SpriteProperties(ref ShockwaveReader input) { StartFrame = input.ReadInt32(); EndFrame = input.ReadInt32(); input.ReadInt32(); Channel = input.ReadInt32(); SpritePropertiesOffsetsOffset = input.ReadInt32(); input.Advance(28); }
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; }