public override TextureHeader LoadHeader(string file, TextureLoadSettings settings) { using (Image image = Image.FromFile(file)) { return(new TextureHeader() { Width = image.Width, Height = image.Height, Format = TextureFormat.RGBA32_Float, MipLevels = 1 }); } }
public override TextureHeader LoadHeader(string file, TextureLoadSettings settings) { if (file == null) { throw new ArgumentNullException("file"); } header = new TextureHeader(); FileStream stream = new FileStream(file, FileMode.Open); BinaryReader reader = new BinaryReader(stream); try { //Header + Magic Word int magicWordSize = 4; byte[] magicWordData = reader.ReadBytes(magicWordSize); string magicWord = Encoding.ASCII.GetString(magicWordData).Trim(); if (magicWord == "DDS") { int headerSize = 124; byte[] headerData = reader.ReadBytes(headerSize); this.headerDDS = DDSTextureImporter.ByteArrayToStruct <Header>(headerData, 0); header.Width = (int)this.headerDDS.Width; header.Height = (int)this.headerDDS.Height; header.Depth = (int)Depth; header.MipLevels = this.headerDDS.MipMapCount > 0 ? (int)this.headerDDS.MipMapCount : 1; headerDXT10 = new HeaderDXT10(); if (this.headerDDS.PixelFormat.Flags == PixelFormatFlags.FourCC && this.headerDDS.PixelFormat.FourCC == "DXT10") { hasHeaderDXT10 = true; byte[] headerDxt10Data = reader.ReadBytes(Marshal.SizeOf(typeof(HeaderDXT10))); headerDXT10 = DDSTextureImporter.ByteArrayToStruct <HeaderDXT10>(headerDxt10Data, 0); } header.Format = GetTextureFormat(); } } finally { reader.Close(); stream.Close(); } IsHeaderLoaded = true; return(header); }
public override void LoadData(ITexture2D handle, string file, TextureLoadSettings settings) { unsafe { using (Bitmap bitmap = new Bitmap(file)) { BitmapData data = bitmap.LockBits(new System.Drawing.Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, bitmap.PixelFormat); try { Color[] colorsArgb; switch (data.PixelFormat) { case PixelFormat.Format24bppRgb: colorsArgb = new Color[data.Width * data.Height]; for (int x = 0; x < data.Width; x++) { for (int y = 0; y < data.Height; y++) { byte *b = (byte *)(data.Scan0 + y * data.Stride + x * 3); byte *g = b + 1; byte *r = g + 1; colorsArgb[y * data.Width + x] = Color.FromArgb(255, *r, *g, *b); } } break; case PixelFormat.Format32bppArgb: colorsArgb = new Color[data.Width * data.Height]; for (int x = 0; x < data.Width; x++) { for (int y = 0; y < data.Height; y++) { byte *b = (byte *)(data.Scan0 + y * data.Stride + x * 4); byte *g = b + 1; byte *r = g + 1; byte *a = r + 1; colorsArgb[y * data.Width + x] = Color.FromArgb(*a, *r, *g, *b); } } break; case PixelFormat.Format8bppIndexed: colorsArgb = new Color[data.Width * data.Height]; for (int x = 0; x < data.Width; x++) { for (int y = 0; y < data.Height; y++) { byte *index = (byte *)(data.Scan0 + y * data.Stride + x); colorsArgb[y * data.Width + x] = Color.FromArgb(bitmap.Palette.Entries[*index].ToArgb()); } } break; default: throw new NotImplementedException("PixelFormat " + data.PixelFormat + " not implemented"); } GCHandle gcHandle; DataRectangle dataRectangle = DataRectangle.FromArray(colorsArgb, bitmap.Width * Engine.GraphicsDevice.GetSizeOf(TextureFormat.RGBA32_Float), out gcHandle); try { Engine.GraphicsDevice.RenderContext.UpdateContext.Update(handle, 0, dataRectangle); } finally { gcHandle.Free(); } } finally { bitmap.UnlockBits(data); } } } }
public override void LoadData(Graphics.ITexture2D handle, string file, TextureLoadSettings settings) { if (file == null) { throw new ArgumentNullException("file"); } if (handle == null) { throw new ArgumentNullException("handle"); } if (!IsHeaderLoaded) { LoadHeader(file, settings); } FileStream stream = new FileStream(file, FileMode.Open); if (stream.Length <= 128) { throw new Exception("File is too small"); } GCHandle arrayHandle; try { int dataOffset = 4 + 124; if (hasHeaderDXT10) { dataOffset += Marshal.SizeOf(typeof(HeaderDXT10)); } stream.Position = dataOffset; int dataSize = (int)stream.Length - dataOffset; byte[] data = new byte[dataSize]; stream.Read(data, 0, dataSize); if (!IsVolumeTexture) { int faces = IsCubeMap ? 6 : 1; int levels = header.MipLevels > 0 ? header.MipLevels : 1; DataRectangle[] rectangles = new DataRectangle[levels * faces]; if (TextureFormatHelper.IsCompressed(header.Format)) { arrayHandle = GCHandle.Alloc(data, GCHandleType.Pinned); } else { arrayHandle = GCHandle.Alloc(ConvertFormat(data), GCHandleType.Pinned); } try { IntPtr pointer = arrayHandle.AddrOfPinnedObject(); for (int face = 0; face < faces; face++) { int width = header.Width; int height = header.Height; for (int mipLevel = 0; mipLevel < levels; mipLevel++) { int size = (int)GetSize(width, height); rectangles[levels * face + mipLevel] = new DataRectangle(pointer, (int)GetPitch(width), size); width /= 2; height /= 2; pointer += size; } } for (int i = 0; i < rectangles.Length; i++) { Engine.GraphicsDevice.RenderContext.UpdateContext.Update(handle, i, rectangles[i]); } } finally { arrayHandle.Free(); } } else { //TextureImporterBase doesn't support 3D Textures } } finally { //if (arrayHandle.IsAllocated) // arrayHandle.Free(); stream.Close(); } }
public abstract void LoadData(ITexture2D handle, string file, TextureLoadSettings settings);
public abstract TextureHeader LoadHeader(string file, TextureLoadSettings settings);