public override void WriteValue(WzBinaryWriter writer)
        {
            writer.WriteStringValue("Canvas", WzImage.WzImageHeaderByte_WithoutOffset, WzImage.WzImageHeaderByte_WithOffset);
            writer.Write((byte)0);
            if (properties.Count > 0) // subproperty in the canvas
            {
                writer.Write((byte)1);
                WzImageProperty.WritePropertyList(writer, properties);
            }
            else
            {
                writer.Write((byte)0);
            }

            // Image info
            writer.WriteCompressedInt(PngProperty.Width);
            writer.WriteCompressedInt(PngProperty.Height);
            writer.WriteCompressedInt(PngProperty.Format);
            writer.Write((byte)PngProperty.Format2);
            writer.Write((Int32)0);

            // Write image
            byte[] bytes = PngProperty.GetCompressedBytes(false);
            writer.Write(bytes.Length + 1);
            writer.Write((byte)0); // header? see WzImageProperty.ParseExtendedProp "0x00"
            writer.Write(bytes);
        }
        /// <summary>
        /// Writes the WzImage object to the underlying WzBinaryWriter
        /// </summary>
        /// <param name="writer"></param>
        /// <param name="forceReadFromData">Read from data regardless of base data that's changed or not.</param>
        public void SaveImage(WzBinaryWriter writer, bool forceReadFromData = false)
        {
            if (changed || forceReadFromData)
            {
                if (reader != null && !parsed)
                {
                    this.ParseEverything = true;
                    ParseImage(forceReadFromData);
                }

                WzSubProperty imgProp  = new WzSubProperty();
                long          startPos = writer.BaseStream.Position;
                imgProp.AddPropertiesForWzImageDumping(WzProperties);
                imgProp.WriteValue(writer);
                writer.StringCache.Clear();
                size = (int)(writer.BaseStream.Position - startPos);
            }
            else
            {
                long pos = reader.BaseStream.Position;
                reader.BaseStream.Position = offset;
                writer.Write(reader.ReadBytes(size));
                reader.BaseStream.Position = pos;
            }
        }
Example #3
0
        /// <summary>
        /// Saves a wz file to the disk, AKA repacking.
        /// </summary>
        /// <param name="pPath">Path to the output wz file</param>
        public void SaveToDisk(string pPath)
        {
            mWzIv = WzTool.GetIvByMapleVersion(mMapleVersion);
            CreateVersionHash();
            SetHash(mVersionHash);
            string tempFile = Path.GetFileNameWithoutExtension(pPath) + ".TEMP";

            File.Create(tempFile).Close();
            GenerateDataFile(tempFile);
            WzTool.StringCache.Clear();
            uint           totalLen = GetImgOffsets(GetOffsets(Header.FStart + 2));
            WzBinaryWriter wzWriter = new WzBinaryWriter(File.Create(pPath), mWzIv)
            {
                Hash = mVersionHash
            };

            Header.FSize = totalLen - Header.FStart;
            wzWriter.Write(Header.Ident, false);
            wzWriter.Write((long)Header.FSize);
            wzWriter.Write(Header.FStart);
            wzWriter.WriteNullTerminatedString(Header.Copyright);
            wzWriter.Write(new byte[Header.ExtraBytes]);
            wzWriter.Write(mVersion);
            wzWriter.Header = Header;
            SaveDirectory(wzWriter);
            wzWriter.StringCache.Clear();
            FileStream fs = File.OpenRead(tempFile);

            SaveImages(wzWriter, fs);
            fs.Close();
            File.Delete(tempFile);
            wzWriter.StringCache.Clear();
            wzWriter.Close();
        }
        internal static void WritePropertyList(WzBinaryWriter writer, List <WzImageProperty> properties)
        {
            if (properties.Count == 1 && properties[0] is WzLuaProperty)
            {
                properties[0].WriteValue(writer);
            }
            else
            {
                writer.WriteStringValue("Property", 0x73, 0x1B);

                writer.Write((ushort)0);
                writer.WriteCompressedInt(properties.Count);
                for (int i = 0; i < properties.Count; i++)
                {
                    writer.WriteStringValue(properties[i].Name, 0x00, 0x01);
                    if (properties[i] is WzExtended)
                    {
                        WriteExtendedValue(writer, (WzExtended)properties[i]);
                    }
                    else
                    {
                        properties[i].WriteValue(writer);
                    }
                }
            }
        }
