internal async void GenerateSavePreview() { if (img == null || SaveFormat == ImageEngineFormat.Unknown) { return; } // KFreon: TGA saving not supported if (img.Format.SurfaceFormat == ImageEngineFormat.TGA) { SaveFormat = ImageEngineFormat.PNG; } stopwatch.Start(); savePreviews = await Task.Run(() => { using (MemoryStream stream = new MemoryStream()) { Stopwatch watch = new Stopwatch(); watch.Start(); img.Save(stream, SaveFormat, MipHandling.KeepTopOnly, 1024, mergeAlpha: (SaveFormat == ImageEngineFormat.DDS_DXT1 ? FlattenBlend : false)); // KFreon: Smaller size for quicker loading watch.Stop(); Debug.WriteLine($"Preview Save took {watch.ElapsedMilliseconds}ms"); using (ImageEngineImage previewimage = new ImageEngineImage(stream)) { BitmapSource[] tempImgs = new BitmapSource[2]; tempImgs[0] = previewimage.GeneratePreview(0, true); tempImgs[1] = previewimage.GeneratePreview(0, false); return(tempImgs); } } }); stopwatch.Stop(); Debug.WriteLine($"Preview generation took {stopwatch.ElapsedMilliseconds}ms"); stopwatch.Reset(); OnPropertyChanged(nameof(SavePreview)); }
public async Task LoadImage(string path) { bool testing = false; // Set to true to load mips single threaded and only the full image instead of a smaller one first. Task <List <object> > fullLoadingTask = null; if (!testing) { // Load full size image //////////////////////////////////////////////////////////////////////////////////////// fullLoadingTask = Task.Run(() => { ImageEngineImage fullimage = new ImageEngineImage(path); List <BitmapSource> alphas = new List <BitmapSource>(); List <BitmapSource> nonalphas = new List <BitmapSource>(); for (int i = 0; i < fullimage.NumMipMaps; i++) { alphas.Add(fullimage.GeneratePreview(i, true)); nonalphas.Add(fullimage.GeneratePreview(i, false)); } List <object> bits = new List <object>(); bits.Add(fullimage); bits.Add(alphas); bits.Add(nonalphas); return(bits); }); //////////////////////////////////////////////////////////////////////////////////////// } SaveSuccess = null; Previews.Clear(); savePreviews = new BitmapSource[2]; SavePath = null; SaveFormat = ImageEngineFormat.Unknown; stopwatch.Start(); //////////////////////////////////////////////////////////////////////////////////////// if (testing) { img = await Task.Run(() => new ImageEngineImage(path)); } else { img = await Task.Run(() => new ImageEngineImage(path, 256, false)); } //////////////////////////////////////////////////////////////////////////////////////// Console.WriteLine(""); Console.WriteLine($"Format: {img.Format}"); stopwatch.Stop(); Console.WriteLine($"Image Loading: {stopwatch.ElapsedMilliseconds}"); stopwatch.Restart(); Previews.Add(img.GeneratePreview(0, ShowAlphaPreviews)); MipIndex = 1; // 1 based stopwatch.Stop(); Debug.WriteLine($"Image Preview: {stopwatch.ElapsedMilliseconds}"); stopwatch.Reset(); OnPropertyChanged(nameof(ImagePath)); OnPropertyChanged(nameof(Format)); OnPropertyChanged(nameof(NumMipMaps)); OnPropertyChanged(nameof(Preview)); OnPropertyChanged(nameof(MipWidth)); OnPropertyChanged(nameof(MipHeight)); // KFreon: Get full image details //////////////////////////////////////////////////////////////////////////////////////// if (!testing) { List <object> FullImageObjects = await fullLoadingTask; double? oldMipWidth = MipWidth; img = (ImageEngineImage)FullImageObjects[0]; AlphaPreviews = (List <BitmapSource>)FullImageObjects[1]; NonAlphaPreviews = (List <BitmapSource>)FullImageObjects[2]; UpdatePreviews(); // KFreon: Set selected mip index /*for (int i = 0; i < Previews.Count; i++) * { * if (Previews[i].Width == oldMipWidth) * { * MipIndex = i + 1; // 1 based * break; * } * }*/ MipIndex = 1; } //////////////////////////////////////////////////////////////////////////////////////// OnPropertyChanged(nameof(NumMipMaps)); OnPropertyChanged(nameof(Preview)); OnPropertyChanged(nameof(MipIndex)); OnPropertyChanged(nameof(MipWidth)); OnPropertyChanged(nameof(MipHeight)); OnPropertyChanged(nameof(img)); }