diff --git a/Unity Studio/Unity Classes/Texture2D.cs b/Unity Studio/Unity Classes/Texture2D.cs index 31d6745..6e8d8c2 100644 --- a/Unity Studio/Unity Classes/Texture2D.cs +++ b/Unity Studio/Unity Classes/Texture2D.cs @@ -8,7 +8,7 @@ using System.Windows.Forms; namespace Unity_Studio { - class Texture2D + partial class Texture2D { public string m_Name; public int m_Width; @@ -86,18 +86,6 @@ namespace Unity_Studio //texgenpack private texgenpack_texturetype texturetype; - [DllImport("PVRTexLibWrapper.dll", CallingConvention = CallingConvention.Cdecl)] - private static extern bool DecompressPVR(byte[] buffer, IntPtr bmp, int len); - - [DllImport("TextureConverterWrapper.dll", CallingConvention = CallingConvention.Cdecl)] - private static extern bool Ponvert(byte[] buffer, IntPtr bmp, int nWidth, int nHeight, int len, int type, int bmpsize, bool fixAlpha); - - [DllImport("crunch.dll", CallingConvention = CallingConvention.Cdecl)] - private static extern bool DecompressCRN(byte[] pSrc_file_data, int src_file_size, out IntPtr dxtdata, out int dxtsize); - - [DllImport("texgenpack.dll", CallingConvention = CallingConvention.Cdecl)] - private static extern void texgenpackdecode(int texturetype, byte[] texturedata, int width, int height, IntPtr bmp, bool fixAlpha); - public Texture2D(AssetPreloadData preloadData, bool readSwitch) { var sourceFile = preloadData.sourceFile; @@ -775,321 +763,6 @@ namespace Unity_Studio dwBBitMask = 0xFF; dwABitMask = -16777216; } - - public byte[] ConvertToContainer() - { - if (image_data == null || image_data.Length == 0) - return null; - switch (m_TextureFormat) - { - case TextureFormat.Alpha8: - case TextureFormat.ARGB4444: - case TextureFormat.RGB24: - case TextureFormat.RGBA32: - case TextureFormat.ARGB32: - case TextureFormat.RGB565: - case TextureFormat.R16: - case TextureFormat.DXT1: - case TextureFormat.DXT5: - case TextureFormat.RGBA4444: - case TextureFormat.BGRA32: - case TextureFormat.RG16: - case TextureFormat.R8: - return ConvertToDDS(); - case TextureFormat.YUY2: - case TextureFormat.PVRTC_RGB2: - case TextureFormat.PVRTC_RGBA2: - case TextureFormat.PVRTC_RGB4: - case TextureFormat.PVRTC_RGBA4: - case TextureFormat.ETC_RGB4: - case TextureFormat.ETC2_RGB: - case TextureFormat.ETC2_RGBA1: - case TextureFormat.ETC2_RGBA8: - case TextureFormat.ASTC_RGB_4x4: - case TextureFormat.ASTC_RGB_5x5: - case TextureFormat.ASTC_RGB_6x6: - case TextureFormat.ASTC_RGB_8x8: - case TextureFormat.ASTC_RGB_10x10: - case TextureFormat.ASTC_RGB_12x12: - case TextureFormat.ASTC_RGBA_4x4: - case TextureFormat.ASTC_RGBA_5x5: - case TextureFormat.ASTC_RGBA_6x6: - case TextureFormat.ASTC_RGBA_8x8: - case TextureFormat.ASTC_RGBA_10x10: - case TextureFormat.ASTC_RGBA_12x12: - case TextureFormat.ETC_RGB4_3DS: - case TextureFormat.ETC_RGBA8_3DS: - return ConvertToPVR(); - case TextureFormat.RHalf: - case TextureFormat.RGHalf: - case TextureFormat.RGBAHalf: - case TextureFormat.RFloat: - case TextureFormat.RGFloat: - case TextureFormat.RGBAFloat: - case TextureFormat.BC4: - case TextureFormat.BC5: - case TextureFormat.BC6H: - case TextureFormat.BC7: - case TextureFormat.ATC_RGB4: - case TextureFormat.ATC_RGBA8: - case TextureFormat.EAC_R: - case TextureFormat.EAC_R_SIGNED: - case TextureFormat.EAC_RG: - case TextureFormat.EAC_RG_SIGNED: - return ConvertToKTX(); - default: - return image_data; - } - } - - private byte[] ConvertToDDS() - { - var imageBuffer = new byte[128 + image_data_size]; - dwMagic.CopyTo(imageBuffer, 0); - BitConverter.GetBytes(dwFlags).CopyTo(imageBuffer, 8); - BitConverter.GetBytes(m_Height).CopyTo(imageBuffer, 12); - BitConverter.GetBytes(m_Width).CopyTo(imageBuffer, 16); - BitConverter.GetBytes(dwPitchOrLinearSize).CopyTo(imageBuffer, 20); - BitConverter.GetBytes(dwMipMapCount).CopyTo(imageBuffer, 28); - BitConverter.GetBytes(dwSize).CopyTo(imageBuffer, 76); - BitConverter.GetBytes(dwFlags2).CopyTo(imageBuffer, 80); - BitConverter.GetBytes(dwFourCC).CopyTo(imageBuffer, 84); - BitConverter.GetBytes(dwRGBBitCount).CopyTo(imageBuffer, 88); - BitConverter.GetBytes(dwRBitMask).CopyTo(imageBuffer, 92); - BitConverter.GetBytes(dwGBitMask).CopyTo(imageBuffer, 96); - BitConverter.GetBytes(dwBBitMask).CopyTo(imageBuffer, 100); - BitConverter.GetBytes(dwABitMask).CopyTo(imageBuffer, 104); - BitConverter.GetBytes(dwCaps).CopyTo(imageBuffer, 108); - BitConverter.GetBytes(dwCaps2).CopyTo(imageBuffer, 112); - image_data.CopyTo(imageBuffer, 128); - return imageBuffer; - } - - private byte[] ConvertToPVR() - { - var mstream = new MemoryStream(); - using (var writer = new BinaryWriter(mstream)) - { - writer.Write(pvrVersion); - writer.Write(pvrFlags); - writer.Write(pvrPixelFormat); - writer.Write(pvrColourSpace); - writer.Write(pvrChannelType); - writer.Write(m_Height); - writer.Write(m_Width); - writer.Write(pvrDepth); - writer.Write(pvrNumSurfaces); - writer.Write(pvrNumFaces); - writer.Write(dwMipMapCount); - writer.Write(pvrMetaDataSize); - writer.Write(image_data); - return mstream.ToArray(); - } - } - - private byte[] ConvertToKTX() - { - var mstream = new MemoryStream(); - using (var writer = new BinaryWriter(mstream)) - { - writer.Write(KTXHeader.IDENTIFIER); - writer.Write(KTXHeader.ENDIANESS_LE); - writer.Write(glType); - writer.Write(glTypeSize); - writer.Write(glFormat); - writer.Write(glInternalFormat); - writer.Write(glBaseInternalFormat); - writer.Write(m_Width); - writer.Write(m_Height); - writer.Write(pixelDepth); - writer.Write(numberOfArrayElements); - writer.Write(numberOfFaces); - writer.Write(numberOfMipmapLevels); - writer.Write(bytesOfKeyValueData); - writer.Write(image_data_size); - writer.Write(image_data); - return mstream.ToArray(); - } - } - - public Bitmap ConvertToBitmap(bool flip) - { - if (image_data == null || image_data.Length == 0) - return null; - Bitmap bitmap; - switch (m_TextureFormat) - { - case TextureFormat.Alpha8: - case TextureFormat.ARGB4444: - case TextureFormat.RGB24: - case TextureFormat.RGBA32: - case TextureFormat.ARGB32: - case TextureFormat.R16: - case TextureFormat.RGBA4444: - case TextureFormat.BGRA32: - case TextureFormat.RG16: - case TextureFormat.R8: - bitmap = BGRA32ToBitmap(); - break; - case TextureFormat.RGB565: - bitmap = RGB565ToBitmap(); - break; - case TextureFormat.YUY2: - case TextureFormat.PVRTC_RGB2: - case TextureFormat.PVRTC_RGBA2: - case TextureFormat.PVRTC_RGB4: - case TextureFormat.PVRTC_RGBA4: - case TextureFormat.ETC_RGB4: - case TextureFormat.ETC2_RGB: - case TextureFormat.ETC2_RGBA1: - case TextureFormat.ETC2_RGBA8: - case TextureFormat.ASTC_RGB_4x4: - case TextureFormat.ASTC_RGB_5x5: - case TextureFormat.ASTC_RGB_6x6: - case TextureFormat.ASTC_RGB_8x8: - case TextureFormat.ASTC_RGB_10x10: - case TextureFormat.ASTC_RGB_12x12: - case TextureFormat.ASTC_RGBA_4x4: - case TextureFormat.ASTC_RGBA_5x5: - case TextureFormat.ASTC_RGBA_6x6: - case TextureFormat.ASTC_RGBA_8x8: - case TextureFormat.ASTC_RGBA_10x10: - case TextureFormat.ASTC_RGBA_12x12: - case TextureFormat.ETC_RGB4_3DS: - case TextureFormat.ETC_RGBA8_3DS: - bitmap = PVRToBitmap(ConvertToPVR()); - break; - case TextureFormat.DXT1: - case TextureFormat.DXT5: - case TextureFormat.RHalf: - case TextureFormat.RGHalf: - case TextureFormat.RGBAHalf: - case TextureFormat.RFloat: - case TextureFormat.RGFloat: - case TextureFormat.RGBAFloat: - case TextureFormat.RGB9e5Float: - case TextureFormat.ATC_RGB4: - case TextureFormat.ATC_RGBA8: - case TextureFormat.EAC_R: - case TextureFormat.EAC_R_SIGNED: - case TextureFormat.EAC_RG: - case TextureFormat.EAC_RG_SIGNED: - bitmap = TextureConverter(); - break; - case TextureFormat.BC4: - case TextureFormat.BC5: - case TextureFormat.BC6H: - case TextureFormat.BC7: - bitmap = Texgenpack(); - break; - case TextureFormat.DXT1Crunched: - case TextureFormat.DXT5Crunched: - DecompressCRN(); - bitmap = TextureConverter(); - break; - case TextureFormat.ETC_RGB4Crunched: - case TextureFormat.ETC2_RGBA8Crunched: - DecompressCRN(); - bitmap = PVRToBitmap(ConvertToPVR()); - break; - default: - return null; - } - if (bitmap != null && flip) - bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY); - return bitmap; - } - - private Bitmap BGRA32ToBitmap() - { - var hObject = GCHandle.Alloc(image_data, GCHandleType.Pinned); - var pObject = hObject.AddrOfPinnedObject(); - var bitmap = new Bitmap(m_Width, m_Height, m_Width * 4, PixelFormat.Format32bppArgb, pObject); - hObject.Free(); - return bitmap; - } - - private Bitmap RGB565ToBitmap() - { - //stride = m_Width * 2 + m_Width * 2 % 4 - //所以m_Width * 2不为4的倍数时,需要在每行补上相应的像素 - byte[] buff; - var padding = m_Width * 2 % 4; - var stride = m_Width * 2 + padding; - if (padding != 0) - { - buff = new byte[stride * m_Height]; - for (int i = 0; i < m_Height; i++) - { - Array.Copy(image_data, i * m_Width * 2, buff, i * stride, m_Width * 2); - } - } - else - { - buff = image_data; - } - var hObject = GCHandle.Alloc(buff, GCHandleType.Pinned); - var pObject = hObject.AddrOfPinnedObject(); - var bitmap = new Bitmap(m_Width, m_Height, stride, PixelFormat.Format16bppRgb565, pObject); - hObject.Free(); - return bitmap; - } - - private Bitmap PVRToBitmap(byte[] pvrdata) - { - var bitmap = new Bitmap(m_Width, m_Height); - var rect = new Rectangle(0, 0, m_Width, m_Height); - var bmd = bitmap.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); - var len = Math.Abs(bmd.Stride) * bmd.Height; - if (!DecompressPVR(pvrdata, bmd.Scan0, len)) - { - bitmap.UnlockBits(bmd); - bitmap.Dispose(); - return null; - } - bitmap.UnlockBits(bmd); - return bitmap; - } - - private Bitmap TextureConverter() - { - var bitmap = new Bitmap(m_Width, m_Height); - var rect = new Rectangle(0, 0, m_Width, m_Height); - var bmd = bitmap.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); - var len = Math.Abs(bmd.Stride) * bmd.Height; - var fixAlpha = glBaseInternalFormat == KTXHeader.GL_RED || glBaseInternalFormat == KTXHeader.GL_RG; - if (!Ponvert(image_data, bmd.Scan0, m_Width, m_Height, image_data_size, (int)q_format, len, fixAlpha)) - { - bitmap.UnlockBits(bmd); - bitmap.Dispose(); - return null; - } - bitmap.UnlockBits(bmd); - return bitmap; - } - - private void DecompressCRN() - { - if (DecompressCRN(image_data, image_data_size, out IntPtr dxtdata, out int dxtsize)) - { - var dxtbytes = new byte[dxtsize]; - Marshal.Copy(dxtdata, dxtbytes, 0, dxtsize); - Marshal.FreeHGlobal(dxtdata); - image_data = dxtbytes; - image_data_size = dxtsize; - } - } - - private Bitmap Texgenpack() - { - var bitmap = new Bitmap(m_Width, m_Height); - var rect = new Rectangle(0, 0, m_Width, m_Height); - var bmd = bitmap.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); - var fixAlpha = glBaseInternalFormat == KTXHeader.GL_RED || glBaseInternalFormat == KTXHeader.GL_RG; - texgenpackdecode((int)texturetype, image_data, m_Width, m_Height, bmd.Scan0, fixAlpha); - bitmap.UnlockBits(bmd); - return bitmap; - } } } diff --git a/Unity Studio/Unity Studio Classes/Texture2DConverter.cs b/Unity Studio/Unity Studio Classes/Texture2DConverter.cs new file mode 100644 index 0000000..f3aff78 --- /dev/null +++ b/Unity Studio/Unity Studio Classes/Texture2DConverter.cs @@ -0,0 +1,342 @@ +using System; +using System.Collections.Generic; +using System.Drawing; +using System.Drawing.Imaging; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Text; + +namespace Unity_Studio +{ + partial class Texture2D + { + [DllImport("PVRTexLibWrapper.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern bool DecompressPVR(byte[] buffer, IntPtr bmp, int len); + + [DllImport("TextureConverterWrapper.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern bool Ponvert(byte[] buffer, IntPtr bmp, int nWidth, int nHeight, int len, int type, int bmpsize, bool fixAlpha); + + [DllImport("crunch.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern bool DecompressCRN(byte[] pSrc_file_data, int src_file_size, out IntPtr dxtdata, out int dxtsize); + + [DllImport("texgenpack.dll", CallingConvention = CallingConvention.Cdecl)] + private static extern void texgenpackdecode(int texturetype, byte[] texturedata, int width, int height, IntPtr bmp, bool fixAlpha); + + + public byte[] ConvertToContainer() + { + if (image_data == null || image_data.Length == 0) + return null; + switch (m_TextureFormat) + { + case TextureFormat.Alpha8: + case TextureFormat.ARGB4444: + case TextureFormat.RGB24: + case TextureFormat.RGBA32: + case TextureFormat.ARGB32: + case TextureFormat.RGB565: + case TextureFormat.R16: + case TextureFormat.DXT1: + case TextureFormat.DXT5: + case TextureFormat.RGBA4444: + case TextureFormat.BGRA32: + case TextureFormat.RG16: + case TextureFormat.R8: + return ConvertToDDS(); + case TextureFormat.YUY2: + case TextureFormat.PVRTC_RGB2: + case TextureFormat.PVRTC_RGBA2: + case TextureFormat.PVRTC_RGB4: + case TextureFormat.PVRTC_RGBA4: + case TextureFormat.ETC_RGB4: + case TextureFormat.ETC2_RGB: + case TextureFormat.ETC2_RGBA1: + case TextureFormat.ETC2_RGBA8: + case TextureFormat.ASTC_RGB_4x4: + case TextureFormat.ASTC_RGB_5x5: + case TextureFormat.ASTC_RGB_6x6: + case TextureFormat.ASTC_RGB_8x8: + case TextureFormat.ASTC_RGB_10x10: + case TextureFormat.ASTC_RGB_12x12: + case TextureFormat.ASTC_RGBA_4x4: + case TextureFormat.ASTC_RGBA_5x5: + case TextureFormat.ASTC_RGBA_6x6: + case TextureFormat.ASTC_RGBA_8x8: + case TextureFormat.ASTC_RGBA_10x10: + case TextureFormat.ASTC_RGBA_12x12: + case TextureFormat.ETC_RGB4_3DS: + case TextureFormat.ETC_RGBA8_3DS: + return ConvertToPVR(); + case TextureFormat.RHalf: + case TextureFormat.RGHalf: + case TextureFormat.RGBAHalf: + case TextureFormat.RFloat: + case TextureFormat.RGFloat: + case TextureFormat.RGBAFloat: + case TextureFormat.BC4: + case TextureFormat.BC5: + case TextureFormat.BC6H: + case TextureFormat.BC7: + case TextureFormat.ATC_RGB4: + case TextureFormat.ATC_RGBA8: + case TextureFormat.EAC_R: + case TextureFormat.EAC_R_SIGNED: + case TextureFormat.EAC_RG: + case TextureFormat.EAC_RG_SIGNED: + return ConvertToKTX(); + default: + return image_data; + } + } + + private byte[] ConvertToDDS() + { + var imageBuffer = new byte[128 + image_data_size]; + dwMagic.CopyTo(imageBuffer, 0); + BitConverter.GetBytes(dwFlags).CopyTo(imageBuffer, 8); + BitConverter.GetBytes(m_Height).CopyTo(imageBuffer, 12); + BitConverter.GetBytes(m_Width).CopyTo(imageBuffer, 16); + BitConverter.GetBytes(dwPitchOrLinearSize).CopyTo(imageBuffer, 20); + BitConverter.GetBytes(dwMipMapCount).CopyTo(imageBuffer, 28); + BitConverter.GetBytes(dwSize).CopyTo(imageBuffer, 76); + BitConverter.GetBytes(dwFlags2).CopyTo(imageBuffer, 80); + BitConverter.GetBytes(dwFourCC).CopyTo(imageBuffer, 84); + BitConverter.GetBytes(dwRGBBitCount).CopyTo(imageBuffer, 88); + BitConverter.GetBytes(dwRBitMask).CopyTo(imageBuffer, 92); + BitConverter.GetBytes(dwGBitMask).CopyTo(imageBuffer, 96); + BitConverter.GetBytes(dwBBitMask).CopyTo(imageBuffer, 100); + BitConverter.GetBytes(dwABitMask).CopyTo(imageBuffer, 104); + BitConverter.GetBytes(dwCaps).CopyTo(imageBuffer, 108); + BitConverter.GetBytes(dwCaps2).CopyTo(imageBuffer, 112); + image_data.CopyTo(imageBuffer, 128); + return imageBuffer; + } + + private byte[] ConvertToPVR() + { + var mstream = new MemoryStream(); + using (var writer = new BinaryWriter(mstream)) + { + writer.Write(pvrVersion); + writer.Write(pvrFlags); + writer.Write(pvrPixelFormat); + writer.Write(pvrColourSpace); + writer.Write(pvrChannelType); + writer.Write(m_Height); + writer.Write(m_Width); + writer.Write(pvrDepth); + writer.Write(pvrNumSurfaces); + writer.Write(pvrNumFaces); + writer.Write(dwMipMapCount); + writer.Write(pvrMetaDataSize); + writer.Write(image_data); + return mstream.ToArray(); + } + } + + private byte[] ConvertToKTX() + { + var mstream = new MemoryStream(); + using (var writer = new BinaryWriter(mstream)) + { + writer.Write(KTXHeader.IDENTIFIER); + writer.Write(KTXHeader.ENDIANESS_LE); + writer.Write(glType); + writer.Write(glTypeSize); + writer.Write(glFormat); + writer.Write(glInternalFormat); + writer.Write(glBaseInternalFormat); + writer.Write(m_Width); + writer.Write(m_Height); + writer.Write(pixelDepth); + writer.Write(numberOfArrayElements); + writer.Write(numberOfFaces); + writer.Write(numberOfMipmapLevels); + writer.Write(bytesOfKeyValueData); + writer.Write(image_data_size); + writer.Write(image_data); + return mstream.ToArray(); + } + } + + public Bitmap ConvertToBitmap(bool flip) + { + if (image_data == null || image_data.Length == 0) + return null; + Bitmap bitmap; + switch (m_TextureFormat) + { + case TextureFormat.Alpha8: + case TextureFormat.ARGB4444: + case TextureFormat.RGB24: + case TextureFormat.RGBA32: + case TextureFormat.ARGB32: + case TextureFormat.R16: + case TextureFormat.RGBA4444: + case TextureFormat.BGRA32: + case TextureFormat.RG16: + case TextureFormat.R8: + bitmap = BGRA32ToBitmap(); + break; + case TextureFormat.RGB565: + bitmap = RGB565ToBitmap(); + break; + case TextureFormat.YUY2: + case TextureFormat.PVRTC_RGB2: + case TextureFormat.PVRTC_RGBA2: + case TextureFormat.PVRTC_RGB4: + case TextureFormat.PVRTC_RGBA4: + case TextureFormat.ETC_RGB4: + case TextureFormat.ETC2_RGB: + case TextureFormat.ETC2_RGBA1: + case TextureFormat.ETC2_RGBA8: + case TextureFormat.ASTC_RGB_4x4: + case TextureFormat.ASTC_RGB_5x5: + case TextureFormat.ASTC_RGB_6x6: + case TextureFormat.ASTC_RGB_8x8: + case TextureFormat.ASTC_RGB_10x10: + case TextureFormat.ASTC_RGB_12x12: + case TextureFormat.ASTC_RGBA_4x4: + case TextureFormat.ASTC_RGBA_5x5: + case TextureFormat.ASTC_RGBA_6x6: + case TextureFormat.ASTC_RGBA_8x8: + case TextureFormat.ASTC_RGBA_10x10: + case TextureFormat.ASTC_RGBA_12x12: + case TextureFormat.ETC_RGB4_3DS: + case TextureFormat.ETC_RGBA8_3DS: + bitmap = PVRToBitmap(ConvertToPVR()); + break; + case TextureFormat.DXT1: + case TextureFormat.DXT5: + case TextureFormat.RHalf: + case TextureFormat.RGHalf: + case TextureFormat.RGBAHalf: + case TextureFormat.RFloat: + case TextureFormat.RGFloat: + case TextureFormat.RGBAFloat: + case TextureFormat.RGB9e5Float: + case TextureFormat.ATC_RGB4: + case TextureFormat.ATC_RGBA8: + case TextureFormat.EAC_R: + case TextureFormat.EAC_R_SIGNED: + case TextureFormat.EAC_RG: + case TextureFormat.EAC_RG_SIGNED: + bitmap = TextureConverter(); + break; + case TextureFormat.BC4: + case TextureFormat.BC5: + case TextureFormat.BC6H: + case TextureFormat.BC7: + bitmap = Texgenpack(); + break; + case TextureFormat.DXT1Crunched: + case TextureFormat.DXT5Crunched: + DecompressCRN(); + bitmap = TextureConverter(); + break; + case TextureFormat.ETC_RGB4Crunched: + case TextureFormat.ETC2_RGBA8Crunched: + DecompressCRN(); + bitmap = PVRToBitmap(ConvertToPVR()); + break; + default: + return null; + } + if (bitmap != null && flip) + bitmap.RotateFlip(RotateFlipType.RotateNoneFlipY); + return bitmap; + } + + private Bitmap BGRA32ToBitmap() + { + var hObject = GCHandle.Alloc(image_data, GCHandleType.Pinned); + var pObject = hObject.AddrOfPinnedObject(); + var bitmap = new Bitmap(m_Width, m_Height, m_Width * 4, PixelFormat.Format32bppArgb, pObject); + hObject.Free(); + return bitmap; + } + + private Bitmap RGB565ToBitmap() + { + //stride = m_Width * 2 + m_Width * 2 % 4 + //所以m_Width * 2不为4的倍数时,需要在每行补上相应的像素 + byte[] buff; + var padding = m_Width * 2 % 4; + var stride = m_Width * 2 + padding; + if (padding != 0) + { + buff = new byte[stride * m_Height]; + for (int i = 0; i < m_Height; i++) + { + Array.Copy(image_data, i * m_Width * 2, buff, i * stride, m_Width * 2); + } + } + else + { + buff = image_data; + } + var hObject = GCHandle.Alloc(buff, GCHandleType.Pinned); + var pObject = hObject.AddrOfPinnedObject(); + var bitmap = new Bitmap(m_Width, m_Height, stride, PixelFormat.Format16bppRgb565, pObject); + hObject.Free(); + return bitmap; + } + + private Bitmap PVRToBitmap(byte[] pvrdata) + { + var bitmap = new Bitmap(m_Width, m_Height); + var rect = new Rectangle(0, 0, m_Width, m_Height); + var bmd = bitmap.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); + var len = Math.Abs(bmd.Stride) * bmd.Height; + if (!DecompressPVR(pvrdata, bmd.Scan0, len)) + { + bitmap.UnlockBits(bmd); + bitmap.Dispose(); + return null; + } + bitmap.UnlockBits(bmd); + return bitmap; + } + + private Bitmap TextureConverter() + { + var bitmap = new Bitmap(m_Width, m_Height); + var rect = new Rectangle(0, 0, m_Width, m_Height); + var bmd = bitmap.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); + var len = Math.Abs(bmd.Stride) * bmd.Height; + var fixAlpha = glBaseInternalFormat == KTXHeader.GL_RED || glBaseInternalFormat == KTXHeader.GL_RG; + if (!Ponvert(image_data, bmd.Scan0, m_Width, m_Height, image_data_size, (int)q_format, len, fixAlpha)) + { + bitmap.UnlockBits(bmd); + bitmap.Dispose(); + return null; + } + bitmap.UnlockBits(bmd); + return bitmap; + } + + private void DecompressCRN() + { + if (DecompressCRN(image_data, image_data_size, out IntPtr dxtdata, out int dxtsize)) + { + var dxtbytes = new byte[dxtsize]; + Marshal.Copy(dxtdata, dxtbytes, 0, dxtsize); + Marshal.FreeHGlobal(dxtdata); + image_data = dxtbytes; + image_data_size = dxtsize; + } + } + + private Bitmap Texgenpack() + { + var bitmap = new Bitmap(m_Width, m_Height); + var rect = new Rectangle(0, 0, m_Width, m_Height); + var bmd = bitmap.LockBits(rect, ImageLockMode.WriteOnly, PixelFormat.Format32bppArgb); + var fixAlpha = glBaseInternalFormat == KTXHeader.GL_RED || glBaseInternalFormat == KTXHeader.GL_RG; + texgenpackdecode((int)texturetype, image_data, m_Width, m_Height, bmd.Scan0, fixAlpha); + bitmap.UnlockBits(bmd); + return bitmap; + } + } +} diff --git a/Unity Studio/Unity Studio-x86.csproj b/Unity Studio/Unity Studio-x86.csproj index 3ead8c2..4c109b4 100644 --- a/Unity Studio/Unity Studio-x86.csproj +++ b/Unity Studio/Unity Studio-x86.csproj @@ -147,6 +147,7 @@ + diff --git a/Unity Studio/Unity Studio.csproj b/Unity Studio/Unity Studio.csproj index 04514f5..24556cc 100644 --- a/Unity Studio/Unity Studio.csproj +++ b/Unity Studio/Unity Studio.csproj @@ -146,6 +146,7 @@ +