Example #5
0
 internal void SaveDirectory(WzBinaryWriter writer)
 {
     offset = (uint)writer.BaseStream.Position;
     int entryCount = subDirs.Count + images.Count;
     if (entryCount == 0)
     {
         BlockSize = 0;
         return;
     }
     writer.WriteCompressedInt(entryCount);
     foreach (WzImage img in images)
     {
         writer.WriteWzObjectValue(img.name, 4);
         writer.WriteCompressedInt(img.BlockSize);
         writer.WriteCompressedInt(img.Checksum);
         writer.WriteOffset(img.Offset);
     }
     foreach (WzDirectory dir in subDirs)
     {
         writer.WriteWzObjectValue(dir.name, 3);
         writer.WriteCompressedInt(dir.BlockSize);
         writer.WriteCompressedInt(dir.Checksum);
         writer.WriteOffset(dir.Offset);
     }
     foreach (WzDirectory dir in subDirs)
         if (dir.BlockSize > 0)
             dir.SaveDirectory(writer);
         else
             writer.Write((byte)0);
 }
Example #6
0
        public override void WriteValue(WzBinaryWriter writer)
        {
            writer.WriteStringValue("Canvas", 0x73, 0x1B);
            writer.Write((byte)0);
            if (WzProperties.Count > 0)
            {
                writer.Write((byte)1);
                WritePropertyList(writer, WzProperties);
            }
            else
            {
                writer.Write((byte)0);
            }

            writer.WriteCompressedInt(PngProperty.Width);
            writer.WriteCompressedInt(PngProperty.Height);
            writer.WriteCompressedInt(PngProperty.Format1);
            writer.Write((byte)PngProperty.Format2);
            writer.Write(0);
            var bytes = PngProperty.GetCompressedBytes(false);

            writer.Write(bytes.Length + 1);
            writer.Write((byte)0);
            writer.Write(bytes);
        }
Example #7
0
        /// <summary>
        /// Writes the WzImage object to the underlying WzBinaryWriter
        /// </summary>
        /// <param name="writer"></param>
        /// <param name="bIsWzUserKeyDefault">Uses the default MapleStory UserKey or a custom key.</param>
        /// <param name="forceReadFromData">Read from data regardless of base data that's changed or not.</param>
        public void SaveImage(WzBinaryWriter writer, bool bIsWzUserKeyDefault = true, bool forceReadFromData = false)
        {
            if (bIsImageChanged ||
                !bIsWzUserKeyDefault || //  everything needs to be re-written when a custom UserKey is used
                forceReadFromData)      // if its not being force-read and written, it saves with the previous WZ encryption IV.
            {
                if (reader != null && !parsed)
                {
                    this.ParseEverything = true;
                    ParseImage(forceReadFromData);
                }

                WzSubProperty imgProp = new WzSubProperty();

                long startPos = writer.BaseStream.Position;
                imgProp.AddPropertiesForWzImageDumping(WzProperties);
                imgProp.WriteValue(writer);

                writer.StringCache.Clear();

                size = (int)(writer.BaseStream.Position - startPos);
            }
            else
            {
                long pos = reader.BaseStream.Position;
                reader.BaseStream.Position = offset;
                writer.Write(reader.ReadBytes(size));
                reader.BaseStream.Position = pos;
            }
        }
Example #8
0
 public override void WriteValue(WzBinaryWriter writer)
 {
     writer.WriteStringValue("Sound_DX8", 0x73, 0x1B);
     writer.Write((byte)0);
     writer.WriteCompressedInt(SoundData.Length);
     writer.WriteCompressedInt(0);
     writer.Write(SoundData);
 }
Example #9
0
        private void serializeImageInternal(WzImage img, string outPath)
        {
            FileStream     stream   = File.Create(outPath);
            WzBinaryWriter wzWriter = new WzBinaryWriter(stream, ((WzDirectory)img.parent).WzIv);

            img.SaveImage(wzWriter);
            wzWriter.Close();
        }
