changeset 5178:9b2e99ebd099

Added the Windows framebuffer implementation. This actually ends up being faster than Direct3D with a dynamic texture. (???)
author Sam Lantinga <slouken@libsdl.org>
date Fri, 04 Feb 2011 12:29:58 -0800
parents b9cf75615028
children 6d37aa594ecd
files src/video/windows/SDL_windowsframebuffer.c src/video/windows/SDL_windowsframebuffer.h src/video/windows/SDL_windowsvideo.c src/video/windows/SDL_windowswindow.h
diffstat 4 files changed, 124 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/windows/SDL_windowsframebuffer.c	Fri Feb 04 12:29:58 2011 -0800
@@ -0,0 +1,90 @@
+/*
+    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
+*/
+#include "SDL_config.h"
+
+#include "SDL_windowsvideo.h"
+
+
+int WIN_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch)
+{
+    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
+    BITMAPINFO info;
+
+    /* Free the old framebuffer surface */
+    if (data->mdc) {
+        DeleteDC(data->mdc);
+    }
+    if (data->hbm) {
+        DeleteObject(data->hbm);
+    }
+
+    /* We'll use RGB format for now */
+    *format = SDL_PIXELFORMAT_RGB888;
+    *pitch = (((window->w * SDL_BYTESPERPIXEL(*format)) + 3) & ~3);
+
+    /* Create a new one */
+    info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
+    info.bmiHeader.biWidth = window->w;
+    info.bmiHeader.biHeight = -window->h;	/* negative for topdown bitmap */
+    info.bmiHeader.biPlanes = 1;
+    info.bmiHeader.biBitCount = 32;
+    info.bmiHeader.biCompression = BI_RGB;
+    info.bmiHeader.biSizeImage = window->h * (*pitch);
+    info.bmiHeader.biXPelsPerMeter = 0;
+    info.bmiHeader.biYPelsPerMeter = 0;
+    info.bmiHeader.biClrUsed = 0;
+    info.bmiHeader.biClrImportant = 0;
+
+    data->mdc = CreateCompatibleDC(data->hdc);
+    data->hbm = CreateDIBSection(data->hdc, &info, DIB_RGB_COLORS, pixels, NULL, 0);
+    if (!data->hbm) {
+        WIN_SetError("Unable to create DIB");
+        return -1;
+    }
+    SelectObject(data->mdc, data->hbm);
+
+    return 0;
+}
+
+int WIN_UpdateWindowFramebuffer(_THIS, SDL_Window * window, int numrects, SDL_Rect * rects)
+{
+    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
+
+    BitBlt(data->hdc, 0, 0, window->w, window->h, data->mdc, 0, 0, SRCCOPY);
+    return 0;
+}
+
+void WIN_DestroyWindowFramebuffer(_THIS, SDL_Window * window)
+{
+    SDL_WindowData *data = (SDL_WindowData *) window->driverdata;
+
+    if (data->mdc) {
+        DeleteDC(data->mdc);
+        data->mdc = NULL;
+    }
+    if (data->hbm) {
+        DeleteObject(data->hbm);
+        data->hbm = NULL;
+    }
+}
+
+/* vi: set ts=4 sw=4 expandtab: */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/video/windows/SDL_windowsframebuffer.h	Fri Feb 04 12:29:58 2011 -0800
@@ -0,0 +1,28 @@
+/*
+    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
+*/
+#include "SDL_config.h"
+
+extern int WIN_CreateWindowFramebuffer(_THIS, SDL_Window * window, Uint32 * format, void ** pixels, int *pitch);
+extern int WIN_UpdateWindowFramebuffer(_THIS, SDL_Window * window, int numrects, SDL_Rect * rects);
+extern void WIN_DestroyWindowFramebuffer(_THIS, SDL_Window * window);
+
+/* vi: set ts=4 sw=4 expandtab: */
--- a/src/video/windows/SDL_windowsvideo.c	Fri Feb 04 12:26:01 2011 -0800
+++ b/src/video/windows/SDL_windowsvideo.c	Fri Feb 04 12:29:58 2011 -0800
@@ -28,6 +28,7 @@
 #include "../SDL_pixels_c.h"
 
 #include "SDL_windowsvideo.h"
+#include "SDL_windowsframebuffer.h"
 #include "SDL_windowsshape.h"
 
 /* Initialization/Query functions */
@@ -128,6 +129,9 @@
     device->SetWindowGrab = WIN_SetWindowGrab;
     device->DestroyWindow = WIN_DestroyWindow;
     device->GetWindowWMInfo = WIN_GetWindowWMInfo;
+    device->CreateWindowFramebuffer = WIN_CreateWindowFramebuffer;
+    device->UpdateWindowFramebuffer = WIN_UpdateWindowFramebuffer;
+    device->DestroyWindowFramebuffer = WIN_DestroyWindowFramebuffer;
     
     device->shape_driver.CreateShaper = Win32_CreateShaper;
     device->shape_driver.SetWindowShape = Win32_SetWindowShape;
--- a/src/video/windows/SDL_windowswindow.h	Fri Feb 04 12:26:01 2011 -0800
+++ b/src/video/windows/SDL_windowswindow.h	Fri Feb 04 12:29:58 2011 -0800
@@ -38,6 +38,8 @@
     SDL_Window *window;
     HWND hwnd;
     HDC hdc;
+    HDC mdc;
+    HBITMAP hbm;
     WNDPROC wndproc;
     SDL_bool created;
     int mouse_pressed;