public static void ConvertToPVRTC(TextureContent sourceContent, int mipLevels, bool premultipliedAlpha, MGCompressionMode bpp) { IntPtr dataSizesPtr = IntPtr.Zero; var texDataPtr = ManagedPVRTC.ManagedPVRTC.CompressTexture(sourceContent.Faces[0][0].GetPixelData(), sourceContent.Faces[0][0].Height, sourceContent.Faces[0][0].Width, mipLevels, premultipliedAlpha, bpp == MGCompressionMode.PVRTCFourBitsPerPixel, ref dataSizesPtr); // Store the size of each mipLevel var dataSizesArray = new int[mipLevels]; Marshal.Copy(dataSizesPtr, dataSizesArray, 0, dataSizesArray.Length); var levelSize = 0; byte[] levelData; var sourceWidth = sourceContent.Faces[0][0].Width; var sourceHeight = sourceContent.Faces[0][0].Height; // Set the pixel data for each mip level. sourceContent.Faces[0].Clear(); for (int x = 0; x < mipLevels; x++) { levelSize = dataSizesArray[x]; levelData = new byte[levelSize]; Marshal.Copy(texDataPtr, levelData, 0, levelSize); var levelWidth = Math.Max(sourceWidth >> x, 1); var levelHeight = Math.Max(sourceHeight >> x, 1); sourceContent.Faces[0].Add(new MGBitmapContent(levelData, levelWidth, levelHeight, bpp)); texDataPtr = IntPtr.Add(texDataPtr, levelSize); } }
public MGBitmapContent(byte[] pData, int width, int height, MGCompressionMode bpp) : base(width, height) { _pixelData = pData; _bpp = bpp; }
public static void ConvertToPVRTC(TextureContent sourceContent, int mipLevels, bool premultipliedAlpha, MGCompressionMode bpp) { IntPtr dataSizesPtr = IntPtr.Zero; var texDataPtr = CompressTexture(sourceContent.Faces[0][0].GetPixelData(), sourceContent.Faces[0][0].Height, sourceContent.Faces[0][0].Width, mipLevels, premultipliedAlpha, bpp == MGCompressionMode.PVRTCFourBitsPerPixel, ref dataSizesPtr); // Store the size of each mipLevel var dataSizesArray = new int[mipLevels]; Marshal.Copy(dataSizesPtr, dataSizesArray, 0, dataSizesArray.Length); var levelSize = 0; byte[] levelData; var sourceWidth = sourceContent.Faces[0][0].Width; var sourceHeight = sourceContent.Faces[0][0].Height; // Set the pixel data for each mip level. sourceContent.Faces[0].Clear(); for (int x = 0; x < mipLevels; x++) { levelSize = dataSizesArray[x]; levelData = new byte[levelSize]; Marshal.Copy(texDataPtr, levelData, 0, levelSize); var levelWidth = Math.Max(sourceWidth >> x, 1); var levelHeight = Math.Max(sourceHeight >> x, 1); sourceContent.Faces[0].Add(new MGBitmapContent(levelData, levelWidth, levelHeight, bpp)); texDataPtr = IntPtr.Add(texDataPtr, levelSize); } }