public static boolean drawIcon(BufferedImage ret, WinDef.HICON hIcon, int diFlags) {
WinDef.HDC hdcScreen = User32.INSTANCE.GetDC(null);
WinDef.HDC hdcMem = Gdi32.INSTANCE.CreateCompatibleDC(hdcScreen);
WinDef.HBITMAP bitmap = Gdi32.INSTANCE.CreateCompatibleBitmap(hdcScreen, ret.getWidth(), ret.getHeight());
WinNT.HANDLE hbmOld = Gdi32.INSTANCE.SelectObject(hdcMem, bitmap);
WinNT.HANDLE hBrush = Gdi32.INSTANCE.CreateSolidBrush(new WinDef.DWORD(0xffffff));
WinDef.RECT rect = new WinDef.RECT();
rect.left = 0;
rect.top = 0;
rect.right = ret.getWidth();
rect.bottom = ret.getHeight();
User32.INSTANCE.FillRect(hdcMem, rect, hBrush);
Gdi32.INSTANCE.DeleteObject(hBrush);
boolean ok = User32.INSTANCE.DrawIconEx(hdcMem, 0, 0, hIcon, ret.getWidth(), ret.getHeight(), new WinDef.UINT(0), new WinDef.HBRUSH(Pointer.NULL), diFlags);
if (!ok) {
return false;
}
for (int x = 0; x < ret.getWidth(); x++) {
for (int y = 0; y < ret.getHeight(); y++) {
int rgb = Gdi32.INSTANCE.GetPixel(hdcMem, x, y).intValue();
int r = (rgb >> 16) & 0xff;
int g = (rgb >> 8) & 0xff;
int b = (rgb) & 0xff;
rgb = (b << 16) + (g << 8) + r;
ret.setRGB(x, y, rgb);
}
}
Gdi32.INSTANCE.SelectObject(hdcMem, hbmOld);
Gdi32.INSTANCE.DeleteObject(bitmap);
Gdi32.INSTANCE.DeleteDC(hdcMem);
User32.INSTANCE.ReleaseDC(null, hdcScreen);
return true;
}