// 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
return bitmap;
}
+ MapColours(hdcMem, width, height, WXSIZEOF(ColorMap), ColorMap);
+
+ 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++ )
- {
- COLORREF pixel = ::GetPixel(hdcMem, i, j);
-
- for ( size_t k = 0; k < WXSIZEOF(ColorMap); k++ )
- {
- COLORREF col = ColorMap[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, ColorMap[k].to);
- break;
- }
- }
- }
- }
-
- return bitmap;
-#else // 1
+#if 0
MemoryHDC hdcMask, hdcDst;
if ( !hdcMask || !hdcDst )
{
::DeleteObject((HBITMAP)bitmap);
return (WXHBITMAP)hbmpDst;
-#endif // 0/1
+#endif // 0
}
#endif // wxUSE_TOOLBAR && Win95