public static void GetTexture_BGRA4444 <T>(this Texture2D texture, int level, int arraySlice, Rectangle?rect, T[] data, int startIndex, int elementCount) where T : struct { int num = Math.Max(texture.Width >> level, 1); int num2 = Math.Max(texture.Height >> level, 1); Texture2DDescription description = new Texture2DDescription { Width = num, Height = num2, MipLevels = 1, ArraySize = 1, Format = DXGI_FORMAT_B4G4R4A4_UNORM, BindFlags = BindFlags.None, CpuAccessFlags = CpuAccessFlags.Read }; description.SampleDescription.Count = 1; description.SampleDescription.Quality = 0; description.Usage = ResourceUsage.Staging; description.OptionFlags = ResourceOptionFlags.None; DeviceContext context = texture.GraphicsDevice._d3dContext(); using (SharpDX.Direct3D11.Texture2D textured = new SharpDX.Direct3D11.Texture2D(texture.GraphicsDevice._d3dDevice(), description)) { lock (context) { int width; int height; SharpDX.DataStream stream; int sourceSubresource = 0; if (rect.HasValue) { width = rect.Value.Width; height = rect.Value.Height; context.CopySubresourceRegion(texture.GetTexture(), sourceSubresource, new ResourceRegion(rect.Value.Left, rect.Value.Top, 0, rect.Value.Right, rect.Value.Bottom, 1), textured, 0, 0, 0, 0); } else { width = num; height = texture.Height; context.CopySubresourceRegion(texture.GetTexture(), sourceSubresource, null, textured, 0, 0, 0, 0); } SharpDX.DataBox box = context.MapSubresource(textured, 0, MapMode.Read, MapFlags.None, out stream); int num7 = 2 * width; if (num7 == box.RowPitch) { stream.ReadRange <T>(data, startIndex, elementCount); } else { stream.Seek((long)startIndex, SeekOrigin.Begin); int num8 = Marshal.SizeOf(typeof(T)); for (int i = 0; i < height; i++) { int index = (i * num7) / num8; while (index < (((i + 1) * num7) / num8)) { data[index] = stream.Read <T>(); index++; } if (index >= elementCount) { break; } stream.Seek((long)(box.RowPitch - num7), SeekOrigin.Current); } } stream.Dispose(); } } }