diff options
author | fvogel <fvogelnew1@free.fr> | 2018-12-29 21:42:12 (GMT) |
---|---|---|
committer | fvogel <fvogelnew1@free.fr> | 2018-12-29 21:42:12 (GMT) |
commit | 4e81da6984774cee4b599265f08e08c1698e8887 (patch) | |
tree | 483945cbbe944e78d132d0fad61edc6d852b2009 /win/tkWinDraw.c | |
parent | 8967b2495d58baa366addd70437e3223a5f24da1 (diff) | |
download | tk-4e81da6984774cee4b599265f08e08c1698e8887.zip tk-4e81da6984774cee4b599265f08e08c1698e8887.tar.gz tk-4e81da6984774cee4b599265f08e08c1698e8887.tar.bz2 |
Fix [21525158b0]: On MS Windows XImage data and Tk_Visual() return wrong information. Bug report, analysis and patch provided by Scott Pitcher (many thanks!)
Diffstat (limited to 'win/tkWinDraw.c')
-rw-r--r-- | win/tkWinDraw.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/win/tkWinDraw.c b/win/tkWinDraw.c index 2c35d3b..0ec63dc 100644 --- a/win/tkWinDraw.c +++ b/win/tkWinDraw.c @@ -519,6 +519,9 @@ TkPutImage( BITMAPINFO *infoPtr; HBITMAP bitmap; char *data; +#ifndef NO_WINRGBFIX + Visual *visual; +#endif display->request++; @@ -564,13 +567,18 @@ TkPutImage( infoPtr->bmiHeader.biHeight = -image->height; /* Top-down order */ infoPtr->bmiHeader.biPlanes = 1; infoPtr->bmiHeader.biBitCount = image->bits_per_pixel; +#ifdef NO_WINRGBFIX infoPtr->bmiHeader.biCompression = BI_RGB; +#endif infoPtr->bmiHeader.biSizeImage = 0; infoPtr->bmiHeader.biXPelsPerMeter = 0; infoPtr->bmiHeader.biYPelsPerMeter = 0; infoPtr->bmiHeader.biClrImportant = 0; if (usePalette) { +#ifndef NO_WINRGBFIX + infoPtr->bmiHeader.biCompression = BI_RGB; +#endif infoPtr->bmiHeader.biClrUsed = ncolors; for (i = 0; i < ncolors; i++) { infoPtr->bmiColors[i].rgbBlue = GetBValue(colors[i]); @@ -579,7 +587,17 @@ TkPutImage( infoPtr->bmiColors[i].rgbReserved = 0; } } else { +#ifdef NO_WINRGBFIX infoPtr->bmiHeader.biClrUsed = 0; +#else + infoPtr->bmiHeader.biCompression = BI_BITFIELDS; + /* Modelled on XGetVisualInfo() in xutil.c. + * We want to get the rgb masks for the default visual for the given display. */ + visual = DefaultVisual(display,0); + *((DWORD *)((unsigned char *)infoPtr + sizeof(BITMAPINFOHEADER))) = visual->blue_mask; + *((DWORD *)((unsigned char *)infoPtr + sizeof(BITMAPINFOHEADER))+1) = visual->green_mask; + *((DWORD *)((unsigned char *)infoPtr + sizeof(BITMAPINFOHEADER))+2) = visual->red_mask; +#endif } bitmap = CreateDIBitmap(dc, &infoPtr->bmiHeader, CBM_INIT, image->data, infoPtr, DIB_RGB_COLORS); |