Example #1
0
        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
                }
        }
Example #2
0
 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;
 }