-void wxMapBitmap(HBITMAP hBitmap, int width, int height)
-{
- COLORMAP ColorMap[] =
- {
- {BGR_BUTTONTEXT, COLOR_BTNTEXT}, // black
- {BGR_BUTTONSHADOW, COLOR_BTNSHADOW}, // dark grey
- {BGR_BUTTONFACE, COLOR_BTNFACE}, // bright grey
- {BGR_BUTTONHILIGHT, COLOR_BTNHIGHLIGHT},// white
- {BGR_BACKGROUNDSEL, COLOR_HIGHLIGHT}, // blue
- {BGR_BACKGROUND, COLOR_WINDOW} // magenta
- };
-
- int NUM_MAPS = (sizeof(ColorMap)/sizeof(COLORMAP));
- int n;
- for ( n = 0; n < NUM_MAPS; n++)
- {
- ColorMap[n].to = ::GetSysColor(ColorMap[n].to);
- }
-
- HBITMAP hbmOld;
- HDC hdcMem = CreateCompatibleDC(NULL);
-
- if (hdcMem)
- {
- hbmOld = (HBITMAP) SelectObject(hdcMem, hBitmap);
-
- int i, j, k;
- for ( i = 0; i < width; i++)
- {
- for ( j = 0; j < height; j++)
+ if (!s_coloursInit)
+ {
+ // When a bitmap is loaded, the RGB values can change (apparently
+ // because Windows adjusts them to care for the old programs always
+ // using 0xc0c0c0 while the transparent colour for the new Windows
+ // versions is different). But we do this adjustment ourselves so we
+ // want to avoid Windows' "help" and for this we need to have a
+ // reference bitmap which can tell us what the RGB values change to.
+ wxBitmap stdColourBitmap(_T("wxBITMAP_STD_COLOURS"));
+ if (stdColourBitmap.Ok())
+ {
+ wxMemoryDC memDC;
+ memDC.SelectObject(stdColourBitmap);
+
+ wxColour colour;
+ for ( size_t i = 0; i < WXSIZEOF(s_stdColours); i++ )
+ {
+ memDC.GetPixel(i, 0, &colour);
+ s_stdColours[i] = wxColourToRGB(colour);
+ }
+ }
+ else
+ {
+ s_stdColours[0] = RGB(000,000,000) ;
+ s_stdColours[1] = RGB(128,128,128) ;
+ s_stdColours[2] = RGB(192,192,192) ;
+ s_stdColours[3] = RGB(255,255,255) ;
+ //s_stdColours[4] = RGB(000,000,255) ;
+ //s_stdColours[5] = RGB(255,000,255) ;
+ }
+
+ s_coloursInit = TRUE;
+ }
+
+ COLORMAP ColorMap[NUM_OF_MAPPED_COLOURS];
+
+ // black (0, 0 0)
+ ColorMap[0].from = s_stdColours[0];
+ ColorMap[0].to = COLOR_BTNTEXT;
+ // dark grey (128, 128, 128)
+ ColorMap[1].from = s_stdColours[1];
+ ColorMap[1].to = COLOR_BTNSHADOW;
+ // bright grey (192, 192, 192)
+ ColorMap[2].from = s_stdColours[2];
+ ColorMap[2].to = COLOR_BTNFACE;
+ // white (255, 255, 255)
+ ColorMap[3].from = s_stdColours[3];
+ ColorMap[3].to = COLOR_BTNHIGHLIGHT;
+ // blue (0, 0, 255)
+ // ColorMap[4].from = s_stdColours[4];
+ // ColorMap[4].to = COLOR_HIGHLIGHT;
+ // magenta (255, 0, 255)
+ // ColorMap[4].from = s_stdColours[5];
+ // ColorMap[4].to = COLOR_WINDOW;
+
+ for ( size_t n = 0; n < WXSIZEOF(ColorMap); n++ )
+ {
+ ColorMap[n].to = ::GetSysColor(ColorMap[n].to);
+ }
+
+ MemoryHDC hdcMem;
+
+ if ( !hdcMem )
+ {
+ wxLogLastError(_T("CreateCompatibleDC"));
+
+ return bitmap;
+ }
+
+ SelectInHDC bmpInHDC(hdcMem, (HBITMAP)bitmap);
+
+ if ( !bmpInHDC )
+ {
+ wxLogLastError(_T("SelectObject"));
+
+ return bitmap;
+ }
+
+ // VZ: I leave here my attempts to map the bitmap to the system colours
+ // faster by using BitBlt() even though it's broken currently - but
+ // maybe someone else can finish it? It should be faster than iterating
+ // over all pixels...
+#if 1
+ for ( int i = 0; i < width; i++ )
+ {
+ for ( int j = 0; j < height; j++ )