summaryrefslogtreecommitdiffstats
path: root/win
diff options
context:
space:
mode:
authordkf <donal.k.fellows@manchester.ac.uk>2009-04-30 13:44:18 (GMT)
committerdkf <donal.k.fellows@manchester.ac.uk>2009-04-30 13:44:18 (GMT)
commitace9deb81ddbae8956cdf7994077c6b89e6f2589 (patch)
treedd325e4639eefb19800f40f7f5efb8ea599cbfbf /win
parent6da62179f41c6011115f80c8720eb1c6ac8fa5f9 (diff)
downloadtk-ace9deb81ddbae8956cdf7994077c6b89e6f2589.zip
tk-ace9deb81ddbae8956cdf7994077c6b89e6f2589.tar.gz
tk-ace9deb81ddbae8956cdf7994077c6b89e6f2589.tar.bz2
Fix [Bug 2080533] by falling back to creating a DIB.
Diffstat (limited to 'win')
-rw-r--r--win/tkWinPixmap.c58
1 files changed, 53 insertions, 5 deletions
diff --git a/win/tkWinPixmap.c b/win/tkWinPixmap.c
index 369c25c..b496f61 100644
--- a/win/tkWinPixmap.c
+++ b/win/tkWinPixmap.c
@@ -9,7 +9,7 @@
* See the file "license.terms" for information on usage and redistribution of
* this file, and for a DISCLAIMER OF ALL WARRANTIES.
*
- * RCS: @(#) $Id: tkWinPixmap.c,v 1.7 2007/01/11 15:35:41 dkf Exp $
+ * RCS: @(#) $Id: tkWinPixmap.c,v 1.8 2009/04/30 13:44:19 dkf Exp $
*/
#include "tkWinInt.h"
@@ -45,10 +45,10 @@ Tk_GetPixmap(
display->request++;
- newTwdPtr = (TkWinDrawable*) ckalloc(sizeof(TkWinDrawable));
+ newTwdPtr = (TkWinDrawable *) ckalloc(sizeof(TkWinDrawable));
newTwdPtr->type = TWD_BITMAP;
newTwdPtr->bitmap.depth = depth;
- twdPtr = (TkWinDrawable *)d;
+ twdPtr = (TkWinDrawable *) d;
if (twdPtr->type != TWD_BITMAP) {
if (twdPtr->window.winPtr == NULL) {
newTwdPtr->bitmap.colormap = DefaultColormap(display,
@@ -68,12 +68,60 @@ Tk_GetPixmap(
newTwdPtr->bitmap.handle =
CreateBitmap(width, height, (DWORD) planes, (DWORD) depth, NULL);
+ /*
+ * CreateBitmap tries to use memory on the graphics card. If it fails,
+ * call CreateDIBSection which uses real memory; slower, but at least
+ * still works. [Bug 2080533]
+ */
+
+ if (newTwdPtr->bitmap.handle == NULL) {
+ static int repeatError = 0;
+ unsigned char *bits = NULL;
+ BITMAPINFO bitmapInfo;
+ HDC dc;
+
+ memset(&bitmapInfo, 0, sizeof(bitmapInfo));
+ bitmapInfo.bmiHeader.biSize = sizeof(bitmapInfo.bmiHeader);
+ bitmapInfo.bmiHeader.biWidth = width;
+ bitmapInfo.bmiHeader.biHeight = height;
+ bitmapInfo.bmiHeader.biPlanes = planes;
+ bitmapInfo.bmiHeader.biBitCount = depth;
+ bitmapInfo.bmiHeader.biCompression = BI_RGB;
+ bitmapInfo.bmiHeader.biSizeImage = 0;
+ dc = GetDC(NULL);
+ newTwdPtr->bitmap.handle = CreateDIBSection(dc, &bitmapInfo,
+ DIB_RGB_COLORS, (void **) &bits, 0, 0);
+ ReleaseDC(NULL, dc);
+
+ /*
+ * Oh no! Things are still going wrong. Pop up a warning message here
+ * (because things will probably crash soon) which will encourage
+ * people to report this as a bug...
+ */
+
+ if (newTwdPtr->bitmap.handle == NULL && !repeatError) {
+ LPVOID lpMsgBuf;
+
+ repeatError = 1;
+ if (FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
+ FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_IGNORE_INSERTS,
+ NULL, GetLastError(),
+ MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
+ (LPTSTR) &lpMsgBuf, 0, NULL)) {
+ MessageBox(NULL, (LPCTSTR) lpMsgBuf,
+ "Tk_GetPixmap: Error from CreateDIBSection",
+ MB_OK | MB_ICONINFORMATION);
+ LocalFree(lpMsgBuf);
+ }
+ }
+ }
+
if (newTwdPtr->bitmap.handle == NULL) {
ckfree((char *) newTwdPtr);
return None;
}
- return (Pixmap)newTwdPtr;
+ return (Pixmap) newTwdPtr;
}
/*
@@ -102,7 +150,7 @@ Tk_FreePixmap(
display->request++;
if (twdPtr != NULL) {
DeleteObject(twdPtr->bitmap.handle);
- ckfree((char *)twdPtr);
+ ckfree((char *) twdPtr);
}
}