public void GenerateMipMaps(int minMipWidth = 1, int minMipHeight = 1) { int mipCount = DdsHeader.CountMipMaps(Width, Height); int mipWidth = Width; int mipHeight = Height; MipMaps = new List <DdsMipMap> { new DdsMipMap(Width, Height, largestMipMap) }; for (int mipLoop = 1; mipLoop < mipCount; mipLoop++) { if (mipWidth > minMipWidth) { mipWidth /= 2; } if (mipHeight > minMipHeight) { mipHeight /= 2; } DdsMipMap writeSize = new DdsMipMap(mipWidth, mipHeight); WriteableBitmap mipMap = new WriteableBitmap(BitmapSource); writeSize.MipMap = mipMap.ResizeHighQuality(writeSize.Width, writeSize.Height).ConvertToRgba(); MipMaps.Add(writeSize); } }
public void GenerateMipMaps(int minMipWidth = 1, int minMipHeight = 1) { int mipCount = DdsHeader.CountMipMaps(Width, Height); int mipWidth = Width; int mipHeight = Height; MipMaps = new List<DdsMipMap> { new DdsMipMap(Width, Height, largestMipMap) }; for(int mipLoop = 1; mipLoop < mipCount; mipLoop++) { if (mipWidth > minMipWidth) mipWidth /= 2; if (mipHeight > minMipHeight) mipHeight /= 2; DdsMipMap writeSize = new DdsMipMap(mipWidth, mipHeight); WriteableBitmap mipMap = new WriteableBitmap(BitmapSource); writeSize.MipMap = mipMap.ResizeHighQuality(writeSize.Width, writeSize.Height).ConvertToRgba(); MipMaps.Add(writeSize); } }
public byte[] WriteMipMap(DdsMipMap mipMap, DdsSaveConfig saveConfig) { byte[] outputData; if (saveConfig.FileFormat >= FileFormat.DXT1 && saveConfig.FileFormat <= FileFormat.DXT5) { outputData = DdsSquish.CompressImage(mipMap.MipMap, mipMap.Width, mipMap.Height, saveConfig.GetSquishFlags(), null); } else { int pixelWidth = (int)header.PitchOrLinearSize / Width; int mipPitch = pixelWidth * mipMap.Width; outputData = new byte[mipPitch * mipMap.Height]; outputData.Initialize(); for (int i = 0; i < mipMap.MipMap.Length; i += 4) { uint pixelData = 0; byte R = mipMap.MipMap[i + 0]; byte G = mipMap.MipMap[i + 1]; byte B = mipMap.MipMap[i + 2]; byte A = mipMap.MipMap[i + 3]; switch (saveConfig.FileFormat) { case FileFormat.A8R8G8B8: { pixelData = ((uint)A << 24) | ((uint)R << 16) | ((uint)G << 8) | ((uint)B << 0); break; } case FileFormat.X8R8G8B8: { pixelData = ((uint)R << 16) | ((uint)G << 8) | ((uint)B << 0); break; } case FileFormat.A8B8G8R8: { pixelData = ((uint)A << 24) | ((uint)B << 16) | ((uint)G << 8) | ((uint)R << 0); break; } case FileFormat.X8B8G8R8: { pixelData = ((uint)B << 16) | ((uint)G << 8) | ((uint)R << 0); break; } case FileFormat.A1R5G5B5: { pixelData = ((uint)(A != 0 ? 1 : 0) << 15) | ((uint)(R >> 3) << 10) | ((uint)(G >> 3) << 5) | ((uint)(B >> 3) << 0); break; } case FileFormat.A4R4G4B4: { pixelData = ((uint)(A >> 4) << 12) | ((uint)(R >> 4) << 8) | ((uint)(G >> 4) << 4) | ((uint)(B >> 4) << 0); break; } case FileFormat.R8G8B8: { pixelData = ((uint)R << 16) | ((uint)G << 8) | ((uint)B << 0); break; } case FileFormat.R5G6B5: { pixelData = ((uint)(R >> 3) << 11) | ((uint)(G >> 2) << 5) | ((uint)(B >> 3) << 0); break; } case FileFormat.G8: { pixelData = (uint)((R + G + B) / 3.0 + 0.5); break; } } int pixelOffset = i / 4 * pixelWidth; for (int j = 0; j < pixelWidth; j++) { outputData[pixelOffset + j] = (byte)((pixelData >> (8 * j)) & 0xff); } } } return(outputData); }
public byte[] WriteMipMap(DdsMipMap mipMap , DdsSaveConfig saveConfig) { byte[] outputData; if (saveConfig.FileFormat >= FileFormat.DXT1 && saveConfig.FileFormat <= FileFormat.DXT5) { outputData = DdsSquish.CompressImage(mipMap.MipMap, mipMap.Width, mipMap.Height, saveConfig.GetSquishFlags(), null); } else { int pixelWidth = (int)header.PitchOrLinearSize / Width; int mipPitch = pixelWidth * mipMap.Width; outputData = new byte[mipPitch * mipMap.Height]; outputData.Initialize(); for(int i = 0; i < mipMap.MipMap.Length; i += 4) { uint pixelData = 0; byte R = mipMap.MipMap[i + 0]; byte G = mipMap.MipMap[i + 1]; byte B = mipMap.MipMap[i + 2]; byte A = mipMap.MipMap[i + 3]; switch(saveConfig.FileFormat) { case FileFormat.A8R8G8B8: { pixelData = ((uint)A << 24) | ((uint)R << 16) | ((uint)G << 8) | ((uint)B << 0); break; } case FileFormat.X8R8G8B8: { pixelData = ((uint)R << 16) | ((uint)G << 8) | ((uint)B << 0); break; } case FileFormat.A8B8G8R8: { pixelData = ((uint)A << 24) | ((uint)B << 16) | ((uint)G << 8) | ((uint)R << 0); break; } case FileFormat.X8B8G8R8: { pixelData = ((uint)B << 16) | ((uint)G << 8) | ((uint)R << 0); break; } case FileFormat.A1R5G5B5: { pixelData = ((uint)(A != 0 ? 1 : 0) << 15) | ((uint)(R >> 3) << 10) | ((uint)(G >> 3) << 5) | ((uint)(B >> 3) << 0); break; } case FileFormat.A4R4G4B4: { pixelData = ((uint)(A >> 4) << 12) | ((uint)(R >> 4) << 8) | ((uint)(G >> 4) << 4) | ((uint)(B >> 4) << 0); break; } case FileFormat.R8G8B8: { pixelData = ((uint)R << 16) | ((uint)G << 8) | ((uint)B << 0); break; } case FileFormat.R5G6B5: { pixelData = ((uint)(R >> 3) << 11) | ((uint)(G >> 2) << 5) | ((uint)(B >> 3) << 0); break; } case FileFormat.G8: { pixelData = (uint)((R + G + B) / 3.0 + 0.5); break; } } int pixelOffset = i / 4 * pixelWidth; for(int j = 0; j < pixelWidth; j++) outputData[pixelOffset + j] = (byte)((pixelData >> (8 * j)) & 0xff); } } return outputData; }