Esempio n. 1
0
        byte[] ReadPixelsData(IBinaryStream file, RctMetaData meta)
        {
            byte[] base_image = null;
            if (meta.FileName != null && meta.BaseNameLength > 0 && OverlayFrames.Get <bool>() &&
                meta.BaseRecursionDepth < BaseRecursionLimit)
            {
                base_image = ReadBaseImage(file, meta);
            }

            file.Position = meta.DataOffset + meta.BaseNameLength;
            if (meta.IsEncrypted)
            {
                file = OpenEncryptedStream(file, meta.DataSize);
            }
            try
            {
                using (var reader = new Reader(file, meta))
                {
                    reader.Unpack();
                    if (base_image != null)
                    {
                        return(CombineImage(base_image, reader.Data));
                    }
                    return(reader.Data);
                }
            }
            catch
            {
                if (meta.IsEncrypted)
                {
                    Key = null; // probably incorrect encryption scheme caused exception, reset key
                }
                throw;
            }
        }
Esempio n. 2
0
 byte[] ReadBaseImage(IBinaryStream file, RctMetaData meta)
 {
     try
     {
         file.Position = meta.DataOffset;
         var    name     = file.ReadCString(meta.BaseNameLength);
         string dir_name = VFS.GetDirectoryName(meta.FileName);
         name = VFS.CombinePath(dir_name, name);
         if (VFS.FileExists(name))
         {
             using (var base_file = VFS.OpenBinaryStream(name))
             {
                 var base_info = ReadMetaData(base_file) as RctMetaData;
                 if (null != base_info &&
                     meta.Width == base_info.Width && meta.Height == base_info.Height)
                 {
                     base_info.BaseRecursionDepth = meta.BaseRecursionDepth + 1;
                     base_info.FileName           = name;
                     return(ReadPixelsData(base_file, base_info));
                 }
             }
         }
     }
     catch { /* ignore baseline image read errors */ }
     return(null);
 }
Esempio n. 3
0
 byte[] ReadBaseImage(Stream file, RctMetaData meta)
 {
     file.Position = meta.DataOffset;
     byte[] name_bin = new byte[meta.AddSize];
     if (name_bin.Length != file.Read(name_bin, 0, name_bin.Length))
     {
         throw new EndOfStreamException();
     }
     try
     {
         string name     = Encodings.cp932.GetString(name_bin, 0, name_bin.Length - 1);
         string dir_name = Path.GetDirectoryName(meta.FileName);
         name = VFS.CombinePath(dir_name, name);
         if (VFS.FileExists(name))
         {
             using (var base_file = VFS.OpenSeekableStream(name))
             {
                 var base_info = ReadMetaData(base_file) as RctMetaData;
                 if (null != base_info && 0 == base_info.AddSize &&
                     meta.Width == base_info.Width && meta.Height == base_info.Height)
                 {
                     base_info.FileName = name;
                     return(ReadPixelsData(base_file, base_info));
                 }
             }
         }
     }
     catch { /* ignore baseline image read errors */ }
     return(null);
 }
Esempio n. 4
0
        ImageData ApplyMaskToImage(RctMetaData info, byte[] image, string mask_name)
        {
            using (var mask_file = VFS.OpenBinaryStream(mask_name))
            {
                var mask_info = s_rc8_format.Value.ReadMetaData(mask_file);
                if (null == mask_info ||
                    info.Width != mask_info.Width || info.Height != mask_info.Height)
                {
                    throw new InvalidFormatException();
                }

                using (var reader = new Rc8Format.Reader(mask_file, mask_info))
                {
                    reader.Unpack();
                    var palette    = reader.Palette;
                    int dst_stride = (int)info.Width * 4;
                    var pixels     = new byte[dst_stride * (int)info.Height];
                    var alpha      = reader.Data;
                    int a_src      = 0;
                    int src        = 0;
                    for (int dst = 0; dst < pixels.Length; dst += 4)
                    {
                        pixels[dst]     = image[src++];
                        pixels[dst + 1] = image[src++];
                        pixels[dst + 2] = image[src++];
                        var color = palette[alpha[a_src++]];
                        pixels[dst + 3] = (byte)~((color.B + color.G + color.R) / 3);
                    }
                    return(ImageData.Create(info, PixelFormats.Bgra32, null, pixels, dst_stride));
                }
            }
        }
Esempio n. 5
0
 byte[] ReadPixelsData(Stream file, RctMetaData meta)
 {
     file.Position = meta.DataOffset + meta.AddSize;
     if (meta.IsEncrypted)
     {
         file = OpenEncryptedStream(file, meta.DataSize);
     }
     try
     {
         using (var reader = new Reader(file, meta))
         {
             reader.Unpack();
             return(reader.Data);
         }
     }
     catch
     {
         if (meta.IsEncrypted)
         {
             Key = null; // probably incorrect encryption scheme caused exception, reset key
         }
         throw;
     }
 }
Esempio n. 6
0
 public Reader(IBinaryStream file, RctMetaData info)
 {
     m_width = info.Width;
     m_data  = new byte[m_width * info.Height * 3];
     m_input = file;
 }
Esempio n. 7
0
 public Reader(Stream file, RctMetaData info)
 {
     m_width = info.Width;
     m_data  = new byte[m_width * info.Height * 3];
     m_input = new BinaryReader(file, Encoding.ASCII, true);
 }
Esempio n. 8
0
 public Reader(Stream file, RctMetaData info)
 {
     m_width = info.Width;
     m_data = new byte[m_width * info.Height * 3];
     m_input = new BinaryReader (file, Encoding.ASCII, true);
 }
Esempio n. 9
0
 byte[] ReadPixelsData(Stream file, RctMetaData meta)
 {
     file.Position = meta.DataOffset + meta.AddSize;
     if (meta.IsEncrypted)
         file = OpenEncryptedStream (file, meta.DataSize);
     try
     {
         using (var reader = new Reader (file, meta))
         {
             reader.Unpack();
             return reader.Data;
         }
     }
     catch
     {
         if (meta.IsEncrypted)
             Key = null; // probably incorrect encryption scheme caused exception, reset key
         throw;
     }
 }
Esempio n. 10
0
 byte[] ReadBaseImage(Stream file, RctMetaData meta)
 {
     file.Position = meta.DataOffset;
     byte[] name_bin = new byte[meta.AddSize];
     if (name_bin.Length != file.Read (name_bin, 0, name_bin.Length))
         throw new EndOfStreamException();
     try
     {
         string name = Encodings.cp932.GetString (name_bin, 0, name_bin.Length-1);
         string dir_name = VFS.GetDirectoryName (meta.FileName);
         name = VFS.CombinePath (dir_name, name);
         if (VFS.FileExists (name))
         {
             using (var base_file = VFS.OpenSeekableStream (name))
             {
                 var base_info = ReadMetaData (base_file) as RctMetaData;
                 if (null != base_info && 0 == base_info.AddSize
                     && meta.Width == base_info.Width && meta.Height == base_info.Height)
                 {
                     base_info.FileName = name;
                     return ReadPixelsData (base_file, base_info);
                 }
             }
         }
     }
     catch { /* ignore baseline image read errors */ }
     return null;
 }