From 4e81da6984774cee4b599265f08e08c1698e8887 Mon Sep 17 00:00:00 2001 From: fvogel Date: Sat, 29 Dec 2018 21:42:12 +0000 Subject: Fix [21525158b0]: On MS Windows XImage data and Tk_Visual() return wrong information. Bug report, analysis and patch provided by Scott Pitcher (many thanks!) --- generic/tkCanvas.c | 2 +- win/tkWinDraw.c | 18 ++++++++++++++++++ win/tkWinX.c | 18 ++++++++++++++++++ 3 files changed, 37 insertions(+), 1 deletion(-) diff --git a/generic/tkCanvas.c b/generic/tkCanvas.c index 2f45399..53bfe00 100644 --- a/generic/tkCanvas.c +++ b/generic/tkCanvas.c @@ -2777,7 +2777,7 @@ DrawCanvas( * swap anything here. */ -#ifdef _WIN32 +#if defined(NO_WINRGBFIX) && defined(_WIN32) #define R_OFFSET 2 #define B_OFFSET 0 #else 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); diff --git a/win/tkWinX.c b/win/tkWinX.c index 761d9ca..d010be2 100644 --- a/win/tkWinX.c +++ b/win/tkWinX.c @@ -457,21 +457,39 @@ TkWinDisplayChanged( } else if (screen->root_depth == 12) { screen->root_visual->class = TrueColor; screen->root_visual->map_entries = 32; +#ifdef NO_WINRGBFIX screen->root_visual->red_mask = 0xf0; screen->root_visual->green_mask = 0xf000; screen->root_visual->blue_mask = 0xf00000; +#else + screen->root_visual->red_mask = 0xf00000; + screen->root_visual->green_mask = 0xf000; + screen->root_visual->blue_mask = 0xf0; +#endif } else if (screen->root_depth == 16) { screen->root_visual->class = TrueColor; screen->root_visual->map_entries = 64; +#ifdef NO_WINRGBFIX screen->root_visual->red_mask = 0xf8; screen->root_visual->green_mask = 0xfc00; screen->root_visual->blue_mask = 0xf80000; +#else + screen->root_visual->red_mask = 0xf80000; + screen->root_visual->green_mask = 0xfc00; + screen->root_visual->blue_mask = 0xf8; +#endif } else if (screen->root_depth >= 24) { screen->root_visual->class = TrueColor; screen->root_visual->map_entries = 256; +#ifdef NO_WINRGBFIX screen->root_visual->red_mask = 0xff; screen->root_visual->green_mask = 0xff00; screen->root_visual->blue_mask = 0xff0000; +#else + screen->root_visual->red_mask = 0xff0000; + screen->root_visual->green_mask = 0xff00; + screen->root_visual->blue_mask = 0xff; +#endif } screen->root_visual->bits_per_rgb = screen->root_depth; ReleaseDC(NULL, dc); -- cgit v0.12