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));
}
}