Пример #1
0
        private void SaveData(StyleData styleData, bool saveSprites, CancellableContext context, out bool cancelled)
        {
            var styleFile = Path.GetFileNameWithoutExtension(StylePath);

            if (saveSprites)
            {
                CarInfo.Serialize(styleData.CarInfo, Globals.MiscSubDir + Path.DirectorySeparatorChar + Globals.CarStyleSuffix + Globals.XmlFormat);
                Palette.SavePalettes(styleData.Palettes, Globals.GraphicsSubDir + Path.DirectorySeparatorChar + Globals.PaletteSuffix + Globals.TextureImageFormat);
            }

            _threadCount = saveSprites ? 3 : 1;

            var memoryStreamTiles = new MemoryStream();

            using (var zip = ZipStorer.Create(memoryStreamTiles, string.Empty))
            {
                if (context.IsCancelling)
                {
                    cancelled = true;
                    return;
                }
                SaveTiles(styleData, zip, context);
                if (context.IsCancelling)
                {
                    cancelled = true;
                    return;
                }
            }
            memoryStreamTiles.Position = 0;
            if (Globals.SaveZipFiles)
            {
                using (var stream = new FileStream(Globals.GraphicsSubDir + Path.DirectorySeparatorChar + styleFile + Globals.TilesSuffix + Globals.ZipFormat, FileMode.Create, FileAccess.Write))
                {
                    var bytes = new byte[memoryStreamTiles.Length];
                    memoryStreamTiles.Read(bytes, 0, (int)memoryStreamTiles.Length);
                    stream.Write(bytes, 0, bytes.Length);
                }
                if (context.IsCancelling)
                {
                    cancelled = true;
                    return;
                }
                memoryStreamTiles.Position = 0;
            }
            TextureAtlas atlas = CreateTextureAtlas <TextureAtlasTiles>(ZipStorer.Open(memoryStreamTiles, FileAccess.Read), styleFile + Globals.TilesSuffix);

            _memoryStreams.Add(atlas, memoryStreamTiles);
            _runningAtlas.Add(atlas);
            if (context.IsCancelling)
            {
                cancelled = true;
                return;
            }

            if (saveSprites)
            {
                var memoryStreamSprites = new MemoryStream();
                using (var zip = ZipStorer.Create(memoryStreamSprites, string.Empty))
                {
                    if (context.IsCancelling)
                    {
                        cancelled = true;
                        return;
                    }
                    SaveSprites(styleData, zip, context);
                    if (context.IsCancelling)
                    {
                        cancelled = true;
                        return;
                    }
                }
                memoryStreamSprites.Position = 0;
                if (Globals.SaveZipFiles)
                {
                    using (var stream = new FileStream(Globals.GraphicsSubDir + Path.DirectorySeparatorChar + Globals.SpritesSuffix + Globals.ZipFormat, FileMode.Create, FileAccess.Write))
                    {
                        var bytes = new byte[memoryStreamSprites.Length];
                        memoryStreamSprites.Read(bytes, 0, (int)memoryStreamSprites.Length);
                        stream.Write(bytes, 0, bytes.Length);
                    }
                    if (context.IsCancelling)
                    {
                        cancelled = true;
                        return;
                    }
                    memoryStreamSprites.Position = 0;
                }
                atlas = CreateTextureAtlas <TextureAtlasSprites>(ZipStorer.Open(memoryStreamSprites, FileAccess.Read), Globals.SpritesSuffix, styleData.Sprites);
                _memoryStreams.Add(atlas, memoryStreamSprites);
                _runningAtlas.Add(atlas);
                if (context.IsCancelling)
                {
                    cancelled = true;
                    return;
                }

                var memoryStreamDeltas = new MemoryStream();
                using (var zip = ZipStorer.Create(memoryStreamDeltas, string.Empty))
                {
                    if (context.IsCancelling)
                    {
                        cancelled = true;
                        return;
                    }
                    SaveDeltas(styleData, zip, context);
                    if (context.IsCancelling)
                    {
                        cancelled = true;
                        return;
                    }
                }
                memoryStreamDeltas.Position = 0;
                if (Globals.SaveZipFiles)
                {
                    using (var stream = new FileStream(Globals.GraphicsSubDir + Path.DirectorySeparatorChar + Globals.DeltasSuffix + Globals.ZipFormat, FileMode.Create, FileAccess.Write))
                    {
                        var bytes = new byte[memoryStreamDeltas.Length];
                        memoryStreamDeltas.Read(bytes, 0, (int)memoryStreamDeltas.Length);
                        stream.Write(bytes, 0, bytes.Length);
                    }
                    memoryStreamDeltas.Position = 0;
                }
                atlas = CreateTextureAtlas <TextureAtlasDeltas>(ZipStorer.Open(memoryStreamDeltas, FileAccess.Read), Globals.DeltasSuffix, styleData.Deltas);
                _memoryStreams.Add(atlas, memoryStreamDeltas);
                _runningAtlas.Add(atlas);
            }

            WaitHandle.WaitOne();
            cancelled = WaitHandle.Value;

            GC.Collect();
        }