X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/3a3898f8f10963691f9b8a20a7ca322124021c31..697c5f51487087e8113176d83a0d44e5a1c2f042:/src/msw/tbar95.cpp diff --git a/src/msw/tbar95.cpp b/src/msw/tbar95.cpp index 788c5d36cf..758426c5a5 100644 --- a/src/msw/tbar95.cpp +++ b/src/msw/tbar95.cpp @@ -1102,108 +1102,8 @@ long wxToolBar::MSWWindowProc(WXUINT nMsg, WXWPARAM wParam, WXLPARAM lParam) // private functions // ---------------------------------------------------------------------------- -// VZ: we use a separate function to do the actual colour mapping because -// otherwise VC++ optimizer seems to mangle the code in MapBitmap(): with -// optimization on, the code produces incorrect result (but it's ok in -// debug mode, i.e. globally without optimizations or if you insert a -// #pragma optimize("", off) just before the function!) -// -// This will also make it simpler to replace MapColours() later with -// something more efficient... -static void MapColours(HDC hdc, int width, int height, - size_t numColours, COLORMAP *cmap) -{ - for ( int i = 0; i < width; i++ ) - { - for ( int j = 0; j < height; j++ ) - { - COLORREF pixel = ::GetPixel(hdc, i, j); - - for ( size_t k = 0; k < numColours; k++ ) - { - COLORREF col = cmap[k].from; - if ( abs(GetRValue(pixel) - GetRValue(col)) < 10 && - abs(GetGValue(pixel) - GetGValue(col)) < 10 && - abs(GetBValue(pixel) - GetBValue(col)) < 10 ) - { - ::SetPixel(hdc, i, j, cmap[k].to); - break; - } - } - } - } -} - WXHBITMAP wxToolBar::MapBitmap(WXHBITMAP bitmap, int width, int height) { - // number of the colours we map: if you change this, update - // wxBITMAP_STD_COLOURS in the resources as well: it must have the same number - // of pixels - static const size_t NUM_OF_MAPPED_COLOURS = 4; - - static bool s_coloursInit = FALSE; - long s_stdColours[NUM_OF_MAPPED_COLOURS]; - - 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 ) @@ -1222,7 +1122,27 @@ WXHBITMAP wxToolBar::MapBitmap(WXHBITMAP bitmap, int width, int height) return bitmap; } - MapColours(hdcMem, width, height, WXSIZEOF(ColorMap), ColorMap); + wxCOLORMAP *cmap = wxGetStdColourMap(); + + for ( int i = 0; i < width; i++ ) + { + for ( int j = 0; j < height; j++ ) + { + COLORREF pixel = ::GetPixel(hdcMem, i, j); + + for ( size_t k = 0; k < wxSTD_COL_MAX; k++ ) + { + COLORREF col = cmap[k].from; + if ( abs(GetRValue(pixel) - GetRValue(col)) < 10 && + abs(GetGValue(pixel) - GetGValue(col)) < 10 && + abs(GetBValue(pixel) - GetBValue(col)) < 10 ) + { + ::SetPixel(hdcMem, i, j, cmap[k].to); + break; + } + } + } + } return bitmap;