public static DIB FromBitmap(Bitmap src, int wAlign, int hAlign, PixelFormat format) { DIB dib = new DIB(src.Width, src.Height, wAlign, hAlign, format); dib.ReadBitmap(src); return(dib); }
//internal override void EncodeLevel(TEX0v1* header, DIB dib, Bitmap src, int dStep, int sStep, int level) //{ // if ((level == 1) && (_blockBuffer != null)) // { // CMPRBlock* sPtr = (CMPRBlock*)_blockBuffer.Address; // CMPRBlock* dPtr = (CMPRBlock*)header->PixelData; // int blocks = _blockBuffer.Length / 8; // for (int i = 0; i < blocks; i++) // dPtr[i] = sPtr[i]; // } // else // base.EncodeLevel(header, dib, src, dStep, sStep, level); //} internal override void EncodeLevel(VoidPtr addr, DIB dib, Bitmap src, int dStep, int sStep, int level) { if ((level == 1) && (_blockBuffer != null)) { CMPRBlock* sPtr = (CMPRBlock*)_blockBuffer.Address; CMPRBlock* dPtr = (CMPRBlock*)addr; int blocks = _blockBuffer.Length / 8; for (int i = 0; i < blocks; i++) dPtr[i] = sPtr[i]; } else base.EncodeLevel(addr, dib, src, dStep, sStep, level); }
public static unsafe void CopyTo(this Bitmap bmp, Bitmap dest) { int w = Math.Min(bmp.Width, dest.Width); int h = Math.Min(bmp.Height, dest.Height); using (DIB dib = new DIB(w, h, dest.PixelFormat)) { dib.ReadBitmap(bmp, w, h); dib.WriteBitmap(dest, w, h); } }
public static DIB FromBitmap(Bitmap src, PixelFormat format) { DIB dib = new DIB(src.Width, src.Height, format); dib.ReadBitmap(src); return dib; }
internal virtual void EncodeLevel(VoidPtr dstAddr, DIB dib, Bitmap src, int dStep, int sStep, int level) { int mw = dib.Width, mh = dib.Height, aw = mw.Align(BlockWidth); if (level != 1) { dstAddr += GetMipOffset(ref mw, ref mh, level); using (Bitmap mip = src.GenerateMip(level)) dib.ReadBitmap(mip, mw, mh); } mw = mw.Align(BlockWidth); mh = mh.Align(BlockHeight); int bStride = mw * BitsPerPixel / 8; for (int y = 0; y < mh; y += BlockHeight) { VoidPtr sPtr = (int)dib.Scan0 + (y * dib.Stride); VoidPtr dPtr = dstAddr + (y * bStride); for (int x = 0; x < mw; x += BlockWidth, dPtr += dStep, sPtr += sStep) EncodeBlock((ARGBPixel*)sPtr, dPtr, aw); } }
public virtual Bitmap DecodeTexture(VoidPtr addr, int w, int h, int mipLevel) { addr += GetMipOffset(ref w, ref h, mipLevel); int aw = w.Align(BlockWidth), ah = h.Align(BlockHeight); using (DIB dib = new DIB(w, h, BlockWidth, BlockHeight, PixelFormat.Format32bppArgb)) { int sStep = BlockWidth * BlockHeight * BitsPerPixel / 8; int bStride = aw * BitsPerPixel / 8; for (int y = 0; y < ah; y += BlockHeight) { ARGBPixel* dPtr = (ARGBPixel*)dib.Scan0 + (y * aw); VoidPtr sPtr = addr + (y * bStride); for (int x = 0; x < aw; x += BlockWidth, dPtr += BlockWidth, sPtr += sStep) DecodeBlock(sPtr, dPtr, aw); } return dib.ToBitmap(); } }