Commit 15e7c478 authored by Sam Lantinga's avatar Sam Lantinga

Finished implementing RenderReadPixels()

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%404297
parent d122df1d
...@@ -1206,44 +1206,67 @@ static int ...@@ -1206,44 +1206,67 @@ static int
D3D_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect, D3D_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,
Uint32 format, void * pixels, int pitch) Uint32 format, void * pixels, int pitch)
{ {
BYTE * pBytes; D3D_RenderData *data = (D3D_RenderData *) renderer->driverdata;
D3DLOCKED_RECT lockedRect; SDL_Window *window = SDL_GetWindowFromID(renderer->window);
BYTE b, g, r, a; SDL_VideoDisplay *display = SDL_GetDisplayFromWindow(window);
unsigned long index;
int cur_mouse;
int x, y;
LPDIRECT3DSURFACE9 backBuffer;
LPDIRECT3DSURFACE9 pickOffscreenSurface;
D3DSURFACE_DESC desc; D3DSURFACE_DESC desc;
LPDIRECT3DSURFACE9 backBuffer;
LPDIRECT3DSURFACE9 surface;
RECT d3drect;
D3DLOCKED_RECT locked;
HRESULT result;
result = IDirect3DDevice9_GetBackBuffer(data->device, 0, 0, D3DBACKBUFFER_TYPE_MONO, &backBuffer);
if (FAILED(result)) {
D3D_SetError("GetBackBuffer()", result);
return -1;
}
result = IDirect3DSurface9_GetDesc(backBuffer, &desc);
if (FAILED(result)) {
D3D_SetError("GetDesc()", result);
IDirect3DSurface9_Release(backBuffer);
return -1;
}
D3D_RenderData * data = (D3D_RenderData *) renderer->driverdata; result = IDirect3DDevice9_CreateOffscreenPlainSurface(data->device, desc.Width, desc.Height, desc.Format, D3DPOOL_SYSTEMMEM, &surface, NULL);
if (FAILED(result)) {
IDirect3DDevice9_GetBackBuffer(data->device, 0, 0, D3DBACKBUFFER_TYPE_MONO, &backBuffer); D3D_SetError("CreateOffscreenPlainSurface()", result);
IDirect3DSurface9_Release(backBuffer);
return -1;
IDirect3DSurface9_GetDesc(backBuffer, &desc); }
IDirect3DDevice9_CreateOffscreenPlainSurface(data->device, desc.Width, desc.Height, desc.Format, D3DPOOL_SYSTEMMEM, &pickOffscreenSurface, NULL); result = IDirect3DDevice9_GetRenderTargetData(data->device, backBuffer, surface);
if (FAILED(result)) {
D3D_SetError("GetRenderTargetData()", result);
IDirect3DSurface9_Release(surface);
IDirect3DSurface9_Release(backBuffer);
return -1;
}
IDirect3DDevice9_GetRenderTargetData(data->device, backBuffer, pickOffscreenSurface); d3drect.left = rect->x;
d3drect.right = rect->x + rect->w;
d3drect.top = rect->y;
d3drect.bottom = rect->y + rect->h;
IDirect3DSurface9_LockRect(pickOffscreenSurface, &lockedRect, NULL, D3DLOCK_READONLY); result = IDirect3DSurface9_LockRect(surface, &locked, &d3drect, D3DLOCK_READONLY);
pBytes = (BYTE*)lockedRect.pBits; if (FAILED(result)) {
IDirect3DSurface9_UnlockRect(pickOffscreenSurface); D3D_SetError("LockRect()", result);
IDirect3DSurface9_Release(surface);
IDirect3DSurface9_Release(backBuffer);
return -1;
}
// just to debug --> SDL_ConvertPixels(rect->w, rect->h,
cur_mouse = SDL_SelectMouse(-1); display->current_mode.format, locked.pBits, locked.Pitch,
SDL_GetMouseState(cur_mouse, &x, &y); format, pixels, pitch);
index = (x * 4 + (y * lockedRect.Pitch));
b = pBytes[index]; IDirect3DSurface9_UnlockRect(surface);
g = pBytes[index+1];
r = pBytes[index+2]; IDirect3DSurface9_Release(surface);
a = pBytes[index+3]; IDirect3DSurface9_Release(backBuffer);
// <--
return 0;
return -1;
} }
static int static int
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment