diff options
author | dkf <donal.k.fellows@manchester.ac.uk> | 2009-04-30 13:44:18 (GMT) |
---|---|---|
committer | dkf <donal.k.fellows@manchester.ac.uk> | 2009-04-30 13:44:18 (GMT) |
commit | ace9deb81ddbae8956cdf7994077c6b89e6f2589 (patch) | |
tree | dd325e4639eefb19800f40f7f5efb8ea599cbfbf /win | |
parent | 6da62179f41c6011115f80c8720eb1c6ac8fa5f9 (diff) | |
download | tk-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.c | 58 |
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); } } |