internal static int BuildMipMaps(List<MipMap> MipMaps)
{
if (MipMaps?.Count == 0)
return 0;
MipMap currentMip = MipMaps[0];
// KFreon: Check if mips required
int estimatedMips = DDSGeneral.EstimateNumMipMaps(currentMip.Width, currentMip.Height);
if (MipMaps.Count > 1)
return estimatedMips;
// KFreon: Half dimensions until one == 1.
MipMap[] newmips = new MipMap[estimatedMips];
var baseBMP = UsefulThings.WPF.Images.CreateWriteableBitmap(currentMip.Pixels, currentMip.Width, currentMip.Height);
baseBMP.Freeze();
Action<int> action = new Action<int>(item =>
{
int index = item;
MipMap newmip;
var scale = 1d / (2 << (index - 1)); // Shifting is 2^index - Math.Pow seems extraordinarly slow.
newmip = ImageEngine.Resize(baseBMP, scale, scale, currentMip.Width, currentMip.Height);
newmips[index - 1] = newmip;
});
// Start at 1 to skip top mip
if (ImageEngine.EnableThreading)
Parallel.For(1, estimatedMips + 1, new ParallelOptions { MaxDegreeOfParallelism = ImageEngine.NumThreads }, action);
else
for (int item = 1; item < estimatedMips + 1; item++)
action(item);
MipMaps.AddRange(newmips);
return estimatedMips;
}