< prev index next >

src/java.desktop/windows/native/libawt/windows/ShellFolder2.cpp

Print this page
rev 13901 : Fixes for 8151385. Contains additional fix for 8149453 (upFolder, newFolder, etc. icons)
rev 13644 : 8080492: [Parfait] Uninitialised variable in jdk/src/java/desktop/windows/native/libawt/
Reviewed-by: prr, vadim
rev 12267 : 8022057: JFileChooser blocks EDT in Win32ShellFolder2.getIcon
Reviewed-by: serb, ant
rev 12120 : 8081231: JDK9 client build broken on Windows
Reviewed-by: azvegint
rev 12117 : 8003399: JFileChooser gives wrong path to selected file when saving to Libraries folder on Windows 7
Reviewed-by: serb, ant
rev 10731 : 8056216: Remove "sun" directory layer from libawt and common
Reviewed-by: erikj, ihse, coffeys

*** 928,950 **** } /* * Class: sun_awt_shell_Win32ShellFolder2 * Method: getIconBits ! * Signature: (JI)[I */ JNIEXPORT jintArray JNICALL Java_sun_awt_shell_Win32ShellFolder2_getIconBits ! (JNIEnv* env, jclass cls, jlong hicon, jint iconSize) { jintArray iconBits = NULL; // Get the icon info ICONINFO iconInfo; if (fn_GetIconInfo((HICON)hicon, &iconInfo)) { // Get the screen DC HDC dc = GetDC(NULL); if (dc != NULL) { // Set up BITMAPINFO BITMAPINFO bmi; memset(&bmi, 0, sizeof(BITMAPINFO)); bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth = iconSize; --- 928,974 ---- } /* * Class: sun_awt_shell_Win32ShellFolder2 * Method: getIconBits ! * Signature: (J)[I */ JNIEXPORT jintArray JNICALL Java_sun_awt_shell_Win32ShellFolder2_getIconBits ! (JNIEnv* env, jclass cls, jlong hicon) { + const int MAX_ICON_SIZE = 128; + int iconSize = 0; jintArray iconBits = NULL; + BITMAP bmp; + memset(&bmp, 0, sizeof(BITMAP)); + // Get the icon info ICONINFO iconInfo; if (fn_GetIconInfo((HICON)hicon, &iconInfo)) { // Get the screen DC HDC dc = GetDC(NULL); if (dc != NULL) { + // find out the icon size in order to deal with different sizes + // delivered depending on HiDPI mode or SD DPI mode. + if (iconInfo.hbmColor) { + const int nWrittenBytes = GetObject(iconInfo.hbmColor, sizeof(bmp), &bmp); + if(nWrittenBytes > 0) { + iconSize = bmp.bmWidth; + } + } else if (iconInfo.hbmMask) { + // Icon has no color plane, image data stored in mask + const int nWrittenBytes = GetObject(iconInfo.hbmMask, sizeof(bmp), &bmp); + if (nWrittenBytes > 0) { + iconSize = bmp.bmWidth; + } + } + // limit iconSize to MAX_ICON_SIZE, so that the colorBits and maskBits + // arrays are big enough. + // (logic: rather show bad icons than overrun the array size) + iconSize = iconSize > MAX_ICON_SIZE ? MAX_ICON_SIZE : iconSize; + // Set up BITMAPINFO BITMAPINFO bmi; memset(&bmi, 0, sizeof(BITMAPINFO)); bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth = iconSize;
*** 952,962 **** bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 32; bmi.bmiHeader.biCompression = BI_RGB; // Extract the color bitmap int nBits = iconSize * iconSize; ! long colorBits[1024]; GetDIBits(dc, iconInfo.hbmColor, 0, iconSize, colorBits, &bmi, DIB_RGB_COLORS); // XP supports alpha in some icons, and depending on device. // This should take precedence over the icon mask bits. BOOL hasAlpha = FALSE; if (IS_WINXP) { --- 976,986 ---- bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 32; bmi.bmiHeader.biCompression = BI_RGB; // Extract the color bitmap int nBits = iconSize * iconSize; ! long colorBits[MAX_ICON_SIZE * MAX_ICON_SIZE]; GetDIBits(dc, iconInfo.hbmColor, 0, iconSize, colorBits, &bmi, DIB_RGB_COLORS); // XP supports alpha in some icons, and depending on device. // This should take precedence over the icon mask bits. BOOL hasAlpha = FALSE; if (IS_WINXP) {
*** 967,977 **** } } } if (!hasAlpha) { // Extract the mask bitmap ! long maskBits[1024]; GetDIBits(dc, iconInfo.hbmMask, 0, iconSize, maskBits, &bmi, DIB_RGB_COLORS); // Copy the mask alphas into the color bits for (int i = 0; i < nBits; i++) { if (maskBits[i] == 0) { colorBits[i] |= 0xff000000; --- 991,1001 ---- } } } if (!hasAlpha) { // Extract the mask bitmap ! long maskBits[MAX_ICON_SIZE * MAX_ICON_SIZE]; GetDIBits(dc, iconInfo.hbmMask, 0, iconSize, maskBits, &bmi, DIB_RGB_COLORS); // Copy the mask alphas into the color bits for (int i = 0; i < nBits; i++) { if (maskBits[i] == 0) { colorBits[i] |= 0xff000000;
*** 1002,1030 **** * Class: sun_awt_shell_Win32ShellFolder2 * Method: getStandardViewButton0 * Signature: (I)[I */ JNIEXPORT jintArray JNICALL Java_sun_awt_shell_Win32ShellFolder2_getStandardViewButton0 ! (JNIEnv* env, jclass cls, jint iconIndex) { jintArray result = NULL; // Create a toolbar HWND hWndToolbar = ::CreateWindowEx(0, TOOLBARCLASSNAME, NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL); if (hWndToolbar != NULL) { ! SendMessage(hWndToolbar, TB_LOADIMAGES, (WPARAM)IDB_VIEW_SMALL_COLOR, (LPARAM)HINST_COMMCTRL); HIMAGELIST hImageList = (HIMAGELIST) SendMessage(hWndToolbar, TB_GETIMAGELIST, 0, 0); if (hImageList != NULL) { HICON hIcon = ImageList_GetIcon(hImageList, iconIndex, ILD_TRANSPARENT); if (hIcon != NULL) { ! result = Java_sun_awt_shell_Win32ShellFolder2_getIconBits(env, cls, ptr_to_jlong(hIcon), 16); DestroyIcon(hIcon); } ImageList_Destroy(hImageList); --- 1026,1055 ---- * Class: sun_awt_shell_Win32ShellFolder2 * Method: getStandardViewButton0 * Signature: (I)[I */ JNIEXPORT jintArray JNICALL Java_sun_awt_shell_Win32ShellFolder2_getStandardViewButton0 ! (JNIEnv* env, jclass cls, jint iconIndex, jboolean smallIcon) { jintArray result = NULL; + WPARAM size = smallIcon ? (WPARAM)IDB_VIEW_SMALL_COLOR : (WPARAM)IDB_VIEW_LARGE_COLOR; // Create a toolbar HWND hWndToolbar = ::CreateWindowEx(0, TOOLBARCLASSNAME, NULL, 0, 0, 0, 0, 0, NULL, NULL, NULL, NULL); if (hWndToolbar != NULL) { ! SendMessage(hWndToolbar, TB_LOADIMAGES, size, (LPARAM)HINST_COMMCTRL); HIMAGELIST hImageList = (HIMAGELIST) SendMessage(hWndToolbar, TB_GETIMAGELIST, 0, 0); if (hImageList != NULL) { HICON hIcon = ImageList_GetIcon(hImageList, iconIndex, ILD_TRANSPARENT); if (hIcon != NULL) { ! result = Java_sun_awt_shell_Win32ShellFolder2_getIconBits(env, cls, ptr_to_jlong(hIcon)); DestroyIcon(hIcon); } ImageList_Destroy(hImageList);
< prev index next >