Example #10
0
        public override void WriteValue(WzBinaryWriter writer)
        {
            var extendedProps = _properties.Where(x => x is WzExtended).ToList();

            writer.WriteStringValue("Shape2D#Convex2D", 0x73, 0x1B);
            writer.WriteCompressedInt(extendedProps.Count);
            extendedProps.ForEach(x => x.WriteValue(writer));
        }
        /// <summary>
        /// Saves a wz file to the disk, AKA repacking.
        /// </summary>
        /// <param name="path">Path to the output wz file</param>
        public void SaveToDisk(string path, WzMapleVersion savingToPreferredWzVer = WzMapleVersion.UNKNOWN)
        {
            if (savingToPreferredWzVer == WzMapleVersion.UNKNOWN)
            {
                WzIv = WzTool.GetIvByMapleVersion(maplepLocalVersion); // get from local WzFile
            }
            else
            {
                WzIv = WzTool.GetIvByMapleVersion(savingToPreferredWzVer); // custom selected
            }
            wzDir.WzIv = WzIv;

            CreateVersionHash();
            wzDir.SetHash(versionHash);

            string tempFile = Path.GetFileNameWithoutExtension(path) + ".TEMP";

            File.Create(tempFile).Close();
            wzDir.GenerateDataFile(tempFile, WzIv);

            WzTool.StringCache.Clear();
            uint totalLen = wzDir.GetImgOffsets(wzDir.GetOffsets(Header.FStart + 2));

            using (WzBinaryWriter wzWriter = new WzBinaryWriter(File.Create(path), WzIv))
            {
                wzWriter.Hash = (uint)versionHash;
                Header.FSize  = totalLen - Header.FStart;
                for (int i = 0; i < 4; i++)
                {
                    wzWriter.Write((byte)Header.Ident[i]);
                }
                wzWriter.Write((long)Header.FSize);
                wzWriter.Write(Header.FStart);
                wzWriter.WriteNullTerminatedString(Header.Copyright);

                long extraHeaderLength = Header.FStart - wzWriter.BaseStream.Position;
                if (extraHeaderLength > 0)
                {
                    wzWriter.Write(new byte[(int)extraHeaderLength]);
                }
                wzWriter.Write(version);
                wzWriter.Header = Header;
                wzDir.SaveDirectory(wzWriter);
                wzWriter.StringCache.Clear();

                using (FileStream fs = File.OpenRead(tempFile))
                {
                    wzDir.SaveImages(wzWriter, fs);
                }
                File.Delete(tempFile);

                wzWriter.StringCache.Clear();
            }


            GC.Collect();
            GC.WaitForPendingFinalizers();
        }
Example #12
0
 public override void WriteValue(WzBinaryWriter pWriter)
 {
     pWriter.WriteStringValue("Shape2D#Convex2D", 0x73, 0x1B);
     pWriter.WriteCompressedInt(mProperties.Count);
     foreach (AWzImageProperty prop in mProperties)
     {
         prop.WriteValue(pWriter);
     }
 }
Example #13
0
 public override void WriteValue(WzBinaryWriter pWriter)
 {
     byte[] data = GetBytes();
     pWriter.WriteStringValue("Sound_DX8", 0x73, 0x1B);
     pWriter.Write((byte)0);
     pWriter.WriteCompressedInt(data.Length);
     pWriter.WriteCompressedInt(0);
     pWriter.Write(data);
 }
 public override void WriteValue(WzBinaryWriter writer)
 {
     byte[] data = GetBytes(false);
     writer.WriteStringValue("Sound_DX8", WzImage.WzImageHeaderByte_WithoutOffset, WzImage.WzImageHeaderByte_WithOffset);
     writer.Write((byte)0);
     writer.WriteCompressedInt(data.Length);
     writer.WriteCompressedInt(len_ms);
     writer.Write(header);
     writer.Write(data);
 }
Example #15
0
        private byte[] serializeImageInternal(WzImage img)
        {
            MemoryStream   stream   = new MemoryStream();
            WzBinaryWriter wzWriter = new WzBinaryWriter(stream, ((WzDirectory)img.parent).WzIv);

            img.SaveImage(wzWriter);
            byte[] result = stream.ToArray();
            wzWriter.Close();
            return(result);
        }
Example #16
0
 internal static void WritePropertyList(WzBinaryWriter writer, IWzImageProperty[] properties)
 {
     writer.Write((ushort)0);
     writer.WriteCompressedInt(properties.Length);
     for (int i = 0; i < properties.Length; i++)
     {
         writer.WriteStringValue(properties[i].Name, 0x00, 0x01);
         properties[i].WriteValue(writer);
     }
 }
 public override void WriteValue(WzBinaryWriter writer)
 {
     byte[] data = GetBytes(false);
     writer.WriteStringValue("Sound_DX8", 0x73, 0x1B);
     writer.Write((byte)0);
     writer.WriteCompressedInt(data.Length);
     writer.WriteCompressedInt(len_ms);
     writer.Write(header);
     writer.Write(data);
 }
