# HG changeset patch # User dcherepanov # Date 1256203648 -14400 # Node ID 3aee79f8498af9e94c38f6144a634646ade37ca4 # Parent 126dc6fe0d7b1bf6b9ed36fc79c696538815170b 6707273: TrayIcon does not support 8-bit alpha channel in Windows XP Reviewed-by: uta, ant diff -r 126dc6fe0d7b -r 3aee79f8498a jdk/src/windows/native/sun/windows/awt_TrayIcon.cpp --- a/jdk/src/windows/native/sun/windows/awt_TrayIcon.cpp Wed Oct 21 17:06:41 2009 +0400 +++ b/jdk/src/windows/native/sun/windows/awt_TrayIcon.cpp Thu Oct 22 13:27:28 2009 +0400 @@ -59,7 +59,7 @@ }; typedef struct tagBitmapheader { - BITMAPINFOHEADER bmiHeader; + BITMAPV5HEADER bmiHeader; DWORD dwMasks[256]; } Bitmapheader, *LPBITMAPHEADER; @@ -638,12 +638,12 @@ HBITMAP AwtTrayIcon::CreateBMP(HWND hW,int* imageData,int nSS, int nW, int nH) { - Bitmapheader bmhHeader; + Bitmapheader bmhHeader = {0}; HDC hDC; char *ptrImageData; HBITMAP hbmpBitmap; HBITMAP hBitmap; - int nNumChannels = 3; + int nNumChannels = 4; if (!hW) { hW = ::GetDesktopWindow(); @@ -653,14 +653,20 @@ return NULL; } - memset(&bmhHeader, 0, sizeof(Bitmapheader)); - bmhHeader.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - bmhHeader.bmiHeader.biWidth = nW; - bmhHeader.bmiHeader.biHeight = -nH; - bmhHeader.bmiHeader.biPlanes = 1; + bmhHeader.bmiHeader.bV5Size = sizeof(BITMAPV5HEADER); + bmhHeader.bmiHeader.bV5Width = nW; + bmhHeader.bmiHeader.bV5Height = -nH; + bmhHeader.bmiHeader.bV5Planes = 1; - bmhHeader.bmiHeader.biBitCount = 24; - bmhHeader.bmiHeader.biCompression = BI_RGB; + bmhHeader.bmiHeader.bV5BitCount = 32; + bmhHeader.bmiHeader.bV5Compression = BI_BITFIELDS; + + // The following mask specification specifies a supported 32 BPP + // alpha format for Windows XP. + bmhHeader.bmiHeader.bV5RedMask = 0x00FF0000; + bmhHeader.bmiHeader.bV5GreenMask = 0x0000FF00; + bmhHeader.bmiHeader.bV5BlueMask = 0x000000FF; + bmhHeader.bmiHeader.bV5AlphaMask = 0xFF000000; hbmpBitmap = ::CreateDIBSection(hDC, (BITMAPINFO*)&(bmhHeader), DIB_RGB_COLORS, @@ -674,6 +680,7 @@ } for (int nOutern = 0; nOutern < nH; nOutern++) { for (int nInner = 0; nInner < nSS; nInner++) { + dstPtr[3] = (*srcPtr >> 0x18) & 0xFF; dstPtr[2] = (*srcPtr >> 0x10) & 0xFF; dstPtr[1] = (*srcPtr >> 0x08) & 0xFF; dstPtr[0] = *srcPtr & 0xFF;