summaryrefslogtreecommitdiffstats
path: root/win/tkWinDraw.c
diff options
context:
space:
mode:
authorfvogel <fvogelnew1@free.fr>2018-12-29 21:42:12 (GMT)
committerfvogel <fvogelnew1@free.fr>2018-12-29 21:42:12 (GMT)
commit4e81da6984774cee4b599265f08e08c1698e8887 (patch)
tree483945cbbe944e78d132d0fad61edc6d852b2009 /win/tkWinDraw.c
parent8967b2495d58baa366addd70437e3223a5f24da1 (diff)
downloadtk-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.c18
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);