public void read(Reader reader) { reader.ReadInt16(); // "BM" reader.ReadInt32(); // totalFileSize reader.ReadInt32(); // Unused int pixelPos = reader.ReadInt32(); reader.seek(14 + 4, System.IO.SeekOrigin.Begin); width = reader.ReadByte(); width |= reader.ReadByte() << 8; width |= reader.ReadByte() << 16; width |= reader.ReadByte() << 24; height = reader.ReadByte(); height |= reader.ReadByte() << 8; height |= reader.ReadByte() << 16; height |= reader.ReadByte() << 24; reader.BaseStream.Position += sizeof(ushort); bool indexed = reader.ReadUInt16() <= 8; //bpp if (!indexed) { throw new Exception("RSDK-Formatted Bitmap files must be indexed!"); } reader.BaseStream.Position += 4 * sizeof(int); int clrCount = reader.ReadInt32(); // how many colours used reader.seek(14 + 40, System.IO.SeekOrigin.Begin); for (int c = 0; c < clrCount; c++) { palette[c].B = reader.ReadByte(); palette[c].G = reader.ReadByte(); palette[c].R = reader.ReadByte(); reader.ReadByte(); // unused } long expectedPixelPos = (reader.BaseStream.Length - height * width); if (pixelPos != expectedPixelPos) { throw new Exception("RSDK-Formatted Bitmap files must end with the pixel data!"); } // This is how RSDK does it but there's a small chance it could maybe be wrong reader.seek(expectedPixelPos, System.IO.SeekOrigin.Begin); pixels = new byte[width * height]; int gfxPos = width * (height - 1); for (int y = 0; y < height; ++y) { for (int x = 0; x < width; ++x) { pixels[gfxPos++] = reader.ReadByte(); } gfxPos -= 2 * width; } reader.Close(); }
public void ReadGIFData(Reader reader) { int eighthHeight = Height >> 3; int quarterHeight = Height >> 2; int halfHeight = Height >> 1; int bitsWidth = 0; int width = 0; Entry[] codeTable = new Entry[0x10000]; ImageData = new byte[Width * Height + 1]; for (int i = 0; i < 0x10000; i++) { codeTable[i] = new Entry(); } // Get frame byte type, subtype, temp; type = reader.ReadByte(); while (type != 0) { bool tableFull, interlaced; int codeSize, initCodeSize; int clearCode, eoiCode, emptyCode; int codeToAddFrom, mark, str_len = 0, frm_off = 0; uint currentCode; switch (type) { // Extension case 0x21: subtype = reader.ReadByte(); switch (subtype) { // Graphics Control Extension case 0xF9: reader.ReadBytes(0x06); // temp = reader.ReadByte(); // Block Size [byte] (always 0x04) // temp = reader.ReadByte(); // Packed Field [byte] // // temp16 = reader.ReadUInt16(); // Delay Time [short] // // temp = reader.ReadByte(); // Transparent Color Index? [byte] // // temp = reader.ReadByte(); // Block Terminator [byte] // break; // Plain Text Extension case 0x01: // Comment Extension case 0xFE: // Application Extension case 0xFF: temp = reader.ReadByte(); // Block Size // Continue until we run out of blocks while (temp != 0) { // Read block reader.ReadBytes(temp); temp = reader.ReadByte(); // next block Size } break; default: Console.WriteLine("GIF LOAD FAILED"); return; } break; // Image descriptor case 0x2C: // temp16 = reader.ReadUInt16(); // Destination X // temp16 = reader.ReadUInt16(); // Destination Y // temp16 = reader.ReadUInt16(); // Destination Width // temp16 = reader.ReadUInt16(); // Destination Height reader.ReadBytes(8); temp = reader.ReadByte(); // Packed Field [byte] // If a local color table exists, if ((temp & 0x80) != 0) { int size = 2 << (temp & 0x07); // Load all colors for (int i = 0; i < size; i++) { byte r = reader.ReadByte(); byte g = reader.ReadByte(); byte b = reader.ReadByte(); FramePalette.Add(Color.FromArgb(r, g, b)); } } interlaced = (temp & 0x40) == 0x40; if (interlaced) { bitsWidth = 0; while (width != 0) { width >>= 1; bitsWidth++; } width = Width - 1; } codeSize = reader.ReadByte(); clearCode = 1 << codeSize; eoiCode = clearCode + 1; emptyCode = eoiCode + 1; codeSize++; initCodeSize = codeSize; // Init table for (int i = 0; i <= eoiCode; i++) { codeTable[i].Length = 1; codeTable[i].Prefix = 0xFFF; codeTable[i].Suffix = (byte)i; } blockLength = 0; bitCache = 0b00000000; bitCacheLength = 0; tableFull = false; currentCode = ReadCode(reader, codeSize); codeSize = initCodeSize; emptyCode = eoiCode + 1; tableFull = false; Entry entry = new Entry(); entry.Suffix = 0; while (blockLength != 0) { codeToAddFrom = -1; mark = 0; if (currentCode == clearCode) { codeSize = initCodeSize; emptyCode = eoiCode + 1; tableFull = false; } else if (!tableFull) { codeTable[emptyCode].Length = (ushort)(str_len + 1); codeTable[emptyCode].Prefix = (ushort)currentCode; codeTable[emptyCode].Suffix = entry.Suffix; emptyCode++; // Once we reach highest code, increase code size if ((emptyCode & (emptyCode - 1)) == 0) { mark = 1; } else { mark = 0; } if (emptyCode >= 0x1000) { mark = 0; tableFull = true; } } currentCode = ReadCode(reader, codeSize); if (currentCode == clearCode) { continue; } if (currentCode == eoiCode) { return; } if (mark == 1) { codeSize++; } entry = codeTable[currentCode]; str_len = entry.Length; while (true) { int p = frm_off + entry.Length - 1; if (interlaced) { int row = p >> bitsWidth; if (row < eighthHeight) { p = (p & width) + ((((row) << 3) + 0) << bitsWidth); } else if (row < quarterHeight) { p = (p & width) + ((((row - eighthHeight) << 3) + 4) << bitsWidth); } else if (row < halfHeight) { p = (p & width) + ((((row - quarterHeight) << 2) + 2) << bitsWidth); } else { p = (p & width) + ((((row - halfHeight) << 1) + 1) << bitsWidth); } } ImageData[p] = entry.Suffix; if (entry.Prefix != 0xFFF) { entry = codeTable[entry.Prefix]; } else { break; } } frm_off += str_len; if (currentCode < emptyCode - 1 && !tableFull) { codeTable[emptyCode - 1].Suffix = entry.Suffix; } } break; } type = reader.ReadByte(); if (type == 0x3B) { break; } } }
public ParallaxValues(Reader reader) { RHSpeed = reader.ReadByte(); CHSpeed = reader.ReadByte(); Deform = reader.ReadByte(); }
public UnknownValues(Reader reader) { Value1 = reader.ReadByte(); Value2 = reader.ReadByte(); Value3 = reader.ReadByte(); }
public Level(Reader reader) { Title = reader.ReadRSDKString(); Console.WriteLine(Title); byte[] buffer = new byte[5]; reader.Read(displayBytes, 0, 5); //Waste 5 bytes, I don't care about them right now. //The first 4 bytes are loaded into StageSystem.ActiveTileLayers. 5th byte is tLayerMidPoint. //If you want to know the values then look at the values for "DisplayBytes" reader.Read(buffer, 0, 2); //Read size width = 0; height = 0; // Map width in 128 pixel units // In RSDKv2, it's one byte long width = buffer[0]; height = buffer[1]; MapLayout = new ushort[height][]; for (int i = 0; i < height; i++) { MapLayout[i] = new ushort[width]; } for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { // 128x128 Block number is 16-bit // Big-Endian in RSDKv2 and RSDKv3 reader.Read(buffer, 0, 2); //Read size MapLayout[y][x] = (ushort)(buffer[1] + (buffer[0] << 8)); } } // Read number of object types, Only RSDKv2 and RSDKv3 support this feature int ObjTypeCount = reader.ReadByte(); for (int n = 0; n < ObjTypeCount; n++) { string name = reader.ReadRSDKString(); objectTypeNames.Add(name); Console.WriteLine(name); } // Read object data int ObjCount = 0; // 2 bytes, big-endian, unsigned ObjCount = reader.ReadByte() << 8; ObjCount |= reader.ReadByte(); int obj_type = 0; int obj_subtype = 0; int obj_xPos = 0; int obj_yPos = 0; for (int n = 0; n < ObjCount; n++) { // Object type, 1 byte, unsigned obj_type = reader.ReadByte(); // Object subtype, 1 byte, unsigned obj_subtype = reader.ReadByte(); // X Position, 2 bytes, big-endian, signed obj_xPos = reader.ReadSByte() << 8; obj_xPos |= reader.ReadByte(); // Y Position, 2 bytes, big-endian, signed obj_yPos = reader.ReadSByte() << 8; obj_yPos |= reader.ReadByte(); // Add object objects.Add(new Object(obj_type, obj_subtype, obj_xPos, obj_yPos)); } reader.Close(); }
public void read(Reader reader, ushort width, ushort height) { int frameSize = reader.ReadInt32(); byte[] gifData = new byte[frameSize + 13]; // Write Header gifData[0] = (byte)'G'; gifData[1] = (byte)'I'; gifData[2] = (byte)'F'; gifData[3] = (byte)'8'; gifData[4] = (byte)'9'; gifData[5] = (byte)'a'; byte[] bytes = BitConverter.GetBytes(width); gifData[6] = bytes[0]; gifData[7] = bytes[1]; bytes = BitConverter.GetBytes(height); gifData[8] = bytes[0]; gifData[9] = bytes[1]; // 1 == hasColours, 6 == paletteSize of 128, 7 == 8bpp gifData[10] = (1 << 7) | (6 << 4) | 6; gifData[11] = 0; gifData[12] = 0; // Read Data reader.Read(gifData, 13, (int)frameSize); List <Color> globalPalette = new List <Color>(); List <Color> localPalette = new List <Color>(); using (var gifStream = new System.IO.MemoryStream(gifData)) { using (var gifReader = new Reader(gifStream)) { reader.BaseStream.Position = 13; for (int i = 0; i < 0x80; ++i) { byte r = reader.ReadByte(); byte g = reader.ReadByte(); byte b = reader.ReadByte(); globalPalette.Add(Color.FromArgb(r, g, b)); } byte buffer = reader.ReadByte(); while (buffer != (byte)',') { buffer = reader.ReadByte(); } reader.ReadUInt16(); reader.ReadUInt16(); reader.ReadUInt16(); reader.ReadUInt16(); byte info = reader.ReadByte(); if (info >> 7 == 1) { for (int i = 0; i < 0x80; ++i) { byte r = reader.ReadByte(); byte g = reader.ReadByte(); byte b = reader.ReadByte(); localPalette.Add(Color.FromArgb(r, g, b)); } } } } using (var gifStream = new System.IO.MemoryStream(gifData)) image = Image.FromStream(gifStream); // ColorPalette pal = new ColorPalette(); // pal.Entries[0]] // image.Palette = pal; videoFilePos += frameSize; reader.BaseStream.Position = videoFilePos; }
public GraphicsImage(Reader reader, bool dcGFX = false) { if (dcGFX) { reader.ReadByte(); } width = (ushort)(reader.ReadByte() << 8); width |= reader.ReadByte(); height = (ushort)(reader.ReadByte() << 8); height |= reader.ReadByte(); // Create image gfxImage = new Bitmap(width, height, PixelFormat.Format8bppIndexed); ColorPalette cp = gfxImage.Palette; // Read & Process palette for (int i = 0; i < 255; i++) { GFXpal[i].R = reader.ReadByte(); GFXpal[i].G = reader.ReadByte(); GFXpal[i].B = reader.ReadByte(); cp.Entries[i] = Color.FromArgb(255, GFXpal[i].R, GFXpal[i].G, GFXpal[i].B); } gfxImage.Palette = cp; //Read Image Data byte[] buf = new byte[3]; bool finished = false; int cnt = 0; int loop = 0; data = new byte[(width * height) + 1]; while (!finished) { buf[0] = reader.ReadByte(); if (buf[0] == 255) { buf[1] = reader.ReadByte(); if (buf[1] == 255) { finished = true; break; } else { buf[2] = reader.ReadByte(); loop = 0; // Repeat value needs to decreased by one to decode // the graphics from the Dreamcast demo if (dcGFX) { buf[2]--; } while (loop < buf[2] && !reader.IsEof) { data[cnt++] = buf[1]; loop++; } } } else { data[cnt++] = buf[0]; } } //Console.Write("file Length = " + reader.BaseStream.Length + " file pos = " + reader.Pos + " data remaining = " + (reader.BaseStream.Length - reader.Pos)); // Write data to image int pixel = 0; for (int h = 0; h < height; h++) { for (int w = 0; w < width; w++) { BitmapData ImgData = gfxImage.LockBits(new Rectangle(new Point(w, h), new Size(1, 1)), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format8bppIndexed); byte b = System.Runtime.InteropServices.Marshal.ReadByte(ImgData.Scan0); System.Runtime.InteropServices.Marshal.WriteByte(ImgData.Scan0, (data[pixel])); gfxImage.UnlockBits(ImgData); pixel++; } } reader.Close(); }
public void read(Reader reader, bool skipHeader = false, int clrCnt = 0x80) { #region Header if (!skipHeader) { reader.seek(6, System.IO.SeekOrigin.Begin); // GIF89a width = reader.ReadByte(); width |= (ushort)(reader.ReadByte() << 8); height = reader.ReadByte(); height |= (ushort)(reader.ReadByte() << 8); byte info = reader.ReadByte(); // Palette Size clrCnt = (info & 0x7) + 1; if (clrCnt > 0) { clrCnt = 1 << clrCnt; } reader.ReadByte(); // background colour index reader.ReadByte(); // unused if (clrCnt != 0x100) { throw new Exception("RSDK-Formatted Gif files must use 256 colours!"); } } for (int c = 0; c < clrCnt; ++c) { palette[c].R = reader.ReadByte(); palette[c].G = reader.ReadByte(); palette[c].B = reader.ReadByte(); } #endregion #region Blocks byte blockType = reader.ReadByte(); while (blockType != 0 && blockType != ';') { switch (blockType) { default: // Unknown Console.WriteLine($"Unknown Block Type ({blockType})"); break; case (byte)'!': // Extension { byte extensionType = reader.ReadByte(); switch (extensionType) { case 0xF9: // Graphics Control Extension { int blockSize = reader.ReadByte(); byte disposalFlag = reader.ReadByte(); ushort frameDelay = reader.ReadUInt16(); byte transparentIndex = reader.ReadByte(); reader.ReadByte(); // terminator } break; case 0x01: // Plain Text Extension case 0xFE: // Comment Extension case 0xFF: // Application Extension { int blockSize = reader.ReadByte(); while (blockSize != 0) { // Read block reader.BaseStream.Position += blockSize; blockSize = reader.ReadByte(); // next block Size, if its 0 we know its the end of block } } break; default: // Unknown Console.WriteLine($"Unknown Extension Type ({extensionType})"); return; } } break; case (byte)',': // Image descriptor { int left = reader.ReadUInt16(); int top = reader.ReadUInt16(); int right = reader.ReadUInt16(); int bottom = reader.ReadUInt16(); byte info2 = reader.ReadByte(); bool interlaced = (info2 & 0x40) != 0; if (info2 >> 7 == 1) { for (int c = 0x80; c < 0x100; ++c) { palette[c].R = reader.ReadByte(); palette[c].G = reader.ReadByte(); palette[c].B = reader.ReadByte(); } } readPictureData(width, height, interlaced, reader); } break; } blockType = reader.ReadByte(); } #endregion if (!skipHeader) { reader.Close(); } }
public BGLayer(Reader reader) { width = reader.ReadByte(); height = reader.ReadByte(); DrawLayer = reader.ReadByte(); Behaviour = reader.ReadByte(); ConstantSpeed = reader.ReadByte(); RelativeSpeed = reader.ReadByte(); byte[] buf = new byte[3]; bool finished = false; int cnt = 0; int loop = 0; LineIndexes = new byte[height * 128]; while (!finished) { buf[0] = reader.ReadByte(); if (buf[0] == 255) { buf[1] = reader.ReadByte(); if (buf[1] == 255) { finished = true; break; } else { buf[2] = (byte)(reader.ReadByte() - 1); loop = 0; while (loop < buf[2] && !reader.IsEof) { LineIndexes[cnt++] = buf[1]; loop++; } } } else { LineIndexes[cnt++] = buf[0]; } } byte[] buffer = new byte[2]; MapLayout = new ushort[height][]; for (int m = 0; m < height; m++) { MapLayout[m] = new ushort[width]; } for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { reader.Read(buffer, 0, 2); //Read size MapLayout[y][x] = (ushort)(buffer[1] + (buffer[0] << 8)); } } }
public Scene(Reader reader) { Title = reader.ReadRSDKString(); //Console.WriteLine(Title); byte[] buffer = new byte[5]; ActiveLayer0 = reader.ReadByte(); ActiveLayer1 = reader.ReadByte(); ActiveLayer2 = reader.ReadByte(); ActiveLayer3 = reader.ReadByte(); Midpoint = reader.ReadByte(); reader.Read(buffer, 0, 2); //Read size width = 0; height = 0; // Map width in 128 pixel units // In RSDKv2, it's one byte long width = buffer[0]; height = buffer[1]; MapLayout = new ushort[height][]; for (int i = 0; i < height; i++) { MapLayout[i] = new ushort[width]; } for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { // 128x128 Block number is 16-bit // Big-Endian in RSDKv2 and RSDKv3 reader.Read(buffer, 0, 2); //Read size MapLayout[y][x] = (ushort)(buffer[1] + (buffer[0] << 8)); } } // Read number of object types, Only RSDKv1 and RSDKv2 support this feature int ObjTypeCount = reader.ReadByte(); for (int n = 0; n < ObjTypeCount; n++) { string name = reader.ReadRSDKString(); objectTypeNames.Add(name); } // Read object data int ObjCount = 0; // 2 bytes, big-endian, unsigned ObjCount = reader.ReadByte() << 8; ObjCount |= reader.ReadByte(); Object.cur_id = 0; for (int n = 0; n < ObjCount; n++) { // Add object objects.Add(new Object(reader)); } reader.Close(); }
public void read(Reader reader, bool dcVer = false) { if (dcVer) { reader.ReadByte(); } width = (ushort)(reader.ReadByte() << 8); width |= reader.ReadByte(); height = (ushort)(reader.ReadByte() << 8); height |= reader.ReadByte(); // Read & Process palette for (int i = 0; i < 255; i++) { palette[i].R = reader.ReadByte(); palette[i].G = reader.ReadByte(); palette[i].B = reader.ReadByte(); } // Read Pixels pixels = new byte[width * height]; byte[] buf = new byte[3]; int pos = 0; while (true) { buf[0] = reader.ReadByte(); if (buf[0] == 0xFF) { buf[1] = reader.ReadByte(); if (buf[1] != 0xFF) { buf[2] = reader.ReadByte(); byte val = buf[1]; int cnt = buf[2]; if (dcVer) { cnt--; } for (int c = 0; c < cnt; ++c) { pixels[pos++] = val; } } else { break; } } else { pixels[pos++] = buf[0]; } } reader.Close(); }
public VideoFrame(Reader reader, ushort width, ushort height) { Width = width; Height = height; startOffset = (int)reader.Pos; ImageData = new byte[Width * Height]; FilePos = (uint)(reader.ReadByte() + (reader.ReadByte() << 8) + (reader.ReadByte() << 16) + (reader.ReadByte() << 24));//reader.ReadUInt32(); for (int i = 0; i < 128; i++) { Color c; byte r = reader.ReadByte(); //r byte g = reader.ReadByte(); //g byte b = reader.ReadByte(); //b c = Color.FromArgb(255, r, g, b); //Console.WriteLine("Colour " + i + " = " + c.R + " " + c.G + " " + c.B); FramePalette.Add(c); } bool Next = false; while (!Next) { byte tmp = reader.ReadByte(); idkMan.Add(tmp); //Console.WriteLine("idk lol = " + tmp); if (tmp == 44) { Next = true; } // AKA ',' } ImageLeft = reader.ReadUInt16(); ImageTop = reader.ReadUInt16(); ImageWidth = reader.ReadUInt16(); ImageHeight = reader.ReadUInt16(); PaletteType = reader.ReadByte(); //Console.WriteLine("Palette Type = " + PaletteType); isInterlaced = (uint)PaletteType << 25 >> 31; //Console.WriteLine("Interlaced? = " + isInterlaced); //Console.WriteLine("Use full Palette = " + (PaletteType >> 7)); FullPallete = PaletteType >> 7 == 1; if (FullPallete) // Use extra colours? { for (int i = 128; i < 256; i++) { Color c; byte r = reader.ReadByte(); //r byte g = reader.ReadByte(); //g byte b = reader.ReadByte(); //b c = Color.FromArgb(255, r, g, b); //Console.WriteLine("(Extra) Colour " + i + " = " + c.R + "," + c.G + "," + c.B); FramePalette.Add(c); } } ReadGIFData(reader); Console.WriteLine("Loaded Video Frame!"); //reader.BaseStream.Position = FilePos + 6; endOffset = (int)reader.Pos; }
public void read(Reader reader) { title = reader.readRSDKString(); activeLayer0 = (ActiveLayers)reader.ReadByte(); activeLayer1 = (ActiveLayers)reader.ReadByte(); activeLayer2 = (ActiveLayers)reader.ReadByte(); activeLayer3 = (ActiveLayers)reader.ReadByte(); layerMidpoint = (LayerMidpoints)reader.ReadByte(); // Map width/height in 128 pixel units // In RSDKv2 it's one byte long width = reader.ReadByte(); height = reader.ReadByte(); layout = new ushort[height][]; for (int i = 0; i < height; i++) { layout[i] = new ushort[width]; } for (int y = 0; y < height; y++) { for (int x = 0; x < width; x++) { // 128x128 Block number is 16-bit // Big-Endian in RSDKv2 layout[y][x] = (ushort)(reader.ReadByte() << 8); layout[y][x] |= reader.ReadByte(); } } // Read number of object types int objectTypeCount = reader.ReadByte(); objectTypeNames.Clear(); for (int n = 0; n < objectTypeCount; n++) { objectTypeNames.Add(reader.readRSDKString()); } // Read entities // 2 bytes, big-endian, unsigned int entityCount = reader.ReadByte() << 8; entityCount |= reader.ReadByte(); entities.Clear(); for (int n = 0; n < entityCount; n++) { entities.Add(new Entity(reader)); } reader.Close(); }