summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--generic/tkCanvas.c2
-rw-r--r--win/tkWinDraw.c18
-rw-r--r--win/tkWinX.c18
3 files changed, 37 insertions, 1 deletions
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);