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(); }