// TODO: Test this method: public override void WritePixels(PixelBuffer buffer, Point startPoint) { Direct3D.Surface surf = mTexture.Value.GetSurfaceLevel(0); Rectangle updateRect = new Rectangle(startPoint, buffer.Size); int pitch; int pixelPitch = mDisplay.GetPixelPitch(surf.Description.Format); PixelFormat pixelFormat = mDisplay.GetPixelFormat(surf.Description.Format); surf.Dispose(); GraphicsStream stm = mTexture.Value.LockRectangle(0, Interop.Convert(updateRect), 0, out pitch); if (buffer.PixelFormat != pixelFormat) { buffer = buffer.ConvertTo(pixelFormat); } unsafe { for (int i = updateRect.Top; i < updateRect.Bottom; i++) { int startIndex = buffer.GetPixelIndex(0, i); int rowStride = buffer.RowStride; IntPtr dest = (IntPtr)((byte *)stm.InternalData + i * pitch + updateRect.Left * pixelPitch); Marshal.Copy(buffer.Data, startIndex, dest, rowStride); } } mTexture.Value.UnlockRectangle(0); }
public override PixelBuffer ReadPixels(PixelFormat format, Rectangle rect) { Direct3D.Surface surf = mTexture.Value.GetSurfaceLevel(0); rect.X += mSrcRect.X; rect.Y += mSrcRect.Y; int stride; int pixelPitch = mDisplay.GetPixelPitch(surf.Description.Format); PixelFormat pixelFormat = mDisplay.GetPixelFormat(surf.Description.Format); if (format == PixelFormat.Any) { format = pixelFormat; } GraphicsStream stm = surf.LockRectangle( new Drawing.Rectangle(0, 0, mTextureSize.Width, mTextureSize.Height), LockFlags.ReadOnly, out stride); byte[] array = new byte[SurfaceWidth * SurfaceHeight * pixelPitch]; int length = SurfaceWidth * pixelPitch; int index = 0; unsafe { byte *ptr = (byte *)stm.InternalDataPointer; for (int i = rect.Top; i < rect.Bottom; i++) { // hack if the size requested is too large. if (i >= mTextureSize.Height) { break; } //IntPtr ptr = (IntPtr)((int)stm.InternalData + i * stride + rect.Left * pixelPitch); IntPtr mptr = (IntPtr)(ptr + i * stride + rect.Left * pixelPitch); Marshal.Copy(mptr, array, index, length); index += length; } } surf.UnlockRectangle(); surf.Dispose(); return(new PixelBuffer(format, rect.Size, array, pixelFormat)); }