Example #18
0
        internal void CompressPng(Bitmap bmp)
        {
            byte[] buf = new byte[bmp.Width * bmp.Height * 8];
            format  = 2;
            format2 = 0;
            width   = bmp.Width;
            height  = bmp.Height;
            //byte[] bmpBytes = bmp.BitmapToBytes();

            /* if (SquishPNGWrapper.CheckAndLoadLibrary())
             *          {
             *              byte[] bmpBytes = bmp.BitmapToBytes();
             *              SquishPNGWrapper.CompressImage(bmpBytes, width, height, buf, (int)SquishPNGWrapper.FlagsEnum.kDxt1);
             *          }
             *          else
             *          {*/
            int curPos = 0;

            for (int i = 0; i < height; i++)
            {
                for (int j = 0; j < width; j++)
                {
                    Color curPixel = bmp.GetPixel(j, i);
                    buf[curPos]     = curPixel.B;
                    buf[curPos + 1] = curPixel.G;
                    buf[curPos + 2] = curPixel.R;
                    buf[curPos + 3] = curPixel.A;
                    curPos         += 4;
                }
            }
            compressedImageBytes = Compress(buf);

            buf = null;

            if (listWzUsed)
            {
                using (MemoryStream memStream = new MemoryStream())
                {
                    using (WzBinaryWriter writer = new WzBinaryWriter(memStream, WzTool.GetIvByMapleVersion(WzMapleVersion.GMS)))
                    {
                        writer.Write(2);
                        for (int i = 0; i < 2; i++)
                        {
                            writer.Write((byte)(compressedImageBytes[i] ^ writer.WzKey[i]));
                        }
                        writer.Write(compressedImageBytes.Length - 2);
                        for (int i = 2; i < compressedImageBytes.Length; i++)
                        {
                            writer.Write((byte)(compressedImageBytes[i] ^ writer.WzKey[i - 2]));
                        }
                        compressedImageBytes = memStream.GetBuffer();
                    }
                }
            }
        }
Example #19
0
        internal void SaveToDisk(string pPath)
        {
            WzBinaryWriter wzWriter = new WzBinaryWriter(File.Create(pPath), mWzIv);

            foreach (string entry in mListEntries)
            {
                string newEntry = entry + "\0";
                wzWriter.Write(newEntry.Length);
                wzWriter.Write(newEntry, true, true);
            }
            wzWriter.Close();
        }
Example #20
0
        internal void SaveImage(WzBinaryWriter pWriter)
        {
            if (mReader != null && !mParsed)
            {
                ParseImage();
            }
            long startPos = pWriter.BaseStream.Position;

            WriteValue(pWriter);
            pWriter.StringCache.Clear();
            mSize = (int)(pWriter.BaseStream.Position - startPos);
        }
Example #21
0
 public override void WriteValue(WzBinaryWriter pWriter)
 {
     pWriter.Write((byte)4);
     if (Value == 0f)
     {
         pWriter.Write((byte)0);
     }
     else
     {
         pWriter.Write((byte)0x80);
         pWriter.Write(Value);
     }
 }
Example #22
0
        internal static void WriteExtendedProperty(WzBinaryWriter pWriter, AWzImageProperty pProp)
        {
            pWriter.Write((byte)9);
            long beforePos = pWriter.BaseStream.Position;

            pWriter.Write(0); // Placeholder
            pProp.WriteValue(pWriter);
            int  len    = (int)(pWriter.BaseStream.Position - beforePos);
            long newPos = pWriter.BaseStream.Position;

            pWriter.BaseStream.Position = beforePos;
            pWriter.Write(len - 4);
            pWriter.BaseStream.Position = newPos;
        }
Example #23
0
        public override void WriteValue(WzBinaryWriter writer)
        {
            writer.Write((byte)9);
            long beforePos = writer.BaseStream.Position;

            writer.Write(0);             // Placeholder
            ExtendedProperty.WriteValue(writer);
            int  len    = (int)(writer.BaseStream.Position - beforePos);
            long newPos = writer.BaseStream.Position;

            writer.BaseStream.Position = beforePos;
            writer.Write(len - 4);
            writer.BaseStream.Position = newPos;
        }
Example #24
0
        internal static void WriteExtendedValue(WzBinaryWriter writer, IExtended property)
        {
            writer.Write((byte)9);
            long beforePos = writer.BaseStream.Position;

            writer.Write((Int32)0); // Placeholder
            property.WriteValue(writer);
            int  len    = (int)(writer.BaseStream.Position - beforePos);
            long newPos = writer.BaseStream.Position;

            writer.BaseStream.Position = beforePos;
            writer.Write(len - 4);
            writer.BaseStream.Position = newPos;
        }
