# HG changeset patch # User Sam Lantinga # Date 1230611919 0 # Node ID 27f2b5e7e8991f96af66a924068bb01717294d05 # Parent 7e21f766220819d90b877b6c0b1c7384eac028e0 In theory this implements GDI rendering, but it doesn't work for some reason. Also removed blending support from the advertised interface, since it's not actually supported. diff -r 7e21f7662208 -r 27f2b5e7e899 src/video/win32/SDL_gdirender.c --- a/src/video/win32/SDL_gdirender.c Tue Dec 30 04:22:24 2008 +0000 +++ b/src/video/win32/SDL_gdirender.c Tue Dec 30 04:38:39 2008 +0000 @@ -55,6 +55,9 @@ const SDL_Rect * rect, int markDirty, void **pixels, int *pitch); static void GDI_UnlockTexture(SDL_Renderer * renderer, SDL_Texture * texture); +static int GDI_RenderPoint(SDL_Renderer * renderer, int x, int y); +static int GDI_RenderLine(SDL_Renderer * renderer, int x1, int y1, int x2, + int y2); static int GDI_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect); static int GDI_RenderCopy(SDL_Renderer * renderer, SDL_Texture * texture, const SDL_Rect * srcrect, const SDL_Rect * dstrect); @@ -72,7 +75,7 @@ SDL_RENDERER_PRESENTFLIP2 | SDL_RENDERER_PRESENTFLIP3 | SDL_RENDERER_PRESENTDISCARD | SDL_RENDERER_ACCELERATED), (SDL_TEXTUREMODULATE_NONE | SDL_TEXTUREMODULATE_ALPHA), - (SDL_BLENDMODE_NONE | SDL_BLENDMODE_MASK | SDL_BLENDMODE_BLEND), + (SDL_BLENDMODE_NONE | SDL_BLENDMODE_MASK), (SDL_TEXTURESCALEMODE_NONE | SDL_TEXTURESCALEMODE_FAST), 14, { @@ -172,6 +175,8 @@ renderer->UpdateTexture = GDI_UpdateTexture; renderer->LockTexture = GDI_LockTexture; renderer->UnlockTexture = GDI_UnlockTexture; + renderer->RenderPoint = GDI_RenderPoint; + renderer->RenderLine = GDI_RenderLine; renderer->RenderFill = GDI_RenderFill; renderer->RenderCopy = GDI_RenderCopy; renderer->RenderPresent = GDI_RenderPresent; @@ -569,6 +574,71 @@ } static int +GDI_RenderPoint(SDL_Renderer * renderer, int x, int y) +{ + GDI_RenderData *data = (GDI_RenderData *) renderer->driverdata; + + if (data->makedirty) { + SDL_Rect rect; + + rect.x = x; + rect.y = y; + rect.w = 1; + rect.h = 1; + + SDL_AddDirtyRect(&data->dirty, &rect); + } + + SetPixel(data->current_hdc, x, y, RGB(renderer->r, renderer->g, renderer->b)); + return 0; +} + +static int +GDI_RenderLine(SDL_Renderer * renderer, int x1, int y1, int x2, int y2) +{ + GDI_RenderData *data = (GDI_RenderData *) renderer->driverdata; + POINT points[2]; + HBRUSH brush; + BOOL status; + + if (data->makedirty) { + SDL_Rect rect; + + if (x1 < x2) { + rect.x = x1; + rect.w = (x2 - x1) + 1; + } else { + rect.x = x2; + rect.w = (x1 - x2) + 1; + } + if (y1 < y2) { + rect.y = y1; + rect.h = (y2 - y1) + 1; + } else { + rect.y = y2; + rect.h = (y1 - y2) + 1; + } + SDL_AddDirtyRect(&data->dirty, &rect); + } + + /* Should we cache the brushes? .. it looks like GDI does for us. :) */ + brush = CreateSolidBrush(RGB(renderer->r, renderer->g, renderer->b)); + SelectObject(data->current_hdc, brush); + points[0].x = x1; + points[0].y = y1; + points[1].x = x2; + points[1].y = y2; + status = Polyline(data->current_hdc, points, 2); + DeleteObject(brush); + + if (!status) { + WIN_SetError("FillRect()"); + return -1; + } + return 0; +} + +static int GDI_RenderFill(SDL_Renderer * renderer, const SDL_Rect * rect) { GDI_RenderData *data = (GDI_RenderData *) renderer->driverdata; @@ -614,14 +684,16 @@ SelectPalette(data->memory_hdc, texturedata->hpal, TRUE); RealizePalette(data->memory_hdc); } - if (texture->blendMode & (SDL_BLENDMODE_MASK | SDL_BLENDMODE_BLEND)) { + if (texture->blendMode & SDL_BLENDMODE_MASK) { BLENDFUNCTION blendFunc = { AC_SRC_OVER, 0, texture->a, AC_SRC_ALPHA }; - /* FIXME: GDI uses premultiplied alpha! */ + /* FIXME: GDI uses premultiplied alpha! + * Once we solve this and somehow support blended drawing we can enable SDL_BLENDMODE_BLEND + */ if (!AlphaBlend (data->current_hdc, dstrect->x, dstrect->y, dstrect->w, dstrect->h, data->memory_hdc, srcrect->x, srcrect->y, srcrect->w,