Mercurial > sdl-ios-xcode
diff src/video/win32/SDL_gdirender.c @ 1907:06c27a737b7a
Streamlined the API a bit and optimized the software renderer.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Sat, 15 Jul 2006 09:46:36 +0000 |
parents | 36d52b1f0504 |
children | 83420da906a5 |
line wrap: on
line diff
--- a/src/video/win32/SDL_gdirender.c Fri Jul 14 08:24:43 2006 +0000 +++ b/src/video/win32/SDL_gdirender.c Sat Jul 15 09:46:36 2006 +0000 @@ -55,20 +55,12 @@ static void SDL_GDI_DirtyTexture(SDL_Renderer * renderer, SDL_Texture * texture, int numrects, const SDL_Rect * rects); -static void SDL_GDI_SelectRenderTexture(SDL_Renderer * renderer, - SDL_Texture * texture); static int SDL_GDI_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect, Uint32 color); static int SDL_GDI_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * srcrect, const SDL_Rect * dstrect, int blendMode, int scaleMode); -static int SDL_GDI_RenderReadPixels(SDL_Renderer * renderer, - const SDL_Rect * rect, void *pixels, - int pitch); -static int SDL_GDI_RenderWritePixels(SDL_Renderer * renderer, - const SDL_Rect * rect, - const void *pixels, int pitch); static void SDL_GDI_RenderPresent(SDL_Renderer * renderer); static void SDL_GDI_DestroyTexture(SDL_Renderer * renderer, SDL_Texture * texture); @@ -81,7 +73,7 @@ "gdi", (SDL_Renderer_SingleBuffer | SDL_Renderer_PresentCopy | SDL_Renderer_PresentFlip2 | SDL_Renderer_PresentFlip3 | - SDL_Renderer_PresentDiscard | SDL_Renderer_RenderTarget), + SDL_Renderer_PresentDiscard), (SDL_TextureBlendMode_None | SDL_TextureBlendMode_Mask | SDL_TextureBlendMode_Blend), (SDL_TextureScaleMode_None | SDL_TextureScaleMode_Fast), @@ -114,9 +106,6 @@ int current_hbm; SDL_DirtyRectList dirty; SDL_bool makedirty; - HBITMAP window_dib; - void *window_pixels; - int window_pitch; } SDL_GDI_RenderData; typedef struct @@ -182,11 +171,8 @@ renderer->LockTexture = SDL_GDI_LockTexture; renderer->UnlockTexture = SDL_GDI_UnlockTexture; renderer->DirtyTexture = SDL_GDI_DirtyTexture; - renderer->SelectRenderTexture = SDL_GDI_SelectRenderTexture; renderer->RenderFill = SDL_GDI_RenderFill; renderer->RenderCopy = SDL_GDI_RenderCopy; - renderer->RenderReadPixels = SDL_GDI_RenderReadPixels; - renderer->RenderWritePixels = SDL_GDI_RenderWritePixels; renderer->RenderPresent = SDL_GDI_RenderPresent; renderer->DestroyTexture = SDL_GDI_DestroyTexture; renderer->DestroyRenderer = SDL_GDI_DestroyRenderer; @@ -194,7 +180,7 @@ renderer->window = window->id; renderer->driverdata = data; - renderer->info.flags = SDL_Renderer_RenderTarget; + renderer->info.flags = SDL_Renderer_Accelerated; data->hwnd = windowdata->hwnd; data->window_hdc = GetDC(data->hwnd); @@ -218,7 +204,8 @@ DeleteObject(hbm); if (flags & SDL_Renderer_SingleBuffer) { - renderer->info.flags |= SDL_Renderer_SingleBuffer; + renderer->info.flags |= + (SDL_Renderer_SingleBuffer | SDL_Renderer_PresentCopy); n = 0; } else if (flags & SDL_Renderer_PresentFlip2) { renderer->info.flags |= SDL_Renderer_PresentFlip2; @@ -271,10 +258,6 @@ texture->driverdata = data; if (SDL_ISPIXELFORMAT_FOURCC(texture->format)) { - if (texture->access == SDL_TextureAccess_Render) { - SDL_SetError("Rendering to YUV format textures is not supported"); - return -1; - } data->yuv = SDL_SW_CreateYUVTexture(texture); if (!data->yuv) { SDL_GDI_DestroyTexture(renderer, texture); @@ -521,31 +504,6 @@ { } -static void -SDL_GDI_SelectRenderTexture(SDL_Renderer * renderer, SDL_Texture * texture) -{ - SDL_GDI_RenderData *data = (SDL_GDI_RenderData *) renderer->driverdata; - - if (texture) { - SDL_GDI_TextureData *texturedata = - (SDL_GDI_TextureData *) texture->driverdata; - SelectObject(data->render_hdc, texturedata->hbm); - if (texturedata->hpal) { - SelectPalette(data->render_hdc, texturedata->hpal, TRUE); - RealizePalette(data->render_hdc); - } - data->current_hdc = data->render_hdc; - data->makedirty = SDL_FALSE; - } else if (renderer->info.flags & SDL_Renderer_SingleBuffer) { - data->current_hdc = data->window_hdc; - data->makedirty = SDL_FALSE; - } else { - SelectObject(data->render_hdc, data->hbm[data->current_hbm]); - data->current_hdc = data->render_hdc; - data->makedirty = SDL_TRUE; - } -} - static int SDL_GDI_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect, Uint32 color) @@ -637,98 +595,6 @@ return 0; } -static int -CreateWindowDIB(SDL_GDI_RenderData * data, SDL_Window * window) -{ - data->window_pitch = window->w * (data->bmi->bmiHeader.biBitCount / 8); - data->bmi->bmiHeader.biWidth = window->w; - data->bmi->bmiHeader.biHeight = -window->h; - data->bmi->bmiHeader.biSizeImage = - window->h * (data->bmi->bmiHeader.biBitCount / 8); - data->window_dib = - CreateDIBSection(data->window_hdc, data->bmi, DIB_RGB_COLORS, - &data->window_pixels, NULL, 0); - if (!data->window_dib) { - WIN_SetError("CreateDIBSection()"); - return -1; - } - return 0; -} - -static int -SDL_GDI_RenderReadPixels(SDL_Renderer * renderer, const SDL_Rect * rect, - void *pixels, int pitch) -{ - SDL_Window *window = SDL_GetWindowFromID(renderer->window); - SDL_GDI_RenderData *data = (SDL_GDI_RenderData *) renderer->driverdata; - - if (!data->window_dib) { - if (CreateWindowDIB(data, window) < 0) { - return -1; - } - } - - SelectObject(data->memory_hdc, data->window_dib); - BitBlt(data->memory_hdc, rect->x, rect->y, rect->w, rect->h, - data->current_hdc, rect->x, rect->y, SRCCOPY); - - { - int bpp = data->bmi->bmiHeader.biBitCount / 8; - Uint8 *src = - (Uint8 *) data->window_pixels + rect->y * data->window_pitch + - rect->x * bpp; - Uint8 *dst = (Uint8 *) pixels; - int row; - - for (row = 0; row < rect->h; ++row) { - SDL_memcpy(dst, src, rect->w * bpp); - src += data->window_pitch; - dst += pitch; - } - } - - return 0; -} - -static int -SDL_GDI_RenderWritePixels(SDL_Renderer * renderer, const SDL_Rect * rect, - const void *pixels, int pitch) -{ - SDL_Window *window = SDL_GetWindowFromID(renderer->window); - SDL_GDI_RenderData *data = (SDL_GDI_RenderData *) renderer->driverdata; - - if (data->makedirty) { - SDL_AddDirtyRect(&data->dirty, rect); - } - - if (!data->window_dib) { - if (CreateWindowDIB(data, window) < 0) { - return -1; - } - } - - { - int bpp = data->bmi->bmiHeader.biBitCount / 8; - Uint8 *src = (Uint8 *) pixels; - Uint8 *dst = - (Uint8 *) data->window_pixels + rect->y * data->window_pitch + - rect->x * bpp; - int row; - - for (row = 0; row < rect->h; ++row) { - SDL_memcpy(dst, src, rect->w * bpp); - src += pitch; - dst += data->window_pitch; - } - } - - SelectObject(data->memory_hdc, data->window_dib); - BitBlt(data->current_hdc, rect->x, rect->y, rect->w, rect->h, - data->memory_hdc, rect->x, rect->y, SRCCOPY); - - return 0; -} - static void SDL_GDI_RenderPresent(SDL_Renderer * renderer) { @@ -795,9 +661,6 @@ } } SDL_FreeDirtyRects(&data->dirty); - if (data->window_dib) { - DeleteObject(data->window_dib); - } SDL_free(data); } SDL_free(renderer);