Example #25
0
        internal void SaveImage(WzBinaryWriter writer)
        {
            if (reader != null && !parsed)
            {
                ParseImage();
            }
            WzSubProperty imgProp  = new WzSubProperty();
            long          startPos = writer.BaseStream.Position;

            imgProp.AddProperties(WzProperties);
            imgProp.WriteValue(writer);
            writer.StringCache.Clear();
            size = (int)(writer.BaseStream.Position - startPos);
        }
Example #26
0
 public void SerializeImage(WzImage img, string outPath)
 {
     total = 1; curr = 0;
     if (Path.GetExtension(outPath) != ".img")
     {
         outPath += ".img";
     }
     using (FileStream stream = File.Create(outPath))
     {
         using (WzBinaryWriter wzWriter = new WzBinaryWriter(stream, ((WzDirectory)img.parent).WzIv))
         {
             img.SaveImage(wzWriter);
         }
     }
 }
        public byte[] SerializeImage(WzImage img)
        {
            total = 1; curr = 0;

            using (MemoryStream stream = new MemoryStream())
            {
                using (WzBinaryWriter wzWriter = new WzBinaryWriter(stream, ((WzDirectory)img.parent).WzIv))
                {
                    img.SaveImage(wzWriter);
                    byte[] result = stream.ToArray();

                    return(result);
                }
            }
        }
Example #28
0
        public override void WriteValue(WzBinaryWriter writer)
        {
            bool bIsLuaProperty = false;

            if (properties.Count == 1 && properties[0] is WzLuaProperty)
            {
                bIsLuaProperty = true;
            }
            if (!bIsLuaProperty)
            {
                writer.WriteStringValue("Property", WzImage.WzImageHeaderByte_WithoutOffset, WzImage.WzImageHeaderByte_WithOffset);
            }

            WzImageProperty.WritePropertyList(writer, properties);
        }
Example #29
0
        /// <summary>
        /// Saves a wz file to the disk, AKA repacking.
        /// </summary>
        /// <param name="path">Path to the output wz file</param>
        public void SaveToDisk(string path)
        {
            _wzIv = WzTool.GetIvByMapleVersion(MapleVersion);
            CreateVersionHash();
            WzDirectory.SetHash(_versionHash);
            var tempFile = Path.GetFileNameWithoutExtension(path) + ".TEMP";

            File.Create(tempFile).Close();
            WzDirectory.GenerateDataFile(tempFile);
            WzTool.StringCache.Clear();
            var totalLen = WzDirectory.GetImgOffsets(WzDirectory.GetOffsets(Header.FStart + 2));
            var wzWriter = new WzBinaryWriter(File.Create(path), _wzIv)
            {
                Hash = _versionHash
            };

            Header.FSize = totalLen - Header.FStart;
            for (var i = 0; i < 4; i++)
            {
                {
                    wzWriter.Write((byte)Header.Ident[i]);
                }
            }

            wzWriter.Write((long)Header.FSize);
            wzWriter.Write(Header.FStart);
            wzWriter.WriteNullTerminatedString(Header.Copyright);
            var extraHeaderLength = Header.FStart - wzWriter.BaseStream.Position;

            if (extraHeaderLength > 0)
            {
                wzWriter.Write(new byte[(int)extraHeaderLength]);
            }

            wzWriter.Write(_version);
            wzWriter.Header = Header;
            WzDirectory.SaveDirectory(wzWriter);
            wzWriter.StringCache.Clear();
            var fs = File.OpenRead(tempFile);

            WzDirectory.SaveImages(wzWriter, fs);
            fs.Close();
            File.Delete(tempFile);
            wzWriter.StringCache.Clear();
            wzWriter.Close();
            GC.Collect();
            GC.WaitForPendingFinalizers();
        }
Example #30
0
 internal static void WritePropertyList(WzBinaryWriter writer, List <IWzImageProperty> properties)
 {
     writer.Write((ushort)0);
     writer.WriteCompressedInt(properties.Count);
     for (int i = 0; i < properties.Count; i++)
     {
         writer.WriteStringValue(properties[i].Name, 0x00, 0x01);
         if (properties[i] is IExtended)
         {
             WriteExtendedValue(writer, (IExtended)properties[i]);
         }
         else
         {
             properties[i].WriteValue(writer);
         }
     }
 }