Work in progress on implementation of SDL_RenderReadPixels() and SDL_RenderWritePixels(), code untested.

--HG--
extra : convert_revision : svn%3Ac70aab31-4412-0410-b14c-859654838e24/trunk%404163
This commit is contained in:
Sam Lantinga 2009-11-09 05:20:11 +00:00
parent 15e287332f
commit 0e8fa16511
4 changed files with 203 additions and 0 deletions

View file

@ -72,6 +72,8 @@ static int D3D_RenderLine(SDL_Renderer * renderer, int x1, int y1, int x2,
static int D3D_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect);
static int D3D_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
const SDL_Rect * srcrect, const SDL_Rect * dstrect);
static int D3D_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,
void * pixels, int pitch);
static void D3D_RenderPresent(SDL_Renderer * renderer);
static void D3D_DestroyTexture(SDL_Renderer * renderer,
SDL_Texture * texture);
@ -367,6 +369,7 @@ D3D_CreateRenderer(SDL_Window * window, Uint32 flags)
renderer->RenderLine = D3D_RenderLine;
renderer->RenderFill = D3D_RenderFill;
renderer->RenderCopy = D3D_RenderCopy;
renderer->RenderReadPixels = D3D_RenderReadPixels;
renderer->RenderPresent = D3D_RenderPresent;
renderer->DestroyTexture = D3D_DestroyTexture;
renderer->DestroyRenderer = D3D_DestroyRenderer;
@ -1145,6 +1148,50 @@ D3D_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture,
return 0;
}
static int
D3D_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect,
void * pixels, int pitch)
{
BYTE * pBytes;
D3DLOCKED_RECT lockedRect;
BYTE b, g, r, a;
unsigned long index;
int cur_mouse;
int x, y;
LPDIRECT3DSURFACE9 backBuffer;
LPDIRECT3DSURFACE9 pickOffscreenSurface;
D3DSURFACE_DESC desc;
D3D_RenderData * data = (D3D_RenderData *) renderer->driverdata;
IDirect3DDevice9_GetBackBuffer(data->device, 0, 0, D3DBACKBUFFER_TYPE_MONO, &backBuffer);
IDirect3DSurface9_GetDesc(backBuffer, &desc);
IDirect3DDevice9_CreateOffscreenPlainSurface(data->device, desc.Width, desc.Height, desc.Format, D3DPOOL_SYSTEMMEM, &pickOffscreenSurface, NULL);
IDirect3DDevice9_GetRenderTargetData(data->device, backBuffer, pickOffscreenSurface);
IDirect3DSurface9_LockRect(pickOffscreenSurface, &lockedRect, NULL, D3DLOCK_READONLY);
pBytes = (BYTE*)lockedRect.pBits;
IDirect3DSurface9_UnlockRect(pickOffscreenSurface);
// just to debug -->
cur_mouse = SDL_SelectMouse(-1);
SDL_GetMouseState(cur_mouse, &x, &y);
index = (x * 4 + (y * lockedRect.Pitch));
b = pBytes[index];
g = pBytes[index+1];
r = pBytes[index+2];
a = pBytes[index+3];
// <--
return -1;
}
static void
D3D_RenderPresent(SDL_Renderer * renderer)
{