Mercurial > sdl-ios-xcode
view src/video/win32/SDL_ceddrawrender.c @ 4426:1bceff8f008f
Fixed bug #943
Ozkan Sezer 2010-02-06 12:31:06 PST
Hi:
Here are some small fixes for compiling SDL against mingw-w64.
(see http://mingw-w64.sourceforge.net/ . Despite the name, it
supports both win32 and win64.)
src/audio/windx5/directx.h and src/video/windx5/directx.h (both
SDL-1.2 and SDL-1.3.) I get compilation errors about some union
not having a member named u1 and alike, because of other system
headers being included before this one and them already defining
DUMMYUNIONNAME and stuff. This header probably assumes that those
stuff are defined in windef.h, but mingw-w64 headers define them
in _mingw.h. Easily fixed by moving NONAMELESSUNION definition to
the top of the file.
src/thread/win32/SDL_systhread.c (both SDL-1.2 and SDL-1.3.) :
The __GNUC__ case for pfnSDL_CurrentBeginThread is 32-bit centric
because _beginthreadex returns uintptr_t, not unsigned long which
is 32 bits in win64. Changing the return type to uintptr_t fixes
it.
video/SDL_blit.h (and configure.in) (SDL-1.3-only) : MinGW-w64
uses msvcrt version of _aligned_malloc and _aligned_free and
they are defined in intrin.h (similar to VC). Adding proper
ifdefs fixes it. (Notes about macros to check: __MINGW32__ is
defined for both mingw.org and for mingw-w64 for both win32 and
win64, __MINGW64__ is only defined for _WIN64, so __MINGW64__
can't be used to detect mingw-w64: including _mingw.h and then
checking for __MINGW64_VERSION_MAJOR does the trick.)
SDL_win32video.h (SDL-1.3-only) : Tweaked the VINWER definition
and location in order to avoid multiple redefinition warnings.
Hope these are useful. Thanks.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Wed, 10 Mar 2010 15:02:58 +0000 |
parents | f7b03b6838cb |
children | e1664f94f026 |
line wrap: on
line source
/* SDL - Simple DirectMedia Layer Copyright (C) 1997-2010 Sam Lantinga This library is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with this library; if not, write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA Sam Lantinga slouken@libsdl.org Stefan Klug klug.stefan@gmx.de */ #include "SDL_config.h" #if SDL_VIDEO_RENDER_DDRAW #include "SDL_win32video.h" #include "../SDL_yuv_sw_c.h" #if 0 #define DDRAW_LOG(...) printf(__VA_ARGS__) #else #define DDRAW_LOG(...) #endif /* DirectDraw renderer implementation */ static SDL_Renderer *DDRAW_CreateRenderer(SDL_Window * window, Uint32 flags); static int DDRAW_DisplayModeChanged(SDL_Renderer * renderer); static int DDRAW_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture); static int DDRAW_QueryTexturePixels(SDL_Renderer * renderer, SDL_Texture * texture, void **pixels, int *pitch); static int DDRAW_SetTextureColorMod(SDL_Renderer * renderer, SDL_Texture * texture); static int DDRAW_SetTextureAlphaMod(SDL_Renderer * renderer, SDL_Texture * texture); static int DDRAW_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture); static int DDRAW_SetTextureScaleMode(SDL_Renderer * renderer, SDL_Texture * texture); static int DDRAW_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * rect, const void *pixels, int pitch); static int DDRAW_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * rect, int markDirty, void **pixels, int *pitch); static void DDRAW_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture); static void DDRAW_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture, int numrects, const SDL_Rect * rects); static int DDRAW_RenderPoint(SDL_Renderer * renderer, int x, int y); static int DDRAW_RenderLine(SDL_Renderer * renderer, int x1, int y1, int x2, int y2); static int DDRAW_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect); static int DDRAW_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * srcrect, const SDL_Rect * dstrect); static void DDRAW_RenderPresent(SDL_Renderer * renderer); static void DDRAW_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture); static void DDRAW_DestroyRenderer(SDL_Renderer * renderer); SDL_RenderDriver DDRAW_RenderDriver = { DDRAW_CreateRenderer, { "ddraw", (SDL_RENDERER_SINGLEBUFFER | SDL_RENDERER_PRESENTCOPY | SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTFLIP3 | SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_ACCELERATED), (SDL_TEXTUREMODULATE_NONE), (SDL_BLENDMODE_NONE), (SDL_TEXTURESCALEMODE_NONE), 0, {0}, 0, 0} }; typedef struct { IDirectDraw *ddraw; IDirectDrawSurface *primary; } DDRAW_RenderData; typedef struct { RECT lock; IDirectDrawSurface *surface; } DDRAW_TextureData; static void DDRAW_SetError(const char *prefix, HRESULT result) { const char *error; switch (result) { case DDERR_CANTCREATEDC: error = "CANTCREATEDC"; break; case DDERR_CANTLOCKSURFACE: error = "CANTLOCKSURFACE"; break; case DDERR_CLIPPERISUSINGHWND: error = "CLIPPERISUSINGHWND"; break; case DDERR_COLORKEYNOTSET: error = "COLORKEYNOTSET"; break; case DDERR_CURRENTLYNOTAVAIL: error = "CURRENTLYNOTAVAIL"; break; case DDERR_DCALREADYCREATED: error = "DCALREADYCREATED"; break; case DDERR_DEVICEDOESNTOWNSURFACE: error = "DEVICEDOESNTOWNSURFACE"; break; case DDERR_DIRECTDRAWALREADYCREATED: error = "DIRECTDRAWALREADYCREATED"; break; case DDERR_EXCLUSIVEMODEALREADYSET: error = "EXCLUSIVEMODEALREADYSET"; break; case DDERR_GENERIC: error = "GENERIC"; break; case DDERR_HEIGHTALIGN: error = "HEIGHTALIGN"; break; case DDERR_IMPLICITLYCREATED: error = "IMPLICITLYCREATED"; break; case DDERR_INCOMPATIBLEPRIMARY: error = "INCOMPATIBLEPRIMARY"; break; case DDERR_INVALIDCAPS: error = "INVALIDCAPS"; break; case DDERR_INVALIDCLIPLIST: error = "INVALIDCLIPLIST"; break; case DDERR_INVALIDMODE: error = "INVALIDMODE"; break; case DDERR_INVALIDOBJECT: error = "INVALIDOBJECT"; break; case DDERR_INVALIDPARAMS: error = "INVALIDPARAMS"; break; case DDERR_INVALIDPIXELFORMAT: error = "INVALIDPIXELFORMAT"; break; case DDERR_INVALIDPOSITION: error = "INVALIDPOSITION"; break; case DDERR_INVALIDRECT: error = "INVALIDRECT"; break; case DDERR_LOCKEDSURFACES: error = "LOCKEDSURFACES"; break; case DDERR_MOREDATA: error = "MOREDATA"; break; case DDERR_NOALPHAHW: error = "NOALPHAHW"; break; case DDERR_NOBLTHW: error = "NOBLTHW"; break; case DDERR_NOCLIPLIST: error = "NOCLIPLIST"; break; case DDERR_NOCLIPPERATTACHED: error = "NOCLIPPERATTACHED"; break; case DDERR_NOCOLORCONVHW: error = "NOCOLORCONVHW"; break; case DDERR_NOCOLORKEYHW: error = "NOCOLORKEYHW"; break; case DDERR_NOCOOPERATIVELEVELSET: error = "NOCOOPERATIVELEVELSET"; break; case DDERR_NODC: error = "NODC"; break; case DDERR_NOFLIPHW: error = "NOFLIPHW"; break; case DDERR_NOOVERLAYDEST: error = "NOOVERLAYDEST"; break; case DDERR_NOOVERLAYHW: error = "NOOVERLAYHW"; break; case DDERR_NOPALETTEATTACHED: error = "NOPALETTEATTACHED"; break; case DDERR_NOPALETTEHW: error = "NOPALETTEHW"; break; case DDERR_NORASTEROPHW: error = "NORASTEROPHW"; break; case DDERR_NOSTRETCHHW: error = "NOSTRETCHHW"; break; case DDERR_NOTAOVERLAYSURFACE: error = "NOTAOVERLAYSURFACE"; break; case DDERR_NOTFLIPPABLE: error = "NOTFLIPPABLE"; break; case DDERR_NOTFOUND: error = "NOTFOUND"; break; case DDERR_NOTLOCKED: error = "NOTLOCKED"; break; case DDERR_NOTPALETTIZED: error = "NOTPALETTIZED"; break; case DDERR_NOVSYNCHW: error = "NOVSYNCHW"; break; case DDERR_NOZOVERLAYHW: error = "NOZOVERLAYHW"; break; case DDERR_OUTOFCAPS: error = "OUTOFCAPS"; break; case DDERR_OUTOFMEMORY: error = "OUTOFMEMORY"; break; case DDERR_OUTOFVIDEOMEMORY: error = "OUTOFVIDEOMEMORY"; break; case DDERR_OVERLAPPINGRECTS: error = "OVERLAPPINGRECTS"; break; case DDERR_OVERLAYNOTVISIBLE: error = "OVERLAYNOTVISIBLE"; break; case DDERR_PALETTEBUSY: error = "PALETTEBUSY"; break; case DDERR_PRIMARYSURFACEALREADYEXISTS: error = "PRIMARYSURFACEALREADYEXISTS"; break; case DDERR_REGIONTOOSMALL: error = "REGIONTOOSMALL"; break; case DDERR_SURFACEBUSY: error = "SURFACEBUSY"; break; case DDERR_SURFACELOST: error = "SURFACELOST"; break; case DDERR_TOOBIGHEIGHT: error = "TOOBIGHEIGHT"; break; case DDERR_TOOBIGSIZE: error = "TOOBIGSIZE"; break; case DDERR_TOOBIGWIDTH: error = "TOOBIGWIDTH"; break; case DDERR_UNSUPPORTED: error = "UNSUPPORTED"; break; case DDERR_UNSUPPORTEDFORMAT: error = "UNSUPPORTEDFORMAT"; break; case DDERR_VERTICALBLANKINPROGRESS: error = "VERTICALBLANKINPROGRESS"; break; case DDERR_VIDEONOTACTIVE: error = "VIDEONOTACTIVE"; break; case DDERR_WASSTILLDRAWING: error = "WASSTILLDRAWING"; break; case DDERR_WRONGMODE: error = "WRONGMODE"; break; default: error = "UNKNOWN"; break; } SDL_SetError("%s: %s", prefix, error); } static SDL_bool PixelFormatToDDPIXELFORMAT(Uint32 format, LPDDPIXELFORMAT dst) { SDL_zerop(dst); dst->dwSize = sizeof(*dst); if (SDL_ISPIXELFORMAT_FOURCC(format)) { dst->dwFlags = DDPF_FOURCC; dst->dwFourCC = format; } else if (SDL_ISPIXELFORMAT_INDEXED(format)) { SDL_SetError("Indexed pixelformats are not supported."); return SDL_FALSE; } else { int bpp; Uint32 Rmask, Gmask, Bmask, Amask; if (!SDL_PixelFormatEnumToMasks (format, &bpp, &Rmask, &Gmask, &Bmask, &Amask)) { SDL_SetError("pixelformat not supported"); return SDL_FALSE; } if (!Rmask && !Gmask && !Bmask) { dst->dwFlags = DDPF_ALPHA; dst->dwAlphaBitDepth = bpp; } else { dst->dwFlags = DDPF_RGB; dst->dwRGBBitCount = bpp; dst->dwRBitMask = Rmask; dst->dwGBitMask = Gmask; dst->dwBBitMask = Bmask; if (Amask) { dst->dwFlags |= DDPF_ALPHAPIXELS; dst->dwRGBAlphaBitMask = Amask; } } } return SDL_TRUE; } static SDL_bool DDRAW_IsTextureFormatAvailable(IDirectDraw * ddraw, Uint32 display_format, Uint32 texture_format) { int bpp; Uint32 Rmask, Gmask, Bmask, Amask; if (SDL_ISPIXELFORMAT_FOURCC(texture_format)) { //TODO I don't expect DDRAW to support all 4CC formats, but I don't know which ones return SDL_TRUE; } //These are only basic checks if (SDL_ISPIXELFORMAT_INDEXED(texture_format)) { return SDL_FALSE; } if (!SDL_PixelFormatEnumToMasks (texture_format, &bpp, &Rmask, &Gmask, &Bmask, &Amask)) { return SDL_FALSE; } switch (bpp) { case 4: case 8: case 16: case 24: case 32: break; default: return SDL_FALSE; } return SDL_TRUE; } void DDRAW_AddRenderDriver(_THIS) { SDL_VideoData *data = (SDL_VideoData *) _this->driverdata; SDL_RendererInfo *info = &DDRAW_RenderDriver.info; SDL_DisplayMode *mode = &SDL_CurrentDisplay->desktop_mode; if (data->ddraw) { int i; int formats[] = { SDL_PIXELFORMAT_INDEX8, SDL_PIXELFORMAT_RGB332, SDL_PIXELFORMAT_RGB444, SDL_PIXELFORMAT_RGB555, SDL_PIXELFORMAT_ARGB4444, SDL_PIXELFORMAT_ARGB1555, SDL_PIXELFORMAT_RGB565, SDL_PIXELFORMAT_RGB888, SDL_PIXELFORMAT_ARGB8888, SDL_PIXELFORMAT_ARGB2101010, }; for (i = 0; i < SDL_arraysize(formats); ++i) { if (DDRAW_IsTextureFormatAvailable (data->ddraw, mode->format, formats[i])) { info->texture_formats[info->num_texture_formats++] = formats[i]; } } //TODO the fourcc formats should get fetched from IDirectDraw::GetFourCCCodes info->texture_formats[info->num_texture_formats++] = SDL_PIXELFORMAT_YV12; info->texture_formats[info->num_texture_formats++] = SDL_PIXELFORMAT_IYUV; info->texture_formats[info->num_texture_formats++] = SDL_PIXELFORMAT_YUY2; info->texture_formats[info->num_texture_formats++] = SDL_PIXELFORMAT_UYVY; info->texture_formats[info->num_texture_formats++] = SDL_PIXELFORMAT_YVYU; for (i = 0; i < _this->num_displays; ++i) SDL_AddRenderDriver(&_this->displays[i], &DDRAW_RenderDriver); } } } SDL_Renderer * DDRAW_CreateRenderer(SDL_Window * window, Uint32 flags) { SDL_VideoDisplay *display = window->display; SDL_VideoData *videodata = (SDL_VideoData *) display->device->driverdata; SDL_WindowData *windowdata = (SDL_WindowData *) window->driverdata; SDL_Renderer *renderer; DDRAW_RenderData *data; HRESULT result; DDSURFACEDESC ddsd; renderer = (SDL_Renderer *) SDL_calloc(1, sizeof(*renderer)); if (!renderer) { SDL_OutOfMemory(); return NULL; } data = (DDRAW_RenderData *) SDL_calloc(1, sizeof(*data)); if (!data) { DDRAW_DestroyRenderer(renderer); SDL_OutOfMemory(); return NULL; } data->ddraw = videodata->ddraw; renderer->DisplayModeChanged = DDRAW_DisplayModeChanged; renderer->CreateTexture = DDRAW_CreateTexture; renderer->QueryTexturePixels = DDRAW_QueryTexturePixels; renderer->SetTextureColorMod = DDRAW_SetTextureColorMod; renderer->SetTextureAlphaMod = DDRAW_SetTextureAlphaMod; renderer->SetTextureBlendMode = DDRAW_SetTextureBlendMode; renderer->SetTextureScaleMode = DDRAW_SetTextureScaleMode; renderer->UpdateTexture = DDRAW_UpdateTexture; renderer->LockTexture = DDRAW_LockTexture; renderer->UnlockTexture = DDRAW_UnlockTexture; renderer->DirtyTexture = DDRAW_DirtyTexture; renderer->RenderPoint = DDRAW_RenderPoint; renderer->RenderLine = DDRAW_RenderLine; renderer->RenderFill = DDRAW_RenderFill; renderer->RenderCopy = DDRAW_RenderCopy; renderer->RenderPresent = DDRAW_RenderPresent; renderer->DestroyTexture = DDRAW_DestroyTexture; renderer->DestroyRenderer = DDRAW_DestroyRenderer; renderer->info = DDRAW_RenderDriver.info; renderer->window = window; renderer->driverdata = data; renderer->info.flags = SDL_RENDERER_ACCELERATED; SDL_zero(ddsd); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_CAPS; if (window->flags & SDL_WINDOW_FULLSCREEN) { ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; } else { //TODO handle non fullscreen SDL_SetError("DirectDraw renderer has only fullscreen implemented"); DDRAW_DestroyRenderer(renderer); return NULL; } if (flags & SDL_RENDERER_PRESENTFLIP2) { ddsd.dwFlags |= DDSD_BACKBUFFERCOUNT; ddsd.dwBackBufferCount = 2; } else if (flags & SDL_RENDERER_PRESENTFLIP3) { ddsd.dwFlags |= DDSD_BACKBUFFERCOUNT; ddsd.dwBackBufferCount = 3; } else if (flags & SDL_RENDERER_PRESENTCOPY) { //TODO what is the best approximation to this mode } else { } if (flags & SDL_RENDERER_PRESENTVSYNC) { SDL_SetError("DirectDraw renderer with v-sync is not implemented"); DDRAW_DestroyRenderer(renderer); return NULL; } result = data->ddraw->lpVtbl->SetCooperativeLevel(data->ddraw, windowdata->hwnd, DDSCL_NORMAL); if (result != DD_OK) { DDRAW_SetError("CreateDevice()", result); DDRAW_DestroyRenderer(renderer); return NULL; } result = data->ddraw->lpVtbl->CreateSurface(data->ddraw, &ddsd, &data->primary, NULL); if (result != DD_OK) { DDRAW_SetError("CreateDevice()", result); DDRAW_DestroyRenderer(renderer); return NULL; } return renderer; } static int DDRAW_Reset(SDL_Renderer * renderer) { //TODO implement /*D3D_RenderData *data = (D3D_RenderData *) renderer->driverdata; HRESULT result; result = IDirect3DDevice9_Reset(data->device, &data->pparams); if (FAILED(result)) { if (result == D3DERR_DEVICELOST) { /* Don't worry about it, we'll reset later... * return 0; } else { D3D_SetError("Reset()", result); return -1; } } IDirect3DDevice9_SetVertexShader(data->device, NULL); IDirect3DDevice9_SetFVF(data->device, D3DFVF_XYZRHW | D3DFVF_DIFFUSE | D3DFVF_TEX1); IDirect3DDevice9_SetRenderState(data->device, D3DRS_CULLMODE, D3DCULL_NONE); IDirect3DDevice9_SetRenderState(data->device, D3DRS_LIGHTING, FALSE); */ return 0; } static int DDRAW_DisplayModeChanged(SDL_Renderer * renderer) { //TODO implement /*D3D_RenderData *data = (D3D_RenderData *) renderer->driverdata; SDL_Window *window = renderer->window; SDL_VideoDisplay *display = window->display; data->pparams.BackBufferWidth = window->w; data->pparams.BackBufferHeight = window->h; if (window->flags & SDL_WINDOW_FULLSCREEN) { data->pparams.BackBufferFormat = PixelFormatToD3DFMT(display->fullscreen_mode.format); } else { data->pparams.BackBufferFormat = D3DFMT_UNKNOWN; } return D3D_Reset(renderer); */ return 0; } static int DDRAW_CreateTexture(SDL_Renderer * renderer, SDL_Texture * texture) { DDRAW_RenderData *renderdata = (DDRAW_RenderData *) renderer->driverdata; SDL_Window *window = renderer->window; SDL_VideoDisplay *display = window->display; Uint32 display_format = display->current_mode.format; DDRAW_TextureData *data; DDSURFACEDESC ddsd; HRESULT result; data = (DDRAW_TextureData *) SDL_calloc(1, sizeof(*data)); if (!data) { SDL_OutOfMemory(); return -1; } SDL_zero(ddsd); ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_PIXELFORMAT | DDSD_HEIGHT | DDSD_WIDTH; ddsd.dwWidth = texture->w; ddsd.dwHeight = texture->h; if (!PixelFormatToDDPIXELFORMAT(texture->format, &ddsd.ddpfPixelFormat)) { SDL_free(data); return -1; } texture->driverdata = data; result = renderdata->ddraw->lpVtbl->CreateSurface(renderdata->ddraw, &ddsd, &data->surface, NULL); if (result != DD_OK) { SDL_free(data); DDRAW_SetError("CreateTexture", result); return -1; } return 0; } static int DDRAW_QueryTexturePixels(SDL_Renderer * renderer, SDL_Texture * texture, void **pixels, int *pitch) { //TODO implement SDL_SetError("QueryTexturePixels is not implemented"); return -1; } static int DDRAW_SetTextureColorMod(SDL_Renderer * renderer, SDL_Texture * texture) { return 0; } static int DDRAW_SetTextureAlphaMod(SDL_Renderer * renderer, SDL_Texture * texture) { return 0; } static int DDRAW_SetTextureBlendMode(SDL_Renderer * renderer, SDL_Texture * texture) { switch (texture->blendMode) { case SDL_BLENDMODE_NONE: return 0; default: SDL_Unsupported(); texture->blendMode = SDL_BLENDMODE_NONE; return -1; } } static int DDRAW_SetTextureScaleMode(SDL_Renderer * renderer, SDL_Texture * texture) { switch (texture->scaleMode) { case SDL_TEXTURESCALEMODE_NONE: default: SDL_Unsupported(); texture->scaleMode = SDL_TEXTURESCALEMODE_NONE; return -1; } return 0; } static int DDRAW_UpdateTexture(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * rect, const void *pixels, int pitch) { DDRAW_TextureData *data = (DDRAW_TextureData *) texture->driverdata; //TODO implement SDL_SetError("UpdateTexture is not implemented"); return 0; } static int DDRAW_LockTexture(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * rect, int markDirty, void **pixels, int *pitch) { DDRAW_TextureData *data = (DDRAW_TextureData *) texture->driverdata; HRESULT result; DDSURFACEDESC ddsd; SDL_zero(ddsd); ddsd.dwSize = sizeof(ddsd); /** * On a Axim x51v locking a subrect returns the startaddress of the whole surface, * wheras on my ASUS MyPal 696 the startaddress of the locked area is returned, * thats why I always lock the whole surface and calculate the pixels pointer by hand. * This shouldn't be a speed problem, as multiple locks aren't available on DDraw Mobile * see http://msdn.microsoft.com/en-us/library/ms858221.aspx */ result = data->surface->lpVtbl->Lock(data->surface, NULL, &ddsd, 0, NULL); if (result != DD_OK) { DDRAW_SetError("LockRect()", result); return -1; } *pixels = ddsd.lpSurface + rect->y * ddsd.lPitch + rect->x * ddsd.lXPitch; *pitch = ddsd.lPitch; return 0; } static void DDRAW_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture) { DDRAW_TextureData *data = (DDRAW_TextureData *) texture->driverdata; data->surface->lpVtbl->Unlock(data->surface, NULL); } static void DDRAW_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture, int numrects, const SDL_Rect * rects) { } static void DDRAW_SetBlendMode(DDRAW_RenderData * data, int blendMode) { switch (blendMode) { } } static int DDRAW_RenderPoint(SDL_Renderer * renderer, int x, int y) { return -1; } static int DDRAW_RenderLine(SDL_Renderer * renderer, int x1, int y1, int x2, int y2) { return -1; } static int DDRAW_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect) { return -1; } static int DDRAW_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * srcrect, const SDL_Rect * dstrect) { DDRAW_RenderData *data = (DDRAW_RenderData *) renderer->driverdata; DDRAW_TextureData *texturedata = (DDRAW_TextureData *) texture->driverdata; HRESULT result; RECT srcr; RECT dstr; DDBLTFX bltfx; srcr.left = srcrect->x; srcr.top = srcrect->y; srcr.right = srcrect->x + srcrect->w; srcr.bottom = srcrect->y + srcrect->h; dstr.left = dstrect->x; dstr.top = dstrect->y; dstr.right = dstrect->x + dstrect->w; dstr.bottom = dstrect->y + dstrect->h; SDL_zero(bltfx); bltfx.dwSize = sizeof(bltfx); bltfx.dwROP = SRCCOPY; data->primary->lpVtbl->Blt(data->primary, &dstr, texturedata->surface, &srcr, DDBLT_ROP, &bltfx); return 0; } static void DDRAW_RenderPresent(SDL_Renderer * renderer) { DDRAW_RenderData *data = (DDRAW_RenderData *) renderer->driverdata; HRESULT result; return; result = data->primary->lpVtbl->Flip(data->primary, NULL, DDFLIP_INTERVAL1); if (result != DD_OK) { DDRAW_SetError("Present()", result); } } static void DDRAW_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture) { DDRAW_TextureData *data = (DDRAW_TextureData *) texture->driverdata; if (!data) { return; } data->surface->lpVtbl->Release(data->surface); SDL_free(data); texture->driverdata = NULL; } static void DDRAW_DestroyRenderer(SDL_Renderer * renderer) { DDRAW_RenderData *data = (DDRAW_RenderData *) renderer->driverdata; if (data) { data->primary->lpVtbl->Release(data->primary); SDL_free(data); } SDL_free(renderer); } #endif /* SDL_VIDEO_RENDER_DDRAW */ /* vi: set ts=4 sw=4 expandtab: */