public ShpTSReader(string Filename, ref TSHP SHP, frmMain sender) { int FileSize; int x; int CP; int result; string hex; byte[] Cbyte; int Image_Size; int NextOffset; CP = 0; byte[] PCurrentData; byte CData; byte[] Databuffer; FileStream F = new FileStream(Filename, FileMode.Open, FileAccess.Read); BinaryReader reader = new BinaryReader(F); // Store the whole file in the memory FileSize = (int)F.Length; PCurrentData = new byte[FileSize]; F.Read(PCurrentData, 0, (int)FileSize); F.Close(); // Get Header SHP.Header.A = ((ushort)((ushort)(PCurrentData[CP]))); CP += 2; Cbyte = new byte[2]; Cbyte[1] = ((byte)(PCurrentData[CP])); CP += 1; Cbyte[0] = ((byte)(PCurrentData[CP])); hex = BitConverter.ToString(Cbyte); hex = hex.Replace("-", ""); result = System.UInt16.Parse(hex, System.Globalization.NumberStyles.AllowHexSpecifier); SHP.Header.Width = (ushort)result; CP += 1; Cbyte = new byte[2]; Cbyte[1] = ((byte)(PCurrentData[CP])); CP += 1; Cbyte[0] = ((byte)(PCurrentData[CP])); hex = BitConverter.ToString(Cbyte); hex = hex.Replace("-", ""); result = System.UInt16.Parse(hex, System.Globalization.NumberStyles.AllowHexSpecifier); SHP.Header.Height = (ushort)result; CP += 1; SHP.Header.NumImages = ((ushort)((ushort)(PCurrentData[CP]))); CP += 2; SHP.Data = new TSHPData[SHP.Header.NumImages + 1]; for (x = 1; x <= SHP.Header.NumImages; x++) { SHP.Data[x].Header_Image = new THeader_Image(); // Load Image Headers SHP.Data[x].Header_Image.x = ((ushort)((ushort)(PCurrentData[CP]))); CP += 2; SHP.Data[x].Header_Image.y = ((ushort)((ushort)(PCurrentData[CP]))); CP += 2; SHP.Data[x].Header_Image.cx = ((ushort)((ushort)(PCurrentData[CP]))); CP += 2; SHP.Data[x].Header_Image.cy = ((ushort)((ushort)(PCurrentData[CP]))); CP += 2; SHP.Data[x].Header_Image.compression = ((byte)(PCurrentData[CP])); CP += 1; SHP.Data[x].Header_Image.align = new byte[3]; SHP.Data[x].Header_Image.align[0] = ((byte)(PCurrentData[CP])); CP += 1; SHP.Data[x].Header_Image.align[1] = ((byte)(PCurrentData[CP])); CP += 1; SHP.Data[x].Header_Image.align[2] = ((byte)(PCurrentData[CP])); CP += 5; SHP.Data[x].Header_Image.zero = ((int)(PCurrentData[CP])); CP += 1; SHP.Data[x].Header_Image.transparent = new byte[3]; SHP.Data[x].Header_Image.transparent[0] = ((byte)(PCurrentData[CP])); CP += 1; SHP.Data[x].Header_Image.transparent[1] = ((byte)(PCurrentData[CP])); CP += 1; SHP.Data[x].Header_Image.transparent[2] = ((byte)(PCurrentData[CP])); CP += 1; sender.WriteLog("R: " + Convert.ToString(SHP.Data[x].Header_Image.transparent[0]) + " G: " + Convert.ToString(SHP.Data[x].Header_Image.transparent[1]) + " B: " + Convert.ToString(SHP.Data[x].Header_Image.transparent[2])); Cbyte = new byte[4]; Cbyte[3] = ((byte)(PCurrentData[CP])); CP += 1; Cbyte[2] = ((byte)(PCurrentData[CP])); CP += 1; Cbyte[1] = ((byte)(PCurrentData[CP])); CP += 1; Cbyte[0] = ((byte)(PCurrentData[CP])); hex = BitConverter.ToString(Cbyte); hex = hex.Replace("-", ""); result = System.Int32.Parse(hex, System.Globalization.NumberStyles.AllowHexSpecifier); SHP.Data[x].Header_Image.offset = result; CP += 1; } // Read and decode each image from the file for (x = 1; x <= SHP.Header.NumImages; x++) { // Does it really reads the frame? if (SHP.Data[x].Header_Image.offset != 0) { // Now it checks the compression: if ((SHP.Data[x].Header_Image.compression == 3)) { // decode it // Compression 3 NextOffset = FindNextOffsetFrom(SHP, x + 1, SHP.Header.NumImages); if (NextOffset != 0) { Image_Size = NextOffset - SHP.Data[x].Header_Image.offset; Databuffer = new byte[Image_Size]; for (int i = 0; i < Image_Size; i++) { CData = ((byte)(PCurrentData[SHP.Data[x].Header_Image.offset+i])); Databuffer[i] = CData; } SHP.Data[x].Databuffer = new byte[(SHP.Data[x].Header_Image.cx * SHP.Data[x].Header_Image.cy)]; Decode3(Databuffer, ref SHP.Data[x].Databuffer, SHP.Data[x].Header_Image.cx, SHP.Data[x].Header_Image.cy, ref FileSize, sender); } else { Image_Size = 0; Image_Size = FileSize - SHP.Data[x].Header_Image.offset; Databuffer = new byte[Image_Size]; for (int i = 0; i < Image_Size; i++) { CData = ((byte)(PCurrentData[SHP.Data[x].Header_Image.offset + i])); Databuffer[i] = CData; } SHP.Data[x].Databuffer = new byte[((SHP.Data[x].Header_Image.cx * SHP.Data[x].Header_Image.cy))]; Decode3(Databuffer, ref SHP.Data[x].Databuffer, SHP.Data[x].Header_Image.cx, SHP.Data[x].Header_Image.cy, ref Image_Size, sender); } } else if ((SHP.Data[x].Header_Image.compression == 2)) { sender.WriteLog("Decoding compression 2"); NextOffset = FindNextOffsetFrom(SHP, x + 1, SHP.Header.NumImages); if (NextOffset != 0) { Image_Size = NextOffset - SHP.Data[x].Header_Image.offset; SHP.Data[x].Databuffer = new byte[(SHP.Data[x].Header_Image.cx * SHP.Data[x].Header_Image.cy)]; Databuffer = new byte[Image_Size]; for (int i = 0; i < Image_Size; i++) { CData = ((byte)(PCurrentData[SHP.Data[x].Header_Image.offset + i])); Databuffer[i] = CData; } Decode2(Databuffer, ref SHP.Data[x].Databuffer, SHP.Data[x].Header_Image.cx, SHP.Data[x].Header_Image.cy, ref Image_Size, sender); // Compression 2 } else { Image_Size = 0; Image_Size = FileSize - SHP.Data[x].Header_Image.offset; Databuffer = new byte[Image_Size]; for (int i = 0; i < Image_Size; i++) { CData = ((byte)(PCurrentData[SHP.Data[x].Header_Image.offset + i])); Databuffer[i] = CData; } SHP.Data[x].Databuffer = new byte[((SHP.Data[x].Header_Image.cx * SHP.Data[x].Header_Image.cy))]; Decode2(Databuffer, ref SHP.Data[x].Databuffer, SHP.Data[x].Header_Image.cx, SHP.Data[x].Header_Image.cy, ref Image_Size, sender); // Compression 2 } } else { // Compression 1 Image_Size = (int)(SHP.Data[x].Header_Image.cx * SHP.Data[x].Header_Image.cy); Databuffer = new byte[Image_Size]; for (int i = 0; i < Image_Size; i++) { CData = ((byte)(PCurrentData[SHP.Data[x].Header_Image.offset + i])); Databuffer[i] = CData; } SHP.Data[x].Databuffer = new byte[(SHP.Data[x].Header_Image.cx * SHP.Data[x].Header_Image.cy)]; SHP.Data[x].Databuffer = Databuffer; } } // Set the shp's databuffer to the result after decompression } }
public static int FindNextOffsetFrom(TSHP SHP, int Init, int Last) { int result; result = 0; Last++; while ((result == 0) && (Init < Last)) { result = SHP.Data[Init].Header_Image.offset; Init++; } return result; }