Esempio n. 1
0
        public override PixelBuffer ReadPixels(PixelFormat format, Rectangle rect)
        {
            Direct3D.Surface surf = mTexture.Value.GetSurfaceLevel(0);
            bool             disposeSurfWhenDone = false;

            if (surf.Description.Pool == Pool.Default)
            {
                surf = CopyRenderTargetSurfaceToSysmem(surf);
                disposeSurfWhenDone = true;
            }

            rect.X += mSrcRect.X;
            rect.Y += mSrcRect.Y;

            int pixelPitch = mDisplay.GetPixelPitch(surf.Description.Format);

            PixelFormat pixelFormat = mDisplay.GetPixelFormat(surf.Description.Format);

            if (format == PixelFormat.Any)
            {
                format = pixelFormat;
            }

            DataRectangle stm = surf.LockRectangle(
                new Drawing.Rectangle(0, 0, mTextureSize.Width, mTextureSize.Height),
                LockFlags.ReadOnly);

            byte[] array  = new byte[SurfaceWidth * SurfaceHeight * pixelPitch];
            int    length = SurfaceWidth * pixelPitch;
            int    index  = 0;

            unsafe
            {
                byte *ptr = (byte *)stm.Data.DataPointer;

                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 * stm.Pitch + rect.Left * pixelPitch);

                    Marshal.Copy(mptr, array, index, length);

                    index += length;
                }
            }

            surf.UnlockRectangle();

            if (disposeSurfWhenDone)
            {
                surf.Dispose();
            }

            return(new PixelBuffer(format, rect.Size, array, pixelFormat));
        }