/// <summary>Read a pattern number from the stream.</summary> /// <param name="stream"></param> /// <param name="patternCode"></param> /// <param name="patternNumber"></param> /// <returns></returns> protected static byte ReadPatternNumber(Stream stream, PicturePatternFlags patternCode, ref byte patternNumber) { if ((patternCode & PicturePatternFlags.UsePattern) != 0) { patternNumber = (byte)((ReadByte(stream) >> 1) & 0x7F); } return(patternNumber); }
/// <summary>Initialise the instruction.</summary> /// <param name="opcode"></param> /// <param name="patternFlags"></param> /// <param name="drawLocations"></param> public DrawPatterns(PictureOpcode opcode, PicturePatternFlags patternFlags, List <PicturePatternDrawLocation> drawLocations) : base(opcode) { if (drawLocations == null) { throw new ArgumentNullException("drawLocations"); } this.PatternFlags = patternFlags; this.DrawLocations = drawLocations; }
/// <summary>Read an instruction from the stream.</summary> /// <param name="stream"></param> /// <param name="patternFlags"></param> /// <param name="patternNumber"></param> /// <returns></returns> public static PictureInstruction ReadInstruction(Stream stream, ref PicturePatternFlags patternFlags, ref byte patternNumber) { PictureOpcode opcode = (PictureOpcode)ReadByte(stream); switch (opcode) { case PictureOpcode.SetColor: return(new SetColor(stream)); case PictureOpcode.DisableVisual: return(new DisableVisual()); case PictureOpcode.SetPriority: return(new SetPriority(stream)); case PictureOpcode.DisablePriority: return(new DisablePriority()); case PictureOpcode.DrawFloodfill: return(new DrawFloodfill(stream)); case PictureOpcode.SetPatternFlags: return(new SetPatternFlags(stream, ref patternFlags)); case PictureOpcode.SetControl: return(new SetControl(stream)); case PictureOpcode.DisableControl: return(new DisableControl()); case PictureOpcode.DrawRelativeMediumLines: case PictureOpcode.DrawRelativeLongLines: case PictureOpcode.DrawRelativeShortLines: return(new DrawLines(opcode, stream)); case PictureOpcode.DrawRelativeMediumPatterns: case PictureOpcode.DrawRelativePatterns: case PictureOpcode.DrawAbsolutePatterns: return(new DrawPatterns(opcode, stream, patternFlags, ref patternNumber)); case PictureOpcode.ExtendedOpcode: var extendedOpcode = (PictureExtendedOpcode)ReadByte(stream); switch (extendedOpcode) { case PictureExtendedOpcode.SetPaletteEntry: case PictureExtendedOpcode.SetPalette: return(new SetPalette(stream, extendedOpcode)); case PictureExtendedOpcode.Mono0: return(new Mono0(stream)); case PictureExtendedOpcode.Mono1: case PictureExtendedOpcode.Mono2: case PictureExtendedOpcode.Mono3: return(new Mono123(stream, extendedOpcode)); default: throw new Exception(String.Format("Unknown extended opcode 0x{0:X2} ({1})", (int)opcode, opcode)); } case PictureOpcode.Quit: return(new Quit()); default: throw new Exception(String.Format("Unknown opcode 0x{0:X2} ({1}).", (int)opcode, opcode)); } }
internal Picture(AssetLoader loader) : base(loader) { BinaryReader reader = loader.Reader; ushort check = reader.ReadUInt16(); Codex <PictureInstruction> instructions = new Codex <PictureInstruction>(); Codex <PictureCel> cels = new Codex <PictureCel>(); if (check == 0x0E) // VGA picture { int celCount = reader.ReadUInt16(); Unknowns.ReadInt16s(reader, 1); // 0x2A int paletteOffset = reader.ReadInt32(); Dimensions = new Vector2i(reader.ReadUInt16(), reader.ReadUInt16()); reader.BaseStream.Position = paletteOffset; Palette = new Palette(loader); AddChild(Palette); for (int celIndex = 0; celIndex < celCount; celIndex++) { PictureCel cel = new PictureCel(this, celIndex, loader); cels.Add(cel); AddChild(cel); instructions.Add(new PictureInstruction.DrawCel(cel)); } } else { Dimensions = new Vector2i(320, 190); reader.BaseStream.Seek(-2, SeekOrigin.Current); byte[] data = reader.ReadBytes(checked ((int)reader.BaseStream.Length)); Stream stream = new MemoryStream(data, false); PicturePatternFlags patternFlags = PicturePatternFlags.None; byte patternNumber = 0; while (true) { PictureInstruction instruction = PictureInstruction.ReadInstruction(stream, ref patternFlags, ref patternNumber); instructions.Add(instruction); if (instruction.IsQuit) { break; } } } Cels = cels; Instructions = instructions; }
static PicturePatternFlags Read(Stream stream, ref PicturePatternFlags patternCode) { return(patternCode = (PicturePatternFlags)(ReadByte(stream) & 0x37)); }
static PicturePatternFlags Read(Stream stream, ref PicturePatternFlags patternCode) { return patternCode = (PicturePatternFlags)(ReadByte(stream) & 0x37); }
/// <summary>Read the instruction.</summary> /// <param name="stream"></param> /// <param name="patternCode"></param> public SetPatternFlags(Stream stream, ref PicturePatternFlags patternCode) : this(Read(stream, ref patternCode)) { }
/// <summary>Initialise the instruction.</summary> /// <param name="patternFlags"></param> public SetPatternFlags(PicturePatternFlags patternFlags) : base(PictureOpcode.SetPatternFlags) { PatternFlags = patternFlags; }
/// <summary>Read a pattern number from the stream.</summary> /// <param name="stream"></param> /// <param name="patternCode"></param> /// <param name="patternNumber"></param> /// <returns></returns> protected static byte ReadPatternNumber(Stream stream, PicturePatternFlags patternCode, ref byte patternNumber) { if ((patternCode & PicturePatternFlags.UsePattern) != 0) patternNumber = (byte)((ReadByte(stream) >> 1) & 0x7F); return patternNumber; }
static List <PicturePatternDrawLocation> ReadPositions(Stream stream, PictureOpcode opcode, PicturePatternFlags patternFlags, ref byte patternNumber) { List <PicturePatternDrawLocation> list = new List <PicturePatternDrawLocation>(); Vector2i position; ReadPatternNumber(stream, patternFlags, ref patternNumber); position = ReadAbsoluteCoordinates(stream); list.Add(new PicturePatternDrawLocation(patternNumber, position)); while (PeekContinue(stream)) { ReadPatternNumber(stream, patternFlags, ref patternNumber); switch (opcode) { case PictureOpcode.DrawRelativePatterns: position = ReadShortRelativeCoordinates(stream, position); break; case PictureOpcode.DrawAbsolutePatterns: position = ReadAbsoluteCoordinates(stream); break; case PictureOpcode.DrawRelativeMediumPatterns: position = ReadMediumRelativeCoordinates(stream, position); break; default: throw new NotSupportedException(); } list.Add(new PicturePatternDrawLocation(patternNumber, position)); } return(list); }
/// <summary>Initialise the instruction.</summary> /// <param name="opcode"></param> /// <param name="stream"></param> /// <param name="patternFlags"></param> /// <param name="patternNumber"></param> public DrawPatterns(PictureOpcode opcode, Stream stream, PicturePatternFlags patternFlags, ref byte patternNumber) : this(opcode, patternFlags, ReadPositions(stream, opcode, patternFlags, ref patternNumber)) { }
/// <summary>Read an instruction from the stream.</summary> /// <param name="stream"></param> /// <param name="patternFlags"></param> /// <param name="patternNumber"></param> /// <returns></returns> public static PictureInstruction ReadInstruction(Stream stream, ref PicturePatternFlags patternFlags, ref byte patternNumber) { PictureOpcode opcode = (PictureOpcode)ReadByte(stream); switch (opcode) { case PictureOpcode.SetColor: return new SetColor(stream); case PictureOpcode.DisableVisual: return new DisableVisual(); case PictureOpcode.SetPriority: return new SetPriority(stream); case PictureOpcode.DisablePriority: return new DisablePriority(); case PictureOpcode.DrawFloodfill: return new DrawFloodfill(stream); case PictureOpcode.SetPatternFlags: return new SetPatternFlags(stream, ref patternFlags); case PictureOpcode.SetControl: return new SetControl(stream); case PictureOpcode.DisableControl: return new DisableControl(); case PictureOpcode.DrawRelativeMediumLines: case PictureOpcode.DrawRelativeLongLines: case PictureOpcode.DrawRelativeShortLines: return new DrawLines(opcode, stream); case PictureOpcode.DrawRelativeMediumPatterns: case PictureOpcode.DrawRelativePatterns: case PictureOpcode.DrawAbsolutePatterns: return new DrawPatterns(opcode, stream, patternFlags, ref patternNumber); case PictureOpcode.ExtendedOpcode: var extendedOpcode = (PictureExtendedOpcode)ReadByte(stream); switch (extendedOpcode) { case PictureExtendedOpcode.SetPaletteEntry: case PictureExtendedOpcode.SetPalette: return new SetPalette(stream, extendedOpcode); case PictureExtendedOpcode.Mono0: return new Mono0(stream); case PictureExtendedOpcode.Mono1: case PictureExtendedOpcode.Mono2: case PictureExtendedOpcode.Mono3: return new Mono123(stream, extendedOpcode); default: throw new Exception(String.Format("Unknown extended opcode 0x{0:X2} ({1})", (int)opcode, opcode)); } case PictureOpcode.Quit: return new Quit(); default: throw new Exception(String.Format("Unknown opcode 0x{0:X2} ({1}).", (int)opcode, opcode)); } }
static List<PicturePatternDrawLocation> ReadPositions(Stream stream, PictureOpcode opcode, PicturePatternFlags patternFlags, ref byte patternNumber) { List<PicturePatternDrawLocation> list = new List<PicturePatternDrawLocation>(); Vector2i position; ReadPatternNumber(stream, patternFlags, ref patternNumber); position = ReadAbsoluteCoordinates(stream); list.Add(new PicturePatternDrawLocation(patternNumber, position)); while (PeekContinue(stream)) { ReadPatternNumber(stream, patternFlags, ref patternNumber); switch (opcode) { case PictureOpcode.DrawRelativePatterns: position = ReadShortRelativeCoordinates(stream, position); break; case PictureOpcode.DrawAbsolutePatterns: position = ReadAbsoluteCoordinates(stream); break; case PictureOpcode.DrawRelativeMediumPatterns: position = ReadMediumRelativeCoordinates(stream, position); break; default: throw new NotSupportedException(); } list.Add(new PicturePatternDrawLocation(patternNumber, position)); } return list; }
/// <summary>Initialise the instruction.</summary> /// <param name="opcode"></param> /// <param name="patternFlags"></param> /// <param name="drawLocations"></param> public DrawPatterns(PictureOpcode opcode, PicturePatternFlags patternFlags, List<PicturePatternDrawLocation> drawLocations) : base(opcode) { if (drawLocations == null) throw new ArgumentNullException("drawLocations"); this.PatternFlags = patternFlags; this.DrawLocations = drawLocations; }